1.1 代码如何变成软件
在我们深入说明代码质量之前,简短地讨论一下代码如何变成软件是很有必要的。如果你已经熟悉了软件开发和部署过程,那么可以跳到1.2节。如果你知道如何编写代码,但从未承担过软件工程任务,那么本节应该能为你提供一个很好的概要。
软件是由代码构成的,这一点显而易见,无须说明。但是,代码变成在外界运行的软件(在用户手中或者执行业务相关的任务)的过程就不那么明显了(除非你已经有软件工程师的工作经验)。
工程师编写的代码一般并不会立即成为一款在外界运行的软件。通常要经过各种各样的过程和检查,以确定这些代码能够完成应该承担的工作,而且不会造成任何破坏。这些过程和检查往往被称作软件开发和部署过程。
阅读本书并不需要详细了解这一过程,但至少了解其概况还是有好处的。首先,我们介绍几个术语。
● 代码库(codebase)——包含软件构建所需各部分代码的存储库。这通常由git、subversion、perforce等版本控制系统管理。
● 代码提交(submitting code)——有时称为“提交代码”(committing code)或“合并-拉取-请求”(merging a pull request),程序员通常更改代码库本地副本中的代码。一旦他们对更改感到满意,就会将其提交到主代码库。注意:在一些机构中,由指定的维护人员而非代码编写者将更改提交到代码库中。
● 代码评审(code review)——许多组织要求在代码提交到代码库之前,由另一名工程师进行评审。这有点像代码校对,“第二双眼睛”往往能发现代码编写者遗漏的问题。
● 提交前检查(pre-submit check)——有时候称为“合并前钩子”(pre-merge hook)、“合并前检查”或“提交前检查”,如果测试失败或者代码未编译,这些检查将阻止代码提交到代码库。
● 发行(release)——软件是从代码库的一个快照中构建的。经过各种质量保证检查,这款软件就可以向外界发行了。你常听到的“剪切发行版本”(cutting a release)这个术语指的就是从代码库中取得某个修订版本,并从中制作一个发行版本的过程。
● 生产(production)——当部署软件到一台服务器或者一个系统中(而不是运送到客户那里)时,这个术语是“在外界运行”的恰当说法。一旦软件发行并执行业务相关任务,我们就称其为“运行在生产环境”。
代码转化成可运行软件的过程有许多变种,但这些过程中的关键步骤通常如下。
(1)工程师更改代码库的本地副本。
(2)工程师修改满意之后将发送这些更改,以进行代码评审。
(3)其他工程师将评审代码,可能会提出修改建议。
(4)一旦作者和评审人员都感到满意,将提交代码到代码库。
(5)定期从代码库剪切发行版本。在不同组织和团队中,这一工作的频率也不一样(从几分钟到几个月不等)。
(6)任何测试失败或者代码未编译,都可能阻止代码提交到代码库,或者阻止其发行。
图1-2展示了典型软件开发与部署过程的概况。不同公司和团队都有各自的版本,各部分的自动化程度也各不相同。
值得注意的是,软件开发和部署过程本身就是庞大的主题,关于它们的专门著作很多。围绕这些过程也有许多不同的框架和思想方法,如果你对此感兴趣,也值得阅读更多的相关书籍。本书主要不是针对这些主题的,因此不会进一步详细介绍。对本书来说,你只需要大概了解代码是如何变成软件的就可以了。
图1-2 典型软件开发与部署过程的简化框图。在不同的组织和团队中,具体的步骤和自动化水平可能大不相同