《Clean Code》一书从翻开至今,已经差不多两个月的时间了,尽管刨去其中的假期,算下来实在是读得有点慢。阅读期间,断断续续的做了不少笔记。之前,每每在读完了一本技术书籍之后,其中的诸多细节会很快的淡忘,最终留下的往往是在阅读时候与自己之前的印象产生极大共鸣的部分,或者在之后实践当中碰巧运用到的一些知识点。所以,根据已往的经验来说,对于一本技术书籍的学习,个人更愿意依照如下两个基本原则来学习:

  • 撷取个人当前认同最深的少数几个知识点,反复进行实践,并在理解之后再扩张到其他的知识点
  • 择期再次阅读,并记录之前理解不对的或者总结自己收获的新的认知

也因为做如是认为,对于这本书的阅读笔记,当前也只对一些印象深刻的三个观点进行记述。

价值认同

决定去学习一件事情,首要的是认同其跟从的价值。所以作者在第17章《 Smells and Heuristics》总结部分提到提到:

这份启发与味道的清单很难说已完备无缺。我不能确定这样一份清单会不会完备无缺。但或许完整性不该是目标,因为该清单确实给出了一套价值体系。这套价值体系才该是目标。

我很赞同作者的这种说法,CleanCode首先必须要程序员本身非常在乎自己的代码,并且有心一点一滴的去提升自己的代码质量。有了这样相同的价值认知,剩下的就是不断的编写代码、改进代码,按照一些建议或者过程当中自己收获的心得,一步一步螺旋式的去改善代码的质量。

方法学

其实,大多人都是想学好的,但是往往是有向学之心,但无恒久之力。古今皆有之,比如《论语》当中便有一段冉求与夫子的对话:“冉求曰:「非不說子之道,力不足也。」子曰:「力不足者,中道而廢。今女畫。」”

对于此,作者在书里面的多个地方结合自己的经验做了说明,读了可真是使人倍受鼓舞啊,且看。在第3章《Functions》当中有:

写代码和写别的东西很像。在写论文或文章时,你先想写什么就写什么,然后再打磨它。初稿也许粗陋无序,你就斟酌推敲,直至达到你心目中的样子。

我写函数时,一开始都冗长而复杂。有太多缩进和嵌套循环。有过长的参数列表。名称是随意取的,也会有重复的代码。不过我会配上一套单元测试,覆盖每行丑陋的代码。

然后我打磨这些代码,分解函数、修改名称、消除重复。我缩短和重新安置方法。有时我还拆散类。同时保持测试通过。

最后,遵循本章列出的规则,我组装好这些函数。

我并不从一开始就按照规则写函数。我想没人做得到。

作者非常坦白的告诉他自己的写作过程,尽管无法证实,但是如此inspiration的表达,也是像我这样自认愚笨、难以雕琢的程序员所喜闻乐见的,算算自己多多坚持似乎也还有成为好程序员的机会:) 另外,从作者的这一段叙述里面,起码可以知道两件事:

  • 好的代码的写成并非一蹴而就,而需要反复、耐心细致的调试
  • 单元测试的重要,帮助确保优化前后功能的一致

在第14章《Successive Refinement》里面也有:

这段程序并非从一开始就写成现在的样子。更重要的是,我也没指望你能一次写出整洁、漂亮的程序。如果说我们从过去几十年里面学到什么东西的话,那就是编程是一种技艺甚于科学的东西。要编写整洁代码,必须先写肮脏代码,然后再清理它。

作者在这里也突出了高质量的代码伴随了一个逐步改进的过程。不过现实当中往往是生产了非常多的“能工作”的程序,然后就没有然后了。

综合本书归结下来,写好代码的建议并未只是一味的谈论理论,相反的,作者反复的强调动手实践的重要性,并且在书中花了100+页来示范代码的重构。所以,自己总结了Clean Code的方法学为四个字:“反复,改进”。

四原则

四原则出自第12章《Emergence》,中文版对该章名称的翻译为“跌进”。这一章相对来说,是更为详细的方法论。Kent Beck认为遵守简单设计的四条规则,对于创建具有良好设计的软件有着莫大的帮助,它们是:

  • 运行所有测试
  • 不可重复
  • 表达了程序员的意图
  • 尽可能减少类和方法的数量

上面的四条规则按照重要程度排列。对于“设计规则之一:运行所有测试”,作者提到的一句话:“测试编写得越多,就越能持续走向编写较易测试的代码。”这一话多少是一种鼓励,对于当前大部分开发人员而言,都是极其讨厌测试代码的编写,并且通常是在事后为了覆盖率而去“有针对性”的编写测试用例。当然,这一种原因时因为开发人员本身没有编写多少代码,所以不知道测试的好处;另外一种是不知道测试代码的重要性,其带来的质量和效率上面的提升功能。

测试固然很重要,但是作者同时也提到编写高质量的测试代码更重要,因为糟糕的测试代码可能会带来适得其反的效果。对于单元测试的说法,王垠在他的一篇文章《谈“测试驱动的开发”》也专门谈到过他对测试的认识,其中透露的比如“不能在心理上完全依赖测试”,“架构并未成型的时候对于测试可以延迟编写”也是可以用来作为参考的。

其他的三条设计规则,也就是属于“重构”的范围了。其实不管是测试,还是重构,里面都包含了相当多的内容,显然三言两语并不能说出过大概,但是这对于Clean Code整体干支的梳理上清晰了不少。有了测试,便可以消除对清理代码就会破坏代码的恐惧。

尽管有着诸多的指导原则和参考规范,文中的一些内容也会有自相矛盾的地方:为了保持类和函数短小会造出太多细小类和方法,而四条规则的最后一条则是尽可能少的类和方法。作者对此做了一个说明:

我们的目标是在保持函数和类短小的同时,保持整个系统短小精悍。不过要记住,这在关于简单设计的四条规则里面是优先级最低的一条。所以,尽管使类和函数的数量尽量少是很重要的,但更重要的却是测试、消除重复和表达力。
所以,坚守一些规范是好的,但是同时也需要保持一定的灵活性。

总的来说,上面的“价值认同”、“方法学”与“四原则”是自己偷懒总结的当前欣赏或者说觉得有指导意义的三个方法的知识点,对于书中其他的各种参考当然也是有价值的,因为知道自己一次性记不了那么多的详细条目所以也就并未一一将笔记全副进行摘录了。对于各方面尚未登堂的自己来说,Coding Now!

其他

拿这本书每一章的内容的组织来说,带给我的感觉与之前读到的一些书籍有所不同,当然,这主要是我看的技术书籍少得可怜的缘故 :( 之前阅读的一些技术书一章篇幅较长,实话说,自己当前对于技术不是痴迷的那一类,所以读起来真是有些痛苦,这也间接的造成了一些书读了一半或者一部分。而该书每一章的组织因为比较短小,所以读起来会觉得比较轻松,却在不经意间读完了。同时,这也带给了我在写作笔记时的一点启发:之前自己很欣赏多位技术博主的长篇笔记,觉得异常丰满,在自己学着去写作的过程当中总是也向其看齐,但是因为自身水平不够,所以总是常常半途而废。其实想想将一片笔记写成恰到的长度,说明了该说明的,就很不错。

注:文中的中文引用来自翻译版《代码整洁之道》

《Clean Code》一书回顾的更多相关文章

  1. 《代码整洁之道》(Clean Code)- 读书笔记

    一.关于Bob大叔的Clean Code <代码整洁之道>主要讲述了一系列行之有效的整洁代码操作实践.软件质量,不但依赖于架构及项目管理,而且与代码质量紧密相关.这一点,无论是敏捷开发流派 ...

  2. 说说怎么写clean code

    前两天参加了公司组织的一个培训,主题是“如何写出好的代码” ,刚看到这个主题,第一反应是又不知道是哪个培训机构来忽悠钱的!老大安排了,就去听听呗. 说实在的,课程内容没有什么新鲜的东西,就是讲讲如何发 ...

  3. Clean Code–Chapter 7 Error Handling

    Error handling is important, but if it obscures logic, it's wrong. Use Exceptions Rather Than Return ...

  4. 《clean code》讲述代码中的道,而不是术

    Clean code 看<clean code>一书,学习高手写出的代码,简单高效的代 1.目标 Bjarne Stroustrup:优雅且高效:直截了当:减少依赖:只做好一件事 Grad ...

  5. Clean Code 笔记 之 第二章

    你是否真正的会命名 前言 这是我第二次看这本书了(Clean Code)的时候,第一次看的时候是,看到某世界五百强在他们的代码中我竟然看不到一句注释,现在我还记得当时的情景,当我Download 下第 ...

  6. Clean code 关于注释、函数、命名的感想

    最近在看代码整洁之道(Clean code)这本书,其实看的有点痛苦,因为越看就会越想自己写的代码是什么鬼?一些不知所云的命名,不整洁的代码格式,本想诠释代码的意思却添加了一段段废话,还有那些被强制加 ...

  7. 《Clean Code》读书笔记——第二周

    本周我阅读了<Clean Code>. “神在细节中!”,建筑家范德罗如是说.他当然专注于基于宏伟构架之上的永恒建筑形式,他也同样为自己设计的建筑挑选门把手.同样软件开发也是这样,小处见大 ...

  8. Clean Code of JavaScript

    Clean Code of JavaScript 代码简洁之道 JavaScript 版 https://github.com/ryanmcdermott/clean-code-javascript ...

  9. 代码整洁之道Clean Code笔记

    @ 目录 第 1 章 Clean Code 整洁代码(3星) ?为什么要整洁的代码 ?什么叫做整洁代码 第 2 章 Meaningful Names 有意义的命名(3星) 第 3 章 Function ...

随机推荐

  1. UITextField 全属性

    //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, ...

  2. laravel 社会化(联合)登录扩展包(QQ、微信、微博等)

    laravel的官方包只支付国外网站的联合登录:http://laravelacademy.org/post/6288.html 国内用户的话,可以用这个:https://github.com/ove ...

  3. cut的用法【转】

    cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的. (1)其语法格式为:cut  [-bn] [file] 或 cut ...

  4. LeetCode——Intersection of Two Linked Lists

    Description: Write a program to find the node at which the intersection of two singly linked lists b ...

  5. js+jquery(二)

    1.获取列表框所选中的全部选项的值 $("select").change(function() { // 设置列表框change 事件 // 获取列表框所选中的全部选项的值 ale ...

  6. luogu P1379 八数码难题(A*算法入门详细讲解)

     代码实现细节 #include<cstdio> #include<cstring> #include<iostream> using namespace std; ...

  7. WEB安全番外第二篇--明日之星介绍HTML5安全问题介绍

    一.CORS领域问题: 1.CORS的介绍请参考:跨域资源共享简介 2.HTML5中的XHR2级调用可以打开一个socket连接,发送HTTP请求,有趣的是,上传文件这里恰恰是multi-part/f ...

  8. gradle多项目 svn依赖

    当svn有多个子项目且没有根项目的时候,用eclipse拷贝下来是容易出问题的,经常子项目之间的依赖会有问题,还是推荐用IDEA. 操作说明: 如果SVN有 A,B,C,D四个项目,A为web项目,B ...

  9. 【转载】keil(MDK-ARM)的调试使用

    现在软件的模拟功能都是非常强大,但是有时候会用不好. 原文地址: 那就看这里吧:http://www.cnblogs.com/strongerHuang/p/5596355.html 1.编译+调试 ...

  10. LCA在线算法(hdu2586)

    hdu2586 How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...