Localhost 是一个谎言:Happy Path 谬误

发布: (2025年12月22日 GMT+8 19:00)
4 min read
原文: Dev.to

Source: Dev.to

幸存路径谬误

我们都有过这种经历。你在开发新功能时,想象一个完美的场景:API 总是 20 ms 响应,用户总是输入有效的电子邮件地址,数据库从不超时,JSON 总是格式正确。你写好代码,跑在本机上,完美运行。提交、推送,然后回家。

然后,凌晨 3:00,你的手机亮起。生产服务器崩溃,因为 API 返回了一个纯文本的 “502 Bad Gateway” HTML 页面。你的代码尝试把它当作 JSON 解析,卡住了,导致整个应用挂掉。

这就是 幸存路径谬误——初级开发者被 PagerDuty 警报惊醒的最大原因。危险的幻想是:

“只要在本地能跑,就能在生产环境跑。”

Coder 编写在一切顺利时能工作的软件。Professional 编写在出现问题时仍能存活的软件。如果你只为幸福路径编写代码,你的应用就会脆弱。

“这就像在不装安全气囊的情况下造车,因为你计划‘只要小心驾驶’。”

乐观是一种我们负担不起的奢侈。网络会拥堵,第三方服务会宕机,用户会做出意想不到的操作。要从 coder 转变为 professional,你必须用偏执取代乐观:假设输入是恶意的,网络是拥堵的,数据库已耗尽。

  • 初级思维: “我一定会得到数据。”
  • 高级思维: “如果我得不到数据会怎样?”

信任 JSON:常见的罪魁祸首

我们都写过假设 API 响应是有效 JSON 的代码。它在 99 % 的情况下工作,但那 1 % 可能毁掉你的可用性。

之前:“乐观”做法

// We assume the network is perfect and the API is our friend.
// If 'apiResponse' is "502 Bad Gateway" (string), this crashes the app.
const parsedResponse = JSON.parse(apiResponse);

// We immediately try to use the data.
// If the previous line failed, we never get here.
updateUI(parsedResponse.user);

之后:“偏执”做法

let parsedResponse;

try {
  // Attempt the dangerous operation
  parsedResponse = JSON.parse(apiResponse);
} catch (error) {
  // CHAOS DETECTED: The API lied to us.
  // Handle it gracefully instead of crashing.
  console.error('API returned malformed JSON:', error);

  // Load a default configuration so the app stays alive
  parsedResponse = DEFAULT_CONFIG;
}

// The app continues running, even though the API failed.
updateUI(parsedResponse);

在第二个例子中,API 失败了,但应用仍然存活。用户可能会看到一条通用错误信息或缓存的数据显示,但不会看到白屏死亡。


防御式编码原则

  • 不要信任网络。
  • 不要信任用户输入。
  • 不要信任数据库。

防御式编写代码。当服务器在凌晨 3 点起火时,“在我的机器上能跑”不是有效的借口。停止只为取悦编译器而写代码。


延伸阅读

本文摘自我的手册 《Professional Junior: Writing Code that Matters》——一本关于未成文工程规则的实战指南。

👉 Get the Full Handbook Here

Back to Blog

相关文章

阅读更多 »

好问题的艺术

!《好问题的艺术》封面图片 https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads...