工程学科坚定地立足于科学理性主义,并采用务实的、经验主义的方法来取得进步。
大多数用于软件开发的度量标准,要么是无关紧要的,要么是有害的,如代码行数或测试覆盖率。
马丁福勒认为生产力不可度量。妮科尔福斯格伦、耶斯亨布尔、吉恩金找到高效能团队的两个度量标准:稳定性和吞吐量。
高效能团队有共同的行为,如果我们观察一个团队的活动和行为,我们就可以预测他们在这两个度量标准上的得分。如果你的团队采用自动化测试、主干开发、自动化部署以及大约十个其他实践,那么加速的模型将预测你们在实施持续交付。如果你们实施持续交付,那么你们在软件交付能力和组织表现方面是高效能的。
稳定性分解为变更失败率和服务恢复时间。吞吐量分解为变更前置时间和部署频率。
速度和质量是相关的,提高速度的途径是构建高质量的软件,提高软件质量的途径是提高反馈的速度,而提高两者的途径是伟大的软件工程。
加速的度量为我们提供了一个有用的标尺。可以借助以上度量标准改善我们的过程、组织、文化、技术。拥有有意义的度量标准,我们能够评估行动,对于采用更加基于证据的决策方法是重要的。
我们的学科应专注两个核心能力。我们应该成为学习专家,专注于掌握探索、发现和学习的技能,这是科学推理式的实际应用。我们还需要专注于提高管理复杂性的技能,我们要成为管理复杂性的专家,不论是在技术还是组织层面。
成为学习专家,我们需要采用并精通实用的、有科学依据的方法来解决问题,这是工程学科的精髓。我么解决问题的方法必须适用我们的问题。解决软件问题的方法,需要是实用的、轻量级的和普遍的。
有五个相互关联的原则:
-迭代式工作。
-运用快速、高质量的反馈。
-增量式工作。
-实验性。
-经验主义。
学习是我们所做的一切事情的核心,这些原则是所有有效的软件开发方法的基础。瀑布式开发没有展示这些特性。
软件开发的失败,可以从两个信息科学概念并发和耦合的角度来思考。
如果想要构建比玩具编程习题更复杂的系统,需要认真对待这两个概念。我们既需要管理组织信息系统的复杂性,也需要管理软信息系统的复杂性。
对这两个概念关注太少,会产生以下结果:大泥球系统、失控的技术债、严重缺陷数、害怕对自己拥有的系统进行更改。这些都是团队对他们正在开发的系统的复杂性失去控制的表现。
如果你想构建复杂的东西,你必须将问题分解,以便你可以分别考虑它的各个部分,而不会被复杂性压倒。在哪里划线取决于很多变量:你需要解决的问题的性质、你使用的技术在某种程度上甚至是你有多聪明。如果你想要解决更难的问题,你必须划这些线。
管理复杂性也有五个原则:
-模块化。
-内聚力。
-关注点分离。
-信息隐藏和抽象。
-耦合。
促进我们学习和让我们能够处理我们创造的系统复杂性的思想,才是我们行业真正的工具。这些思想能帮我们更好地选择语言、使用工具和应用框架,以这样的方式帮助我们更有效地解决软件问题。
如果想要根据证据和数据做决策,而不是根据潮流或猜测做决策,那么拥有一个度量的标尺,让我们能够评估这些思想。我们需要思考,用稳定性度量标准来度量,是否会提高构建软件的质量,用吞吐量度量标准来度量,是否能提高构建高质量软件的效率。