Logo

site iconTonyBai | 白明

重复
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

TonyBai | 白明 RSS 预览

代码之外的修炼:Google 资深工程师的 21 条“生存法则”

2026-01-11 14:32:31

本文永久链接 – https://tonybai.com/2026/01/11/21-lessons-from-google-engineer-1

大家好,我是Tony Bai。

“当我 14 年前加入 Google 时,我以为这份工作就是写出优秀的代码……我只说对了一部分。我待得越久,就越意识到,那些真正茁壮成长的工程师,不一定是最好的程序员——他们是那些懂得如何驾驭代码周围一切的人:人、政治、协同和模糊性。”

这段话,出自 Google 资深工程师 Addy Osmani 的一篇深刻反思——《在 Google 14 年的 21 条经验》。这篇文章,如同淬炼了 14 年的智慧结晶,几乎没有谈论任何具体的技术栈,却精准地描绘出了一位卓越工程师的成长画像。

这 21 条“法则”,并非关于某种转瞬即逝的技术,而是关于那些在项目、团队、公司之间反复出现的永恒模式。它们不是一场与外部世界的战争,而是一场关于自我提升的漫长“修炼”。这是一份珍贵的“心法”,能帮助我们在这场修炼之路上,走得更远、更稳。本文将为你逐一解读。


1. 最好的工程师痴迷于解决“用户问题”,而非“技术问题”

这是工程师“修炼”之路的第一心法:放下执念

放下对特定技术的迷恋,将自我从“工具的使用者”升华为“问题的解决者”。

“用户痴迷”意味着走出 IDE,去阅读支持工单,去和真实用户交谈,去观察他们如何在你的产品中挣扎。

当你真正理解了用户的“痛”,你往往会发现,那个最优雅的解决方案,远比你最初设想的任何复杂技术都要简单。

2. 做到正确很廉价,而“一起”做到正确才是真正的修行

你可以在每一次技术辩论中都“赢”,但最终输掉整个项目。

真正的“修为”,不在于证明自己正确,而在于创造一个安全的空间,让团队能够共同对问题达成一致,并对自己的确定性保持怀疑。

记住:“观点强硬,但立场松动 (Strong opinions, weakly held)。”

3. 偏爱行动。交付。你可以修改一个糟糕的页面,但无法修改一个空白的页面

对完美的追求是麻痹剂,是“心魔”。

完美的架构不会在纯粹的冥想中诞生,它诞生于与现实的接触。

先做出来,再做对,再做得更好。

交付那个让你感到“有点尴尬”的 MVP。

一个粗糙的原型所能带来的真实反馈,远超一个月闭门造车的理论辩论。

4. 清晰即资深,聪明是开销

编写“聪明”的代码,是工程师证明能力的本能。

但真正的软件工程,是在时间和团队协作的维度上展开的。

清晰性不是一种风格偏好,而是一种运营风险的降低

你的代码,是一份写给未来某个凌晨三点需要维护它的陌生人的“战略备忘录”。

资深的工程师,早已学会在他们的“修炼”中,用清晰性去交换那份无关紧要的“聪明”。

5. 新奇是一笔贷款,你将在故障、招聘和认知开销中偿还

像一个预算有限的组织一样,谨慎地对待你的“创新代币”。

只在你拥有独特优势的地方进行创新,其他所有事情,都应该默认选择“无聊”的技术,因为“无聊”意味着失败模式是已知的。

记住,“最好的工具”,常常是那个“在最多场景下最不坏的工具”。

6. 你的代码不会为你代言,人会

以为“好的工作会自己说话”,是工程师“修炼”生涯早期最大的错觉。

代码静静地躺在仓库里,它不会在晋升会议上为你辩护。

你需要将你的工作和价值,以一种可被他人理解和传播的方式呈现出来:写清晰的文档、做有影响力的分享、主动沟通你的成果。

7. 最好的代码,是那些你从未写下的代码

工程文化崇尚创造,但删除代码往往比增加代码更能改善一个系统

你没有写下的每一行代码,都是你永远不必去调试、维护或解释的一行代码。

在动手构建之前,请先用“无为”的智慧拷问自己:“如果我们就是……不这么做,会发生什么?”

8. 在规模化面前,即使你的 Bug 也有用户

当用户足够多时,你的系统的每一个可观测行为,无论你是否承诺过,都会成为一种事实上的依赖。

有人正在爬取你的 API,有人正在自动化你的“怪癖”,有人正在缓存你的 Bug。

这意味着,兼容性本身就是一种产品。你不能再将修复 Bug 视为“维护”,将开发新功能视为“真正的工作”。

9. 大多数“慢”团队,其实是“失调”的团队

当项目拖延时,我们的本能是归咎于执行力:人手不够、技术不行、工作不努力。

但真正的瓶颈,往往在于协同失败 (Alignment Failure)——团队在做错误的事情,或者以不兼容的方式在做正确的事情。

资深工程师会花费更多时间去澄清方向、接口和优先级,而不是单纯地“更快地写代码”。

10. 关注你能控制的,忽略你不能的

在大型组织中,组织架构调整、管理层决策、市场变化……无数变量都在你的控制范围之外。

为这些事情焦虑,是在浪费你宝贵的精力。

卓越的工程师,会战略性地专注于他们的“影响圈”:你能控制你代码的质量,你能控制你如何响应变化,你能控制你学到了什么。

这是一种专注的“禅定”

11. 抽象并未消除复杂性,只是将其转移到了你 on-call 的那一天

每一个抽象,都是一次“我未来不需要理解其底层”的赌博。

有时你会赌赢,但抽象总会泄露。

资深工程师之所以坚持学习底层知识,并非出于怀旧,而是出于对“凌晨三点,当你独自面对一个失效的抽象时”的敬畏。

12. 写作倒逼清晰。想学得更快,就去教别人

当你试图向他人解释一个概念时——无论是在文档中、演讲中,还是 Code Review 的评论里——你会立刻发现自己理解上的盲点。

把一个东西教给别人,本质上是在调试你自己的心智模型

这是最高效的“利己”的学习法门。

13. 那些让其他工作成为可能的工作,无价且无形

“胶水工作”——文档、新人引导、跨团队协调、流程改进——至关重要。

但如果你无意识地、仅仅出于“乐于助人”去做这些事,它们会吞噬你的时间,让你偏离技术主航道。

诀窍在于,有意识地去做,为它设定时间盒,将它转化为文档、模板、自动化等可见的成果,让它成为你明确的影响力,而非模糊的“性格特质”。

14. 如果你赢得了每一次辩论,你可能正在积累无声的抵制

当你“赢”得太轻松时,通常意味着事情不对劲了。

人们不再与你争论,不是因为你彻底说服了他们,而是因为他们已经放弃了尝试。

而这份未解的分歧,将会在未来的执行层面,以“神秘的阻力”的形式爆发出来。

真正的协同,需要你真正去理解他人,并有时公开地改变自己的想法。

15. 当一个指标成为目标时,它便不再是一个好的指标

古德哈特定律的经典再现。

人类会为了被测量的东西而优化。

资深的做法是,用一组成对的指标来响应管理需求(例如,速度 vs. 质量),并坚持解读趋势,而非崇拜某个具体的阈值。

16. 承认“我不知道”,比假装知道能创造更多安全感

当一个领导者或资深工程师坦诚自己的不确定性时,他实际上是在给予整个团队“提问”和“犯错”的许可。

这会创造一种心理安全的环境,让问题在爆炸前被暴露出来。

反之,一个“永远正确”的领导者,只会培养出一群沉默的下属和一堆隐藏的地雷。

17. 你的人脉,比你做过的任何一份工作都更长久

职业生涯早期,我们容易专注于工作本身而忽略人际交往。

这是一个巨大的错误。

那些在公司内外投资于人际关系的同事,在数十年后,会收获巨大的回报。

你的工作不是永恒的,但你建立的信任是。

18. 大多数性能的胜利,源于“移除工作”,而非“增加聪明”

当系统变慢时,我们的本能是增加缓存、并行处理、或者换用更聪明的算法。

但更具影响力的胜利,往往来自于问一个更根本的问题:“我们正在计算的这些东西,真的有必要吗?”

删除不必要的工作,远比把必要的工作做得更快要有效得多。

最快的代码,是那段从未运行过的代码。

19. 流程的存在是为了减少不确定性,而不是为了制造文书工作

最好的流程,能让协作更容易,让失败的代价更便宜。

而最坏的流程,是“官僚主义戏剧”——它的存在不是为了帮助,而是在出问题时用来甩锅。

如果你无法解释一个流程如何降低风险或增加清晰度,那它很可能就是纯粹的开销。

20. 最终,时间会比金钱更宝贵。请据此行事

职业生涯早期,你用时间换金钱。

但在某个临界点之后,这个公式会反转。

时间是唯一不可再生的资源。

答案不是“不要努力工作”,而是“清楚你在交易什么,并深思熟虑地做出交易。

21. 没有捷径,但有复利

专业知识,来自于经年累月的刻意练习。

但这里有希望的部分:学习是具有复利效应的。

你建立的每一个心智模型,你总结的每一条经验教训,都会成为你未来解决更复杂问题的“可复用原语”。

将你的职业生涯视为复利投资,而非一张张彩票。

小结:修炼的核心永远是人

Addy Osmani 的 21 条经验,最终可以归结为几个核心思想:保持好奇,保持谦逊,并永远记住,修炼的核心是人——你为之构建的用户,以及与你一同构建的队友。

对于我们工程师而言,这意味着,职业生涯的成长,是一场双螺旋式的攀升。

技术能力的“硬实力”是我们的根基,但决定我们最终能达到何种“境界”的,往往是沟通、协作、权衡、同理心这些看似“软”的、关于人的智慧。

这场“代码之外的修炼”,道阻且长,但行则将至。

资料链接:https://addyo.substack.com/p/21-lessons-from-14-years-at-google


你的“第22条”法则

读完这21条法则,相信你一定心有戚戚焉。在你自己的职业生涯中,是否有哪一条“生存法则”是你用惨痛教训换来的?或者,你觉得还有什么重要的经验是这21条没有覆盖到的?

欢迎在评论区分享你的独家心法! 让我们一起汇聚更多智慧。

如果这篇文章给了你新的启发,别忘了点个【赞】和【在看】,并转发给身边正在迷茫的工程师朋友,也许这就是他破局的关键!


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

© 2026, bigwhite. 版权所有.

Go 的“浮点数陷阱”将被填平:浮点转整数即将在所有平台上行为一致

2026-01-11 07:31:45

本文永久链接 – https://tonybai.com/2026/01/11/proposal-float-to-int-conversions-should-saturate-on-overflow

大家好,我是Tony Bai。

你是否知道,同一行简单的代码 int64(myFloat),在 Intel (amd64) 机器上可能返回一个巨大的负数,而在 ARM64 机器上却可能返回最大正整数?

在 Go 语言中,浮点数到整数的转换溢出行为长期以来一直属于“实现定义”(implementation-dependent) 的灰色地带。这意味着,代码的运行结果竟然取决于你底层的 CPU 架构。这种不确定性,一直是跨平台开发中一个难以察觉的隐形地雷。

2025年末,Go 编译器团队核心成员 David Chase 提交了一份提案(#76264),旨在彻底终结这种混乱。该提案计划在未来的 Go 版本中,强制规定所有平台上的浮点转整数必须是“饱和”的 (saturating),从而实现真正的全平台行为一致。

img{512x368}

痛点:薛定谔的转换结果

在现有的 Go 规范下,如果你尝试将一个超出目标整数范围的浮点数(例如 1e100)转换为 int64,结果是未定义的。

让我们看看这有多疯狂。假设我们有以下代码:

var f float64 = 1e100 // 一个巨大的数
var i int64 = int64(f)
fmt.Println(i)

这段代码在不同架构下的运行结果截然不同:

  • ARM64, RISC-V: 返回 9223372036854775807 (MAX_INT64)。这是“饱和”行为,即卡在最大值。
  • AMD64 (x86-64): 返回 -9223372036854775808 (MIN_INT64)。这是一个令人困惑的溢出结果。
  • WASM: 行为又不一样…

更糟糕的是 NaN (Not a Number) 的转换:

var j int64 = int64(math.NaN())
fmt.Println(j)
  • ARM64: 返回 0。
  • AMD64: 返回 MIN_INT64
  • RISC-V: 返回 MAX_INT64

这种不一致性不仅仅是理论问题,它已经导致了准标准库 x/time/rate 中的真实 Bug (#71154)。当你的代码逻辑依赖于转换结果的正负号来做判断时(例如 if i > 0),这种硬件差异就是致命的。

解决方案:拥抱“饱和转换”

David Chase 的提案非常直接:统一行为,拥抱饱和。

所谓“饱和转换”,是指当浮点数超出目标整数的表示范围时,结果应该被“钳制”在目标类型的最大值或最小值,而不是发生回绕(wraparound)或产生随机值。

具体规则如下:

  1. 正溢出 -> 返回目标类型的 最大值 (MaxInt)。
  2. 负溢出 -> 返回目标类型的 最小值 (MinInt)。
  3. NaN -> 返回 0 (或归一化为 0)。

这一改变将使得 Go 代码在任何 CPU 架构上都表现出完全一致的逻辑,彻底消除了这类可移植性隐患。

深层权衡:一致性 vs. 性能

为什么 Go 以前不这么做?核心原因在于性能成本

在 ARM64 和 RISC-V 等现代架构上,硬件指令集(如 FCVT)原生支持饱和转换,因此这样做几乎没有额外开销。

然而,AMD64 (x86-64) 是个“异类”。它的 CVTTSD2SQ 指令在溢出时不仅返回一个特殊的“不定值”(通常是 MinInt),还会触发浮点异常。为了在 AMD64 上模拟出“饱和”行为,编译器必须插入额外的检查代码:

// 模拟代码逻辑:AMD64 上的额外开销
result = int64(x)
if result == MIN_INT64 { // 可能溢出了
    if x > 0 {
        result = MAX_INT64 // 正溢出修正
    } else if !(x < 0) {
        result = 0         // NaN 修正
    }
}

Go 核心团队成员 Ian Lance Taylor 在评论中指出,我们必须权衡:为了消除这种不一致性,值得让 AMD64 上的转换操作变慢吗?

提案作者 David Chase 的回应是:值得。 与 FMA (融合乘加) 指令带来的微小精度差异不同,浮点转整数的差异往往是正负号级别的(MaxInt vs MinInt),这直接决定了代码逻辑的走向(循环是否执行、条件是否满足)。这种差异带来的 Bug 极其隐蔽且难以调试,其代价远超那几条指令的性能损耗。

实施计划:温和的演进

为了避免生态系统的剧烈震荡,提案建议采用分阶段的落地策略:

  • Go 1.26: 引入 GOEXPERIMENT 标志,允许开发者尝鲜并测试影响。
  • Go 1.27: 将其设为默认的实现行为。
  • Go 1.28: 正式修改 Go 语言规范 (Spec),将其确立为标准。

注:Go 1.26当前已经功能冻结,该提案依然处于Go语言规范变更审查委员会的讨论状态中,因此即便逻辑,其实际落地时间表也会顺延。

小结:Go 向“完美可移植性”迈出的重要一步

Dr Chase的这个提案不仅是对一个技术细节的修正,更是 Go 语言设计哲学的一次体现:在工程实践中,可预测性和可移植性往往优于特定平台上的极致微优化。

如果该提案通过,未来的 Gopher 们将不再需要担心底层的 CPU 是 Intel 还是 ARM,int64(NaN) 永远是 0,int64(Inf) 永远是 MaxInt64。这,才是我们想要的“Write Once, Run Anywhere”。

注:目前Dr Chase也在努力弥合amd64下的性能差距。

资料链接:https://github.com/golang/go/issues/76264


你的跨平台“血泪史”

跨平台开发中的“未定义行为”往往是最难调试的 Bug。在你的开发生涯中,是否也遇到过因为 CPU 架构或操作系统差异而导致的诡异问题?你支持为了“一致性”而牺牲一点点 AMD64 上的性能吗?

欢迎在评论区分享你的踩坑经历或对提案的看法! 让我们一起见证 Go 语言的进化。

如果这篇文章让你对底层原理有了新的认识,别忘了点个【赞】和【在看】,并转发给你的硬核伙伴!


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

© 2026, bigwhite. 版权所有.

离了大谱!Go 一年之内从第 7 掉到第 16

2026-01-10 08:19:34

本文永久链接 – https://tonybai.com/2026/01/10/go-dropped-from-7th-to-16th-in-one-year

大家好,我是Tony Bai。

新年伊始,TIOBE 发布了最新的编程语言排行榜。当我满怀期待地去寻找 Go 的身影时,差点以为自己眼花了:

Go 居然从去年的第 7 名,断崖式下跌到了第 16 名! 占比跌幅高达 1.37%,在这个榜单上几乎是“崩盘”级别的表现。

这是什么概念?这意味着在 TIOBE 的统计里,Go 现在的流行度还不如 Delphi/Object Pascal(第 9 名)和 Visual Basic(第 7 名)。

这就很离谱了。任何一个在 2025 年还在写代码的人,都不会觉得 Go 的生态已经萎缩到这种地步。

是 Go真的凉了吗?还是 TIOBE 的算法“疯”了?

img{512x368}

平行宇宙:稳如泰山的 Go

为了验证我的认知是否出现了偏差,我特意查阅了 2025 年其他的权威榜单:

全世界都觉得 Go 挺好,唯独 TIOBE 觉得 Go 要完。这种巨大的反差,逼得我不得不去扒一扒 TIOBE 的底裤——它的排名算法到底是怎么算的?

扒皮 TIOBE:一个过时的算法游戏

根据 TIOBE 官方公布的定义文档,它的算法极其简单粗暴,甚至可以说——在 2026 年显得有些可笑

它的核心逻辑只有一个公式:

在 25 个主流搜索引擎中,搜索 +” programming”,统计返回的页面数量。

就是这么简单。没有什么复杂的加权,没有什么开发者活跃度分析,就是数一数搜索引擎告诉你“有多少个网页提到了这个语言”。

这种算法在 20 年前或许有效,但在今天,它成为了导致 Go 排名暴跌的元凶。

元凶一:AI 杀死了“搜索结果页”

2025 年最大的变化是什么?是 AI Search

当我们遇到编程问题时,越来越多的人不再去 Google 翻阅那几百万个搜索结果页面,而是直接问 ChatGPT、Claude 或者 DeepSeek。
TIOBE 明确表示:ChatGPT 等 AI 工具不被纳入统计,因为它们没有“返回结果数量”的计数器。

这就导致了一个悖论:越是热门、现代的语言(如 Go、Python(得益于AI模型训练与应用开发)),其用户群体越年轻、越拥抱新技术,也就越倾向于用 AI 解决问题。 这直接导致了这些语言在传统搜索引擎中的“查询热度”和“新内容生成量”出现显著下降。

相比之下,那些老旧的语言(如 VB、Delphi),其用户群体相对固化,且维护遗留系统时更多依赖传统的文档和论坛搜索,因此受到的冲击较小,甚至在对比中显得“逆势上扬”。

注:Python的占比相对于2025.01也下降了0.68%。

元凶二:Go 的名字太“吃亏”了

TIOBE 的核心搜索查询是 +” programming”。

这对于 Python、Java 这种专有名词来说问题不大。但对于 Go 来说,这就是个灾难。

  • 通用词的悲剧:Go 是一个极其通用的英语单词。为了过滤掉“去(go)”的含义,TIOBE 必须强制加上 “programming” 后缀。
  • 搜索习惯的改变:但在 2025 年,开发者还会搜 “Go programming” 吗?不会了。大家搜的是 “Go generics”、”Golang k8s”、”Goroutine leak”。
  • 不成比例的过滤:随着搜索引擎算法日益智能,它开始更精准地理解用户意图,不再机械地匹配 “Go programming” 这个短语。这导致大量讨论 Go 技术的高质量页面(但没有显式包含该短语)被 TIOBE 的简单算法无情过滤。而像 “Python programming” 这种组合,因为 Python 本身的高辨识度,受到的影响要小得多。

元凶三:搜索引擎的“去水化”

Google 等搜索引擎在 2025 年大幅调整了算法,致力于打击 SEO 内容农场和低质量生成的页面。

Go 作为一个在云原生时代极速窜红的语言,过去几年充斥着大量的入门教程、培训班广告和搬运文章。搜索引擎的这一波“清洗”,可能不成比例地删除了大量包含 “Go programming” 关键词的低质、重复页面

虽然页面总量少了,但生态的“干货密度”其实更高了。 然而,在 TIOBE 这种只看“数量”不看“质量”的算法眼里,这就被简单粗暴地解读为“热度暴跌”。而那些生态早已固化、鲜有新内容产生的老语言,反而躲过了这一劫。

注:以上也是笔者的主观分析,不一定与事实相符!

小结:看个乐呵就行

把 Go 排在 Visual Basic 后面,这本身就是一个笑话。

TIOBE 的这次排名暴跌,反映的不是 Go 语言的衰落,而是 TIOBE 这种基于“网页搜索量”的统计方法,在 AI 和现代互联网面前的全面崩塌。

它就像一个依然在用“收音机收听率”来衡量流行音乐热度的老人,已经无法捕捉流媒体时代的脉搏。

所以,各位 Gopher,该写代码写代码,该摸鱼摸鱼。Go 好着呢,别被这个离谱的排名吓到了。


你的“体感”排名

TIOBE 的数据确实让人啼笑皆非。在你心目中,Go 语言现在的真实热度应该排第几?你觉得还有哪个榜单能更客观地反映编程语言的现状?

欢迎在评论区晒出你的“心选榜单”,或者尽情吐槽这个离谱的排名!

如果这篇文章解开了你心中的疑惑,别忘了点个【赞】和【在看】,并转发给那些正在唱衰 Go 的朋友,打脸要快!


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

© 2026, bigwhite. 版权所有.

谁才是 Go 生态的“幕后之王”?—— 深度挖掘 4000 万个节点后的惊人发现

2026-01-09 06:52:22

本文永久链接 – https://tonybai.com/2026/01/09/the-most-popular-go-dependency-is

大家好,我是Tony Bai。

在 Go 的世界里,我们每天都在引入各种 import。但你是否想过,整个 Go 生态系统中,究竟哪个包是被依赖次数最多的“基石”?

通常,我们会参考 GitHub Stars 或 Awesome 列表,但这往往带有主观偏差。为了寻找最客观的答案,开发者 Thibaut Rousseau 做了一件疯狂的事他下载了 Go Proxy 自 2019 年以来的所有模块元数据,构建了一个包含 4000 万个节点、4 亿条关系的巨大图谱。

结果令人大开眼界。

img{512x368}

从“愚公移山”到“巧用代理”

Thibaut 最初的想法很直接:从一个种子项目列表开始,递归地克隆仓库、解析 go.mod。但他很快发现这条路行不通——克隆速度太慢,且严重依赖 GitHub。

于是,他将目光转向了 Go Modules 生态系统的核心枢纽 —— Go Proxy

  • index.golang.org:提供了自 2019 年以来所有发布模块的时间流。
  • proxy.golang.org:提供了每个模块版本的 go.mod 文件。

通过这两个公开 API,他成功地将整个 Go 生态的元数据“搬”到了本地,构建了一个全量的、不可变的本地缓存。

Neo4j:点亮数据之网

面对海量的依赖关系,传统的关系型数据库显得力不从心。Thibaut 选择了图数据库 Neo4j

  • 节点 (Node):代表一个具体的 Go 模块版本(例如 github.com/gin-gonic/[email protected])。
  • 关系 (Relationship):代表 DEPENDS_ON(依赖于)。

通过简单的 Cypher 查询语句,复杂的依赖链变得清晰可见。例如,查询一个模块的所有传递性依赖(Transitive Dependencies),在 SQL 中可能需要复杂的递归 CTE,而在 Neo4j 中只需一个简单的 *1.. 语法即可搞定。

数据揭秘:Go 生态的真实面貌

经过数天的处理和导入,这个庞大的图谱终于呈现在眼前。让我们看看数据告诉了我们什么:

1. 绝对的王者:testify

在“被直接依赖次数”的榜单上,github.com/stretchr/testify 以 259,237 次的惊人数量遥遥领先,是第二名的两倍还多。这再次印证了测试在 Go 社区中的核心地位。

紧随其后的是:

  1. github.com/google/uuid (10w+)
  2. golang.org/x/crypto (10w+)
  3. google.golang.org/grpc (9.7w+)
  4. github.com/spf13/cobra (9.3w+)
  5. … …

2. “已归档”库的生命力:pkg/errors

最令人玩味的数据来自 github.com/pkg/errors。尽管这个库多年前就已宣布“归档”(Archived)并停止维护,且 Go 1.13 已内置了类似的错误包装功能,但数据却显示了截然相反的趋势:

  • 它的使用量不降反升!
  • 2019 年仅有 3 个依赖它的模块,而到了 2025 年,这个数字飙升到了 16,001

这揭示了软件生态中一个残酷的现实:旧习惯难改,且“足够好”的库拥有极其顽强的生命力。 哪怕官方已经提供了替代方案,开发者们依然倾向于使用他们熟悉的工具。

小结

Thibaut 的这个项目不仅仅是一次有趣的数据分析,它为我们观察 Go 生态提供了一个全新的上帝视角。

  • 平均依赖数:Go 模块平均拥有 10 个直接依赖。
  • 数据开源:作者不仅开源了爬虫代码 github.com/Thiht/go-stats,还大方地通过 BitTorrent 分享了 11GB 的 Neo4j 数据库转储文件。

你可以下载这份数据,自己在本地运行 Neo4j,去挖掘更多有趣的洞见。比如,看看你最喜欢的某个小众库,究竟被谁在使用?或者,去探索一下 Go 生态中那些隐秘的“单点故障”?

在这个由 4000 万个节点构成的宇宙中,还有无数的秘密等待被发现。

资料链接:https://blog.thibaut-rousseau.com/blog/the-most-popular-go-dependency-is/


你的依赖清单

testify 的霸榜并不意外,但 pkg/errors 的顽强生命力确实让人深思。在你的 go.mod 中,是否也有那些“虽然已归档,但真的很好用”的库?或者,你有什么私藏的冷门好库推荐?

欢迎在评论区晒出你的“宝藏依赖”! 让我们一起发现更多 Go 生态的秘密。

如果这篇文章让你对 Go 生态有了全新的认识,别忘了点个【赞】和【在看】,并转发给你的 Gopher 朋友!


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

© 2026, bigwhite. 版权所有.

PostgreSQL 吞噬世界,MongoDB 起诉 Go 开源项目:2025 数据库年度盘点

2026-01-08 12:00:21

本文永久链接 – https://tonybai.com/2026/01/08/databases-in-2025-a-year-in-review

大家好,我是Tony Bai。

数据库领域的“毒舌”,CMU教授 Andy Pavlo 再次发布了他的年度回顾(虽然这次是站在 2026 年初的回望)。2025 年对于数据基础设施是疯狂的一年:PostgreSQL 继续确立其霸主地位,引发了巨头间的收购狂潮;AI Agent 通过 MCP 协议正式接管数据库交互;而 Go 社区熟知的 FerretDB 则陷入了与 MongoDB 的法律泥潭。本文将为你深度梳理这份报告背后的技术趋势与行业信号。

img{512x368}

PostgreSQL 的统治:云巨头的“军备竞赛”

如果说 2021 年 Andy Pavlo 首次提出“PostgreSQL 正在吞噬数据库世界”,那么 2025 年则是这一预言的终极验证。PostgreSQL 不再仅仅是一个选项,它已经成为了行业标准,引发了云巨头之间近乎疯狂的并购与研发竞赛。

核心事件与技术演进

  • PostgreSQL v18 发布:终于引入了异步 I/O (Asynchronous I/O) 存储子系统,这意味着 Postgres 终于开始摆脱对操作系统页缓存(OS Page Cache)的依赖,向现代化 DBMS 架构迈出了关键一步。此外还增加了对 Skip Scans 的支持。
  • 天价收购案
    • Databricks 以 10 亿美元收购 Neon:Neon 是著名的“Serverless Postgres”开创者,其存算分离架构是现代云数据库的标杆。
    • Snowflake 以 2.5 亿美元收购 CrunchyData:为了不甘人后,Snowflake 也迅速补齐了其 Postgres 拼图。
    • Microsoft 发布 HorizonDB:作为回应,微软推出了自己的下一代 Postgres DBaaS。

对于后端和 Go 开发者而言,这意味着 PostgreSQL 协议已成为事实上的“通用语”。无论底层是 Aurora、AlloyDB 还是 Neon,应用层都只需通过标准的 pgx 或 lib/pq 驱动进行连接。掌握 Postgres 的深层特性和优化技巧,将成为未来五年内最具价值的技能之一。


MCP:AI Agent 时代的“中间件革命”

2025 年被定义为所有 DBMS 都支持 MCP (Model Context Protocol) 的一年。

什么是 MCP?

MCP 是由 Anthropic 提出,并随后被 OpenAI 采纳的一种标准化客户端-服务器 JSON-RPC 接口。它允许大语言模型(LLM)与外部工具和数据源进行交互,而无需编写定制的胶水代码。

  • 角色定位:MCP 服务器充当了数据库前的中间件。它向 LLM 暴露工具、数据和动作列表。
  • 工作流:LLM (MCP Client) -> MCP Server -> Database Query (SQL)。

Andy Pavlo 指出,除了官方实现外,还有数百个第三方的 MCP Server 实现。这对于 Go 开发者是一个巨大的机会:编写高性能、并发安全的 MCP 中间件是 Go 的拿手好戏

然而,这也带来了安全隐患。Pavlo 警告说,简单的代理只是将 MCP 请求翻译成 SQL,如果没有深度的内省和防护机制,AI Agent 可能会像“在应用里点了 18,000 杯水”一样,意外地摧毁数据库(比如 DROP DATABASE)。企业级 DBMS 开始内置 AI 防火墙,而开源生态则需要更多像 DBHub 这样提供查询限制和超时保护的中间件。


开源与法律:MongoDB v. FerretDB

这是 Go 社区最需要关注的法律纠纷。FerretDB 是一个用 Go 编写的开源项目,它提供了一个 MongoDB 兼容的代理层,后端使用 PostgreSQL 存储数据。这让用户可以用 Mongo 的驱动操作 Postgres。

诉讼焦点

  • 起因:MongoDB Inc. 向 FerretDB 发出停止侵权函,并在 2025 年 5 月正式提起联邦诉讼。
  • 指控:侵犯专利、版权、商标,以及违反 MongoDB 的文档和线协议规范的许可。MongoDB 特别针对 FerretDB 声称自己是“Drop-in replacement”(直接替换)这一点,认为其不仅误导开发者,还损害了 MongoDB 的声誉。
  • 背景:微软也将其 MongoDB 兼容的 DocumentDB 捐赠给了 Linux 基金会,但这似乎没有引发同样的法律反击,可能是因为巨头间的相互制衡。

警示

这一案件可能会成为 API 兼容性实现的法律判例。对于那些致力于编写“兼容层”或“协议转换器”的 Go 开发者来说,这是一个危险的信号:模仿专有软件的 API 和线协议,可能会面临越来越大的法律风险。


文件格式战争:Parquet 的挑战者们

在数据工程领域,Parquet 格式已经统治了近 15 年。但在 2025 年,为了适应现代硬件(NVMe SSD, GPU)和 AI 负载,新的挑战者涌现。

  • 挑战者联盟SpiralDB 的 Vortex(已捐赠给 Linux 基金会)、CWI 的 FastLanes、以及学术界的 F3 和 AnyBlox。
  • 核心痛点:现有的 Parquet 生态过于碎片化。Pavlo 的团队分析发现,94% 的 Parquet 文件仍在使用 2013 年的 v1 特性。
  • 未来趋势F3 格式(由 CMU, 清华大学等合作)提出了一种有趣的思路——在文件中嵌入 WASM (WebAssembly) 解码器。这意味着只要读取端支持 WASM,就可以解析任何自定义编码的数据,无需升级读取器本身。

行业大洗牌:并购与消亡

  • IBM 的野心:收购了 DataStax ($3B) 和 Confluent (Kafka 商业化公司),试图在数据流和 NoSQL 领域占据高地。
  • 向量数据库的退潮:随着所有主流 DBMS(Postgres, Oracle, Mongo)都内置了向量索引,单纯的“向量数据库”公司生存空间被挤压。Pinecone 正在寻求被收购,而 MyScaleDB 已经关闭。
  • GPU 数据库的黄昏Voltron Data 的倒闭和 HeavyDB 被 Nvidia 收购,似乎宣告了通用 GPU 数据库作为独立商业模式的终结。

总结与展望

Andy Pavlo 的这篇回顾虽然笔调幽默甚至带有讽刺,但其揭示的技术趋势却是严肃的:

  1. 架构趋同:存算分离、基于日志的架构(Log-based architecture)已成为云数据库的标配。
  2. AI 融合:数据库不再只是被动存储,而是通过 MCP 和内置向量能力,主动融入 AI Agent 的工作流。
  3. Go 的角色:在基础设施层(Docker/K8s 之后),Go 正在成为连接 AI 与数据的关键胶水语言(MCP Server, Proxy, 协议转换器)。

对于 Gopher 来说,关注 PostgreSQL 的协议生态、学习构建安全的 MCP 服务、并警惕开源协议的法律边界,将是 2025 年(及以后)的重要课题。

资料链接 – Databases in 2025: A Year in Review by Andy Pavlo


你的数据库“军火库”

数据库的世界正在发生剧变。在你的项目中,PostgreSQL 是否已经成为了默认选择?你如何看待 AI Agent 直接操作数据库的未来?

欢迎在评论区分享你的选型思考或对 FerretDB 事件的看法!让我们一起看清趋势,少走弯路。

如果这篇文章为你打开了数据库领域的新视野,别忘了点个【赞】和【在看】,并转发给你的架构师朋友!


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

© 2026, bigwhite. 版权所有.