深度思考 · 软件工程哲学
Vol. 02 — 01

代码运行次数
多于读取次数

当我们谈论软件质量时,总是把"可读性"挂在嘴边。但真相是: 在生产环境中,代码的每一次崩溃、每一次回滚、每一个凌晨三点的告警电话, 都在诉说着一个更残酷的真相——运行的代价,远超你的想象。

作者 阿海不海
阅读时间 约 12 分钟
发布日期 2026.04.04
Production Environment
user > dev
ops > author
biz ≈ user ?

"Programs are meant to be read by humans and only incidentally for computers to execute." —— 这句话出自Donald Knuth,被无数程序员奉为圭臬。 但今天,我想挑战这个观点的适用范围

一句被误解的真理 · 起点

让我们从最经典的版本说起:

A
maintainer > author
维护者大于编写者。你写的代码,大概率不是你在维护。

这个模型很优雅。它告诉我们:不要为了自己写得爽而牺牲后来人的阅读体验。 写清晰的命名、加必要的注释、保持函数短小、避免过度 clever 的技巧。 这些都是好建议。

但它有一个隐含假设:代码会被反复阅读和修改。 而现实中呢?很多代码写完之后,可能几个月甚至几年都不会有人再看一眼。 更重要的是——如果代码根本跑不起来,或者跑起来之后天天出问题, 那么"可读性再好"又有什么意义?

"代码只是实现目标的手段。软件应该有其用途,它应该为用户提供服务。" —— 从 user > maintainer 到 user > dev

优先级层级:从代码到商业 · 进化

让我把这个思维模型的完整进化链展示给你看。每一步进化,都代表一次认知升级:

软件开发优先级金字塔(最终版)
越往下越接近本质,越往上越容易迷失方向。
$
biz > user > ops > dev
商业价值 > 用户体验 > 运维稳定性 > 开发效率。没有商业模式或资源支撑,一切免谈。有些决策从软件/团队角度看合理,但从组织角度看未必。
U
user > ops > dev
用户价值 > 运维稳定 > 开发体验。代码应该为用户解决问题,而不是让用户适应代码。"KISS原则"在这里有了新含义:减少组件数量、了解故障模式、确保降级可用。
D
dev > author
开发体验 > 编写体验。与其猜测用户需求,不如尽早频繁地将产品展示给用户,从反馈中学习。
M
maintainer > author
维护者 > 编写者。代码的可维护性是基础要求,但不是最高目标。

注意到那个 biz ≈ user 了吗? 这是整篇文章最令人不安的部分——商业和用户并不总是站在同一边。

常见反模式诊断 · 排雷

有了这个模型,我们可以像医生诊断病人一样,快速识别各种软件开发中的"病症":

难以维护的代码

症状:author > maintainer | 巧妙而偷懒的代码变成一团乱麻;过早优化;只有某人能改的模块。
处方:回归基础,把可维护性当作第一优先级(至少在你确信代码会长期存在时)。

无法使用的软件

症状:dev > user | 技术驱动而非需求驱动;过度设计;为了"现代化"而破坏用户体验。
处方:走出象牙塔,去观察真实用户怎么用你的产品。

"在我机器上跑得好好的"

symptoms:dev > ops | 设计时未考虑部署;过于复杂;微服务由小团队管理;过早规模化架构。
处方:让写代码的人也负责运维(或者至少让他们参与on-call)。

简历驱动型发展

症状:dev > * | 在没有风险的环境里随心所欲地炫技;技术选型只看简历加分项不看实际需求。
处方:记住——你是在做产品,不是在做艺术品。

虚构软件(Zombie Software)

症状:biz > user > ops > dev | 开发完成但很少/从未投入生产;解决不了任何实际问题或解决了错误的问题。
处方:在写第一行代码前,先找到真实的用户验证假设。

运维的隐性成本 · 觉醒

我花了好一阵子才真正理解"运行"二字的分量。 因为就我的经验而言,很多软件最终都无法真正投入生产环境,至少无法大规模部署。 大多数软件都是基于一些从未经过测试的假设而构建的。

但当你的代码真的在生产环境中跑起来之后,一切都变了:

  • 部署不再是 `git push`,而是灰度发布、蓝绿部署、金丝雀发布……
  • 监控不只是看日志,而是Prometheus + Grafana + Alertmanager全套组合拳
  • 故障响应意味着凌晨三点被PagerDuty叫醒,一边揉眼睛一边查metrics
  • 安全审计意味着你要证明你的系统没有被入侵、数据没有泄露
  • 停用迁移可能是最难的部分——比上线更让人紧张
"基本上,维持系统可靠运行的长期成本总是远远超过构建过程中遇到的任何不便。" —— Dan McKinley

所以当我说 ops > dev 时, 我是在说:让你的代码能在凌晨两点不出事,比你用上最新的语言特性重要一万倍

商业现实与道德边界 · 困境

这里有一个很多开发者不愿意面对的事实:

?
biz > user
商业利益高于用户利益。这不是我说的,这是市场告诉我们的。

现在市面上有太多软件不关心用户了——要么操纵用户,要么把用户变成产品本身。 作为用户,我连订房间、点餐、搜索信息都会被弹窗广告轰炸; 用Google搜索只能找到一堆SEO垃圾。

我们对"做好工作"的理解,与业内相当一部分人认为的"盈利"之间存在着深刻的裂痕。 这解释了为什么越来越多的软件专业人士感到不安—— 我们接受不了这种价值观的扭曲。

我的立场是这样的:

// 理想情况 return biz > user > ops > dev; // 现实妥协(但不放弃底线) if (biz == user) { throw new Error("Ethical boundary violated"); } // 至少保证: // 1. 不主动伤害用户 // 2. 用户知情同意 // 3. 提供退出机制

写在最后 · 行动指南

如果你读到这里,可能会觉得这篇文章有点"丧"。 但我的本意不是让你绝望,而是让你清醒

清醒地认识到:

  • 代码不是目的,是手段。如果你的代码漂亮得像艺术品但没人用它,那你是在写小说,不是在写软件。
  • 运维是冰山下的巨兽。在写每一行代码之前,先问自己:"这东西上线之后谁来看日志?谁来修bug?"
  • 用户才是裁判。不是你的Tech Lead,不是Hacker News评论区,不是你的ego——是那些真正使用你产品的人。
  • 商业是约束条件,不是豁免权。你可以为了生存做妥协,但别把妥协当成常态,更别为此沾沾自喜。

最后,送给你一个我在职业生涯中学到的最有用的经验法则:

🧭 阿海的终极优先级公式
user > ops > dev > ego
把用户放在第一位
把系统稳定性放在第二位
把开发效率放在第三位
把自己的虚荣心……扔进垃圾桶

记住:代码运行次数多于读取次数。
不是因为运行更重要,而是因为只有跑起来,才有人读

阿海不海
一个在生产环境里摸爬滚打过的普通开发者。
相信代码的价值在于创造实际影响,而不是满足程序员的自我感动。
公众号:阿海的疯狂旅途 | B站:阿海不海
软件工程 DevOps 技术哲学 深度思考
Share · Save · Cite