一 内容概述
- 从抽象的工程设计论角度阐述了如何写好一份代码。阐述了设计模式和设计原则的底层原理。
- 解释了设计模式与设计原则适用的场景及局限性。工程设计论是在有限设计能力下对被设计对象进行的认知和进行逆运算的过程。在不符合这一条件的领域,不应当死扣设计模式与设计原则。在软件领域,一个显而易见的例子就是不要在极度追求性能的代码中死扣设计模式与设计原则。
- 解释了设计原则中的单一职责原则为何难以掌握和运用。
- 面向接口设计是软件系统设计的最终形态,对开发流程中先写单例再开发的原因做了解释。
二 理论基础
- 哲学基础:罗素《哲学问题》。
- 数学基础:矩阵理论,工程控制论。
- 工程基础:一定工程设计经验,如代码开发等。
- 设计科学基础:谢友柏老师的《设计科学与设计竞争力》,Nam Suh的《公理设计》。
三 什么是设计——设计和计算与认知之间的联系
一门科学的建立,应当首先明确本学科的局限性,确定本学科最基本的问题与框架。明确的基本框架应能够迅速得到一门学科的基础结论与研究方法;明确的基本问题可以用于检验上述的结论与方法。指出自然界中每一杯水中都有金元素并不能对金矿的发现起到什么促进作用。设计科学的现在的发展应该做减法而不是做加法。对于设计所具备的特征,有很多描述。这些描述最基本的共同点是设计是需要达到一定的目标的(即需求)。其他特征并不是设计最基本的特征。例如最优化设计中就没有需求变更,logo设计中就没有系统故障。
如果认同需求是设计的共同点,那么搞清楚需求是什么则是重要的。 大部分人都认为,在我们的实际工作中,需求是不明确的,不完整的。那我们不妨用辩证的思维来考虑这个问题的反面,什么是明确的,完整的需求?一份完整的需求,对于所有人而言都是清晰的,不会产生什么不一样的理解。那么对于什么样的产品能够满足相应的需求,也应该是清晰的。用集合论的话来说,一个集合被其外延所完全确定。换句话说,如果需求能够被一个确定的验收方式来定义,比如说单元测试,那么这份需求可以说是明确和完整的。
我们还需要更进一步地探讨什么是验收。以单元测试为例,我们用单元测试来输出一个True或是输出一个False;如果认为单元测试本身是一个函数,那验收就是要求被设计对象在该函数下的相必须为True。那么,如果我们的需求足够简单,会发生什么情况?比如说我们的需求是找到一个x,使其满足x+1=0,我们一般称这种问题为求解,或者是逆运算。可以看到,当我们对需求及其实现方式的认识完全清晰的时候,需求将退化成为一个函数,设计将退化