![]()
2019年,Google内部有个团队花了18个月重写了一套推荐算法。新代码比旧版快40%,内存占用减半,注释详尽、设计模式用得炉火纯青——堪称教科书级别的「优雅代码」。上线三个月后,原团队全员转岗,接手的人花了6周才看懂一个核心函数,最后不得不整体回滚。
这个案例被写进了Google的工程博客,标题很直白:「我们过度优化了可读性」。项目负责人后来承认,他们当时追求的是一种「让同行 impressed 的代码」,而不是「让同事能改的代码」。
「优雅」正在成为技术债的伪装
国内某头部云厂商的资深架构师李牧(化名)跟我聊过类似的事。他们团队2021年重构了一个支付网关,核心模块用上了函数式编程+响应式架构,代码行数压缩了60%。「当时觉得特别爽,像解了一道奥数题。」
结果第二年监管要求接入新的风控接口,团队里三个高级工程师围着那段「优雅代码」看了两天,没人敢动手改。「变量名是单字母,函数嵌了四层回调,注释写的是'参考论文[7]'——那篇论文是2015年的预印本,链接已经404了。」
最后方案是:在旧网关外面包一层适配器,新代码变成「优雅代码」调用「屎山代码」再调用「优雅代码」的三明治结构。李牧的原话:「我们现在宁可招写代码像写说明书的人,也不要写代码像写诗的人。」
这种现象有个数据佐证。GitHub 2023年的调研显示,开发者每周平均花费17.3小时在阅读和理解他人代码上,其中62%的人表示「代码风格过于精巧」是主要障碍。Stack Overflow的年度调查更直接:「维护遗留系统」连续五年力压「学习新技术」成为开发者最头疼的事。
可维护性的三个反直觉指标
原文作者提的几条建议——命名规范、模块化、避免硬编码——属于基本功。但想真正衡量可维护性,得看几个更隐蔽的指标。
第一,「陌生人上手时间」。
Netflix内部有个测试:随机抽一个非本团队的工程师,给他一台新电脑、一个代码仓库、一份需求文档,看多久能提交第一个有效PR(Pull Request,代码合并请求)。他们的中位数目标是4小时。如果超过8小时,这段代码会被标记为「需重构」。
![]()
这个指标残酷的地方在于,它惩罚一切「需要上下文才能理解」的设计。比如你用了一个内部DSL(领域特定语言)来简化配置,很酷——但如果新人需要读200页文档才能改一行参数,这就是维护成本。
第二,「回滚成功率」。
不是看能不能回滚,而是看回滚需要多少人参与、多少部门协调。某电商大厂2022年的一次事故很有代表性:一个促销活动的配置错误,理论上只需要改个JSON文件,但因为代码里硬编码了五个下游服务的调用顺序,回滚需要同时协调推荐、搜索、库存三个团队。最终故障持续了47分钟,损失按秒计费。
事后复盘,那段代码的作者已经离职三年,留下的注释是:「此处有魔法,勿动」。
第三,「注释的半衰期」。
好的注释解释「为什么」,坏的注释解释「是什么」。但最危险的注释是「过时但看起来还合理」的那种。微软研究院2018年做过一个实验:随机抽取100个开源项目的commit历史,发现代码与注释不一致的比例高达31%,而其中只有7%的注释被明确标记为「已废弃」。
换句话说,三分之一的注释在撒谎,而且你分不清哪些在撒谎。
性能优化与可维护性的真实博弈
原文提到「有时牺牲性能换可维护性」,这句话在业务代码里基本成立,但在基础设施层会触发更复杂的权衡。
字节跳动2020年开源的ByteDance Monoio是一个例子。这是一个基于io_uring的Rust异步运行时,为了追求极致性能,大量使用了unsafe代码和内存手动管理。维护者在README里写得很坦诚:「本项目不适合初学者阅读,贡献者需要对Linux内核有深入理解。」
这算可维护吗?看场景。它的目标用户是写存储引擎、网络代理的那批人,这个群体本来就预期要啃硬骨头。但如果一个CRUD业务系统照搬这套风格,就是灾难。
![]()
关键区分在于「变更频率」。Google的SRE手册里有个公式:优化收益 = 性能提升 × 调用频次 × 预期生命周期。一个每天调用十亿次、预计跑五年的模块,值得投入人力做深度优化;一个每周改三次需求、明年可能下线的功能,「够用就好」是最优策略。
国内某AI独角兽的工程VP跟我算过一笔账:他们团队把模型推理服务的P99延迟从120ms优化到80ms,花了3个人月;同样的资源如果投入到日志结构化改造,能让on-call(值班处理故障)的响应时间从平均45分钟降到12分钟。「后者每年省下的加班费,够招两个算法工程师。」
代码评审里的权力博弈
可维护性不只是技术问题,更是组织问题。
蚂蚁集团2021年推行的「代码可读性认证」制度值得参考。工程师要晋升到P7,必须提交一段被评审委员会认定为「易维护」的代码样本。评审标准里有一条很细:「如果这段代码需要你在会议上解释超过3分钟,它就不合格。」
这个设计的意图是倒逼作者站在读者视角写作。但执行中也出现了变形:有人为了通过评审,把简单逻辑拆成七八个文件,每个函数不超过5行,美其名曰「单一职责」。结果代码像被切碎的拼图,阅读时需要同时在八个tab之间跳转。
评审委员会后来补了一条补丁:「修改一个需求时,需要打开的文件数」也纳入评分。这算是用指标对抗指标。
更隐蔽的问题是「优雅代码」的社交货币属性。GitHub上高星项目往往有强烈的个人风格,这是作者的技术名片。但企业代码库是集体资产,「让人一眼看出是谁写的」反而是负面特征。Stripe的工程文化里有个说法:「最好的代码提交后,blame(查看作者)功能应该显得多余。」
国内某开源社区的维护者跟我吐槽,他们拒绝过一些「过于精巧」的PR:「有个贡献者用宏系统实现了一套编译期状态机,代码量少了40%,但除了他自己没人能修bug。我们宁愿要200行if-else,至少下个实习生能看懂。」
回到开头Google那个案例。项目负责人在博客结尾写了一段话,被很多团队打印贴在工位上:「我们优化代码是为了让机器跑得更快,还是为了让下一个凌晨三点被叫起来修bug的人少骂两句脏话?这两个目标不总是重合的。」
你们团队的代码评审里,有没有出现过「这代码太丑了」和「这代码我看不懂」之间的争论?最后谁说了算?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.