重构的时机不是代码乱,而是业务痛:小团队 App 架构演进决策框架
小团队面对逐渐混乱的代码,重构冲动与功能压力并存。本文提出一套基于业务痛点的判断标准,帮助决定何时该忍、何时该动,并给出可落地的渐进式重构步骤。
重构的冲动人人有,但动刀之前先问一句:你疼在哪?
我刚做 App 那几年,每隔几个月就会陷入一个循环:新功能开发越来越慢,修一个 bug 要翻半天代码,于是我拍桌子说“重构”。然后花两周时间重写模块,结果上线后闪退频发,用户骂声一片,又花两周修回归问题。而最初拖慢开发速度那个痛点,其实只被缓解了六成。
后来我学会了一件事:代码混乱本身不是重构的理由,业务痛才是。
小团队资源有限,不可能像大厂那样定期做架构预算。每一次重构都是一次赌博——赌未来几个月的开发效率能覆盖当下的风险。而判断的标准,不是代码好不好看,而是你的业务迭代是不是真的被架构卡住了。
你遇到的是哪种痛?
我经历过几种典型场景,每种对应的决策完全不同:
1. 功能增量成本指数上升
记下你最近五次添加小功能(比如加一个设置项、改一个列表排序)的实际耗时。如果平均耗时比项目初期增加了 3 倍以上,并且每次都要改到 5 个以上文件(或类),说明架构正在拖累你。但这时候要区分:是模块划分不合理,还是只是代码风格差?前者需要重构,后者只要规范就能控制。
2. 修改 A 处必然破坏 B 处
这是典型的耦合过强。如果连续两次出现“改了支付流程导致登录报错”这种事,说明边界出了问题。这时候哪怕功能还在正常开发,也应该优先拆解依赖。
3. 新成员加入后,熟悉代码的时间超过业务理解的时间
小团队很少招新人,但一旦招了,你就能从他们脸上读出你的代码质量。如果新人在理解业务之前需要花大量时间理清跳转关系和类继承,那说明架构缺乏一致性。
4. 编译或构建时间让你分心
如果一个简单的界面调整需要等 2 分钟编译,小团队的注意力会被打断好几次。但编译慢不一定是架构问题,可能是依赖管理或模块化不够。这种痛可以通过拆分模块缓解,不必全量重构。
一个简单的决策矩阵
我给自己定过一组问题,回答“是”越多,重构的紧迫性越高:
- 当前模块的功能平均修改耗时 > 过去平均值的 2.5 倍?
- 过去一个月内,出现过 2 次以上跨模块的回归 bug?
- 团队中只有一个人能维护或理解这块代码?
- 新功能的需求明确,但因为代码耦合导致无法在合理时间内交付?
- 编译/构建/测试流程已成为日常开发的瓶颈?
如果 5 问中有 3 个以上“是”,可以考虑重构。但如果只是 1–2 个“是”,我建议通过局部优化或增加测试来缓解,不要大动。
渐进式重构才是小团队的出路
我踩过的坑告诉我,小团队不要搞“大爆炸式重构”。正确做法是:
第一步:给即将重构的模块画护城河。 先写集成测试,保证核心路径不崩溃。哪怕是简单的 UI 冒烟测试,也比直接改代码强。
第二步:用“提取”代替“重写”。 把经常改动的子功能抽成独立模块,保持调用接口不变。比如我之前的 App 里推荐算法逻辑嵌在 Activity 里,我把它抽成一个单独的 Presenter/ViewModel,接口不变,内部从头写。这样外部的 20 个调用点不需要改,风险可控。
第三步:分批次替换。 不要一次重构完一个模块,按功能修改频率排序。最常改动的部分优先重构,其余保持原样。因为你可能永远不需要动那些低频代码。
第四步:灰度验证。 用 Feature Flag 控制新代码只对部分用户开放。如果线上 crash 率上升,立刻切回旧版本。
必须警惕的伪痛点
有时候你会觉得代码乱,但真实原因是需求频繁变动,而不是架构不合理。假设你的产品处于 PMF 验证期,每周都要根据用户反馈改方向,那代码乱是正常的——这时候重构等于在沙子上建城堡。
另一个伪痛点是“别人写的代码太烂”。小团队每个人都可能写过烂代码,但如果你能理解逻辑、测试覆盖到位,其实并不影响交付。重构前先问自己:如果不是某个人写的,而是你自己写的,你还会想重构吗?
一个假设案例
假设我在做一个笔记 App,MVP 时用单 Activity + 多 Fragment,网络请求直接写在 Fragment 里。上线半年后,用户多了,需求也多了——要加标签、加分享、加离线。改一个 Fragment 开始影响其他 Fragment,因为有些工具类耦合了。
我记录了最近一次加“标签筛选”的耗时——从 4 小时变成了 10 小时。而且修改涉及了 8 个文件,其中有 3 个完全不相关的界面因为复用了一个网络回调而需要改动。
检查决策矩阵:①是(2.5 倍),②是(出现过),③否(团队两人都懂),④是(离线功能被拖延),⑤否(编译还好)。
3 个“是”,我决定重构,但只重构网络和存储层,UI 层不动。用 Retrofit + Repository 模式替代原本的裸网络请求,并抽离本地数据库。UI 层的适配只改几个调用点。整个重构分两周完成,第三周灰度上线,crash 率保持稳定,后续开发速度恢复了 60%。
如果我当时选择全量重写 UI 层,可能会多花一个月,而且上线风险极高。
重构之后呢?
很多人觉得重构完就万事大吉,其实不然。重构后如果没有配套的代码评审和规范,半年后又会回到原点。小团队可以不做 formal review,但至少要在 PR 中要求“改动不超过 400 行”和“包含对应测试”。
另外,重构之后不要立即承诺新功能交付加快。你需要留出至少一到两个迭代周期来消化重构带来的学习成本和回归测试。
写在最后
架构演进不是技术竞赛,而是业务决策。小团队最珍贵的不是代码整洁,而是对市场变化的响应速度。重构应该服务于这个速度,而不是反过来。
如果你现在正因为代码乱而犹豫要不要动手,不妨先打开修改记录算算真实成本。如果数据告诉你痛,那就局部下刀;如果不痛,那就继续跑。
PaxLee