“我们就是一群代码猴子,上蹿下跳,自以为领略了编程的真谛。可惜当我们抓着几个酸桃子,得意洋洋坐到树枝上,却对自己造成的混乱熟视无睹。那堆“可以运行”的乱麻程序,就在我们的眼皮底下慢慢腐坏。” ——《代码整洁之道》作者 RobertC. Martin,于 SD West 2007 技术大会

一、系列文章前言

敲完上面这段文字的时候,心里在想,一个刚踏入编程生涯的新人,要经历多少的淬炼,才能领略到 Bob 大叔所谓的编程的真谛。

有人说,这个过程会很漫长,大概至少是在读完 N 本编程领域的经典著作,并经过大量的思考与实践之后。

而写这个系列的起因,正是因为最近闲暇时一直在阅读一些之前一直想看的经典著作,并有将阅读过程中一些思考和总结记录下来。为了不枉费这些阅读、思考与总结的过程,决定将这些零散的内容整理成文,沉淀下来。过些年后再回首,也许会觉得当时的一些思考,弥足珍贵。

这个系列的文章,不仅仅是读书笔记,而是对一本书核心内容的全新演绎,内容解刨,与重组。希望自己的这些文字,能对各位想进一步了解这些经典著作的读者们有所帮助。

二、《代码整洁之道》其书

《代码整洁之道》(《Clean Code》)是几乎每一个对编程境界有追求、有志于改善代码质量的编程者,都应该阅读的一本好书。

这本书提出了一个观点:代码质量与其整洁度成正比,干净的代码,既在质量上可靠,也为后期维护、升级奠定了良好基础。

书中介绍的规则均来自作者多年的实践经验,涵盖从命名到重构的多个编程方面,虽为一“家”之言,然诚有可资借鉴的价值。

三、本文涉及知识点思维导图

先放出这篇文章所涉及内容知识点的一张思维导图,就开始正文。大家若是疲于阅读文章正文,直接看这张图,也是可以 Get 到本文的主要知识点的大概。

四、糟糕代码,是如何产生的

最初的问题来了,我们都不喜欢坏代码,为何坏代码还总会产生?

抛开编程者本身技艺的问题,答案也许是想要快点完成任务,项目进度赶着时间,或许我们只是不耐烦再继续做这个需求,渴望它能早点结束。

很多时候,会有一堆事情压着你去完成,你觉得自己需要赶紧弄完手上的东西,好接着做下一件工作,所以,为了走捷径,为了特定实现功能而强加的糟糕的代码,就悄悄地诞生了。我们都曾经瞟一眼自己亲手造成的混乱,决定弃之不顾,走向新的一天,等有朝一日再来清理。

然而中国古训有云,“明日复明日,明日何其多”,勒布朗(LeBlanc)法则也表示,“稍后等于永不。”你会发现,因为各种各样的原因,很多时候你根本都不会(没时间)去整理之前的代码。所以,正如本书作者 Robert C.Martin(Uncle Bob),在 SD West 2007 技术大会上所说的,“那堆“可以运行”的乱麻程序,就在我们的眼皮底下慢慢腐坏。”

我们知道,坏代码会污染环境,最后会坏掉整个项目。保持整洁的习惯,发现脏代码就要及时纠正。花时间保持代码代码整洁,不但有关效率,还有关项目的生存。

五、为什么好代码会很快变质?

为什么好代码会很快变质?一般情况下,需求一直在变更、需求变化违背了初期设计、进度太紧是导致好代码变质的诱因。

多数的产品经理想要好的代码,即便他们总是痴缠于进度,他们会奋力的维护进度和需求。而程序员们则当以同等的热情捍卫代码的整洁性和可扩展性。

举个栗子,如果你是医生,病人在请求给给他们做手术前别洗手,因为那会花太多时间,你会照办吗?本该是病人说了算,但医生却绝对应该拒绝遵从。为什么?因为医生比病人更了解疾病个感染的风险。医生如果按病人说的办,就是一种不专业的态度。

同理,程序员遵从不了解混乱代码风险的产品经理(策划)的意愿,都是不专业的做法。

六、程序员的基础价值谜题

程序员都面临着一种基础价值的谜题。有那么几年经验的开发者都知道,之前的混乱拖了自己的后腿,但开发者背负期限的压力,只好制造混乱。简言之,他们没花时间让自己做得更快。

而其实真正专业的人士明白,这道谜题第二部分说错了,制造混乱无助于赶上期限,混乱只会立刻拖慢你,叫你错过期限,赶上期限的唯一方法——做得更快的唯一方法——就是始终尽可能保持代码的整洁。

七、大师们眼中的整洁代码

到底什么是整洁的代码?有多少程序员,就有多少定义。 “大师级程序员把系统当故事来讲,而不是当做程序来写”。就让我们一起看看经验丰富的大师级程序们都是如何定义整洁代码的。

Bjarne Stroustrup ,C++语言之父, The C++ Programming Language(中译版《C++程序设计语言》)一书作者:

“我喜欢优雅和高效的代码,代码逻辑应直截了当,叫缺陷难以隐藏;尽量减少依赖关系,使之便于维护;一句某种分层战略完善错误处理代码;性能调至最优,省得引诱别人做没规矩的优化,搞出一堆混乱来。整洁的代码只做好一件事。”

Grady Booch, Object Orient Analysis and Design with Application (中译版《面向对象程序分析与设计》) 一书作者:

“整洁的代码简单直接,整洁的代码如优美的散文。整洁的代码从不隐藏设计者的意图,充满了干净利落的抽象和直截了当的控制语句。”

Michael Feathers, Working Effectively withLegacy programming (中译版《修改代码的艺术》)一书的作者:

“整洁的代码总是看起来想是某位特别在意它的人写的,几乎没有改进的余地,代码作者署名都想到了,如果你企图改进它,总会回到原点,赞叹某人留给你的代码——全心投入到某人留下的代码。”

Ron Jeffries, Extreme Programming Installed(中译版《极限编程实施》)以及 Extreme Programming Adventures in (C# 中译版《C# 极限编程探险》)作者:

“减少重复的代码,提高表达力,提早构建简单抽象,这就是我写整洁代码的方法。”

八、编写代码的难度,取决于周边代码的阅读难度

编写代码的难度,取决于周边代码的阅读难度。何出此言?因为各种实践与统计表明,在项目里开发新功能的过程中,阅读之前代码与书写新的代码,花费的时间比例超过10:1,新写代码时,我们一直在读旧代码。既然比例如此之高,我们就应该让读的过程变得轻松,即便那会使得编写过程更难。

所以说,编写代码的难度,取决于周边代码的阅读难度,想要快速实现需求,想要快速完成任务,想要轻松的写代码,先让你书写的代码整洁易读吧。

九、让代码比你来时更干净

我们知道,光把代码写好可不够,必须时时保持代码整洁,我们都见过代码随着时间的流逝而腐坏。我们应该更积极地阻止腐坏的发生。

借用美国童子军的一条简单的军规,应用到我们的专业领域:

“让营地比你来时更干净。”

那么可以同样对编程领域这样说:

“让代码比你来时更干净。”

也就是说,如果我们每次签入时,代码都比签出时干净,那么代码就不会腐坏。这就是我们需要遵从的代码整洁之道。

十、本文涉及知识点提炼整理

文章开头部分已经用思维导图的方式展现了本文的知识点,这边再贴出一个文字列表版,方便大家整理:

  1. 编写代码的难度,取决于周边代码的阅读难度。想要快速实现需求,想要快速完成任务,想要轻松的写代码,请先让你书写的代码整洁易读。
  2. 保持整洁的习惯,发现脏代码就要及时纠正。花时间保持代码代码整洁,这不但有关效率,还有关项目的生存。
  3. 程序员遵从不了解混乱风险的产品经理(策划)的意愿,都是不专业的做法。
  4. 让代码比你来时更干净:如果每次签入时,代码都比签出时干净,那么代码就不会腐坏。
  5. 赶上期限的唯一方法,做得更快的唯一方法,就是始终尽可能保持代码的整洁。

本文就此结束。

下篇文章,我们将继续《代码整洁之道》的精读与演绎,探讨更多的内容。

With Best Wishes.