软件构造第二章 第二节 软件构造的过程、系统和工具
一、广义的软件构造过程
1.1 编程(Programming)
Construction languages
- 用途上划分语言
- Programming languages (e.g., C, C++, Java, Python) 编程语言
- Modeling languages (e.g., UML) 建模语言
- Configuration languages (e.g., XML) 配置语言
- Build languages (e.g., XML) 构建语言
- 从形态上划分
- Linguistic-based 基于语言学的构造语言
- Mathematics-based (formal) 基于数学的形式化构造语言
- Graphics-based (visual) 基于图形的可视化构造语言
- 用途上划分语言
Programming tools
- 集成开发环境IDE
- IDE包括:
- Source code editor with intelligent code completion, code refactoring tool 源代码编辑器、智能代码补全工具、代码重构工具
- File management tool 文件管理
- Library management tool 库管理
- Class browser, object browser, class hierarchy diagram 软件逻辑实体可视化
- Graphical User Interface (GUI) builder 图形化用户界面构造器
- Compiler, interpreter 编译器、解释器
- Build automation tools 自动化build工具
- Version control system 版本控制系统
- Extensible by more external third-party tools 外部的第三方工具
Modeling languages 建模语言
- 建模语言:
建模语言是可以用来在由一致的规则集定义的结构中表达信息或知识或系统的任何人工语言,目的是可视化,推理,验证和传达系统的设计。 - UML语言:
图1-2 UML图
图1-3 UML图示例
- 建模语言:
Configuration languages 配置语言
- 配置文件配置程序的参数和初始设置。
- 应用程序应提供工具来创建,修改和验证其配置文件的语法;
- 某些计算机程序仅在启动时读取其配置文件。其他人则定期检查配置文件中的更改。
- 常见配置语言:XML, YAML, JSON
1.2 静态代码分析(Review and static code analysis)
代码评审
- 代码审查是对源代码的系统检查(同级审查)。
- 旨在发现在初始开发阶段被忽略的错误,从而提高整体质量。
- 审核以各种形式进行,例如配对编程,非正式演练和正式检查。
代码评审会议
- 正式的代码审查(例如Fagan检查)涉及一个仔细且详细的过程,涉及多个参与者和多个阶段。
- 正式代码审查是传统的审查方法,其中软件开发人员通常使用材料的印刷副本参加一系列会议并逐行审查代码。
- 正式检查非常彻底,并且可以有效地发现所审查代码中的缺陷。
轻量级的代码评审
- 轻量级代码检查通常比正式代码检查需要更少的开销,尽管在正确完成后它同样有效。
- 轻量级审核通常是正常开发过程的一部分:
- 过度负责 - 当开发人员浏览代码时,另一位开发人员同时进行审查。
- 电子邮件传递 - 源代码管理系统在签入后自动将代码通过电子邮件发送给审阅者。
- 配对编程 - 两位作者在同一工作站上一起开发代码,这在Extreme Programming中很常见。
- 工具辅助的代码审阅 - 作者和审阅者使用软件工具,非正式工具(例如pastebins和IRC)或专门用于对等代码审阅的专用工具。
利用工具进行的静态代码分析
- 静态代码分析是对没有实际执行程序的情况下执行的计算机软件的分析(对执行程序执行的分析称为动态分析)。
- 该过程可以对代码结构有所了解,并可以帮助确保代码符合行业标准。
- 自动化工具可以帮助程序员和开发人员进行静态分析。
代码审查目的
- 改进代码。 查找错误,预见可能的错误,检查代码的清晰度以及检查与项目样式标准的一致性。
- 提升程序员水平。 代码审查是程序员彼此学习和教导的重要方式,涉及新的语言功能,项目设计或其编码标准的更改以及新技术。 特别是在开源项目中,在代码审查中可以学习很多新知识。
- 注:测试也是提高代码质量手段,但分析和设计为提升代码质量的最重要方式。
1.3 动态代码分析(Dynamic code analysis / profiling)
- 动态代码分析
- 动态程序分析是对通过执行程序执行的软件的分析。
- 必须使用足够的测试输入来执行目标程序,以使软件产生正确的行为。即对代码的运行时状态和性能进行度量,发现代码中的潜在问题。
- 使用软件测试措施(例如代码覆盖率)有助于确保已观察到程序的可能行为集中的适当部分。
- 概要分析(“程序概要”,“软件概要”)是一种动态程序分析形式,用于测量程序的空间(内存)或时间复杂性,特定指令的使用情况或函数调用的频率和持续时间。
1.4 调试与测试(Debugging and Testing)
什么是测试?
- 软件测试是为了向利益相关者提供有关被测产品或服务质量的信息而进行的调查。
- 测试技术包括执行程序或应用程序的过程,目的是发现软件错误(错误或其他缺陷),并验证软件产品是否适合使用。
- 软件测试包括执行软件组件或系统组件以评估一个或多个相关属性。
什么是调试?
- 调试是识别错误的根本原因并进行纠正的过程。
- 与测试相反(测试是最初检测错误的过程),调试是成功测试的结果。
- 在某些项目中,调试占用了总开发时间的50%。
- 对于许多程序员而言,调试是编程中最困难的部分。
- 像测试一样,调试不是提高软件质量的方法,而是诊断缺陷的方法。
- 必须从一开始就内置软件质量。 制作高质量产品的最佳方法是仔细开发需求,进行良好的设计并使用高质量的编码实践。
- 调试是不得已的方法。
1.5 重构(Refactoring)
重构:
- 重构是指以不改变代码的外部行为但改善其内部结构的方式更改软件系统的过程。
- 重构是指以不改变代码的外部行为但改善其内部结构的方式更改软件系统的过程。
重构的目的:
- 产生短期时间/工作成本以获取长期利益,并为系统的整体质量进行长期投资。
- 产生短期时间/工作成本以获取长期利益,并为系统的整体质量进行长期投资。
重构的方法:
- 通过一系列小的保留语义的转换来重构(重新排列)代码,以使代码更易于维护和修改。
- 重构不仅仅是对旧的结构重组,需要保持代码正常运行,保留语义的小步骤,进行单元测试以证明代码有效。
二、狭义的软件构造:build
2.1 build粗略理解
粗略理解build:build-time $\rightarrow$ run-time. 借助于工具,将软件构造各阶段的活动“自动化”(编译、打包、静态分析、测试、生成文档、部署、…),尽可能脱离“手工作业”,提高构造效率。
2.2 build场景综述
- 用传统编译语言(如C、C++、Java)编写软件(compilation)
- 用解释型语言(如Perl、Python)编写软件的打包和测试(packaging and testing)
- 用基于Web的应用程序进行编译和打包
- 使用静态HTML页面
- 使用Java或C# 编写的源代码
- 使用JSP,ASP或PHP语法编写的混合文件以及多种类型的配置文件
- 执行单元测试代码的其余部分对软件进行隔离验证
- 执行静态分析工具来是被程序源代码中的错误
- 生成PDF或HTML文档
2.3 传统编译语言:C、C++、Java等
- 源文件被编译成目标文件,连接到代码库或可执行程序中
生成的文件被收集到可安装在目标机器上的发行包中 - 版本控制工具
- 源树和对象树:特定开发人员使用的源文件和编译对象文件集。
- 构建机器:执行编译工具的计算设备
- 发布打包和目标机器:打包软件,分发给最终用户,然后安装到目标机器上的方法
2.4 解释型语言:Perl、Python等
- 解释的源代码不会编译到目标代码中,不需要对象树,解释源文件本身被收集到一个发行包中被安排在目标机器上
- 编译工具专注于转换源文件并将它们存储在发行包中
- 不在程序构建时编译成机器码
2.5 基于Web应用程序的构建系统:编译代码,解释代码和配置或数据文件的混合
- 静态HTML文件,只包含标记数据显示在Web浏览器中,直接复制到发行包
- 包含代码的JavaScript文件将由最终用户浏览器解释,直接复制到发行包
- JSP,ASP或PHP页面,包含HTML和程序代码的混合,由Web应用程序服务器而不是构建系统编译和执行,复制到发布包,准备安装到Web服务器上
- 构建系统在编译打包Java类文件之前执行转换。Java类在Web应用程序服务器上或浏览器内执行(使用小程序)
2.6 Build process
- build process
构建工具调用每个编译工具来完成工作,这是事件的端到端序列。
- 如何构建系统
- 开发人员构建:开发人员已检出VCS的源代码并正在专用工作区中构建软件,结果发布包将用于开发人员的私人开发。
- 发布版本:为测试组提供一个完整的软件包供验证,软件的质量足够高时为客户提供相同的软件包。用于发布版本的源代码树只编译一次,永不修改。
- Sanity构建:与发布版本类似,但并非针对客户,可以每天发生多次,并且趋向于完全自动化。
三、常见build工具
- Java构造工具:Make、Ant、Maven、Gradle、Eclipse
.2 Maven将项目的生命周期大致分为9个,分别为:clean、validate、compile、test、package、verify、install、site、deploy- 使用maven自动构建的方法:如mvn compile
- validate - 验证项目是否正确,并提供所有必要的信息
- compile - 编译项目的源代码
- test - 使用单元测试框架测试已编译的源代码。这些测试不应该要求打包或部署代码
- package - 获取已编译的代码并将其打包为可分发的格式,例如JAR
- verify - 对集成测试结果进行任何检查,以确保符合质量标准
- install - 将软件包安装到本地存储库中,作为本地其他项目的依赖项
- deploy - 在构建环境中完成,将最终包复制到远程存储库,以便与其他开发人员和项目共享
- 使用maven自动构建的方法:如mvn compile