Loading

技术债,怎(zěn)么(me)还(hái)?

2021-02-09 21:34:15 2347
九游官方端入口和卓英软件
作(zuò)者 | Kyle Brown
译者 | 平川
策划 | 蔡芳芳(fāng)
无论债务是怎样累(lèi)积起来的,你都必须(xū)偿还。

本文(wén)最初发布于(yú) Kyle Brown 的(de)个人博客,经(jīng)原作者授权由 InfoQ 中文(wén)站翻(fān)译(yì)并分享(xiǎng)。

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

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

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

1第一步(bù):评(píng)估你的处境,弄(nòng)清楚你欠(qiàn)了(le)多少

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

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

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

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

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

2第二(èr)步:停止引入新债务

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

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

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

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

3第三步:选择债务偿还(hái)策略

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

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

4第四步:按(àn)计划行事!

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

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

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

遵(zūn)循这(zhè)些步骤并(bìng)不能解决技术债务相关的所有问题,但它们至少可以让你(nǐ)系(xì)统性(xìng)地确定(dìng)需要做什么,可以为开发过(guò)程(chéng)带来什么价值,以及变(biàn)更(gèng)在多(duō)大程度上解决了问题(tí)。如果你坚持这样做,那么(me)这应该可以使你的开发工件更容易维护,并且应该可以减少你的(de)开发(fā)压(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


">

    九游官方端入口-九游(中国)

    九游官方端入口-九游(中国)