Loading

技(jì)术债,怎么(me)还?

2021-02-09 21:34:15 2347
开云手机站入口和卓英软件
作者 | Kyle Brown
译者 | 平(píng)川
策(cè)划(huá) | 蔡芳芳
无论债(zhài)务(wù)是怎样累积起来(lái)的,你都必须偿还。

本(běn)文最(zuì)初发布(bù)于 Kyle Brown 的个(gè)人博客,经原作者授权由 InfoQ 中文站翻译并分享。

让我们(men)面对现实(shí)吧(ba),2020 年是奇怪的一(yī)年。其(qí)中有一个奇怪(guài)的小(xiǎo)现(xiàn)象,自 2012 年以来(lái),美国的个人储蓄率首次出现增长(而且是以惊人的速度(dù)增长),而不是保持基本稳定 [1]。虽然这其(qí)中大部分都(dōu)与流行病有关,但(dàn)这也(yě)许可以在一定(dìng)程度上(shàng)表明,消(xiāo)费者(zhě)已经开始意识(shí)到(dào),你不能(néng)一直借钱而不偿(cháng)还(hái)你(nǐ)所欠下(xià)的债务。我希望企业能够意识到,同样的原则也适用于(yú)技术债(zhài)务,就像适用于金融债务一样。这个类比可能会让一些人觉得不太(tài)舒服,但这(zhè)实际(jì)上是一个非常著(zhe)名(míng)的思想,它最早是由 Ward Cunningham 在 15 年前提出 [2],并(bìng)由 Joshua Kerievsky 在(zài) 2005 年进一(yī)步发展 [3]。

简单地说,当开发团队为了完(wán)成其(qí)他(tā)活动而放弃重要(yào)的(de)软(ruǎn)件开(kāi)发(fā)活动时,就会(huì)产生技术债务(wù)。通常,他(tā)们的想法是,他们会“回过头去”完成这项活(huó)动,但意图往往不会转化(huà)为活动。这类(lèi)活动可能非常简单,如编写文档,但也可能(néng)是更棘手的活动,比如修改一(yī)段代码(mǎ),让它更(gèng)容易理解和维护,或者是更新因为代(dài)码变化而过时的(de)设计文档。

我最近在处理几个客户的问题,我感觉自己就像一个消费者债务顾问,在和一对背负着巨额(é)抵押贷款的夫妇(fù)谈(tán)话(huà),他(tā)们的信用(yòng)卡(kǎ)余额在不断增加,而且他们的(de)孩子即将(jiāng)出生。在(zài)每一种情况下,我们都快要被技术债(zhài)务压(yā)垮了,我们必须找(zhǎo)到一(yī)些方法来(lái)减少债务,同时继续开发新功能并继续前(qián)进。我提出了一套实(shí)践(jiàn)方法,步骤和(hé)信贷(dài)顾(gù)问给他们客(kè)户的(de)建议类似。让我们看看这些(xiē)步骤,看看如何把他们应用于许(xǔ)多项目都(dōu)面临的技术债(zhài)务状况(kuàng)。

1第一步:评估你的处境,弄清(qīng)楚你(nǐ)欠了(le)多少

这(zhè)一步最关(guān)键。一旦团队(duì)决定必(bì)须偿还他们的技术债务(这不是一个(gè)容易的决定——而且必(bì)须与业务一起(qǐ)做出),他们(men)就(jiù)必须弄清楚他们实际上欠了多少债务。我发(fā)现,最(zuì)好的方法是进行自上而(ér)下(xià)的设计和代码审(shěn)查(chá)。

首先看(kàn)看(kàn)你(nǐ)的设计文档(dàng)。它是最新的吗?它是否准确(què)地(dì)描(miáo)述了设计中(zhōng)最重要的(de)点?然后,你可能想(xiǎng)首先审查下代码的哪(nǎ)些部分给你带来(lái)了最大(dà)的麻烦——哪些部分最(zuì)难修改(gǎi)?哪些(xiē)地(dì)方出错率最高?那些部分对你的(de)业务(wù)来说(shuō)最重要?找出这些问题的答案,可(kě)以帮(bāng)助(zhù)你对你(nǐ)需要(yào)做的事(shì)情进行(háng)排序,找出方法改(gǎi)善你的处(chù)境。

系统中并(bìng)不是只有代(dài)码(mǎ)和文档会导致技术债务。另一个需(xū)要考虑(lǜ)的关(guān)键因素是运营(yíng)债务——例如,你是否运行在数(shù)据库或应用(yòng)程序服务器(qì)等平台软件构(gòu)成的后台上?你的运营团(tuán)队(duì)是否在(zài)手动执行应该自动化(huà)完成的任务(wù),既浪费时间又浪费钱(qián)?你(nǐ)是否有(yǒu)适当的监(jiān)控,以便在问(wèn)题导致站点宕机之前发现问题,或者你是否把时间浪费在了事后分(fèn)析上?

通常,最(zuì)好是(shì)请一(yī)个外部专(zhuān)家来帮助你评估项目状态。引(yǐn)入一(yī)名外部人员让你可以获得一份纯粹是(shì)基(jī)于解决方案技术优(yōu)越性的评估,而不受办公室(shì)政治或个人对某些代码的情感所影响。

最终(zhōng)的评估(gū)需要(yào)描(miáo)述需要更(gèng)改的(de)内(nèi)容,按照优(yōu)先(xiān)级进行排序,并提出代码更改建议,以及列(liè)出(chū)的每个更改的估算(suàn)成本(běn)。一(yī)旦你掌(zhǎng)握了(le)这些事(shì)实,你就可以开始(shǐ)与业务所有(yǒu)者协商你要偿还哪些债务以及以什(shí)么顺序偿还。

2第二步:停止(zhǐ)引入新债务(wù)

虽然(rán)上(shàng)一(yī)步是整个计划(huá)中最重要(yào)的一步,但第二步通常会导(dǎo)致与业务最(zuì)针锋相对的讨论。其(qí)中最难的部分是学(xué)会组(zǔ)织文化变(biàn)革,这样你就(jiù)不会让积累的债务超过(guò)合理(lǐ)的服务能力。就(jiù)拿我(wǒ)们(men)的金融债务来说(shuō),这(zhè)也是(shì)一件非常困(kùn)难的事情——改变你(nǐ)的消费(fèi)习惯(guàn),只买你需(xū)要的东西,而不是用信用卡(kǎ)购买你想要的东西,这是一件(jiàn)非常困难的(de)事情。

为了修复发现(xiàn)的(de)问题,你(nǐ)必须花时间来实现修复,这意味着你在纠正问题时会(huì)搁置新的开发。关于这一点,没有什么完美的方法(fǎ),无论你采取什(shí)么方法(fǎ),你都需(xū)要与业务协(xié)商如何平(píng)衡技(jì)术债务偿(cháng)还和新功能开发。下面是(shì)一些我们认为有效的策略(luè)。

在(zài)用(yòng)户故(gù)事中包含债务偿还活动。如果前面的步骤已经形(xíng)成了一组按大小分类并排好序的(de)活动,那(nà)么你可以与业务合作,确保在每个开发(fā)周期中都包(bāo)含(hán)其中一部分活动。比(bǐ)较难的是平衡债务偿(cháng)还(hái)活(huó)动和涉(shè)及同一代码(mǎ)区域的新功能开发。例如,如果你正在(zài)开发(fā)一个(gè)电(diàn)子商务网站,并且你发现大多数问题都是发生在结帐时,你可能(néng)想要把(bǎ)涉及这一部分的新功能(néng)开发(fā)推迟(chí)到你偿还该(gāi)部分的技术债务时(例如,重构代(dài)码或(huò)更新文档)。在这(zhè)种情况下,在更改的过程(chéng)中添加新的促销活(huó)动(dòng)或更改产品(pǐn)页面将是合(hé)理的(de)选择。

采用贝塔测试。如果你(nǐ)构建的基础设施(shī)可(kě)以支撑两个网站(一(yī)个(gè)是主网站,另一个是“测试”网站),那(nà)么你可以在重构(gòu)主代码流的同时继(jì)续在测试网站上(shàng)开发新功(gōng)能。这样(yàng)做的好处是不会减慢任何(hé)新功能开发(fā)的速度,但代价是(shì),当对测试站点的更改必须重新(xīn)集成到主站点时,集成难(nán)度会增加。

3第(dì)三步:选择债务偿还策略

在这种(zhǒng)情况下(xià),我们可以和信(xìn)用卡债务偿还策略做个(gè)对比,考虑两种不同的确定债务偿还优先级的方法(fǎ)。第一(yī)种(zhǒng)可能的策略是“最高(gāo)利率(lǜ)优先”。在信(xìn)贷领域(yù),这种策略是先偿还利率最高的信(xìn)用卡(kǎ),因为这类信(xìn)用卡(kǎ)支(zhī)付的(de)利息(xī)最(zuì)高。在(zài)技术领域,这意味(wèi)着你(nǐ)可以首先考虑承担影响最大的任务。如果你解决了这些问题(tí),通常就可以为其他更改(gǎi)扫清障碍,并且可能在性能(néng)、可维护性等(děng)方面获(huò)得最大的回报。

另一种可能的策(cè)略是“最低余额(é)优先”策略。用信用卡(kǎ)的术语来说,这意(yì)味着先(xiān)还清余额(é)最低的信用卡——事情很快就完成了,这会让(ràng)你立即(jí)获(huò)得一种成就(jiù)感。对于技术债务,一(yī)个类似(sì)的(de)策略是首先处理最小的(de)修复(fù),如果你必须说服业务或管理人员偿还(hái)技术债务(wù),或者如果你所在的公司非(fēi)常注重结果导向(xiàng),只有快速取得进展才能为更大的工作争取(qǔ)到资金支(zhī)持,这会特别(bié)有用。

4第(dì)四步:按计划行事!

这里的关键是,让偿(cháng)还债务成(chéng)为(wéi)你长期活动的一部分。这不是一次性交易;对于“重构”[4] 这类术语,人们不再像几年前它开始(shǐ)流行时那样抱(bào)有幻想(xiǎng),因为他们希望最好是可以(yǐ)从长期(qī)投资(zī)中获得短期结果(guǒ)。你总是会招致新(xīn)的债务(wù);关键是确保你(nǐ)能(néng)在合理(lǐ)的时间内偿还,而不(bú)是让它越积越多。

5第五(wǔ)步(bù):跟踪和评(píng)估进展

最后,你需要能够报告你在债务偿还(hái)活(huó)动中取(qǔ)得的进展。采集一些(xiē)指标,用(yòng)于向管理(lǐ)和业务证明,花(huā)费在这些活动中的时间是值得的,这(zhè)点特(tè)别重要。例如(rú),很多时候你(nǐ)需(xū)要重构(gòu)代(dài)码(mǎ)来提高性能,这时,手上有正确的统计数据来显示用户体验的改进(jìn)是很(hěn)重要(yào)的(de)。同(tóng)样,当你(nǐ)在改进一个简单的(de)代码库(kù)时,添(tiān)加(jiā)新特性的速度是另一个向业务证明价值的重要指标(biāo)。

遵循这些(xiē)步骤并不能解决(jué)技术债务(wù)相关的所有问题,但它们至少可以让你系(xì)统性地确定需要做什么,可以(yǐ)为开发过(guò)程带来什么价(jià)值,以及变更在多大程度上(shàng)解决了问题。如果(guǒ)你坚持这样做(zuò),那么这应该可(kě)以使你的(de)开(kāi)发(fā)工件更(gèng)容易维护,并且应该(gāi)可以减(jiǎn)少(shǎo)你(nǐ)的开发压力。

参考资(zī)料
[1] https://fred.stlouisfed.org/series/PSAVERT
[2] Ward Cunningham,The Wycash Portfolio Management System,ACM SIGPLAN OOPS Messenger,April 1993
[3] Joshua Kerievsky,“Refactoring to Patterns”,Addison-Wesley,2005
[4] Martin Fowler,“Refactoring, Improving the Design of Existing Code”,Addison-Wesley,1999
查看英文原文(wén):
Paying Back Technical Debt
https://kylegenebrown.medium.com/paying-back-technical-debt-6038b0f27605


">

    开云手机站入口-开云(中国)

    开云手机站入口-开云(中国)