余果的博客

每一件意义重大的小事——读《代码整洁之道》

Introduction

user

余果

一个产品设计师。了解详情


Featured

每一件意义重大的小事——读《代码整洁之道》

余果

最近在读《代码整洁之道》,先说一些自己的心得,我觉得无论什么语言的程序员,无论什么开发方向——移动也好,web也好,桌面也好——学会如何编写整洁的代码(clean code)都是至关重要的一堂课。

这门课的名字也许一点都不酷,但它会完全改变我们的生活。它会让我们从一个日日夜夜加班、陷入代码泥沼中的苦逼开发仔变成开心工作效率工作的型男。

这本书讲了特别多关于代码整洁的细节,多到让人觉得没必要,但是如果有曾经陷入代码泥沼的经验,一定会点头称是。本文仅举两例,说明代码整洁的重要性,和改良代码整洁对我的生活产生了怎样的改变。

DRY(不要重复你自己)

DRY原则是软件开发中毫无疑问最重要的原则,重复是所有邪恶的来源,许多原则与实践规则都是为了控制和消除重复而创建。例如,全部Codd数据库范式都是为了消灭数据重复而服务,面向对象编程将代码集中到基类,从而避免了冗余。

我刚进入Qzone做页面重构的时候,Qzone v5的代码一团糟。页面重构只负责HTML静态模板(可以认为是demo)和CSS的实现,在组织架构上被归类为设计类。熟悉CSS的人都知道这种语言非常“简单”,它不是编程语言,而是描述语言,描述页面应该是什么样子。

但这种简单的语言也可以乱得一团糟,1份CSS代码可能被10个页面调用,而且20个同样样式的页面调用的CSS代码可能不是同一份。CSS和HTML的对应关系既不是完全无重复1对N,也不是最小化请求的1对1,而是各种不科学的N对N。

所以当时很郁闷,写了《郁闷的开发环境》,也进行了一些思考,比如《为什么需要架构》《请求、缓存、图片利用率和人力成本》。后来我们整理自己遇到的问题重新开发了Qzone v6,在CSS代码方面基本上我们只做了一件事,并把这件事做的不错,就是DRY。

我们把复用的模块放在单独的CSS文件中让其他页面CSS @import进来(发布会压缩合并成一个),我们用cssGaga自动合并雪碧图,,我们把所有的样式文件放在同一级目录,我们禁止2级以上的 @import 嵌套,我们分析必现模块和可选模块,从而判断是ajax载入还是雪碧图分离。

在新的代码框架里工作,保守估计我们的工作效率应该提高了3倍,乐观估计是10倍。因为清晰和一致,我们的页面表现不再各种不一致,我们修改代码不用担心在不该影响的时候影响其他代码,也不用担心在应该统一修改的时候没有统一修改到其他页面。

短小

第三章“函数”关于编写函数的一个重要原则是“短小”,之前写CP工具的时候需要大量页面交互的JS,于是写了各种大段大段的JS,代码中各种流程打断,各种switch。

读完这一章之后才知道编写函数的最佳实践是每个函数都3到4行长,函数的缩进曾经不该多余两层,每个函数只做一件事,避免switch,函数参数尽量少(0优于1,1优于2,3需严重斟酌),函数应该按函数名的表达只做一件事而且没有副作用。

破窗和童子军军规

好的代码需要打磨。 破窗说的是,一个小区,本来干净整洁,没有犯罪事件,大家安居乐业。然而,忽然有一天,一个窗子被打破了,但是没有人管。接下来,不好的事情接连发生,显示有人乱扔垃圾,接下来是随地大小便,整个环境变得脏乱差,随之而来的就是打架斗殴事件的出现,最终导致出现犯罪的事件。也就是说,一件很小坏事儿,如果不加控制的话,也会演变成严重的事件。童子军军规我是从Bob大叔(Robert C Martin)那里知道的,童子军军规中有条规定,当你离开一个地方的时候,要让它比你来的时候更整洁干净。这样的话,童子军扎营的地方会越来越干净。

大家应该看出二者之间的关系了,其实很简单,前者意味着恶性循环,而后者意味着良性循环所以,想要做一个优秀的程序员,应该遵守童子军军规,而不是将破窗情况越变越严重。我们维护版本的时候(无论SVN还是Git),都要让自己签入的代码比签出时候更好。。

user

余果

一个产品设计师。 了解详情