前言:
今年是特殊的一年,由于新冠病毒的爆发,导致我们无法正常开学,所以网上开课如期进行,其中软件构造是这学期我们要面临的巨大挑战。
准备工作:
上学期末得知本门课程需要学习Java语言进行编程,所以在寒假刚开始,就选择了MOOC上北京大学的Java程序设计这门课程。MOOC链接
这门课程的分类很细,而且有基础的选择题,大概用了10天左右的时间就完成了视频的观看。本以为已经可以达到编写一般Java程序的程度,但在真正实验过程中,才发现学习的不是很扎实,这都是因为没有“熟能生巧”的缘故,纸上谈兵是不可能打好每一场仗的。
了解
软件构造(Software Construction),还没了解时,认为这门课程只是在考验我们的编程,用来完成一些完整的软件,感觉上就是一个个小问题的叠加,没有什么难度。但是上完第一堂网课后就彻底颠覆了对这门课的看法。
首先我们要先了解什么是软件。软件一般分为系统软件和应用软件两种,而软件是直接面向用户的,所以要想做到让用户满意,就需要软件开发人员构建高质量的软件。
一个高质量的软件设计过程是十分复杂的,有很多需要构造者满足的条件,比如可理解性、可维护性、可复用性、健壮性、时空性能等;如果在一个项目的生命周期的前、中、后期都强调质量,那么一个高质量的计划、高效的实践以及系统测试是必不可少的。
主要内容
- 软件构造过程中的多维度视图
这幅图详细写出了各个维度之间的关系
-
编译时&运行时
-
代码角度&模块角度
-
时刻&时段
三个维度,相互组成,软件所关注的内容也不相同,对于软件的编写也会产生不同的影响
维度组合 | 内容 |
---|---|
编程时、代码角度、时刻 | 考虑源代码如何由基本程序块组织以及依赖关系 1.词汇层面 2.语法层面(AST) 3.语义层面(Class Diagram) |
编程时、代码角度、时段 | Code churn 代码变化 体现在代码行的增、删、改和文件版本的变换 |
编程时、模块角度、时刻 | 1.源代码被物理地组织成文件,这些文件进一步被目录组织起来 2.文件被封装到包中,并且在逻辑上被封装到组件和子系统中 3.可重用模块以库的形式存在 所以开发者一般会调用库中的模块来编写程序 |
编程时、模块角度、时段 | 用版本来记录各项软件实体随时间的变化 软件随需求进化,在维护、更新时,版本记录可以很好的帮助 |
运行时、代码角度、时刻 | 代码快照:描述程序运行时内存里变量层面的状态,分析内存占用情况等 |
运行时、代码角度、时段 | 利用UML以动态的形式描述类 |
运行时、模块角度、时刻 | 模块分析 |
运行时、模块角度、时段 | log日志 |
各个维度之间的关系如下图所示:
- 软件构造的质量目标
上一部分搞清楚了“要构造的结果是什么”, 这一部分要理解清楚“构造的结果如何才算好”
软件系统的质量特性
- 外部和内部质量因素
外部质量因素影响用户,内部质量因素影响软件本身和开发者。外部质量取决于内部质量 - 重要的外部质量因素
- 质量因素之间的权衡
外部质量因素
- 正确性
若输入正确,输出也正确(至高无上的质量指标) - 健壮性
针对异常情况的处理,遇到异常不能“崩溃”,是对正确性的补充 - 拓展性
软件能够根据需求调整变化的能力 - 复用性
一次开发,多次使用 - 兼容性
不同的软件系统之间相互可容易的集成 - 高效性
软件系统对硬件资源的需求程度(保证正确性的前提下) - 移植性
软件可方便的在不同的技术环境之间移植 - 易用性
软件用户更便于使用我们开发的软件 - 功能性
系统尽可能提供更加全面的功能 - 及时性
在用户需求之前完成软件开发很重要 - 其他
可验证性,完整性,可修复性,经济性等等
内部质量因素
- 代码量
- 高聚合,低耦合
- 易读易理解
- 复杂度
- 规模
- 其他
质量因素之间的折中考虑
“正确性”绝不能与其他质量因素折中
- 完备性与易用性
- 经济性与功能性
- 高效性可移植性
- 高效性与复用性
- 经济性与复用性
- 及时性与扩展性
软件建设五大质量目标
- 易于理解:优雅优美的代码/易懂
- 随时可以更改:可维护性和适应性
- 开发成本低:为重用而设计:可重用性
- 安全无漏洞:健壮性
- 高效运行:性能