迷茫时看一看一个“老”程序员的思考

写在前面

程序员在工作一段时间后,难免会遇到迷茫期。是该集中精力钻研某个方向,还是先广后深?做业务太多,没有成就感,技术能力没有提升?纯做技术,不了解业务,没有成就感?年龄大了却还在coding,头发又少了许多,干不动了,可刚毕业的小孩儿们却冲劲儿十足,深感压力山大?下面这篇文章是一个40岁的程序员写的,并不能回到上面的问题,但可以给迷茫中的你我一些启发。文章的原文链接是reflections of an old programmer,作者是Ben Northrop。

我是一个快40岁的程序员。周六上午,老婆在家带孩子,我去参加了一个关于React Native的技术会议。演讲嘉宾分享的内容是为什么React Native会成为移动开发的下一个热点,这让我想到了15年前的JSP热。看着PPT上充满逻辑的代码,我感觉自己“老”了,我发现自己可能被这个时代甩在了后面。

演讲嘉宾优雅的滑动着PPT,现场用React Native写着令人眼花缭乱的代码,说了一大堆我听不懂的技术名词。什么是Pepperoni(烤胡椒香肠),这是在逗我吗?什么是……这尼玛让一个刚刚学会如何使用Angular的中年大叔情何以堪!?看来我又得重新开始了。

当然,我对此一点也不感到惊讶。过去的20年里,我也近乎疯狂的追赶着各种时髦的技术,并且乐在其中。任何一则新的关于在编程方面有突破性进展的消息都会令人兴奋不已——作为编程社区的革新者,拥护并推广一个更简单、高效、简洁、优雅的新技术,是一件多么美妙的事情。但是,就在这个上午,将近40岁的我却有一种要被耗尽的感觉。我知道,这是工作的一部分。虽然有些知识是那么的难以吸收和理解,但是,如果想要保持自己的竞争力、得到更好的薪水,就不得不从这些令人生厌的技术里杀出一条血路来。这,就是生活。

我思索着,我发现我这种典型的程序员职业轨迹好像并不适用于其它行业。一个40岁的心脑血管医生并不会因为医学界新出的几篇组织论文而觉得自己的知识过时,同样的道理,这也适用于律师、水管工人、会计、英语老师等。尽管从事这些职业会有一些不可预期的因素存在,但是人们已经积累的知识是相对稳定的,这足以让他们获得越来越多的尊重和理解。遗憾的是,对于程序员来说,20年的经验并不能换来同样多的优势。

两个主要原因

当然,我们这个职业并不都是如此不堪,毕竟作为程序员的我们还有很多有趣的事情。但有意思的是,好像只有程序员们才需要频繁地更新自己的知识,这样才能紧跟时代的步伐。我的观点正确吗?在这一点上,编程真的与众不同吗?若果真如此,原因是什么?这对于我们的职业生涯来说意味着什么?我试着从两方面回答这些问题。

第一点就是知识的衰减。

其实不仅仅是编程,任何事情都有一个过期时间,最终变得毫无用处。我16岁学开车,当时所学的技能也沿用至今。我们可以说这种知识有一个较长的生命周期。对于很多职业来说,它们的专业知识也有一个相对长的生命周期。医学方面的新发现的确能够替代一些现有的医疗方式,但这并不足以颠覆我们对生物学医学的原有认知。如果一种知识的生命周期如此之长,那么这样的知识就是可累积的。医生会比去年的自己拥有更加渊博的医学知识,因为他在过去的一年里学到的东西都会累加在他之前的知识之上。

而在编程领域,暂且不论好坏,我敢说事情不是这样的。我可以向上帝保证:一个程序员的知识在10年之后将会有一半变得毫无用处。

读到这里,你也许会认为我这个观点错得离谱,你甚至想要离开。别着急,如果你试着读完接下来的内容,你会发现我是对的。

如果我没有从这个点上得到进一步的结论,那么,我敢打赌到了2026年我现在的知识大约只会剩下一半还有用武之地(这其中当然会包括经久不衰的SQL),而另一半则会消失的无影无踪(React Native会消失吗?我觉得可能会吧)。当然,我会学习新的知识来替代旧的。但是,这样就够了吗?到了2026年,我会比现在拥有更多有用的知识吗?

这个问题促使我得出了第二个点:知识积累速度,即我们在知识库中添加新知识的速度。在所有领域里,对知识的掌握程度都有一个入门的标准(或者至少能够达到工作的要求),因此一个人在职业生涯的早期更需要集中精力去掌握这些知识。而在编程领域,我们却好像一直都处在“学生”时代,因为这个领域的知识更新太快了。想要跟上节奏,就要不断学习。这也让我们的职业生涯与众不同。

三个阶段

结合上面所说的知识衰减和积累速度,如果要用一张图来表示程序员的知识水平和职业生涯之间的关系,那么下面这张图再合适不过了:
Alt
在职业生涯的早期,也就是我们所谓的学徒时期,积累知识是相对容易的。所有事情都是新的,每一次经历都能够获取更多的知识。另外,我们很年轻,不会被太多的生活琐碎所累,因此也不会介意多花几个晚上或周末去学习新的编程语言或框架。最重要的一点是,雇主不会对我们这些刚刚参加工作的菜鸟有太高的期望。因此,工作时我们会比其它同事有更多的时间来学习知识。这是一个有意思的阶段,这个阶段的我们总会觉得自己有太多的东西都不懂。

直到有一天,我们发现自己不再是新手,我们变成了卓有成效的、能够独立完成任务的开发工程师。我们第一次发现自己与那些工作几年甚至十年的高级工程师之间的差距好像并没有原来想象的那么大。这让我们信心倍增,充满激情和活力。这就是所谓的功力大增的阶段。之前的投入终于有了回报,我们学过的所有知识都显得那么有用。换言之,这些知识都没有进入明显的衰减期。我们的成长赢得了客户、同事、经理们的尊重,我们也因此获得了更高的职位和薪水、更好的机会。尽管我们不一定明白这一点,但这是一个重要的转折点。

这个时候我们会发现,晋升不仅带来了工资的增长,也带来了别人对你更高的期望。雇主需要优秀员工成为领导,需要他们指导初级工程师、检查代码、面试、参加会议,并且在大多数情况下要负责维护那些他们曾经帮助搭建的复杂的遗留系统。所有的这一切都是非常合理的,但这也恰恰牺牲了我们的知识积累速度。我们也不会像之前那样有很多时间去阅读技术博客了。我们还会发现,自己的知识正在变得陈旧不堪,工作前几年学的那些东西现在竟然全TM过时了。你会说”我TM之前可是花了大量的时间去学习GWT啊!”面对知识衰减、积累速度变慢,我们开始迷茫了。

这个时候,我们也进入了第三和最后的阶段,也就是稳定的经验丰富的编程老兵的消与涨。我们知识全面、经验丰富并且卓有成效。但我们也认识到自己可能比上一个工作阶段知道的要少。我们的知识有很多已经过时了,我们也没有时间去积累足够多的新知识来做补充。这是一件令人无比沮丧的事情。我想这也是那么多程序员在这个阶段转做管理、销售、测试、或者农业(比如我)的原因吧。除非我们竭尽全力保持自己的技术水平,否则,5年之后我们会在工作中表现得更糟糕。除了努力,没有任何捷径。

小小建议

这就是我写本文的目的。我现在仍然喜欢学习,但是我深知,如果没有艰苦卓绝的努力,我就只能徘徊在“专家”的边缘地带停滞不前。不过我对此并不是特别地在意,因为相比于成为下一个Martin Flower, 我更愿意去享受生活,虽然我也相信Martin Flower在工作之外过得很幸福。不过话说回来,从知识的积累和衰减这两方面思考我的职业,的确在一定程度上改变了我的思维方式。

首先,我试着从更长远的角度来看待问题。我其实更担心成为那种背负着极高的期待但又不太可能接触新机会的职场角色。我见过太多这样的例子,在一个公司里拿着高薪,却很少有机会去接触和学习新的知识。5年后,这些人将会发现他们的大部分知识已经过时,他们的薪水也体现不出自己的真正价值。从某种意义上讲,我认为如果有一个好的公司能够给你提供接触和学习新知识的机会,那就不必太在意眼前的薪水高低,因为从长远的职业生涯来看,你这样做会赚取更多的薪水。

其次,人生苦短,我会把更多的精力和时间投入到那些更加持久的技术知识上面,比如算法、应用安全、性能优化和架构等。我希望通过深入这些领域来保持自己在职场上的竞争力,而不是去学习那些最新、最炫的javascrip库。

在这里我可能并没有得出一个新的观点。但是从知识的积累和衰减这两个方面来考虑我的职业生涯的确让我受益匪浅。我也想听听你的看法。