软件构建
软件开发中的活动
- 定义问题
- 需求分析
- 规划构建
- 软件架构
- 详细设计
- 编码和调试
- 单元测试
- 集成测试
- 集成
- 系统测试
- 保障维护
构建活动主要关注编码调试,也包括详细设计,单元测试,集成测试,集成,规划构建。
具体任务
- 验证基础工作已经完成
- 确定如何测试代码
- 设计和编写类和子程序
- 创建并命名变量和常量
- 选择控制结构,组织语句块
- 测试,排错
- 代码审核
- 代码格式化和注释
- 将软件组件集成为一体
- 优化代码
构建活动是软件开发的主要组成部分,核心部分,是唯一确保会完成的工作。
用隐喻来更充分理解软件开发
通过类比把不理解的东西和较理解的东西进行比较,这种使用隐喻的方法叫做建模。
隐喻更像探照灯,告诉你该如何去寻找答案,更像启示,而不是算法。具有偶然性。
编程跟写作不一样,编程是多人的,鼓励复用的。
跟耕作不一样,过程是可控的,是增量式开发。
跟建造比较相同。需要计划,准备,执行。预先规划,调整需要成本,需要审核,使用现成的东西。
前期准备
前期准备可以明确方向,减少犯错的成本。
开始构建前,需要
定义问题
避免浪费时间在解决错误的问题。从使用者的角度描述问题。
确定需求
避免争论与设计上的修改。在需求错误在后续的阶段再发现的话,解决他会需要很大的成本。可以使用下面的方法来应对需求的变更。使用需求核对表来评估需求、确保每个人都知道需求变更的代价、建立需求变更程序、使用能适应变更的开发方法,如演进交互、放弃项目、注意项目的商业案例。
架构
程序组织。架构应该定义程序的主要构造块,明确各构造块的功能,令其负责某一个区域的事情,互相配合而不冲突。
主要的类。架构应该详细定义主要的类,指出各主要的类的责任以及如何与其他类交互。
数据设计。架构应该描述用到的主要文件和数据表的设计。
业务规则。架构应该详细描述业务规则,描述这些规则对系统设计的影响。
用户界面设计。应该在需求或者架构中说明。应该模块化。
资源管理。数据库连接,线程,句柄,内存
安全性。缓冲区的处理,非受信数据(用户输入数据、cookies、配置文件、其他外部输入的数据)的规则,加密,错误消息、保护内存中的秘密数据。
性能。详细定义性能目标
可伸缩性。系统增长以满足未来需求的能力。
互用性。与其他软件或硬件共享数据或资源时需要关心
国际化/本地化。交互系统中需要关心。
输入输出。
错误处理。 纠正还是检测?主动还是被动?如何传播错误?错误处理有什么约定?如何处理异常?在什么层次处理错误?每个类在输入有效性的责任?使用内建的机制还是自己建立一套?
容错性。检测错误、从错误中恢复。常见方法:回退、重试、辅助代码、系统进入功能退化状态、使用表决算法、使用虚假值、
可行性。能否达到性能目标、在有限资源下运转、运行环境是否有足够支持。
过度工程。架构的系统会比需求描述的系统更健壮。
关于买和造的决策。自己定制的组件在什么地方胜过现成的组件
复用的决策。如何对复用的软件进行加工,使其符合其他架构目标。
变更策略。让架构足够灵活,能够适应可能出现的变化。列出有可能增强的功能。
总体质量。优秀的架构规划书应该讨论了系统中的类、讨论了类背后的隐藏信息、讨论了采纳或排斥其他可能的替代方案的理由。应该清楚描述目标。应该描述主要决策的动机。与机器和编程语言无关。应该在对系统描述太少和过度描述之间。应该指出有风险的区域。应该包括多个视角。
核对表
核对表: 需求
a. 是否详细定义了系统的全部输入,包括来源、精度、取值范围、出现频率?
b. 是否详细定义了系统的全部输出
c. 是否详细定义了所有输出格式
d. 是否详细定义了全部外部通信接口
e. 是否列出了用户想要做的全部事情
f. 是否详细定义了每个任务所用的数据及得到的数据
g. 期望响应时间
h. 与计时相关的考虑,如处理时间,数据传输率,系统吞吐量
i. 安全级别
j. 可靠性
k. 机器内存与磁盘空间
i. 可维护性
m. 对成功和失败的定义
核对表:架构
a. 架构的整体组织结构是否清晰,是否有良好架构全局观。
b. 是否明确定义了主要的构造块
c. 是否涵盖了需求中列出的所有功能
d. 是否描述和论证了最关键的类、数据结构、数据设计、数据库的组织结构和内容。
e. 是否指出了关键业务规则及其对系统的影响
f. 是否描述了用户界面的策略、并将其模块化。
g. 是否论证了I/O策略
h. 是否估算了稀缺资源(线程、数据库连接、句柄、网络带宽)的使用量。
i. 是否描述了架构的安全需求。
j. 是否为每个类、子系统、功能域提出空间和时间预算。
k. 是否描述了如何达到可伸缩性
l. 是否关注互操作性
m. 国际化/本地化
n. 错误处理
o. 容错
p. 技术可行性
q. 技术可行性
r. 过度工程的方法
s. 买造策略、加工复用策略
t. 适应未来变更。
u. 是否解决全部需求
v. 有没有那个部分是过度架构或欠架构
w. 架构是否概念上协调
x. 独立于机器和语言
y. 说明了决策的动机
z. 你是否对这个架构感觉良好。
核对表:前期准备
a. 是否辨明了软件的类型
b. 是否充分明确定义了需求,且需求足够稳定,可以开始构建了。
c. 是否充分定义了架构
d. 是否指出项目的风险。
关键的构建决策
选择编程语言
使用熟悉的语言生产效率更高,使用高级语言生产率跟质量更高。
编程约定
变量名称、类的名称、格式约定、注释约定等等
你在技术浪潮中的位置
如果你在技术浪潮的后期,可以计划用大部分的时间稳定持续的写新功能,在前期,可能要花很大部分找出未说明的语言特性,调试错误,修订代码来适应厂商的新版本函数库。深入一种语言去编程。首先决定他要表达的思想是什么,然后决定如何使用特定语言提供的工具来表达思想。大部分重要的编程原则不依赖特定的语言,依赖于你使用语言的方式。
选择主要的构建实践方法
编码
1. 多少设计工作将要预先进行,多少在编码时进行
2. 有没有名称、注释、代码格式等编码约定
3. 有没有编码实践、如何处理错误、安全事项、类接口的约定、重用代码的标准、性能考虑等
4. 有没有找到自己在技术浪潮中的位置并调整。
团队工作
1. 有没有定义集成工序,程序员把代码check in 到主源码前需要的步骤
2. 结对编程还是独自编程还是其他
质量保证
1. 是否先写测试用例
2. 会写单元测试吗
3. check in前会用调试器跟踪代码流程吗
4. check in前会继承测试吗
5. 会检查别人的代码吗
工具
1. 使用哪种版本控制工具
2. 使用哪种语言、语言的版本或编译器版本
3. 编程框架
4. 是否使用非标准的语言特性
5. 编辑器、重构工具、调试器、测试框架、语法检查器。