《代码整洁之道——程序员的职业素养》是《代码整洁之道》的作者Bob大叔的第二部作品,笔者读完2016年再版的本书后有感而发写下本文,本书2012年的版本叫《程序员的职业素养》。从内容上看,本书并非《代码整洁之道》的续书,加上前缀可能是Bob大叔著作等身的时候要用第一本书命名全集。
职业素养并不是神秘的天赋,也不是高深的技艺,而是能力与素质的体现,也是持续的积累和养成。本书可以指导一个程序员如何抵制不专业的需求,提高开发的效率,享受自己的职业素养。
和《代码整洁之道》一样,每章的开头的插图(以下简称“主题图”)都概括了该章的主题,同时因为本书每章前的引言都是Bob自传的一部分,所以主题图常常有Bob大叔,注意他的长相。每章的主题图也都隐藏了“KOHNKE”的暗记,在读书之余找暗记比给前任留下的代码捉bug有趣多了。
第一章《专业主义》
本章的主题图是《碧血金沙》中的霍华德的剧照,搭配戏谑的台词嘲讽因为不专业而遭受挫折的程序员。
专业主义泛指做一个专业的程序员的职业道德,包含等多个诚实、谦虚、合作、坚持学习等方面。不但象征荣誉与骄傲,而且明确意味着责任与义务。
第二章《说“不”》
本章的主题图是包括Bob大叔在内的一群员工在暴跳如雷、怒不可遏的上司Frank面前噤若寒蝉、唯唯诺诺、没人敢于说“不”的样子。
说“不”是一个程序员的必备素质,对产品经理不合理的需求说“不”,对项目经理不科学的日程说“不”。老板也应该珍惜敢于说“不”的程序员,敢于说“不”说明此人是一个人才而不是奴才。
第三章《说“是”》
本章的主题图是Bob大叔等人在ER项目的发布会上,被台下观众用“BRAVO!”和“WONDERFUL!”连声称赞。
敢于说“是”的重要性不亚于说“不”。为了让自己有说“是”的底气,程序员应该努力寻找创新的方法以确保完成任务,尽可能做到有求必应。
第四章《编码》
本章的主题图是Bob大叔18岁时用穿孔机练习盲打的情景。
编程和盲打一样,要精熟掌握编程能力的关键是要具备信心和“出错感知能力”,编码期间保持充足的睡眠、健康的体魄、科学的生活方式是信心和“出错感知能力”的源泉。
Bob大叔最糟糕的代码是凌晨3点写出来的,疲劳或心烦意乱的时候程序员的能力处于最低点。作为想让程序员发挥最大工作效率的老板,不要让程序员熬夜加班。
第五章《测试驱动开发》
本章的主题图是1999年Bob大叔向老专家Kent学习TDD的要义的画面。
TDD不仅仅是一种用于缩短编码周期的简单技巧,也是一项能够提升代码确定性、降低代码错误率、优化文档和设计的原则。不遵循TDD原则的程序员难以称之为一个专业的程序员。
第六章《练习》
本章的主题图是卧病在床仍耕不辍的Bob大叔的电脑里飘出了灯神(外国的“下笔如有神”?)
Bob大叔用武术比喻编程,利用8小时以外的时间增强自己的技能是对自己负责的表现,尽管每人为你练习付钱,却有人为你练习的成功付钱。
当然,练习错误的东西会对程序员的成长产生南辕北辙、背道而驰的影响,比如跟着一发功就能击飞十个徒弟的印度大师练习十年瑜伽,在UFC赛场上也不能用意念打倒中国的散打队员。
第七章《验收测试》
本章的主题图是1979年在外行主管Tom的瞎指挥下Bob大叔搞出了一个经不起电脑前真刀真枪考验的东西的画面(把看不见摸不着的软件系统画成看得见摸得着的机器人是因为软件系统画不出来)。
解决开发方和业务方沟通问题的不二法门是编写自动化的验收测试,这些测试必须以严肃的需求文档为基础才能保证结果不会造成模糊。
第八章《测试策略》
本章的主题图是1989年Rose项目上线前Bob大叔绞尽脑汁捉bug,身边的同事们一筹莫展。
QA是团队的重要组成部分,开发团队只有与QA紧密协作,才能获得更多的bug反馈,确保系统经历单元测试、组件测试、集成测试和探索式人工测试后达到“QA应该找不到任何错误”的标准。
第九章《时间管理》
本章的主题图是以Bob大叔为首的一群人和一座大钟打架(外国的“争分夺秒”?)
专业开发人员应该合理利用时间和精力,抵制优先级错乱,知道解决雪片似飞来的Crash比把logo大小调整成产品经理喜欢的尺寸重要。
程序员除了要珍惜8小时之内的工作时间,也应该用心管理8小时之外的学习时间,玩4年LOL的人一定没有刷4年LeetCode的人收入高。
第十章《预估》
本章的主题图是1978年的圣诞晚会上一醉方休的Bob大叔安慰因为预估时间太短而醉不成欢的Ken:“这就是我们真正需要的,所以,我一点儿也不生气”
威客网站上充斥着“做一个网上商城,要求达到国内一线电商标准,预算低于30000元,时间不超过1个月”的任务,外行老板常常低估软件开发的时间成本和人力成本,但为业务人员提供可靠的预估结果是专业开发人员的必备素质。
在本章Bob大叔介绍了几种做出可信预估的方法,也指出了程序员与业务方协商达到共识的窍门。
第十一章《压力》
本章的主题图是一个人的灵魂向主刀医生施加压力导致其不能冷静下来为自己的身体做心脏手术的画面。
很多老板有催逼程序员熬夜加班的习惯,除了造成前文所说的疲劳之外,压力陡增也会让程序员变成主题图中一边把手术器材摔得叮咣乱响,一边咒骂时间不够用的主刀医生。
如果老板不具备不给程序员额外压力的素质,程序员就必须具备压力面前冷静果断、面不改色的能力,以战胜由咄咄逼人的老板和deadline带来的压力。
第十二章《协作》
本章的主题图是22岁时的Bob大叔和他的同事Tim协作调试为切割电子元件的激光用的软件后一起欣赏软件操纵激光生产电子表的画面。
程序员是一个多岗位配合的职业,程序员是需要与同岗位不同人、项目组不同岗位、不同项目组、不同部门、业务方打交道的极度依赖沟通能力的职业,与人协作的能力决定了程序员在编程之路上能走多远。
第十三章《团队与项目》
本章的主题图是榨汁机把一群人搅拌成不能称之为“团队”的混合物。
软件项目和战争一样,并不是靠人多取胜的。一团散沙的工作效率比不上一个组建稳健的团队,一个团队只有建立了凝聚力后才能成为持续输出项目的强大引擎。
本章中提到的“分析师”是负责关注行业领域、分析需求、测试功能的岗位,曾长期没有固定称谓:我上大学时软件过程管理课程称其为“领域专家”,需求工程课程称其为“需求工程师”。在移动互联网时代到来后才统一称之为“产品经理”,本书2016年再版沿用旧称是向Bob大叔奋斗一生的年代致敬。
第十四章《辅导、学徒期与技艺》
本章的主题图是平行世界里年轻时的Bob大叔没有走上程序员道路而是跟着魔法师做魔法学徒。
学校能传授的理论,但是一名程序员必备的原则、实践和技能只能培养而不能教。作为老人,不要对新手拖了你的后腿大发雷霆,谁都是从眼高手低的阶段过来的,培养新人是我们义不容辞的责任和义务。