作者:Paul Gillin演说家、作家和B2B内容营销策略师,TechTarget的创始总编辑,曾担任《计算机世界》杂志的总编辑兼执行编辑长达12年。
大多数软件开发人员都很熟悉技术债务,而编程专业以外的人就不一定知道了。但了解这个概念十分重要,因为它不仅存在于编程领域,也存在于短期决策可能影响长期结果的广泛场景。
什么是技术债务?
简而言之,当软件开发团队急于快速交付而忽略了代码质量时,就会产生技术债务,比如用户可能迫切需要某项功能,所以开发人员选择先部署“仅仅够用”的代码并打算在以后再修复和优化。如果最后没有重新检查和修复这段代码,这图一时方便的操作所带来的代价就是日后工作量的增加,就像不偿还贷款就会产生利息和罚金一样。技术债务本身不一定是问题,但如果日后产品优化不足或者任由异常的代码泛滥,就会成为一个不容小觑的问题。为了跟上市场快速变化的步伐,企业转向的敏捷开发在一定程度上加剧了技术债务的风险,开发运维(DevOps)促进频繁的代码发布和持续不断的改进,每天甚至每几个小时就需要推送新代码,开发人员可能会迫于压力而在文档规则或测试上“走捷径”。
技术债务实例
“计算机千年虫危机”正是一个经典的技术债务案例。在六十年代和七十年代,许多软件开发人员为了节省宝贵的内存而只使用两位十进制数来表示年份,比如“1973年”被存储为“73”而不是“1973”。这种做法持续了多年,甚至在内存价格下降的时候也是如此。许多这样的程序被嵌入到运营业务中,并且使用的时间远远超过了人们的预期。随着2000年的临近,数千家企业和政府机构意识到当系统进行跨世纪的日期处理运算时就会出现错误的结果,进而引发各种各样的系统功能紊乱甚至崩溃,因此进行了大量疯狂的清理工作。据估计,解决“千年虫问题”花费了近千亿美元。
另外,技术债务并不止发生在软件上。比如网络安全领域的一项最佳实践是将文件权限授予组织内的角色而不是个人。假设一名行政助理得到了上级的批准,可以临时访问他平时无权查看的敏感文件。如果IT组织批准了这一例外,但在后来没有撤销权限,那就等同于把敏感文件的永久访问权授予了一个最终可能被入侵并出现漏洞的帐户。
技术债务的影响
如果短期内能够迅速修复并且开发人员知道如何处理技术债务,那么技术债务几乎不会产生坏处,甚至促使企业快速响应机会或问题而带来好处。
但当技术债务层层叠加时,修复工作因为缺少文档记录或者根本没有文档记录,且当执行修复工作的开发人员离职后,企业对这段代码只能束手无策,不知其义何谈修复。任何冒然的更改都可能会导致程序失败或运行缓慢,企业怕承担该风险就不愿做出改进,使得创新速度减慢。
技术债务的类型
技术债务主要分为有意产生和无意产生。开发人员培训公司Construx的首席执行官Steve McConnell将有意产生的技术债务定义为根据战略故意承担的技术债务,将无意产生的技术债务定义为“因为做得不好而产生的非战略结果”。
2014年,一群学者制定了技术债务分类法,将技术债务分成13种不同的类型,包括架构债务、代码债务、缺陷债务、设计债务、流程债务和测试债务等。这种分类法涵盖了所有因短视思维而可能导致的长期问题的场景,因此十分实用。
技术债务的产生
有意产生的技术债务是刻意做出的决定,因此应记录成文档并安排重构。而无意产生的技术债务发生的原因可能是临时措施产生了修改或添加并且没有特意制定代码重构计划,也可能是由于缺乏技术知识或未能遵守开发标准而导致的不良设计决策。例如,当测试套件不完整或者为了方便而缩短或跳过测试环节时,就会无意产生测试债务。
文档债务是一种十分常见的技术债务,发生的原因是开发人员没有完整记录他们的代码。从长远看,如果有人在离开公司时没有留下帮助别人理解其代码的线索,就会产生严重的问题。文档债务是造成“千年虫问题”的一个主要原因。
技术债务的预兆
技术债务的“预警信号”有:
由于开发人员缺乏对代码库的深入了解而导致项目陷入困境;
由于复杂性或缺乏文档而出现难以修复的错误;
错误修复后产生了新的错误或性能稳定下降。
技术债务的预防
要知道如何处理技术债务,首先要有健全的开发实践,比如DevOps环境中的测试左移和右移。测试左移是指将测试流程提前到整个开发周期中,以便在生产之前预见并解决问题。测试右移是指在应用进入生产阶段后收集反馈,以便在软件被广泛使用之前提前发现并修复错误。这些预防措施可以防止产生更大的问题。
造成技术债务的临时措施不可避免,但开发人员必须记录在案,包括原因和修复说明。也可以通过定期审查现有代码,让团队成员互相检查工作,主动发现文档的缺陷或异常代码。
了解技术债务的重要性
有人说现在每家公司都是软件公司,每年构建的软件数量持续快速增长。就连重工业企业也在为了让客户从购买的产品中获得更多价值而挖掘数据。
与此同时,开发部门需要将项目快速投产,忙碌不堪的开发人员自然会“走捷径”,而项目经理应该予以理解并向团队强调测试和文档记录的重要性。
有哪些最佳实践?
采用DevOps技术的企业应该明确什么是技术债务并采取敏捷的策略加以管理。企业可以使用测试右移和左移以及A/B和金丝雀测试技术在问题失控之前发现问题;另外,同行代码审查能够从新的视角检查开发人员的工作。开发人员应该使用一套统一的规定工具和语言,并有一份每个阶段需要完成的任务清单。有效率的DevOps部门不但提供开发人员足够的自由度以构建应用,同时制定软件开发规范以确保开发质量。
低代码开发平台—减轻技术债务的好工具
为了更加有效地减轻技术债务,企业可以在每次变更模块时使用自动化测试对每项代码的改动进行多轮调试;通过建立强制文档化等健全的代码结构流程;将程序员安排成两人一组,使他们可以了解彼此的决策;使用项目管理工具可视化团队中每个人的工作状态等。
此外,使用低代码和无代码工具编写的软件日益增加。由于流程图和拖放技术能以可视化的方式呈现逻辑和预期结果,因此这些软件很大程度上实现了自动归档。此外,所生成的代码可以按原计划运行,也可以出于自定义或性能目的进行修改,开发经理应该鼓励团队使用低代码和无代码技术,以提高生产效率。