- Sortware Consttruction
- problem definition
- requirements development(需求分析)
- construction planing (规划构建)
- software architecture(软件架构)
- detailed design
- coding and debugging
- unit testing
- integration testing
- integration(集成)
- system testing
- corrective maintenance (保障维护)
P.s. 灰色表示构建活动
软件构件的主要活动包括:详细设计,编码(构建),调试,集成,开发者(集成测试和单元测试)
The Importance of Metaphors
人类世界就是通过隐喻构成的,一切都是以人的视角来定义世界。而这就是隐喻
当然,上面说的有些极端,通过比喻将抽象知识具体化,或者说是对概念进行内在化(intemalizing)和抽象(abstracting),然后在更高层面思考问题。
用 accretion(冲积层)来形容软件开发过程,增量的(incremental),迭代的(iterative),自适应(adaptive),演进的(evolutionary)
隐喻是描述抽象事物及问题的很好的方式,就好比用建造房子来比喻项目的构建,可以很容易理解一个项目的构建过程。
- 构思房子的类型 problem definition
- 设计房子 architectural design(软件架构设计)
- 建造房子 construction(构建)
- 内部装饰 oprimization(优化)
- 检查 reviews(评审) or inspections (审查)
- 随着时间推移,问题修改需要的成本也将呈倍数增加
- 仔细的准备是必要的(长远看,减少后期重构的机会)
- 最常见的项目风险是糟糕的需求分析和项目计划
- 准确的定义问题
- 明确的需求,充分详尽的描述需求
- 需求带来的成本最好可以带来更多的商业价值
前期准备
需求
构建
好的设计
Typical Architectural Components (架构典型组件)
- Program Organization (程序组织)
- 定义程序主要构建块(building blocks)
- 块之间高内聚,低耦合
- Major Classes(主要的类)
- 定义主要类(继承体系,状态转换,对象持久化)
- Data Design
- BUsiness Rules
- User Interface Design
- Resource Management
- 注意稀缺资源不要浪费
- Security
- 输入不可信
- 缓存区
- 加密
- Performance
- 速度,内存之间的成本优先顺序
- 算法和数据结构
- 空间和时间的预算
- Scalability 可伸缩性
- 系统增长以应对未来需求的能力
- Interoperability 互用性
- 与其他软件或硬件共享资源如何完成
- Internationalization / Location
- Input/Output 输入/输出
- 读取策略
- I/O 错误检测
- Error Processing 错误处理
- Coding convention level 代码约束层次
- 错误纠正还是检测,主动还是被动,错误什么时候传播
- 什么时候抛出异常,如何记录,如何描述
- 验证数据有效性每个类需要负什么责任
- Fault Tolerance 容错性
- 重试
- 备用逻辑
- 表决算法
- 使用正常值抹平错误
- 部分运转/partial operation 功能退化/degraded functionary
- Architectural Feasibility 架构可行性
- 性能问题
- 过度健壮
- 各个类的健壮度应该相似
- ReuseDecisions 复用
- Change Strategy 变更策略
- 灵活,变更可预测 delay
- General Architectural Quality
- 保持概念完整性
- 架构应该描述所有主要决策的动机
Language
- 思考能力取决于你知道的表达该思想的词汇
- 如果你不知道这些词汇,就无法表达
Programming Conventions 编程约定
- 底层实现与架构保持一致
Architectural Design is a Wicked Problem
书中有人定义 Wicked question 是只有通过解决或部分解决才能明确的问题。 未知性(不确定性)是可怕的,无从下手(Sloopy Process)是令人情绪低落的。在解决一个问题后,还会遇到新的问题,这就是软件设计的问题。所以,设计总是带有启发式的色彩。
没有银弹,实质性问题和偶然性问题都是复杂的。
降低复杂度的方法就是拆分系统,使之简单化,保持只解决一个问题的状态
优秀的设计
图