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