专栏名称: 吴师兄学算法
和程序员小吴一起从初学者的角度学习算法,以动画的形式呈现解题的思路。每周四篇原创文章,期待你的鉴赏!
目录
相关文章推荐
北京本地宝  ·  北京当前买房政策汇总 ·  2 天前  
济宁市公安局济东分局  ·  数码产品国补“满月” 超2671万名消费者参与 ·  3 天前  
北京本地宝  ·  收藏去!北京5个春游地推荐! ·  4 天前  
北京吃货小分队  ·  北京,令人惊喜的路边小店① ·  4 天前  
北京吃货小分队  ·  无限回购的宝藏零食!真的挖到宝啦 ·  4 天前  
51好读  ›  专栏  ›  吴师兄学算法

技术大佬们都是怎么学习的?

吴师兄学算法  · 公众号  ·  · 2021-03-21 16:35

正文

大家好,我是程序员吴师兄,本来今天想更新一篇 单调栈 的文章,但没想到从早上七点写到现在还没有做完动画,鸽一天。。

今天逛帖子的时候,看到这么个问题:

这个问题我曾经也很好奇过,那些成为技术大佬的人当初是怎么学习,以及怎么成长过来的,因为我相信他们也是从 0 开始的,也会经历困难期之类的。或许,站在大佬们的“肩膀上”,可以走的更远。

然后这个问题下面,有位“无名大佬”回答了这个问题,我看完后觉得相当不错,重新排版和整理了下,分享给大家一起共勉。

无论你是在校学生,还是职场老鸟,我相信这些想法和建议都会对你有所启发。


熟悉更多业务

不管是不是你负责的;熟悉更多代码,不管是不是你写的。

这样做有很多好处,举几个简单的例子:

  • 需求分析的时候更加准确,能够在需求阶段就识别风险、影响、难点。

  • 问题处理的时候更加快速,因为相关的业务和代码都熟悉,能够快速的判断问题可能的原因并进行排查处理。

  • 方案设计的时候考虑更加周全,由于有对全局业务的理解,能够设计出更好的方案。


熟悉端到端

比如说你负责 Web 后台开发,但实际上用户发起一个 HTTP 请求,要经过很多中间步骤才到你的服务器(例如浏览器缓存、DNS、Nginx 等)。

服务器一般又会经过很多处理才到你写的那部分代码(路由、权限等)这整个流程中的很多系统或者步骤,绝大部分人是不可能去参与写代码的。

但掌握了这些知识对你的综合水平有很大作用,例如方案设计、线上故障处理这些更加有含金量的技术工作都需要综合技术水平。

“系统性”、“全局性”、“综合性”这些字眼看起来比较虚,但其实都是技术大牛的必备的素质,要达到这样的境界,必须去熟悉更多系统、业务、代码。


自学

一般在比较成熟的团队,由于框架或者组件已经进行了大量的封装,写业务代码所用到的技术确实也比较少。

但我们要明白“唯一不变的只有变化”,框架有可能要改进,组件可能要替换,或者你换了一家公司,新公司既没有组件也没有框架,要你从头开始来做。

这些都是机会,也是挑战,而机会和挑战只会分配给有准备的人,所以这种情况下我们更加需要自学更多东西,因为真正等到要用的时候再来学已经没有时间了。

以 Java 为例,大部分业务代码就是 if-else 加个数据库操作,但我们完全可以自己学些更多 Java 的知识,例如垃圾回收,调优,网络编程等。

这些可能暂时没用,但真要用的时候,不是 Google 一下就可以了, 这个时候谁已经掌握了相关知识和技能,机会就是谁的

以垃圾回收为例,我自己平时就抽时间学习了这些知识,学了 1 年都没用上,但后来用上了几次,每次都解决了卡死的大问题。

而有的同学,写了几年的 Java 代码,对于 stop-the-world 是什么概念都不知道,更不用说去优化了。

你负责的系统和业务,总有不合理和可以改进的地方,这些“不合理”和“可改进”的地方,都是更高级别的怪物,打完后能够增加更多的经验值。

识别出这些地方,并且给出解决方案,然后向主管提出,一次不行两次,多提几次,只要有一次落地了,这就是你的机会。

例如:

  • 重复代码太多,是否可以引入设计模式?

  • 系统性能一般,可否进行优化?

  • 目前是单机,如果做成双机是否更好?

  • 版本开发质量不高,是否引入高效的单元测试和集成测试方案?

  • 目前的系统太庞大,是否可以通过重构和解耦改为 3 个系统?

  • 阿里中间件有一些系统感觉我们也可以用,是否可以引入?

只要你去想,其实总能发现可以改进的地方的;如果你觉得系统哪里都没有改进的地方,那就说明你的水平还不够,可以多学习相关技术,多看看业界其它优秀公司怎么做。

我 2013 年调配到九游,刚开始接手了一个简单的后台系统,每天就是配合前台做数据增删改查,看起来完全没意思,是吧?

如果只做这些确实没意思,但我们接手后做了很多事情:

  • 解耦 ,将一个后台拆分为 2 个后台,提升可扩展性和稳定性。

  • 双机 ,将单机改为双机系统,提高可靠性。

  • 优化 ,将原来一个耗时 5 小时的接口优化为耗时 5 分钟。

还有其他很多优化,后来我们这个组承担了更多的系统,后来这个小组 5 个人,负责了 6 个系统。


Do exercise

在做职业等级沟通的时候,发现有很多同学确实也在尝试 Do more、Do better,但在执行的过程中,几乎每个人都遇到同一个问题:光看不用效果很差,怎么办?

例如:

  • 学习了 JVM 的垃圾回收,但是线上比较少出现 FGC 导致的卡顿问题,就算出现了,恢复业务也是第一位的,不太可能线上出现问题然后让每个同学都去练一下手,那怎么去实践这些 jvm 的知识和技能呢?

  • Netty 我也看了,也了解了 Reactor 的原理,但是我不可能参与 Netty 开发,怎么去让自己真正掌握 Reactor 异步模式呢?

  • 看了《高性能 MySQL》,但是线上的数据库都是 DBA 管理的,测试环境的数据库感觉又是随便配置的,我怎么去验证这些技术呢?

  • 框架封装了 DAL 层,数据库的访问我们都不需要操心,我们怎么去了解分库分表实现?

诸如此类问题还有很多,我这里分享一下个人的经验,其实就是 3 个词: learning、trying、teaching!


Learning

这个是第一阶段,看书、Google、看视频、看别人的博客都可以,但要注意一点是“系统化”,特别是一些基础性的东西,例如 JVM 原理、Java 编程、网络编程,HTTP 协议等等。

这些基础技术不能只通过 Google 或者博客学习,我的做法一般是先完整的看完一本书全面的了解,然后再通过 Google、视频、博客去有针对性的查找一些有疑问的地方,或者一些技巧。


trying

这个步骤就是解答前面提到的很多同学的疑惑的关键点,形象来说就是“自己动手丰衣足食”,也就是自己去尝试搭建一些模拟环境,自己写一些测试程序。

例如:

  • JVM 垃圾回收 :可以自己写一个简单的测试程序,分配内存不释放,然后调整各种 JVM 启动参数,再运行的过程中使用 jstack、jstat 等命令查看 JVM 的堆内存分布和垃圾回收情况。这样的程序写起来很简单,简单一点的就几行,复杂一点的也就几十行。







请到「今天看啥」查看全文


推荐文章
北京本地宝  ·  北京当前买房政策汇总
2 天前
济宁市公安局济东分局  ·  数码产品国补“满月” 超2671万名消费者参与
3 天前
北京本地宝  ·  收藏去!北京5个春游地推荐!
4 天前
北京吃货小分队  ·  北京,令人惊喜的路边小店①
4 天前
北京吃货小分队  ·  无限回购的宝藏零食!真的挖到宝啦
4 天前