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