1

文 | 尹竞成

网易云商 CTO

写在前面

一直想和大家一起探讨研发同学成长相关的内容。希望自己不要写出一篇鸡汤文。

成长是一个永恒的话题。不管是初入职场的新人,还是在职场摸爬滚打多年的老兵,每个人都希望能够不断成长。对研发同学来说,成长意味着需要有更宽广的技术视野,在一个或者多个技术领域有足够的技术深度,需要有自己的核心竞争力。这几年来我面试了很多人,发现入行时间完全不足以衡量一位同学的能力,中庸无为的职场老人并不少见。那么,是什么导致了大家在数年内差距变得如此之大呢?我觉得大概可以概括为几下几点。

终身成长的心态

《终身成长》这本书写得非常好。作者定义了两种思维模式,一种是固定型思维。就是认为自己的能力是固定不变的。拥有固定思维的人会不断和周围的人相比较、急于证明自己的能力。一旦失败,就会认为自己是一个没有能力的人,或者缺乏在这方面的天赋,从而放弃努力;

另一种是成长型思维,就是认为自己的能力是可以通过努力来培养的。拥有成长性思维的人遇到困难时,就会以学习的心态去积极面对。即便是遇到了挫折,也不会放弃,而是不断地学习,发展能力,找到解决问题的方式。

前些天我面试了一个Java开发工程师,他跟我说他觉得自己是一个内向的人,害怕和同事讨论问题,担心自己说错了影响同学对自己的看法。我说,我可以给你一个建议吗?首先,不要给自己打标签,绝大多数人都既不外向、也不内向,大家都处于中间水位。一旦给自己打了“内向”这样一个标签,就会下意识地限制自己交流和沟通。其实在和他的交流过程中,我并没有觉得沟通表达能力有什么问题。

其次,担心自己说错、总希望证明自己,这是典型的固定型思维。经过自己的思考、得出结论并和大家讨论,就算有不缺漏又有什么关系?互通有无、共同促进才会让讨论更有效果。(希望我不成熟的“诊断”能够帮助到这位同学)

终身成长最重要的是能够找到自己的方向,看到自己的缺点和不足,制定计划,付诸实践,复盘校准,然后优化计划。不强求一朝一夕的收获,但是坚信点点滴滴、日积月累量变会引起质变。

坊间传闻“程序员35岁前须转管理”,这个说法就很反终身成长。

我一直觉得这个说法的兴起,一方面是因为我们有程序员这个工种的年头还太少、35岁以上的程序员同学还不够多,另一方面是固定型思维的作祟。

2007-2008年我在东京的一家小公司里工作,里面有位白发苍苍的老大爷,偶尔跑跑客户,大部分时间和我们一起写代码,写得不亦乐乎。目前Linux内核维护者主要还是即将年满51岁的Linus和一些50或60后的老程序员。

程序员职业生涯可以很长,关键在于你是否愿意终身学习。

互联网的技术更新非常快,可能偏底层一些的技术生命力长一些,越接近用户端的技术更新就越快,需要我们不断保持对前沿技术的关注、不断学习。当然,很多技术底层的原理是相通的,积累的经验可以作为学习下一项技能重要的加速度。多年经验的程序员无论学任何新技能,都会比毕业生要快很多,包括知识转换率、架构理解等问题,以及对新知识和技能的运用、问题排查等等。

网易一直强调匠心精神,我觉得这一点对成长来讲也非常重要。越用心,对自己要求越高,进步越快。

比如写一个函数,是不是代码行数可以再少一点、执行效率可以再高一些;写网络协议,传输内容是否可以再压缩一些;做业务开发的同学,是不是可以把业务逻辑层次抽象清楚,成为模块化可用复用的能力。一旦养成这样的思考习惯,就会有动力去学习一些本质的东西,如操作系统、内存模型、设计模式等等,技术能力就会不断得到提升。

良好的学习方式

针对性的学习

首先我们得确定一个目标领域,是Java语言还是NLP算法。然后给自己制定一个详细的学习计划。最近面试他人的时候我经常会问一个问题:未来一年内你打算学习些什么?大部分人都只会说,接下来会学习DDD开发模型或者是xx中间件的底层原理。我觉得这只能算是学习方向,并不能算是一个学习计划。只有少数候选人会告诉我,他们会学习到什么程度、如何检验自己的进展。而往往这样的候选人对知识和技能的掌握上都远好于前一种。

程序员的学习会有两个维度,广度和深度。很多人都有疑问,先广度再深度,还是反过来。我觉得本质上并没有冲突,只是我们在不同阶段学习的重心有所侧重而已,并且应该是一个交替往复的过程。时间和精力总是有限的。对刚毕业或者刚入门的同学,我建议可以广度优先,多接触一些领域、多了解一些内容。然后找到一个方向,在一个领域非常深入地进行学习,了解底层原理,学习其核心设计思想。

精通一门语言是非常重要的。每一门语言都有自己的优缺点,精通意味着可以找到合理的使用方式,把它的优点发扬光大,通过一些设计模式弥补它的缺陷和不足,从而降低使用成本,合理地解决复杂问题。

关联性是人类建立认知很重要的一个因素,我们需要刻意强化这种关联性。我们在学习一项新的知识和技能的时候,往往会用已有的知识去认识未知。因此对一门语言的深入掌握,有助于我们快速学习新的语言,而不用每次都从HelloWord开始。

我在网易的前些年,不管是做客户端软件还是做游戏,一直在使用C++。后面由于业务和行业的变迁需要学习C#、Python、Java等语言,通过对语言特性的类比和归纳,学习起来就非常快了。

刻意练习

小时候老师经常说:好记性不如烂笔头。意思就是要多写、多练。程序开发也是这样。即使是记忆力再好的人,看过的内容如果一直不用,很快也就变得模糊甚至彻底忘记了。所以一定不能眼高手低。新手可以从模仿开始,进阶时给自己出题。

把学到的新知识和新技能用于工作实践中,是一种很好的方式。当然也要看团队的业务和技术成熟度,对新技术栈的包容性。我们团队对技术持非常开放的态度,鼓励大家学习、使用新东西。(欢迎投简历哈!)

刻意练习这个词最近几年特别流行,很多地方都在讲。刻意练习质疑了“只要经过一万小时的锻炼,任何人都可以从平凡变得超凡”的说法。没有思考和总结的机械式练习,即使超过1万小时或许还是很平庸。刻意练习,需要找到好的导师,有目标、有计划、有复盘。

开源社区的流行和壮大为我们阅读和学习优秀的代码提供了很好的平台,也让我们有更多练习的场景。有些同学说我们996哪来的时间去开源社区添砖加瓦?那就在工作中多思考、多复盘,适时重构自己以前的老代码,不断优化。再说了,时间挤挤总是有的。

不要抗拒业务开发

很多同学看不上业务开发,觉得写业务代码很low,没有技术含量,而更愿意去做中间件开发、架构设计等。我觉得这种想法是不对的。

技术的进步从来都是为了解决业务问题。好的业务代码一定是有技术含量的,比如可以通过封装和抽象使系统更好维护、更具扩展性,通过可插拔可配置式的方式更快速实现业务逻辑,等等。好的业务架构设计既需要丰富的经验,又需要充分的技术底蕴。

但是只做好业务开发又是不够的。同样做业务开发,有些同学很快成长起来,负责了更大的模块,承担了更大的责任,有些同学还在原地踏步。差距在哪里呢?我觉得除了上文所说业务封闭和抽像之外,比较重要的是,需要自己主动往前迈一步。

去了解自己负责的模块之外的模块实现和业务逻辑,学习整个系统的架构设计,了解系统的上下游,参与运维稳定性和系统优化性的工作,和产品团队多交流沟通业务设计。只有这样,才能有更全局的视角,设计更完善的系统,更快地成长。

程序员的软实力

永远不要忽视对自己软实习的修炼。对程序员软实力的要求,和其它工种并没有什么不同。冰下山的那些能力,包括自信、坚韧、皮实、诚实、责任心,等等。铺开来讲真的成了一篇鸡汤文啦,哈哈。我只讲讲非常重要、实际中又容易被人无视的一点:同理心。

同理心可以让交流更加有效率。比如在和别人交流的时候,夹杂着一堆技术语言、甚至是自己项目中的代号,滔滔不绝、口若悬河,而对方却一脸懵圈。这种时候不能责怪别人的理解能力差,只能说你没有办法把程序员思维,包装成对方也能听懂的“人话”。

前几年还在雷火游戏部的时候,带我的领导要求我们如果有团队成员需要你的协助,那么请放下你手头自己的工作,优先处理其他同学的请求。我觉得这是对同理心很好的一种诠释。每个人都优先配合别人,会让整个团队的流程和运转更加圆润,更加有效率。我现在也这么要求我的团队。

同理心会改变我们思考问题的角度和立场。

一开始涉及跨团队合作的时候,本能地会从自身和自己团队的角度出发考虑,划定好边界,回头想想这种时候往往合作起来会有很多摩擦和不理解。

后来,会从自己和对方出发去考虑问题,从双方共赢的角度去设计方案和推动问题解决,这个时候大家就能比较愉快地合作了。

再后来,会从项目、部门甚至是公司的角度去考虑一些问题的解决方案,更长远的规划和设计,而不仅仅是眼前的利害得失。

有了这种视角,看问题就会更宏观,往往也更能找到问题的切入点。今年网易集团升级了企业文化,其中很重要的一点就是要和用户(客户)在一起,站在客户的视角去做产品、做运营,去帮助客户内生成长。

不知是否写得有些空泛。希望能和大家多讨论。写在最后,“改变世界最快速的方式是改变自己”,大家多读书、多思考、多总结。


网易数智
619 声望140 粉丝

欢迎关注网易云信 GitHub:


引用和评论

0 条评论