2.7.1 代码的沟通价值
1. 50%以上的时间是用于沟通的
看到这个标题,读者可能会很诧异:
“代码不是由计算机来执行的吗,怎么会是一种表达方式?”
“这不是讲如何写代码的书吗,怎么好像是在讲语文?”
我想问读者一个问题:在做软件项目的过程中,我们的时间都用在哪里了?
有些读者可能会说,用来写代码了。还有些读者可能会说,如书中介绍的,用在做需求分析、系统设计、编码、测试、上线等工作上了。
在差不多20年前,我看过一本介绍软件工程的书,这本书告诉我,在一个项目中,超过50%的时间是用于沟通的。
在很多公司,软件工程师的很多时间都花在了开会上。很多人告诉我,只有晚上才有时间写代码,白天被安排了各种会议。而如果将“沟通”仅仅理解为“开会”的一种形式,就有些狭隘了。
沟通方式包括:面对面交流、发送邮件、基于聊天工具(学名叫Instant Message)沟通、写项目文档、写代码等。
2. 写代码也是一种沟通方式
写代码也是一种沟通方式!
对于一名软件工程师来说,其实有相当大比例的时间是通过阅读代码来和他人沟通的。例如,当你给同事做代码评审(Code Review)时,你和这位同事是基于被评审的代码进行沟通的;当你接手一个项目的代码时,你和之前参加过这个项目的同事是在做跨越时间和空间的沟通;有时,你也需要阅读自己曾经写过的代码,这是你在和曾经的你进行沟通。
从你的过往经历来看,你认为这种沟通方式顺畅吗,你感觉愉快吗?在很多次现场交流中,我曾经问观众:
“你在阅读前人的代码时感到很舒服,并希望能和写出这段代码的同学握手。遇到过这种情况的同学请举手。”
现场举手的观众不能说没有,但也只有寥寥几个。我继续问:
“你在阅读前人的代码时认为代码质量很差,甚至想骂上几句。有这种情况的请举手。”
每次现场都有好几位观众会很积极地把手举起来。可见,对所接手的代码有较差阅读体验的软件工程师比例肯定不低。
3. 代码为人而写
在20多年前,计算机相对于人力成本而言是比较昂贵的,CPU的性能比较差,编译器也做得不够好,在某些场景下软件工程师还需要为提高性能而不得不在代码的编写方式上做一些特殊考虑。我记上大学时有位老师曾经讲道:“需要将循环手工展开,以提高执行的性能。”那时的代码可以称为“为机器而写”。
但是,现在的情况已经发生了很大变化。CPU的性能有了很大提高,编译器也变得非常强大,对于我们所了解的很多优化技巧,编译器都已经帮忙做了相关处理。相对于代码的编写,长期维护代码的成本更高,软件工程师的更多时间其实是花在阅读和维护代码上了。除了少数底层的代码,大部分的代码应该是“为人而写”,也就是说代码要有很高的可读性。
在代码的可读性方面,如果希望达到一个理想化场景,可以用下面几点来概括。
(1)在阅读别人代码时就感觉像在阅读自己的代码。如果没有一个很好的规范,每个人都有自己的“风格”,那么在阅读别人的代码时,经常需要一个“适应”过程,这实际上降低了代码的阅读效率。
(2)阅读代码时能够专注于代码逻辑,而不是格式。在阅读代码时,最需要看懂的是代码的逻辑。但是由于很多软件工程师的代码写得不够规范,代码的格式无法准确传递出代码应有的逻辑。在这种情况下,代码阅读者只好通过自己的大脑来“模拟”一次重新格式化(Re-Format),然后才能很好地理解代码的逻辑。在很多时候,我恨不得立刻动手将所阅读的代码的格式进行优化,否则阅读起来真的很吃力。
(3)Don’t make me think(别让我思考)。这是一本书的名字,这本书是讲交互设计的。在代码的可读性方面,“别让我思考”也是软件工程师应该追求的目标。除少数算法逻辑需要非常复杂的代码外,对于大部分的业务和系统代码来说,这是可以实现的目标。
4. 表达能力很重要
表达能力对于一个人的发展是非常重要的。
一般在代码编写上表达不好的软件工程师,在其他方式的表达上也会存在问题,其他表达方式包括写文档、发送邮件、写PPT、口头沟通等。
我始终认为,软件工程师最需要提高的职业素养并不是编码的能力,而是在语文和哲学方面的素养。很多软件工程师的大学专业都属于理工科,他们往往容易忽视语文和哲学学科的学习。我在上中学时,语文学得不太好,和数理化三科相比要差很多,后来才发现文史哲这些学科对从事计算机行业的相关工作也是非常重要的。
语文学得不好,会影响表达能力,更会影响阅读和学习能力。如果表达能力不好,那么你说的话别人听不懂;如果阅读能力不行,那么别人说的话你也听不懂,抓不住重点。
我们可以从哲学这个学科中了解世界的很多基本规律,如果在工作中违反了这些规律,一定会撞得“头破血流”。比如,软件中很重要的一条规律是“没有完美的系统,要在很多指标间做权衡。”如果一个人告诉你,他研发的系统在各项指标上都是最优的,你几乎可以立刻断定,他是在说谎。
逻辑学也是哲学的重要组成部分,软件研发非常依赖于准确和严密的逻辑。写代码需要依靠严密的逻辑,软件设计推导也需要依靠严密的逻辑。我曾经看到过不少系统设计中出现了很多逻辑跳跃,仔细推敲后就会发现这是逻辑的纰漏,这样的系统早晚出问题,是经不起时间的检验的。
因此,我强烈建议,请从事软件开发的读者多在语文和哲学学科上下功夫。