跳转到正文
Carrey Notes logo Carrey Notes
返回

我觉得一个好的系统应该是什么样子

编辑此页

写在前面

我不是“架构大佬”,也不是做纯平台/基础设施出身的人。我更多时候是以开发者的视角参与系统建设:既做过工期很紧、需要快速交付的项目,也参与过节奏更稳定、长期演进的项目。

我最大的体感是:工期紧并不可怕,可怕的是团队只能用“堆人、堆加班、堆临时方案”来顶。真正能做到“快而不乱”的团队,往往是把很多关键能力提前做成了默认配置:上线流程更顺、问题更好定位、改动更容易收敛,紧急时刻反而不需要全员燃烧。

还有一个常见现象:当项目已经乱了、已经延期了,再往里塞更多人,结果经常不是变快,而是更乱——新人要熟悉代码与业务、需要被带,沟通和集成成本会迅速上涨。

写这篇文章的动机也很简单:最近几年在一些公司里看到的工程水平不尽如人意——很多系统能跑,但一旦要长期维护、要多人协作、要持续迭代,就会越来越累。我想把自己亲眼见过、亲手踩过并认为“对一个不大不小的业务系统很重要”的东西,记录成一套更朴素、更好落地的标准。

这篇文章讨论的系统边界

我这里说的“系统”,主要指:一个不大不小的开发团队在做的、公司主营业务相关、需要长期运行并持续迭代的业务系统。

它可能是单体逐步拆分出来的,也可能一开始就是多服务;它可能有比较强的安全/权限要求(例如面向外部用户的登录与账号体系),也可能是内部核心业务系统。

关于你可能会问的“多大算不大不小”:我觉得 QPS、实例数、服务数当然是参考项,但真正把团队拖垮的通常是下面这些:

所以本文讲的“好系统”,不是追求某一种架构名词,而是讨论:当系统进入“长期运行 + 多人协作 + 持续变化”的状态时,哪些能力应该尽量具备,才能让开发更像在做可控的工程,而不是长期救火。

好系统的三个底层目标

我觉得一个“好系统”,底层目标可以先收敛成三个词:交付、运行、演进。

交付:功能能稳定、可预测地上线,而不是靠“临时爆肝”和感觉。
运行:线上出了事能尽快定位、尽快恢复,而不是全靠某个人的记忆和经验。
演进:系统能在持续变化里保持可维护——需求变了、团队换人了、依赖升级了,系统仍然能改得动,不会动不动就“牵一发动全身”。

这里我想提一个“很接地气”的工具:你可以用四个问题检查系统到底是在变好,还是在变累:

  1. 我们多久能上线一次?
  2. 一次改动从写完到上线,要拖多久?
  3. 上线后出问题、回滚、补丁的比例高不高?
  4. 真出事故了,从发现到恢复要多久?

业内把这一类衡量交付与稳定性的指标总结得很成熟(常被叫做 DORA 指标)。对我来说,它最大的价值不是“当 KPI”,而是帮你判断:你做的工程改造到底有没有让团队更轻松、更可控。

然后说到“演进”,我个人很喜欢把它和两本书的气质联系起来:

很多长期项目的问题,恰恰不是“现在能不能跑”,而是“半年后还能不能改”。

平台化底座:让部署和运维更像写代码

很多时候,开发对平台化的诉求并不复杂:

如果没有统一的底座,很多事情会变成日常工作里绕不过去的一环:端口冲突、机器资源分配、滚动发布手工操作、环境差异导致的“我这能跑你那不行”、发布流水线配置散落在各处、服务多了之后靠人记拓扑关系……这些东西单个看都不难,但叠在一起就会形成很重的“心智负担”。

所以我才会非常偏向:当服务/实例规模上来后,能用 Kubernetes 就尽量用。原因不是因为它“更高级”,而是因为它更像一个统一的运行底座:你用相对一致的方式描述“应用该怎么跑、怎么升级、怎么扩缩容”,平台按规则去执行,很多细碎且高频的工作会被系统化吸收掉。

当然,也有人觉得“Jenkins + Nacos 够了”。我认可:如果 Jenkins 用得足够规范,配合注册/配置这一套,确实能支撑相当多项目。但现实里经常出现的问题是:能用不等于省心,更不等于能规模化复制。系统越大、团队越多,靠约定与零散配置维持一致性的成本会越来越高。

我还会用一个很粗糙的“直觉指标”辅助判断:生态与社区投入。比如(截至 2026-04-09,写本文时):

最后必须说缺点:Kubernetes 没有传统意义的 LTS,你不能指望“装上了就永远不动”。它大概一年发布三次版本;补丁/维护窗口也不是无限长,所以你要把“升级”当成长期开销的一部分,而不是一次性项目。

Git 化:把配置和变更留在版本库里

我非常认可“Git 化”的方向,而且我觉得它的核心不是“用不用 Git”,而是:让系统尽量少依赖某个人的记忆来维持运转。

我会把“Git 化”明确成一句话: 把系统的关键变更过程变成可追溯、可回滚、可复现的。

落地上,我认为至少要让这些东西尽量进入版本管理:

这样做的价值很直观:出了问题你不用翻聊天记录或靠人回忆;你可以从变更历史里快速定位“最近发生了什么”。更重要的是:它能显著降低人员流动对系统的伤害——人走了,知识不至于也跟着走。

项目管理:从靠记忆和喊话到可视化协作

我想先说现象:没有项目管理(或者没有一个大家共同承认的任务/进度视图),经常会出现这些事:

这时候团队会变得很依赖“人与人之间的信任”,但现实是:忙起来的时候,信任也顶不住混乱。

引入项目管理(形式可以很朴素:一个看板、一套状态流转规则、清晰负责人和截止时间)之后,变化通常很明显:

我想强调:工具不重要,重要的是“团队共同承认的一张真相表”。有了它,你就不需要完全依赖口头承诺。

文档化:让业务和系统能被长期维护

很多团队觉得文档是“额外工作”,直到有一天他们发现:

到这个阶段,团队往往会出现错觉:我们缺的是更强的人、更会写代码的人。其实缺的是:可共享的上下文。

我心里更“实用主义”的文档标准是:写文档不是为了显得专业,而是为了让系统在变化里还能讲得清楚。至少要把下面这些内容写清楚并且能更新:

尤其是长期项目,“能演进”非常重要,而文档是演进成本里最便宜、最容易被忽略的一部分。

代码评审:让质量和规范在团队里生长

对新项目来说,代码评审最重要的价值不是“挑错”,而是三个更朴素的目标:

为了避免把评审做成负担,我更推荐新项目从很务实的方式开始:

好的评审机制,会让项目“越写越顺”,而不是“越写越怕改”。

(完)


编辑此页
分享到: