本节将会介绍构建系统、代码测试以及依赖管理、持续集成等。

目录如下:

对于「什么是元编程?如何理解元编程?」,这里有一个比较形象的理解,引用其中的一句话:程序甲可以输出 A~Z,那么写程序甲就算做是「编程」,而程序乙可以生成程序甲,那么编写程序乙的这个活动就可以算作是「元编程」。元编程是一种计算机可以将代码看做成数据的能力。如果将代码看作是数据,那么代码就可以像数据一样在运行时被修改、更新和替换1

假设以下场景,当我们计划搭建某个系统的时候,需要进行一些依赖包、软件、环境等一系列的设置。配置这些「初始化设置」的动作可以称为“构建系统”,而系统在构建的过程中却包含了需许多步骤、分支等。例如执行一些命令来生成图表,再执行另外一些命令生成结果,最后再执行其它命令生成最终的结果。可以看到,有很多事情需要我们自己去完成,但是这其中某些事情是可以通过一些工具实现的。元编程的思想就是使用代码来生成这些命令,消除重复的代码。

make 是一个常用的构建系统之一。当使用 make 的时候,该程序将会自动确定一个应用程序中的哪些部分是已经被修改过的。如果已经被修改过,那么 make 就会重新编译代码。

当执行 make 时,它会去参考当前目录下名为Makefile的文件,该文件中定义了构建目标、相关依赖和规则。当然,make 支持任何编程语言。

假设你想通过 Latex 工具来写一篇论文,并最终生成.pdf格式。对于这样的任务,就可以使用 make 进行构建。当 Latex 中的某些内容被修改时,可以使用 make 来重新生成.pdf格式的文件。这显然是很方便的。

对于依赖管理来说,我们的项目中有可能会依赖其它的项目,也有可能会依赖其它的程序。虽然这些程序可以通过例如apt-get instll packageName的方式进行安装,但是如果依赖很多的话,一个一个地安装未免会有些繁琐。因此,依赖管理可以很好的解决这种问题。例如,当我们在基于 Maven 的 Spring 项目中需要使用到某个依赖组件的时候,通常是可以在 Maven 的仓库中搜索一个合适版本进行使用,然后复制到pom.xml文件中。而如果不指定某个组件的版本号的话,那么 Spring 会直接从其parent中自动找到一个适合当前版本的组件,以此来应用到项目中。这一操作就是依赖管理带来的好处。也就是相当于当前版本的组件在 Maven 的帮助下自动选择一个合适的版本。

对于持续集成系统来说,它适用于以下场景:「当你的代码变动时,通过持续集成自动运行的东西。」。也就是说,当有一个比较大的项目的时候,除了修改代码之外,还有许多工作要做。例如还需要上传一份新的文档、执行测试等等。或者当有人将代码提交到 Github 的时候,你希望他们的代码风格能够被自动的检测出来是否符合指定的要求。这些俗称“自动完成”的任务都可以交给持续集成来做。

现在 Github 中已经有类似于持续集成的功能,即 Github Actions。只需要在配置文件中描述「当前仓库发生修改时,应该如何应对」这一动作即可。

对于测试部分,文章中稍微给出了常见的测试术语。例如单元测试、集成测试、回归测试、模拟等等。

可以看到,本节课程所涉及到的内容都偏向于工作场景,现在仅仅是了解一些名词或熟悉一下知识,而具体的实践操作,可以等到入职以后,结合具体真实项目一起进行巩固和学习。