人月后作《没有银弹——软件问题的根本原因和次要原因》中讲到了软件的如下本质
一个相互牵制关联的概念结构,是软件实体必不可少的部分,它包括:数据集合、数据条目之间的关系、算法、功能调用等等。这些要素本身是抽象的,体现在相同的概念构架中,可以存在不同的表现形式。尽管如此,它仍然是内容丰富和高度精确的。 我认为软件开发中困难的部分是规格化、设计和测试这些概念上的结构,而不是对概念进行表达和对实现逼真程度进行验证。当然,我们还是会犯一些语法错误,但是和绝大多数系统中的概念错误相比,它们是微不足道的。
……
现代软件系统中这些无法规避的内在特性:复杂度、一致性、可变性和不可见性
……
如果这是事实,那么软件开发总是非常困难的。天生就没有银弹
在一个彼此依赖的结构中,任意一个变化会导致关联对象的链式变化————想象一下多米诺骨牌或者原子弹一个中子最终导致的爆炸式的链式反应————并且我们悲观的认识到
1,事物之间彼此关联是不可避免的
2,变化也是不可避免的
那么,是否链式反应式的变化(复杂性)是不是不可避免的呢?
思考下面几个问题
1,最小概念结构:有没有可能简化问题概念和关系到一个不可再少的地步
2,变化隔离机制:有没有可能设计一种表达形式,变化的传递是在两两之间,或者是有限传递的
3,变化应对引擎:有没有可能设计一种引擎,能够解析所有变化,至少是一个变化的集合
如果这三个问题是无解的,那么复杂性必然是不可避免的。
如果这三个问题是有解的,那么复杂性是可以解决或者在界定条件下有限度的解决。
如果问题三有解,我们就可以将对变化的依赖转化为对不变的依赖,将变化导致的工作量膨胀转化为固定可控的工作量;
如果问题二有解,我们就可以在一定范围内控制变化的影响范围和工作上限。
如果问题一有解,我们就可能找到一个问题的最小化工作量。
第一个问题是有解的:就是DDD
第二个问题也是有解的:即模块化技术,比如:OO,接口,SOA……
第三个问题依然是有解的:就是引擎化技术
网友评论