Logo

site iconTonyBai | 白明

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

Inoreader Feedly Follow Feedbin Local Reader

TonyBai | 白明 RSS 预览

坚守内核,拥抱变量:我的 2025 年终复盘与 2026 展望

2026-01-04 07:17:15

本文永久链接 – https://tonybai.com/2026/01/04/stick-to-the-core-embrace-variables-2025-review-2026-outlook

大家好,我是Tony Bai。

当时钟拨向 2026 年,我不禁回望刚刚过去的 2025。

在技术史上,这注定会被定义为“分水岭”的一年。如果说之前我们还在观望 AI 能画出什么样的图,生成怎样的代码,那么在 2025 年,我们真切地感受到了它对软件工程核心领地的冲击与重塑——从 Google 三巨头定义“AI Agent 元年”,到 CodeRabbit 报告揭示 AI 代码的质量隐忧,再到 Rob Pike 对那封AI “致谢信”的罕见愤怒

在这样的洪流中,保持定力并不容易。回顾这一年,我庆幸自己做对了一件事:在变化的浪潮中,依然坚持系统性地输出“不变”的价值。

今天,在这个2026年元旦后开工的第一天,我想和大家聊聊我的 2025,以及我对 2026 的硬核规划

2025:一场“微专栏”的内容实验

2025 年,我做了一个重要的决定:重塑公众号的内容形态

在碎片化阅读盛行的当下,我深感很多技术痛点——如并发调度、网络协议、系统底层——是无法通过单篇千字文章讲透的。于是,我推出了“微专栏”模式:用 3-10 篇的体量,像写书一样去深度拆解一个技术专题。

这是一次冒险,但结果令人欣慰。这一年,我们通过 16 个微专栏,构建了一张从底层原理到 AI 前沿的完整技术拼图:

第一块拼图:攻克 Go 并发的“深水区”

并发是 Go 的灵魂,也是最容易出错的地方。

我们通过 《Go并发调度艺术》,跟随 Dmitry Vyukov 的视角亲历了 GMP 模型的演进;通过 《Go并发心智模型课》,完成了从“共享内存”到“信道通信”的思维转变;更为关键的是,《征服Go并发测试》 让我们终于掌握了驯服 Flaky Test 的新武器。

第二块拼图:夯实系统编程与工程底座

在应用层之下,是冰山般的底层细节。

我们潜入内核,在 《Go系统编程:揭秘进程控制、I/O与IPC》 中手写系统级工具;在 《Go网络编程全解:从Socket到HTTP/3》 中打通了网络协议栈的任督二脉。

同时,我们补齐了工程化的关键短板:通过 《Go Context解惑》 掌握了生命周期管理,通过 《Go模块构建与依赖管理》 走出了依赖地狱,用 《Go密码学101》《用Go解锁位运算之美》 强化了基本功,并用 《Go 测试之道》 建立了交付信心。

第三块拼图:架构设计与交互体验

当 Coding 能力溢出,设计能力便决定了上限。

我们探讨了 《API 设计之道:从设计模式到 Gin 工程化实现》《Go开发者的数据库设计之道》,拒绝面条代码。甚至,我们还玩了一把复古与现代结合的 《重塑终端:Go TUI开发入门课》,让命令行工具也能拥有惊艳的交互。

第四块拼图:Gopher 的 AI 破局

这一年,我们不再旁观,而是下场实战。

《AI应用开发第一课》 入门,到掌握 《Gemini CLI:重新定义命令行AI开发》,再到硬核的 《Google ADK 实战:用 Go 构建可靠的 AI Agent》,我们证明了 Go 在 AI 时代的无限可能。

除了微专栏,2025 年也是我“系统化输出”的大年。

在极客时间,《Go语言进阶课》 正式上线,帮助无数 Gopher 完成了从熟练到精通的跨越。
更让我惊喜的是,《AI原生开发工作流实战》 在上架短短一个多月内就获得了 3600+ 订阅。这说明大家已经意识到:AI 不仅仅是工具,更是一种全新的开发范式。

与此同时,《Go语言第一课》纸质书也在这一年正式出版,为这一年的“内容实验”画上了一个厚重的句号。

这一系列的产出证明了:在浮躁的时代,深度、系统化的内容依然有着旺盛的生命力。

2025:在喧嚣中寻找信号

翻看我 2025 年的博客列表,你会发现我的关注点始终在“底层原理”“前沿变革”之间穿梭。

关于 Go,我们不仅向前看,也向后看。

Go 团队在这一年对底层的打磨可谓大刀阔斧。我们见证了 GC 的重大演进,《Go新垃圾回收器登场:Green Tea GC》 详细剖析了它如何通过内存感知降低 CPU 开销,《深入 Go Green Tea GC》 则进一步揭示了其架构演进。在性能压榨上,《解锁CPU终极性能:Go原生SIMD包预览版初探》 让我们看到了 Go 在高性能计算领域的野心,尽管 《连 Rob Pike 都感到“担忧”》 也提醒了我们随之而来的复杂性。

同时,我们也向后进行了“Go 考古”,探究了 《错误处理的“语法糖”之战》,以及 《Slice 的“隐秘角落”》 中扩容策略的演变。我们还深入探讨了 《Go 1.26 新特性前瞻》 中的语法糖 new(expr),以及 《Go 编译器崩溃背后》 的语言规范修正。

关于软件工程,我们保持清醒。

当业界盲目推崇微服务时,我们通过 《“6 个月,47 个微服务”:一场由“简历驱动”引发的架构灾难》 发出了警示;当所有人都在由 AI 生成代码时,我们解读了 《Bug 激增 1.7 倍!AI 写代码:是速度的蜜糖,还是质量的砒霜?》。我们探讨了 《无聊设计的终极奥义》,也重温了 《Code Review 已死?Kent Beck:当 AI 成为“副驾驶”,我们该如何审查代码?》

关于 AI,我们从旁观走向入局。

这一年,我不再满足于仅仅介绍 AI 工具,而是开始探索 Go 与 AI 的结合点。从 《Google I/O 2025 Go 语言进展》 看到的 AI 赋能,到 《Cloudflare 2025 年度报告》 中 Go 在自动化 API 领域的统治力,再到 《MCP协议注册中心发布》 带来的基础设施变革,我们看到了 Gopher 在 AI 时代的巨大机会。

2026:Coding 廉价,眼光无价

如果说 2025 年是 AI 辅助编程进入Agent模式(Copilot、Cursor、Claude Code、Gemini cli等)的普及年,那么 2026 年,将是 自主智能系统(Agentic System) 的爆发年。

在 AI 能以百倍速度生成代码的时代,单纯的 Coding 能力正在不可避免地贬值。但架构设计的能力、技术选型的眼光、以及构建复杂系统的智慧,将变得无价

基于此,在 2026 年,我将在公众号(付费微专栏)知识星球(免费畅读)双线并行,重点规划以下三大战役:

战役一:AI 原生工程与 Agent 实战

这不再是写几个 Prompt 的游戏,而是真正软件工程范式的变革。

  • 自主智能系统 (Agentic System) 构建实战:我们将深入研究如何构建真正的 AI Agent。不仅仅是调用 API,而是设计能够感知环境、规划任务、使用工具、具有记忆并能自我修正的智能系统。
  • 以Claude Code为例的AI编码进阶实战:作为当前最强的 AI 编码 Agent,Claude Code 的潜力远未被挖掘。我们将探索如何用它实现L4级工作流,即AI 作为自主软件工程师,能够独立地、端到端地完成从需求理解到部署上线的整个软件开发生命周期,实现端到端的自动应用构建。同时我们还要考虑AI使用的经济性(省token,省money)。
  • AI 时代的软件工程探索:当代码主要由机器生成时,我们的 CI/CD、Code Review 以及测试策略该如何演进?这将是我们探索的重点。

战役二:架构设计与系统思维

当“怎么写”变得容易,“写什么”和“怎么设计”就决定了你的上限。

  • 分布式系统与架构设计微专栏:我们将跳出语言细节,探讨高可用架构、一致性难题、分布式事务等硬核话题。
  • 最佳实践与反模式:从微服务拆分到单体演进,从 数据表查询性能设计到领域建模(DDD),我们将沉淀出一套经得起时间考验的工程智慧。

战役三:Go 语言的深耕与重塑

Go 依然是我们的基本盘,但在 2026 年,我们要换个玩法。

  • AI 时代的角色转换:Go 在 AI 基础设施(推理服务、向量检索、Agent 后端)中的核心地位愈发稳固。我们将关注 Go 如何更好地服务于 AI 负载。
  • 硬核实战:Porting(移植)系列:这是我今年最想做的一件事。我们将通过用 Go 复刻经典系统(如编写一个 Mini-KafkaMini-DB),来深入理解存储引擎、网络协议和分布式共识的底层原理。这是掌握系统编程最扎实的路。
  • 传统艺能:Go 的极致性能优化可观测性依然是很多读者的刚需,也是Go生产事件中的重中之重。我们将继续关注 Go Runtime 的演进(如 Green Tea GC、SIMD),确保我们始终站在性能的最前沿。

当然,作为系统编程的双子星之一,Rust 依然会在我的技术雷达范围内,作为我们拓宽技术视野的重要补充。

小结

2026 年的画卷已经展开。

这是一个技术人最焦虑的时代,也是最令人兴奋的时代。焦虑在于旧经验的快速折旧,兴奋在于个体生产力的无限放大。

新的一年,我希望通过这些深度微专栏知识星球的陪伴,帮你建立起抵御技术通胀的护城河。

让我们左手握着 Go 与架构设计的工程底气,右手举起 AI Agent 的效率火把,从“代码工人”进化为“系统构建者”。

祝大家在 2026 年,代码无 Bug,架构有灵魂,人生有增量!


扫码加入我的知识星球,2026 全年微专栏以及存量微专栏免费畅读!

img{512x368}


你的 2025 关键词

我的 2025 是“坚守与拥抱”。回顾你的 2025,如果用一个词或一句话来总结,会是什么?对于即将到来的 2026,你最大的技术期待又是什么?

欢迎在评论区留下你的年度关键词,让我们一起记录这段不平凡的时光!

如果这篇文章给了你前行的力量,别忘了点个【赞】和【在看】,并转发给你的朋友,让我们在 2026 顶峰相见!


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

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

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


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

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

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

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

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


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

© 2026, bigwhite. 版权所有.

为什么 AI 时代,C++ 和 Rust 反而更火了?Herb Sutter 的硬核解读

2026-01-03 07:49:14

本文永久链接 – https://tonybai.com/2026/01/03/why-cpp-programmers-keep-growing-fast

大家好,我是Tony Bai。

“软件拿走性能的速度,永远比硬件提供性能的速度要快。”

在 AI 狂热、Python 统治胶水层、硬件算力看似无限增长的今天,C++ 标准委员会主席 Herb Sutter 却抛出了一个反直觉的结论:C++ 和 Rust 正在经历前所未有的高速增长。

这并非幸存者偏差。在他最新的博文《Software taketh away faster than hardware giveth》中,Sutter 结合 2025 年的行业数据、巨头财报和底层物理限制,为我们揭示了一个残酷的真相:我们正面临计算能力的“硬墙”,而高效能编程语言,是撞破这堵墙的唯一工具。

2025 年计算的双重瓶颈——电力与芯片

如果你认为算力增长的瓶颈仅仅是芯片(GPU/TPU)的供应,那你就错了。Sutter 引用了微软、亚马逊和 NVIDIA 财报电话会议的内容,指出 2025 年计算增长的第一大瓶颈是“电力”

  • 微软 CFO:我们不缺 GPU,我们缺的是把它们放进去的“空间和电力”。
  • 亚马逊 CEO:AWS 过去 12 个月增加了 3.8 吉瓦的电力容量,这相当于他们 2022 年的总容量。
  • NVIDIA CEO 黄仁勋:1 吉瓦的数据中心就是 1 吉瓦的电力。你的“每瓦性能 (Performance per Watt)”直接决定了你的收入。

在这个背景下,能效 (Energy Efficiency) 不再是一个锦上添花的指标,而是直接关乎成本、收入乃至可行性的生死线

这解释了为什么 C++ 和 Rust 如此重要:它们是目前仅有的、能够提供极致“每瓦性能”和“每晶体管性能”的主流便携式语言。在电力成为硬通货的今天,低效的软件就是在烧钱。

软件的贪婪与硬件的无奈

Sutter 提出了一个深刻的观点:我们对解决更复杂问题的需求,总是超过我们构建更强计算能力的速度。

  • 2007 年的 iOS 开启了移动计算时代。
  • 2022 年的 ChatGPT 开启了生成式 AI 时代。

每一次硬件性能的飞跃,都会迅速被新兴的、更加“贪婪”的软件需求所吞噬。AI 只是这一长串名单中的最新一员。这意味着,我们永远不会拥有“足够快”的硬件,我们永远需要压榨出硬件的最后一滴性能。

因此,C++ 和 Rust 的开发者数量在过去三年(2022-2025)增长最快,这并非巧合,而是行业对高效能计算需求的直接反映。

C++26 —— 安全与性能的“双重奏”

面对 Rust 在内存安全方面的挑战,C++ 并没有坐以待毙。Sutter 详细介绍了即将发布的 C++26 标准在安全性上的重大突破:

  1. 消灭未初始化变量:C++26 将默认消除局部变量未初始化导致的未定义行为 (UB)。这是一个迟到但巨大的进步,直接消灭了一大类常见的安全漏洞。
  2. 标准库“加固” (Hardening):C++26 将引入标准库的“加固模式”,对常用的操作(如 vector 访问)进行边界检查。谷歌和苹果的实践数据表明,这种检查的开销极低(小于 1%),但能预防数以千计的潜在 Bug。
  3. 契约 (Contracts):C++26 将引入契约编程(Preconditions, Postconditions),将功能安全提升到语言层面。

Sutter 甚至提出了一个大胆的设想:未来的 C++29 是否应该暂停新特性的开发,专注于“修补漏洞”和“全面硬化”? 这显示了 C++ 社区在安全性上的决心。

AI 不会取代程序员,它只是计算器

针对“AI 将取代程序员”的焦虑,Sutter 给出了一个冷静而乐观的比喻:AI 之于编程,就像计算器之于数学,或者搜索引擎之于知识。

  • 它是乘数,不是替代品:AI 能极大地减少死记硬背和样板代码的工作,让程序员专注于解决更难、更新的问题。
  • 需求在增长:即使有了 AI 加持,人类程序员的数量依然在快速增长。Atlassian CEO 指出:“如果软件开发的成本减半,我们不会减少一半的程序员,而是会编写两倍的软件,或者解决更复杂的问题。”
  • AI 的局限:AI 只能解决已知的问题(训练数据覆盖的领域),而软件工程的核心价值在于解决未知的新问题

小结:长期主义的胜利

Herb Sutter 的这篇文章,是对高性能编程语言的一次强力辩护。在摩尔定律放缓、能源危机逼近、AI 需求爆发的今天,掌握一门能与硬件“对话”、能极致利用资源的语言(无论是 C++ 还是 Rust),不仅没有过时,反而变得比以往任何时候都更加重要。

正如他所说:“软件拿走性能的速度,永远比硬件提供性能的速度要快。” 在这场追逐赛中,高效能开发者将永远是稀缺资源。

资料链接:https://herbsutter.com/2025/12/30/software-taketh-away-faster-than-hardware-giveth-why-c-programmers-keep-growing-fast-despite-competition-safety-and-ai


你的“能效”焦虑

在你的日常开发中,是否也感受到了“算力不够用”或者“云成本过高”的压力?你认为在 AI 时代,掌握一门高性能系统级语言(C++/Rust)是变得更重要了,还是更边缘化了?

欢迎在评论区分享你的看法和职业规划! 让我们一起探讨如何在算力瓶颈时代突围。

如果这篇文章为你拨开了迷雾,别忘了点个【赞】和【在看】,并转发给身边那些坚持底层开发的“硬核”朋友!


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

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

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


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

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

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

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

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


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

© 2026, bigwhite. 版权所有.

Kent Beck 最新思考:AI 时代的“一人派对”,代码审查的终结与重生

2026-01-02 20:08:12

本文永久链接 – https://tonybai.com/2026/01/02/kent-beck-ai-era-code-review-end-and-rebirth

大家好,我是Tony Bai。

“以前是‘嘿,能在合并前帮我看一眼吗?’……现在是‘我在海滩上和一个神灯精灵结对编程’。”

极限编程 (XP) 和测试驱动开发 (TDD) 的奠基人 Kent Beck,最近发表了一篇题为《Party of One for Code Review!》(代码审查的一人派对!)的博客。

这是一个略带伤感,却又无比清醒的时刻。曾经,代码审查是软件工程中最具社交属性的活动之一,是团队知识共享的纽带。但在 AI 能够以百倍于人类的速度生成代码的今天,那个属于人类互相 Review 的黄金时代,似乎正在走向终结。

取而代之的,是一场孤独的、高效的、由人类与 AI 共舞的“一人派对”。在这场派对中,代码审查并未消失,而是迎来了一场深刻的重生

img{512x368}

终结 —— 崩溃的“社交契约”

在过去的几十年里,代码审查建立在一个默认的“社交契约”之上:我们是平等的队友,我们以相似的速度工作,我们有义务互相检查。

然而,生成式 AI 的介入,彻底打破了这个平衡,导致了旧式 Code Review 的终结

速度的失衡

Kent Beck 指出,当 AI 这个“神灯精灵”成为你的结对伙伴时,生产代码不再是瓶颈。你可以还没到午饭时间,就生成并探索了三种不同的实现方案。这种速度是任何人类同事都无法匹配的。

上下文的断裂

当你的同事还在为自己的任务焦头烂额时,你已经用 AI 生成了海量的代码。要求他们在一个下午读懂你和 AI 交互了数小时产生的逻辑,不仅是不公平的,甚至是不可行的。

于是,我们被迫进入了“一人派对”模式。你是唯一的作者,也是唯一的审查者。 传统的、依赖同步协作的审查模式,在 AI 的洪流面前显得苍白无力。

重生 —— 代码审查的新使命

如果不再依赖同事来找 Bug,代码审查还有存在的必要吗?Kent Beck 认为,它不仅有必要,而且比以往任何时候都重要。

代码审查正在重生,它的关注点从“纠错”转移到了两个更高维度的使命上:

健全性检查 (Sanity Check):对抗“幻觉”

AI 是自信的,它生成的代码往往看起来完美无缺。新时代的审查,首先是一场“图灵测试”般的博弈
你需要时刻保持警惕:“这看起来是对的,但它真的在做我要求它做的事吗?” Review 的本质,变成了确认 AI 是否忠实执行了人类的意图,而非纠结于语法细节。

对抗“结构性漂移” (Structural Drift):守护架构的灵魂

这是 Kent Beck 最深刻的洞见。他担忧的不是 Bug,而是代码库的可操作性

“如果结构变得过于纠缠,耦合变得太紧,精灵(AI)就会开始犯错。”

当大量代码被快速生成时,代码库很容易陷入混乱的熵增,这种现象被称为“结构性漂移”。一旦代码结构腐化,AI 对上下文的理解能力就会断崖式下跌,最终导致开发效率的崩盘。

因此,重生的代码审查,其核心使命是守护架构的健康。我们要确保代码库始终保持在一个“既让人类可读,又让 AI 可理解”的状态。

新工具 —— 用魔法打败魔法

在“一人派对”中,既然没有了人类队友,我们就需要新的盟友。Kent Beck 提到,他正在尝试使用像 CodeRabbit 这样的 AI 代码审查工具。

但他并不是想找一个“自动通过器”,而是将 AI 视为一个“不知疲倦的检查员”

  • 自动摘要与可视化:当 AI 生成了大量变更时,让另一个 AI 来总结这些变更,生成架构图,帮助人类快速找回上下文。
  • 模式守护者:通过训练 AI 学习代码库的既有模式,让它来标记那些偏离了设计规范的“漂移”。

这就是新时代的讽刺与美妙:我们正在用 AI 来审查 AI,以确保人类依然掌握着系统的控制权。

孤独的领航员

文章的字里行间,流露出一种作为“老派黑客”的孤独感。Kent Beck 怀念那些与人激烈讨论、在白板前碰撞思维火花的日子。

“我现在独自工作,生成代码飞快……但这不那么令人满足。”

在 AI 时代,工程师的角色正在发生质变。我们从一群围着篝火(代码)取暖的部落成员,变成了独自驾驶飞船穿梭星际的领航员。AI 是我们强大的副驾驶,但方向盘,始终在且必须在人类手中。

小结

“一人派对”并不意味着彻底的孤独,它意味着更高的责任

代码审查并没有死,它只是褪去了社交的外衣,重生为一种更纯粹、更严谨的工程纪律。在这场派对中,我们虽然独自起舞,但我们的舞步(代码结构)必须足够清晰、优雅,才能让那位强大的 AI 舞伴,始终跟随我们的节奏,而不至于踩到我们的脚。

资料链接:https://tidyfirst.substack.com/p/party-of-one-for-code-review


你的“派对”体验

Kent Beck 的“一人派对”,或许是每位 AI 时代开发者的必经之路。在你的工作中,是否也体验过这种“生成代码飞快,但无人Review”的孤独与不安?你是如何保证这些 AI 代码的质量和架构健康的?

欢迎在评论区分享你的故事或困惑,让我们在这场孤独的派对中找到彼此。

如果这篇文章触动了你,别忘了点个【赞】和【在看】,并分享给那些同样在 AI 浪潮中思考未来的朋友!


还在为“复制粘贴喂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-02 07:43:16

本文永久链接 – https://tonybai.com/2026/01/02/go-supply-chain-attack-source-code-to-capability-auditing-paradigm-shift

大家好,我是Tony Bai。

软件供应链安全的传统认知中,我们默认遵循一个假设:“代码即真理”。如果你审查了 GitHub 上的源码,确认它是安全的,那么你部署的服务就应该是安全的。

然而,2025 年初在 Go 生态中爆发的 BoltDB 投毒事件,以及之前的 XZ 后门事件,无情地粉碎了这个假设。攻击者正在利用构建系统的复杂性和 Git 标签的可变性,在“源码”与“构建产物”之间制造出一片致命的盲区。

面对这种不对称的战争,传统的“源码审计”已显疲态。在 GopherCon 2025 上,Google Cloud 安全专家 Jess McClintock 提出了一个新观点我们需要一场防御范式的转移——从关注代码“写了什么”,转向关注构建产物“能做什么”

本文将带你深入这场范式转移的核心,剖析攻击手段的演变,并手把手教你使用 Google 开源的 Capslock 工具,开启你的“能力审计”之路。

旧范式的崩塌——当“所见”不再“所得”

“源码审计”失效的根本原因,在于源码仓库不再是单一的事实来源 (Source of Truth)

BoltDB 投毒案为例,这是一场教科书式的“偷天换日”:

  1. 投毒:攻击者发布了一个包含恶意后门的版本,打上 v1.3.1 的 git 标签。
  2. 缓存:Go Module Proxy(Go 生态的官方镜像)忠实地抓取并缓存了这个恶意版本。
  3. 清洗:攻击者随即在 GitHub 上强制推送 (force-push) 了一个同名的 v1.3.1 标签,指向一个干净的提交。

结果是分裂的

  • 审计者在 GitHub 上看到的是“良民”。
  • 编译器从 Proxy 拉取的是“恶棍”。

这标志着旧范式的崩塌:你审查的代码,并不是你运行的代码。

供应链攻击的进化——隐藏在构建链中的幽灵

Jess 指出,这种攻击并非孤例,而是一种正在蔓延的行业趋势。

  • XZ 后门:恶意载荷被伪装成测试文件,只有在特定的构建脚本执行时才会被注入。在源码树中,它是静止的、无害的;但在构建过程中,它“活”了过来。
  • npm EventStream:利用版本号策略,让恶意代码只存在于次要版本中,避开对主要版本的审查。

这些案例共同指向一个结论:安全性不能只靠静态的源码分析,必须向右移动,覆盖到最终的构建产物 (Build Artifact)。

新范式确立——能力审计 (Capability Audit)

既然我们无法逐行审查庞大的依赖树,也无法完全信任源码,那么出路在哪里?

答案是:关注行为边界。这就是“能力审计”的核心思想。

借鉴移动端 App 的权限管理模型,我们不再纠结于依赖包内部怎么实现,而是关注它申请了什么能力

  • 一个 JSON 解析库,如果申请了 net.Dial (网络访问) 能力,这就是异常。
  • 一个日志库,如果申请了 os.Exec (命令执行) 能力,这就是红色警报。

通过监控依赖包的“能力列表”及其变化,我们可以以极低的成本,通过行为特征识别出潜在的供应链攻击,无论源码如何伪装。

Capslock——Google 的开源防御武器

为了将“能力审计”落地,Google 开源了 Capslock。它是一个针对 Go 语言的静态分析工具,通过解析构建产物,构建完整的函数调用图,从而透视出代码的真实能力。

Capslock 能做什么?

Capslock 的核心价值在于“透视”。它不关心代码的具体逻辑,而是关注代码触及了哪些系统边界。它能识别出以下几类关键能力:

  • 网络访问 (NETWORK):连接互联网或绑定端口。
  • 文件系统 (FILES):读写文件。
  • 系统执行 (EXEC):启动子进程。
  • 底层操作 (UNSAFE, REFLECT, CGO):使用不安全指针、反射或调用 C 代码。

快速上手:Capslock 实战指南

想体验“能力审计”的威力?只需三步。

1. 安装工具

确保你安装了最新的 Go 环境,然后运行:

$go install github.com/google/capslock/cmd/capslock@latest

2. 扫描当前项目

在你的 Go 项目根目录下运行,Capslock 会自动分析当前模块及其所有依赖,以我的issue2md开源项目为例:

$capslock -packages=.
Capslock is an experimental tool for static analysis of Go packages.
Share feedback and file bugs at https://github.com/google/capslock.
For additional debugging signals, use verbose mode with -output=verbose
To get machine-readable full analysis output, use -output=json

FILES: 1 references
NETWORK: 1 references
REFLECT: 2 references

我们看到该issue2md项目使用了文件访问、网络访问以及反射能力。如果你要看具体是哪些代码用到了这些能力,可以让capslock输出verbose信息:

$capslock -packages=. -output=v
Capslock is an experimental tool for static analysis of Go packages.
Share feedback and file bugs at https://github.com/google/capslock.
To get machine-readable full analysis output, use -output=json

FILES: 1 references (1 direct, 0 transitive)
Example callpath:
  github.com/bigwhite/issue2md.main
  main.go:29:11:log.Fatal
  log.go:423:12:(*log.Logger).output
  log.go:244:23:(*os.File).Write

NETWORK: 1 references (1 direct, 0 transitive)
Example callpath:
  github.com/bigwhite/issue2md.main
  main.go:24:23:net/http.FileServer

REFLECT: 2 references (1 direct, 1 transitive)
Example callpath:
  github.com/bigwhite/issue2md.main
  main.go:18:12:flag.Parse
  flag.go:1188:19:(*flag.FlagSet).Parse
  flag.go:1157:26:(*flag.FlagSet).parseOne
  flag.go:1112:11:(*flag.FlagSet).usage
  flag.go:1068:17:(*flag.FlagSet).defaultUsage
  flag.go:690:17:(*flag.FlagSet).PrintDefaults
  flag.go:609:12:(*flag.FlagSet).VisitAll
  flag.go:458:5:(*flag.FlagSet).PrintDefaults$1
  flag.go:630:32:flag.isZeroValue
  flag.go:545:18:reflect.New

3. 进阶:对比版本差异 (Diff)

这是 Capslock 最核心、也最强大的用法之一。当你想升级某个依赖时,如何知道新版本是否引入了恶意行为?下面以我fork的govanityurls为例,看一下如何进行版本能力的差异对比。我的govanityurls的唯一依赖是gopkg.in/yaml.v2。

# 1. 保存依赖的旧版本的分析结果
capslock -packages=gopkg.in/yaml.v2 -output=json > v2.3.0.json

# 2. 比较新版本 (假设你已经 go get了新版本,比如v2.4.0)
$capslock -packages=gopkg.in/yaml.v2 -output=compare ./v2.3.0.json

如果输出显示新增了 NETWORK 或 EXEC 能力,这就是一个必须要人工介入审查的红色警报。在我这个示例中,gopkg.in/yaml.v2 v2.4.0,相对于v2.3.0没有能力增加。

知己知彼:Capslock 的局限性

作为一个静态分析工具,Capslock 并非全知全能。了解它的盲区,对于正确使用它至关重要:

  1. CGO 与汇编盲区:Capslock 无法分析 C 代码或汇编代码。如果一个包使用了 CGO,Capslock 会报告它拥有 CGO 能力,但无法告诉你 C 代码内部具体做了什么。这是静态分析的物理边界。
  2. 反射与 Unsafe:通过 reflect 或 unsafe 包进行的动态调用,往往让静态分析难以追踪。Capslock 会诚实地报告这些“不可知”的区域为 REFLECT 或 UNSAFE,提示你需要人工审查。
  3. 误报 (False Positives):静态分析假设所有代码路径都可能被执行。如果一段恶意代码藏在一个永远不会为 true 的 if 分支里,Capslock 依然会报告其能力。但在安全领域,“宁可错杀,不可放过” 是正确的策略。

尽管有这些局限,Capslock 依然是目前 Go 生态中进行大规模、自动化能力审计的最佳工具。它为我们在供应链的汪洋大海中,提供了一个至关重要的“雷达”。


构建零信任的开发流程

从“源码审计”到“能力审计”,代表了我们对供应链安全认知的升级。在 AI 辅助编程日益普及、代码生成速度呈指数级增长的今天,这种基于行为边界的守门人机制,将变得愈发重要。

给团队的落地建议:

  1. 锁定 Commit:在 go.mod 中尽量使用伪版本号(pseudo-version)锁定 Commit Hash,因为 Tag 是可变的,但 Hash 是不可伪造的。
  2. CI 集成:不要只在本地运行 Capslock,把它变成 CI 的一部分。通过将 Capslock 加入到你的 CI 流水线(例如 GitHub Actions、gitlab ci等),你可以设定一条红线:任何新增的高危能力(如网络、执行),必须触发人工审查阻断。
  3. 保持怀疑:当一个纯计算类的库突然想要访问网络时,哪怕源码看起来再正常,也要坚决说不。

小结

安全不是一个状态,而是一个过程。当攻击者学会了“偷天换日”,防御者就必须学会“火眼金睛”。Capslock 和能力审计范式,正是 Go 生态在这个新时代交出的答卷。

参考资料

  • The Code You Reviewed is Not the Code You Built by Jess McClintock – https://www.youtube.com/watch?v=70ka67DpLPc
  • capslock repo – https://github.com/google/capslock
  • Go Supply Chain Attack: Malicious Package Exploits Go Module Proxy Caching for Persistence – https://socket.dev/blog/malicious-package-exploits-go-module-proxy-caching-for-persistence

聊聊你的安全焦虑

供应链攻击防不胜防,Capslock 给了我们一个新的视角。在你日常的开发中,是如何管理第三方依赖安全的?是否遇到过类似的“李鬼”包?或者,你对“能力审计”这种新范式有什么看法?

欢迎在评论区分享你的经验或担忧! 让我们一起筑牢 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 考古:Go 官方如何决定支持你的 CPU 和 OS?

2026-01-01 13:16:40

本文永久链接 – https://tonybai.com/2026/01/01/go-archaeology-porting-policy

大家好,我是Tony Bai。

当我们津津乐道于 Go 语言强大的跨平台编译能力——只需一个 GOOS=linux GOARCH=amd64 就能在 Mac 上编译出 Linux Go程序时,你是否想过,这些操作系统和 CPU 架构的组合(Port)是如何被选入 Go 核心代码库的?

为什么 linux/amd64 稳如泰山,而 darwin/386 却消失在历史长河中?为什么新兴的 linux/riscv64 或 linux/loong64 能被接纳?

这一切的背后,都遵循着一份严谨的 Go Porting Policy。今天,我们就来翻开这份“法典”,一探究竟。

什么是“Port”?

在 Go 的语境下,一个 Port 指的是 操作系统 (OS)处理器架构 (Architecture) 的特定组合。例如:

  • linux/amd64:运行在 64 位 x86 处理器上的 Linux。
  • windows/arm64:运行在 ARM64 处理器上的 Windows。

每一个 Port 的引入,都意味着 Go 编译器后端需要生成对应的机器码,运行时(Runtime)需要处理特定的系统调用、内存管理和线程调度。这是一项巨大的工程。

等级森严:First-Class Ports (一等公民)

Go 官方将 Ports 分为两类,这并非歧视,而是基于稳定性承诺维护成本的考量。

First-Class Ports 是 Go 官方(Google Go Team)承诺全力支持的平台。它们享有最高级别的待遇,也承担着最重的责任:

  1. 阻断发布 (Block Releases):如果任何一个 First-Class Port 的构建或测试失败,Go 的新版本(包括 Beta 和 RC)就绝对不会发布
  2. 官方兜底:Google 的 Go 团队负责维护这些平台的构建机器(Builder),并对任何破坏这些平台的代码变更负责。

目前的 First-Class Ports 名单(极少,只有核心的几个):
* linux/amd64, linux/386, linux/arm, linux/arm64
* darwin/amd64, darwin/arm64 (macOS)
* windows/amd64, windows/386

冷知识:Linux 下只有使用 glibc 的系统才算 First-Class。使用 musl (如 Alpine Linux) 的并不在这个名单里,虽然它们通常也能工作得很好。

社区的力量:Secondary Ports (次要组合)

除了上述几个“亲儿子”,Go 支持的几十种其他平台(如 freebsd/*, openbsd/*, netbsd/*, aix/*, illumos/*, plan9/*, js/wasm 等)都属于 Secondary Ports

它们的生存法则完全不同:

  1. 社区维护制:必须至少有两名活跃的社区开发者签名画押,承诺维护这个 Port。
  2. 不阻碍发布:如果一个次要 Port 的构建挂了,Go 官方不会为了它推迟版本发布。它可能会在 Release Note 中被标记为“Broken”甚至“Unsupported”。
  3. 自备干粮:维护者必须提供并维护构建机器,接入 Go 的 CI 系统。

这意味着,如果你想让 Go 支持一个冷门的嵌入式系统,你不仅要贡献代码,还得长期确保持续集成(CI)是绿的。

优胜劣汰:如何新增与移除?

新增一个 Port

想让 Go 支持一个新的芯片架构(比如龙芯 LoongArch)?流程是严格的:

  1. 提交 Proposal:论证这个 Port 的价值(潜在用户量)与维护成本的平衡。
  2. 找人:指定至少两名维护者。
  3. 先行:可以在 x/sys 库中先行验证对新Port系统调用的支持,甚至在构建机器跑通之前,代码不能合入主分支。

移除一个 Port (Broken Ports)

Go 不会无限制地背负历史包袱。一个 Port 如果满足以下条件,可能会被移除:

  • 构建失败且无人修:如果一个 Secondary Port 长期构建失败,且维护者失联,它会被标记为 Broken。如果在下一个大版本(1.N+1)发布前还没修好,就会被移除。
  • 硬件消亡:如果硬件都停产了(例如 IBM POWER5),Go 也没必要支持了。
  • 厂商放弃:如果 OS 厂商都不支持了(例如老版本的 macOS),Go 也会跟随弃用。

这就是为什么 Go 在某个版本后不再支持 Windows XP 或 macOS 10.12 的原因——为了让有限的开发资源聚焦在更广泛使用的系统上。

小结

Go 的 Porting Policy 展示了一个成熟开源项目的治理智慧:核心聚焦,边界开放,权责对等

它保证了 Go 在主流平台上的坚如磐石,同时也通过社区机制,让 Go 的触角延伸到了无数小众和新兴的领域。下次当你为一个冷门平台编译 Go 程序成功时,别忘了感谢那些默默维护 Builder 的社区志愿者们。

参考资料:https://go.dev/wiki/PortingPolicy


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

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

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


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

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

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

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

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


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

© 2026, bigwhite. 版权所有.