我们经常会碰到在项目迭代的中后期,代码变得臃肿、混乱的情况。后期参与到项目中的开发者,阅读、修改代码将成为一个让人头疼的大问题,也是团队开发效率的瓶颈之一。如何持续保证代码质量,是每个开发团队和开发者需要面临和解决的一个问题。

1. 苹果会腐烂,代码也会

我们在编写代码前,都会进行良好的设计。但是随着时间的流逝,人们不断修改代码,使得现有代码逐渐偏离初期的设计,代码结构逐渐崩塌,代码慢慢腐烂。

“在代码写好之后改进它的设计”听起来有些奇怪,这是不是因为自己初期代码设计有问题呢?一辆汽车我们需要时常进行保养,代码也是如此。否则面对丑陋的代码时,我们就会落入这样一种情况:如果修改,担心破坏了原有的功能,引发新的问题;如果不修改,现有的代码实在难以阅读,难以修改,有代码洁癖的开发者还会觉得难受。

任何代码的修改都需要一个验证环节,来保证修改的正确性。也就是说,代码修改后,开发者需要反馈。

2. 增加反馈

无论是增加新特性,还是修复 bug,都涉及到代码的修改。一般来说,我们修改代码后,对特性的验证是通过测试同学运行自动化测试脚本或者手动验证来进行的。换句话说,我们修改代码,然后祈祷修改有效,而且不会引发新的 bug。最后等待上帝给到我们测试通过的反馈。有时候这个等待过程会比较漫长。

没有编写相应测试的代码都是遗留代码。 ——《修改代码的艺术》

另外一种反馈周期短上许多的方法是给代码增加单元测试。单元测试有以下优点:

  1. 测试单元更小,一般来说是一个函数或类;
  2. 运行速度快,好的测试在毫秒级别;
  3. 能够帮助我们定位问题;
  4. 单元测试是对应代码的“需求文档”。

3. 测试驱动开发

测试驱动开发(Test-Driven Development)将测试的重要性推到了极致。在其开发流程中,开发者首先要做的就是编写一个失败的测试。TDD 核心开发流程为:红-绿-重构。如下图:

当开发者拿到一个需求时,首先确定需求模块对外接口,然后进行任务分解,将工作划分为不同功能点,最后针对每个功能点进入红-绿-重构的循环:

  1. 红:编写一个失败的测试;
  2. 绿:编写功能代码让测试通过;
  3. 重构:消除代码坏味道,优化代码,然后运行测试,检验功能是否完整。

4. TDD 的优点

测试驱动开发最直接的收益就是可以提高开发者的效能。

在开发一个功能模块时,比较耗时的部分有:设计、编码、发现问题、定位问题和修复问题。然而后三个部分占用了一般的工作时间。如果可以优化这些耗时,我们的开发效能将大大提高。

TDD 便可以做到。单元级别的测试能够保证我们在极小的粒度上发现和定位问题,运行所有单元测试,便可以找到出问题的部分。而针对函数级别的问题,我们也可以十分迅速的进行修复。

如果你想要成为一个高效的程序员,掌握 TDD 便是必要的。不得不说,当我了解测试驱动开发,走入 TDD 的大门时,便成为了它的拥趸者。

总结

本文主要介绍了代码会随着时间流逝腐烂,需要通过时常的修改代码来保证代码质量。这时需要通过增加测试的来验证修改后功能的完整。最后了解了测试驱动开发这一提高效能的研发流程。然而对于 TDD 的掌握,其中重要的一部分便是实践。以后有时间我们会介绍一下重构相关的方法和如何不断地让代码保持良好。

参考资料

Copyright © qingeneral.github.io 2023 all right reserved,powered by Gitbook该文章修订时间: 2023-05-28 13:25:06

results matching ""

    No results matching ""