技术债是什么
我们应该正视技术债,技术债并非永远都是一个负面词,它在某些情况下可以成为一种积极的手段,比如为了快速上线获取市场,为了应对紧急需求等。但是当技术债积累到一定程度时,同样会被反噬,影响业务发展和用户体验。我们可以用一个例子来做通俗化的解释,大部分人如果想要买房,最快的方案就是通过银行借贷,透支未来的收入,从而快速获得房子所有权,合理的借贷可以提前享受到对应的资源,但如果借贷的金额过多,自身收入又不足以偿还借贷的金额,就会出现个人财务危机,高额的利息会不断地翻滚,从而陷入死亡螺旋,被债务吞噬。对于技术债来说,业务压力大、时间窗口紧、开发资源不足时,可以通过借债的方式实现快速上线,并抢占市场,但是过度透支就会导致线上故障频发,影响用户体验和业务效果。
技术债同样也不是技术人员的专有词,产品设计和演化的过程中,如果不够合理,同样会带来技术债。如果一个产品方案一味增加复杂度,且没有考虑到新老方案的兼容,也会导致系统设计混乱,线上边界case异常频发。日常的开发过程中开发者不仅要对技术有一定的理解力,同样也需要对产品和业务有足够的认知,并且能够对不合理的需求提出专业的见解,与各方讨论并达成最佳方案,减少系统熵增。
开发团队本身能力和水平的限制,也会导致技术债的形成。对于开发者本身来说,需要不断强化自身能力,有较强的技术架构沉淀,针对不同类型的业务形态能够给出专业且有效的解决方案。没有好的架构设计,会导致代码结构混乱,最终难以维护。研发流程链路也要有完善的保障,通过代码评审、单元测试、集成测试等手段来保证代码质量,避免问题不断累积,然后悄然上线,从而酿成线上故障。
技术债的影响
技术债对业务的发展和用户体验会带来严重后果,导致线上问题频发,用户投诉变多,逐渐的影响到业务本身。虽然形成技术债的原因很多,但不同的业务出现技术债后,表现基本是一致的
- 用户投诉量增加,开发人员疲于应对各种问题。
- 线上告警增加,导致故障不能及时发现。
- 产品迭代困难,新功能实现成本变高,需要花费更多的时间。
- 业务数据指标异常,数据埋点不准确,无法做商业分析。
- 系统架构老化,性能指标下降,系统响应时间增加。
- 线上故障频发,导致用户对品牌信任流失
如何解决技术债?
把一个充满技术债的项目改造完,
从一个巨大的历史屎山中完成愚公移山式的改造,需要一个长期的计划和强有力的执行力。我在团队中通过梳理线上问题以及分析技术债形成的原因,制定了一套系统化的方案来化解技术债务问题,从而提升线上系统的稳定性。
识别核心问题
首先需要明确项目中的哪些部分存在技术债务,以及评估技术债务的优先级。这里要遵循的原则就是抓大放小,在人力有限的情况下,需要优先集中人力解决核心问题。
不同的业务都有其特殊性,所以需要针对不同的业务特点对产品链路进行摸排,这一步持续的时间会比较久,包含了对代码和项目的梳理,以及线上监控的完善和补充。通过线上舆情和告警锁定异常最高的链路,然后检查代码,确定问题。
这一步耗时比较久,需要耐心和毅力。
评估技术债
评估技术债的过程同样很复杂,如果是新接手的项目,会更加困难。这时候我们务必需要要求开发同学梳理清楚产品的核心链路,并补充完整的技术架构图和产品流程图。只有对产品逻辑和模块调用逻辑有清晰的了解,才能更好的评估技术债,才能更好的指定解决方案。这个过程不仅需要从技术角度进行梳理,还需要产品和业务团队一起配合才行,一定要完整评估风险,否则将酿成重大的线上故障。
制定解决方案
在技术债评估完成后,需要提出对应的技术解决方案,并指定一个偿还计划。从技术策略来说,需要分清楚几类问题
- 代码质量低、技术架构不合理 这种情况是最容易解决的,通过重构就可以完成,但同样需要有一定策略
- 提升团队能力,建立持续学习的策略,通过技术培训、code review和知识分享会,提升团队整体开发水平
- 建立良好的系分、编码标准、代码审查机制以及问题检测机制,保证代码质量,减少新的技术债产生
- 架构升级,通过抽象标准的研发模式,设定研发规范,逐步将复杂的业务进行解耦
- 合理分工,细化定义团队中每个成员的职责范围及写作模式
- 边界case覆盖不完整 通过梳理产品链路图以及舆情、监控等手段,逐步将边界case覆盖,遇到问题快速修复。
- 上下游配合问题 这种情况在有历史感的业务中最多,前后端分工不明确,亦或是业务压力大,上线时间仓促形成的妥协方案,但因为业务节奏过快,导致妥协方案没有进一步排期优化,导致代码中补丁逻辑多,业务逻辑异常复杂。这种情况下需要能够和上下游团队进行充分的沟通,设定边界,并推动上下游团队配合。虽然总结起来很简单,但是实际推进起来难度和阻力非常大,需要团队成员守住底线,同时需要有足够的沟通能力。
- 临时解决方案 高速发展的业务,上线时间都非常短,很多技术方案都是临时解决方案,以占领市场为首要任务。当增速放缓进入精细化运营的阶段,临时方案形成的巨大漏损就是绕不开的话题。有时候也可能是历史的局限性,选择了并不是非常合理的技术方案。这种情况下适合通过技术专项去推进解决,提升技术价值的同时,还能帮助产品数据有较大的上升。
- 产品流程设计不合理 上线时间比较短的业务一般不太可能出现这个问题,但如果是一个历史比较久的业务,产品团队成员更换多次后,就会出现新的业务流程和历史逻辑不兼容的问题。这个时候,只有代码是唯一可信的资料,一旦有老的逻辑变更,需要预留充足的时间完成系分设计,将整个代码还原为流程图,如果发现新老逻辑不兼容,需要和合作团队一起重新调整产品需求。最最最最重要的一点,做好线上监控部署,完善异常发现能力。
技术债的治理并不是简单的架构升级和代码重构,能够通过重构解决的都是最简单的问题。所以对于技术侧能够解决的问题,小步快跑,逐步迭代上线。但是对比比较大的涉及多方的重构,很难通过技术专项的形式去落地,需要和上下游团队一起沟通,形成共识,并筹备一个较大范围的专项,落地效果也会更好,认可度也会更高,推进起来也会更顺畅。
如何说服产品和业务团队预留足够的时间做比较大规模的重构?这时候就需要开发人员具备一定的数据分析能力,数据不会骗人,并且有足够的说服力。懂数据懂业务,这才是能够和业务团队高效对话的前提。
落实计划
在制定好偿还计划后,整个过程需要团队成员的共同努力和协作
- 保持沟通:定期和业务方沟通,了解业务需求和用户反馈,确保偿还计划符合业务实际需求。
- 确保质量:在偿还技术债的过程中,需要保证代码质量,避免引入新的问题
- 定期复盘:定期对偿还效果进行复盘,分析偿还计划的有效性和可行性,并根据实际情况调整计划。
通过制定技术债日历,针对不同的治理项分配资源、确定时间以及明确责任人,通过责任到人,定期进行进度review,这个过程很长,所以要针对业务和产品需求紧张程度动态调整,避免影响正常的业务进展。
长期策略
技术债是一个长期积累的历史包袱,需要更多的协作方理解技术债务的成因,多一些理解,少一些质疑,多一些支持,少一些吐槽。在公司层面也需要推动建立技术债处理策略和文化,将技术债灌流融合到日常开发流程中,而不是一味避而不谈或者泛泛而谈。建立客观的评估指标,定期复盘和优化技术债管理策略,业务高速发展的同时也要稳住技术底盘。
总结
技术债并不是一个贬义词,我们应该灵活应用,但需要将技术债保持在一个可控的范围内,否则就会形成雪球效应。治理完技术债后,需要团队成员一起努力,守住标准,守住底线,避免新的技术债泛滥。