《编写可读代码的艺术》是一本关注编码细节的书。或许你会认为本书所讲皆为小道,诸如方法命名、变量定义、语句组织、任务分解等内容,俱是细枝末节,微不足道。然而,对于一个整体的软件系统而言,既需要宏观的架构决策、设计与指导原则,也必须重视微观的代码细节。正如作文,提纲主旨是文章的根与枝,但一词一句,也需精雕细作,才能立起文章的精气神。
所谓“细节决定成败”,在软件历史中,有许多影响深远的重大失败,其根由往往是编码细节出现了疏漏。
我一直坚持“代码即架构”的观点,正如小说需要角色来说话一般,软件系统的质量好坏,归根结底还是需要代码来告知。代码的优劣不仅直接决定了软件的质量,还将直接影响软件成本。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/
分享到:
相关推荐
swing编码艺术教您swing编码的艺术
程序员编程艺术pdf可编辑,教你如何将编程作为一门艺术
本章节源代码
CFTA_Spring2021 编码艺术大学欢迎来到UH艺术学院的“艺术编码”课程。 在此存储库中,您将找到课程提纲,日历和课程模块。 请将此页面添加为书签,并返回查看更新。我们的会议将在Microsoft团队中进行您应该在...
诗歌艺术奎因用代码和其他编码艺术或奎因写的诗集。 我不知道怎么回事。 我已经坚持了一段时间,最后决定开始探索。 这个想法是用语法正确的编程语言写诗(任何人都会做)。 语法上允许诗意的许可。 即该代码不必...
纠错编码的艺术(第2版)的研究内容涵盖了初学者、中级直到高级使用者的范围。 本书讲论了所有的关键主题,包括Reed-Solomon码、Viterbi译码、软输出译码算法、MAP、log-MAP和MAX-log-MAP。此外,还包括基于可靠的 ...
《纠错编码的艺术》这本书非常适合入门学习用,加上这个代码就非常好了,可以帮助新手快速入坑!
创意编码,生成艺术,交互设计,资源收集
大师们的程序编码纠错艺术 google 2009 大会
软件架构的艺术.PDF,方便学习和阅读,软件、架构、系统设计、编码艺术。
纠错编码艺术,Preface This book is the result of hundreds of emails from all over the world with questions on theory and applications of error correcting coding (ECC), from colleagues from both ...
纠错编码的艺术中文第二版。 纠错课程的典范之作
制作艺术字体的时候,需要编码转换,这个工具非常好的解决了这个问题!
出色的创意编码:创意编码:生成艺术,数据可视化,交互设计,资源
很棒的创意编码精心挑选主要用于初学者/中级的很棒的创意编码资源列表。...交互设计,信息可视化和生成艺术都是创造性编码的不同类型-这已成为家喻户晓的术语,用于描述以代码形式表达的艺术品。 请阅读贡献准则b
艺术是为了让所有的创造力在不知道任何 HTML 或如何编码的情况下自行创建您独特的网站。 完全响应式设计和轻量级编码解决方案使网站在移动设备上加载速度更快。通过激动人心的互动向潜在客户和雇主展示您的工作很...
unix编程艺术,程序员编码修养、软件设计理念、计算机文化。
生活中很多时候都要去读别人的代码,我们自己也应该把代码写好,写精,这本书有助于分析写好代码
g2D编程语言g2D是一种教育性编程语言,其构想是:向首次接触编码艺术的人传授编程概念,快速制作原型画布渲染2D上下文-g2D内置api确实类似于HTML5 Canvas API,对几何很有趣! 使用脚本并查看生成的几何图形确实非常...