软件开发是一种独特的人类活动,但与其他活动,如:数学、写作和工程等相似。我认为编写软件是一个建模过程,但是,与在空间中建模物理事物不同,我们建模的是在时间中发生的过程。因此,编写软件是一个创建模型的过程,这些模型是准确的和可理解的。
事实证明,我们可以通过多种方式在软件中建模过程。我们可以将过程建模为一组指令或过程。我们可以通过交互对象的集合对它们进行建模。我们甚至可以将流程建模为一系列转换过程。而不同的过程需要不同类型的描述。
我们构建软件的方式千差万别,因为我们解决了各种各样的问题。这就是为什么我们有不同的编程语言、框架和平台。没有什么是放之四海而皆准的。
几乎每个行业都在使用软件来解决各种各样的问题,所以软件行业本身就有很多方面的问题也就不足为奇了。我们专门研究语言和框架,以及不同的技术,但除此之外,我们还必须有一些共同的主线将我们联系在一起——对软件开发本身的共同理解。我觉得这在我们的行业中太常见了。看起来,我们的目标通常只是做一些有用的事情,然后在不太考虑其可支持性的情况下发布它。最终的结果是,我们在走捷径,而我们正在编写的代码并不像它所能达到的那样。这增加了维护软件的成本,使其难以扩展。
面向对象编程的一个主要好处是,它允许我们构建封装的、模块化的组件,这些组件是可独立测试和可升级的。然而,我很少看到开发人员使用面向对象的语言来构建具有这些优势的软件。它们不是根据需要注入依赖项,而是内联地实例化依赖项,结果是它们不能独立地进行测试。
在面向对象的系统中,行为应该封装在对象中,以限制副作用并允许创建更模块化的系统。
代码应该具有表现力,就像好的文学作品一样。代码应该清楚明了地表达它的功能和功能。软件应该以领域语言表示,并封装在对象中,以便它们更易于维护。
通过传播知识的系统交互对象的集合,我们尽量减少变化的影响,当变化真正发生时,因为改变通常只影响直接参与改变系统的对象,其余部分将封装和屏蔽的变化。这很好,因为它使向现有软件添加新特性的影响变得最小化。
软件生命周期很重要。我们在发布前只花了20%的预算,在软件最初发布后只花了80%的预算。其中不到三分之一是维护。剩下的就是修复缺陷并提供增强功能。在我们的行业中,我们基本上是在构建不可维护的软件,这是常态。
可更改的软件创建起来并没有那么难。将概念放入它们自己封装的实体中确实需要更多的类型,但是它也简化了测试。理想情况下,我们希望通过应用一系列我们可以独立测试和验证的简单行为来产生复杂的行为。