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