未雨绸缪(Plan to Throw One Away)

不变只是愿望,变化才是永恒

试验性工厂和增大规模

开发使用的环境由于规模、量级的限制,导致第一版开发的软件在真实环境运行时易出现各种问题,需要在测试中不断增大规模、模拟真实环境

把第一版开发的产品发布给顾客,可以获得时间,但是对于用户,使用极度痛苦;对于重新开发的人员,分散了精力;对于产品,影响了声誉,即使最好的再设计也难以挽回名声

唯一不变的就是变化本身

新的系统概念或新技术会不断出现,所以老版的系统必须被抛弃,但即使是最优秀的项目经理,也不能在最开始解决这些问题

  • 开发人员交付的是用户满意程度,而不仅仅是实际的产品
  • 用户的实际需要和用户感觉会随着程序使用而变化

目标上的变化不可避免,而且设计策略和技术上的变化也不可避免,随着学习的过程更改设计

前进两步,后退一步

对于一个广泛使用的程序,其维护总成本通常是开发成本的 40%或更多,该成本受用户数目的严重影响。用户越多,所发现的错误也越多

Resize icon

  • 缺陷修复总会以(20-50)%的机率引入新的bug

原因:

  1. 看似很轻微的错误,实际却是系统级别的问题,如果没有非常详细的文档,是很难被发现
  2. 维护人员常常不是编写代码的开发人员,而是一些初级程序员或者新手

成本: 在每次修复之后,必须重新运行先前所有的测试用例,从而确保系统不会以更隐蔽的方式被破坏

设计实现的人员越少、接口越少,产生的错误也就越少 微服务

前进一步,后退一步

  • 维护越多系统越混乱,所有修改都倾向于破坏系统的架构,增加了系统的混乱程度
  • 用在修复原有设计上瑕疵的工作量越来越少,而早期维护造成的漏洞所引起修复工作越来越多

系统软件开发是减少混乱度(减少熵)的过程,所以它本身是处于亚稳态的。软件维护是提高混乱度(增加熵)的过程,即使是最熟练的软件维护工作,也只是放缓了系统退化到非稳态的进程

机器在变化,配置在变化,用户的需求在变化,所以现实系统不可能永远可用。基于原有系统的重新设计是完全必要的