初创公司在早期阶段,会不断寻找合适的产品—市场契合点。一旦找到契合点,企业通常会转向快速增长,这一阶段也常被称为“规模化阶段”。此时,公司会在多个维度上迅速扩张:收入增长、客户数量增加、员工规模扩大,组织复杂度也随之上升。
在过往实践中,海外某些技术团队曾与许多处于规模化阶段的公司合作,重点帮助它们突破增长过程中遇到的瓶颈。通过这些合作,我们观察到了一些反复出现的问题,也总结出了一些有效的应对方法。本文是“规模化瓶颈”系列文章的第一篇。
在这个系列中,我们会分析初创公司是如何陷入瓶颈的。很多时候,问题并不是因为早期决策完全错误;恰恰相反,这些决策在当时往往是正确的。只是随着公司发展,业务规模、团队规模和产品复杂度都发生了变化,早期适用的做法开始不再适用。增长本身会改变组织的工作方式,也会放大过去被忽视的问题。
我们还会梳理公司即将陷入或已经陷入瓶颈时的关键迹象,并进一步讨论如何突破瓶颈,帮助规模化公司更充分地释放增长潜力。
本篇文章首先讨论技术债务:当产品—市场契合开始带来增长时,那些曾经帮助团队快速实验、快速验证的工具和实践,应该如何随之演进。

技术债务瓶颈是如何形成的?
我们遇到的最常见规模化瓶颈之一,就是技术债务。许多初创公司都会把技术债务视为增长受阻的主要原因。
“技术债务”这个词经常被用作一个宽泛概念,用来指代技术平台和技术栈中各种需要改进的地方。团队可能已经感受到功能开发速度下降、质量问题增多、工程师挫败感增强等问题,并将这些现象归因于增长过程中技术投入不足所积累的债务。
因此,首先要做的是分析技术债务的类型和规模。问题可能出在代码质量上,也可能是仍在使用过时的语言或框架;可能是产品部署和运维尚未充分自动化,也可能是团队协作流程本身存在缺陷。相应的解决方案也会有所不同:有时只需要对团队流程做一些小调整,有时则需要启动专项项目,重构应用程序中的关键部分。
需要强调的是,适度的技术债务并不一定是坏事。尤其在创业早期,适度技术债务甚至是有益且必要的。初创公司为了加快产品交付,通常需要在某些技术细节上做出妥协,例如暂时牺牲一定的质量、稳定性或架构完整性。这有助于它们实现当下最重要的目标:建立可行的商业模式,打造经过验证的产品,并赢得客户认可。
但是,随着公司规模扩大,早期为了节省时间和成本而采取的捷径,就必须被重新审视。否则,这些捷径会迅速转化为业务增长的阻力。
下面来看两个典型例子。
A 公司:MVP 成为核心系统后的技术债务
A 公司打造了一个最小可行产品,也就是 MVP。这个产品在用户流量、用户反馈和收入等方面都展现出不错的数据,成功吸引了投资者,并帮助公司获得下一轮融资。
和大多数 MVP 一样,它最初的目标是快速验证想法、收集用户反馈,而不是构建高质量的技术架构。融资完成后,团队并没有重建这个试点项目,而是在原有基础上继续开发,持续增加功能,以维持用户增长。
起初,这似乎并不是迫在眉睫的问题。公司有一支精干且经验丰富的资深团队,他们熟悉业务,也熟悉系统细节,能够通过各种权宜之计维持系统正常运转。
真正的问题出现在团队长期专注于功能交付,却持续忽视债务偿还之后。随着时间推移,原本低质量的 MVP 逐渐变成了核心系统的一部分,但团队并没有为它规划清晰的改进或替换路径。代码变得越来越难学习、难使用、难维护,团队规模和功能范围也越来越难有效扩展。工程负责人开始担心,一旦早期工程师离职,关键知识也会随之流失。
最终,技术投入不足的问题全面暴露。团队陷入停滞,表现为开发速度下降、交付周期变长、团队士气受挫。公司不得不启动大规模重建,而这意味着功能开发放缓,也给了竞争对手追赶的机会。
B 公司:过度工程化带来的规模化问题
B 公司由一群有深厚工程背景的人创立,他们追求尽善尽美。系统从一开始就按照高度可扩展的目标设计,并采用了最新的库和编程语言。它拥有精细的架构设计,允许应用程序的不同部分使用不同技术实现,每个部分都经过优化,能够独立扩展。因此,当公司真正进入高速增长阶段时,系统可以轻松承载增长压力。
但问题在于,这套系统构建耗时过长,功能开发进展缓慢。许多工程师把大量时间投入到平台本身,而不是投入到产品功能和客户价值上。更重要的是,实验变得困难:由于架构过于细粒度,那些不符合现有服务边界的新想法很难快速实现。
最终,公司并没有找到足以支撑大规模客户群的产品—市场契合点,也就无法真正释放这套高度可扩展架构的价值。
这两个例子代表了两个极端。A 公司陷入技术债务瓶颈,最终影响公司运转;B 公司则过度设计解决方案,不仅拖慢开发速度,也削弱了团队在持续学习和迭代过程中快速调整的能力。
两者的共同点在于:都没有在技术投入与产品交付之间找到合适的平衡。
理想情况下,我们希望合理利用技术债务,支持快速功能开发和快速实验。当某些想法被证明有价值时,再及时偿还相关技术债务。这个道理说起来简单,真正做到却并不容易。
常见的技术债务类型
“技术债务”是一个含义较为模糊的术语,很多人会把它简单理解为代码问题。但在本文中,我们将技术债务定义为任何技术上的捷径:为了短期功能交付,而牺牲对技术平台的长期投入。
代码质量问题
脆弱、难以测试、难以理解或文档不足的代码,会降低所有开发和维护工作的效率,也会削弱工程师编写代码的成就感和积极性。
另一个常见问题是,领域模型及相关数据模型已经无法匹配当前业务模型,导致团队不得不依赖各种变通方案。
测试体系不足
缺乏单元测试、集成测试或端到端测试,或者测试组织方式不合理,都会让开发人员难以快速确认自己的代码没有破坏现有功能或依赖关系。
结果是,开发人员往往倾向于批量处理变更,部署频率随之降低。而更大的变更批次通常更难测试,也更容易引入缺陷。
系统和团队耦合过高
在单体架构中,模块之间经常存在较高耦合。随着团队数量增加,团队之间也可能相互阻塞。这会降低部署频率,并拉长变更交付周期。
一种解决方案是将服务拆分为微服务,但微服务本身也会带来新的复杂性。有时,在单体架构内部清晰划分边界,反而是更直接、更务实的做法。
未使用或低价值功能
未使用或低价值功能通常不被视为技术债务,但它们会带来技术债务的典型症状:代码更难维护。
功能越多,系统需要处理的场景就越多,开发人员也要考虑更多边界情况,交付速度自然会下降。初创公司会进行大量实验,因此团队应持续回顾并重新评估这些实验性功能是否真正有效。如果无效,就应该删除。
从情感上看,删除功能并不容易。但如果团队能够用客观数据量化功能价值,判断就会容易得多。
过时的库或框架
使用过时的库或框架,会让团队无法利用新版本带来的改进,也更容易暴露在安全风险之下。它还可能导致技能短缺,拖慢新员工上手速度,并让现有开发人员因被迫使用旧技术而感到沮丧。
此外,遗留框架往往会限制进一步升级和创新。
工具选择不当
第三方产品或工具可能性能不佳,也可能维护成本过高。市场环境变化很快,效率更高的工具可能已经出现。开发人员自然也希望使用更高效的工具。
购买现成产品与自行开发之间的取舍十分复杂,需要结合当前技术债务状况持续重新评估。
可靠性与性能工程问题
可靠性和性能问题会直接影响客户体验和系统扩展能力。团队需要谨慎处理,因为我们也见过另一种问题:为了假设中的未来场景过早优化,反而造成资源浪费。
与其推出一个尚未被验证但高度可扩展的产品,不如先推出一个已经被用户证明有价值的产品。后续文章将更详细地讨论可靠性和可观测性相关的规模化瓶颈。
人工流程过多
产品交付流程中某些环节尚未自动化。这些环节可能存在于开发人员日常工作流中,也可能与生产系统管理有关。
但需要注意的是,如果花费大量时间自动化一些使用频率很低、投入回报不高的流程,也可能适得其反。
自动化部署能力不足
早期初创公司可以采用相对简单的架构,但自动化部署需要尽早解决。小批量、增量式部署是实验型软件交付的关键。
团队可以参考四个关键指标来衡量交付能力。理想情况下,系统应该能够随时部署,通常至少达到每天部署一次的水平。
知识共享不足
缺乏有效信息也是一种技术债务。它会让新员工和相关团队难以快速上手。
作为标准实践,开发团队应编写简洁清晰的技术文档、API 规范和架构决策记录。这些资料也应能够通过开发者门户或搜索工具轻松找到。缺少审核和弃用机制来保障文档质量,则是一种反模式。
技术债务和功能问题有什么区别?
初创公司经常告诉我们,它们被技术债务压得喘不过气。但深入分析后,我们会发现,它们所说的问题有时并不是传统意义上的技术债务,而是技术平台能力不足。这类问题需要通过规划、需求收集和专门资源投入来妥善解决。
例如,有些团队需要实现客户注册流程自动化。它们最初可能采用单租户方案,自动化程度较低。早期这样做尚可接受:开发人员可以手动设置账户,并跟踪不同安装环境之间的差异。
但随着客户数量增加,开发人员会发现这种方式过于耗时。于是,公司可能会聘请专门的运维人员来设置客户账户。随着用户群和功能继续增长,管理不同安装环境会变得越来越困难,客户注册时间延长,质量问题也随之增多。
此时,自动化部署和配置,或者迁移到多租户架构,都会直接影响关键绩效指标。这已经属于功能能力建设问题,而不仅仅是技术债务问题。
其他形式的技术债务更难发现,也更难指出它们对业务的直接影响,例如难以维护的代码,或重复的小型人工流程。识别这些问题的最佳方式,是收集日常工作中直接遭遇这些问题的团队反馈。团队的持续改进流程通常可以处理这类问题,并不一定需要单独设立大型专项计划。
初创公司接近规模化瓶颈的迹象
价值交付周期变长
观察从想法产生到为用户交付价值的端到端流程,以及这一流程随时间变化的趋势,可以发现技术债务和其他问题造成的摩擦。
最终用户体验受影响
系统延迟、客户注册时间变长、质量问题增多,都会影响客户体验。而早期的技术捷径,可能正是这些问题的根源。
工程满意度下降
你的系统中其实存在两类“产品”:一类是面向用户的产品体验,另一类是面向员工和开发人员的工作体验。
倾听开发人员的抱怨,可以帮助你发现技术平台中的根本问题,判断哪些问题对他们影响最大,并据此确定优先级。
新开发人员难以上手
观察新员工的入职流程和满意度,可以暴露一些老员工已经习惯绕开的系统问题。
非功能性指标退化
运行时基础设施成本、性能和可用性等指标,都可能间接反映技术债务过高,并进一步影响业务结果。
如果你已经发现上述任何迹象,产品路线图可以帮助你判断应该在哪些方面加大改进投入。技术债务最大的负面影响,通常会出现在未来产品最依赖的平台部分。
如何突破技术债务瓶颈?
团队处理技术债务的方式,应源于领导者制定的技术战略。这种方法需要目标明确、路径清晰,并且要随着时间推移不断重新评估。
然而,我们经常看到团队沿用过去的做法,在不知不觉中制造未来的问题。对于这类公司,以下几个时机通常会触发对当前战略的重新评估:
新的融资意味着更多功能和更多资源,但这也可能放大现有问题。因此,解决当前技术债务应被纳入融资计划。
新的产品方向可能推翻之前的假设,并让系统中的某些新部分承受更大压力。
良好的治理流程应包括对技术现状的定期重新评估。
新的视角有助于避免“温水煮青蛙”的问题。外部帮助、团队轮换和新员工加入,都能带来有价值的新观察。
技术债务的滑坡效应
公司究竟是如何积累这么多技术债务的?原因往往很难准确定位。通常,这并不是由某一个事件或某一次决策造成的,而是一系列在压力下做出的决策和取舍逐渐叠加的结果。
具有讽刺意味的是,如果事后根据当时掌握的信息逐一审视这些决策,它们很可能都不能算错。然而,一次让步会引发下一次让步,循环往复,直到系统出现严重的质量问题。
通常会存在一个临界点:越过这个点后,偿还技术债务所需的时间,会超过创造增量价值所需的时间。
这种局面很难逆转,而且往往会像滚雪球一样越来越严重。开发人员会自然地以现状作为判断“可接受质量”的基准。在这种情况下,继续开发新功能只会制造更多债务。这就是滑坡效应:一个恶性循环。遗憾的是,随着实现下一个功能所需工作量呈非线性增长,系统最终可能走向崩溃。
设定技术质量标准
许多组织发现,制定一套公司承诺遵守的技术标准和实践,可以有效引导技术演进。
需要注意的是,有些技术实践很难真正做好,例如持续交付。在不影响用户的情况下定期部署,在技术上具有很高挑战。团队通常会在早期遇到问题,领导层也可能因此降低这类实践的优先级。
但更好的做法恰恰相反:更频繁地实践。只有这样,团队才能真正掌握这些能力,并形成良好习惯。当遇到困难时,不要放弃这种实践,而是利用反馈来指导后续的团队能力建设。
控制技术债务的爆炸半径
在业务规模化过程中,走捷径有时是必要的。但既然这些捷径最终都需要处理,甚至可能需要完全重建,那么我们应该如何限制它们的影响范围?
显然,我们需要一种能够最大程度降低业务影响的策略。一种方式是解耦团队和系统,使某个团队引入的技术债务被隔离在有限范围内,而不是像前文所说的那样滚雪球式扩散。
关于解耦的优秀资料已经很多,这里不再展开。建议重点关注微服务和领域驱动设计相关技术。不过,切勿操之过急。过早、过度解耦会增加系统延迟和复杂性;而团队之间不合理的领域边界,也会制造额外沟通摩擦。后续文章将进一步讨论与过度复杂的分布式架构相关的反模式。
产品与工程协作是技术债务治理的关键
如果业务战略、产品和工程之间的取舍讨论失衡,技术质量通常会最先下降,并最终影响产品质量。
当你寻找这一瓶颈的根本原因时,几乎总会发现问题出在公司内部业务目标、产品目标和工程目标之间的平衡上。缺乏协作通常会导致短视且孤立的决策。这种情况可能走向两个极端:在关键领域偷工减料,或者在不重要的地方过度投入。两者都可能发生,也都会造成问题。

任何时候,商业战略都应该清晰透明。
团队领导者应被充分赋权,能够做出有利于业务整体利益的决策。
产品和工程应处于平等地位,彼此信任,并愿意基于长期和短期业务影响做出权衡。
决策应基于数据,例如技术平台现状、估算结果、预期价值、KPI 改进分析、用户研究和 A/B 测试结果。
当数据更加完善,或团队获得新的认知时,应重新审视之前的决策。
在具体落地时,团队也需要把目标、客户反馈、需求评审、开发任务、测试发布和知识沉淀串联起来。PingCode 这类智能化研发管理工具,可以帮助企业将研发管理过程自动化、数据化、智能化,让技术债务治理不只停留在问题记录层面,而是融入从需求到发布的完整研发流程。
用技术战略限制技术债务的影响
在思考初创公司的技术战略以及规模化路径时,可以使用一个四阶段模型,帮助理解公司发展的不同阶段。
第一阶段:实验
这一阶段的重点是原型。原型通常是用于展示产品想法的半功能软件。随着市场兴趣增加,它会逐步演进为功能完整的软件。
第二阶段:取得进展
这一阶段需要做出生态系统层面的关键决策,例如云供应商选择、编程语言选择、服务集成方式等。
同时,团队需要用更可靠的软件替换核心系统中的原型代码。
还需要搭建初始基础设施,包括实验平台、持续集成与持续交付、API、可观测性和分析能力。
此外,团队应确定大致范围,并在代码中设定初始的软边界。
第三阶段:高速增长
这一阶段需要创建解耦的产品团队,让每个团队管理自己的服务。
团队还需要建立服务水平协议和质量标准,并将其与客户产品体验相关指标挂钩。
同时,应建立平台团队,专注于提升产品团队效率。
第四阶段:优化
这一阶段需要重新评估服务水平协议和质量标准,将重点放在长期生产力和可维护性上。
团队应审视技术平台现状,支持产品团队的关键举措,并组建临时精干团队,集中解决最重要的技术债务。
必要时,可以通过重建或购买相关能力来提高效率。
同时,还应对团队进行高质量技术实践方面的培训。
如何持续治理技术债务?
首先,要透明地共享信息,包括业务运营状况、当前产品方向、现有扩展能力指标、客户对产品的评价,以及客户支持和运营团队观察到的问题。这些信息能帮助技术人员做出更明智的决策。共享当前挑战相关数据,也能帮助技术人员理解问题所在,并衡量解决方案的效果。
所有产品及其相关系统都应具备明确的端到端所有权。随着团队壮大和职责增加,端到端流程的所有权往往会变得模糊,技术漏洞也会不断出现,最终形成技术债务。团队规模扩大后,找到旧代码的负责人也会越来越困难。此外,缺乏所有权还会削弱团队解决问题的动力。
团队必须被赋权去解决问题。处理技术债务应当成为产品开发自然流程的一部分。工程师和产品经理需要以务实态度,在技术债务和功能交付之间找到健康平衡。维护技术健康、保障产品可持续发展,是产品团队的职责,而不应是事后才考虑的事情。组织应建立一套持续处理和监控技术债务的流程。这需要工程负责人和产品负责人共同做出艰难取舍,以维持稳定平衡。
团队架构设计也是重要因素。例如,如果我们持续发现某些领域存在技术债务,就可能说明团队设计存在问题,需要围绕某个平台或业务能力建立更明确的关注和维护机制。
某些指标非常有效,例如扫描常见错误、测量构建时间和部署时间等。工程组织应提供自助式工具,让团队能够快速集成自己的系统。指标应作为团队决策的指导,帮助他们解决技术债务问题,而不是成为管理者监控或激励团队的工具。经验丰富的开发人员能够解读现有数据,并将自己的判断建立在基于事实的定性信息之上,从而创造价值。
我们支持团队自主性,但过度自主也可能带来问题,导致技术环境混乱。因此,组织应建立一些轻量级的制衡机制,例如自动化检查或架构同行评审,用来帮助执行技术策略,并为开发人员提供指导。
在跨职能协作较多的团队中,任务、项目、文档、日历、工时和审批等信息也需要被统一管理。Worktile 这类通用项目协作系统,适合用于承载团队协作中的基础流程,帮助业务、产品、研发和运营团队在同一协作语境下推进工作。
公司如何解决技术债务,取决于具体语境。许多公司普遍存在一个共同问题:急于“赶紧做点什么”。但这种做法往往只是权宜之计,很快又会引发新的问题。
相比之下,更有效的方法是采用迭代式方式,将技术债务治理融入当前开发活动,并用指标来指导相关投入。这样,团队既能持续交付业务价值,也能逐步改善技术平台的长期健康状况。
总结:技术债务不是问题,失控的技术债务才是问题
对于初创公司而言,技术债务并不一定意味着失败。适度的技术债务可以帮助团队更快验证产品方向,更快响应市场变化。真正的问题在于,当企业进入规模化阶段后,过去的技术捷径如果没有被识别、治理和偿还,就会逐渐演变为增长瓶颈。
因此,技术债务治理不应被视为一次性重构项目,而应成为产品开发、工程管理和技术战略的一部分。只有当产品、工程和业务团队共同理解技术债务的影响,并围绕长期价值做出权衡,企业才能在持续交付业务价值的同时,保持技术平台的健康和可扩展性。
文章包含AI辅助创作,作者:liu,如若转载,请注明出处:https://docs.pingcode.com/baike/5242347