Loading

技术(shù)债,怎(zěn)么还?

2021-02-09 21:34:15 2347
球速体育平台和卓英软件
作者 | Kyle Brown
译者 | 平川(chuān)
策划 | 蔡(cài)芳芳
无论债务是怎样累积起来(lái)的(de),你都必须偿还(hái)。

本文最(zuì)初发布于(yú) Kyle Brown 的个人博客,经原作者授权由 InfoQ 中(zhōng)文站翻译并分享。

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

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

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

1第一步:评估你的(de)处境,弄(nòng)清楚(chǔ)你欠了多少

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

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

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

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

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

2第二步:停止引入新(xīn)债务

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

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

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

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

3第三步:选择债务偿还策略

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

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

4第四步:按计划(huá)行事!

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

5第五步:跟踪和评估进展

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

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

参考资料
[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
查看英文原文:
Paying Back Technical Debt
https://kylegenebrown.medium.com/paying-back-technical-debt-6038b0f27605


">

    球速体育平台-球速(中国)

    球速体育平台-球速(中国)