2-2 软件构造的过程、系统和工具

大纲
▪ 软件构建的一般过程:设计编程/重构调试测试构建发布-编程/重构-评审和静态代码分析-调试(转储和日志记录)和测试-动态代码分析/分析
▪ 狭义的软件构建过程(Build):验证编译链接测试包安装部署-构建系统:组件和过程-构建变量和构建语言-构建工具:Make、Ant、Maven、Gradle、Eclipse
本次讲座的目的
▪ 了解软件构建的一般过程(设计编程调试测试构建发布)
▪ 使用Eclipse IDE作为Java构建环境和工具Eclipse
▪ 了解用于审查和静态分析、调试(转储、日志记录)和测试以及动态分析/分析的典型工具▪ 学习狭义的软件构建过程(Build:ValidateCompileLinkTestPackageInstallDeploy):Build▪ 使用一个构建工具(make、Ant、Maven、Gradle、Eclipse IDE)来构建您自己的Java项目

1软件建设的一般过程
2-2 软件构造的过程、系统和工具
构造语言
▪ 语言的目的
——编程语言(例如,C、C++、java、python)
——建模语言(例如,UML)
——配置语言(例如,XML)
——构建语言(例如,XML、YAML、JSON)

编程工具
▪ 集成开发环境(IDE):为程序员提供软件开发的综合设施。集成开发环境
▪ IDE通常包括:具有智能代码补全功能源代码编辑器、代码重构工具、文件管理工具、库管理工具、类浏览器、对象浏览器,系统管理员-可通过更多外部第三方工具进行扩展
Eclipse作为IDE示例
▪ 一个开源的IDE,它不限于,C/C++,PHP,Python等,它作为一个专有的IBM产品(SimultMaSaleSimalTalk/Java)开始,包含一个基本的工作空间,有用于编码、构建、运行和调试应用程序的工具,以及一个可扩展的插件系统,用于定制环境。
–插件是对系统贡献功能的代码和/或数据的结构化捆绑包。功能可以以代码库、平台扩展甚至文档的形式提供。
–插件可以定义扩展点,其他插件可以添加功能。

2-2 软件构造的过程、系统和工具
2-2 软件构造的过程、系统和工具

(2) 建模语言
▪ 建模语言是一种人工语言,可用于表示由一组一致的规则定义的结构中的信息、知识或系统,其目的是可视化、推理、验证和交流系统的设计。
2-2 软件构造的过程、系统和工具
2-2 软件构造的过程、系统和工具
2-2 软件构造的过程、系统和工具

2-2 软件构造的过程、系统和工具
2-2 软件构造的过程、系统和工具
(3) 配置语言
▪ 配置文件为程序配置参数和初始设置。
–应用程序应提供创建、修改和验证其配置文件语法的工具;
–某些计算机程序仅在启动时读取其配置文件。其他人定期检查配置文件的更改。
▪ 目的示例:–部署环境设置–应用程序功能的变体–组件之间连接的变体
▪ 配置语言示例:–键值文本(.ini、.properties、.rc等)–XML、YAML、JSON

(2) 审查和静态代码分析

审查和静态分析/检查
▪ 代码评审是对源代码的系统检查(同行评审)。
–旨在发现初始开发阶段忽略的错误,提高整体质量。
–评审以各种形式进行,如配对编程、非正式演练和正式检查。

正式代码评审
▪ 正式的代码评审,比如Fagan检查(一种结构化的检查 代码和文档缺陷的过程), ,涉及到一个多参与者、多阶段的细致过程。
–正式的代码评审是传统的评审方法,软件开发人员参加一系列会议并逐行评审代码,通常使用材料的打印副本。
–正式的检查是非常彻底的,并且已经被证明能够有效地发现所审查的代码中的缺陷。

轻量级代码评审
▪ 轻量级代码检查通常比正式的代码检查需要更少的开销,不过如果正确地完成,它也同样有效。
▪ 轻量级审查通常是作为正常开发过程的一部分进行的:一个开发人员越过作者的肩膀,而另一个开发人员则在代码中穿行。
–Emailpass around–源代码管理系统在签入后自动将代码发送给审阅者。
–Pairprogramming–两个作者在同一个工作站上一起开发代码,因为这是常见的不精确编程。
–工具辅助代码评审–作者和评审员使用软件工具,非正式工具,如AsteBins和IRC,或专门为同行代码评审设计的工具。

静态代码分析
▪ 静态代码分析是在没有实际执行程序的情况下对计算机软件进行的分析(对执行程序进行的分析称为动态分析)。
▪ 该过程提供了对代码结构的理解,并有助于确保代码遵循行业标准。
▪ 自动化工具可以帮助程序员和开发人员进行静态分析。–例如,CheckStyle、spotbug、Java的PMD

2-2 软件构造的过程、系统和工具

代码评审的目的
▪ 代码评审有两个目的:改进代码,发现错误,预测可能的错误,检查代码的清晰性,以及检查与项目风格标准的一致性。
–改进程序员。代码评审是程序员相互学习和教导的一种重要方式,它涉及到新的语言特性、项目设计或其编码标准的变化以及新的技术。特别是在开源项目中,很多对话都发生在代码评审的上下文中。
▪ 代码审查在像Apache和Mozilla这样的开源项目中被广泛应用。
▪ 代码评审在工业中也得到了广泛的应用。
–在谷歌,你不能把任何代码推到主存储库中,除非另一个工程师在代码评审中签字同意。

一些代码审查错误或潜在错误的具体例子:
重复代码(记住DRY,不要重复自己),规范与规范不一致,只有一个错误,全局变量和其他太大的变量范围。乐观的,没有意义的编码,幻数…混乱的密码,错误的变量或方法名,缩进不一致,可以简化的卷积控制流(if和while语句),在一行代码中打包太多,或者在一个方法中打包太多,未能注释模糊代码,有太多的琐碎的注释,这些注释只是代码的冗余,用于多种目的的变量。。。

(3) 动态代码分析/分析

动态代码分析/分析
▪ 动态程序分析是通过执行程序对软件进行的分析。
▪ 目标程序必须使用足够的测试输入来执行,以产生有趣的行为。
▪ 使用软件测试措施(如代码覆盖率)有助于确保观察到程序的一组可能行为中的适当部分。
▪ Profiling(“program Profiling”,“software Profiling”)是动态程序分析的一种形式,它测量程序的空间(内存)或时间复杂性、特定指令的使用情况或函数调用的频率和持续时间。剖析

(4) 调试和测试

什么是测试?
▪ 软件测试是为利益相关者提供有关被测产品或服务质量的信息而进行的调查。
▪ 测试技术包括执行程序或应用程序的过程,目的是发现软件缺陷(错误或其他缺陷),并验证软件产品是否适合使用。
▪ 软件测试是指执行一个软件组件或系统组件来评估一个或多个感兴趣的属性

2-2 软件构造的过程、系统和工具

什么是调试?
▪ 调试是识别错误的根本原因并加以纠正的过程。
▪ 与最初检测错误的测试相比,调试是成功测试的结果。在一些项目中,调试占据了整个开发时间的50%。
–对于许多程序员来说,调试是编程中最困难的部分
▪ 与测试一样,调试并不是提高软件质量的一种方法,而是诊断缺陷的一种方法。
–软件质量必须从一开始就内置。构建高质量产品的最佳方法是仔细分析开发需求,设计良好,并使用高质量的编码实践。
–调试是最后的手段。

2-2 软件构造的过程、系统和工具

(5) 重构

重构
▪ 重构是改变一个软件系统的过程,这样它既不会改变代码的外部行为,也不会改善代码的内部结构。
–产生短期时间/工作成本以获得长期效益,并对系统的整体质量进行长期投资。
▪ 重组(重新排列)代码
——在一系列小型的、语义保持的转换中
–为了使代码更易于维护和修改
▪ 重构不仅仅是任何旧的重组
——需要让代码继续工作
——需要保留语义的小步骤
——需要进行单元测试来证明代码是有效的

2软件建设(Build)的狭义过程
粗略理解build:build-time → run-time 借助于工具,将软件构造各阶段的活动“自动化” (编译、打包、静态分析、测试、生成文档、部署、…) 尽可能脱离“手工作业”,提高构造效率

典型的构建场景
▪ 用C语言、C++语言、java语言和C语言编写的软件编写。
▪ 用解释语言(如Perl和Python)编写的软件包和测试。
▪ 基于web的应用程序的编译和打包。
–这些包括静态HTML页面、用Java或C编写的源代码、使用JSP(JavaServer pages)、ASP(Active Server pages)或PHP(超文本预处理器)语法编写的混合文件,以及多种类型的配置文件。

典型的构建场景
▪ 执行单元测试以验证软件的所有部分,与代码的其余部分隔离。
▪ 执行静态代码分析工具来识别程序源代码中的错误。此生成系统的输出是错误报告文档,而不是可执行程序。
▪ 生成PDF或HTML文档。这种类型的构建系统使用一系列不同格式的输入文件,但生成可读的文档作为输出

编译语言
▪ 编译语言,如C、C++、java和C语言。在这个模型中,源文件被编译成对象文件,然后链接到代码库或可执行程序中。
▪ 生成的文件收集到可安装在目标计算机上的发布包中。

翻译语言
▪ 解释的源代码没有编译成目标代码,因此不需要对象树。源文件本身被收集到一个发布包中,准备安装到目标计算机上。
▪ 编译工具的重点是转换源文件并将它们存储在发布包中。
▪ 编译为机器代码不会在生成时执行,即使它可能在运行时发生。

基于Web的应用程序
▪ 基于web的应用程序的构建系统是编译代码、解释代码和配置或数据文件的混合体。
▪ 一些文件(如HTML文件)直接从源代码树复制到发布包中,而其他文件(如Java源文件)则首先编译成对象代码。

2-2 软件构造的过程、系统和工具

基于Web的应用程序
▪ 静态HTML文件,只包含要在web浏览器中显示的标记数据。这些文件将直接复制到发布包中。
▪ 包含要由最终用户的web浏览器解释的代码的JavaScript文件。这些文件也会直接复制到发布包中。
▪ JSP、ASP或PHP页面,包含HTML和程序代码的混合体。这些文件由web应用服务器而不是构建系统编译和执行。这些文件也会复制到发布包中,以便在web服务器上安装。
▪ Java源文件要编译成目标代码并打包为web应用程序的一部分。构建系统在打包Java类文件之前执行此转换。Java类在web应用服务器上执行,甚至在web浏览器中执行(使用Java小程序)。

构建系统的组件
▪ 版本控制工具
▪ 源代码树:程序的源代码存储为许多磁盘文件。这种将文件排列成不同的结构称为源树。源代码树的结构通常反映了软件的体系结构。
▪ 对象树:一个单独的树层次结构,存储由生成过程构造的任何对象文件或可执行程序。
▪ 编译工具:把人类可读的源文件翻译成机器可读的可执行程序文件的程序。
–编译器:源文件对象文件
–链接器:多个相关对象文件可执行程序映像
–基于UML的代码生成器:模型源代码文件
–文档生成器:脚本文档

构建系统的组件
▪ 编译工具:在编译工具之上运行的程序。它必须对源文件和对象文件之间的关系有足够的了解,才能协调整个生成过程。构建工具调用必要的编译工具来生成最终的构建输出。
▪ 编译机器:编译和编译工具执行的机器。
–本机编译环境:软件在与生成计算机相同的目标计算机上执行;
–交叉编译环境:需要两台不同的计算机,目标计算机上有不同的操作系统或CPU。

构建系统的组件
▪ 发布打包和目标机器:生成可以实际安装在用户机器上的东西。
-从源树和对象树中提取相关文件并将其存储在发布包中。
–发布包最好是一个磁盘文件,并且应该压缩以减少下载所需的时间。
–任何不重要的调试信息都应该删除,这样就不会干扰软件的安装。
▪ 打包类型:
–存档文件:zip和unzip
–包管理工具:UNIX风格,如.rpm和.deb
–自定义构建的GUI安装工具:Windows风格

构建过程
▪ 构建过程:构建工具调用每个编译工具来完成任务,这是一个端到端的事件序列。
2-2 软件构造的过程、系统和工具
生成语言(生成描述)
▪ 生成工具需要以基于文本的格式编写生成说明。
–它遵循特定生成语言的语法规则。
▪ 例如,在使用Make时,文件间依赖关系信息以规则的形式指定,这些规则存储在名为Make file的文件中。
▪ 可以手动编写描述,也可以通过IDE生成描述

如何使用生成系统
▪ 开发人员(或私有)构建:开发人员已从VCS签出源代码,正在私有工作区中构建软件。
▪ 发布版本:为测试组验证提供完整的软件包。当测试人员确信软件具有足够高的质量时,就可以向客户提供相同的软件包。
▪ 健全性生成:生成过程确定当前源代码是否没有错误,并通过一组基本的健全性测试。这种类型的构建每天可能发生很多次,并且趋向于完全自动化。–每日构建/夜间构建–持续集成(CI)

Java Make
▪ 使用Make和makefile构建Java项目
2-2 软件构造的过程、系统和工具

阿帕奇蚂蚁 Apache Ant
▪ Ant是Apache软件基金会开发的一个构建工具。
▪ Ant遵循的是将构建系统中的每个活动封装到一个高级任务中。
–ant compile:用于将所有Java源文件编译为类文件
–ant jar:用于将类文件打包为单个jar文件
–ant package:用于创建完整的软件发布包,完成版本号
–ant clean:用于从构建树中删除所有生成的文件
–ant javadoc:用于使用javadoc工具生成API文档
–ant:用于执行默认目标,很可能与包目标相同
▪ 构建文件:build.xml

Ant的内置和可选任务
▪ 基本文件操作,如mkdir、copy、move和delete
▪ 使用不同格式的数组(如.tar、.gz、.zip、.jar和.rpm)创建文件存档
▪ Java代码的编译,包括RMI和JSP编译的专用工具
▪ 使用Javadoc工具自动生成API文档
▪ 直接访问版本控制工具,如CVS、Perforce和ClearCase▪ 生成生命周期功能,例如更新生成版本号、发送电子邮件和播放声音以指示生成过程的完成

2-2 软件构造的过程、系统和工具
阿帕奇Maven
▪ Apache Maven是一个软件项目管理和理解工具。–基于项目对象模型(POM)的概念,Maven可以从中心信息管理项目的构建、报告和文档。
▪ IDE集成:eclipseide-M2Eclipse▪ Maven的主要目标是允许开发人员在最短的时间内理解开发工作的完整状态。
–简化构建过程
–提供统一的构建系统
–提供高质量的项目信息
–提供最佳实践开发指南
–允许透明地迁移到新功能

2-2 软件构造的过程、系统和工具

2-2 软件构造的过程、系统和工具

2-2 软件构造的过程、系统和工具

▪ validate-验证项目是否正确以及所有必要的信息是否可用
▪ 编译-编译项目的源代码
▪ 使用单元测试框架测试编译的源代码。这些测试不应要求打包或部署代码
▪ package—获取编译后的代码并将其打包为可分发的格式,如JAR。
▪ 验证-对集成测试的结果进行任何检查,以确保满足质量标准
▪ install-将包安装到本地存储库中,用作本地其他项目中的依赖项
▪ 部署-在构建环境中完成,将最终包复制到远程存储库以与其他开发人员和项目共享

2-2 软件构造的过程、系统和工具

在Eclipse中构建Java项目

▪ Eclipse IDE为代码编辑、编译、版本控制、测试和任务跟踪提供了一整套开发工具。
▪ Eclipse中的构建功能只是更广泛的工具集的一部分,编译是在幕后进行的,你甚至不知道它正在发生,Eclipse GUI使构建无缝地协同工作。
▪ 您没有编写构建描述文件(例如makefile):Eclipse已经足够了解软件的结构。
▪ 依赖于GUI提供构建功能使构建构建构建系统变得容易,但也限制了可用功能的设置。

本次总结
▪ 软件构建的一般过程:设计编程/重构调试测试构建发布-编程/重构-评审和静态代码分析-调试(转储和日志记录)和测试-动态代码分析/分析
▪ 狭义的软件构建过程(Build):验证编译链接测试包安装部署-构建系统:组件和过程-构建变量和构建语言
-构建工具:Make、Ant、Maven、Gradle、Eclipse