【InfoQer】一位技术人的“三维式成长”

IT资讯 2416 Views

编者按:

本文作者2009年作为全国200名实习生之一实习于腾讯,2011年加入创业公司任科技技术总监。从实习生到技术高层一路走来,作者经历到的是一个平凡技术人在追求“不平凡”过程中的成长。相信他的经历和经验,也能给你带来一些启发。

缘起

一个优秀的产品背后必然是一个优秀的团队,而团队成长的根本是团队成员的成长。一个优秀的工程师抵得过10个普通的工程师,所以帮助团队成员的成长也就成了团队管理中的重中之重。一年一度的毕业生入职季又来了,我在公司的技术座谈会上分享了我的一些技术成长经验,顺便把它梳理成文,希望对想在技术这条路上一起走的同学有一些帮助。我把技术成长总结成点到线,线到面的过程。点多了就汇聚成线,线多了也就有了面。

点,就是知识点。其实大学本科的每一科课程都是一个知识点。比如《计算机操作系统》,《编译原理》,《汇编语言》,《模拟电路和数字电路》等等。知识点可以分为基础知识点和应用知识点。对于应用知识点来说,新同学都没有困惑,因为那是很直接的。如果新同学想做网站开发,他就去学php,css,html等等;如果新同学以后想做java开发,他就去学java等等。而对应基础知识点,很多新同学就没有什么太大的动力去学好了,一是因果关系没有那么直接,二是这些基础知识点也普遍会偏枯燥和抽象。但是恰恰相反的是,基础知识点反而是更重要的。如果把技术成长比喻成练太极,那应用知识点就是招式,基础知识点就是内功。招式重要,但没有内功的招式只能是假把式。

说回到现实工作中,工作了一年半载的同学会问,那到底学这些基础知识对我现有的工作有什么帮助?我现在做web后端,我每天的工作基本就是在写php呀,可能涉及一些设计模式,mysql等等,我不掌握这些基础知识点,我现在也把工作做得好好的。是的,你学了《计算机操作系统》等等这些基础课程,可能短期内对你没有什么明显和直接的帮助,但你不掌握这些基础知识点,那你也做不好网站开发。没有基础知识的支撑,不了解背后的运行机制,你的工作跟流水线上的重复工作没有本质区别。一旦出点什么问题或有什么变化你就会感觉无所适从,只能靠死记硬背来应付。这也是很多同学对日新月异的新技术感觉力不从心的原因之一。

学习基础知识点是会比较枯燥一些,但不掌握好这些技术基础知识点,技术成长很快就会遇到天花板。有些同学为了逃避学习这些基础知识,就开始用“知识宽度”来麻醉自己,今天学点这,明天学点那,每天都学不同的东西,唯一相同的就是都只学到皮毛就停止不前了。就像浮萍,表面上看上去很茂盛,但那是风平浪静的时候,一来点风雨就不知道飘到哪去了,因为它没有一条深深地扎入到地里的根。

那怎样让自己有动力去学这些基础知识点?我经常用的一种办法是从提高业务出发,比如性能能不能再提高一些?能不能做到更好地平滑扩展?网络请求能不能更优化一下?界面切换能不能更流畅一些?带着这些问题去学习这些基础知识点会有目的性一些,也可以让自己有成就感一些。我的另外一种办法是关联着学,比如我使用了一个第三方的库,那我就想办法去搞懂它的设计和实现,然后还可以尝试着自己实现一把。实现的过程中我可能又发现一块自己没有掌握的知识,然后又继续学习,有点类似拔出萝卜带出泥。实在不行,那我就用最笨的办法:列个清单,每个月或每个季度去学掌握某个知识点。我从不担心我学的东西是没用的,就像乔布斯在斯坦福大学的演讲中所说:你现在所经历的,将在你未来的生命中串连起来。

线

知识点串连起来后就会形成一条线。即使掌握了很多知识点,如果不主动去把它串联起来,也还是形成不了线。这让我想起一次校招面试,一个硕士生各门专业课成绩都很优秀。但当我问他一个现实中的问题,需要他运用他各门专业课的一点点知识就可以解答的时候,他却半天答不上来了。这是典型的没有把知识点串连起来的特征。

那掌握一个个知识点后,怎么去把知识点串连起来?我个人觉得主要有两点。一是好奇心。有了好奇心,一遇到什么事情就会想为什么?自然而然地就会串连到下一个知识点,或者会发现未掌握的知识点,掌握它,然后再把它串连起来。比如我在写c语言判断相等的逻辑代码时候,我会想,为什么我写“==”号就可以判断相等,背后都发生了什么?然后我就会去学习编译知识,原来在通过编译后,这条语句变成了一条汇编指令cmp。那cmp指令又为什么可以判断相等呢?然后我又去学习汇编的知识,顺着这条线,我学习了cpu相关的知识,学习逻辑电路的知识,甚至是物理方面的知识。这个简单的问题串连出了一条深度延伸的知识线。同样,一个简单的问题也串连出了一条横向延伸的知识线,比如手机给服务器发消息的整个流程是怎样的? 二就是下工夫。天下没有免费的午餐,串连知识点的过程是一个漫长的过程,只有不断学习,不断积累才能不断地把这些点串连起来。没有武功秘籍也没有捷径,就是一个一个知识点去掌握,然后去融会贯通。

线,其实也是一条推导链。实验室的科学家们工作在链的一个末端–理论端。一线的应用开发者工作在另一个末端–应用端。不同的是,实验室的科学家们的链条是打通到实践端的,所以他们很清楚,他们的一个理论上的突破会给社会带来很大的贡献。比如加密算法,没有安全的加密算法,也不会有支付宝里,财富通这样的产品了。所以我觉得我们这些工作在一线的应用开发者也应该尽量去打通这个链条,往理论端去靠近,做到知其然,也知其所以然,这样才能更好地理解和应用这些理论知识。比如哪天有人可以控制生物细胞在两个不同的状态间切换并且能检测到细胞状态变化时,我能联想到生物计算机。如果我不能说话了,只能发出两种声音,我也能通过这两种声音表达出我想表达的意思。

点和线都是一维里边的东西,而面是二维的。就像《三体》里边说的,高维对低维是不在一个层次的。如果高维对低维发起攻击,低维是没有任何抵抗力的。点积累多了形成线,线积累多了也就形成了面。当一个人拥有了一个面的知识的时候,他考虑问题是非常周全的。他可以考虑到各方面的利害关系并且平衡好这些关系。就比如做架构,只懂前端或后端都是不够的,只有拥有前后端知识,拥有设计能力和架构能力,既懂业务,也了解实现细节的人才能胜任。拥有了一个面的知识的人考虑问题都能从大局出发,并且很清楚哪个细节的变动会对整个系统造成什么样的影响。达到面的阶段是靠线的量变积累,最后质变成一个无缝的面。面的阶段跟格拉德威尔在《异类》一书中说到的积累了一万小时之后的状态有点类似。不过我觉得一万小时只是达到面的阶段的必要条件,而不是充分条件。

立体

从面的阶段继续往前走就是立体了。面是二维的,当拥有了两个或多个面的时候,就形成一个三维的立体。几个面相互交叉,融合必然会产生出更高级别的一种形态。这种形态就会像KK在《失控》说到的活系统一样,不停地进化,演变,形成一种新的个体。

成长感悟

笨办法也是一种办法。我经常使用笨办法(可能人比较笨)。书一遍没读懂,我就读两遍,三遍,直到觉得自己读懂为止。问题没有什么好办法,我就用笨办法,挫也行,累也罢,先找到一个可以解决问题的办法,然后再去优化它。我觉得笨办法也是一种提高的好办法。为什么呢?因为笨办法提供了梳理问题的一个机会。当事情被梳理得越来越清楚,对注意力干扰的细枝末节就越来越少,注意力也就更容易集中到关键点上。当对关键点进行优化后,笨办法这个丑小鸭也许会变成白天鹅。

追求卓越,而不是追求完美。追求卓越会让人不满足于现状,给人动力去不断改进现有的状态。geek一点的说法是任何事物都有优化的空间。追求卓越同时会让人不掉进追求完美的陷阱中,能够先容忍一些不关键的小细节的瑕疵。这样才能抓住重点,然后把注意力集中到关键点上。

追求本质。知识线理论端的东西是基本不会变的,所以数学等等这些理论学科有很多公理,定理。应用端的东西则日新月异,所以经常有新的编程语言诞生,新的解决方案出现。但万变不离其宗,新的编程语言诞生,但编译原理不变;新的容器技术诞生,但计算机的运行机制不变。掌握本质的东西才能以不变应万变,更轻松地应对日新月异的新技术。

如未说明则本站原创,转载请注明出处:NULL » 【InfoQer】一位技术人的“三维式成长”