人类的学习模式是向过去学习、向经验学习。我们“迷信”经验的力量,用已有的知识来解决新的问题,这也往往奏效。为了把这些经验传承下去,我们发明了清单和模板。我们可以将清单定义为List,比如CheckList。模板对于照猫画虎的知识传承尤其有用,在IT领域也有各种模板,比如产品需求文档、概要设计文档等。
制定清单和使用清单,清单实践就这么简单吗?答案是否定的,可以先来读一个故事。
2005年8月29日,卡特里娜飓风横扫国外某市,部分地区受灾严重,洪水肆虐,通信中断,消息无法送出。当人们最终将灾情反映到某个联邦官员时却被告知耐心等待。因为需要将相关信息逐级上报,所以传统的指令和控制系统很快被大量的信息和指令淹没。政府拒绝放弃传统的指令模式,灾情正在不断恶化,各级政府却在争论决策权的归属问题,满载饮用水和食物的卡车迟迟不能进入灾区。
我们可以从这个故事总结出下几点。
◎ 面对复杂的问题,做决策往往不容易。各级政府在争论决策权时,事态已经在恶化了。
◎ 要建立应急处理机制,简单、直接、有效。
◎ 要有应对各种问题的清单。
简单总结一下,在解决问题时要有如下几个步骤。
(1)出了什么问题,汇总问题和现象,试着探究原因。
(2)找到解决问题的流程,应该谁负责驱动,流程有哪些环节,有哪些可选方案。
(3)按步骤解决问题。
世界卫生组织的手术安全清单(Safe Surgery CheckList)由19个检查项目构成。其中,在实施麻醉前有如下7个检查项目。
◎ 患者本人或家属是否已经确认了患者的身份,并同意进行手术。
◎ 手术部位是否已经进行了标记。
◎ 是否给患者进行了血氧饱和度监测,仪器运转是否正常。
◎ 患者是否有既往过敏史。
◎ 是否存在气道困难和误吸的风险(这是实施全身麻醉最危险之处),以及所需设备和辅助人员是否已经就位。
◎ 是否存在失血量大于500毫升的风险,儿童为每千克7毫升。
◎ 必需的中心静脉置管、血袋和补液是否已经准备好。
由此可见,清单需要具备简洁、直接、易操作的特点。简洁是指不面面俱到,如果某个环节的检查项目过多,比如超过20项,则一不易操作,二容易出错。直接、易操作是指对清单的描述要清晰、无二义性、具体,对其效果应该能进行观测,并由此进行改进。
如表1.2所示为一份代码审查清单,这份清单仅总结了代码审查在安全维度方面的一些审查点。
表1.2
成也清单,败也清单。执行者在面对太多的清单内容时很容易体力疲劳、出问题,所以最好将流程和审查本身都强制到工具中。
“在提交代码时,强制要求有代码审查记录”就是一种强制流程。前文介绍过的静态扫描工具如Checkstyle、FindBugs都可以解决一些可以规则化、模板化的问题,比如代码基础规范大小写、缩进等。
要让清单成为一种习惯,清单就应该足够简单、清晰并且深入人心。
同时,笔者提倡把清单嵌入流程中,只有在流程中,才能受到关注和持续运营,从侧面治理的模式往往会名存实亡。笔者曾经在传统软件企业工作过几年,还记得每周或者每个月,SQA和 SCM人员都会拿着长长的 Excel表让研发负责人或者 PM打钩,表示“做了某项工作”。这种审查和度量模式的最大问题是 SCM和 SQA人员会对质量和流程遵循情况做展示并反馈给领导,但是研发工程师对“清单”并不感兴趣。后来笔者来到互联网方面的研发公司,SQA的存在感几乎为零,但是我们在研发过程中形成了相关的“完成定义”,比如交付报告。研发人员必须在完成代码之后进行自测、静态代码评估和持续集成报告等,并在这些被判定为“完成”之后,才能进入下一个流程。
下面给出产品需求文档模板,如表1.3所示。
表1.3