每个人都有成长的渴望,也都会遇到成长的瓶颈。下面这个问题是一个读者问我的:
如何才能训练成为一个编程高手?
先简单说下这个读者的背景:工作 3 年多,目前在大厂做后台开发,身边有不少编程高手,是他想要追赶的目标。
最近半年时间,他花了一些精力在研究源码和底层原理上,但总觉得这些知识和实际工作衔接不好,提升很慢,学习动力也越来越差,希望我能给点建议。
我和他语音聊了半个小时,讲了一些我个人以及身边同事的案例。交流下来后,双方都有所启发。所以再次整理下,分享给大家。
1. 何谓 “编程高手” ?我觉得能分成这样 3 类:
第 1 类:天赋和成就都很高的人中龙凤,比如能一个人写出 WPS 的求伯君、一个人开发出电子邮件 Foxmail 的张小龙,对开源领域影响很大的章亦春等人。
第 2 类:有不错的口碑同时广为人知的技术大牛,他们一般在知名公司的重要岗位任职过,对技术纯真热爱,同时热衷分享,比如耗子哥、阮一峰、尤雨溪等人。
第 3 类:工作中被我们视为崇拜对象、未来有希望企及的高 P 或者架构师。
前面两类不在我的圈层射程内( 除了跟耗子哥在亚马逊有过一面之缘以外 ),因此本文主要聊下第 3 类人。这个也是绝大部分读者最关心的、同时可以设定为超越对象的群体。
这样就有了一个新问题: 既然想成为第 3 类人,那如何给第 3 类人下一个相对准确且具象的定义呢? (如果目标都是模糊的,就难言超越了)
这其实是一个很有意思的问题,每个人的答案可能都不一样,因为「编程水平的高与低」本身就是一个相对的概念。
我先说一下我的看法。
刚毕业那会,我眼中的编程高手是我的同事 - 超哥,他是亚马逊的架构师,团队里面技术级别最高的人(后来他做到了亚马逊中国首架的位置,现在也算圈内比较知名的大牛了)。
超哥是那种能搞定一个复杂项目(跨多个系统),从架构设计、到编码、到自动化测试、再到运维工具、甚至写文档都非常全面的人。显然是我这个刚毕业的菜鸟极其崇拜的大佬。
再后来,我工作了四五年,走向了技术管理路线,因为带团队的原因,我又多了一个新视角来审视编程厉害的人。
对比所谓的 PPT 架构师、以及讲到技术原理就满嘴跑火车而编码能力却稀松平常的人,我倾向给「编程高手」下一个更务实的定义:那就是实际工作中,能做到高效率、高质量、且稳定输出的人。看似容易,实则很难。我对这个定义的详细解读如下:
高效率:编程效率能做到团队中的 Top,对于复杂需求或者复杂问题能够快速理解,具备将复杂工作拆解成一系列简单子问题并搞定这些问题的人。他们能从实际场景出发,有造轮子的能力,也有不造轮子的觉悟。
高质量:编程质量能做到团队中的 Top,设计方案的合理性、编码的严谨性、测试方法、监控运维方案等,都能思考全面的人。
稳定输出:给高效率和高质量增加的限定。我觉得只有量变引起质变,真正形成了自己的方法论,能持续搞定一类问题,而不是单个问题的人才算是高手。
也许你会说要同时做到这 3 点太难了,但是实际工作中,一定有人能做到某个点或者某几点,那么以他们作为这一点的标杆即可。
因为所谓的 「 编程 高手 」 不过是 我们设定 的一个 目标而已,你清楚这个目标是什么就足够了,不一定非得安在同一个人身上。
2. 如何理解 “底层知识” 的价值?要成为一个编程高手,底层知识是必不可少的。这是一句正确的废话,就不展开解释了。
读者真正的问题在于:如何将底层知识和实际工作衔接起来,做到相辅相成?
先看一个具体的例子。对于简历中写自己做过性能优化的候选人,我面试时比较喜欢问:你是如何定位性能瓶颈并完成调优的?如果再次碰到此类问题,你的详细思路是什么?
很显然,这是一个系统性的工程问题,能同时对技术深度和宽度进行考察。
不仅仅是应用层的代码,还包括所使用的框架、中间件、虚拟机、网络甚至操作系统等等。 有性能指标等基础性的知识,有 监控和压测工具的运用,还 有成体系的排查思路和优化方法等等。
如果是编程低手,他们的答案通常有这几类:
1、性能指标都不清楚,遇到问题也不知道该用什么工具,这一类人应用层都不达标。
2、初步定位到一个疑似瓶颈点后,就着手优化,最终解决的只是一个浅层次的性能瓶颈问题,根本原因并未触达到。
3、能定位到根本原因,但是对于解决方案的合理性缺少深入思考,不追求极致,最终只是用了曲线的方案再次隐藏了性能问题。
通过这个例子,我其实想说明两点:
1、不具备底层知识,你的视野根本就触达不到底层的东西,思维以及能力永远只能停留在应用层面,能解决的问题有限。