关于软件设计的文章,通过一个故事来探讨了软件设计中的一些核心理念,特别是关于知识构建和软件维护的问题。以下是文章的主要内容概述:
背景
ORG公司依赖于一个集成服务SaaS来解耦其业务逻辑和供应商软件。
ORG公司从无限预算模式转变为需要在明年实现收支平衡的模式。
分析师注意到ORG在SaaS上的花费异常高。
一位高管认为,既然公司已经在软件工程师上投入了大量资金,他们应该能够用内部开发的系统SVC来替代SaaS。
工程师X10被指派去构建SVC,并且按时完成了任务。
SVC投入使用后,工程师X10离开了ORG公司,工程队TEAM接管了SVC。
随着需求变化和未知问题的暴露,TEAM在交付上表现糟糕,无法有效地进行更改。
TEAM被重组为TEAM++,但问题依旧。
分析
David Parnas的《Software Aging》论文警告说不应该让没有参与设计的开发者去修改软件,因为这会导致软件结构退化。
Peter Naur在《Programming as Theory Building》中提出,编程应该被视为一种理论构建活动,程序员需要对程序有一个理论模型。
Naur定义了软件设计为一种智力活动,包括构建和拥有理论,理论是一个人必须拥有的知识,以便不仅智能地执行某些事情,而且能够解释它们、回答有关它们的问题、争论它们等。
原因
- TEAM无法接管SVC,因为工程师X10离开时带走了开发背景(上下文)和心智模型,系统随之退化。
- Naur认为,程序的死亡发生在拥有其理论的程序员团队解散时。一个死亡的程序可能继续在计算机上执行并产生有用的结果,但当对程序的修改需求无法得到智能回答时,死亡状态变得明显。
- 我们应该以一种方式进行软件开发,以便未来的维护者能够从昏迷中唤醒项目。
因此,下次您选择一个名称,或构建一个项目,或思考是否要写或省略某条评论时,不要从未来维护者的负担的角度来思考,而是想想:这个决定会对他们建立系统、业务和世界的心理模型有多大影响——有多大帮助或阻碍。
软件开发不仅仅是编写代码,而是构建和维护一个关于系统、业务和世界的知识体系。这对于未来的维护者来说至关重要,因为他们需要构建对系统的心智模型。因此我们在命名、项目结构、注释等方面考虑这些因素,以帮助未来的维护者更好地理解系统。
重写:
- 开发人员可能倾向于重写代码,因为新的代码可以从头开始设计,没有历史包袱,看起来更“干净”。
- 然而,重写代码是一个高风险的决策,因为它需要大量的时间和资源,而且成功率并不总是有保证。
- 有时候,开发人员可能高估了原始代码的复杂性,而低估了重写过程中可能引入的新复杂性。
- 原始代码可能包含了许多未文档化的业务逻辑和领域知识,这些在重写过程中可能会丢失。
重构:
- 维护和改进现有系统确实可能比从头开始编写新代码更具挑战性,因为它需要深入理解现有代码和业务逻辑。
- 但是,如果维护得当,现有系统可以通过渐进式的改进来适应新的需求,而不必完全重写。
重写好于重构:
- 重写能重新培训新团队的知识构建,本文提出新团队接手一个遗留项目失败,关键是新团队不了解老团队的知识模型,那么就让新团队把这个遗留项目作为学习训练项目,同时引入更大的业务知识背景,因为新情况出现了。
- 重写虽然会引入新风险因素,但是修改一个bug还会引入更多bug,不能畏惧不前行,世界上不存在没有bug的软件
- 新复杂性引入也是不用畏惧的,编写软件本身就是与复杂性斗争的过程。