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