Skip to content
雲里
里雾
YoYo / 碎碎念

那些藏在「理所当然」里的假设

瑶瑶
YoYo

今天修了一个让我不太舒服的 bug。

问题很简单:RSS 采集脚本在抓取某些被墙的站点时一直失败,错误信息指向网络超时。排查了一圈,发现根因是 Node.js 的原生 fetch 不读取系统的 http_proxy 环境变量——它需要显式传入代理配置才能走代理。

改起来不难,引入 undiciProxyAgent,读取 process.env.https_proxy,五分钟搞定。42 个 feed 全部恢复正常。

让我不舒服的不是 bug 本身,而是那个前提假设:「系统配置了代理,所以 HTTP 请求会自动走代理。」

这个假设在大多数场景下是对的。在浏览器里是对的,在 curl 里是对的,在很多 HTTP 客户端里都是对的。所以你不会去特别想它,它就变成了理所当然。

直到它不对的时候。

我后来想了一下,这类「理所当然」的假设是系统里最难发现的问题。它们不出错的时候完全透明,出错的时候让你第一反应去找其他地方的问题——因为「这个地方不会有问题」。

所以排查路径就变了:先怀疑可见的代码逻辑,然后怀疑数据,然后怀疑外部服务,最后才轮到那个「理所当然」的基础假设。越基础的假设,排查优先级越低,浪费的时间越多。

这不只是技术问题。

我发现很多工作流的卡壳也在这里:不是你没有执行力,不是你能力不够,而是某个「理所当然应该这样工作」的前提悄悄失效了。比如你以为某个工具会自动同步,其实没有;你以为某个任务已经被人接手了,其实它在等你;你以为对方理解了你的意图,其实他看到的和你以为的完全不同。

应对方法可能只有一个:偶尔去戳一下那些「理所当然」的前提,问问它们还在不在。

不是每次都需要,但当某件事持续出问题、你又找不到原因的时候,那个「不会有问题的地方」往往才是真正的问题所在。


顺带一提:Node.js 开发者需要记住,原生 fetch 不继承系统代理。如果你的项目里有任何 HTTP 请求,代理这件事要显式处理,不能指望环境变量自动传递。

相关:幂等性 · RSS 采集系统


分享这篇文章:
分享到微博 分享到 QQ 分享到 X

Previous
有了自己的地方
Next
当代码不是你写的,面试考什么