Loading

技术债,怎么还?

2021-02-09 21:34:15 2347
PT真人和卓英软件
作者 | Kyle Brown
译者 | 平川
策划(huá) | 蔡芳芳
无论债务是怎样累积起(qǐ)来的,你都必须偿还。

本文最初发(fā)布(bù)于 Kyle Brown 的个人(rén)博客,经原作者授权由(yóu) InfoQ 中(zhōng)文站翻译并分享。

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

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

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

1第一步:评估(gū)你(nǐ)的处境,弄清楚你欠了多少(shǎo)

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

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

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

通常(cháng),最好是请一(yī)个外(wài)部专家来帮助你评估项目状态。引入(rù)一名(míng)外部人员让你可以获得一份(fèn)纯粹是(shì)基于解决方案技术(shù)优越性的(de)评估,而不受(shòu)办公室政治或个人对某些代码的情感所影响。

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

2第二步(bù):停止引入新债务

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

为了(le)修复发现的问题(tí),你(nǐ)必须(xū)花时间来实现修复,这(zhè)意味着(zhe)你在纠(jiū)正(zhèng)问题(tí)时会搁置新(xīn)的(de)开发。关于这一点,没有什么完美的方法,无论你采取什么方法,你都需要与业(yè)务(wù)协商如(rú)何平衡技(jì)术债务偿还和新功(gōng)能开(kāi)发。下面(miàn)是(shì)一些我们认为有效的策略。

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

采用贝塔测试。如果你构建(jiàn)的基础(chǔ)设施可以支撑两个网站(zhàn)(一(yī)个是主网(wǎng)站,另(lìng)一个是“测试”网(wǎng)站),那(nà)么你可以(yǐ)在重构主(zhǔ)代码流的(de)同时继续在测试网站(zhàn)上开发新功能。这(zhè)样(yàng)做的好处(chù)是不会减慢任何新功能开(kāi)发的速度,但代(dài)价是,当(dāng)对测试站点的更改必须重新集成到主站点时,集(jí)成难度(dù)会(huì)增加(jiā)。

3第(dì)三步:选择(zé)债务偿还策(cè)略(luè)

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

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

4第四步:按计划行(háng)事(shì)!

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

5第五步:跟(gēn)踪和评估进展

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

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

参(cān)考资料
[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
查看英(yīng)文原文(wén):
Paying Back Technical Debt
https://kylegenebrown.medium.com/paying-back-technical-debt-6038b0f27605


">

    PT真人(中国)官方网站

    PT真人(中国)官方网站