《软件构造》 第一章 软件构造的多维度视角和质量目标

本章小结:

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(健壮性与正确性)

——运行效率