软件构造基础及过程Part1——多维度视图、阶段划分及构造活动
软件构造的多维度视图
软件的3个(正交)维度:
- phase(阶段) - 可以分为Build-time Views(构建时视图) 和 Run-time Views(运行时视图)
- dynamic(动力学) - 可以分为Moment Views(时刻视图) 和 Period Views(时间段视图)
- level(级别) - 可以分为Code-level Views(代码级视图) 和 Component-level Views(组件级视图)
于是3个维度就可以产生2^3=8种不同的视图,如下图所示
Moment + Code-level | Moment + Component-level | Period + Code-level | Period + Component-level | |
---|---|---|---|---|
Build-time | 源代码、AST(抽象语法树)、接口类属性方法(类图) | 包、源文件、静态链接、库、测试用例(组件图) | Code Churn(代码变化) | Configuration Item(配置项), Version(版本) |
Run-time | Code Snapshot(代码快照)Memory dump(内存转储) | 包、库、动态链接、配置、数据库、中间件、网络、硬件(部署图) | Execution trace(执行跟踪) 、过程调用图、消息图(序列图)并行和多线程/进程分布式进程 | Event log(事件日志)、过程调用图、消息图(序列图)并行和多线程/进程分布式进程 |
Build-time Views
软件构建的核心过程和环节
- idea
- requirement
- design
- code
- installable / executable package(可安装/可执行包)
与另外2个维度的视角结合:
- Code-level Views(代码级视图):source code——源代码是如何按照基本程序块(如函数、类、方法、接口等)以及它们之间的依赖关系进行逻辑组织的。
- Component-level Views(组件级视图):architecture(体系结构)—源代码是如何按文件、目录、包、库以及它们之间的依赖关系进行物理组织的
- Moment Views(时刻视图):源代码和组件在特定时间内是什么样子的
- Period Views(时间段视图):它们是如何随时间发展/变化的?
(1) Build-time, moment, and code-level view
即从源代码的角度,从其基本的程序模块(包括函数,类,方法,等等)以及他们之 间的联系,看源代码的逻辑组织。
具有三个内在联系的形式:词汇层面,语法层面,语义层面。
- 词汇层面: 使用半结构化的代码:近乎自然语言的风格+遵循特定的编程语法
- 语法层面:常用Abstract Syntax Tree(AST,抽象语法树),来表示一个半结构化的源代码
- 语义层面:考虑源代码要实现的目标,将源代码与现实世界联系起来,使用图形化或形式化的方法,来表达”需求“与”设计“思想,再将其转化为code,主要为面向对象的分析与面向需求的设计。
(2) Build-time, period, and code-level view
随着时间用来描述变化的视图。
主要来关注代码变化(Code churn):关注版本与版本之间的代码每行的增添,修改与删除。GitHub 上可以对其进行查看。
(3) Build-time, moment, and component-level view
即从源代码的物理结构(文件,包,库等),看源代码的物理组织。
- 源代码以物理方式组织成文件,并按目录进一步组织
- 文件被封装成包、组件和子系统
- 可复用模块形成类库
About Library(库)
- 编辑、构建和安装程序时,必须提供要用到的类库列表
- 如果源代码中引用了一个函数,但开发人员没有显式地编写它,那么将搜索库列表以定位所需的函数
- 找到函数后,将复制类库到可执行程序中
- 将库集成到可执行程序中的两种不同方法:Static linking(静态链接) Dynamic linking(动态链接)
(4) Build-time, period, and component-level view
- 软件系统中的所有文件/包/组件/库如何随时间变化?
- Software Configuration Item(SCI,软件配置项)
- Version(版本)
Run-time Views
Run-time关注当程序在目标机器内运行时,它是什么样子的?目标机器需要加载到内存中的所有磁盘文件是什么?
与另外2个维度的视角结合:
- Code-level view: source code(源代码):可执行程序的内存状态是什么样的?程序单元(对象、函数等)如何相互作用?
- Component-level Views: architecture:软件包是如何部署到物理环境(操作系统、网络、硬件等)中的,它们是如何交互的?
- Moment Views:程序在特定时间内的行为
- Period Views:它们是如何随时间发展/变化的?
- 它们如何随时间变化?
(5) Run-time, moment, and code-level view
- 刻画内存中某时刻变量的状态
- Fine-grained states. (细粒度状态)
- Memory dump(内存转储):硬盘上的一种文件,包含进程内存内容的副本,当进程因某种内部错误或信号而中止时产生
About Memory dump
- Debuggers可以加载转储文件并显示它包含的有关运行程序状态的信息
- 信息包括寄存器、调用堆栈和所有其他程序数据(计数器、变量、开关、标志等)的内容
- 这是为了分析程序的状态,程序员查看内存缓冲区,查看故障时正在处理哪些数据项
(6) Run-time, period and code-level view
关注程序单元(对象)之间的交互
- 可以关注UML顺序图
- 可以观察执行跟踪,用日志的方式记录程序执行的调用次序
(7) Run-time, moment, and component-level view
Deployment diagram in UML
(8) Run-time, period, and component-level view
关注系统层面的事件日志记录
- Event logging(事件日志)为系统管理员提供有助于诊断和审核的信息
- 在开发周期中,将考虑记录的不同类型的事件以及事件消息中显示的详细信息
- 为每类事件分配一个独特的“代码”,以格式化和输出人类可读的消息
- 这有助于本地化,并使系统管理员能够更容易地获得发生问题的信息
- 系统层面的日志与代码层面的执行轨迹追踪之间的差别: