虽然前面讨论了很多编写代码的方法,但优秀的代码最终还是出自优秀的软件工程师。本节介绍如何成为一名优秀的软件工程师。
首先澄清 几个误区 ,一名优秀的软件工程师和以下因素没有必然联系。
(1)写了多少年程序。
(2)写了多少行代码。
(3)曾经在哪里上学,曾经在哪里工作。
我将一名优秀软件工程师的修炼方法总结为以下 三句话 。
(1)学习—思考—实践。
(2)知识—方法—精神。
(3)基础乃治学之根本。
下面将对这三句话做详细解读。
路径一:学习—思考—实践
1.学习
对于一名软件工程师来说,学习是非常重要的事情。
软件编写的历史已经超过半个世纪,有太多的经验可以被借鉴。非常遗憾的是,很多软件工程师虽然工作多年,但是却没有对前人和大师的经验进行过充分学习,在很多方面没有使用正确的方法。
在学习途径方面,我推荐大家优先阅读相关图书。很多软件工程师主要通过阅读博客或微信公众号上的文章来学习,其实很多内容质量远不如经典图书。另外,我还建议大家选择一些高质量的开源代码来研究,以提升自己在阅读代码方面的品位。
有些读者对于持续学习缺乏足够的动力。这里我想到苹果创始人乔布斯的一句话:
Stay hungry, stay foolish. (求知若饥,虚心若愚。)
也就是说,只有自己感觉到“饥饿”和“愚笨”,才会去学习。
关于学习,希望读者养成“学习的习惯”,以及培养好“学习的能力”。我曾做过多次调研,发现很多人在一年内阅读的图书不超过两本,这远远少于大家在大学时的阅读量。在一个不断发展的社会里,如果5~10年不学习,一个人很快就会“过时”。
建立起不断学习的习惯很重要。我还发现有一些人不会学习,对于所阅读的内容抓不住重点,这就是“学习能力”比较薄弱,建议大家可以看看《如何阅读一本书》,书中深入地介绍了正确而高效的阅读方法。
2. 思考
古人说,学而不思则罔。
即使学习了一些知识和方法,也获得了一些实践的机会,但是如果不去思考,就不能形成自己的思想体系,这就相当于白学和白干。
一方面, 在经过思考之前,所学到的知识或方法还只是外在的,如果不能在思考的基础上去深入理解,就很难灵活地在工作中使用; 另一方面, 现实情况经常和书本中的内容有一些差异,需要在工作中通过思考来判别差异,总结经验,形成符合实际情况的方法论。
3. 实践
在学习和思考的基础上,还要勇于实践。
有些读者在经过学习和思考后知道了什么是好的方法,但是在面对工作中的问题时,却仍不敢去实践。
在实践中,我们需要有“知行合一”的精神。以前,北京大学有位老师叫汤一介,关于“真、善、美”曾做过一个总结,我认为总结得特别好:
天人合一,谓之真;知行合一,谓之善;情景合一,谓之美。
从我的经验看,所有的进步都来源于失败的经历和遭遇过的挫折。没有哪个方法是经过一次学习就可以马上掌握的,所有成功的方法都需要在实践中不断体验和调整。一个人的学习速度,从某种意义上决定于他犯错的速度,在这方面成年人反而不如小孩子。小孩子学说话学得很快,就是因为这是一边犯错、一边纠正的过程,小孩子学走路也是一样。成年人怕犯错,所以往往不敢尝试,学习的速度也就慢了下来。
路径二:知识—方法—精神
1. 知识
对于认为“软件工程师只能工作到35岁”的人,其中一个论据就是软件工程师经常需要学习,担心年龄超过35岁之后就学不动了。
如果只是学习新知识,确实如此。在这个知识大爆炸的时代,知识是过时最快的。对于软件工程师来说,由于不断涌现出新的编程语言、新的系统、新的概念……,所以只学习知识的人,总是感觉世界变化太快。
如何解决这个问题呢?这需要我们不仅仅要学习知识,而且要学习方法。
2. 方法
如果我们从“方法”这个角度来看待世界的变化速度,就会发现其实变化速度并没有那么快。我在本书中介绍的内容,在很大程度上都不是新知识,而是在20多年前就在学校学过的,它们至今仍没有过时。有些方法,历经几千年都不会过时,比如《老子》中介绍的方法,虽然只有几千字,但却能给人留下深刻的印象。
相对于“知识”,“方法”这个词总是让很多人感到很“虚”。但是这个“虚”(的方法)可能比那个“实”(的知识)更有价值。最深刻的方法其实是不可言传的,正如《老子》中的一句话:
道可道,非常道。
(如果“道”可以说出来,就不是永恒的“道”了。)
对于软件工程师来说,分析问题、解决问题的能力才是最重要的。其实,这就是“研究”的能力。
关于“研究”,20多年前加州理工学院的Steven Low老师曾在给我的一封邮件中给出过一个很好的定义:
To Identify the Fundamental Problem, and Solve it.
(去识别、定义那些最重要的问题,并解决。)
3. 精神
即使有了知识和方法,To be or not to be永远都是一个问题。前进的路上往往不是鲜花和掌声,而是困难和荆棘。人类总是在神性和兽性间不断斗争,进步往往来自对理想的追求。
关于精神层面,这里送给大家三句话,供参考。
(1)独立精神,自由思想。 这是清华大学的陈寅恪为纪念王国维所写的碑文中的一句。这块碑位于清华大礼堂附近的第一教学楼旁边。我一直认为这是清华大学“自强不息,厚德载物”之外的另一个重要校训。
(2)Don’t follow(不要跟随)。 这是20年多年前UCLA(University of California, Los Angeles,加州大学洛杉矶分校)的张丽霞老师送给我的一句话。当时我向张老师请教应该如何做研究,张老师的这句话令我印象深刻。
(3)对完美的不懈追求。 “完美”永远是一个可望而不可及的目标。对于“完美”,我们需要不断去追求。
路径三:基础乃治学之根本
有些软件工程师在发展到一定阶段后,会感到继续提升很困难。对于一些规模稍大的项目,他们会感觉把握不住;对于一些方向,会感到无法持续深入。其实这些都是因为之前的基础没有打好。
于敏是2014年国家最高科技奖得主,中国氢弹元勋。于敏特别喜欢诸葛亮在《诫子书》中的格言,将其视为座右铭:
非宁静无以致远。
他也非常喜欢魏征谏唐太宗的两句话:
求木之长者,必固其根本;欲流之远者,必浚其泉源。
他深知基础乃治学之根本。
对于软件工程师来说,需要具备的基础能力如下。
(1)计算机学科的基础知识和方法, 包括:数据结构、算法、操作系统、系统结构、计算机网络等。
(2)软件研发的相关知识和方法, 包括:基础的软件编写方法、软件工程方法、编程思想等。
(3)基本思考能力和沟通能力, 包括:逻辑思维能力、归纳总结能力和表达能力等。
(4)研究能力, 主要是分析问题和解决问题的能力。
对于一名软件工程师,以上这些基础的建立至少需要5~8年之功。
通过本文,希望大家对“软件工程师”这个职业建立起正确的认识。软件工程师不等于“码农”,软件工程师不能只知道怎么编写代码,还需要具备非常综合的能力。
(1)代码可以是艺术作品,也可以是“垃圾”,关键在于编写代码的人。 希望大家都能朝着艺术家的方向努力,努力把自己的代码变为艺术品。
(2)不要忘记我们为什么出发。我们的目标是改变世界/格物致知,而不是学习编程或者炫耀技术。 最开始我认为,写代码的目标是“改变世界”,但是后来我改变了想法,将目标转变为“格物致知”。其实,我们工作和生活的更主要的目的是增加对这个世界的理解和认识。如果写了多年代码,但仍然对写代码的“道”没有了解,那么时间和生命就浪费了。
(3)好代码的来源不是写好代码。好代码是一系列工作的结果,包括需求分析、系统设计、编码、测试、上线和运营等。
(4)代码是写给别人看的,而不是能正确运行就可以了。 对一名软件工程师来说,写出别人看不懂的代码则是失败的。
(5)写好代码是有道的。通过系统而持续的学习、思考,以及实践正确的方法,我们自己也可以打造出精品。 一名优秀的软件工程师的养成至少需要8~10年的积累,大家需要摒弃浮躁的心态。