dokia.github.io

View My GitHub Profile

思考与实践

我大学专业是通信工程。主要课程分成两大块:信息论和电子电路系统。这些课程理论性很强,平时没有太多机会上手实操。整个大学期间我都是在懵懵懂懂的状态中度过的,唯一的光是一门叫 C++程序语言设计 的课。这个课的好处是课上学到的东西,在自己的笔记本上可以轻松复现,甚至可以根据自己的理解去探索,所见即所得。而且我发现,相比于研究看不见摸不着的理论,我更擅长在实践中学习知识。老师在课堂上讲数据结构与算法,听得我直打瞌睡;回到宿舍在 leetcode 上找到相关 tag 做了几个题,就基本就全搞明白了。甚至很虚的傅里叶变换,我也是通过在课外的信号处理项目里面,用 C++ 实现了一遍,才感觉出来其中的奇妙。

毕业之后,我果断选择了软件开发行业。因为这是一个注重实践的领域,所有的理论都是要为最终能开发出一款符合预期的软件而服务。有人说,神枪手都是子弹喂出来的。同样,想成为一个资深的软件开发工程师,大量的实践必不可少。尤其是对于初级程序员,大量的实践可以培养解决实际问题的能力。这些能力不是看看书本就能获取到的。不幸的是,在我的职业生涯中,见过很多这样的人。他们对于各自理论信手拈来,却缺乏处理基本问题的能力。他们总能拿到一个不错的 offer,因为在面试的时候他们夸夸其谈,从而迷惑住面试官。然而在工作中他们却是极其自负却又漏洞百出,让队友们苦恼不已。眼高手低在这一行是很危险的,有时候会造成灾难性的后果。对于那些仍然不以为然的人,想想 波音737MAX 吧。


在进入工作的这些年里,我一直信奉着实践这一教条。通过实践,我积累了大量知识,在工作中也变得如鱼得水。然而事情也不总是一帆风顺。当同事对我的工作表示赞赏,又同时希望我能总结分享一些经验的时候,事情就开始变得尴尬起来。因为我的分享总是干巴巴的就事论事,不像有的同事那样,能以点带面,论据充实,论点鲜明。当我回顾我的职业生涯,我也发现了类似的问题。表面看起来,我做了很多不同项目,经验丰富。然而你要问我,在这个项目里有什么收获?有什么可以改进的不足?对不起,我基本没想过。根据实践这一原则,我就像一个 CPU 一样,接受、分析并处理任务。然后下一个任务。每个任务都是雁过无痕。事后总结?太费脑子了。

在最初工作的几年里,这样的做法并没有给我带来任何麻烦。我甚至因为同事夸奖我做事效率高而洋洋自得。然而,随之年龄的增长,事情变得有些不一样了。我突然发现,我的成长速度变慢了,因为随着年限的增长,并不总是有新的项目供我来增长知识。而我现有的知识,任何一个勤奋的初级工程师都能通过实践来获得。这让我变得越来越容易“可替代”。我意识到,我一直引以为傲的,从实践中获取的“知识”,其实都只是“经验”而已。这些经验就在那里,对每个人都是一样的。只要你勤奋,总能发掘得到。而随着年龄的增长,获取经验的速度变慢,从而让人变得“可替代”。现在坊间讨论火热的“35岁”危机,我想大部分都是这样的。


我发现,比较厉害的高级程序员,有一个共通的习惯。那就是在事情做完之后,总是会自我总结,并乐于向我们分享。完成一个项目所需要的代码、步骤都是通用的。知道答案后谁都能做得出来。然而这个项目效果如何?怎么做可以提高效率?下次类似项目有什么值得借鉴之处?这些思考让人跳出不断“做事”的循环,从更高的角度鸟瞰整个项目,从而获取到更大的视野,提升人的高度。相比于实践获得的经验,这些收获才是真正属于个人的财富。意识到这些后,我开始有意放慢做事的节奏,经常给自己一些时间去思考。我发现,事情变得有意思起来。对于公司里一些大家使用不便的功能,我开发出一些轻便的脚本,或是写出一些详细的指导文档供大家使用。在方便了他人的同时也锻炼了我自己的抽象总结能力。对于一些大家觉得很合理的设计,我仔细思考后发现了里面不妥的地方,避免了隐藏的bug。

其实不止在软件开发行业,在生活中大部分普通人也是重实践,轻思考。套用一句话,叫“用身体的勤奋弥补思想的懒惰”。思考是如此的痛苦,以至于大部分人宁愿整日劳累奔波,却又免不了浑浑噩噩地生活。不妨暂停几分钟,开动一下快要生锈的大脑吧。