最近看了一篇文章,题目是《Bun 为什么要用 Zig 重写,而不是 Rust?》,如下所示:
按照知乎的风格呢,似乎应该先说是不是事实,先确认这个事实,然后再说自己的思考。这文章倒是先认定这个事实,然后找为什么要用Zig重写Bun。 理由倒也找得挺能自圆其说,洋洋洒洒,先挑出来Rust的毛病,再承认Zig也有自己的问题。最终开始给自己的结论升维,是比较稳健的大模型风格。
但Bun用Zig重写这件事,本身就不存在。这篇文章的参考链接点进去看,标题的确是《Bun’s rewrite in Zig first update》,但下面的评论说的是:
It seems that the rust rewrite of Bun that was already mentioned earlier in this subreddit is going pretty well. While this is good news for the rust community, I think this is a major setback back for the zig community and even threatens the development of Zig if Bunthropic stops working with Zig
这段话的意思是: 看起来,之前在这个 subreddit 里提到的,是 Bun 用 Rust 重写,而且进展得相当顺利。虽然这对Rust社区来说是个好消息,但我认为这对Zig社区来说是一次重大的打击;如果Bunthropic 停止与Zig合作,这甚至可能威胁到Zig的发展。
我有个猜想:这位仁兄可能做了一个 agent,自动聚合全网标题,再用大模型批量生产数字泔水。
我们接着来推敲一下那篇文章中的观点, 文章认为从Rust迁移到Zig是因为,Rust的FFI太过繁琐。而Zig本身没有FFI的概念,Zig本身就是C语言的超集。
这点我多少有点发言权,我在Java中简单的使用过FFI,FFI 是 Foreign Function Interface 的缩写,粗略地说,就是让一种语言调用另一种语言的接口机制。比如 Java 可以通过 FFI 调用 C、C++ 或 Rust。 那因为Zig本身是C语言的超集,就不存在FFI的概念了嘛? 这句话给我的感觉是因为Zig中无缝调用C,就等于FFI概念不存在了。FFI等于调用C语言? 这不是一个等号,因为我还可以在Zig里面调用C++、Rust。
接着说Zig本身就是C语言的超集这个判断,超集是数学的一个概念,如果集合 B 包含集合 A 的所有元素,那么 B 就是 A 的超集。那“Zig 是 C 的超集”该怎么理解?如果严格按“超集”这个词来讲,就意味着所有合法的 C 代码,也都应该是合法的 Zig 代码。
除此之外,开头第一句话,就站不住脚:"Bun 最初用 Rust 写,现在要重写,选了 Zig", 其实Bun一开始就是用Zig写的。这件事给我的第一感觉是AI总能自圆其说,即使是错误的问题,也能给出一个看起来正确的答案。这是为什么呢?一个建立在错误前提上的问题,也能找到一个看起来正确的答案吗?
我用软件前期做架构设计的时候,感觉非常明显,你给出的任何架构设计方案,LLM总能给你构造一个看起来合理的逻辑链。
这条逻辑链可能一开始就建立在一个非常弱的假设上。论证过程中,再把"可能"慢慢改写为"必然",混入一些正确但不充分的依据,最后就能抵达你想要的结论。
这很像很多成功学叙事。一个人成功之后,他过去所有模糊的性格特征都会被重新解释。不爱说话,叫沉稳内敛;冒进,叫敢于下注;固执叫长期主义;运气好,叫抓住 时代的红利。剩下的工作就是给这个结论寻找解释。
我觉得LLM的这种回答是相当危险的,做技术判断本身就是基于一些隐含的假设推导出来的结论。这些假设有时候是对于未来预测,我们并不能完整的知道业务会朝着哪个方向走,所以意味着我们的判断本身就意味着先天的问题,我们需要承认这一点。我们做出来的大多数决策,将来大概率都会暴露出问题,随着我们越来越深入地参与业务,我们对业务方向的预测会逐渐变得更准确。
那如何分辨技术泔水呢?从这篇文章里,我总结出几个特点:术语密度很高,事实密度很低;语气很确定,依据很稀薄;看起来像洞察,实际上只是把几个相关概念强行串成一个故事。