从事15年
网站建设的我今天想和大家讨论一下高质量代码的重要性。高质量代码的价值可能难以传达。一些经理将其视为笨蛋,对于过于挑剔的程序员来说是一种昂贵的爱好,因为投资于代码质量会在短期内减慢开发速度,而且似乎不会改变用户体验。但事实并非如此。
确实,对代码质量缺乏组织理解的科技公司可以快速启动并在短期内取得成功。但这样做时,他们会产生一种无形的债务,每次更改代码时都会增加。这笔债务不会长期处于无形状态。一旦产品超过了非常低的复杂性阈值,债务就会到期,逐渐消耗其开发团队的生产力和软件的可用性。当我们谈到“技术债务”时,这些就是我们所谈论的危险。
生产软件的组织处于一千个不同变量的交集处。凡是影响一个程序员的精神状态,他们的团队内部沟通,或连接到其工作的积极性很可能在他们的代码中得到体现。因此,提高代码质量在一定程度上是改善组织健康和整体能力的问题。在本文中,我将简要定义代码质量并解释它如何影响整个公司,然后将一些可有效提高代码质量的组织习惯归零。
在某种程度上,学习编码就是学习与机器产生共鸣:它对细节的高度关注,需要匹配的括号和一致的大小写,以及它对错误状态的无助。这些需求可能是如此陌生和不透明,以至于我们中最有经验的人仍然要花费数小时甚至数天的时间来寻找相当于源代码几个字符的错误。这是征税。有时,对我们的机器产生共鸣是我们所能处理的。在这些情况下,我们依靠一个简单的指标:它是否能完成工作?由于代码的首要目的是完成一项工作,因此有时我们不会超越这一点。
但是,除了最小的项目之外,这种方法对于任何项目都是不可持续的。代码不是数独,每个问题都有一个正确的解决方案。编写任何计算任务的方法有无数种,有些方法比其他方法更简单、更可预测。随着时间的推移,这里的微小差异会累积起来。代码编写一次,阅读一千次。程序员在修复错误或添加功能时阅读代码。他们阅读代码来记住他们的应用程序是如何工作的。他们阅读代码以发现可以在其他地方重用的模式。唯一比阅读代码更频繁地执行代码的事情就是执行它。这是我们关注代码质量的根本原因。一段代码的有用性与它对阅读它的人的影响有很大关系. 当我们编写好的代码时,我们为他们节省了时间和精力。我们正在让他们的工作更轻松。我们正在进行一项投资,日复一日、年复一年地支付股息,直到应用程序达到其生命周期的尽头。
因此,具有讽刺意味的是,一旦我们训练了我们的思想对计算机产生共鸣以便我们可以编写工作代码,那么我们就有责任记住如何与人类产生共鸣,这样我们的代码就不会让他们感到沮丧。
从机械角度来看,代码质量是什么样的?多 书 已经 被 写关于这个问题,所以我不会尝试深入讲解。但总的来说,高质量的代码是可以快速理解的代码。如果程序员可以从代码库中随机选择一个方法或类并在几分钟内深入理解它——不仅仅是它的功能和业务逻辑,而是它所依赖的一切以及它可能使用的每一种方式——而无需查阅太多其他文件,那么代码库可能是高质量的。一旦实现了这一点,代码是否能正常工作的问题就不那么重要了;它可以被更改、修复或删除,无需太多风险或努力。
当然,我在这里描述的是一个哲学理想。在现实世界的应用程序中,总会有一些部分不可避免地复杂或令人困惑。但即使是这些作品的质量也有很大差异。不存在代码质量完全脱离程序员控制的情况。影响代码质量的几个最重要的因素是:
1封装。高质量的代码通常由自包含组件组成:不能通过修改自包含组件外部的东西来改变它的行为,组件也不会修改它外部的东西(在合理范围内——它使组件读取和更新数据库的意义,如果这被理解为它的工作)。这节省了开发时间,因为当需要修复、更新或删除组件时,程序员花更少的时间搜索外部原因和影响。
2惯用代码。现代编程语言具有用于最常见任务的内置语法和方法,例如将字符串转换为数字或确定集合是否包含特定元素。这些比程序员从头开始编写的任何东西都更可靠、更高效、更广为理解,并且比自定义方法需要的代码少得多。以惯用方式编写的代码——即尽可能多地使用一种语言的约定和内置特性——更具可读性并且需要更少的维护。
3有意义的名字。代码库中的变量和方法由编写它们的程序员命名。无意义的名称,如 `x` 或 `fn`,要求程序员在阅读使用它们的代码时理解和记住额外的上下文层。如果在一个地方有多个这些,则不可能将所有内容都保存在工作记忆中。高质量的代码使用特定和描述性的变量名称,例如 `departmentName` 或 `getAnnualExpenses`。尽管这里可能过于冗长,但对于第一次阅读代码的程序员来说,与其说太少,不如说一个说得太多的名字。
4低圈复杂度。任何时候计算机做出决定,就像 if 语句或 for 循环一样,后面的代码会增加一层含义:在一个条件下,代码将被执行或重复;在另一种情况下,它将被跳过。“圈复杂度”是指流程中存在的决策数量的指标。与前一点一样,随着含义层数的积累,程序员的工作记忆可能会成为瓶颈。虽然决策对于应用程序的有用性至关重要,但高质量的代码可以最大限度地减少决策点及其包含的代码,并尽可能避免将它们相互嵌套。
重要的是要注意,虽然代码质量包括一些可以衡量的因素,但代码质量的每一个具体衡量标准都是不完美的,而且很容易被玩弄。没有任何产品或工具可以自动和明确地评估代码库的质量。但是,您可以使用启发式方法来了解代码质量并查看可能存在的问题。
例如,单元测试是测试应用程序行为的代码片段。它们以快速且可重复的方式执行此操作,确保应用程序随着它的增长和变化而继续正常工作。与低质量代码相比,单元测试更有可能伴随高质量代码。他们奖励和鼓励质量,因为构成良好代码的东西——封装、松散耦合、简洁、简单等——也使测试更容易。这改变了程序员的阻力最小的路径:如果他们正在为以前未测试的代码编写单元测试,有时简化和重新排列该代码比以当前形式测试它更容易。如果程序员知道他们将编写单元测试作为开发过程的标准部分,那么他们首先会被激励编写更好的代码。