第一章:系统
1. 问题类型:
①Emergent properties突生属性——Surprises
问题在系统单个组件中不会显现,但在多个属性组合在一起就暴露出来
②Propagation of effects传播效应——Small change -> big effect
很小的变化,会引起一系列的更改,造成很大开销。设计系统的要求:将错误的影响降到最低。
③Incommensurate scaling扩展不相称——Design for small model may not scale
系统的各个组成部分不一定遵守相同的缩放规则。系统不同部分的变化速度是不同的。通常是限制速度和性能的根源。
④Trade-offs权衡——Waterbed effect(将一个问题解决,另一个问题就会因此而产生)
权衡的一般模式:某种收益在整体上是有限的,设计的挑战在于首先考虑如何最大化收益,其次考虑如何避免浪费,最后考虑如何将其置于最有用的位置。
2. 系统、组件、接口、环境
①系统与环境进行交互,交互通过系统和环境之间的接口。
②人们通过研究系统各组件的行为以及组件之间的互联来预测系统的整体行为。
③组件的确定取决于研究者的两方面的观点:目的和粒度。不同粒度意味着一个上下文中的组件在另一个上下文中看起来是一个完整的系统。
④系统分析之前要明确分析系统的角度,包括如何划分组件、组件划分的粒度、系统边界,以及系统与外部环境的接口。
3. 系统的复杂性标志:
①组件的数量大
②连接的数量大
③不规则性
④没有简短的描述,而是很长的描述或文档,
⑤需要许多人设计/维护
需要采用抽象的方式避免过度深究
4. 复杂性来源:
4.1 相互影响的需求
①需求过多是系统复杂性来源之一。需求的不断增加不只是将每个需求的复杂性累加起来,各需求之间的相互影响也会引入复杂性。
②复杂性的重要性取决于观察者。
③需求增加,系统的例外随之增加,系统的复杂性也越来越大。
④在一个设计中满足不同的需求通常用“通用性”表示(即适用于不同场景),通用性增加会增加复杂性。例外与通用性是相关的,需要权衡系统的通用性和复杂性。→
设计原则:避免过度通用(适用于任何情形的设计对任何情形都不适用)
⑤如果要扩大系统规模或者升级基础硬件,扩展不相称就成了主要问题。消除扩展不相称性也会带来复杂性。
⑥需求变化也会带来复杂性,长期运行的系统随系统所处的环境的改变会改变需求。如果针对环境改变进行局部修改,很有可能会导致错误修改带来的问题比没有修改前带来的问题要多。
4.2 保证高利用率→保证系统的性能和效率。
①复杂性随着稀缺资源的利用率上升而上升。→
设计原则:收益递减律(某种好处获得的越多,下次获得这种好处所需付出的努力就越大。)
5. 处理复杂性Ⅰ→模块化、抽象化、层次化、分级化、用名字互联
①模块化:模块化的特点在于可以很容易的用好模块替换坏模块,系统能够以增量的方式不断改进而不必完全重建。模块化还可以控制修改引入的复杂性,这个特点不仅对调试有益,而且也有利于系统的渐进式改进和发展。
模块是限制故障的基本单位,是减小复杂性的最小最重要的工具,失效是指模块不能满足抽象接口的规范。不用考虑其他模块内部的组件
Divide-and-conquer 技术:分析和设计阶段将系统分解为一组相互交互的子系统,即模块
与模块化相关的设计原则:
- 不变的基础:修改模块比修改模块化更容易。→修改接口vs修改单一模块。
②抽象化:抽象化是划分一个模块的原则:最好的模块划分方法依据系统自身的边界进行抽象化,这样划分的特点是模块之间交互很少(目的就是减少互联),模块之间的传播效应也小。抽象化将接口和内部实现分离,将规范和实现分离。
保证模块之间互联最少的目标会被各种原因破坏:实现错误意外产生的互联;为了性能指标或者满足其他需求而设计的穿越模块边界的特殊互联等。
与抽象化相关的设计原则:
- 鲁棒性原则:宽于输入,严于输出。(可以消除在模块接口处产生的错误,防止错误的传播和放大)
- 安全边界原则:远离悬崖,防坠落。即使鲁棒性原则可以正确处理,跟踪汇报公差之外的输入也是重要的。两种模式:震荡模式(模块严格检查输入,拒绝任何不符合规定的数据,可以尽早发现问题)和生产模式(可以接受任何可以解析的数据)。→二者融合:接受合理的输入并汇报公差边界上的输入,以便在系统完全不可用之前修正错误。
③层次化(layering):目标:再次减小模块间的互联。
新的完整的功能集(上层)基于另一完整的功能集(低层)实现。每一层可以包含多个模块。模块只与同一层的对等模块或者相邻层次的模块交互。这种限制可以显著地控制大规模系统中模块间潜在的互联。
④分级化(hierarchy):从一小组模块开始,将他们组合成一个稳定的、自包含的、接口定义明确的子系统,然后将一组子系统组合成更大的子系统。→分级化的方法限制了模块间的交互只能发生在子系统内。分级化可以控制除接口组件外,每个模块只于其所在的子系统内的其他模块交互,接口组件还需要与上层子系统中的成员交互。分级化的好处在于模块设计师只需要关注它与紧邻子系统元素接口的交互。
分级化可将控制互联数与模块数的关系从2次方,降到1次方。n(n-1)→ (n/10) * (9*10) + n/100 *10
⑤用名字互联:名字支持延迟决策、模块替换和模块共享。连接在总线上的硬件模块也使用名字互联—地址。
延迟绑定的方法之一就是为功能命名而不是提供实现。在设计模块时采用名字进行互联可以认为其他模块已经存在,即使这项功能并没有实现,这从机制上保证了以后可以采用其他实现,直到功能真正被调用的时候,名字必须与具体实现绑定。利用名字完成绑定的延迟和更改称为“间接”,一旦模块有了名字,其他模块就可以用名字调用它,从而实现设计、成本和模块之间内部信息的共享。
相关的设计原则为:“利用间接将模块去耦合。”
6. 计算机系统与其他系统的区别:①计算机系统的复杂性是不受物理定律的限制的。②计算机系统的发展速度快。
数字系统和软件控制这两个属性使计算机摆脱了物理定律对复杂性的限制。
模拟系统 vs 数字系统
模拟系统:噪声可能来自(环境、组件的物理行为并不完全遵守可处理的行为模型);组合模拟组件(噪声来自单个组件的累加噪声,噪声的累加可能是缓慢的,但仍是存在的);随着组件的数量增加,噪声可能会控制系统的行为,噪音限制了组合系统的模拟组件的数量和级联的级数。
数字系统:
数字系统没有噪音 ,复杂性的变化不受噪音的影响。静态约束:设备可以接受的输入范围比其输出的模拟值的范围要宽。抽象化通过隐藏模块接口之下的具体实现可以控制软件的组合。电平复位:使用非线性模拟组件,组件在输入和输出之间存在增益。信号在串联的设备间传递时不会积累噪声,噪声不会限制串联的设备的数量,也不会限制数字系统组合的最大深度。
7. 迭代法:迭代法的本质就是首先构建一个实现部分功能的、简单的、可工作的系统,然后不断改进,逐渐实现所有功能。不断改进的策略可以降低复杂性。迭代需要考虑以下方面:
①遵循的原则:面向迭代的设计:设计不可能一次成功,务必使其易于修改。要记录设计所以来的前提条件,保证在需要修改设计的时候清楚地知道还有哪些部分也需要修改。
②迅速发现错误的设计和方案,可以通过较小的代价修改或清除。否则一旦其他模块对这些错误产生依赖,后续修改就困难了。
③认真规划,保证下一阶段的设计就绪再开始实现。
④便于反馈,在设计中涵盖反馈支持和鼓励提供反馈的机制。
⑤研究失效,激励反馈的机制必须保证关于失效的反馈不会因为责任人怕