第9章 代码质量
质量不是一种行为,而是一种习惯。
——Aristotle
写高质量的JavaScript是什么意思?质量能度量吗?还是说它是一个主观感受,类似于美和艺术的柏拉图式的理想?程序员往往会在质量的主观和客观理解之间摇摆不定。他们提出了诸如软件工艺的概念,这是一种用类似手工艺的方法来编写软件的方式。软件工匠常被这样描述:他们拥有超群的技术,总是能将工作提炼为基本的、本质的部件。这样一个工匠在电气上被称为摇滚明星程序员。这基于两个标准,一是这个人具有如同艺术家一样的独特天赋,二是他工作的产出并不是各个组件的单纯结合。然而,很多编程是围绕度量、重构,以及通过程序性的可重复的流程来改进代码。这表明,质量可以被提取为一系列独立的和可度量的步骤。
如果质量可以度量,那么对于JavaScript开发者来说,有哪些机制可以确保他们写出高质量的代码呢?本章将深入探讨编写高质量JavaScript的概念,因为涉及到编程,我们首先给质量下一个定义,然后提供一个用于评估和改进代码质量的框架。
9.1 定义代码质量
正如许多复杂的学科往往会吸引具有不同背景的人一样,对于编程质量的定义往往会跨越艺术与科学之间的栅栏。编程行为往往是创造性地解决问题和运用工程师的严谨来完善解决方案的融合。编程是一种博弈,它存在于编写可重复步骤的客观观察和借由经验和洞察而爆发出的主观评判之间。事实上,“质量”这个词同时包含这两个方面。Barbara W. Tuchman解释了质量的两面性:
当然,“质量”这个词有两方面的含义:首先它是指一个物质的性质或本质特征,比如“他的声音有命令的性质(His voice has the quality of command)”;其次它是意味着卓越品质的条件,作为与低劣品质的区分(Tuchman,1980)。
Tuchman接着将质量描述为“自我滋养”,这是一个非常生动的描述。质量也被描述为一种追求,这表明它不是一个目标,而是一个过程。这可能是因为它的定义并不是固定的,它属于时代精神。为了证明这一点,你可以看看艺术的发展史,它也在不断排斥或拥抱不同的艺术表现形式。在法国印象派的发展历程中,它从最初被鄙视的艺术,经过几年的发展后成为艺术世界的顶峰。他们的画并没有改变,只是对于质量的定义发生了变化。
在本章中,我认为,对于JavaScript源代码的评估,主观和客观的评价都是需要的。事实上,我认为,你不能将两者完全分离。但是,在证实这个断言之前,我有必要正确地呈现这两种形式。
9.1.1 主观质量
主观质量往往描述有启发性或必要的代码,或者Truchman所说的“天资”。在他的产品质量的文章中,David Garvin定义了一种形式的质量,他将其描述为卓越。他将卓越品质定义为:
……从绝对和普遍认识来说,卓越品质是不妥协的标准和高成就的标志。然而,主张这种观点的支持者认为质量不能被精确定义;相反,它是一种我们只能通过经验来辨识的简单的无法分析的属性。这个定义在很大程度上借鉴了柏拉图对于美的讨论。在研讨会上他认为,美是“柏拉图式”的一种形式,所以它并不能被定义。其他的哲学家称其为“原始的逻辑”,也就是说,只有当一个人接触到显示其特性的对象的时候,美(也许质量也一样)才可以被理解(Garvin,1984)。
这个定义清楚地表达出,主观质量依赖于个人的经验或对技能很熟练的人的指导,这些人会在他们的领域认识到质量并实现卓越。因此,主观质量基本上是普遍的真理,并不多是由于发现而创造的。
9.1.2 客观质量
客观质量认为,如果天才可以被度量,那么它就可以被量化,被复制。蛋糕的质量不依赖于面包师的天资,反而是成分的准确选择和计量,以及严格遵循配方的结果。客观质量会在一个反馈回路中以制造、应用、提炼的形式不断向主体经验逼近。这种形式的质量适合于算法、测试套件和软件工具。在本章的其余部分,我将介绍一种通过客观质量提高代码质量的方法。