每家软件开发商都有一定数量的技术债务,这是在短期内将不成熟的项目推向市场而在之后不断进行完善和补充的额外开发工作。技术债务可以表现为糟糕的设计决策、急需的重构、技术升级和未解决的问题。
就像承担金融债务一样,技术债务可以为企业争取更多的时间,但必须在未来以利息偿还。与金融债务一样,承担和管理技术债务也有明智和不明智的方法。
本文将讨论快速还清技术债务至关重要的原因以及失败的后果,以及如何解决软件开发人员在尝试优先处理技术债务时面临的一些常见问题。
为什么要减少技术债务?
首先解决最重要的问题:为什么要减少企业的技术债务?毕竟,企业的一些应用程序到目前运行良好,而且肯定还有更重要的功能工作需要完成。
虽然这种推理方式很容易让人接受,但企业会采用类似的方法来管理其金融债务吗?债务通常产生利息,如果偿还债务的速度很慢,其利息就会迅速增加。
如果你每个月只用信用卡支付最低还款额,那么最终可能会偿还原始借入金额的数倍。因此尽快摆脱金融债务显然是值得的。
偿还技术债务需要一些时间和精力,它确实让开发人员不能完成开发其他功能的工作。但是,尽早还清技术债务是值得的。
以下探讨一下软件开发商偿还技术债务的一些好处:
- 它可以让软件开发商在未来行动更快。
- 它可以让留住顶尖的人才。
- 它可以帮助软件开发商避免每隔几年重新编写整个应用程序。
(1) 行动更快
解决技术债务的一个常见阻力是,“我们没有时间”。那么管理技术债务会节省时间吗?
每当有人说没有时间偿还技术债务时,这通常是一种借口。事实表明,拉动圆轮的手推车比拉动方轮的手推车更容易、更快捷。然而,很多企业可能正在拉着方轮手推车却没有意识到这一点。
Martin Fowler在他发表的一篇名为“高质量软件是否值得付出代价?”的文章中阐述了解决技术债务和保持高代码质量的好处。
他表示,一些软件开发商无视技术债务并允许其代码库的质量下降。虽然他们一开始可能会更快地发布功能,但随着时间的推移,他们的交付速度会越来越慢。
糟糕的设计决策、开放的错误、过时的技术或任何可能的东西,最终都会导致功能开发停止,因为处理复杂和有缺陷的代码库变得越来越困难。另一方面,一些软件开发商了解保持高代码质量、解决技术债务和及早修复错误的重要性。
虽然他们在开始交付新功能方面确实起步较慢,但在很短的时间内,他们开始在向客户交付价值方面超过其他开发商。那是因为他们在维护代码库的正常运行方面所采取的谨慎措施可以防止随着时间的推移陷入困境。
(2) 留住顶尖人才
事实表明,未能解决技术债务的软件开发商会失去一些人才。因为没有人喜欢在一个具有缺陷的系统中工作,也没有人喜欢在很难取得进展的项目中工作。很少有开发人员喜欢使用“遗留代码”或使用已有几十年历史的技术。
那么当开发人员体验下降时,他们该怎么办?那些能够找到更好工作的开发人员将会离职。换句话说,企业的一些顶尖人才离职,而其他的员工将会由于缺乏所需技能以及其他原因留下来。
因此,如果企业想留住顶尖的人才,需要表明它与开发人员一样重视高质量的代码。
(3) 避免从头开始重写应用程序
为什么企业要从头开始重写他们的应用程序?有时候,这是一个很充分的理由,例如他们需要摆脱过时的技术,同时实现平台的现代化。
但通常由于开发速度问题,需要从头开始重新编写应用程序,而开发人员的体验将变得很痛苦。软件开发商不得不决定从头开始重新编写应用程序,并为此花费了数年的时间和数百万美元费用。
重新开始开发一个新项目也许很有趣。开发人员可以选择最喜欢的编程语言和工具,并且可以“以正确的方式”设计一切。当然,其他开发人员在未来可能会对其代码产生是一种遗留应用程序的感觉。
但是这种情况可以避免吗?是的,如果企业优先解决技术债务并防止事情一开始就失控,可能就会避免完全重写应用程序。
为什么技术债务没有得到解决
软件开发商认为尽快减少技术债务是一件好事。那么为什么技术债务没有得到解决的情况如此普遍呢?
其中有几个原因:
- 开发人员认为功能工作更重要。
- 开发人员认为解决技术债务不是他们的问题。
- 开发人员与产品和工程管理人员相互推诿。
- 开发人员无法有效说服产品和工程管理人员。
以下为这些原因探索一些应对方法:
(1) 认为功能工作更重要
发布新功能很重要。因为没有功能,产品就没有价值。但是企业不能在开发全部功能之后才推出产品。
当有人表示功能工作更重要,并且不能优先解决技术债务时,那么功能工作现在真的更重要吗?客户真的会喜欢采用充满错误并且运营缓慢的应用程序?
企业需要为客户提供价值,那么一定要提供良好的用户体验,这意味着确保应用程序性能良好,并且不让客户感到沮丧或阻止他们使用错误的应用程序。
允许同时处理功能工作和技术债务的一个很好的折衷方案是在每个项目中花费大约70%~80%的时间开发新功能,每个项目花费20%~30%的时间来修复错误和解决技术债务。
(2) 技术债务不是开发人员的问题
如果开发人员有这种感觉,这可能是潜在工程文化出现问题的征兆。他们希望在这样的环境中工作,每个人都对代码库感到自豪,并具有主人翁感,并希望将其做到最好。如果没有相同的价值观和愿景,那么很难一起工作。
这里的解决方案是或者尝试在更积极的方向上影响工程文化,或者可以让一些开发人员离职去找到一个更适合的公司。
(3) 与产品和工程管理人员相互推诿
经验不足的开发人员可能有一些恐惧,因为他们可能会知道有一些重要的技术债务需要解决,这将导致内部冲突,但他们害怕表达这种担忧。也许是因为他们认为直言不讳会对他们产生不利影响,或者可能会危及他们的工作职位。
重要的是要记住,作为软件开发人员,通常了解企业在任何时间面临的技术债务数量。当技术债务继续被取消优先级或被忽视时,开发人员实际上有义务表达这些担忧,并不再推诿产品管理或工程管理人员。
(4) 无法说服产品和工程管理人员
第四个问题也许是最关键的问题。开发人员通常认为解决技术债务很重要,并且已经向产品管理和工程管理人员提出了这一点,但他们并没有听从。
在这种情况下,与其感到无助,不如更清楚地表达他的担忧。如果只是说“我们需要解决这个问题”,但没有提供任何明确的解释或原因,那么就不能有效地沟通。
开发人员应该提供背景信息,说明优先处理技术债务很重要的原因,以及这会给业务带来什么好处。用他们可以理解的术语来解释事物尤其重要。
例如,开发人员采用自己的术语进行解释:“我们真的需要花一些时间来测试,来增加我们在这个回购协议中的代码覆盖率。由于我们缺乏测试,经常会引入错误,我们必须在这些问题已经投入生产后花时间修复这些问题。让我们的测试套件处于更好的状态将使我们对代码更有信心,并确保我们的客户在使用应用程序时也有更好的体验。” 但这种说法可能并不能让产品管理和工程管理人员理解。
或者说:“我们现在有30个面向客户的错误。这些给我们的客户带来了糟糕的体验,甚至导致一位客户取消了与我们的合同。我真的认为我们需要修复这些错误,而不是开发一些新功能。”这将使产品管理和工程管理人员可以理解。
而这么说:“我们的持续集成管道花费的时间太长。我们必须等待一个多小时才能获得反馈以查看我们的构建是否通过,而这种延迟的反馈循环使得完成任务需要很长时间。我认为我们需要花一些时间优化构建,让它更快地完成,这样我们所有的工程师都可以更快地行动。试想一下,如果我们的构建每次运行快10分钟,100名工程师每天创建5次新构建,那么我们可以完成多少工作。每天节省的开发时间超过83小时(10*100*5/60)。” 这可能让产品管理和工程管理人员了解工作的艰巨性。
结论
承担技术债务是不可避免的。但是,选择如何处理技术债务可以决定运营的成败。希望开发人员受到启发并有能力解决目前在自己的角色中面临的技术债务。这样做将使企业成为更好的工作场所,并为用户带来更好的体验。