1软件构造的多维度视图和质量目标
多维软件视图
By phases: build- and run-time views
按阶段划分:构造时/运行时视图
By dynamics: moment and period views
按动态性划分:时刻/阶段视图
By levels: code and component views
按构造对象的层次划分:代码/构件视图
将库集成到可执行程序中 1.静态链接 发生在Build Time,库被拷贝进入代码形成整体,执行的时候无需提供库文件 不依赖 缺点:难以升级 2.动态链接 库不会加入可执行文件,只做标记 运行时根据标记装载库至内存 发布软件时,记得将程序所有依赖的动态库都复制给用户 优点:易于升级
Event logging:系统管理员使用,高层次信息(如安装程序失败),有一定输出格式,不必敏捷
Execution tracing:开发者使用,低层次信息(如抛出异常),较低格式限制,必须敏捷
软件构造的阶段划分,各阶段的活动
1.
Software development lifecycle SDLC 软件开发生命周期
1.
0->1 从无到有
计划-需求-设计-构造(实现)-测试-部署-运维
2.
1->n 从有到好
版本更新
2.
传统软件开发模型
基本类型:Linear 线性过程;Iterative 迭代过程
Waterfall (Linear,
non-iterative) 瀑布过程
瀑布过程: • 线性推进 • 阶段划分清楚 • 整体推进 • 无迭代 • 管理简单 • 无法适应需求 增加/变化
Incremental
(non-iterative) 增量过程
增量过程: • 线性推进 • 增量式(多个瀑布的串行) • 无迭代 • 比较容易适应需求的增加
V-Model (for
verification and validation) V字模型
Prototyping
(iterative) 原型过程
迭代:开发出来之后由用户试用/评审,发现问题反馈给 开发者,开发者修改原有的实现,继续交给用户评审。
循环往复这个过程,直到用户满意为止。 时间代价高,但开发质量也高。
Spiral (iterative)
螺旋模型
非常复杂的过程: • 多轮迭代基本遵循瀑 布模式 • 每轮迭代有明确的目 标,遵循“原型”过 程,进行严格的风险 分析,方可进入下一 轮迭代
敏捷开发:通过快速迭代和小规模 的持续改进,以快速适应变化。
内部/外部质量指标
外部质量因素影响用户,内部质量因素影响软件本身和它的开发者,外部质量取决于内部质量。
External
quality factors 外部质量 (最重要的有4个:正确性(最重要)、健壮性、可拓展性、可复用性)
1.
Correctness 正确性:按照spec执行,得到正确的结果,软件的行为要严格符合规约中定义的行为
保证正确性:
测试和调适:发现不正确、消除不正确
防御式编程:在写程序的时候就确保正确性
形式化方法(形式化语言) :通过形式化验证发现问题
2.
Robustness 健壮性:针对异常情况的处理:出现规约定义之外的情形,软件做出恰当的反应(出现异常时不要崩溃),未被spec覆盖的情况即为"异常情况"
3.
Extendibility 可扩展性:是否容易使软件适应规约的变化
提升可扩展性的两个原则:简约主义设计,分离主义设计
4.
Reusability 可复用性:一次开发,多次使用,发现共性
5.
Compatibility 兼容性:不同软件系统之间相互可容易的集成
保持设计的同构性:标准化文件格式,标准化数据结构,标准化用户接口
6.
Efficient 性能
性能毫无意义,除非有足够的正确性
对性能的关注 要与其他质量属性进行折中
过度的优化导致软件不再适应变化和复用
7.
Portability 可移植性:软件可方便的在不同的技术环境之间移植:硬件、操作系统
8.
Ease of use 易用性:易学、安装、操作、监控
给用户提供详细的指南,结构简单
9.
Functionality 功能
10.
Timeliness 及时性:及时发布等
11.
其他质量:verifiability 可验证性、integrity完整性,repairability可修复性,economy经济型
2.
Internal quality factors 内部质量
正确的软件开发过程中,开发者应该将不同质量因素之间如何做出折中的设 计决策和标准明确的写下来,虽然需要折中,但“正确性”绝不能与其他质量因素折中。
代码相关:lines of
code(LOC)、cyclomatic complexity 循环复杂性
结构相关:coupling耦合度(多个模块间联系),cohesion聚合度(一个模块;高内聚,一个程序只执行一种功能) (应当 高内聚低耦合,单一责任原则)
1.
Readability 可读性
2.
Understandability 可理解性
3.
Clearness
4.
Size
3.
最重要的几个质量因素
Correctness
and robustness: reliability(可靠性)
Extendibility
and reusability: modularity(模块化)
4.
软件构造的五个关键质量目标
1.
Easy to understand: elegant and
beautiful code / understandability 便于理解
Understandability:注释、命名、日志等
2.
Cheap for develop: design for/with
reuse: reusability 发展
Reusability:ADT、OOP、设计模式等以及复用外部文件
3.
Ready for change: maintainability
and adaptability 变化
Maintainability and Adaptability
4.
Safe from bugs: robustness 安全
Robustness 异常处理、断言、防御式变成、测试优先原则、日志追踪、debug、内存导出
5.
Efficient to run: performance 高效
Performance 代码调优、空间复杂性(内存管理)、时间复杂性(I/O性能等),分布式系统,多线程
软件配置管理SCM与版本控制系统VCS
5.
VCS version control system
1.
Local VCS 本地:仓库在开发者本地机器
2.
Centralized VCS 集中式:集中式版本控制系统:仓库存储于独立的服务器, 支持多开发者之间的协作
3.
Distributed VCS 分布式:分布式版本控制系 统:仓库存储于独 立的服务器+每个开 发者的本地机器
6.
SCM 软件配置管理:追踪和控制软件的变化
核心:版本控制和基线的确立
1.
SCI 软件配置项:软件变化的基本单元(如一个文件)
2.
Baseline 基线:软件持续变化过程中的"稳定时刻"(如 对外发布的版本)
3.
CMDB 配置管理数据库:存储软件的各配置项随时间发生变化的信息+基线
4.
Versioning 版本控制
版本:为软件的任一特定时刻(Moment)的形态指 派一个唯一的编号,作为“身份标识”
在多个开发者之间共享和协作
记录每个开发者的动作,便于“审计”
Git的结构、工作原理、基本指令
7.
结构
每个文件都属于以下三种状态之一:
已修改,已暂存,已提交
1.
Working directory 工作目录:本地文件系统 (已修改,未暂存)
2.
Staging area 暂存区:隔离工作目录和git仓库 (已暂存)
3.
.git directory 本地仓库(本地CMDB) (已提交)
8.
Object Graph
Git的所有操作都是在一个图数据 结构(对象图)上进行
.从另一台机器/服务器复制git项目意味着复制 整个对象图
9.
指令
git branch
branchname创建新分支
git checkout
branchname切换到分支
git checkout
-b branchname 创建新分支并切换到新分支
git merge
branchname 合并当前分支与目标分支
pull=fetch +
merge
fetch 从远程仓库获取最新版本到本地,不会自动merge
fork 复制别人的仓库到自己的仓库(自己不是contributor,不能提交修改给别人)
clone 复制仓库到自己的本地仓库