软件构造学习笔记-1

写在前面

 如果一切正常的话,我现在已经是在学校里忙东忙西,准备上课了。然而这场严重的疫情让我度过了一个特殊的春节和一个续费的寒假,虽然我们都不希望以如此方式延长。既然不能按时回到学校,不如摆正心态,从心理上严肃认真起来。大二上的学习很好地丰富了我的知识,并且让我取得了满意的成绩。希望本学期的我再接再厉,勤动手勤思考,继续把认真学习作为主旋律,并在学期结束时选择适合自己的方向。
 经过不短的“闭关”时间,我对自己所处也有了一点思考。有关善恶是非的认定充满主观因素,面对种种判断、辩论、主张、号召,我不敢妄加评论。但是有一点我深信不疑——真理是善的,知识是好的,诚实是美的。科学毋庸置疑具有上述三种品质。我认为大多好的事物都可以归于科学和哲学中。我是一名学生,我厌恶一切权威且反智的声音,我尊敬科学、热爱科学、学习科学。

软件的多维度视角

1. By phases: build- and run-time views
  By dynamics: moment and period views
  By levels: code and component views
  ······
软件构造学习笔记-1

图1-软件的多维视图

2. Build-time, moment, and code-level view
 源代码是如何通过程序块(如函数、类、方法、接口等)被组织的,以及它们间的相互依赖关系。
 三种内部相关的形式:

  • Lexical-oriented source code
  • Syntax-oriented program structure: e.g., Abstract Syntax Tree (AST)
  • Semantics-oriented program structure: e.g., Class Diagram

3. Build-time, period, and code-level view
 描述软件随时间的变化。
 Code churn:从一个版本到另一个版本对文件进行的语句增加、修改或删除。

4. Build-time, moment, and component-level view
 源代码被物理地组织为文件,并且文件进一步按目录进行组织。
 文件被添加到包中,并且从逻辑上添加到组件和子系统中。
 可重用的模块被组织为库。库可以进行静态链接与动态链接。静态链接中库的代码在构造阶段链接到源代码中,成为一个整体,且链接后不再需要库文件。动态链接在执行时需要库文件,且程序随着库的更新会产生相应改变。

5. Build-time, period, and component-level view
 引入有关版本控制的概念:软件中的各种组件是如何随时间改变的——软件配置项与版本。

6. Run-time, moment, and code-level view
 关注程序在目标机器上运行时各个时刻的信息状态。常用工具是Snapshot和Memory dump。

7. Run-time, period and code-level view
 UML图表用来表示程序中各个单元/对象之间的关系。
 跟踪涉及一种专门的日志记录方法,用于记录有关程序执行的信息。这类信息通常被用作debug用途。

8. Run-time, moment, and component-level view
 关注程序运行时的时刻,在组件层面的信息。也可以使用UML进行分析。

9. Run-time, period, and component-level view
 事件记录为系统管理员提供诊断和审计有用的信息。在开发周期中,将记录的不同事件类别以及事件消息中显示的详细信息将被考虑在内。为每个事件类分配一个唯一的“代码”来格式化和输出可读的消息,这有助于本地化,并允许系统管理员更容易地获取有关所发生问题的信息。

软件构造中各种视角的转换

软件构造学习笔记-1

图2-软件构造中的视角转换

软件系统的质量特性

1. 外部质量因素
 正确性:是最优先的考虑因素。软件的正确性取决于从硬件到操作系统再到代码等一系列因素,要遵循从底层到顶层的顺序,保证软件的正确性。如果只有顶层或只有底层具有正确性,那么软件执行结果仍然是不正确的。软件的正确性不能通过使每个组件都达到完美来保证,因为它们相互依赖,相互作用。通常用分层、测试、调试、防御式编程、形式化验证等方法保证程序的正确性。
 健壮性:软件在异常状态下的行为能力,是对正确性的补充。健壮性要求程序运行时,如果意外情况发生,系统不会崩溃,而是产生错误信息并且直截地终止其进程,将损失降低到最少。健壮性是对规约以外行为的处理。
 可拓展性:是使软件产品适应规范变化的容易程度。可扩展性和程序规模关系密切,程序规模越小,可扩展性越高。简约和分离的设计有利于程序的可拓展性。
 可重用性:是指软件元素为许多不同应用程序的构建服务的能力。即一次开发,多次使用。较高的可重用性可以缩短开发周期,降低开发成本。
 兼容性:软件元素之间相互组合的简易程度。软件元素之间存在着相互作用关系,但在组合时可能会遇到问题(例如不同操作系统之间的不协调)。兼容性的关键在于设计的同质性,以及程序间通信的标准化约定。
 效率:指软件对硬件资源占用尽可能少的能力。对效率的追求建立在程序的正确性之上,缺乏正确性的效率是没有意义的。同时,要协调考虑效率和其余因素,折中选取最好的策略。
 可移植性:软件在不同的硬件以及软件环境中转移的能力。
 易用性:软件安装、使用、操作的容易程度。具有较高易用性的软件对用户更加友好。
 功能性:软件为用户提供的功能。但是盲目追求功能的多样性会使程序复杂、笨重并且占用更多的硬件资源。
 时效性:软件系统在用户需要时或之前发布的能力。
 ······

2. 内部质量因素
包括源代码相关因素(代码行数,循环复杂度等)、架构相关因素(耦合度,聚合度)、可读性、易理解性、清晰度、规模等等。

3. 质量因素间的折中
 开发者要在软件开发过程中进行折中,需要结合软件实际用途以及各个因素对软件使用的影响。然而,程序首先要保证其正确性,然后才能在其余因素中进行折中。
 在当前的软件工业中,四点性能需要格外注意:正确性和健壮性,可扩展性和可重用性。

软件构造的五个关键目标

1.易于理解:代码整洁优美,容易理解。
2.易于修改:可维护性和适应性。
3.开发成本低:为重用设计或重用代码。
4.具有健壮性。
5.运行高效。
软件构造学习笔记-1

图3-软件构造目标与各个章节的关系