编码的艺术

《编写可读代码的艺术》是一本关注编码细节的书。或许你会认为本书所讲皆为小道,诸如方法命名、变量定义、语句组织、任务分解等内容,俱是细枝末节,微不足道。然而,对于一个整体 的软件系统而言,既需要宏观的架构决策、设计与指导原则,也必须重视微观的代码细节。正如作文,提纲主旨是文章的根与枝,但一词一句,也需精雕细作,才能 立起文章的精气神。

所谓“细节决定成败”,在软件历史中,有许多影响深远的重大失败,其根由往往是编码细节出现了疏漏。

我一直坚持“代码即架构”的观点,正如小说需要角色来说话一般,软件系统的质量好坏,归根结底还是需要代码来告知。代码的优劣不仅直接决定了软件的质量,还 将直接影响软件成本。Yourdon和Constantine在其著作《Structured Design》中写道:软件成本由开发成本与维护成本组成,而往往维护成本要远高于开发成本。这其中耗费的主要成本就是由于理解代码和修改代码造成的。正如本书的书名所表示的含义,好的代码常常是可阅读的,要做到这一点,则近似于一种艺术之美了。

与 本书相似的一本书是Robert C. Martin的《Clean Code》。该书在业界已经得到了广泛赞誉。如果你还在为写出“丑陋”的代码而烦恼,必须阅读该书。它带给你的冲击,好似《阿凡达》那无与伦比的3D电影 带给你感官上的震撼。在某种程度上,本书几乎可以与《Clean Code》比肩。或许本书在深度上与《Clean Code》相比还有所不及,但在内容广度上,却远远超过了《Clean Code》。因为它关注编码本身,所以并不局限于某一种语言,而是列举了大量C++、Python、JavaScript和Java代码,涵盖了主流的静 态语言和动态语言。这就使得本书的内容具有更强的普适性。

本书给出了许多改善编码质量的技巧,尤其它结合了大量真实案例,给出了具体的代 码片段,并从正反两面对案例进行分析,这就使得作者的讲解不再流于空洞,既让人信服,又有助于读者理解。例如,在讲解命名如何表达意图时,作者给出了 Google代码中的一个反面教材。在Google的一段代码中定义了一个宏,用于禁止“邪恶”的构造函数:

class ClassName {
private:
DISALLOW_EVIL_CONSTRUCTORS(ClassName);
public:

};

宏的定义如下:

#define DISALLOW_EVIL_CONSTRUCTORS(ClassName) \
ClassName(const ClassName&); \
void operator=(const ClassName&);

这个宏禁止了构造函数和Copy构造函数(即“=”操作)。然而从宏的名称来看,这个含义是不明确的,会让读者认为仅仅禁用了构造函数。只需要改个名字,意图就可以变得更
加清晰:

#define DISALLOW_COPY_AND_ASSIGN(ClassName) [...]

书 中各章的案例非常翔实,并且总是先给出糟糕的版本,逐步分析推导,最后给出好的实现,作为直观鲜明的对照。为避免读者陷入相对独立而散乱的小案例中,作者 又另辟一章内容, 讲解了一个完整的案例Minute/Hour Counter。首先从问题域的提出开始,分析了接口的设计与实现,深入剖析了实现方法的命名乃至注释,抽丝剥茧,条分缕析。作者的分析显得好整以暇,有 条不紊,先后给出了3个解决方案,渐进地对编码实现进行了改善,使之在性能、灵活性上都有了很好的改观,类的职责更为清晰,代码结构简洁而又易于理解。最 后,作者还给出了3个解决方案的比较,从代码行数、时间复杂度、内存消耗和准确率4个因素出发,全面权衡了各个解决方案的优劣,以此来印证作者在本书中一 直推崇的编码技巧。

本书作者并不满足于通过文字和代码来彰显这些技巧的力量,书中附带的漫画插图起到了很好的辅助作用。如果将本书比作一盘 精美的佳肴,这些漫画就起到了调料的作用。对于技术书籍来说,这种图文并茂的方式实不多见,它为全书增添了亮色。我们赏阅漫画时的会意一笑,心底其实充满 了如遇知音的喜悦。

阅读本书时,那种代码从丑陋到美丽的蜕变总是让人振奋;但是,我们不能满足于结果的获得,而应该享受这个过程。我的建议是,在阅读时,多思考作者给出的反面教材,不要急于了解结果,而应掩卷遐思,分析这段代码的问题,并结合自身经验与能力给出自己的方案。然后再比较 作者的方案,两相印证,辨别两个方案各自的优劣之处。最后再仔细阅读作者的分析过程,如此才能更好地理解本书,提升自己的编码技能。

全书200页左右,与那些瀚如烟海的高文大册相比,本书显得轻而薄,但它胜在精专。作者没有囊括所有编码技巧的野心,更没有卖弄地展现自己的设计技巧和博识广学。它的专注可能会因此失去一大部分读者群,但这样的书才是我们程序员真正需要的。希望你能喜欢它!


张逸

ThoughtWorks高级咨询师

-----------------------------

本文为《编写可读代码的艺术》(The Art of Readable Code)推荐序,原文网址:http://www.infoq.com/cn/articles/art-of-readable-code

【关于本书】

细节决定成败,思路清晰、言简意赅的代码让程序员一目了然;而格式凌乱、拖沓冗长的代码让程序员一头雾水。除了可以正确运行以外,优秀的代码必须具备良好的可读性,编写的代码要使其他人能在最短的时间内理解才行。本书旨在强调代码对人的友好性和可读性。

《编 写可读代码的艺术》关注编码的细节,总结了很多提高代码可读性的小技巧,看似都微不足道,但是对于整个软件系统的开发而言,它们与宏观的架构决策、设计思 想、指导原则同样重要。编码不仅仅只是一种技术,也是一门艺术,编写可读性高的代码尤其如此。如果你要成为一位优秀的程序员,要想开发出高质量的软件系 统,必须从细处着手,做到内外兼修,本书将为你提供有效的指导。

主要内容:

  • 简化命名、注释和格式的方法,使每行代码都言简意赅。
  • 梳理程序中的循环、逻辑和变量来减小复杂度并理清思路。
  • 在函数级别解决问题,例如重新组织代码块,使其一次只做一件事。
  • 编写有效的测试代码,使其全面而简洁,同时可读性更高。

【关于作者】

Dustin Boswell毕业于加州理工大学,资深软件工程师,在Google就职多年,负责Web爬虫和程序设计相关的工作。他专注于前端、后端,服务器架构、机 器学习、大数据、系统和网站等技术领域的研究和实践,经验十分丰富。他现在是MyLikes的软件工程师。

Trevor Foucher资深软件工程师和技术经理,先后在Microsoft和Google工作了数十年,在Microsoft担任软件工程师、技术经理以及安全产品技术主管,在Google从事广告应用开发和搜索基础结构研发相关的工作。

【样章下载】http://download.csdn.net/detail/hzbooks/4375270

【豆瓣收藏】http://book.douban.com/subject/10797189/

原文地址:https://www.cnblogs.com/hzbook/p/2573547.html