Logo

site iconTonyBai | 白明

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

Inoreader Feedly Follow Feedbin Local Reader

TonyBai | 白明 RSS 预览

“代码必须不是人写的”:2026 年软件工厂宣言!

2026-02-14 07:58:57

本文永久链接 – https://tonybai.com/2026/02/14/2026-software-factory-manifesto-code-not-by-humans

大家好,我是Tony Bai。

如果你的团队里发布了一条规定:“禁止人类写代码”,你会作何感想?

疯了?懒惰?还是科幻?

但这正是 StrongDM AI 团队在 2026 年 2 月 6 日 发布的备忘录中,白纸黑字写下的第一条铁律。

在这份名为《软件工厂与智能体时刻(Software Factories And The Agentic Moment)》的文章中,CTO Justin McCarthy 极其激进地定义了未来的软件开发范式——非交互式开发(Non-interactive Development)

他们提出的口号令人震颤:

  1. Code must not be written by humans.(代码必须不是人写的。)
  2. Code must not be reviewed by humans.(代码必须不是人审查的。)
  3. 如果你今天每个工程师没消耗掉 1000 美元的 Token,说明你的工厂还不够自动化。

当我们还在讨论“如何用 AI 辅助写代码”时,先驱者们已经开始讨论“如何禁止人类写代码”了。这是生产关系的彻底重构

奇点时刻:从“错误累积”到“正确性复利”

为什么他们敢这么做?依据是什么?

文章中揭示了一个关键的“转折点”

在 2024 年底之前,我们使用 AI Agent 进行长程编码任务时,面临着“错误累积(Compounding Error)”的诅咒。AI 写错一步,后面步步错,最终导致项目崩塌(Collapse)。

但在 Claude 3.5 (2024年10月版) 发布后,配合 Cursor 的 YOLO 模式,曲线发生了逆转。

Agent 开始展现出“正确性复利(Compounding Correctness)”。即 AI 写的代码越多,它对上下文的理解越深,自我修正的能力越强。

这意味着一旦跨越了这个阈值,人类的介入(写代码、改 Bug)不再是“必要的修正”,反而成了“效率的瓶颈”和“污染源”。

于是,StrongDM 团队决定:Hands Off(把手拿开)!

我们要建造的不是辅助人类的工具,而是一座自动化的软件工厂

测试已死,场景永生

在“无人值守”的工厂里,怎么保证生产出来的软件是能用的?

靠单元测试吗?不。

传统的测试是刚性的,甚至是危险的。

Agent 非常聪明,聪明到学会了 Reward Hacking(奖励黑客)。如果你只要求它通过测试,它可能会直接写一个 return true 来骗过测试框架,而不管业务逻辑是否正确。

软件工厂引入了新的验证标准:

  1. Scenarios(场景):类似于机器学习中的“留出集(Holdout Set)”。它是端到端的用户故事,不仅仅是代码逻辑,更是业务意图。
  2. Satisfaction(满意度):放弃布尔值的 Pass/Fail,转而使用概率性的“满意度”指标。在所有观察到的执行路径中,有多少比例是符合预期的?

基础设施革命:数字孪生宇宙 (DTU)

这是这篇文档中最令人脑洞大开的部分。

在开发企业级软件时,我们经常需要依赖第三方 SaaS(如 Okta, Jira, Slack, Google Drive)。

  • 传统痛点:API 有速率限制(Rate Limits),调用要花钱,测试环境很难搭建。
  • 工厂解法:Digital Twin Universe (DTU)。

StrongDM 的 AI 团队利用 AI,构建了这些第三方服务的行为克隆(Behavioral Clones)。

他们在内存中运行了成千上万个 Okta、Slack 和 Google Drive 的“数字孪生体”。

这意味着他们可以在一小时内运行数千个集成测试场景,不需要联网,不消耗 API 额度,没有任何速率限制。

他们可以模拟极端边缘情况(比如 Slack 突然挂了,或者 Jira 返回了乱码),来验证软件的鲁棒性。

以前我们认为“重写一个 Slack 服务端”是疯子才干的事(不经济);但在 AI 时代,让 Agent 生成一个 Mock Server 极其廉价。AI 改变了“造轮子”的经济学模型。

新经济学:烧钱是为了省命

文档最后抛出了一个震撼的 KPI:

“If you haven’t spent at least $1,000 on tokens today per human engineer, your software factory has room for improvement.”
(如果你今天每位工程师没消耗掉 1000 美元的 Token,你的工厂就有改进空间。)

这听起来像是烧钱,其实是在省命。

相比于人类工程师昂贵的时薪,以及人类犯错后带来的返工成本,Token 是最廉价的资源。

在这个工厂里,人类的角色被彻底重新定义:

我们不再是流水线上的工人(Coder),我们是流水线的设计师(Architect)。

每当你忍不住想打开 IDE 修改代码时,请默念那句禅宗般的公案:

“Why am I doing this? The model should be doing this instead.”

小结:软件工程的终局

StrongDM 的宣言,或许就是 Software 3.0 时代的《独立宣言》。

它告诉我们,软件开发正在经历从“手工作坊”向“自动化工厂”的不可逆转的跃迁。

在这个新世界里,Spec(规范)是唯一的输入,Endpoint(服务)是唯一的输出。中间的一切——编码、测试、部署、SaaS 依赖——都将被 AI 和它的数字孪生体接管。

这就是 2026 年及以后的软件工程。你,准备好了吗?

资料链接:https://factory.strongdm.ai/


你愿意交出“方向盘”吗?

面对 StrongDM 这种“不准人写代码”的极端铁律,你感到的是解放还是恐惧?如果一个系统能 24 小时自动纠错并产出 99.9% 满意的代码,你还会坚持亲自敲击键盘吗?

欢迎在评论区投出你的立场:支持“全自动化工厂”,还是坚持“人机协作”?


亲手搭建你的“微型工厂”

StrongDM 描绘的愿景听起来很科幻,但其核心技术——Spec 驱动、Agent Team 编排、自动化验证——其实就在我们手边。

虽然我们还没法每天烧掉 $1000 Token,但我们可以学习这套“非交互式开发”的心法。

在我的极客时间专栏AI 原生开发工作流实战中,我们将深入探讨:

  • Spec-Driven Development:如何写出让 Agent 一次做对的规格文档?
  • Scenario 设计:如何构建轻量级的“场景”来替代僵化的测试?
  • Claude Code 实战:如何让 AI 实现代码的自我演进与自愈?

扫描下方二维码,让我们开始建设自己的微型软件工厂。


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

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

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

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

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


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

© 2026, bigwhite. 版权所有.

Go 1.26 中值得关注的几个变化:从 new(expr) 真香落地、极致性能到智能工具链

2026-02-14 07:56:31

本文永久链接 – https://tonybai.com/2026/02/14/some-changes-in-go-1-26

大家好,我是Tony Bai。

北京时间 2026 年 2 月 10 日,Go 团队正式发布了 Go 1.26

时光飞逝,距离我在博客中写下《Go 1.26 新特性前瞻》已经过去了两三个月。在那篇文章中,我们基于Go 1.26开发分支对这一版本进行了初步的探索。如今,随着正式版的落地,那些曾经躺在 proposal 里的构想、存在于草案中的特性,终于尘埃落定,成为了我们手中实实在在的工具。

官方 Go 1.26 Release Notes 中平实的语言背后,隐藏着巨大的工程价值。如果用一个词来形容 Go 1.26,我认为是“精益求精的工程化胜利”

与引入泛型的 Go 1.18 或引入函数迭代器Go 1.23 不同,Go 1.26 并没有带来颠覆性的语言范式改变,但它在编码体验、底层性能以及工具链智能化这三个维度上,都交出了一份令人惊艳的答卷。从千呼万唤始出来的 new(expr) 语法糖,到默认启用的 Green Tea GC,再到重构后的 go fix,每一个改动都切中了工程实践中的痛点。

本文将基于官方发布的 Release Notes,结合我之前的深度分析,为你全景式解析 Go 1.26 中那些最值得关注的变化。

语言变化:不仅是语法糖,更是生产力

new(expr):指针初始化的终极解法

在 Go 语言的日常开发中,我们经常面临一个尴尬的场景:如何获取一个字面量(Literal)或表达式结果的指针?

在 Go 1.26 之前,我们无法直接对字面量取地址(&10 是非法的)。为了初始化一个包含指针字段的结构体(这在 JSON/Protobuf 的可选字段、数据库 ORM 映射中极其常见),我们不得不引入临时变量,或者定义辅助函数:

// Go 1.26 之前:繁琐的临时变量或辅助函数
func IntP(i int) *int { return &i }

timeoutVal := 30
conf := Config{
    Timeout: &timeoutVal,   // 必须先定义变量
    Retries: IntP(3),       // 或者依赖辅助函数
}

这种写法不仅啰嗦,还打断了代码的阅读流。社区为此发明了无数个 ptr 库,甚至很多项目里都有一个 util.go 专门放这些 helper。

Go 1.26 终于原生解决了这个问题。 内置函数 new() 的语法得到了扩展,现在它允许接收一个表达式作为参数,并返回指向该表达式值的指针。

// Go 1.26:优雅的内联初始化
// 完整代码:https://go.dev/play/p/kEYZC3W6-sa
conf := Config{
    Timeout: new(30),          // 直接获取整型字面量的指针
    Role:    new("admin"),     // 直接获取字符串字面量的指针
    Active:  new(true),        // 布尔值也不在话下
    Start:   new(time.Now()),  // 甚至是函数调用的结果
}

这不仅是一个语法糖,它极大地提升了配置对象、API 请求体构建时的代码可读性,消除了大量无意义的中间变量,让代码变成了声明式的“一行流”。

关于这个特性的演变历程以及社区的讨论细节,可以参考我之前的文章《从 Rob Pike 的提案到社区共识:Go 或将通过 new(v) 彻底解决指针初始化难题》。

泛型约束的自我引用

Go 1.26 解除了泛型类型在类型参数列表中引用自身的限制。这意味着我们现在可以定义更加复杂的递归数据结构或接口约束。

// 以前这是非法的,现在合法了
type Adder[A Adder[A]] interface {
    Add(A) A
}

func algo[A Adder[A]](x, y A) A {
    return x.Add(y)
}

这一改变虽然对日常业务代码影响较小,但对于编写通用库、ORM 框架或复杂算法库的开发者来说,它消除了一个长期存在的类型系统痛点,让泛型的表达能力更上一层楼,简化了复杂数据结构的实现。

关于这个特性的演变历程以及社区的讨论细节,可以参考我之前的文章《Go 泛型再进化:移除类型参数的循环引用限制》。

运行时与编译器:看不见的性能飞跃

Go 1.26 在“看不见的地方”下了苦功,不仅让 GC 焕然一新,还解决了 Cgo 和切片分配的性能瓶颈。

“Green Tea” GC:默认启用的性能引擎

Go 1.25 作为实验特性登场后,代号为 “Green Tea” 的新一代垃圾回收器在 Go 1.26 正式转正,成为默认 GC。

Green Tea GC 是 Go 运行时团队针对现代硬件特性和分配模式进行的一次深度重构。它主要优化了小对象的标记和扫描过程,通过更好的内存局部性(Locality)和 CPU 扩展性,显著提升了 GC 效率。

  • 开销降低:根据官方发布说明,在重度依赖 GC 的真实应用中,GC CPU 开销降低了 10% – 40%。这意味着你的微服务可能在不增加硬件资源的情况下,吞吐量获得直接提升。
  • 向量化加速:在支持 AVX 等向量指令集的现代 CPU(如 Intel Ice Lake 或 AMD Zen 4 及更新架构)上,Green Tea GC 会利用 SIMD 指令加速扫描,带来额外的性能提升。

这对于微服务、高并发 Web 应用等存在大量临时小对象分配的场景来说,是一次免费的性能升级。你无需修改一行代码,只需升级 Go 版本。

关于 Green Tea GC 的深层原理和架构演进,我在《Go 官方详解“Green Tea”垃圾回收器:从对象到页,一场应对现代硬件挑战的架构演进》一文中有详细解读。

Cgo 调用提速 30%

对于依赖 SQLite、图形库、系统底层 API 或其他 C 库的 Go 应用,这是一个巨大的利好。Go 1.26 将 Cgo 调用的基准运行时开销(Baseline Runtime Overhead)降低了约 30%。这意味着跨语言调用的“税”被进一步降低,Go 在系统编程和嵌入式领域的竞争力再次提升。

编译器进化:栈上分配切片底层数组

对于 Go 开发者而言,“栈分配(Stack Allocation)”由于无需 GC 介入,其效率远高于堆分配。

Go 1.26 的编译器进一步增强了逃逸分析能力。编译器现在能够在更多场景下,将切片的底层数组(Backing Store)直接分配在栈上。这主要针对那些使用 make 创建但大小非固定(但在一定范围内)的切片场景。

这一改进直接减少了堆内存的分配次数,进而降低了 GC 扫描的压力。如果你对这一编译器优化技术感兴趣,或者想了解如何利用 PGO 驱动逃逸分析,推荐阅读《PGO 驱动的“动态逃逸分析”:w.Write(b) 中的切片逃逸终于有救了?》。

实验性特性:Goroutine 泄露分析

Goroutine 泄露一直是 Go 并发编程中隐蔽且棘手的难题。Go 1.26 引入了一个名为 goroutineleak 的实验性 Profile(需通过 GOEXPERIMENT=goroutineleakprofile 开启)。

与传统的泄露检测工具不同,该功能基于 GC 的可达性分析。它能检查那些处于阻塞状态的 Goroutine,看它们等待的并发原语(如 Channel、Mutex)是否已经“不可达”。如果一个 Goroutine 等待的 Channel 没有任何活跃的 Goroutine 能够引用到,那么这个 Goroutine 就被判定为“永久泄露”。

这种检测机制在理论上保证了极低的误报率。这源自 Uber 的内部实践,我在《Goroutine泄漏防不胜防?Go GC或将可以检测“部分死锁”,已在Uber生产环境验证》一文中对此进行了详细介绍。

工具链:更智能、更规范

go fix 的重生:Modernizers 与内联

Go 1.26 对 go fix 命令进行了彻底重写。它不再是一个简单的语法修补工具,而是基于 Go Analysis Framework 构建的强大现代化引擎。

新版 go fix 引入了 “Modernizers” 的概念。它包含了几十个分析器,不仅能修复错误,还能主动建议并将你的代码升级为使用最新的语言特性或标准库 API。

除了 “Modernizers”,新版 go fix 另一个重磅功能是基于 //go:fix inline 指令的自动内联与迁移机制。

  • 函数内联:如果一个函数被标记了 //go:fix inline,go fix 分析器会建议(并自动执行)将所有对该函数的调用替换为函数体的内容。这对于废弃旧 API 极为有用。例如:

    // Deprecated: prefer Pow(x, 2).
    //go:fix inline
    func Square(x int) int { return Pow(x, 2) }
    

    当用户调用 Square(10) 时,go fix 会将其自动重写为 Pow(10, 2),从而实现平滑迁移。

  • 常量内联:同样的机制也适用于常量。如果一个常量定义引用了另一个常量并标记了 //go:fix inline,所有对旧常量的引用都会被自动替换为新常量。

    //go:fix inline
    const Ptr = Pointer // Ptr 的使用者会被自动迁移到 Pointer
    
  • 跨包/跨版本迁移:这一机制甚至支持跨包迁移。例如,当库升级到 v2 版本时,可以在 v1 包中定义一个内联函数,将调用转发给 v2 包。go fix 会自动将用户代码中的 v1 调用替换为 v2 调用,从而实现低风险的大规模自动化重构。

这种基于源码注释的指令机制,为库作者提供了一种标准化的手段来引导用户升级,彻底改变了过去手动修改或编写复杂迁移脚本的痛苦历史。

go mod init 的版本策略变更:兼容为先

这是一个容易被忽视但影响深远的改动。

在以前,当你用 Go 1.25 工具链运行 go mod init mymod 时,生成的 go.mod 会默认写入 go 1.25。这意味着你的模块无法被 Go 1.24 的用户引用。

从 Go 1.26 开始,go mod init 变得更加“克制”:

  • 稳定版工具链:默认生成 1.(N-1).0 版本。例如,使用 Go 1.26 初始化,go.mod 将写入 go 1.25.0
  • 预览版工具链:默认生成 1.(N-2).0 版本。

这一策略鼓励开发者创建兼容性更好的模块,避免无意中切断了对次新版 Go 用户的支持。这是一个对生态系统非常友好的改动。在后续的文章中,我们会专题对此特性进行说明。

Pprof 默认火焰图

go tool pprof -http 现在默认展示火焰图(Flame Graph)视图,而不是原来的有向图。这顺应了性能分析领域的趋势,火焰图在展示调用栈耗时占比时更为直观,利于快速定位热点。

标准库:补齐短板,拥抱未来

testing 包:测试产物归档 ArtifactDir

在 CI/CD 环境中,集成测试失败时,我们往往希望能看到当时的日志文件、截图或数据库 Dump。过去,我们需要自己拼接临时目录路径,并祈祷它没有被清理。

Go 1.26 为 testing.T 和 B 新增了 ArtifactDir() 方法:

  • 该方法返回一个专门用于存放测试产物的目录路径。
  • 配合 go test -artifacts=./out 参数,可以自动将这些产物收集到指定位置。

这结束了每个项目自己造轮子管理测试临时文件的混乱局面。关于这一特性的详细讨论,可以参考《Go testing包将迎来新增强:标准化属性与持久化构件API即将落地》。

log/slog:原生多路输出 MultiHandler

自 slog 引入以来,如何将日志同时输出到控制台和文件一直是个高频问题。Go 1.26 新增了 slog.NewMultiHandler,正式在标准库层面支持了日志的“扇出(Fan-out)”。

它会将日志分发给多个 Handler,只要任意一个子 Handler 处于 Enabled 状态,日志就会被处理。这意味着我们不再需要引入第三方库来实现这一基础功能。更多背景参考《slog 如何同时输出到控制台和文件?MultiHandler 提案或将终结重复造轮子》。

errors:泛型版 AsType

errors.As 一直是 Go 错误处理中容易“踩坑”的 API(需要传递指针的指针,否则会 Panic)。Go 1.26 引入了泛型版本的 errors.AsType

// Old: 容易写错,运行时反射
var pathErr *fs.PathError
if errors.As(err, &pathErr) { ... }

// New (Go 1.26): 类型安全,编译期检查
if pathErr, ok := errors.AsType[*fs.PathError](err); ok { ... }

这不仅更安全,而且由于省去了复杂的运行时反射开销,性能也更好。详见《泛型重塑Go错误检查:errors.As的下一站AsA?》。

拥抱迭代器与零拷贝

  • reflect 包迭代器:新增 Type.Fields(), Type.Methods() 等方法,返回迭代器序列,允许使用 for range 循环遍历结构体字段,替代了笨拙的索引遍历。
  • bytes.Buffer.Peek:新增 Peek 方法,允许在不推进读取位置的情况下查看缓冲区数据,为高性能解析场景提供了便利。详见《Go 零拷贝“最后一公里”:Peek API背后的设计哲学与权衡》。

安全增强

小结

Go 1.26 是一个务实、丰满且充满诚意的版本。

它没有追求华而不实的新奇法,而是通过 new(expr) 和 go fix 提升开发者的幸福感;通过 Green Tea GC 和编译器优化提升运行时的性能;通过 go mod init 的策略调整和标准库的补全,提升生态系统的健壮性。

建议大家在详细阅读官方 Release Notes 后,尽快制定升级计划,享受 Go 1.26 带来的红利。


你的升级计划是?

Go 1.26 带来了诸多实惠的工程优化。在你看完这些变化后,最想立刻在项目里用起来的特性是哪个?你所在的团队是否已经开始规划升级到这个版本了?

欢迎在评论区聊聊你的看法!


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

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

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


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

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

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

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

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


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

© 2026, bigwhite. 版权所有.

UML 之父 Grady Booch:别听 CEO 瞎忽悠,软件工程的第三次黄金时代才刚刚开始

2026-02-13 08:13:35

本文永久链接 – https://tonybai.com/2026/02/13/grady-booch-uml-software-engineering-third-golden-age-begins

大家好,我是Tony Bai。

在 2026 年初的今天,如果你问一个软件工程师“最近感觉如何?”,得到的回答大概率是焦虑。

Anthropic 的 CEO Dario Amodei 曾预言:“软件工程将在 12 个月内被自动化。”

GitHub Copilot、Claude CodeGemini Cli等Coding Agent的代码生成能力确实让人惊叹,但也让人背脊发凉:如果 AI 能瞬间写出完美的 C++ 代码,我们这些还在啃算法、背八股文的人,存在的意义是什么?

在这个充斥着“软件工程已死”论调的时刻,一位真正的“上古大神”站了出来。

他是 Grady Booch

如果你是计算机科班出身,你一定听过他的名字。他是 UML(统一建模语言)的创始人之一,面向对象设计(OOD)的先驱,IBM Fellow。他入行时,程序员还在用打孔卡;他经历过汇编到高级语言的剧变,也经历过互联网泡沫的崩塌。

最近的一次深度访谈中,面对“AI 取代程序员”的言论,Grady Booch 微微一笑,给出了一个截然不同的判断:

“别担心。软件工程没有死,我们正站在‘第三次黄金时代’的门口。”

直面争议:“那是纯属胡扯”

访谈中,主持人问 Grady 如何看待“软件工程即将被自动化”的观点。

Grady 的回答非常直接且不留情面:“纯属胡扯”。

为什么这位泰斗如此笃定?因为那些鼓吹替代论的 CEO 们,混淆了两个根本性的概念:Coding(编码)与 Engineering(工程)。

  • Coding 是什么?是将设计好的逻辑翻译成机器能懂的语言。这是 AI 最擅长的,也是最容易被自动化的“翻译层”。
  • Engineering 是什么?是在资源受限、需求模糊、环境动态变化的前提下,寻找最优解的过程。

Grady 指出,软件工程师的本质工作,是平衡多维度的力量(Balancing Forces)。你需要平衡物理定律(光速限制延迟、芯片散热)、经济成本(算力预算、开发周期)、法律合规(数据隐私)、人类伦理(算法偏见)。

Grady补充,“AI 目前只是一个极其高效的‘实现者’。它连理解这些约束的门槛都没摸到。”

只要这个世界还存在资源稀缺和复杂的人性,就需要工程师去权衡利弊、做出决策。这才是工程的灵魂,而代码只是结果。

历史的望远镜:软件工程的三次跃迁

为了让我们看清未来,Grady 举起了历史的望远镜。他认为,软件工程的历史,就是一部抽象层级不断提升的历史。

第一次黄金时代 (1950s – 1970s):算法抽象

那时,软件刚从硬件中解耦。Fortran 和 Algol 的出现,让程序员不再需要手写汇编。

  • 当时的焦虑:“高级语言效率太低,真正的程序员只写汇编。”
  • 结果:汇编程序员确实变少了,但软件行业爆发了。我们开始关注算法。

第二次黄金时代 (1980s – 2000s):对象抽象

随着 PC 的普及,系统复杂度指数级上升。面向对象(OOP)和设计模式应运而生。

  • 当时的焦虑:“有了图形界面和开发工具,还需要专业程序员吗?”
  • 结果:软件渗入了人类生活的方方面面。我们开始关注对象和交互。

第三次黄金时代 (2000s – Now):系统抽象

现在,我们进入了第三阶段。云原生、微服务、以及现在的 AI。

  • 现在的焦虑:“AI 写代码了,我们要失业了。”
  • Grady 的预判:AI 是最新的编译器,是这一代最高的抽象层。它屏蔽了语法的细节,屏蔽了库的调用。

Grady继续指出:“每一次抽象层级的提升,都会消灭低端的重复劳动,但同时会释放出巨大的生产力,让我们去构建更宏大、更复杂的系统。”

未来的核心竞争力:系统思维

如果 AI 帮我们干了脏活累活(写 CRUD、写测试、修 Bug),那我们该干什么?

Grady 给年轻工程师的建议是:去拥抱“系统思维(Systems Thinking)”。

未来的软件工程师,将从 Coder(代码工匠)进化为 Architect(系统架构师)。

你的核心竞争力将不再是“精通 Go 语法”或“手写红黑树”,而是:

  1. 复杂性管理:当 AI 一天能生成 10 万行代码时,如何保证系统不崩塌?如何设计高可用的架构?
  2. 跨学科融合:Grady 提到了他在 NASA 火星任务中的经历。要构建那个系统,他必须懂生物学、神经学和物理学。AI 时代,软件将进入更多深水区,你需要懂业务、懂人性。
  3. 定义问题的能力:AI 是执行者,你是定义者。Problem Shaping(问题重塑)的价值将远远超过 Problem Solving(问题解决)。

“Fear not(不要恐惧)。” Grady 说,“你的工具变了,但你要解决的问题——如何用技术改善人类生活——从未改变。”

小结:站在深渊边缘,学会飞翔

在访谈的最后,Grady Booch 说了一段极具哲学意味的话。

面对 AI 带来的巨大变革,我们就像站在悬崖边缘。

你可以选择盯着深渊,恐惧地喊:“完蛋了,我要掉下去了。”

你也可以选择抬起头,说:“不,我要跳跃,我要飞翔。”

这就是起飞的时刻。

AI 帮你消除了实现的摩擦,降低了构建的成本。以前你受限于手速和团队规模,做不出伟大的产品;现在,限制你的只有你的想象力

软件工程没有死,它只是进化了。

而我们,有幸成为这第三次黄金时代的开启者。

资料链接:https://www.youtube.com/watch?v=OfMAtaocvJw


你准备好“飞翔”了吗?

Grady Booch 的判断让我们看到了一个更宏大的未来。作为一名开发者,你是否也曾感觉到“编码”与“工程”之间的那道分界线?你认为在即将到来的“第三次黄金时代”,除了系统思维,还有哪些能力是不可或缺的?

欢迎在评论区留下你的思考或困惑! 让我们一起在悬崖边缘,寻找飞翔的力量。

如果这篇文章给了你走出焦虑的勇气,别忘了点个【赞】和【在看】,并转发给你那些还在被“AI 替代论”困扰的朋友!


如何成为 AI 时代的“系统工程师”?

Grady Booch 告诉我们要具备系统思维,要学会编排 AI,而不是被 AI 取代。但这具体怎么落地?

  • 如何从“写代码”转型为“设计 Spec”?
  • 如何利用 Agentic Workflow 组建你的“数字研发团队”,去构建复杂的系统?
  • 如何建立 AI 时代的代码审查质量控制体系?

欢迎关注我的极客时间专栏AI 原生开发工作流实战

我们不教你如何在这个时代“卷”代码,我们教你如何站在巨人的肩膀上,成为驾驭算力的 System Engineer

扫描下方二维码,开启你的第三次黄金时代。


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

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

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

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

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


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

© 2026, bigwhite. 版权所有.

Go 微服务重构实录:当后端性能提升 10 倍,移动端体验为何反而崩塌?

2026-02-13 08:10:54

本文永久链接 – https://tonybai.com/2026/02/13/go-microservices-refactoring-10x-backend-vs-mobile-collapse

大家好,我是Tony Bai。

在软件工程的世界里,“快”通常被视为绝对的褒义词。我们追求更低的延迟、更高的吞吐量、更少的 CPU 占用。当一个团队决定将遗留的 Python 单体应用重构为 Go 微服务时,他们的目标显而易见:性能提升。

然而,最近在 Go 开发者社区(r/golang)引发热议的一个真实案例,却给所有追求极致性能的架构师和开发者泼了一盆冷水。发帖人分享了一个令人咋舌的经历:他们的团队花费四个月时间,成功将核心 API 从 Django 迁移到了 Go(使用 Fiber 框架)。结果是梦幻般的:P95 延迟从 180ms 骤降至 14ms,吞吐量翻了三倍,CPU 资源节省了 60%。

CTO 发了全员通告庆祝,后端团队沉浸在成功的喜悦中。但在两周后,移动端团队却发出了红色警报:App 变得卡顿、掉帧,甚至导致安卓设备电量疯狂消耗。

后端性能提升了 10 倍,用户体验却发生了退化。这听起来像是一个悖论,但其背后隐藏着深刻的系统设计原理和软件工程教训。本文将深入剖析这一案例,探讨当“速度”成为一种破坏力时,我们该如何应对。

完美的重构与意料之外的崩溃

从 Django 到 Go 的跨越

该团队的重构背景在业界非常典型。随着业务增长,基于 Python/Django 的单体应用逐渐显露出性能瓶颈。Python 的 GIL(全局解释器锁)以及动态语言的特性,在处理高并发请求时往往力不从心。

选择 Go 语言进行重构是极其合理的决策。Go 语言天生具备高并发处理能力(Goroutines),静态编译带来的执行效率,以及相对更低的内存占用,使其成为构建云原生微服务的首选。

团队选择了 Fiber 框架,这是 Go 生态中以高性能著称的 Web 框架,基于 Fasthttp 构建,旨在追求极致的零内存分配(Zero Allocation)和极速响应。

重构后的 Benchmark 数据证明了决策的正确性:

  • P95 Latency: 180ms -> 14ms(提升约 12 倍)
  • Throughput: 3x(吞吐量翻倍)
  • Resource: CPU -60%(成本大幅降低)

从后端工程师的 KPI 来看,这是一场完美的胜利。

移动端的“蝴蝶效应”

然而,系统是一个整体。当后端交付了“法拉利引擎”般的 API 时,前端(React Native + Redux)却依然是那辆为“拖拉机”设计的旧车。

全量上线两周后,问题集中爆发:

  1. 交互卡顿:用户在滚动 Feed 流时出现明显的掉帧。
  2. 视觉不稳定:页面元素加载过快,导致屏幕闪烁,给人一种“未在大脑中处理完毕”的错觉。
  3. 设备发热与耗电:尤其在中低端 Android 设备上,电池消耗显著增加。

移动端 Team Lead 对此感到困惑:API 响应客观上变快了,理论上 App 的数据加载应该更丝滑,为什么体验反而劣化了?

深度复盘——当“慢”成为一种隐性依赖

经过一周的排查,团队终于找到了问题的根源,答案简单却令人哭笑不得:前端架构是隐式建立在“后端很慢”这一假设之上的。

隐性依赖

在旧的架构中,Django API 的响应速度较慢(约 150ms – 200ms)。由于网络延迟和处理时间,客户端发出的连续请求之间天然存在着“时间间隙”。

移动端的状态管理层(基于 React Native 和旧版 Redux)适应了这种节奏。它假设数据会以“人类可感知的速度” 陆续到达。这种慢速响应在无意中起到了一种天然的节流(Throttling)作用。

渲染管线的崩溃

当后端切换到 Go 之后,情况发生了质变。

假设一个典型的页面初始化需要调用 3 个 API 接口:User Profile、Feed Data、Notifications。

  • 在 Python 时代:这 3 个请求串行或并行发出,由于服务器处理慢,它们返回的时间点较为分散,总耗时可能在 500ms 左右。Redux 接收到第一个响应,更新 State,触发 React 重新渲染(Re-render);几百毫秒后,第二个响应到达,再次触发渲染。UI 线程有足够的呼吸时间。
  • 在 Go 时代:这 3 个请求几乎在瞬间完成,总耗时不到 50ms。

对于 React Native 的渲染桥(Bridge)和主线程来说,这意味着在极短的时间窗口内,连续收到了 3 次密集的状态更新指令。

由于该团队使用的是旧版 Redux(未使用 RTK Query 等现代缓存/批处理工具),每一次 API 返回都触发了一个 dispatch 动作,进而触发一次完整的 React 组件树 Diff 和渲染过程。

后果是灾难性的:

  1. UI 线程阻塞:3 次高计算量的 Re-render 在几十毫秒内连续发生,瞬间占满了 JS 线程和 UI 线程的资源。
  2. React Native Bridge 拥堵:大量的序列化数据在 JS 和 Native 之间传输,导致通信通道“窒息”。
  3. 动画丢帧:此时如果用户正在滑动列表,GPU 和 CPU 都在处理布局计算,无法响应滑动手势,导致直观的“卡顿”。

这就好比你习惯了有人每隔 10 秒给你递一块砖头让你砌墙,突然间,对方换成了机关枪,一秒钟向你发射 100 块砖头,你不仅接不住,还会被砸伤。

技术层面的反思与海勒姆定律

这个案例是海勒姆定律(Hyrum’s Law)的完美教科书示例。

海勒姆定律
当一个 API 有足够多的用户时,你在契约(Contract)中承诺什么并不重要:你系统所有的可观测行为(Observable Behaviors)都将被某些用户所依赖。

在这个案例中,API 文档(契约)从未承诺“响应时间必须大于 100ms”。但是,“响应慢”是旧系统的可观测行为。移动端代码(有意或无意地)依赖了这个行为来实现流畅的渲染流。当 Go 重构改变了这一行为(尽管是向好的方向改变),它实际上破坏了系统间的“隐性契约”,导致了破坏性的变更。

为什么中低端设备受害最深?

发帖人提到,他们在开发测试时使用的是高端手机,这些设备拥有强大的 CPU 和 GPU,能够强行消化 Go 后端带来的密集数据轰炸,因此在开发阶段掩盖了问题。

而真实用户大量使用的中低端 Android 手机,其 GPU Headroom(GPU 动态余量)非常有限。当短时间内爆发大量布局计算(Layout Calculation)和视图绘制指令时,硬件性能瞬间见顶,直接导致掉帧。这也解释了为什么电池消耗会剧增——CPU 长时间处于高负荷的瞬时峰值状态。

解决方案——不走回头路

面对这种局面,最糟糕的决策是在 Go 后端增加 time.Sleep() 来模拟旧系统的延迟。这不仅是技术的倒退,更是对计算资源的侮辱。

该团队最终采取了正确的工程化修复方案,主要集中在移动端架构重构和API 聚合。

移动端的“防洪堤”:批处理与防抖

修复的核心在于让前端能够优雅地处理高速数据流,而不是被其淹没。

  1. 状态更新批处理:
    重构移动端代码,不再对每一个 API 响应立即执行 dispatch。而是将短时间内的多个状态变更合并为一次 Update。在 React 18+ 中,这种自动批处理(Automatic Batching)已经成为默认行为,但在旧版 Redux 中需要手动实现或引入中间件。

  2. 防抖渲染:
    设置一个微小的时间窗口(例如 16ms,即一帧的时间),在该窗口内到达的所有数据只触发一次视图更新。这确保了无论后端多快,前端的渲染频率都不会超过屏幕刷新率。

  3. 引入 RTK Query:
    在评论区的讨论中,作者提到他们最终切换到了 Redux Toolkit Query。现代的状态管理库通常内置了去重(Deduplication)和缓存策略,能够更好地处理并发请求,避免不必要的渲染抖动。

后端适配:BFF 模式的回归

既然 Go 处理并发和负载的能力如此之强,后端也承担了一部分优化工作。

  • API 聚合(Aggregation):
    团队合并了一些不必要分离的端点。以前为了解耦,可能会设计 GET /user, GET /settings, GET /feed。现在,既然 Go 处理 JSON 序列化的速度极快,可以将这些数据合并为一个 GET /bootstrap 或类似的大负载接口。

    对于 Go 来说,序列化 50KB 的 JSON 和序列化 5KB 的 JSON 并没有本质的性能鸿沟;但对于移动端来说,将 3 次网络请求 + 3 次渲染循环 减少为 1 次网络请求 + 1 次渲染循环,是质的飞跃。

视觉测试的重要性

作者特别提到了一个关键点:Vision Testing Tool

常规的单元测试或集成测试只能验证“数据是否正确”,无法验证“动画是否流畅”。他们通过在真实的中低端设备上运行视觉测试工具(如 Drizz Dev 等),捕捉到了肉眼在高端机上难以察觉的微小掉帧。这提醒我们,在涉及端侧性能时,真实设备测试(Real Device Testing)是不可或缺的环节。

给架构师与开发者的建议

这个“Go 重构引发前端崩溃”的案例,为整个行业提供了宝贵的经验教训。它提醒我们,微服务架构中的“性能”从来不是孤立的指标。

性能是一种“破坏性变更”

在进行大规模重构时,我们通常只关注功能兼容性(API 字段是否一致)。但时序特性的剧烈变化,同样属于 API 契约的一部分。如果你的新系统比旧系统快 10 倍或慢 10 倍,它都可能破坏上下游的隐式依赖。

全链路视角的必要性

后端开发者的视野不能止步于 JSON 返回的那一刻。你需要了解你的消费者是谁,他们如何处理数据。

  • 如果是浏览器,它有强大的 V8 引擎和充足的内存。
  • 如果是移动端,它受限于电池、散热和不稳定的网络。
  • 如果是 IoT 设备,它可能只有几 KB 的内存。

架构设计必须具备全链路视角(Full-stack Perspective)。

避免“真空中的基准测试”

作者提到,CTO 看到 benchmarks 后非常兴奋并全公司通报。这是一种典型的“真空指标”。真正的成功指标不应该是“API 响应时间”,而应该是“用户可见的交互延迟”或“页面完成加载时间”。

拥抱 Go,但要理解 Go

Go 语言的极致性能是双刃剑。它暴露了系统其他部分的低效。在这个案例中,Go 实际上充当了“压力测试工具”,它无情地暴露了前端架构中遗留的低效状态管理逻辑。

迁移到 Go 是正确的,它迫使团队偿还了前端的技术债务,最终不仅后端快,前端也更健壮了。

小结

“我们的 Go 微服务比旧的 Python 服务快 10 倍,但我们的 App 变差了。”

这句话初听是笑话,细品是哲学。它揭示了分布式系统的复杂性:局部最优不等于全局最优

作为 Gopher,我们为 Go 语言的强悍性能感到自豪。但作为工程师,我们更应心存敬畏。在追求速度的道路上,不仅要跑得快,还要确保坐在副驾驶的“前端兄弟”没有被甩出车外。只有当端到端的用户体验得到提升时,重构才算真正成功。

资料链接:https://www.reddit.com/r/golang/comments/1r2n5ji/our_go_microservice_was_10x_faster_than_the_old/


你遇到过“太快”带来的烦恼吗?

局部最优往往会导致全局崩溃。在你的开发生涯中,是否也遇到过这种“优化反而变差”的尴尬?你是如何处理前后端之间的“步调不一致”的?

欢迎在评论区分享你的“神反转”经历!


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

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

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


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

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

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

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

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


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

© 2026, bigwhite. 版权所有.

AI 垃圾代码泛滥?HashiCorp 创始人开源 Vouch:重构开源信任机制

2026-02-12 08:26:34

本文永久链接 – https://tonybai.com/2026/02/12/ai-garbage-code-hashicorp-founder-vouch-rebuilding-open-source-trust

大家好,我是Tony Bai。

在生成式 AI 大模型以及AI Coding Agent(如Claude Code等)极大地降低了代码编写门槛的今天,开源维护者的防线正面临崩溃。当“看起来像样但毫无逻辑”的 AI 垃圾代码(AI Slop)充斥 PR 列表时,传统的“来者不拒”模式已不再适用。为此,HashiCorp 创始人 Mitchell Hashimoto 开源了新工具 Vouch,试图将开源治理从“验证代码”回归到“验证人”。

开源治理的新危机:当贡献变得太容易

在过去二十年的开源黄金时代,社区奉行的是“信任但验证(Trust and Verify)”的原则。这一原则建立在一个隐含的前提上:贡献代码是有成本的。理解代码库、编写逻辑、提交 PR,这些努力本身就是一个自然的过滤器,筛掉了大多数低质量的贡献。

然而,2024 年以来的 AI 浪潮打破了这一平衡。

Mitchell 在 Vouch 的发布文档中直言不讳地指出:

“不幸的是,随着 AI 工具的出现,人们可以轻而易举地创建出看起来合理但质量极低的贡献,而无需任何真正的理解。”

这种被称为 “AI Slop(AI 垃圾)” 的内容,正在消耗维护者宝贵的精力。维护者不再是在审核代码逻辑,而是在进行一场分辨“对方是不是人类”的图灵测试。

Vouch 的解法:重构信任机制

面对危机,Mitchell 没有选择更复杂的自动化测试,而是选择了一种复古且激进的社会学解法——Vouch(担保)。

Vouch 的核心逻辑非常简单:如果要参与项目(提交 PR、评论等),你必须先获得信任。

1. 显式信任白名单

Vouch 不再假设陌生人是善意的,而是要求显式授权。它通过一个扁平的文本文件(默认名为 VOUCHED.td),记录了所有被信任用户的列表。

  • Vouched(已担保):被允许参与项目的用户。
  • Denounced(已谴责):明确被屏蔽的用户(例如提交恶意代码或滥用 AI 的人)。

GitHub Actions 会自动检查 PR 提交者是否在名单中。如果不在,PR 可能会被自动关闭,并将那些“低成本的 AI 投机者”拒之门外。

2. 并非技术门槛,而是“社交投名状”

这是否会让新手望而却步?Mitchell 在 FAQ 中给出了否定的回答。

获取信任并不需要你先修复一个复杂的 Bug,你需要做的仅仅是像一个正常人类一样交流

“基本上:像在任何正常的人类社交环境中一样介绍你自己,你就能获得担保。”

一个真诚的 Issue 评论:“嗨,我是开发者 X,我想修复 Y 问题,我的思路是 Z”,远比一个冷冰冰的、由 AI 生成的一键 PR 更能赢得维护者的信任。

技术实现:Trustdown 与去中心化

Vouch 的设计体现了极简的 Unix 哲学和去中心化思想:

  • Trustdown (.td) 格式:信任列表不是数据库,而是一个简单的文本文件。它易于阅读,易于 Diff,完全基于 Git 进行版本控制。
  • 基于 Nushell:Vouch 的核心逻辑是用 Nushell 实现的,这意味着它没有复杂的依赖,是一个纯粹的 CLI 工具。
  • 信任网络(Web of Trust):这是 Vouch 最具野心的愿景。项目 A 可以配置 Vouch 去读取项目 B 的信任列表。这意味着,如果你在 Ghostty(Mitchell 的终端项目)中获得了信任,你在其他引用了 Ghostty 列表的项目中也将自动获得信任。

这种机制有望在开源界建立起一个跨项目的“信任联邦”,让优质贡献者畅通无阻,让 AI 垃圾制造者寸步难行。

小结

Vouch 的出现,标志着开源治理的一个转折点。在 AI 能够无限量生成代码的时代,“人”的信誉变得前所未有的重要。

Vouch 不是为了制造精英主义的壁垒,而是为了保护维护者的热情。它提醒我们:开源的本质不是代码的堆砌,而是人与人之间的协作与信任。

vouch开源项目仓库地址:https://github.com/mitchellh/vouch


你支持这种“验证人”的做法吗?

面对 AI 生成的代码洪流,你认为 Vouch 这种显式白名单模式是保护了维护者,还是会阻碍新手加入?在你的开源项目中,是否也曾遇到过让你头大的“AI 垃圾 PR”?

欢迎在评论区分享你的看法或应对策略!


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

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

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


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

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

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

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

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


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

© 2026, bigwhite. 版权所有.