-
您的(de)位置:
- 网站首页
- > 新闻资讯
- > 技术(shù)前沿(yán)
您的(de)位置:
本(běn)文最初发布于 Kyle Brown 的个人博客,经原作者授权由(yóu) InfoQ 中文站翻译并分(fèn)享。
让我们面对(duì)现实吧,2020 年是奇怪的一年。其中(zhōng)有一个奇怪的小现象,自(zì) 2012 年以来,美国的个人储蓄率首次出(chū)现增长(而且是以惊(jīng)人的速度(dù)增长),而不是保(bǎo)持基(jī)本稳(wěn)定 [1]。虽然这其中大部(bù)分都与流(liú)行病有关,但这也许可以在一定(dìng)程度上表明(míng),消费者已经开始意识到,你不能一直借钱而不偿还你所欠下的债务。我希望(wàng)企业能够意识到(dào),同样的原则也(yě)适用于技术(shù)债务,就像适用于金融债务一样。这个类比可能会让一些人觉(jiào)得不太舒(shū)服(fú),但这实际上是(shì)一个(gè)非(fēi)常著名的思想,它最早是由 Ward Cunningham 在 15 年前提出 [2],并由 Joshua Kerievsky 在 2005 年进一步发展 [3]。
简单(dān)地说,当(dāng)开发团队为了完成其他活动而放弃(qì)重要的(de)软件开发活动(dòng)时(shí),就(jiù)会产生技术(shù)债务(wù)。通常,他们的想法(fǎ)是,他们会“回过头(tóu)去”完成这项活(huó)动,但意图(tú)往(wǎng)往不会(huì)转化为活动。这(zhè)类活动可能(néng)非常简单,如(rú)编写文(wén)档(dàng),但也可能是更棘手的活动,比如修改一段代码,让它更容(róng)易理解(jiě)和维护,或者是更新因为(wéi)代码变化而过时的设(shè)计文档。
我最近在处理(lǐ)几个(gè)客户的(de)问题,我感(gǎn)觉自己(jǐ)就像一个消费(fèi)者债(zhài)务顾问,在(zài)和一对背(bèi)负着巨额抵(dǐ)押贷款的夫妇谈话,他们的(de)信用卡余额在不(bú)断增加,而且(qiě)他们的(de)孩子(zǐ)即将出生。在每一种情(qíng)况(kuàng)下,我(wǒ)们都快(kuài)要被技(jì)术债务压垮了,我们必须找到(dào)一些方法来减少债(zhài)务,同时继续开发新功(gōng)能并继续前(qián)进。我提出了一套实践方法(fǎ),步骤(zhòu)和信贷顾问(wèn)给他们客(kè)户的建议类似(sì)。让我(wǒ)们看看这些(xiē)步骤,看(kàn)看如何把(bǎ)他(tā)们应用于许多项目都面临的技术(shù)债务状况。
这一(yī)步最关键。一旦团队决定必须偿还他们的技术债务(这不(bú)是一个容易的决定——而且必须与业务一起(qǐ)做出),他们就(jiù)必须弄清楚他们(men)实(shí)际上欠了(le)多少债务(wù)。我发现(xiàn),最好的方法是进行自上而(ér)下(xià)的设计和代码审(shěn)查(chá)。
首(shǒu)先看看你的设计文档(dàng)。它是最新(xīn)的吗(ma)?它是否准(zhǔn)确地描述(shù)了设计中最重要的点?然后,你(nǐ)可能想(xiǎng)首先审查下代(dài)码的哪(nǎ)些(xiē)部分(fèn)给你带来了最大(dà)的麻烦——哪些部分最(zuì)难修改?哪些地方出错率最高?那些部分对你的业务(wù)来说最重(chóng)要?找出(chū)这些问(wèn)题的答案,可以(yǐ)帮助你(nǐ)对你需要做的(de)事情进(jìn)行排序,找出方法(fǎ)改善你的处境。
系统中并不是只有代码和文档(dàng)会导(dǎo)致技术债务。另一个需要考虑的(de)关键因(yīn)素是(shì)运营债务(wù)——例如,你是否运(yùn)行在数据库或应用程序(xù)服务器等平台软件构成的后台(tái)上?你的运营团队是否在手动执行应(yīng)该自动化(huà)完成(chéng)的任(rèn)务,既浪费时(shí)间又浪费(fèi)钱?你是否有(yǒu)适当(dāng)的监(jiān)控,以便在(zài)问题导致站点宕机之前发现问题,或(huò)者你是否把时间浪费在了事后分析上?
通常(cháng),最好是(shì)请一个外部(bù)专家(jiā)来帮助(zhù)你评估项目状态。引入(rù)一名(míng)外部人员(yuán)让你可以获得(dé)一份(fèn)纯粹是基(jī)于解决方案技术优越性的评估(gū),而不受办公室(shì)政治或个人(rén)对(duì)某些代(dài)码(mǎ)的情感(gǎn)所(suǒ)影响。
最终的评估需要(yào)描述(shù)需(xū)要更改的内(nèi)容(róng),按照优(yōu)先级(jí)进行(háng)排序,并(bìng)提(tí)出代码更改建议,以及列出的每个更(gèng)改的(de)估算成本。一旦你掌握了这些事实,你就可以开(kāi)始与业务所有者协商你要偿还哪些债(zhài)务以及以什么顺序偿还。
虽然上一步是整个计划中最重要的一步(bù),但(dàn)第二步通常会导致与(yǔ)业务最针锋(fēng)相对的讨论。其中最难的部分是(shì)学会组织文化变革,这样你(nǐ)就(jiù)不(bú)会让积累的债务超过合理(lǐ)的服务(wù)能力。就拿我们的金融债务(wù)来说(shuō),这也是(shì)一件非常(cháng)困难的(de)事情(qíng)——改变你的(de)消费习惯,只买你需要的(de)东西,而不是用信(xìn)用(yòng)卡购买(mǎi)你(nǐ)想(xiǎng)要的东(dōng)西,这是一件非常困难(nán)的事情。
为了修(xiū)复发现的问题,你必须花时间来实现修复(fù),这意味着你在纠正(zhèng)问题时会搁置(zhì)新的开发(fā)。关于这(zhè)一点,没有什么完美(měi)的(de)方法,无论你采取什么方法,你都需(xū)要与业务协商如何平衡技术(shù)债务(wù)偿还和新功(gōng)能开发。下面是一些我们认(rèn)为有(yǒu)效的策(cè)略。
在用户故事(shì)中包含债务偿还活动。如果前面的步骤(zhòu)已经形成了一组(zǔ)按大小分类并排(pái)好序的(de)活动(dòng),那么你可以与业务(wù)合作,确保在每个开发周期中都包含(hán)其中一部分(fèn)活动。比较难的是平衡债务偿(cháng)还活(huó)动(dòng)和涉及(jí)同一(yī)代码(mǎ)区(qū)域的新功能开(kāi)发。例如,如果你(nǐ)正(zhèng)在(zài)开发一个电子(zǐ)商务网(wǎng)站,并且你发现大(dà)多数问题都是(shì)发生在结帐时,你(nǐ)可能想要把涉及这一部分的新(xīn)功(gōng)能开发推迟到你偿还该部分的技术债务时(例如,重构代码(mǎ)或更新文(wén)档)。在这种情况下,在更改的过程中添加新的促销活动(dòng)或更改产(chǎn)品(pǐn)页面将(jiāng)是合理(lǐ)的选择。
采用贝(bèi)塔(tǎ)测试(shì)。如果你构建(jiàn)的(de)基础设施可(kě)以支撑两(liǎng)个网站(zhàn)(一个是主网站,另一(yī)个是“测试”网站),那(nà)么你可以在(zài)重构(gòu)主代码(mǎ)流的同时继续在测试网站上开发(fā)新功能。这(zhè)样做的好处(chù)是(shì)不会减慢(màn)任何新(xīn)功能开发的速度,但代价是,当对测试站点的更改必须重(chóng)新集(jí)成(chéng)到主站点时,集成难度会增加。
在这种(zhǒng)情况下,我(wǒ)们(men)可以和信(xìn)用卡债务偿(cháng)还策略做个对比,考虑两种不同的确定债(zhài)务偿还优(yōu)先级的方法。第一种可能的策略是“最高利率(lǜ)优先”。在信贷领域,这种策略是(shì)先偿还利(lì)率最高的信用卡(kǎ),因为这(zhè)类(lèi)信用卡(kǎ)支(zhī)付的(de)利息最高(gāo)。在技(jì)术领域,这意味着你可以首先考虑承担影响最大(dà)的任务。如果你(nǐ)解决(jué)了这些(xiē)问题,通常就可以(yǐ)为其他更改扫清障(zhàng)碍(ài),并且可能(néng)在性能、可维护性等(děng)方面获(huò)得最(zuì)大的回报。
另(lìng)一种可能的(de)策略是(shì)“最低余(yú)额优先(xiān)”策略。用信(xìn)用卡的(de)术语来说,这意(yì)味(wèi)着先还清余额最(zuì)低(dī)的信用(yòng)卡——事情很快就(jiù)完(wán)成(chéng)了,这会让(ràng)你立即(jí)获得一种(zhǒng)成就(jiù)感。对于(yú)技术债务,一个类似(sì)的(de)策略是首先处(chù)理最(zuì)小(xiǎo)的修复,如果你(nǐ)必须说服业务或管理人员偿还技术债(zhài)务,或者(zhě)如果你所(suǒ)在的(de)公司非常注重结(jié)果导向,只有快(kuài)速取得进展才(cái)能为更(gèng)大的工作争取到资金支持,这(zhè)会(huì)特别有用。
这里的关(guān)键是,让偿还债务成(chéng)为你长期活动的一(yī)部分。这不(bú)是一次性交(jiāo)易;对于“重构”[4] 这类术语,人们不再像(xiàng)几年前它开始流行时那样抱有幻想,因为(wéi)他们希望最好是可(kě)以从长期投资(zī)中获得(dé)短期结果。你总是会(huì)招致新的(de)债务;关键是确保你能在合理(lǐ)的时间内偿还,而不是让它(tā)越积越多。
最后,你需要能够报告你(nǐ)在债务偿还活动中取得的进展。采集一些指标,用于向管(guǎn)理和业务证明,花(huā)费在(zài)这些活动中的时间是值(zhí)得(dé)的,这点特别重要。例(lì)如(rú),很(hěn)多时(shí)候(hòu)你需要重(chóng)构代码来提(tí)高(gāo)性能,这时,手上(shàng)有正确的统计数据(jù)来显示用户体验的(de)改进是很重要的。同样,当(dāng)你在改(gǎi)进一个简单的代码(mǎ)库时,添加新特性的速度是另一个向业务证(zhèng)明(míng)价值的重要指(zhǐ)标。
遵循这些(xiē)步骤并不能解决技术债务(wù)相(xiàng)关(guān)的(de)所有问题(tí),但它们至少(shǎo)可以让你系统性地确定需要做什么,可以为开发过(guò)程带来(lái)什么价值,以及变更在多大(dà)程(chéng)度(dù)上(shàng)解决了问题。如果你坚持这样做,那么这应该(gāi)可以使你的开发(fā)工件更容易维护,并且(qiě)应该可以减少你的开发压力(lì)。