《软件构造》 第一章 软件构造的多维度视角和质量目标
本章小结:
1.1软件构造的多维度视角
描述软件构造的三个维度:
——阶段:build-time || run-time
——动态:moment || period
——级别: code || component
软件系统的构成要素:
——软件=程序(代码)?
——软件=算法+数据结构?
——软件=程序+数据+文档?
——软件=模块(组件)+数据/控制流?
软件构造的多维度视角:
》》Build-time(构造阶段)
构造阶段:想法->需求->设计->代码->可安装/可执行的包
Code-level(代码级别):源代码,主要是源代码各个模块的逻辑组织:函数,方法,类,接口
Component-level(组件级别):源代码的物理组织:文件,目录,包,库
Moment view(时刻):特定时刻软件的状态
Period view(时期):软件状态在一段时间的变化
1.Build-time,Moment,Code-level(代码组织结构)
——词汇层面:从每个用词考虑
——语法层面:抽象语法树(AST)
——语义层面:类图
2.Build-time,Period,Code-level(代码一段时期内的变化)
比如行数的增加,对文件的修改和删除
3.Build-time,Moment,Component-level(代码的物理结构)
源代码被存入文件之后被组织成目录;文件被封装在包里面,逻辑上进入组件和子系统;可重用的模块以库的形式存在,库有多种来源,操作系统、编程语言、第三方、你自己
——静态链接:发生在构造阶段,库直接被靠拷贝进入代码形成整体
——动态链接:在构造阶段仅仅做出标记,不加入可执行文件;程序运行时再进入内存;使得库可以更新版本;多个程序可以只复制一份库进入内存
4.Build-time,Period,Component-level(软件版本变化)
——SCI(软件配置项)
——VCS(版本控制系统):每次上传新的版本,每个子文件可能更新了或者没更新,最后版本选择的每个子文件都是该子文件最后一次更新的版本。
——软件进化:在最初版本后不断更新维护它,90%的成本花费都在这个阶段
》》Run-time(运行阶段)
程序运行时磁盘文件如何加载到内存
Code-level:可执行程序在内存中是什么状态
Component-level:包是怎么部署进入物理环境(操作系统OS,网络,硬件)
Moment,Period,同上
可执行程序(二进制文件):完全编译好的文件,是CPU的有序指令,加载到内存可以运行(库必须和可执行程序链接才能被执行)
配置和数据文件:不是可执行的文件,可以从磁盘加载,提供信息,比如为程序提供数据
分布式程序:包含多个可执行文件,通过网络或者在同一个机器上交流联系
原生机器码可以直接被操作系统接受;源代码需要先被编译;解释型字节码需要一个格外的解释器(JVM)使它转化成机器原生码
5.Run-time,Moment,Code-level(快照图)
——描述程序运行时内存里面变量层面的状态
——内存信息转储:硬盘上的一个文件,包含进程运行信息:比如寄存器,栈,计数器信息
6.Run-time,Period,Code-level
程序单元之间的交互:类,接口之间
执行跟踪:根据跟踪日志里面的信息完成调试
7.Run-time,Moment,Component-level(UML部署图)
UML部署图:程序中的各个模块在物理上如何分布;表明客户端、服务器之间的关系。
8.Run-time,Period,Component-level(事件日志)
事件日志:每个事件有唯一编号
- 比较“执行跟踪”和“事件日志”
1.2软件构造的质量指标和要求
外部质量指的是 用户的反应。
内部质量指的是 软件本身可读性如何,针对的是它的开发者。
外部质量取决于内部质量。
》》外部质量因素
1.正确性:软件的行为要严格的符合规约中定义的行为。
——通过分层确保正确性(每一层保证自己的正确性,同时假设其下层是正确的)
——测试和调试:发现不正确、消除不正确
——防御式编程:在写程序的时候就确保正确性
——形式化方法:通过形式化验证发现问题
2.健壮性:针对异常情况的处理
在出现定义之外的情况时,软件要做出恰当的反应,“normal ”和“abnormal ”是主观而非客观,未被specification覆盖的情况即为“异常情况”,所谓的“异常”,取决于spec的范畴。
3.可扩展性:随着程序规模越来越大,扩展越来越难
简约主义设计,分离主义设计
4.可复用性: 一次开发,多次使用。关键是能够发现共性。
5.兼容性:不同的软件系统之间相互可容易的集成。
——方法:保持设计的同构性。
——标准化:文件格式,数据结构,用户界面,协议
6.性能:时间,空间,内存,带宽。
性能毫无意义,除非有足够的正确性;对性能的关注要与其他质量属性进行折中;过度的优化导致软件不再适应变化和复用。
不要过早的优化
7.可移植性:软件可方便的在不同的技术环境(比如硬件、操作系统)之间移植。
8.易用性:容易学习,安装,操作,监控,结构简单,并给用户提供详细的指南。
9.功能:程序设计中一种不适宜的趋势,即软件开发者增加越来越多的功能,企图跟上竞争,其结果是程序极为复杂、不灵活、占用过多的磁盘空间。
10.及时性:在用户需要前完成
》》内部质量因素
1.代码的行数(LOC),复杂性
2.可读性
3.耦合度
4.可读性和可理解性
5.大小
》》内部外部质量折中
——完整性 与 易用性
——经济性 与 功能
——经济型 与 可复用性
——性能 与 可复用性
——性能 与 可移植性
——及时性 与 可扩展性
最重要的几个质量因素:正确性和健壮性;可扩展性和可复用性
软件构造过程中五个关键质量目标:
——易于理解
——开发的经济性(复用性)
——能够应对变化(可扩展性)
——safe from bug(健壮性与正确性)
——运行效率