Google 软件工程-风格指南与规则
风格指南与规则概览
为了进行代码库管理,需要维护一套风格指南进行规则定义,该风格指南是管理代码的一整套约定。整体来说,风格指南长度不宜过长。随着组织发展,既定的规则和指导方针形成了编码的通用词汇表,通过塑造这些词汇表,工程师会下意识去做“好的事情”,从而将共同的发展模式推向期望的方向。
如何创建风格指南与规则
在定义规则时,要以目标为导向:识别哪些规则支持目标,可以更容易地提取出一组有用的规则。
指导原则
制订规则前需要敲定若干总体原则,整体来说,这些原则必须:
- 发挥规则的作用:规则的制订和遵循都是有成本的,因此不宜太多,不然会增加记忆成本;同时也尽量不要包括不言而喻的规则,不然会额外增加心理负担,造成推广困难。
- 为读者优化:为读者优化,代表着对“简单读”而不是“简单写”的看重;风格指南需要指引工程师们在代码中留下明确的预期行为证据,例如保证所有调用在任何时候都会包含所有权转移的明确证据,从而让代码的读者不需要了解每一个函数的调用行为,另外在调用的地方也要保证有清晰的文档确保代码片段保持可读和可理解。
- 保持一致性:风格指南的另一个作用是促进代码保持一致性,使任何工程师即使进入代码库中不熟悉的部分,也能迅速开展工作;一致性的优势在于,可以降低认知成本,让人专注于“要完成什么”,而不是呈现方式;另外一致性也让模块化和发现重复变得更容易,并对规模化提供了有力支持,同时有助于拓展组织人力和确保了对时间的适应能力。另外一致性的层次结构建议从局部到整体,给定文件内规范大于给定团队规范,然后才是大型项目规范,最后是整个代码库规范。另外一致性也应保证内部和外部社区采用的标准保持尽可能一致。
- 避免容易出错和出乎意料的构件:复杂功能往往存在微妙陷阱,就算熟练者能流畅使用、也无法保证未来接手者保证理解,因此风格指南应对这些容易出错和出乎意料构件的使用进行限制。
- 必要的时候服从实际情况:在制订风格指南时,需要重视性能和互操作性,有时候即使意味着一致性或可读性的牺牲,但以此为代价去适应性能优化也是有意义的。另外互操作性也很重要,可以适当针对目标进行定制设计,以保证适应性。
风格指南包含的内容
语言风格指南需要遵循下面三类风格准则:
- 避免危险的规则:风格指南应该包括一些关于语言特性的规则,这些规则要么必须执行、要么由于技术原因不能执行,比如需要讨论应该使用哪些语言特性、避免哪些构件、列举标准词汇表类型、包括难以使用的语言特性的规则等等;对于指南中的每一项规则,都要包含做出这项规则决策时对于它利弊的考虑,这些决定大多基于对时间韧性的需要,以及起着支持和鼓励可维护语言使用的目的。
- 执行最佳实践的规则:风格指南也应该包括一些强制要求实行的编码最佳实践的规则,以保持代码库的健康和可维护性,比如设置一个一致的格式化规则集,以提高所有代码的可读性、包括对新的和尚未被理解的语言特性的限制等等。
- 确保一致性的规则:风格指南也应该包含很多小东西的规则,对这些内容做出决定并记录在案,它们大多不会造成太多重大技术影响,但是确定这些规则可以让工程师们选择一种形式,停止无休止辩论而朝着一个方向继续前进。
修改规则
风格指南不应该是静态的,而应该随着情况变化而变化,通过重新评审和阅读往期针对某个具体决策背后推理的记录以参照变更需求、进而根据足够的证据支持保持规则集的相关性和最新性。
另外风格指南的更新应遵循一定的流程:首先确定一个已存在的问题,然后提出修改它的方法;在该过程中,问题不是基于假设性的错误例子,而是由在现有代码中找到的模式证明的——即给定一个已证明的问题,根据现有风格指南决策背后的详细推理,进行重新评估,以检测修改的建议是否更有意义。
不过有时会出现一些特定情况,这时需要咨询风格仲裁者,以确定是否存在特定特定规则豁免的有效案例。在某些情况下,允许打破规则的例外存在比死守规则更有益。
风格仲裁者
针对其负责的对应语言的风格指南,风格仲裁者负责做出最终的决定和批准。任何风格指南变更的实际决策,都是对提议修改意见的工程性权衡的讨论,而非个人喜好。另外,风格指南的确定和修正不一定需要投票制以满足少数服从多数,而是可以通过协商一致作出。
指南
风格指南和规则包含两个部分,一个是用于进行约束的规则,另一个是用于学习的指南。后者能提供具有智慧的工程经验,并有着许多最佳实践的相关经验,它们包含从针对最佳实践给予的简短且有针对性的建议到对复杂主题长时间深入探讨的大量内容。指南的意义在于,它们能为软件工程师提供规范使用编程语言的知识,而不只是会用编程语言。
这些指南包罗万象,它们包括:
- 对于通常很难正确处理的领域,提供特定的语言建议。
- 提供语言新特性的详细分类,以及如何在代码库中使用这些新特性。
- 库提供的关键抽象和数据结构的列表,以防止重复造轮子。
应用规则
规则被强制执行时,就会产生更大的价值。在这个过程中,使用自动化工具往往占有较大优势,因为使用该方法确保了规则不会随着时间推移或组织规模扩大而丢失或遗忘,同时利于将规则解释和应用的差异最小化,并提供了一定的伸缩性、以优化成本投入,不过也要注意自动化工具不能完成所有事、因此还是需要一定的人工判断。这些工具包括静态的错误检查工具,和动态的代码格式化工具,它们在规则的应用上起着重要作用。