工程

技术债务正在扼杀你的初创公司。 以下是修复方法。

| 10 分钟阅读
黑暗工作区显示器上代码的特写

您的工程师花费42%的工作时间处理技术债务和不良代码。 不构建功能。 不运送产品。 修复某人六个月前因为截止日期是昨天而采取的捷径。

对于一家拥有 5 名开发人员、每人收入 10 万美元的初创公司来说,这大约相当于每年 125,000 美元工程薪水用于偿还债务。 在全球范围内,技术债务每年给公司造成的损失超过 2.4 万亿美元。 而且复合情况会变得更糟:债务不受管理的团队发现冲刺速度在 12 个月内下降了 30%。

技术债务不是代码问题。 这是一个商业问题。 它有一个修复。

现实世界中的技术债务是什么样的

“技术债务”这个词听起来很抽象。 症状是具体的。 您的团队说“我们需要重构它,然后才能添加新功能。” 一个模块中的错误修复会破坏其他两个模块。 新工程师的入职需要三周时间,因为没有人能够解释身份验证服务的工作原理。 第二个月需要 10 分钟的部署现在在第八个月需要 45 分钟,因为测试套件很不稳定,并且构建管道用胶带将其固定在一起。

技术债务以可预测的方式累积:

  • 速度驱动的快捷键:您在没有测试的情况下发布了一个功能,因为投资者演示是在周五。 该功能有效,但没有人知道当它收到意外输入时会发生什么。
  • 复制粘贴代码:相同的业务规则存在于四个地方。 当规则发生变化时,有人会更新其中的三个并错过第四个。
  • 过时的依赖项:你的框架落后了两个主要版本。 您的版本的安全补丁已于上个季度停止。 现在升级需要接触 40 个文件。
  • 没有文档:设计支付流程的工程师六个月前离开了。 该代码的注释为零。 新工程师通过读取数据库查询对流程进行逆向工程。
  • 硬编码值:API 密钥、功能标志和业务规则直接存在于源代码中,而不是配置文件中。 更改定价层需要代码部署。

这些本身都不是灾难性的。 他们共同创建了一个代码库,其中每个更改都会带来风险,每个功能都需要比应有的时间更长的时间,并且每次冲刺都感觉比上一次慢。

为什么初创公司比其他人积累债务的速度更快

42% 的初创公司失败是因为他们的产品没有市场需求。 创始人知道这个统计数据。 因此,理性的反应是:快速交付,验证需求,稍后再担心代码质量。 这是正确的本能。 没有人想要的完美架构的产品是毫无价值的。

问题不在于承担债务。 问题是永远不会还钱。 大多数初创公司将技术债务视为他们开设的信用卡,但从未计划还清。 他们在第二个月采取了捷径,然后在第三个月采取了另一种捷径,到了第八个月,利息支付消耗的工程时间比功能开发还要多。

工程师花费每月2至5个工作日关于技术债务。 高达 25% 的工程预算将用于维持您在信息和时间较少时做出的决策。 对于一家只有五人的初创公司,这意味着一名全职工程师的产出完全用于偿还债务。

复合效应是杀手。 第三个月,债务会让你的速度减慢 10%。 第六个月,这一比例为 20%。 到第 12 个月,您的冲刺速度已从峰值下降 30%。 需要一次冲刺的功能现在需要两次冲刺。 错误数量攀升。 工程师士气下降。 你最好的开发人员开始在其他地方面试,因为他们厌倦了与代码库战斗而不是构建产品。

四种类型的技术债务(以及首先修复哪些)

并非所有债务都是平等的。 将其视为单一类别会导致要么忽略所有问题,要么尝试立即修复所有问题。 两者都不起作用。

深思熟虑且谨慎

“我们知道这是一条捷径,我们将在发布后修复它。” 这是健康的债务。 您做出了一个明智的决定,以牺牲代码质量来换取速度,并记录下来。 关键词是“记录”。 如果没有人跟踪这条捷径,那不是故意的; 它被遗忘了。

故意和鲁莽

“我们没有时间进行测试。” 这就是杀死初创企业的债务。 团队知道代码很脆弱,但无论如何还是发布了它,并且没有计划重新访问。 它会一直工作,直到失效为止,当它出现故障时,它会在周六凌晨 2 点停止生产。

不经意又谨慎

“现在我们已经构建了第一版,我们了解了应该如何设计它。” 这笔债是不可避免的。 你通过建造来学习。 对 100 个用户有意义的架构很少对 10,000 个用户有意义。 这种类型的债务标志着成长和学习,偿还债务是最有价值的,因为团队确切地知道更好的解决方案是什么样的。

不经意且鲁莽

“什么是数据库索引?” 这不是债务;而是债务。 这是一种技能差距。 解决方案不是重构。 这是招聘或培训。 如果您的团队不知道什么是好的,那么再多的冲刺分配也无法修复代码库。

修复优先级:从故意鲁莽的债务开始(“没有时间进行测试”类别)。 它的风险最高,复利最快。 然后解决无意谨慎的债务,您的团队已经知道更好的解决方案。 记录审慎的债务并安排它。 通过招聘和代码审查标准解决无意鲁莽的债务。

一种无需停止功能工作即可偿还技术债务的系统

团队犯下的最大错误是:安排“技术债务冲刺”,让所有功能工作停止两周。 领导层讨厌它,因为没有明显的进展。 工程师讨厌它,因为两周不足以修复六个月积累的捷径。 每个人都输了。

这是一个有效的系统。

第 1 步:建立债务登记册

创建一个共享文档或项目板(一个简单的电子表格即可),其中包含四列:位置(文件或模块)、债务描述、业务影响(这会减慢或面临哪些风险)以及估计的修复工作量。 让团队中的每位工程师花一小时添加项目。 您最终将得到 20-50 个条目。 这是你的债务清单。

在两个轴上对每个项目进行评分:风险(导致生产事件或阻止功能的可能性有多大)和工作量(修复需要多长时间)。 高风险、省力的项目排在列表的顶部。 低风险、高努力的项目会被归到最底层。 这不是需要清理的积压工作;而是需要清理的工作。 它是一个可以连续提取的优先队列。

第 2 步:将每次冲刺的 10-20% 分配给债务削减

在由 5 名工程师参与的为期两周的冲刺中,10% 意味着一名工程师需要花一整天的时间来偿还债务。 20% 意味着每个冲刺需要两个工程师日。 这不是可选时间; 它像功能工作一样被安排、分配和跟踪。

数学:一个五人团队以 15% 的债务分配进行为期两周的冲刺,每月花费 7.5 个工程师日来减少债务。 一年多来,这就是 90 个工程师日的有针对性的改进。 足以在不停止功能交付的情况下转换代码库。

第 3 步:将债务工作附加到功能工作上

偿还债务最有效的方法:当你已经在该地区工作时解决它。 建立新的支付功能? 当您在那里时重构现有的支付模块。 添加新的 API 端点? 作为同一拉取请求的一部分清理 API 路由层。

这个“童子军规则”(让代码比你发现的更干净)在每个功能冲刺中分配债务偿还,而无需创建单独的票证或阻止产品工作。 在 Savi,我们的工程师在每个项目中都遵循这种模式。 当客户请求新功能时,我们的工作范围包括清理周围的代码。 客户在同一次交付中获得了新功能和更稳定的代码库。

第 4 步:衡量并报告债务指标

你无法管理你不衡量的东西。 每月跟踪三个数字:

  • 负债率:冲刺能力花在债务工作与功能工作上的百分比。 目标:10-20%。 如果超过 25%,则代码库需要更积极的干预。
  • 周期:功能从“进行中”到“部署”需要多长时间。 即使没有人抱怨,周期时间的延长也表明债务积累。
  • 事件频率:每个冲刺的生产错误。 每个冲刺的错误越多,意味着债务引发的脆弱性就越大。 跟踪这一点以及部署频率,看看运输速度是否与破损相关。

每月向领导层报告这些数字。 技术债务是一个具有业务成本的工程问题。 当 CTO 说“我们将 12% 的工程时间用于债务维护,而六个月前为 25%”时,谈话就从“为什么工程师不构建功能”转变为“系统正在运行”。

预防:如何从第一天开始就积累更少的债务

偿还现有债务是必要的。 积累更少的新债务更好。 以下是投资回报率最高的做法。

  • 对每个拉取请求进行代码审查。第二双眼睛在它们合并之前捕捉到捷径。 评论不需要很长; 15 分钟的审查就能发现 80% 的债务创造模式。
  • 从第一周开始进行自动化测试。您不需要 100% 的覆盖率。 从关键路径上的集成测试开始:注册、结帐、产品要执行的核心操作。 这会增加 10-15% 的前期成本,并在六个月内节省 3-5 倍的错误修复时间。
  • 具有 linting 和类型检查功能的 CI/CD 管道。TypeScript 严格模式、ESLint 以及每次推送时的自动检查。 这些工具可以在所有错误进入生产环境之前捕获它们。 设置需要半天时间。 回报是永久的。
  • 架构选择的决策记录。当您的团队决定使用 Redis 进行缓存,或在 v1 中跳过 WebSocket 支持时,请编写两段注释来解释该决定和权衡。 六个月后,当有人问“为什么我们要这样构建它?”时,答案就存在,并且团队不会重新辩论已解决的问题。
  • 聘请高级工程师。首先,高级工程师会减少债务。 他们选择正确的抽象,预测扩展瓶颈,并从一开始就考虑到测试。 在 Savi,我们为项目配备了 1-2 名拥有完整堆栈的高级工程师。 他们发布的代码需要较少的维护,因为架构决策从第一天起就是合理的。

你每避免一小时的债务,就等于你节省一小时持续的软件维护成本。 带有测试和可靠架构的干净代码每年的维护成本为构建成本的 15-20%。 负债累累的代码成本为 30-50%。

何时寻求外部帮助

有些代码库已经超出了内部冲刺可以解决问题的程度。 如果您的团队超过 30% 的时间都花在了债务上,如果部署每周都会中断,或者如果您的工程师告诉您“我们需要重写这个”,那么您需要由过去一年没有关注过代码的人进行代码库审计。

外部审计需要 3-5 天的时间,并生成优先支付计划,其中包含按业务影响排名的特定文件、模块和架构变更。 审计员确定导致 80% 减速的 20% 债务,并制定您的团队可以在 8-12 周内执行的路线图。

在 Savi,我们通过人工智能加速的代码分析和高级工程师审查来运行这些审核。 AI 标记模式(重复的代码、缺少错误处理、过时的依赖项、安全漏洞)。 工程师根据您的业务、团队规模和路线图来解释这些标志。 输出不是通用报告; 这是一个冲刺就绪的积压工作,您的团队可以在下周一开始执行。

技术债务是对您构建的每个功能、您修复的每个错误以及您雇用的每个工程师的征税。 让它复合的时间越长,成本就越高。 该系统很简单:清点债务,按风险和工作量确定优先级,分配一致的冲刺能力,衡量结果,并通过代码审查、测试和高级工程师防止新债务。 从这周开始。 你未来的速度取决于它。

常见问题

技术债务会给初创公司带来多少成本?

工程师 42% 的工作时间都花在了技术债务上。 对于一个 5 人团队,每位工程师 10 万美元,每年大约 125,000 美元的工资用于偿还债务,而不是功能开发。 在全球范围内,技术债务每年给公司造成的损失超过 2.4 万亿美元。

每个冲刺应该花多少时间来解决技术债务?

将每个冲刺的 10-20% 分配给债务削减。 对于为期两周的冲刺的五人团队来说,15% 意味着每月需要 7.5 个工程师日进行有针对性的改进。 一年多来,总共需要 90 个工程师日的清理工作,而且从未停止过功能交付。

技术债务有哪四种类型?

故意-谨慎(有固定日期的计划捷径)、故意-鲁莽(跳过测试,没有计划重新访问)、无意-谨慎(构建 v1 后吸取的教训)和无意-鲁莽(技能差距)。 首先解决故意-鲁莽问题; 它的风险最高,复利最快。

我应该进行技术债务冲刺还是持续修复债务?

不断修复债务。 专门的科技债务冲刺失败了,因为两周无法修复六个月累积的捷径。 将每个冲刺的 10-20% 分配给债务工作。 将清理附加到功能工作中:构建新的支付功能时,在同一拉取请求中重构现有的支付模块。

我什么时候应该聘请外部团队来解决技术债务?

当您的团队花费超过 30% 的时间在债务上、部署每周中断或工程师表示代码库需要重写时,请要求进行外部代码库审计。 审计需要 3-5 天的时间,并确定导致 80% 放缓的 20% 债务,从而制定一个冲刺就绪的还款计划。

相关阅读

深陷技术债务?

我们审核代码库并制定付款计划。 30 分钟通话,无推销。

与我们的团队交谈

联系我们

开始对话

告诉我们你的项目。我们将在 24 小时内回复,提供清晰的方案、预估时间线和价格区间。

电子邮件

hello@savibm.com

总部位于

阿联酋和印度