软件构造的多维度视图:
首先是对软件的不同阶段进行划分:
构造阶段:
代码层面:更加注重代码的逻辑组织(函数,类,方法,接口)
组件层面:更加注重代码的物理组织(文件,目录,包,库)
时刻角度:特定时刻的软件形态
长期角度:软件形态随时间的变化
- 某一时刻的代码层面:代码是怎么相互关联的(词汇,语法,语义)
词汇:半结构化:近乎自然语言的风格+遵循特定的编程语法
语法:AST(Abstract Syntax Tree)
语义:联系源代码与现实世界:图形化
- 长期的代码角度:代码变化(Code churn)
- 某一时刻的组件层面:目录组织文件,文件存放在包中,重复使用的组件形成库
静态链接:构建阶段时,库被拷贝进入代码,执行时不需要库文件
- 长期的组件层面:版本控制系统(VCS)
V 1.6(major).1(minor).5(patch)
运行阶段:
代码层面:逻辑实体在内存中如何呈现
组件层面:物理实体在物理硬件环境中如何呈现
时间同上
动态链接:build阶段库文件做出标记。程序运行时,根据标记装载库到内存;发布软件,将所有动态库复制给客户
- 某一时刻的代码层面:代码快照图(描述程序运行时内存中变量层面的状态)
Memory dump(内存信息转储)
- 长期的代码角度:执行跟踪(用日志的方式记录程序执行的调用次序)
- 某一时刻的组件层面:UML部署图(Deployment diagram)
静态链接:构建阶段时,库被拷贝进入代码,执行时不需要库文件
- 长期的组件层面:事件日志(系统层面)
软件构造的阶段划分、各阶段的构造活动:
SDLC(Software Development Lifecycle)从无到有
Planning(计划)
->analysis(分析)
->design(设计)
->implementation(执行)
->testing&integration(测试&结合)
->maintenance(维护)
版本:从有到好
编码(编程语言,建模语言,配置语言,构建语言)->重构(不改变功能的前提下优化代码)->调试->测试->性能分析->代码评审(利用工具进行静态代码分析)->构建
内部 / 外部的质量指标:
外部质量因素(影响用户):
正确性(按照规约执行):测试与调试,防御式编程,形式化方法;
健壮性(针对异常情况的处理);
可扩展性(应对变化):简约主义,分离主义;
可复用性;一次开发,多次使用
兼容性(针对不同的软件系统):设计的同构性,标准化;
高效性(性能);
可移植性(针对不同技术环境,包括软件(操作系统), 硬件);
易用性;
功能性(容易出现矛盾,程序复杂不灵活占用空间);
及时性;
可验证性,完整性,可修复性,经济性 so on
内部质量因素(影响软件和开发者):
LOC(Lines of Code):代码行数;
循环复杂度;
连接性,凝聚性;
可读性,可理解性;
清楚与否;
规模 so on
外部质量取决于内部质量。
软件配置管理 SCM(Software Configuration Management)
与版本控制系统 VCS(Version Control System):
SCM:追踪和控制软件变化
软件配置项( Software Configuration Item (SCI)):SCM中的基本单元,如文件。
仓库:SCM中的CMDB;
工作拷贝:开发者本地机器上的一份项目拷贝;
文件:独立的配置项;
版本:某个特定时间点的所有文件的共同状态;
变化:两个版本之间的差异;
Head:程序员工作的版本;
VCS:
本地版本控制系统:库存储于开发者本地机器;无法共享和协作。
集中式版本控制系统:仓库存储于独立的服务器;支持多开发者之间的协作
分布式版本控制系统:仓库存储于独立的服务器+每个开发者的本地机器