输入需求,输出系统:AI Agent 正在实现软件工程的“终极梦想” —— 软件工厂!

本文永久链接 – https://tonybai.com/2026/02/10/ai-agent-realizes-ultimate-dream-software-factory 大家好,我是Tony Bai。 在计算机科学与软件工程的历史长河中,始终存在着一个令人魂牵梦绕、却又屡屡受挫的终极梦想——“软件工厂(Software Factory)”。 早在 20 世纪 60 年代,日本的大型科技企业(如日立、东芝)就开始尝试引入制造业的流水线理念来生产软件。80 年代,CASE(计算机辅助软件工程)工具试图实现全流程自动化;21 世纪初,MDA(模型驱动架构)试图通过 UML 图直接生成代码。 然而,这些尝试无一例外都未能成为主流。 为什么?因为软件开发与硬件制造有着本质的不同。硬件是标准化的,而软件需求充满了不确定性(Ambiguity)、非标准化(Non-standard)和创造性(Creativity)。传统的刚性流水线无法处理这种“软”的复杂性。 但这一次,不一样。 随着以 GPT-5.2、Claude 4.5、Gemini Pro 3.0 等为代表的大语言模型(LLM)能力的爆发,以Claude Code、Gemini Cli等编码智能体的快速演进,以及Agentic Workflow(智能体工作流)的成熟,我们第一次拥有了能够理解“非标需求”并将其转化为“标准代码”的通用推理引擎。 特斯拉前 AI 总监 Andrej Karpathy 将这一刻定义为 Software 3.0 的黎明。在这个新时代,那个尘封已久的“软件工厂”蓝图,正在从幻想变成触手可及的现实。 今天,我们就来深度剖析这座正在崛起的 AI 软件工厂,看看它将如何重塑我们的行业、生态与职业。 Software 3.0:从“写代码”到“定义目标” 要理解软件工厂的本质,我们需要先理解 Karpathy 提出的软件演进三阶段论。这是一次技术的迭代,更是编程范式的根本性迁移。 Software 1.0:显式编程 (Code) 这是我们最熟悉的时代。程序员使用 Go、Python、C++、Java、TypeScript 等语言,编写显式的逻辑规则。 特征: 人类必须清楚地知道每一步该怎么做(How),然后翻译给机器。 局限: 复杂度随着代码行数线性(甚至指数)增长,维护成本极高。这是典型的“手工作坊”模式。 [...]

2026/2/10
articleCard.readMore

告别 Flaky Tests:Go 官方拟引入 testing/nettest,重塑内存网络测试标准

本文永久链接 – https://tonybai.com/2026/02/10/goodbye-flaky-tests-go-testing-nettest-proposal 大家好,我是Tony Bai。 在 Go 语言的测试哲学中,我们一直追求快速、稳定和可重复。然而,一旦测试涉及到 net 包——无论是 HTTP 服务、RPC 框架还是自定义协议——这种追求往往就会撞上现实的墙壁。 我们通常面临两种选择:要么在 localhost 上监听真实端口,但这会导致测试并发时的端口冲突、防火墙干扰以及操作系统层面的不确定性;要么使用 net.Pipe,但它那“同步、无缓冲”的特性与真实的 TCP 连接大相径庭,常常导致生产环境运行良好的代码在测试中死锁。 为了彻底解决这一“最后一公里”的测试难题,Go 团队的 Damien Neil 提议引入 testing/nettest。这是一个完全在内存中运行,但行为上高度仿真真实网络栈(支持缓冲、异步、错误注入)的实现。 本文将和你一起剖析该提案的背景、设计细节以及它将如何改变我们编写网络测试的方式。 为什么我们需要 testing/nettest? 要理解 nettest 的价值,我们首先需要审视现状。目前的 Go 标准库在网络测试辅助方面,存在显著的“中间地带真空”。 net.Pipe 的致命缺陷 net.Pipe() 是目前标准库提供的唯一内存网络模拟工具。但它本质上是一个同步内存管道。 同步阻塞:写入端必须等待读取端准备好,数据才能传输。没有内部缓冲区。 死锁陷阱:真实的 TCP 连接是有内核缓冲区的。应用代码往往假设“由于有缓冲,我可以先写一点数据,然后再去读”。这种假设在 net.Pipe 上会直接导致死锁——写操作阻塞在等待读,而读操作还没开始。 行为失真:它无法模拟网络延迟,也无法模拟缓冲区满时的阻塞行为。 localhost 的不可靠性 使用回环地址(Loopback)是另一种常见做法,但它带来了“外部依赖”: 端口资源:并行运行成千上万个测试时,临时端口可能耗尽。 环境干扰:CI 环境可能有奇怪的防火墙规则或网络配置。 速度瓶颈:尽管是回环,依然涉及系统调用和内核协议栈的开销,比纯内存操作慢得多。 synctest 的拼图 Go 1.24 [...]

2026/2/10
articleCard.readMore

AMP 宣布砍掉 VS Code 插件:为什么说“人机结对编程”已死?

本文永久链接 – https://tonybai.com/2026/02/09/amp-kills-vscode-plugin-human-ai-pair-programming-is-dead 大家好,我是Tony Bai。 如果一家 AI 编程工具公司,宣布砍掉它最受欢迎、用户量最大的产品入口,你会怎么想? 这听起来像是商业自杀,但这正是 AMP(从 Sourcegraph 孵化出来的 AI 编程 Agent)刚刚做出的决定。 在 2026 年 2 月的一期播客中,AMP 的创始人 Thorsten 和 Quinn 宣布:将在 60 天后,彻底关停 AMP 的 VS Code 插件和 Cursor 扩展。 要知道,在过去的两年里(2024-2025),IDE 侧边栏(Sidebar)几乎定义了 AI 编程的标准形态。无论是 GitHub Copilot、Cursor 还是早期的 AMP,我们都习惯了在编辑器里写代码,在侧边栏里和 AI “乒乓球”式地对话。 但 AMP 团队认为:这个时代结束了。 “你看着代码,AI 在侧边栏看着你,你们一来一回地对话……这种模式不是未来。对于那 1% 想要活在未来的开发者来说,侧边栏不仅不是助力,反而是枷锁。” 为什么他们敢于“烧掉桥梁”?因为一种全新的开发范式——“AI软件工厂模式(The Factory)”,正在随着 GPT-5.2 和 [...]

2026/2/9
articleCard.readMore

沉睡 8 年的提案被唤醒:Go 语言真的要引入“不可变类型”了吗?

本文永久链接 – https://tonybai.com/2026/02/09/go-immutable-types-8-year-dormant-proposal-awakened 大家好,我是Tony Bai。 2026 年 2 月 4 日,在 Go 语言规范团队的最新一次“语言变更评审会议”纪要中,一个尘封已久的 Issue 赫然在列:proposal: spec: immutable type qualifier #27975。 这个提案最初提交于 2018 年,那是“Towards Go 2”口号喊得最响亮的年代。当时的 Go 社区正沉浸在对泛型、错误处理和不可变性的热烈讨论中。然而,随着泛型的落地,关于不可变性的声音似乎逐渐微弱。 如今,这个提案被重新摆上台面,是否意味着 Go 语言在完成泛型这一宏大叙事后,终于要向“数据竞争”和“防御性编程”这两个顽疾开刀了? 今天,我们就来看看复盘这份长达 8 年的提案,剖析一下“不可变性”对 Go 意味着什么,以及它面临的巨大挑战。 痛点:防御性拷贝的代价 在 Go 1.x 的世界里,我们为了保证数据的安全性,往往需要付出高昂的代价。 假设你有一个包含敏感配置的结构体,你想把它暴露给其他包,但又不希望它被修改: type Config struct { Servers []string // ... } // 现在的做法:为了安全,必须返回拷贝 func (c *Config) [...]

2026/2/9
articleCard.readMore

数据打脸刻板印象:Go 的“样板代码”竟然和 Rust 一样多?

本文永久链接 – https://tonybai.com/2026/02/08/go-boilerplate-code-vs-rust-data-refutes-stereotypes 大家好,我是Tony Bai。 在编程语言的鄙视链中,Go 语言常常因为其“繁琐”而饱受诟病。 “if err != nil 写断手”、“缺乏语法糖”、“到处都是重复的样板代码”…… 这些似乎已经成为了 Go 的标签。 相比之下,Rust 往往被视为“表达力”的代表,拥有强大的宏、模式匹配和类型系统,能够用更少的代码做更多的事。 然而,Ben Boyter 最近的一项硬核研究,通过分析 GitHub 上各语言 Top 100 仓库(总计约 4 亿行代码),得出了一个令编程语言社区大跌眼镜的结论: 在代码重复率和“样板代码”密度上,Go 和 Rust 几乎处于同一水平线。 不仅是行数:ULOC 指标 传统的 SLOC(源代码行数)往往无法真实反映项目的复杂度和冗余度。Ben Boyter 使用了他开发的工具 scc 中的一个特殊指标:ULOC (Unique Lines of Code,唯一代码行数)。 ULOC 指标并非简单的“全量去重”,而是通过剥离“结构性噪音”来更精准地衡量系统的真实复杂度。其计算逻辑如下: 剔除结构化冗余:不仅排除了空行,还排除了单纯的闭合大括号行(})以及在不同文件中大量重复出现的公共引用代码(如 include 或 import)。 过滤文件级模板:有效识别并扣除在项目中每个文件顶部几乎完全相同的 License(许可证)声明头,避免这些非逻辑性的“样板文字”虚增代码总量。 计入注释成本:与传统 SLOC 不同,ULOC 会保留注释统计。作者认为,注释与代码一样需要同等的维护精力,反映了开发者的思考过程,因此属于“有效工作量”。 [...]

2026/2/8
articleCard.readMore

告别单打独斗!Claude Code 全新“Agent Team”模式:当 AI 开始组队干活

本文永久链接 – https://tonybai.com/2026/02/08/claude-code-agent-team-mode 大家好,我是Tony Bai。 2026年2月6日凌晨,Anthropic 扔出了一枚重磅炸弹。 随着史上最强编程大模型 Claude Opus 4.6 的发布,官方博客披露了一个令人瞠目结舌的内部实验: 一个由 16 个 Claude Agent 组成的“全自动研发团队”,在基本没有人类干预的情况下,仅用两周时间,从零写出了一个 10 万行代码的 C 语言编译器,并且成功编译了 Linux 6.9 内核。 注意,这不是简单的代码补全,也不是写个贪吃蛇游戏。 这是系统级软件开发。它需要处理复杂的语法解析、中间代码生成、寄存器分配,以及对 x86、ARM、RISC-V 等多种架构的底层支持。 这一刻,我觉得我们之前熟悉的 AI 编程(Chat 模式、Copilot 模式)瞬间变得像是在玩玩具。 这是工业级 AI 生产力的黎明。 它标志着软件工程正在从“人机结对”进化为“智能体集群协作(Agent Team)”。 什么是 Agent Team 模式? 为什么之前的 AI 做不到这一点? 因为单体 Agent 的能力是有物理极限的。 上下文限制:写到 1 万行代码时,AI 就开始“顾头不顾腚”,忘了前面的定义。 线性阻塞:你必须等它写完这段代码,报错了你得告诉它,它再改。效率极低。 Agent [...]

2026/2/8
articleCard.readMore

“Go 2,请不要发生!”:如果 Go 变成了“缝合怪”,你还会爱它吗?

本文永久链接 – https://tonybai.com/2026/02/06/go-2-dont-become-a-frankenstein-monster 大家好,我是Tony Bai。 “Go 2, please don’t make it happen.” 近日,一张充满讽刺意味的老梗图在 r/golang 社区又炸开了锅。图片的上方,是我们熟悉的 Gopher 吉祥物——那只呆萌、简单、甚至有点傻气的蓝色地鼠,它象征着 Go 语言纯粹而克制的灵魂。 而在图片的下方,这只 Gopher 发生了一场令人毛骨悚然的“变异”:它长出了巨大的龙翼,上面写着“Generics”(泛型);它生出了锋利的机械利爪,标签是“Try/Catch”;它的身体变得臃肿不堪,缝合了“Mixins”(混入)、“Lambda 表达式”、“操作符重载”、“多态方法”等各种来自其他语言的特性。 这只被缝合得面目全非的怪兽,被标注为——“Go 2”。 时隔多年,这幅图再次引爆了社区,获得了数百个点赞和近百条激烈的评论。尽管 Go 语言的掌舵人 Russ Cox 在2023年的一篇名为“Backward Compatibility, Go 1.21, and Go 2”的博客文章中就早已明确表示“Go 永远不会有破坏性的 Go 2”,但这个话题依然像一根敏感的神经,触动了无数 Gopher 内心深处最隐秘的恐惧:我们热爱的这门语言,会不会最终也难逃“熵增”的宿命,变成另一个臃肿复杂的 C++ 或 Java? 今天,就让我们借着这场社区激辩,再次探讨一下 Go 语言的过去、现在与未来。如果 Go 真的变成了那个“缝合怪”,你还会爱它吗? 恐惧的根源:当“简单”成为一种罪过 帖子下的最高赞评论,道出了许多资深 Gopher 的心声:“想要 Go [...]

2026/2/6
articleCard.readMore

大项目构建太慢?Brad Fitzpatrick 提议引入 -cachelink 降低测试等待时间

本文永久链接 – https://tonybai.com/2026/02/05/brad-fitzpatrick-cachelink-reduce-go-test-wait-time 大家好,我是Tony Bai。 在维护大型 Go 单体仓库(Monorepo)时,你是否遇到过这样的场景:明明只是修改了测试的运行参数(比如 -run 的正则),或者在不同的 CI 节点上运行同一个包的测试,却发现 go test 依然在缓慢地执行“链接(Linking)”步骤? 对于代码量巨大的项目,链接过程往往是构建链条中最耗时的一环。为了解决这一痛点,Go 社区领袖、Tailscale 核心开发者 Brad Fitzpatrick 近日提交了 #77349 提案,建议引入 -cachelink 标志。这一看似微小的改动,有望在分布式测试和重复执行场景下,显著“挤出”原本被浪费的等待时间。 被忽视的瓶颈:重复链接的代价 Go 的构建缓存(GOCACHE)机制已经非常高效,它能很好地缓存编译阶段的中间产物(.a 文件)。但是,当你运行 go test 时,工具链的最后一步——将所有依赖链接成一个可执行的测试二进制文件——通常是“一次性”的。 这意味着,即使你的代码没有任何变动,只要测试指令稍有变化(例如多次运行 go test 但指定不同的测试用例),Go 工具链往往会重新触发链接器。 # 第一次运行:链接 + 执行 $ go test -run=^TestFoo$ ./pkg/ # 第二次运行(代码未变):依然触发重新链接 + 执行 $ go test -run=^TestBar$ ./pkg/ [...]

2026/2/5
articleCard.readMore

承认吧,AI 写的代码,平均质量已经超过了 80% 的人类程序员!

本文永久链接 – https://tonybai.com/2026/02/05/ai-code-quality-surpasses-80-percent-of-human-programmers 大家好,我是Tony Bai。 随着 Claude Code、Gemini Cli、OpenCode 等 AI 智能体编程工具的爆火,技术圈里出现了一种流行的论调: “AI 写的代码质量不高,全是 Bug。” “简单的还行,复杂的还得靠人。” “AI 也就是个实习生水平。” 这些批评有道理吗?当然有。AI 确实会产生幻觉,逻辑偶尔会断裂。 但这种批评忽略了一个最基本的事实:我们拿来对比的基准(Baseline),往往是我们心目中“理想的资深工程师”。 请现在、立刻、马上打开你公司的 Github私有库或GitLab,随便点开一个两年前的遗留项目,看看里面的代码: 那些随意的变量命名 tmp, data1; 那些长达 800 行、没有任何注释的上帝函数; 那些为了赶上线而写死的 Magic Number; 那些复制粘贴了 5 遍却忘了改参数的逻辑…… … … 这才是人类编码的常态。 如果我们摘下“幸存者偏差”的滤镜,从全局视角的大数定律来看,一个残酷的真相正在浮出水面: AI 写的代码,虽然缺乏神韵,但其平均质量,可能已经超越了80%的人类程序员。 人类的“熵增” vs. AI 的“基准线” 人类写代码,本质上是一个对抗熵增的过程。而人类在这个过程中充满了弱点: 情绪与疲劳:下午 5 点写的代码,质量通常低于上午 10 点。为了赶着回家,我们会下意识地省略错误处理(catch (e) { // TODO [...]

2026/2/5
articleCard.readMore

忘掉 MCP?OpenClaw 作者说:CLI 才是 AI 连接世界的终极接口

本文永久链接 – https://tonybai.com/2026/02/04/openclaw-author-cli-ultimate-agent-interface-vs-mcp 大家好,我是Tony Bai。 如果回望 2025 年上半年,AI 圈最火的技术关键词无疑是 MCP (Model Context Protocol)。彼时,行业内满怀希望地为智能体定义 Schema,构建 JSON-RPC 服务,试图为 AI 打造一套标准化的能力连接协议。 然而,时间来到 2026 年初,技术圈的热点正在悄然发生偏移。 最近,一个名为 OpenClaw(其前身是火遍全网的 Moltbot/Clawdbot)的开源项目,用一种极其“复古”的方式给所有人上了一课。其作者 Peter Steinberger 提出了一个极其犀利的观点:与其费力去对齐协议,不如直接回归 CLI(命令行)。 在 OpenClaw 的世界里,要让智能体获得一项新能力——无论是控制智能家居、管理 WhatsApp 消息,还是操作云服务器——秘诀只有一个:写一个 CLI。 作者发现,只要有一个带有 –help 的工具,智能体就能自发掌握它。在经历了一整年的协议崇拜后,这种“低摩擦”的命令行工具,是否才是智能体操作现实世界的最佳方案呢? 在 GUI 为了人类进化了 40 年后,CLI 是否正在因为 AI 而迎来一场“文艺复兴”?它会是 AI 连接世界的终极接口吗? 在这篇文章中,我们就来简单探讨一下。 语义对齐:为什么智能体更倾向于 CLI? 智能体(Agent)和人类不同,它不需要精美的图形界面(GUI),它需要的是能够被理解的逻辑边界。 自描述的帮助文档即“自然语言指令” 人类觉得 CLI 难用,是因为人类记不住参数。但对于以 [...]

2026/2/4
articleCard.readMore