第1章: 欢迎进入软件构建的世界
简而言之, 构建就是跟编码有关的事情, 包括编码与调试, 测试的全部和需求分析, 设计, 架构的部分.
第2章: 用隐喻来更充分地理解软件开发
文中的隐喻一词意指建模(model), 比如地心说模型和日心说模型. 好的模型可以更生动第说明一件事情的基本要素, 更能指引人们去发现新的特性.
历史上对软件构建提出的模型如下:
- 写信: Writing:
- 编程就像写信, 拿笔重头到尾写完投递.
- 没有体现规划: 想到什么就写什么
- 没有体现团队合作: 写信是个人行为
- 没有体现维护: 信写完不会改
- 种植: Growing
- 编程像种庄稼, 每次完成一个步骤: 设计, 编码, 测试对应播种,施肥, 收获
- 没能体现软件开发的复杂性, 例如开发/测试很可能交替进行
- 没能体现设计的重要性
- 种庄稼靠天吃饭, 人的作用远远小于软件开发中的
- 积累: Accretion
- 编程就像培养牡蛎: 养好牡蛎(架构), 然后牡蛎不断添加微量的碳酸钙, 最后形成珍珠. 意指软件开发是一个不断积累的过程
- 为敏捷开发理论奠定了基础
- 我认为没能体现架构设计的复杂性
- 建造: Building
- 编程就像建造一个工程(房子, 大楼 或 核电站), 先要做精心的设计, 再实施建造
- 这是到目前为止最科学的建模
- 两者在规划设计, 团队合作等都有共同特点
- 都会利用现成的组件: 洗衣机, 冰箱 vs 数据库, 高级语言
- 规模大的时候都需要定制一些组件
- 设计很重要, 但并不是要事无巨细: 设计房屋时并不需要考虑以后刷什么颜色的漆
- 后期修改都成本巨大, 人力和时间成本往往比材料本身要高
- 开发流程随工程规模会显著变化: 建一个狗棚和建一个核电站的流程完全不同
- 其他
- 不同的模型往往并不排斥, 旧的模型并不是完全没用: 就像物理学中爱因斯坦的相对论比经典牛顿力学更科学, 但大部分工程问题还是通过牛顿力学求解的. 同样, 在软件开发中, 比如基于牡蛎养殖(Accretion)模型的敏捷开发方法也在大规模应用.
第3章: 三思而后行: 前期准备
原则性问题:
- 修复缺陷的时间越接近引入缺陷的时间(越早), 修复成本越低, 所以前期工作(需求和架构)很重要
- 前期工作的详尽程度应该取决于项目的规模和特点
- 很难有不变的需求, 但可以尽量控制
需求:
- 功能性需求:
- 应该包括输入输出, 精度, 取值范围, 频率, 格式等
- 包括对外接口和通信协议
- 应该指定数据
- 质量需求:
- 响应时间, 吞吐量, 传输率等
- 安全级别
- 可靠性, 错误处理
- 内存/磁盘等资源的限制
- 如何定义项目的成功和失败?
- 需求的质量:
- 用用户的语言书写, 而不是计算机名词. 只提需求, 不涉及设计
- 互不冲突
- 足够清晰, 毫无背景的团队也能理解
- 可测试
- 对可能的改动有所预期
架构:
- 尽量包含其他可选方案, 以及选择的理由
- 主要的类
- 数据设计
- 界面
- 资源管理
- 如连接, 线程, 句柄等
- 性能:
- 提供调研数据, 说明为什么可以达到预期的性能
- 关键部分的算法和数据结构
- 可扩展性
- 当数据/请求增长时的处理方案
- 技术可行性
- 错误处理和容错
第4章: 关键的构建决策
这章很虚, 基本没啥内容