如果你维护过运行了几年,甚至十几年的代码库,肯定会有这样的体验:
“这一坨代码是干嘛用的?看半天也不知什么意思?”
“把这些看不懂的代码删了?要是出事了谁背锅?算了,还是维持原状吧“
”只是简单地做一个功能的修改,却要同时去改五六处代码!不行,一定要重构…”
“算了,这里的代码有说不清的玄机,重构相当于在给自己挖更大的坑,还是按照原来的写法吧…”
于是,烂代码就如同腐烂的苹果,一开始只是烂了几个点,很快就会蔓延,直至烂透,再整体推倒重来
我见过很多程序员在遇到前任留下的烂代码时,首先骂几句:”靠,这TM谁写的垃圾,这怎么维护啊?“
吐槽一番后,就继续按照前任们的写法继续写下去。如果有其他人问为什么要这么写,他们就会把一切责任都归咎于前任。就好像别人写的代码就是豆腐渣,而自己却无辜纯洁得如同白莲花。
烂代码的演化如同在雪地里走路,前人踏出了一个浅浅的坑。后面的人为了贪图方便,继续沿着这个坑前行,慢慢地,这些坑就变成了路,后续的人都沿袭这条路走到黑,即使有些人想改变现状,踏出了一些分支,也无法改变整个局面,反而令路线更加令人困惑。
2 对于烂代码应采取零容忍同样一个人,如果在夜间大排档吃饭,他会大声喧哗,抽烟,甚至随地吐痰。他并不觉得这样有什么不妥,因为周边的环境就是这样。
倘若他是去星级酒店吃饭,自然就会约束自己的行为,瞬间变成一个绅士。
同理,一个新人如果看到公司的代码写得很整洁,都是统一的规范,每个文件、每个类、每个函数都有相应的注释。而且代码提交后还会有其他人进行Review,那么即使他是一个菜鸟,也会模仿着其他人的代码规范,毕竟谁也不会在光洁如面的星级酒店当众吐痰…
但如果新人看到公司的代码风格各异,命名毫无章法,存在大量冗余的,不知所云的代码,而且多处采用硬编码的形式。那么他肯定会觉得这家公司的代码可以随便写,只要能跑起来就可以了。即使是一个本身很讲究编码规范的人,在这种代码环境下,也难免会写出冗余糟糕的代码。就好像大学宿舍只要有一个人不讲究卫生,整个环境就很脏乱,因为其他人不可能去维护公共的环境。
因此,烂代码是有极强的感染性。破窗原理同样适用于代码。对于烂代码,应该在一开始就采取零容忍的态度。即使有些代码迫于进度压力,不得已而为之,也要充分写好注释,防止污染到其他代码。
3 代码规范的重要性有些程序员恃才傲物,对于代码规范嗤之以鼻,觉得自己独特的风格才是最优雅的,自己是一个艺术家,不应该被死板的规范所束缚。
我想大多数程序员的能力都比不上google的工程师吧,而google的开发人员,入职的第一件事就是熟悉他们的代码规范,他们的代码规范极其严谨,细化到每一个细节,如:命名规范,注释规格,大括号是否换行,缩进用tab还是空格,变量名用驼峰法还是下划线…
制定规范的目的是提高团队协作的效率,如果放任不同人以自己喜欢的风格写代码,那么整个代码库将会变成一个令人眩晕的大杂烩。特别是对于那些很灵活的编程语言,不遵循规范的后果是灾难性的。
对此,PHP程序员应该深有体会。毫不夸张地说,1000个PHP程序员会有1000个以上的代码风格,即使是同一个人,在不同的时期,不同的心情下,写出来的代码风格也不同,反正怎么写都不会报错,那就怎么爽怎么来。写的人是爽了,后面维护的人就痛苦了。尤其是强迫症的同学,看到那些不符合自己规范的代码,一定要去修正,而他的修正又干涉了别人的自由。于是,就互相伤害吧…
虽然每个人都有自己的偏好,但在团队中,应该遵循同一套的规范,才能使合作的成本降到最低。在团队中,通过迥异的代码风格来标新立异是愚蠢的行为。就如同在正式的宴席上,所有人都西装革履,而你却一件大背心,一个大裤衩,趿拉着拖鞋,唱着小苹果入场。
你,觉得这样合适吗?
4 文档的重要性当我写下这一行代码时,只有我和上帝知道是什么意思。一个月后,只有上帝才知道是什么意思了…
程序员最痛恨的事:”为什么别人不写个文档?”, 而当要自己写文档时,又觉得:”这东西,哪用写文档,看下代码就知道了“。于是,当下一个人接手代码时,又是一阵吐槽,最终很可能自己重新实现功能。很多时候,理解别人的代码,还不如自己重新写来得更高效。
每一个程序员都必须认识到文档的重要性,学会写文档是必备技能。
我们都是很健忘的,即使是自己写的代码,一个月后,可能都忘了当时为什么这么写了。然后又要重复去翻各种聊天记录,追踪代码,才慢慢地将逻辑串起来。这些耗费时间的事不会创造任何的价值,却占用了程序员很大部分的时间。
除非你是高手,能将代码写得十分简洁易懂,做到”代码即文档“。否则,文档就是你大脑在某一时刻的快照。往后,你或者他人只要根据文档的索引,就能知道这个需求的具体逻辑是怎样的,是为了解决什么问题,具体的实现方式如何。
假如你能养成写文档的习惯,你肯定能节省很多瞎忙的时间。
同样是炼金术,为什么西方能衍生出化学?因为他们有记录的习惯,每次实验是可以重现的,而我们信奉的是口口相传,把这些上升到了道的层面。这种说不清,道不明的所谓“道”,是无法流程化的,而更像是一种玄机,类似于黑魔法的存在。
编程,应该遵循有记录、可重现的科学方式,而不是靠瞎猜的黑魔法方式。