<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tony Bai &#187; 搜索结果  &#187;  www</title>
	<atom:link href="http://tonybai.com/search/www/feed/rss2/" rel="self" type="application/rss+xml" />
	<link>https://tonybai.com</link>
	<description>一个程序员的心路历程</description>
	<lastBuildDate>Sat, 04 Apr 2026 00:51:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>当AI 榨干了编程所有的乐趣：我不再是程序员，而是“Claude Code”的项目经理</title>
		<link>https://tonybai.com/2026/04/04/the-death-of-coding-joy-in-the-age-of-ai-agents/</link>
		<comments>https://tonybai.com/2026/04/04/the-death-of-coding-joy-in-the-age-of-ai-agents/#comments</comments>
		<pubDate>Sat, 04 Apr 2026 00:45:30 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[Agency]]></category>
		<category><![CDATA[Agents]]></category>
		<category><![CDATA[AIProgramming]]></category>
		<category><![CDATA[AI编程]]></category>
		<category><![CDATA[AutonomousProgramming]]></category>
		<category><![CDATA[CodeGeneration]]></category>
		<category><![CDATA[CodeQuality]]></category>
		<category><![CDATA[Codereview]]></category>
		<category><![CDATA[CodingAgent]]></category>
		<category><![CDATA[DunningKrugerEffect]]></category>
		<category><![CDATA[HandcraftedCode]]></category>
		<category><![CDATA[IdentityDegradation]]></category>
		<category><![CDATA[SoftwareEngineering]]></category>
		<category><![CDATA[SystemArchitecture]]></category>
		<category><![CDATA[TechDividend]]></category>
		<category><![CDATA[TechnicalDebt]]></category>
		<category><![CDATA[VibeCoding]]></category>
		<category><![CDATA[人类主观能动性]]></category>
		<category><![CDATA[代码审查]]></category>
		<category><![CDATA[代码生成]]></category>
		<category><![CDATA[代码质量]]></category>
		<category><![CDATA[手动编码]]></category>
		<category><![CDATA[技术债务]]></category>
		<category><![CDATA[技术红利]]></category>
		<category><![CDATA[智能体]]></category>
		<category><![CDATA[氛围编程]]></category>
		<category><![CDATA[系统架构]]></category>
		<category><![CDATA[自动编程]]></category>
		<category><![CDATA[身份降维]]></category>
		<category><![CDATA[软件工程]]></category>
		<category><![CDATA[达克效应]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=6146</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/04/04/the-death-of-coding-joy-in-the-age-of-ai-agents 大家好，我是Tony Bai。 过去的两年，我们见证了 AI 编程工具从“玩具”到“神器”的进化。从 Copilot 的代码补全，到 Claude Code 的“一句话建站”，再到各种Coding Agent 的“自主开发”，我们写代码的效率被史无前例地拉满了。 但在这场效率的狂欢之下，一股难以言喻的“失落感”和“空虚感”，正在资深程序员群体中悄然蔓延。 就在几天前，Reddit 的 r/webdev 社区（一个拥有 66 万开发者的顶级论坛）上，一位拥有 20 年经验的资深后端工程师发了一篇帖子，标题极其刺眼：《AI has sucked all the fun out of programming》（AI 榨干了编程所有的乐趣）。 他写道： “我曾对自己解决难题、深挖源码的能力无比自豪。但自从 Claude Code 变得越来越强，我感觉自己不再是一个程序员，更像是一个项目经理，每天管理着一个叫 Claude Code 的中高级外包。我交付功能的速度比以往任何时候都快，但内心却无比空虚。这些没有灵魂的特性，我无法再把它们看作是我的创造。” “AI 让我变得极度懒惰，它彻底摧毁了我作为一个优秀工程师、甚至一个人类的价值。我希望它从未被发明过。” 这篇充满“怨气”的帖子，像一块巨石砸入了平静的湖面，瞬间引爆了整个社区。短短一天，帖子收获了 1500+ 的高赞和近 400 条评论。无数开发者涌入评论区，分享着自己在 AI 时代相似的困惑、挣扎与幻灭。 今天，我们就来扒开这场顶级社区的“赛博哀悼会”，看看当 AI 剥夺了编程最后的“手艺活”时，我们这些“数字工匠”，到底失去了什么？ 身份的剥夺：从“创造者”到“代码审查员” 在评论区，点赞最高的一条回复，只用了一句话，就说出了所有人的心声： [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/the-death-of-coding-joy-in-the-age-of-ai-agents-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/04/04/the-death-of-coding-joy-in-the-age-of-ai-agents">本文永久链接</a> &#8211; https://tonybai.com/2026/04/04/the-death-of-coding-joy-in-the-age-of-ai-agents</p>
<p>大家好，我是Tony Bai。</p>
<p>过去的两年，我们见证了 AI 编程工具从“玩具”到“神器”的进化。从 Copilot 的代码补全，到 <a href="https://mp.weixin.qq.com/s/NWYyq6LV3WV08lJloK0OZg">Claude Code</a> 的“一句话建站”，再到各种Coding Agent 的“自主开发”，我们写代码的效率被史无前例地拉满了。</p>
<p><strong>但在这场效率的狂欢之下，一股难以言喻的“失落感”和“空虚感”，正在资深程序员群体中悄然蔓延。</strong></p>
<p>就在几天前，Reddit 的 r/webdev 社区（一个拥有 66 万开发者的顶级论坛）上，一位拥有 20 年经验的资深后端工程师发了一篇帖子，标题极其刺眼：<strong>《<a href="https://www.reddit.com/r/webdev/comments/1s6mtt7/ai_has_sucked_all_the_fun_out_of_programming/">AI has sucked all the fun out of programming</a>》（AI 榨干了编程所有的乐趣）。</strong></p>
<p>他写道：</p>
<blockquote>
<p>“我曾对自己解决难题、深挖源码的能力无比自豪。但自从 Claude Code 变得越来越强，我感觉自己不再是一个程序员，更像是一个项目经理，每天管理着一个叫 Claude Code 的中高级外包。我交付功能的速度比以往任何时候都快，但内心却无比空虚。这些没有灵魂的特性，我无法再把它们看作是我的创造。”</p>
<p>“AI 让我变得极度懒惰，它彻底摧毁了我作为一个优秀工程师、甚至一个人类的价值。我希望它从未被发明过。”</p>
</blockquote>
<p>这篇充满“怨气”的帖子，像一块巨石砸入了平静的湖面，瞬间引爆了整个社区。短短一天，帖子收获了 1500+ 的高赞和近 400 条评论。无数开发者涌入评论区，分享着自己在 AI 时代相似的困惑、挣扎与幻灭。</p>
<p>今天，我们就来扒开这场顶级社区的“赛博哀悼会”，看看当 AI 剥夺了编程最后的“手艺活”时，我们这些“数字工匠”，到底失去了什么？</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/agentic-api-in-action-qr.png" alt="" /></p>
<h2>身份的剥夺：从“创造者”到“代码审查员”</h2>
<p>在评论区，点赞最高的一条回复，只用了一句话，就说出了所有人的心声：</p>
<blockquote>
<p>“是的，是的，是的。而且，审查那些由 AI 生成的、过度工程化的垃圾 PR，简直让人精疲力竭。”</p>
</blockquote>
<p>这精准地概括了资深程序员们失落感的第一个根源：<strong>身份的降维</strong>。</p>
<p>在没有 AI 的时代，我们是“创造者”。我们享受的是从零开始，将复杂的业务逻辑，通过一行行精巧的代码，构建成一个优雅系统的过程。那种“庖丁解牛”般的掌控感和心流体验，是支撑我们熬过无数个加班夜的精神支柱。</p>
<p>而现在呢？</p>
<p>AI 成了那个大刀阔斧的“创造者”，它可以在几分钟内生成 10 个文件、成千上万行代码。而我们，这些曾经的“建筑师”，<strong>被迫降级成了一个卑微的“代码审查员（Code Reviewer）”</strong>。</p>
<p>我们的日常工作，不再是“如何巧妙地设计一个接口”，而是“如何在这堆由 AI 生成的、看似完美却隐藏着无数暗雷的代码里，找出那个该死的 Bug”。</p>
<p>一位开发者形容这种感觉就像“吃屎”：</p>
<blockquote>
<p>“重构一小段代码，就像在菜里加点盐，很有趣。但如果让你 9 点到 5 点都在重构 AI 生成的屎山，那就完全是另一回事了。”</p>
</blockquote>
<h2>学习的终结：当“挣扎”的权利被剥夺</h2>
<p>除了身份的降维，更让开发者们感到恐惧的，是<strong>“学习感的丧失”</strong>。</p>
<p>一位只有 2 年经验的前端开发者的评论获得了 123 个高赞：</p>
<blockquote>
<p>“AI 确实让我变快了。但有时我感觉，我跳过了那些本该挣扎和学习的部分。而正是那些挣扎，才让知识真正刻进我的脑子里。”</p>
</blockquote>
<p>这说出了一个残酷的真相：<strong>人类的学习，本质上是一个伴随着痛苦和摩擦的过程。</strong></p>
<p>当你为了一个 Bug 熬了三个小时，翻遍了 Stack Overflow，最后在某个不起眼的角落找到解决方案时，你对这个 Bug 的理解是刻骨铭心的。</p>
<p>但现在，你只需要把报错信息扔给 Claude Code，它会在 3 秒钟内给你正确答案。</p>
<p>效率是提升了，但你的大脑也失去了构建深度知识模型（Mental Models）的机会。你成了知识的“搬运工”，而不是“内化者”。</p>
<p>更可怕的是，这种趋势正在从个人蔓延到团队，甚至威胁到新人的成长路径。</p>
<p>评论区的一位开发者也分享了他的遭遇：</p>
<blockquote>
<p>“我们是做嵌入式开发的，AI 很多时候根本不懂底层。但我们的经理对 AI 产生了宗教般的狂热，他强迫我们必须用 AI。如果我们不用，他就会 visibly upset（肉眼可见地不爽）；如果我们用了，然后报告 AI 出了问题，他会立刻假定是我们用错了，而不是 AI 的问题。”</p>
</blockquote>
<p>这种来自管理层的“AI 迷信”，正在让那些真正懂技术的专家感到心寒。当你的老板拿着 ChatGPT 的一段胡言乱语来质疑你的专业判断时，技术尊严的丧失，远比失去乐趣更令人痛苦。</p>
<h2>正在分裂的社区：效率派 vs 手艺派</h2>
<p>当然，也并非所有人都对 AI 感到悲观。评论区同样出现了鲜明的“效率派”阵营。</p>
<p>一位拥有 27 年经验的资深开发者表达了截然不同的看法：</p>
<blockquote>
<p>“我反而觉得 AI 增强了我的能力。我依然负责掌控项目的整体架构，AI 只是帮我处理那些烦人的、重复的体力活。这就像我有了一个能完美听懂我话的初级开发人员，而且他永远不会抱怨。”</p>
</blockquote>
<p>另一位开发者则将这种转变描述为角色的升维：</p>
<blockquote>
<p>“乐趣转移了，但没有消失。我们团队的人类现在负责所有的架构决策，AI 负责具体的实现。创造性的工作依然存在——它从‘如何写好这个函数’，变成了‘如何设计好这个系统’。我们从‘砖瓦工’，变成了‘建筑师’。”</p>
</blockquote>
<p>这两种截然不同的声音，揭示了 AI 时代开发者社区正在经历的一场剧烈的身份分化：</p>
<ul>
<li><strong>手艺派</strong>：他们热爱编码本身，享受那种与代码“人剑合一”的创造快感。对他们而言，AI 剥夺了这个过程。</li>
<li><strong>效率派（或架构派）</strong>：他们更享受从宏观层面掌控系统的乐趣，将编码视为一种实现目标的手段，而非目的。对他们而言，AI 是解放他们生产力的“外骨骼”。</li>
</ul>
<p>这两种观点没有对错，它仅仅反映了不同性格的开发者，在面对一场史无前例的生产关系变革时，所产生的自然分化。</p>
<h2>出路何在？：夺回“原子化”的掌控力</h2>
<p>在这场关于“乐趣与灵魂”的大讨论中，我们依然能找到一些极具建设性的生存法则。</p>
<p><strong>第一，坚决捍卫“人类最终解释权”。</strong></p>
<p>AI 可以生成，但你必须成为那个拥有“一票否决权”的最终审计者。正如一位开发者所言：</p>
<blockquote>
<p>“我正在无视所有关于‘再不拥抱 AI 就会被淘汰’的末日预言。我只把它当成一个强化版的搜索引擎。如果未来真的只需要一批不懂底层原理的‘提示词操作员’，那我的工作反正也变得毫无意义了。但如果未来依然需要懂底层的人，那我的处境绝对比那些‘氛围编码’了好几年的人强得多。”</p>
</blockquote>
<p><strong>第二，主动创造“无 AI 日（Zero AI Day）”。</strong></p>
<p>另外一位开发者的建议获得了很多人的认同：</p>
<blockquote>
<p>“为了对抗这种侵蚀，我每周会选定一天作为我的‘无 AI 日’。在那一天，我禁止自己使用任何 AI 工具。这种感觉非常自由。”</p>
</blockquote>
<p>这就像健身中的“欺骗餐”，它能让你重新找回对代码最原始的“手感”。</p>
<p><strong>第三，把 AI 当作“副驾驶”，而不是“自动驾驶”。</strong></p>
<p>真正的老司机，绝不会在高速上双手离开方向盘。他们会利用 AI 去处理那些最耗时、最没有创造性的部分：写单元测试、生成 OpenAPI 文档、转换数据格式。</p>
<p>而在核心的业务逻辑和架构设计上，<strong>亲手去写，去感受系统的“摩擦力（Friction）”，去构建你脑海中那张独一无二的架构蓝图。</strong></p>
<h2>小结：从“多巴胺”到“内啡肽”</h2>
<p>AI 的出现，极大地满足了我们对“即时反馈”的多巴胺式快感：敲一句话，代码就出来了。</p>
<p>但真正的编程乐趣，那种来自于深度思考、解决难题后获得的、持久而宁静的成就感，属于“内啡肽”。</p>
<p>AI 正在用廉价的多巴胺，稀释我们获取内啡肽的能力。</p>
<p>我们不必为此感到绝望。正如工业革命没有消灭所有手工艺人，反而催生了更昂贵的“高级定制”一样。</p>
<p>当 AI 能够批量生产千篇一律的“预制菜”代码时，那些依然能够亲手雕琢出艺术品级架构的“米其林大厨”，其价值将不降反升。</p>
<p>问题的关键在于，在这场大浪淘沙中，你，是选择成为流水线上一颗随时可被替换的螺丝钉，还是那个手握最终菜谱的顶级大厨？</p>
<hr />
<p><strong>今日互动探讨：</strong></p>
<p>在使用 AI 编程后，你的“编程乐趣”是增加了还是减少了？你觉得 AI 帮你完成的最有价值和最没有价值的工作分别是什么？</p>
<p>欢迎在评论区分享你的真实感受！</p>
<hr />
<p>还在为“复制粘贴喂AI”而烦恼？我的新专栏 <strong>《<a href="http://gk.link/a/12EPd">AI原生开发工作流实战</a>》</strong> 将带你：</p>
<ul>
<li>告别低效，重塑开发范式</li>
<li>驾驭AI Agent(Claude Code)，实现工作流自动化</li>
<li>从“AI使用者”进化为规范驱动开发的“工作流指挥家”</li>
</ul>
<p>扫描下方二维码，开启你的AI原生开发之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/ai-native-dev-workflow-qr.png" alt="" /></p>
<hr />
<p><strong>原「Gopher部落」已重装升级为「Go &amp; AI 精进营」知识星球，快来加入星球，开启你的技术跃迁之旅吧！</strong></p>
<p>我们致力于打造一个高品质的 <strong>Go 语言深度学习</strong> 与 <strong>AI 应用探索</strong> 平台。在这里，你将获得：</p>
<ul>
<li><strong>体系化 Go 核心进阶内容:</strong> 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏，夯实你的 Go 内功。</li>
<li><strong>前沿 Go+AI 实战赋能:</strong> 紧跟时代步伐，学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等，掌握 AI 时代新技能。 </li>
<li><strong>星主 Tony Bai 亲自答疑:</strong> 遇到难题？星主第一时间为你深度解析，扫清学习障碍。</li>
<li><strong>高活跃 Gopher 交流圈:</strong> 与众多优秀 Gopher 分享心得、讨论技术，碰撞思想火花。</li>
<li><strong>独家资源与内容首发:</strong> 技术文章、课程更新、精选资源，第一时间触达。</li>
</ul>
<p>衷心希望「Go &amp; AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚，享受技术精进的快乐！欢迎你的加入！</p>
<p><img src="http://image.tonybai.com/img/tonybai/gopher-and-ai-tribe-zsxq-small-card.jpg" alt="img{512x368}" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/04/04/the-death-of-coding-joy-in-the-age-of-ai-agents/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一天重写 JSONata，我用 400 美元干掉了公司 50 万美元的 K8s 集群</title>
		<link>https://tonybai.com/2026/04/01/rewrote-jsonata-in-golang-with-ai/</link>
		<comments>https://tonybai.com/2026/04/01/rewrote-jsonata-in-golang-with-ai/#comments</comments>
		<pubDate>Wed, 01 Apr 2026 00:29:37 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[AIDriven]]></category>
		<category><![CDATA[AI驱动]]></category>
		<category><![CDATA[ArtificialIntelligence]]></category>
		<category><![CDATA[AutomationTools]]></category>
		<category><![CDATA[CodeGeneration]]></category>
		<category><![CDATA[CostOptimization]]></category>
		<category><![CDATA[CrossLanguageRPC]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[GoLanguage]]></category>
		<category><![CDATA[Go语言]]></category>
		<category><![CDATA[HighPerformance]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSONata]]></category>
		<category><![CDATA[k8s]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[latency]]></category>
		<category><![CDATA[MemoryManagement]]></category>
		<category><![CDATA[Microservices]]></category>
		<category><![CDATA[nodejs]]></category>
		<category><![CDATA[PerformanceBoost]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[Rewrite]]></category>
		<category><![CDATA[TechnicalDebt]]></category>
		<category><![CDATA[TestDrivenDevelopment]]></category>
		<category><![CDATA[ZeroHeapAllocation]]></category>
		<category><![CDATA[人工智能]]></category>
		<category><![CDATA[代码生成]]></category>
		<category><![CDATA[代码重构]]></category>
		<category><![CDATA[内存管理]]></category>
		<category><![CDATA[延迟]]></category>
		<category><![CDATA[微服务]]></category>
		<category><![CDATA[性能提升]]></category>
		<category><![CDATA[成本优化]]></category>
		<category><![CDATA[技术债]]></category>
		<category><![CDATA[测试驱动开发]]></category>
		<category><![CDATA[自动化工具]]></category>
		<category><![CDATA[跨语言调用]]></category>
		<category><![CDATA[重写]]></category>
		<category><![CDATA[零内存分配]]></category>
		<category><![CDATA[零堆内存分配]]></category>
		<category><![CDATA[高性能]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=6127</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/04/01/rewrote-jsonata-in-golang-with-ai 大家好，我是Tony Bai。 过去的几年，我们见证了 AI 编程工具从“玩具”到“神器”的进化。无数开发者都在分享自己效率翻倍的喜悦。 你有没有想过，用 AI 来完成一次“外科手术式”的精准重构，一天之内，就能帮你把公司每年烧掉的 50 万美元（约 360 万人民币）的服务器成本，直接砍到零？ 这听起来像天方夜谭，但它真实地发生了。 就在前几天，以色列安全公司 Reco 的工程师 Nir Barak 发表了一篇极其硬核的博客。他详细复盘了自己是如何在一天之内，花费了仅仅 400 美元的 Token 费用，利用 AI 将一个用 JavaScript 编写的核心组件 JSONata，完美地重写为了纯 Go 版本，最终为公司节省了每年 50 万美元的开销，并带来了 1000 倍的性能提升。 这不仅仅是一个“AI 真牛逼”的简单故事。它背后揭示的，是一套足以改变我们未来架构选型和技术债偿还方式的“AI 驱动重构（AI-Driven Refactoring）”实用方法。 跨语言 RPC，微服务架构中最昂贵的“性能税” 要理解这次重构的意义有多么重大，首先得看看 Nir Barak 的团队曾经陷入了多深的泥潭。 他们的核心业务是一个用 Go 编写的高性能数据管道，每天处理数十亿的事件。但其中有一个环节，需要用到一个名为 JSONata 的查询语言（你可以把它想象成带 Lambda 函数的 jq）来执行动态策略。 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/rewrote-jsonata-in-golang-with-ai-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/04/01/rewrote-jsonata-in-golang-with-ai">本文永久链接</a> &#8211; https://tonybai.com/2026/04/01/rewrote-jsonata-in-golang-with-ai</p>
<p>大家好，我是Tony Bai。</p>
<p>过去的几年，我们见证了 AI 编程工具从“玩具”到“神器”的进化。无数开发者都在分享自己效率翻倍的喜悦。</p>
<p>你有没有想过，用 AI 来完成一次“外科手术式”的精准重构，一天之内，就能帮你把公司每年烧掉的 50 万美元（约 360 万人民币）的服务器成本，直接砍到零？</p>
<p>这听起来像天方夜谭，但它真实地发生了。</p>
<p>就在前几天，以色列安全公司 Reco 的工程师 Nir Barak 发表了<a href="https://www.reco.ai/blog/we-rewrote-jsonata-with-ai">一篇极其硬核的博客</a>。他详细复盘了自己是如何在<strong>一天之内，花费了仅仅 400 美元的 Token 费用</strong>，利用 AI 将一个用 JavaScript 编写的核心组件 JSONata，完美地重写为了纯 Go 版本，最终为公司节省了每年 50 万美元的开销，并带来了 1000 倍的性能提升。</p>
<p>这不仅仅是一个“AI 真牛逼”的简单故事。它背后揭示的，是一套足以改变我们未来架构选型和技术债偿还方式的<strong>“AI 驱动重构（AI-Driven Refactoring）”</strong>实用方法。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/agentic-software-engineering-qr.png" alt="" /></p>
<h2>跨语言 RPC，微服务架构中最昂贵的“性能税”</h2>
<p>要理解这次重构的意义有多么重大，首先得看看 Nir Barak 的团队曾经陷入了多深的泥潭。</p>
<p>他们的核心业务是一个用 Go 编写的高性能数据管道，每天处理数十亿的事件。但其中有一个环节，需要用到一个名为 JSONata 的查询语言（你可以把它想象成带 Lambda 函数的 jq）来执行动态策略。</p>
<p>尴尬的是，JSONata 的官方实现是 JavaScript 写的。</p>
<p>这就导致了一个极其痛苦的架构：他们的主业务 Go 服务，为了执行这些规则，不得不去远程调用（RPC）一个专门部署在 Kubernetes 上的庞大的 Node.js 服务集群。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/rewrote-jsonata-in-golang-with-ai-2.png" alt="" /></p>
<p>这个“小小的”跨语言调用，给他们带来了三大噩梦：</p>
<ol>
<li><strong>恐怖的成本</strong>：为了扛住流量，这个 jsonata-js 集群常年需要维持 <strong>300 多个 Pod 副本</strong>，光是这部分，每年就要烧掉 <strong>30 万美元</strong>的计算资源。</li>
<li><strong>惊人的延迟</strong>：一次最简单的字段查找，比如 email = “admin@co.com”，在 Node.js 内部执行可能只需要几纳秒。但算上序列化、跨进程网络往返的开销，一次 RPC 调用在啥也没干之前，<strong>150 微秒</strong>的延迟就先进来了。对于一个每天处理几十亿事件的系统来说，这简直是灾难。</li>
<li><strong>意想不到的运维黑洞</strong>：随着业务增长，Pod 数量一度多到<strong>耗尽了 Kubernetes 集群的 IP 地址分配上限！</strong></li>
</ol>
<p>Nir Barak 的团队当然也尝试过各种小修小补：优化表达式、加缓存、甚至用 CGO 把 V8 引擎直接嵌进 Go 里……但这些都只是“头痛医头”，无法根治“跨语言”这颗毒瘤。</p>
<h2>Cloudflare 的“抄作业”哲学</h2>
<p>转机发生在前几周。Nir Barak 看到了 Cloudflare 那篇刷爆全网的文章《<a href="https://blog.cloudflare.com/vinext/">我们如何用 AI 在一周内重构 Next.js</a>》。</p>
<p>Cloudflare 的做法极其“暴力”且有效：他们没有让 AI 去创造新东西，而是把 Next.js 现成的spec，以及包含几千个 case 的官方测试套件（Test Suite）直接扔给大模型，然后对 AI 下达了一个简单粗暴的指令：</p>
<p><strong>“我不管你怎么实现，给我写一个能在 Vite 上跑通所有这些测试的 API 就行！”</strong></p>
<p>Nir Barak 看到这里，瞬间被点醒了：<strong>“我们面临的问题一模一样！我们也有 jsonata-js 官方那套包含 1778 个测试用例的完整套件啊！”</strong></p>
<p>与其让 AI 去搞创新，不如把它变成一个任劳任怨、24 小时待命的“代码翻译工”！</p>
<p>于是，他花了一个周末，用 AI 制定了一个极其清晰的“三步走”作战计划：</p>
<ol>
<li>第一步（人类智慧）：用 Go 语言把 jsonata-js 的测试套件先“翻译”过来。</li>
<li>第二步（AI 体力）：把 JSONata 2.x 的官方文档和规范全部喂给 AI。</li>
<li>第三步（测试驱动）：对 AI 下达指令：“开始写 Go 代码，目标是跑通第一步的所有测试用例。”</li>
</ol>
<p>第二天，他按下了“开始键”。</p>
<h2>7 小时，400 美元，13000 行 Go 代码</h2>
<p>接下来的故事，充满了令人肾上腺素飙升的极客快感。</p>
<p>Nir Barak 坐在电脑前，看着 AI Agent 像一台失控的缝纫机一样，疯狂地生成 Go 代码、运行测试、读取报错、然后自我修正。</p>
<p>整个过程被划分成了几个“波次（Waves）”：先实现核心解析器，再实现内置函数，最后处理各种边缘 case。</p>
<p>在 AI 与测试用例的左右互搏之下，仅仅 <strong>7 个小时</strong> 后，奇迹发生了：</p>
<p>一个包含 13,000 多行纯 Go 代码的、名为 gnata 的全新 JSONata 实现诞生了。它完美通过了官方所有的 1778 个测试用例。</p>
<p>而这整个过程的成本呢？</p>
<p><strong>400 美元的 Token 费用。</strong></p>
<p>Nir Barak 在博客中晒出了一张截图，数据显示，在重构 gnata 的那一天，AI 生成的代码占比高达 <strong>91.7%</strong>！</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/rewrote-jsonata-in-golang-with-ai-3.png" alt="" /></p>
<p>当他把这个 PR 提交到公司内部时，立刻有人质疑 ROI（投资回报率）。而他的回答简单粗暴：</p>
<p><strong>“上个月，jsonata-js 集群的成本是 2.5 万美元。现在，是 0。”</strong></p>
<h2>百倍性能与意外之喜：“手术刀式”重构的深远影响</h2>
<p>成本降为零已经足够震撼，但性能上的收益更是堪称“恐怖”。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/rewrote-jsonata-in-golang-with-ai-4.png" alt="" /></p>
<p>这还只是开始。由于 gnata 是纯 Go 实现，Nir Barak 团队得以进行更深度的“魔改”：他们设计了一套<strong>两层评估架构</strong>。对于简单的字段查找，gnata 直接在原始的 JSON 字节流上操作，实现了 <strong>零堆内存分配（Zero Heap Allocations）</strong>！只有遇到复杂表达式时，才会启动完整的解析器。</p>
<p>在接下来的两周内，他们乘胜追击，用 gnata 的批量处理能力，替换掉了主数据管道中另一个极其臃肿、靠启动上万个 Goroutine 来并发处理规则的旧引擎。 结果：又省下了每年 20 万美元。</p>
<p>短短两周，两次“外科手术式”的重构，总共为公司节省了每年 50 万美元的开销。</p>
<p>最让人意想不到的是，这次重构还带来了组织层面的“意外之喜”：</p>
<p>gnata 是公司内部第一个完全由 AI Agent 大规模参与生成的 PR。在 Code Review 的过程中，团队成员被迫去学习如何分辨“AI 真正发现的并发 Bug”和“AI 瞎操心的代码格式问题”。这次经历，为他们后续制定全公司的 AI Code Review 规范积累了宝贵的实战经验。</p>
<h2>小结：我们不再只是“氛围感编码”</h2>
<p>在文章的结尾，Nir Barak 提到了 AI 大神 Andrej Karpathy 最近的观点，大意是：</p>
<blockquote>
<p>“编程正在变得面目全非。在底层，深厚的技术专长正成为比以往任何时候都更强大的‘乘数效应放大器’。”</p>
</blockquote>
<p>Nir Barak 感慨道，直到最近，他自己都对那种完全由 AI Agent 生成代码的“氛围编码（Vibe coding）”持怀疑态度。但 2026 年 2 月，成为了一个连他这样固执的开发者都无法忽视的<strong>“拐点”</strong>。</p>
<p>gnata 的诞生，标志着我们不再只是用 AI 去写一些无关紧要的玩具项目。<strong>在拥有明确测试用例和边界规范的前提下，AI 已经具备了对生产环境核心组件进行“手术刀式重构”的惊人能力。</strong></p>
<p>你准备好拿起这把名为“AI”的手术刀，去切掉你系统里那些最昂贵、最臃肿的“技术肿瘤”了吗？</p>
<p>资料链接：https://www.reco.ai/blog/we-rewrote-jsonata-with-ai</p>
<hr />
<p><strong>今日互动探讨：</strong></p>
<p>在你的公司里，是否存在类似的“异构技术栈”调用导致的性能瓶颈或成本黑洞？你有没有想过，可以用 AI + 测试用例的方式，对某个核心组件进行“代码翻译”式的重构？</p>
<p>欢迎在评论区分享你的架构痛点与大胆构想！</p>
<hr />
<p>还在为“复制粘贴喂AI”而烦恼？我的新专栏 <strong>《<a href="http://gk.link/a/12EPd">AI原生开发工作流实战</a>》</strong> 将带你：</p>
<ul>
<li>告别低效，重塑开发范式</li>
<li>驾驭AI Agent(Claude Code)，实现工作流自动化</li>
<li>从“AI使用者”进化为规范驱动开发的“工作流指挥家”</li>
</ul>
<p>扫描下方二维码，开启你的AI原生开发之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/ai-native-dev-workflow-qr.png" alt="" /></p>
<hr />
<p>你的Go技能，是否也卡在了“熟练”到“精通”的瓶颈期？</p>
<ul>
<li>想写出更地道、更健壮的Go代码，却总在细节上踩坑？</li>
<li>渴望提升软件设计能力，驾驭复杂Go项目却缺乏章法？</li>
<li>想打造生产级的Go服务，却在工程化实践中屡屡受挫？</li>
</ul>
<p>继《<a href="http://gk.link/a/10AVZ">Go语言第一课</a>》后，我的《<a href="http://gk.link/a/12yGY">Go语言进阶课</a>》终于在极客时间与大家见面了！</p>
<p>我的全新极客时间专栏 《<a href="http://gk.link/a/12yGY">Tony Bai·Go语言进阶课</a>》就是为这样的你量身打造！30+讲硬核内容，带你夯实语法认知，提升设计思维，锻造工程实践能力，更有实战项目串讲。</p>
<p>目标只有一个：助你完成从“Go熟练工”到“Go专家”的蜕变！ 现在就加入，让你的Go技能再上一个新台阶！</p>
<p><img src="https://tonybai.com/wp-content/uploads/course-card/iamtonybai-banner-2.gif" alt="" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/04/01/rewrote-jsonata-in-golang-with-ai/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>当 Go 还在追求极简时，C++ 26 却又加了四大“史诗级”新特性</title>
		<link>https://tonybai.com/2026/03/31/go-minimalism-vs-cpp26-epic-new-features/</link>
		<comments>https://tonybai.com/2026/03/31/go-minimalism-vs-cpp26-epic-new-features/#comments</comments>
		<pubDate>Mon, 30 Mar 2026 23:26:51 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[AsynchronousModel]]></category>
		<category><![CDATA[C++26]]></category>
		<category><![CDATA[comptime]]></category>
		<category><![CDATA[Concurrency]]></category>
		<category><![CDATA[Contracts]]></category>
		<category><![CDATA[generics]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[GoLanguage]]></category>
		<category><![CDATA[Go语言]]></category>
		<category><![CDATA[HerbSutter]]></category>
		<category><![CDATA[HighPerformance]]></category>
		<category><![CDATA[MemorySafety]]></category>
		<category><![CDATA[metaprogramming]]></category>
		<category><![CDATA[Reflection]]></category>
		<category><![CDATA[Rust]]></category>
		<category><![CDATA[SenderReceiver]]></category>
		<category><![CDATA[standardlibrary]]></category>
		<category><![CDATA[SystemProgramming]]></category>
		<category><![CDATA[Templates]]></category>
		<category><![CDATA[UndefinedBehavior]]></category>
		<category><![CDATA[ZerocostAbstraction]]></category>
		<category><![CDATA[元编程]]></category>
		<category><![CDATA[内存安全]]></category>
		<category><![CDATA[反射]]></category>
		<category><![CDATA[契约编程]]></category>
		<category><![CDATA[并发]]></category>
		<category><![CDATA[异步模型]]></category>
		<category><![CDATA[未定义行为]]></category>
		<category><![CDATA[标准库]]></category>
		<category><![CDATA[模板]]></category>
		<category><![CDATA[泛型]]></category>
		<category><![CDATA[系统级编程]]></category>
		<category><![CDATA[编译期计算]]></category>
		<category><![CDATA[零成本抽象]]></category>
		<category><![CDATA[高性能]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=6123</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/03/31/go-minimalism-vs-cpp26-epic-new-features 大家好，我是Tony Bai。 在这个 Go、Zig 等“小而美”新语言颇受青睐的时代，如果你去技术社区里问一句：“C++ 这门语言怎么样？” 你大概率会得到一堆充满戏谑的回答：“太复杂了，别学”、“从入门到放弃”、“面试造火箭，工作拧螺丝”。 C++，这门诞生于上世纪 80 年代的编程语言，似乎早已被贴上了“老旧、臃肿、极其反人类”的标签。在很多新生代开发者眼里，它就像一头步履蹒跚的史前巨兽，理应被时代所淘汰。 但就在前天（2026年3月29日），这头“史前巨兽”不仅没有倒下，反而亮出了它那足以撕裂天空的獠牙。 C++ 标准委员会主席、C++ 界的“教父级”人物 Herb Sutter 亲自在博客上宣布：C++26 标准的技术工作，已正式完成！ Herb Sutter 还用极其兴奋的口吻将其定义为“自 C++11 以来最具冲击力的一次发布”。而这次更新的核心，是四个被他称为“Fab Four”（神奇四侠）的史诗级新特性。 当我耐着性子看完全部内容后，我脑子里只剩下四个字：叹为观止。 当 Go 语言的开发者还在为“是否要给语言增加一个三元表达式”，或泛型方法而激烈辩论时，C++ 却反其道而行之，给自己又加装了四门“宇宙级”的重型武器。这到底是 C++ 吹响的绝地反击号角，还是压垮骆驼的最后一根稻草？ 今天，我们就来硬核扒开 C++26 这四大“金刚”，看看它们到底有多强，以及它们将如何影响将来程序员对编程语言的选择。 第一门重炮：反射（Reflection）——“代码生成代码”的终极魔法 Herb Sutter 将反射放在了四大特性之首，并称之为“自模板（Templates）发明以来 C++ 最重要的升级”。 什么是C++ 的反射？简单来说，就是让代码在编译期拥有了“自我审视”和“自我创造”的能力。 在 C++26 之前，如果你想实现一个通用的 JSON 序列/反序列化库，你必须写大量重复的模板代码，或者用各种丑陋的宏来“欺骗”编译器。 但在 C++26 中，你可以像这样写出充满“神性”的代码（代码示意）： 这段代码，在编译的时候就能根据编译时的输入(test.json)自动分析JSON构造，并生成编译时用于计算的一个新类型。这在 Go [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/go-minimalism-vs-cpp26-epic-new-features-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/03/31/go-minimalism-vs-cpp26-epic-new-features">本文永久链接</a> &#8211; https://tonybai.com/2026/03/31/go-minimalism-vs-cpp26-epic-new-features</p>
<p>大家好，我是Tony Bai。</p>
<p>在这个 Go、Zig 等“小而美”新语言颇受青睐的时代，如果你去技术社区里问一句：“C++ 这门语言怎么样？”</p>
<p>你大概率会得到一堆充满戏谑的回答：“太复杂了，别学”、“从入门到放弃”、“面试造火箭，工作拧螺丝”。</p>
<p>C++，这门诞生于上世纪 80 年代的编程语言，似乎早已被贴上了“老旧、臃肿、极其反人类”的标签。在很多新生代开发者眼里，它就像一头步履蹒跚的史前巨兽，理应被时代所淘汰。</p>
<p><strong>但就在前天（2026年3月29日），这头“史前巨兽”不仅没有倒下，反而亮出了它那足以撕裂天空的獠牙。</strong></p>
<p>C++ 标准委员会主席、C++ 界的“教父级”人物 <strong>Herb Sutter</strong> 亲自在博客上宣布：<a href="https://herbsutter.com/2026/03/29/c26-is-done-trip-report-march-2026-iso-c-standards-meeting-london-croydon-uk/">C++26 标准的技术工作，已正式完成！</a></p>
<p>Herb Sutter 还用极其兴奋的口吻将其定义为<strong>“自 C++11 以来最具冲击力的一次发布”</strong>。而这次更新的核心，是四个被他称为“Fab Four”（神奇四侠）的史诗级新特性。</p>
<p>当我耐着性子看完全部内容后，我脑子里只剩下四个字：<strong>叹为观止。</strong></p>
<p>当 Go 语言的开发者还在为“是否要给语言增加一个三元表达式”，或<a href="https://tonybai.com/2026/01/24/go-generics-finally-supports-generic-methods">泛型方法</a>而激烈辩论时，C++ 却反其道而行之，给自己又加装了四门“宇宙级”的重型武器。这到底是 C++ 吹响的绝地反击号角，还是压垮骆驼的最后一根稻草？</p>
<p>今天，我们就来硬核扒开 C++26 这四大“金刚”，看看它们到底有多强，以及它们将如何影响将来程序员对编程语言的选择。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/agentic-software-engineering-qr.png" alt="" /></p>
<h2>第一门重炮：反射（Reflection）——“代码生成代码”的终极魔法</h2>
<p>Herb Sutter 将<strong>反射</strong>放在了四大特性之首，并称之为“自模板（Templates）发明以来 C++ 最重要的升级”。</p>
<p>什么是C++ 的反射？简单来说，<strong>就是让代码在编译期拥有了“自我审视”和“自我创造”的能力。</strong></p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/go-minimalism-vs-cpp26-epic-new-features-2.png" alt="" /></p>
<p>在 C++26 之前，如果你想实现一个通用的 JSON 序列/反序列化库，你必须写大量重复的模板代码，或者用各种丑陋的宏来“欺骗”编译器。</p>
<p>但在 C++26 中，你可以像这样写出充满“神性”的代码（代码示意）：</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/go-minimalism-vs-cpp26-epic-new-features-3.png" alt="" /></p>
<p>这段代码，在编译的时候就能根据编译时的输入(test.json)自动分析JSON构造，并生成编译时用于计算的一个新类型。<strong>这在 Go 语言里，需要借助 reflect 包在运行时（Runtime）以牺牲性能为代价才能做到。而 C++，直接在静态编译期（Compile-time）零成本搞定了！</strong></p>
<p>Herb Sutter 将其形容为“C++ 的十年火箭引擎”。这意味着，未来 C++ 社区将涌现出无数极其强大、但又极其复杂的元编程（Metaprogramming）库。C++ 的学习曲线，将再次被拉到一个新的高度。</p>
<h2>第二道防线：内存安全（Memory Safety）——“只需重编，安全自来”</h2>
<p>如果说反射让 C++ 的上限变得更加遥不可及，那么内存安全的提升，则是 C++ 在向 Go 和 Rust 的核心优势区发起的正面冲锋。</p>
<p>C++ 常年被诟病的核心痛点是什么？<strong>内存不安全</strong>。悬垂指针、未初始化变量读取（导致<a href="https://tonybai.com/2026/03/16/go-language-eliminated-undefined-behavior-truth-investigation">未定义行为</a>）……这些噩梦困扰了 C++ 程序员几十年。</p>
<p>C++26 给出了一个极其诱人的承诺：<strong>你的老代码一行都不用改，只要用 C++26 模式重新编译，就能自动获得大幅度的安全提升！</strong></p>
<p>这主要来源于两个方面的改进：</p>
<ol>
<li><strong>消灭未初始化变量的 UB</strong>：在 C++26 中，读取未初始化局部变量不再是“未定义行为（Undefined Behavior）”。这意味着困扰无数新手的、极其诡异的程序崩溃，将成为历史。</li>
<li><strong>“加固”的标准库</strong>：Google 和 Apple 已经将它们内部经过“加固（Hardened）”的标准库实现贡献给了 C++26。这意味着，当你使用 std::vector, std::string 等容器时，大量的边界检查会自动开启。</li>
</ol>
<p>Herb Sutter 引用了 Google 的内部数据：</p>
<blockquote>
<p>“仅在 Google，这项技术就已经修复了超过 1000 个 Bug，预计每年可以预防 1000 到 2000 个新 Bug 的产生，并将整个生产环境的段错误（Segfault）率降低了 30%。”</p>
</blockquote>
<p>这简直是在对 Go 说：<strong>“你用 GC 换来的那点可怜的安全性，我 C++ 现在也能做到了，而且依然是零成本的！”</strong></p>
<h2>第三把利剑：契约（Contracts）——代码里的“法律条文”</h2>
<p>如果你写过 Go，你一定对满屏的 if param == nil { return errors.New(&#8230;) } 感到厌烦。这种防御性编程，虽然有效，但极其啰嗦。</p>
<p>C++26 正式引入了语言级的<a href="https://tonybai.com/2025/12/13/from-eiffel-contract-to-go-interface">契约编程</a>。</p>
<p>你可以像签合同一样，为你的函数制定严格的法律条文：</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/go-minimalism-vs-cpp26-epic-new-features-4.png" alt="" /></p>
<p>这些 pre 和 post 是编译器和运行时可以理解并强制执行的“法律”。如果调用者违反了前置条件，程序可以在开发阶段就立刻崩溃并给出明确的报错，而不是等到数据被污染后才在某个奇怪的地方爆炸。</p>
<p>虽然 Go 社区也在讨论类似的泛型断言，但 C++26 已经先行一步，将其做成了语言标准。</p>
<h2>第四个引擎：std::execution——C++ 的“亲儿子”协程模型</h2>
<p>在 C++20 中，虽然引入了 co_await 协程，但它只是一个语法糖，并没有提供一个统一的调度框架。</p>
<p>C++26 终于补上了这块短板，正式推出了 <strong>std::execution</strong>，也被称为 <strong>Sender/Receiver 模型</strong>。</p>
<p>这是一个极其强大、统一的异步模型框架。它让你能以一种声明式的方式，去描述、组合和调度复杂的并发任务流。</p>
<p>下面是一段使用std::execution的代码示例：</p>
<pre><code>// This is an example of a custom algorithm for starting work
// without allocations. This algorithm is also available in
// &lt;exec/start_now.hpp&gt;. (Users that don't write custom sender
// algorithms will not need to use receivers or call connect
// or start.)
template &lt;stdexec::sender_in&lt;stdexec::empty_env&gt; Sender&gt;
struct start_now {
  start_now(Sender sndr)
    : _op(stdexec::connect(std::move(sndr), _sink_rcvr())) {
    stdexec::start(_op);
  }
private:
  // start_now is implemented in terms of this custom receiver,
  // which is used to discard Sender's results.
  struct _sink_rcvr {
    using receiver_concept = stdexec::receiver_t;
    void set_value(auto&amp;&amp;...) noexcept {}
    void set_error(auto&amp;&amp;) noexcept {}
    void set_stopped() noexcept {}
  };
  stdexec::connect_result_t&lt;Sender, _sink_rcvr&gt; _op;
};

int main() {
  // A run loop is a fifo queue of work and a loop to execute the
  // work. It needs to be driven by calling its .run() member fn.
  stdexec::run_loop ctx;
  auto event_loop = ctx.get_scheduler();

  // Create two tasks that cooperatively multitask.
  auto task1 = stdexec::just()
             | stdexec::then([]{ std::puts("hello from task 1! suspending..."); })
             | stdexec::continue_on(event_loop) // suspend
             | exec::repeat_n(5)
             | stdexec::then([]{ std::puts("task 1 is done!"); });

  auto task2 = stdexec::just()
             | stdexec::then([]{ std::puts("hello from task 2! suspending..."); })
             | stdexec::continue_on(event_loop) // suspend
             | exec::repeat_n(8)
             | stdexec::then([]{ std::puts("task 2 is done!"); });

  // Start both tasks. This enqueues them for execution on the run loop.
  auto op1 = start_now(stdexec::start_on(event_loop, std::move(task1)));
  auto op2 = start_now(stdexec::start_on(event_loop, std::move(task2)));

  ctx.finish(); // tell the run loop to stop when the queue is empty
  ctx.run();    // tell the run loop to start executing work in the queue
}
</code></pre>
<p>这可以被看作是 C++ 对 Go 的 Goroutine + Channel 模型，以及 Rust 的 async/await + tokio 模型的终极回应。</p>
<p>它让 C++ 开发者第一次拥有了一套语言原生的、能够轻松编写“无数据竞争（Data-race-free by construction）”并发程序的“亲儿子”工具。</p>
<h2>小结：一场没有退路的豪赌</h2>
<p>反射、安全、契约、并发。C++26 的这四大金刚，每一个都足以在其他语言中引发一场大地震。</p>
<p>我们看到的是一头苏醒的巨兽。它没有选择像 Go 那样“断舍离”，也没有像 Rust 那样“偏执于安全”，而是极其贪婪地选择了：<strong>“我全都要！”</strong></p>
<p>它既想要极致的表达能力和零成本抽象（反射、模板），又想要与 Rust 媲美的内存安全（加固标准库），还想要不输 Go 的并发表达力（std::execution）。</p>
<p>C++26 给老兵们提供了前所未有的强大武器，但也把本就陡峭的学习曲线，又向上抬升了一个令人惊叹的高度，宇宙第一复杂的编程语言，实至名归！</p>
<p>当 Go 的开发者还在为“是否要加个三元表达式”而争论不休时，C++ 已经头也不回地奔向了“万神殿”。</p>
<p>或许，编程语言的终局，真的不是“大一统”，而是“两极分化”：一极是像 Go 一样追求极致简单的“工程师语言”；而另一极，则是像 C++ 这样，专为那 1% 的、追求极致性能和控制力的“宗师级”开发者准备的、布满荆棘的封神之路。</p>
<p><strong>C++26，欢迎来到神的世界，也欢迎来到神的炼狱。</strong></p>
<h2>参考资料</h2>
<ul>
<li>https://herbsutter.com/2026/03/29/c26-is-done-trip-report-march-2026-iso-c-standards-meeting-london-croydon-uk/</li>
<li>https://herbsutter.com/2025/06/21/trip-report-june-2025-iso-c-standards-meeting-sofia-bulgaria/ </li>
<li>https://herbsutter.com/2024/07/02/trip-report-summer-iso-c-standards-meeting-st-louis-mo-usa/</li>
<li>https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p2996r13.html</li>
<li>https://www.youtube.com/watch?v=7z9NNrRDHQU</li>
<li>https://www.youtube.com/watch?v=oitYvDe4nps</li>
</ul>
<hr />
<p><strong>今日互动探讨：</strong></p>
<p>看完 C++26 的这四大“神仙”特性，你是感到兴奋，还是感到了深深的绝望？你觉得 C++ 的这种“大而全”的演进路线是对的，还是 Go 的“小而美”更代表未来？</p>
<p>欢迎在评论区分享你的看法！</p>
<hr />
<p>还在为“复制粘贴喂AI”而烦恼？我的新专栏 <strong>《<a href="http://gk.link/a/12EPd">AI原生开发工作流实战</a>》</strong> 将带你：</p>
<ul>
<li>告别低效，重塑开发范式</li>
<li>驾驭AI Agent(Claude Code)，实现工作流自动化</li>
<li>从“AI使用者”进化为规范驱动开发的“工作流指挥家”</li>
</ul>
<p>扫描下方二维码，开启你的AI原生开发之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/ai-native-dev-workflow-qr.png" alt="" /></p>
<hr />
<p>你的Go技能，是否也卡在了“熟练”到“精通”的瓶颈期？</p>
<ul>
<li>想写出更地道、更健壮的Go代码，却总在细节上踩坑？</li>
<li>渴望提升软件设计能力，驾驭复杂Go项目却缺乏章法？</li>
<li>想打造生产级的Go服务，却在工程化实践中屡屡受挫？</li>
</ul>
<p>继《<a href="http://gk.link/a/10AVZ">Go语言第一课</a>》后，我的《<a href="http://gk.link/a/12yGY">Go语言进阶课</a>》终于在极客时间与大家见面了！</p>
<p>我的全新极客时间专栏 《<a href="http://gk.link/a/12yGY">Tony Bai·Go语言进阶课</a>》就是为这样的你量身打造！30+讲硬核内容，带你夯实语法认知，提升设计思维，锻造工程实践能力，更有实战项目串讲。</p>
<p>目标只有一个：助你完成从“Go熟练工”到“Go专家”的蜕变！ 现在就加入，让你的Go技能再上一个新台阶！</p>
<p><img src="https://tonybai.com/wp-content/uploads/course-card/iamtonybai-banner-2.gif" alt="" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/03/31/go-minimalism-vs-cpp26-epic-new-features/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>降低 74% 的 P99 尾延迟：揭秘 Go HTTP 客户端的“请求对冲”魔法</title>
		<link>https://tonybai.com/2026/03/30/reduced-p99-latency-by-request-hedging-in-go/</link>
		<comments>https://tonybai.com/2026/03/30/reduced-p99-latency-by-request-hedging-in-go/#comments</comments>
		<pubDate>Mon, 30 Mar 2026 00:10:00 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[Availability]]></category>
		<category><![CDATA[circuitbreaker]]></category>
		<category><![CDATA[Concurrency]]></category>
		<category><![CDATA[Context]]></category>
		<category><![CDATA[DistributedSystems]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[GoLanguage]]></category>
		<category><![CDATA[Go语言]]></category>
		<category><![CDATA[HedgeDelay]]></category>
		<category><![CDATA[HedgedRequests]]></category>
		<category><![CDATA[http.RoundTripper]]></category>
		<category><![CDATA[Idempotency]]></category>
		<category><![CDATA[LoadBalancing]]></category>
		<category><![CDATA[Microservices]]></category>
		<category><![CDATA[P99Latency]]></category>
		<category><![CDATA[P99延迟]]></category>
		<category><![CDATA[RequestHedging]]></category>
		<category><![CDATA[standardlibrary]]></category>
		<category><![CDATA[SyncWaitGroup]]></category>
		<category><![CDATA[TailLatency]]></category>
		<category><![CDATA[Throttling]]></category>
		<category><![CDATA[Throughput]]></category>
		<category><![CDATA[TimeoutRetry]]></category>
		<category><![CDATA[上下文]]></category>
		<category><![CDATA[分布式系统]]></category>
		<category><![CDATA[可用性]]></category>
		<category><![CDATA[同步机制]]></category>
		<category><![CDATA[吞吐量]]></category>
		<category><![CDATA[对冲延迟]]></category>
		<category><![CDATA[尾延迟]]></category>
		<category><![CDATA[幂等性]]></category>
		<category><![CDATA[并发]]></category>
		<category><![CDATA[微服务]]></category>
		<category><![CDATA[标准库]]></category>
		<category><![CDATA[熔断]]></category>
		<category><![CDATA[请求对冲]]></category>
		<category><![CDATA[负载均衡]]></category>
		<category><![CDATA[超时重试]]></category>
		<category><![CDATA[链路对冲]]></category>
		<category><![CDATA[限流]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=6119</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/03/30/reduced-p99-latency-by-request-hedging-in-go 大家好，我是Tony Bai。 在微服务和分布式系统的世界里，我们常常会遇到一个令人头疼的现象：服务在大部分时间（如 P50 或 P90 指标）表现得非常丝滑，但总有那么一小撮请求（P99 甚至 P99.9 指标）慢得令人发指。 近日，在 Reddit 的 r/golang 社区中，一位开发者分享了他将 Go 服务的 P99 延迟降低了 74% 的经验。令人惊讶的是，他所使用的绝招并非升级硬件或重构业务逻辑，而是引入了一个名为 Request Hedging（请求对冲） 的策略。 面对高延迟，我们本能的反应是“重试（Retry）”。但正如这位开发者所发现的：单纯的重试不仅无助于解决长尾延迟，反而可能在系统高负载时雪上加霜。真正有效的方法是处理“落后者”，而不是“失败者”。 本文将带你重温 Google 关于分布式系统的经典论文，深入剖析 Request Hedging 的原理，并手把手教你如何仅使用 Go 标准库，为你的 HTTP 客户端插上“对冲”的翅膀。 尾延迟的诅咒：为什么重试不是万能药？ 在深入 Hedging 之前，我们必须先理解什么是尾延迟（Tail Latency）。 2013 年，Google 的两位大神 Jeffrey Dean 和 Luiz André Barroso 在《Communications of the [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/reduced-p99-latency-by-request-hedging-in-go-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/03/30/reduced-p99-latency-by-request-hedging-in-go">本文永久链接</a> &#8211; https://tonybai.com/2026/03/30/reduced-p99-latency-by-request-hedging-in-go</p>
<p>大家好，我是Tony Bai。</p>
<p>在微服务和分布式系统的世界里，我们常常会遇到一个令人头疼的现象：服务在大部分时间（如 P50 或 P90 指标）表现得非常丝滑，但总有那么一小撮请求（P99 甚至 P99.9 指标）慢得令人发指。</p>
<p>近日，在 Reddit 的 r/golang 社区中，一位开发者分享了他<a href="https://www.reddit.com/r/golang/comments/1s4mb10/reduced_p99_latency_by_74_in_go_learned_something/">将 Go 服务的 P99 延迟降低了 74% 的经验</a>。令人惊讶的是，他所使用的绝招并非升级硬件或重构业务逻辑，而是引入了一个名为 <strong>Request Hedging（请求对冲）</strong> 的策略。</p>
<p>面对高延迟，我们本能的反应是“重试（Retry）”。但正如这位开发者所发现的：单纯的重试不仅无助于解决长尾延迟，反而可能在系统高负载时雪上加霜。真正有效的方法是处理“落后者”，而不是“失败者”。</p>
<p>本文将带你重温 Google 关于分布式系统的<a href="https://research.google/pubs/the-tail-at-scale/">经典论文</a>，深入剖析 Request Hedging 的原理，并手把手教你如何仅使用 Go 标准库，为你的 HTTP 客户端插上“对冲”的翅膀。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/distributed-system-guide-qr.png" alt="" /></p>
<h2>尾延迟的诅咒：为什么重试不是万能药？</h2>
<p>在深入 Hedging 之前，我们必须先理解什么是<strong>尾延迟（Tail Latency）</strong>。</p>
<p>2013 年，Google 的两位大神 Jeffrey Dean 和 Luiz André Barroso 在《Communications of the ACM》上发表了一篇神级论文：<a href="https://cacm.acm.org/research/the-tail-at-scale/">《The Tail at Scale》</a>。在这篇Paper中，他们详细阐述了在大规模分布式系统中，为什么长尾延迟是不可避免的。</p>
<p>哪怕你拥有世界上最优秀的工程师，底层硬件的物理特性（如 CPU 降频、网络拥塞）、操作系统的后台任务（如 IO 调度）、以及语言运行时的特性（如 Go 的 GC 停顿），都会导致某些请求的处理时间远高于平均值。</p>
<p><strong>当你的服务需要并行调用多个下游服务时，这种局部的延迟波动会被急剧放大。</strong> 假设一个服务需要调用 100 个叶子节点，如果单个节点响应时间超过 1 秒的概率是 1%，那么整个请求超过 1 秒的概率将飙升至 63%！</p>
<blockquote>
<p>注：节点总数 n = 100 ，已知单个节点响应时间超过 1 秒的概率 为1%。单个节点响应时间不超过 1 秒（即正常响应）的概率为1-1% = 99% = 0.99。由于 100 个请求是并行的且相互独立，整个请求“正常”的前提是所有 100 个节点都必须在 1 秒内返回。这种概率为0.99^100=0.366。这样只要这 100 个节点中有任何一个掉链子，整个请求（作为整体）的耗时就会超过 1 秒。其概率为1-0.366≈0.63=63%。</p>
</blockquote>
<p><img src="https://tonybai.com/wp-content/uploads/2026/reduced-p99-latency-by-request-hedging-in-go-2.png" alt="" /><br />
<center>图：来自《The Tail at Scale》</center></p>
<p>这张图直观地展示了随着服务器数量（Fan-out）增加，哪怕单机变慢的概率极低，整体响应时间变慢的概率也会陡峭上升。</p>
<p>面对超时的请求，传统的做法是实施超时重试（Timeout &amp; Retry）。但重试存在致命缺陷：</p>
<ol>
<li><strong>你必须等待超时发生。</strong> 如果超时设置为 1 秒，那么重试的请求至少要经历 1 秒的延迟，这根本无法改善 P99 延迟。</li>
<li><strong>加剧雪崩。</strong> 当下游服务因为负载过高而变慢时，大量的重试请求会瞬间淹没下游，导致系统彻底崩溃。</li>
</ol>
<h2>Request Hedging：优雅地跑赢时间</h2>
<p>为了解决长尾延迟，Google 论文中提出了一种极具工程智慧的策略：<strong>Hedged Requests（请求对冲/对冲请求）</strong>。</p>
<p>其核心思想非常简单直白：</p>
<p><strong>客户端首先向目标服务器发送一个请求。如果该请求在预期的时间（即“对冲延迟阈值”，Hedging Delay）内没有返回，客户端不会等待其超时或失败，而是立即向另一个副本（或者同一个负载均衡器后的其他实例）发送一模一样的备份请求。客户端将使用最先返回的那个成功响应，并主动取消其余的未决请求。</strong></p>
<p>这种方法之所以有效，是因为导致请求变慢的因素通常是瞬时的且与特定机器相关的（如某台机器刚好在做 GC，或者刚好被一个大查询阻塞了队列）。第二个请求很大概率会被路由到一台健康的、空闲的机器上，从而快速返回。</p>
<p><strong>Hedging 与 Retry 的本质区别：</strong></p>
<ul>
<li><strong>Retry</strong>：针对的是<strong>失败（Failure）</strong>。必须等第一个请求彻底失败或超时，才发起第二个。</li>
<li><strong>Hedging</strong>：针对的是<strong>慢（Slowness）</strong>。第一个请求还在运行（没报错），第二个请求就已经出发了。它们是并行竞争的关系。</li>
</ul>
<p><img src="https://tonybai.com/wp-content/uploads/2026/reduced-p99-latency-by-request-hedging-in-go-3.png" alt="" /></p>
<p>虽然这听起来像是在浪费服务器资源，但 Google 的实践证明，如果将 Hedging Delay 设置为 P95 延迟（即 95% 的请求都能在这个时间内完成），那么<strong>只有 5% 的请求会触发对冲。这仅仅增加了 5% 的系统负载，却能将 P99 或 P99.9 的长尾延迟削减大半！</strong></p>
<p>在现代微服务生态中，<a href="https://grpc.io/docs/guides/request-hedging/">gRPC 已经在 Service Config 中原生支持了 Hedging 策略</a>，但对于广泛使用的 HTTP/REST 接口，我们通常需要自己实现。</p>
<h2>实战：构建可压测的 Hedging HTTP Client</h2>
<p>为了验证 Hedging 的威力，我们将使用 Go 原生标准库，从零实现一个带有对冲机制的 http.RoundTripper，并构建一个完整的压测实验环境。</p>
<h3>项目布局</h3>
<p>首先，创建一个新的 Go 项目：</p>
<pre><code class="bash">mkdir go-hedging-demo
cd go-hedging-demo
go mod init hedging-demo
</code></pre>
<p>我们将创建三个文件：</p>
<ul>
<li>hedge.go：包含核心的 Hedging 逻辑实现。</li>
<li>server.go：一个模拟真实分布式环境、带有随机高延迟的测试服务器。</li>
<li>main.go：客户端压测入口，用于对比普通请求和 Hedging 请求的性能差异。</li>
</ul>
<pre><code class="text">go-hedging-demo/
├── go.mod
├── hedge.go
├── server.go
└── main.go
</code></pre>
<h3>核心实现：hedge.go</h3>
<p>我们将通过实现 http.RoundTripper 接口，优雅地将对冲逻辑无缝注入到 Go 标准库的 http.Client 中。</p>
<pre><code class="go">// hedge.go
package main

import (
    "context"
    "errors"
    "net/http"
    "sync"
    "time"
)

// HedgedTransport 实现了 http.RoundTripper 接口
type HedgedTransport struct {
    Transport   http.RoundTripper // 底层真正的 Transport
    MaxAttempts int               // 最大并发请求数（包括最初的1次）
    HedgeDelay  time.Duration     // 触发对冲的延迟时间
}

func (ht *HedgedTransport) RoundTrip(req *http.Request) (*http.Response, error) {
    // 如果没有设置，使用默认行为
    transport := ht.Transport
    if transport == nil {
        transport = http.DefaultTransport
    }
    attempts := ht.MaxAttempts
    if attempts &lt;= 0 {
        attempts = 1
    }

    // 使用带有取消功能的 context 控制整个对冲生命周期
    ctx, cancel := context.WithCancel(req.Context())
    defer cancel()

    // 结果通道，用于接收第一个成功的响应或错误
    type result struct {
        resp *http.Response
        err  error
    }
    resCh := make(chan result, attempts)
    var wg sync.WaitGroup

    // 启动一个请求的闭包函数
    doRequest := func() {
        wg.Add(1)
        go func() {
            defer wg.Done()
            // 克隆请求，防止并发修改
            cloneReq := req.Clone(ctx)
            resp, err := transport.RoundTrip(cloneReq)

            // 只有当请求不是因为 context 取消而失败时，才尝试写入结果
            if !errors.Is(err, context.Canceled) {
                select {
                case resCh &lt;- result{resp: resp, err: err}:
                default:
                    // 通道已满或已不再需要，直接丢弃（如果 resp 不为空，需要关闭 Body 以防泄露）
                    if resp != nil &amp;&amp; resp.Body != nil {
                        resp.Body.Close()
                    }
                }
            }
        }()
    }

    // 1. 发起第一个请求
    doRequest()

    // 2. 控制对冲的定时器和尝试次数
    timer := time.NewTimer(ht.HedgeDelay)
    defer timer.Stop()

    errs := make([]error, 0, attempts)
    requestsSent := 1

    for {
        select {
        case res := &lt;-resCh:
            // 收到结果
            if res.err == nil {
                // 成功！立即取消其他还在飞行的请求
                cancel()
                // 等待后台 goroutine 清理完成 (可选，这里为了简单不阻塞)
                return res.resp, nil
            }
            // 如果这个请求失败了，记录错误
            errs = append(errs, res.err)
            // 如果所有发出的请求都失败了，且已经达到最大尝试次数，返回错误
            if len(errs) == attempts {
                return nil, errors.Join(errs...)
            }

            // 如果一个请求失败了，且还没达到最大尝试次数，我们不应该死等 Timer，
            // 而应该立刻触发下一个对冲请求（这里为了简化逻辑，依然依赖下一次 Timer 或失败循环）
            // 实际生产级实现可以在这里直接触发 doRequest()

        case &lt;-timer.C:
            // 对冲延迟到达
            if requestsSent &lt; attempts {
                // 触发对冲请求
                doRequest()
                requestsSent++
                // 重置定时器，准备下一次可能的对冲
                timer.Reset(ht.HedgeDelay)
            }

        case &lt;-ctx.Done():
            // 整个请求超时或被调用方取消
            return nil, ctx.Err()
        }
    }
}
</code></pre>
<p>这里，我们使用了 req.Clone(ctx) 来复制请求，确保并发安全。通过 context.WithCancel 控制所有的下游请求，一旦有一个请求成功返回（res.err == nil），立即调用 cancel() 取消其余正在运行（in-flight）的请求。</p>
<h3>测试服务器：模拟“长尾效应” server.go</h3>
<p>为了看到效果，我们编写一个简单的 HTTP 服务。它在 90% 的情况下在 50ms 内快速响应，但在 10% 的情况下会遇到长达 500ms 到 1s 的长尾延迟。</p>
<pre><code class="go">// server.go
package main

import (
    "fmt"
    "math/rand"
    "net/http"
    "time"
)

func startServer() {
    http.HandleFunc("/data", func(w http.ResponseWriter, r *http.Request) {
        // 模拟 10% 的长尾延迟
        if rand.Float32() &lt; 0.1 {
            // 长尾延迟：500ms - 1000ms
            delay := 500 + rand.Intn(500)
            time.Sleep(time.Duration(delay) * time.Millisecond)
        } else {
            // 正常响应：10ms - 50ms
            delay := 10 + rand.Intn(40)
            time.Sleep(time.Duration(delay) * time.Millisecond)
        }

        fmt.Fprintln(w, "OK")
    })

    go func() {
        err := http.ListenAndServe(":8080", nil)
        if err != nil {
            panic(err)
        }
    }()
    time.Sleep(100 * time.Millisecond) // 等待服务器启动
}
</code></pre>
<h3>压测入口：对比见真章 main.go</h3>
<p>最后，我们编写压测代码，分别使用普通 Client 和 Hedged Client 发送 1000 个并发请求，并统计 P99 延迟。</p>
<pre><code class="go">// main.go
package main

import (
    "fmt"
    "io"
    "net/http"
    "sort"
    "sync"
    "time"
)

const RequestCount = 1000

func main() {
    startServer()

    fmt.Println("开始压测普通 HTTP Client...")
    normalClient := &amp;http.Client{
        Timeout: 2 * time.Second,
    }
    normalLatencies := runBenchmark(normalClient)

    fmt.Println("\n开始压测 Hedged HTTP Client...")
    hedgedClient := &amp;http.Client{
        Timeout: 2 * time.Second,
        Transport: &amp;HedgedTransport{
            Transport:   http.DefaultTransport,
            MaxAttempts: 3,                 // 最多发送3个请求
            HedgeDelay:  80 * time.Millisecond, // P95 延迟设为触发点（我们服务器正常响应 &lt; 50ms）
        },
    }
    hedgedLatencies := runBenchmark(hedgedClient)

    // 打印统计结果
    printStats("Normal Client", normalLatencies)
    printStats("Hedged Client", hedgedLatencies)
}

func runBenchmark(client *http.Client) []time.Duration {
    var wg sync.WaitGroup
    latencies := make([]time.Duration, RequestCount)

    for i := 0; i &lt; RequestCount; i++ {
        wg.Add(1)
        go func(index int) {
            defer wg.Done()

            start := time.Now()
            resp, err := client.Get("http://localhost:8080/data")
            if err != nil {
                fmt.Printf("Request failed: %v\n", err)
                return
            }
            io.Copy(io.Discard, resp.Body)
            resp.Body.Close()

            latencies[index] = time.Since(start)
        }(i)
    }

    wg.Wait()
    return latencies
}

func printStats(name string, latencies []time.Duration) {
    // 去除可能的失败请求（0值）
    valid := make([]time.Duration, 0, len(latencies))
    for _, l := range latencies {
        if l &gt; 0 {
            valid = append(valid, l)
        }
    }

    sort.Slice(valid, func(i, j int) bool {
        return valid[i] &lt; valid[j]
    })

    if len(valid) == 0 {
        fmt.Printf("No valid responses for %s\n", name)
        return
    }

    p50 := valid[len(valid)/2]
    p95 := valid[int(float64(len(valid))*0.95)]
    p99 := valid[int(float64(len(valid))*0.99)]

    fmt.Printf("\n=== %s 统计 ===\n", name)
    fmt.Printf("请求总数: %d\n", len(valid))
    fmt.Printf("P50 延迟: %v\n", p50)
    fmt.Printf("P95 延迟: %v\n", p95)
    fmt.Printf("P99 延迟: %v\n", p99)
}
</code></pre>
<h3>运行与验证</h3>
<p>在本地 MacBook Pro 的终端上执行 go run .，我得到了以下真实的性能对决：</p>
<pre><code class="text">$go run .
开始压测普通 HTTP Client...

开始压测 Hedged HTTP Client...

=== Normal Client 统计 ===
请求总数: 1000
P50 延迟: 115.226929ms
P95 延迟: 850.768537ms &lt;-- 注意看这里
P99 延迟: 1.045720114s &lt;-- 长尾效应严重

=== Hedged Client 统计 ===
请求总数: 1000
P50 延迟: 138.930108ms &lt;-- P50 轻微损耗
P95 延迟: 360.607686ms &lt;-- 巨大的改善！
P99 延迟: 376.98949ms  &lt;-- P99 降低了将近 70%！
</code></pre>
<p>正如你所见：</p>
<ul>
<li>P99 巨幅改善：对冲机制成功将 P99 延迟降低了 64%。原本需要 1 秒以上的极端慢请求，现在被控制在了 400ms 以内。</li>
<li>P50 轻微损耗：由于请求克隆、Context 管理以及本地 CPU 调度多出一倍请求的竞争，P50 上升了约 23ms。</li>
</ul>
<p>结论：在典型的分布式系统中，这种权衡是极度划算的。我们用极小的平均延迟上升，换取了尾部延迟的高稳定性。</p>
<h2>生产环境的避坑指南</h2>
<p>Request Hedging 虽好，但绝非能随意滥用的“银弹”。在将其部署到生产环境之前，你必须考虑以下几个核心约束：</p>
<ol>
<li><strong>绝对的幂等性（Idempotency）</strong>：对冲意味着同一笔请求可能同时发送给后端的两个节点。如果这是个 POST 扣款请求，而你的后端没有做好幂等性控制，这将会是一场灾难。<strong>Hedging 最好只用于幂等的只读请求（如 GET），或者有严格全局事务 ID 兜底的写入操作。</strong></li>
<li><strong>Hedge Delay 的设定</strong>：这是最考验架构师的参数。设得太短，所有的请求都会变成双倍发送，瞬间打挂后端（这叫放大攻击）；设得太长，起不到降低长尾的作用。最佳实践是通过 Prometheus 等监控工具，计算出该接口过去的 <strong>P95 响应时间</strong>，将其作为 Hedging Delay 的基准值。</li>
<li><strong>熔断与限流（Throttling）</strong>：如果下游服务整体宕机，所有的请求都会变慢，此时触发所有的对冲请求只会加速死亡。因此，正如 gRPC 规范中要求的，Hedging 必须与限流（Throttling）结合。例如，计算一个“对冲令牌池”，只有当成功请求大于失败请求达到一定比例时，才允许发送对冲请求。</li>
</ol>
<h2>小结</h2>
<p>软件工程是一门关于权衡的艺术。在追求极致性能的道路上，我们往往将目光局限于优化数据库索引、压缩 JSON 序列化，却忽视了分布式系统固有的宏观不确定性。</p>
<p>Request Hedging 是从宏观架构层面给出的一记漂亮的防守反击。通过上面几百行的 Go 代码，我们成功复现了 Google 级别的架构优化。下一次，当你的监控大盘上 P99 曲线再次异常抖动时，不妨收起单纯的“超时重试”，尝试给你的 Go 客户端加一点“对冲”的魔法吧。</p>
<p>本文中涉及的代码可以在<a href="https://github.com/bigwhite/experiments/tree/master/go-hedging-demo">这里</a>下载。https://github.com/bigwhite/experiments/tree/master/go-hedging-demo</p>
<p>资料链接：</p>
<ul>
<li>https://www.reddit.com/r/golang/comments/1s4mb10/reduced_p99_latency_by_74_in_go_learned_something/</li>
<li>https://grpc.io/docs/guides/request-hedging/</li>
<li>https://research.google/pubs/the-tail-at-scale/</li>
</ul>
<hr />
<p><strong>你的 P99 达标了吗？</strong></p>
<p>尾延迟是分布式系统中最难缠的对手。在你的项目中，主要的长尾延迟来源是什么？你会为了降低那 1% 的极端慢请求，而接受 5% 的额外系统负载吗？</p>
<p>欢迎在评论区分享你的性能调优“必杀技”！</p>
<hr />
<p>还在为“复制粘贴喂AI”而烦恼？我的新专栏 <strong>《<a href="http://gk.link/a/12EPd">AI原生开发工作流实战</a>》</strong> 将带你：</p>
<ul>
<li>告别低效，重塑开发范式</li>
<li>驾驭AI Agent(Claude Code)，实现工作流自动化</li>
<li>从“AI使用者”进化为规范驱动开发的“工作流指挥家”</li>
</ul>
<p>扫描下方二维码，开启你的AI原生开发之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/ai-native-dev-workflow-qr.png" alt="" /></p>
<hr />
<p>你的Go技能，是否也卡在了“熟练”到“精通”的瓶颈期？</p>
<ul>
<li>想写出更地道、更健壮的Go代码，却总在细节上踩坑？</li>
<li>渴望提升软件设计能力，驾驭复杂Go项目却缺乏章法？</li>
<li>想打造生产级的Go服务，却在工程化实践中屡屡受挫？</li>
</ul>
<p>继《<a href="http://gk.link/a/10AVZ">Go语言第一课</a>》后，我的《<a href="http://gk.link/a/12yGY">Go语言进阶课</a>》终于在极客时间与大家见面了！</p>
<p>我的全新极客时间专栏 《<a href="http://gk.link/a/12yGY">Tony Bai·Go语言进阶课</a>》就是为这样的你量身打造！30+讲硬核内容，带你夯实语法认知，提升设计思维，锻造工程实践能力，更有实战项目串讲。</p>
<p>目标只有一个：助你完成从“Go熟练工”到“Go专家”的蜕变！ 现在就加入，让你的Go技能再上一个新台阶！</p>
<p><img src="https://tonybai.com/wp-content/uploads/course-card/iamtonybai-banner-2.gif" alt="" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/03/30/reduced-p99-latency-by-request-hedging-in-go/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如果服务器悄悄“猝死”，你的系统还能活几秒？揭秘分布式集群的“续命”保底机制</title>
		<link>https://tonybai.com/2026/03/20/heartbeats-in-distributed-systems/</link>
		<comments>https://tonybai.com/2026/03/20/heartbeats-in-distributed-systems/#comments</comments>
		<pubDate>Fri, 20 Mar 2026 00:25:21 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[DistributedSystems]]></category>
		<category><![CDATA[etcd]]></category>
		<category><![CDATA[FailureDetection]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[GossipProtocol]]></category>
		<category><![CDATA[Gossip协议]]></category>
		<category><![CDATA[heartbeat]]></category>
		<category><![CDATA[HeartbeatInterval]]></category>
		<category><![CDATA[HighAvailability]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[LoadBalancing]]></category>
		<category><![CDATA[NetworkPartition]]></category>
		<category><![CDATA[NodeFailure]]></category>
		<category><![CDATA[PhiAccrualFailureDetector]]></category>
		<category><![CDATA[Phi累积故障检测器]]></category>
		<category><![CDATA[PullModel]]></category>
		<category><![CDATA[Pull模型]]></category>
		<category><![CDATA[PushModel]]></category>
		<category><![CDATA[Push模型]]></category>
		<category><![CDATA[Quorum]]></category>
		<category><![CDATA[RaftProtocol]]></category>
		<category><![CDATA[Raft协议]]></category>
		<category><![CDATA[SplitBrain]]></category>
		<category><![CDATA[TimeoutThreshold]]></category>
		<category><![CDATA[分布式系统]]></category>
		<category><![CDATA[心跳机制]]></category>
		<category><![CDATA[心跳间隔]]></category>
		<category><![CDATA[故障检测]]></category>
		<category><![CDATA[法定人数]]></category>
		<category><![CDATA[网络分区]]></category>
		<category><![CDATA[脑裂]]></category>
		<category><![CDATA[节点死亡]]></category>
		<category><![CDATA[负载均衡]]></category>
		<category><![CDATA[超时阈值]]></category>
		<category><![CDATA[高可用]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=6076</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/03/20/heartbeats-in-distributed-systems 大家好，我是Tony Bai。 在开发单体应用时，我们很少操心“服务器死没死”的问题——进程挂了就是挂了，整个服务直接 502。但在庞大的分布式系统和微服务架构中，最大的噩梦往往不是服务器彻底宕机，而是“它悄悄死去了，但整个集群却以为它还活着”。 想象一下：你有一个包含上千个节点的集群，每天处理千万级并发。突然，其中一台机器因为内存泄漏或网线松动，陷入了“僵死”状态。它不再处理请求，却依然霸占着负载均衡器的流量分发。 如果系统不能在几秒钟内发现并踢掉它，大量用户的请求就会像泥牛入海，疯狂超时，最终导致整个系统的可用性雪崩。 那么，Kubernetes、Cassandra、etcd 这些支撑起现代互联网半壁江山的顶级开源项目，是如何在网络极度不可靠的物理世界中，精准、快速地感知到节点死亡的？ 答案就是分布式系统中最古老、却也最精妙的设计：心跳机制（Heartbeats）。 今天，我们就来硬核拆解“心跳机制”背后的系统设计哲学。读懂它，你对高可用架构的认知将超越 90% 的普通开发者。 “我很好，我还活着！”——心跳的底层逻辑 最基础的心跳机制，本质上是节点之间的一份“生死契约”。 在分布式宇宙中，没有绝对的确定性。节点 A 判断节点 B 是否活着的唯一方式，就是听节点 B 定期发出的“脉搏声”：“我还活着！我还活着！” 这就是 Push 模型（主动汇报）。 我们用 Go 语言来写一个最基础的心跳发送者与监听器。相比于其他语言，Go 的 Goroutine 天然适合这种后台定时任务： package main import ( "fmt" "sync" "time" ) // Heartbeat 消息结构体 type Heartbeat struct { NodeID string Timestamp time.Time Sequence uint64 } [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/heartbeats-in-distributed-systems-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/03/20/heartbeats-in-distributed-systems">本文永久链接</a> &#8211; https://tonybai.com/2026/03/20/heartbeats-in-distributed-systems</p>
<p>大家好，我是Tony Bai。</p>
<p>在开发单体应用时，我们很少操心“服务器死没死”的问题——进程挂了就是挂了，整个服务直接 502。但在庞大的分布式系统和微服务架构中，最大的噩梦往往不是服务器彻底宕机，而是<strong>“它悄悄死去了，但整个集群却以为它还活着”。</strong></p>
<p>想象一下：你有一个包含上千个节点的集群，每天处理千万级并发。突然，其中一台机器因为内存泄漏或网线松动，陷入了“僵死”状态。它不再处理请求，却依然霸占着负载均衡器的流量分发。</p>
<p>如果系统不能在几秒钟内发现并踢掉它，大量用户的请求就会像泥牛入海，疯狂超时，最终导致整个系统的可用性雪崩。</p>
<p>那么，Kubernetes、Cassandra、etcd 这些支撑起现代互联网半壁江山的顶级开源项目，是如何在网络极度不可靠的物理世界中，精准、快速地感知到节点死亡的？</p>
<p>答案就是分布式系统中最古老、却也最精妙的设计：<strong>心跳机制（Heartbeats）。</strong></p>
<p>今天，我们就来硬核拆解“心跳机制”背后的系统设计哲学。读懂它，你对高可用架构的认知将超越 90% 的普通开发者。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/distributed-system-guide-qr.png" alt="" /></p>
<h2>“我很好，我还活着！”——心跳的底层逻辑</h2>
<p>最基础的心跳机制，本质上是节点之间的一份“生死契约”。</p>
<p>在分布式宇宙中，没有绝对的确定性。节点 A 判断节点 B 是否活着的唯一方式，就是听节点 B 定期发出的“脉搏声”：“我还活着！我还活着！”</p>
<p>这就是 <strong>Push 模型（主动汇报）</strong>。</p>
<p>我们用 Go 语言来写一个最基础的心跳发送者与监听器。相比于其他语言，Go 的 Goroutine 天然适合这种后台定时任务：</p>
<pre><code class="go">package main

import (
    "fmt"
    "sync"
    "time"
)

// Heartbeat 消息结构体
type Heartbeat struct {
    NodeID    string
    Timestamp time.Time
    Sequence  uint64
}

// ----------------- 心跳发送端 -----------------
func StartHeartbeatSender(nodeID string, interval time.Duration) {
    go func() {
        ticker := time.NewTicker(interval)
        defer ticker.Stop()
        var seq uint64 = 0

        for range ticker.C {
            seq++
            hb := Heartbeat{
                NodeID:    nodeID,
                Timestamp: time.Now(),
                Sequence:  seq,
            }
            // 模拟发送心跳网络请求
            fmt.Printf("Node %s 发送心跳: Seq %d\n", hb.NodeID, hb.Sequence)
        }
    }()
}

// ----------------- 心跳监控端 -----------------
type Monitor struct {
    mu             sync.RWMutex
    lastHeartbeats map[string]time.Time
    timeout        time.Duration
}

func NewMonitor(timeout time.Duration) *Monitor {
    return &amp;Monitor{
        lastHeartbeats: make(map[string]time.Time),
        timeout:        timeout,
    }
}

func (m *Monitor) ReceiveHeartbeat(hb Heartbeat) {
    m.mu.Lock()
    defer m.mu.Unlock()
    m.lastHeartbeats[hb.NodeID] = time.Now() // 记录接收到的本地时间
}

// 检查某个节点是否死亡
func (m *Monitor) IsNodeDead(nodeID string) bool {
    m.mu.RLock()
    defer m.mu.RUnlock()

    lastSeen, exists := m.lastHeartbeats[nodeID]
    if !exists {
        return true
    }
    return time.Since(lastSeen) &gt; m.timeout
}
</code></pre>
<p>除了 Push 模型，还有 Pull 模型（主动拉取）。比如 Kubernetes 中的 Liveness 探针，或者 Prometheus 抓取 Metrics，就是 Monitor 充当医生，定期去敲门问：“你死了没？”</p>
<h2>架构博弈：心跳频率与超时的“死亡权衡”</h2>
<p>代码写出来了，但真正的工程难题才刚刚开始：<strong>心跳间隔（Interval）和超时阈值（Timeout）到底该设置多少？</strong></p>
<p>这在系统设计中是一个经典的权衡（Trade-off）：</p>
<ul>
<li><strong>发得太快（比如 500ms 一次）</strong>：故障发现极快。但在一个 1000 个节点的集群里，中央监控器每秒要处理 2000 个心跳包。这不仅浪费带宽，而且只要网络稍微抖动一下，系统就会“神经质”地疯狂报警。</li>
<li><strong>发得太慢（比如 30s 一次）</strong>：网络开销小了，但如果节点挂了，系统要等 30 秒才发现！在这漫长的 30 秒里，无数用户的请求会被路由到一个死节点上，直接面临 P0 级生产事故。</li>
</ul>
<p><strong>行业里的黄金法则是什么？</strong></p>
<p>一般情况下，超时时间（Timeout）应该动态参考网络的平均往返时间（RTT，局域网一般是10ms以内），通常设置为 <strong>RTT 的 10 倍，或心跳间隔的 3 倍</strong>。</p>
<pre><code class="go">// 计算合理的超时时间
func CalculateTimeout(rtt time.Duration, interval time.Duration) time.Duration {
    rttBased := rtt * 10
    intervalBased := interval * 3

    // 取两者中较大的一个，避免由于网络偶尔的抖动导致误判
    if rttBased &gt; intervalBased {
        return rttBased
    }
    return intervalBased
}
</code></pre>
<p>并且，成熟的系统绝不会因为“错过一次心跳”就判死刑，通常会容忍 3-5 次心跳丢失（Missed Heartbeats），才会将节点踢出负载均衡池。</p>
<h2>当普通机制失效，大厂是如何设计故障检测的？</h2>
<p>随着业务规模的爆炸，基础的“固定超时机制”会暴露出严重的缺陷。网络状况是动态变化的，固定超时非黑即白，极易引发“误杀”。</p>
<p>让我们来看看顶级开源系统是如何进行“降维打击”的。</p>
<h3>神级算法 1：Cassandra 的 Phi (φ) 累积故障检测器</h3>
<p>NoSQL 巨头 Cassandra 没有采用简单的“超时就判定死亡”，而是引入了概率学。</p>
<p>它会统计历史心跳到达的延迟时间，并计算出一个连续的怀疑级别：<strong>Phi (φ) 值</strong>。</p>
<ul>
<li>如果偶尔网络拥堵，心跳晚到了 1 秒，φ 值可能只是轻微上升，系统不会报警。</li>
<li>只有当 φ 值达到阈值（Cassandra 默认是 8，意味着系统有 99.9999% 的把握确信节点死了），才会真正标记节点下线。</li>
</ul>
<p>这种算法，让集群在恶劣的网络环境下，展现出了惊人的自适应弹性。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/heartbeats-in-distributed-systems-2.png" alt="" /></p>
<blockquote>
<p>注：Phi (φ) 值算法来自论文《<a href="https://www.semanticscholar.org/paper/The-spl-phi-accrual-failure-detector-Hayashibara-D%C3%A9fago/11ae4c0c0d0c36dc177c1fff5eb84fa49aa3e1a8">The /spl phi/ accrual failure detector</a>》。</p>
</blockquote>
<h3>神级算法 2：去中心化的 Gossip 协议 (流言蜚语)</h3>
<p>如果集群有一万个节点，让一个中央 Monitor 去接收所有人的心跳，Monitor 自己就会被高并发压死（单点故障）。</p>
<p>怎么办？使用 <strong>Gossip 协议</strong>。</p>
<p>在 Gossip 中，没有中心的权威老大哥。每个节点只随机挑选几个“邻居”交换心跳列表。就像村口大妈传八卦一样，某个节点挂掉的消息，会呈指数级在整个集群中迅速蔓延开来。</p>
<pre><code class="go">// 极简版的 Gossip 节点状态合并逻辑
type GossipNode struct {
    NodeID          string
    HeartbeatCounter uint64
}

// 当收到邻居传来的八卦（Gossip）列表时，更新本地视图
func MergeGossipList(local map[string]uint64, received map[string]uint64) {
    for nodeID, receivedCount := range received {
        localCount, exists := local[nodeID]
        // 只保留心跳计数器更大的记录（证明该记录更新）
        if !exists || receivedCount &gt; localCount {
            local[nodeID] = receivedCount
        }
    }
}
</code></pre>
<h2>终极梦魇：脑裂（Split-brain）与 Quorum 法则</h2>
<p>心跳机制有一个终极无解的物理学盲区：<strong>网络分区（Network Partition）</strong>。</p>
<p>假设你的数据库集群部署在两个机房。突然，连接两个机房的光缆被挖掘机挖断了。机房 A 和机房 B 互相收不到对方的心跳。</p>
<ul>
<li>机房 A 以为机房 B 的机器全死光了，于是推举出了一个新 Leader。</li>
<li>机房 B 也以为机房 A 全挂了，也推举出了一个 Leader。</li>
</ul>
<p><strong>灾难发生了：一个集群出现了两个“大脑”（脑裂），它们同时接收用户的写请求，数据彻底走向混乱！</strong></p>
<p>为了对付脑裂，分布式系统引入了 <strong>Quorum（法定人数）</strong> 机制。它的核心逻辑极其霸道：<strong>必须有超过半数（N/2 + 1）的节点存活且互通，集群才允许提供写服务。</strong></p>
<pre><code class="go">// 基于 Quorum 的防御逻辑
type QuorumMonitor struct {
    TotalNodes int
}

func (q *QuorumMonitor) HasQuorum(reachableNodes int) bool {
    // 必须大于半数
    quorumSize := (q.TotalNodes / 2) + 1
    return reachableNodes &gt;= quorumSize
}

func (q *QuorumMonitor) CanAcceptWrites(reachableNodes int) bool {
    if !q.HasQuorum(reachableNodes) {
        fmt.Println("失去法定人数！立刻拒绝所有写请求，防止脑裂！")
        return false
    }
    return true
}
</code></pre>
<p>光缆断裂后，必定有一个机房的节点数达不到一半，它会自动“自杀”（拒绝服务），从而完美保全了整个集群数据的一致性。</p>
<h2>小结：那些你每天都在用的心跳机制</h2>
<p>至此，你已经领略了心跳机制从简单到深邃的演进。回到现实中，你身边的工具其实都在默默践行着这些哲学：</p>
<ul>
<li><strong>Kubernetes</strong>：Kubelet 默认每 10 秒向 API Server 发送一次心跳，40 秒收不到就被标记为 NotReady。Pod 级别的 Liveness/Readiness 探针，本质上就是典型的 Pull 模型心跳。</li>
<li><strong>etcd</strong>：基于 Raft 共识协议，Leader 默认每 100 毫秒向 Follower 发送一次心跳。如果在 1000 毫秒内没收到，Follower 就会直接发起重新选举。</li>
</ul>
<p>作为开发者，当我们下一次在业务中设计微服务的高可用架构时，请不要简单粗暴地写死一个 time.Sleep 或 if error。多想一想网络延迟、重试容忍度、Gossip 分发以及脑裂的防御。</p>
<p>因为在高并发的修罗场里，精妙的心跳机制，就是守护你系统不雪崩的最后一道防线。</p>
<h2>参考资料</h2>
<ul>
<li>https://arpitbhayani.me/blogs/phi-accrual</li>
<li>https://arpitbhayani.me/blogs/heartbeats-in-distributed-systems</li>
<li>https://www.semanticscholar.org/paper/The-spl-phi-accrual-failure-detector-Hayashibara-D%C3%A9fago/11ae4c0c0d0c36dc177c1fff5eb84fa49aa3e1a8</li>
</ul>
<hr />
<p><strong>今日互动探讨：</strong></p>
<p>你在生产环境中遇到过因为“心跳检测机制设置不合理”导致的系统频繁报警或雪崩吗？你是如何调优的？</p>
<p>欢迎在评论区分享你的血泪史与经验！</p>
<hr />
<p>还在为“复制粘贴喂AI”而烦恼？我的新专栏 <strong>《<a href="http://gk.link/a/12EPd">AI原生开发工作流实战</a>》</strong> 将带你：</p>
<ul>
<li>告别低效，重塑开发范式</li>
<li>驾驭AI Agent(Claude Code)，实现工作流自动化</li>
<li>从“AI使用者”进化为规范驱动开发的“工作流指挥家”</li>
</ul>
<p>扫描下方二维码，开启你的AI原生开发之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/ai-native-dev-workflow-qr.png" alt="" /></p>
<hr />
<p>你的Go技能，是否也卡在了“熟练”到“精通”的瓶颈期？</p>
<ul>
<li>想写出更地道、更健壮的Go代码，却总在细节上踩坑？</li>
<li>渴望提升软件设计能力，驾驭复杂Go项目却缺乏章法？</li>
<li>想打造生产级的Go服务，却在工程化实践中屡屡受挫？</li>
</ul>
<p>继《<a href="http://gk.link/a/10AVZ">Go语言第一课</a>》后，我的《<a href="http://gk.link/a/12yGY">Go语言进阶课</a>》终于在极客时间与大家见面了！</p>
<p>我的全新极客时间专栏 《<a href="http://gk.link/a/12yGY">Tony Bai·Go语言进阶课</a>》就是为这样的你量身打造！30+讲硬核内容，带你夯实语法认知，提升设计思维，锻造工程实践能力，更有实战项目串讲。</p>
<p>目标只有一个：助你完成从“Go熟练工”到“Go专家”的蜕变！ 现在就加入，让你的Go技能再上一个新台阶！</p>
<p><img src="https://tonybai.com/wp-content/uploads/course-card/iamtonybai-banner-2.gif" alt="" /></p>
<hr />
<p><strong>原「Gopher部落」已重装升级为「Go &amp; AI 精进营」知识星球，快来加入星球，开启你的技术跃迁之旅吧！</strong></p>
<p>我们致力于打造一个高品质的 <strong>Go 语言深度学习</strong> 与 <strong>AI 应用探索</strong> 平台。在这里，你将获得：</p>
<ul>
<li><strong>体系化 Go 核心进阶内容:</strong> 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏，夯实你的 Go 内功。</li>
<li><strong>前沿 Go+AI 实战赋能:</strong> 紧跟时代步伐，学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等，掌握 AI 时代新技能。 </li>
<li><strong>星主 Tony Bai 亲自答疑:</strong> 遇到难题？星主第一时间为你深度解析，扫清学习障碍。</li>
<li><strong>高活跃 Gopher 交流圈:</strong> 与众多优秀 Gopher 分享心得、讨论技术，碰撞思想火花。</li>
<li><strong>独家资源与内容首发:</strong> 技术文章、课程更新、精选资源，第一时间触达。</li>
</ul>
<p>衷心希望「Go &amp; AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚，享受技术精进的快乐！欢迎你的加入！</p>
<p><img src="http://image.tonybai.com/img/tonybai/gopher-and-ai-tribe-zsxq-small-card.jpg" alt="img{512x368}" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/03/20/heartbeats-in-distributed-systems/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>为什么你的 AI Agent 总是像个智障？来自 Manus 大佬的 2 年血泪避坑指南</title>
		<link>https://tonybai.com/2026/03/18/why-ai-agents-act-stupid-manus-expert-pitfall-guide/</link>
		<comments>https://tonybai.com/2026/03/18/why-ai-agents-act-stupid-manus-expert-pitfall-guide/#comments</comments>
		<pubDate>Wed, 18 Mar 2026 12:21:04 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[AIAgent]]></category>
		<category><![CDATA[BinaryGuard]]></category>
		<category><![CDATA[cli]]></category>
		<category><![CDATA[CodeGeneration]]></category>
		<category><![CDATA[CognitiveLoad]]></category>
		<category><![CDATA[ContextPollution]]></category>
		<category><![CDATA[ErrorGuidance]]></category>
		<category><![CDATA[FunctionCalling]]></category>
		<category><![CDATA[Hallucination]]></category>
		<category><![CDATA[Manus]]></category>
		<category><![CDATA[Minimalism]]></category>
		<category><![CDATA[Pipe]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[ProgressiveDiscovery]]></category>
		<category><![CDATA[SoftwareEngineering]]></category>
		<category><![CDATA[ToolSelection]]></category>
		<category><![CDATA[UnixPhilosophy]]></category>
		<category><![CDATA[Unix哲学]]></category>
		<category><![CDATA[上下文污染]]></category>
		<category><![CDATA[二进制守卫]]></category>
		<category><![CDATA[代码生成]]></category>
		<category><![CDATA[函数调用]]></category>
		<category><![CDATA[命令行]]></category>
		<category><![CDATA[工具选择]]></category>
		<category><![CDATA[幻觉]]></category>
		<category><![CDATA[报错向导]]></category>
		<category><![CDATA[智能体]]></category>
		<category><![CDATA[智障]]></category>
		<category><![CDATA[极简主义]]></category>
		<category><![CDATA[渐进式发现]]></category>
		<category><![CDATA[生产力]]></category>
		<category><![CDATA[管道]]></category>
		<category><![CDATA[认知过载]]></category>
		<category><![CDATA[软件工程]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=6064</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/03/18/why-ai-agents-act-stupid-manus-expert-pitfall-guide 大家好，我是Tony Bai。 如果你在过去一年里跟风写过 AI Agent（智能体），你大概率经历过这样的绝望时刻： 你兴致勃勃地给大模型挂载了二三十个精心编写的 Function Calling（函数调用）工具，比如 read_file, search_web, execute_python……你期待它能像钢铁侠的贾维斯一样运筹帷幄。 结果呢？面对稍微复杂一点的任务，你的 Agent 瞬间退化成一个“智障”。 它要么在几十个工具里疯狂迷失，选错了参数导致系统报错；要么陷入无限死循环，把你的 Token 烧个精光，最后无辜地吐出一句：“抱歉，我无法完成该任务。” 我们总以为是自己的 Prompt 没写对，或者是大模型还不够聪明。 直到前些日子，一位名叫 MorroHsu 的顶级实战派大佬（在被 Meta 收购前，他是现象级 AI 产品 Manus 的后端技术负责人）在 Reddit 上抛出了一篇长文。 在过去两年里，他以后端负责人的身份参与构建了包括 Manus、agent-clip 等在内的多个顶尖 Agent。在被大模型的各种奇葩幻觉折磨了无数遍之后，他得出了一个极其震撼、甚至有些反直觉的血泪结论： 别再瞎折腾繁琐的 Typed Function Calls（类型化函数调用）了！给大模型一堆乱七八糟的 API，就是它变“智障”的罪魁祸首。大模型最需要的，仅仅是 50 年前的 Linux 命令行（CLI）。 今天，我们就来看看这位 Manus 前后端大佬的 2 年避坑心法。看看为什么最前沿的 AI，反而需要最古老的 Unix 哲学来拯救。 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/why-ai-agents-act-stupid-manus-expert-pitfall-guide-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/03/18/why-ai-agents-act-stupid-manus-expert-pitfall-guide">本文永久链接</a> &#8211; https://tonybai.com/2026/03/18/why-ai-agents-act-stupid-manus-expert-pitfall-guide</p>
<p>大家好，我是Tony Bai。</p>
<p>如果你在过去一年里跟风写过 AI Agent（智能体），你大概率经历过这样的绝望时刻：</p>
<p>你兴致勃勃地给大模型挂载了二三十个精心编写的 Function Calling（函数调用）工具，比如 read_file, search_web, execute_python……你期待它能像钢铁侠的贾维斯一样运筹帷幄。</p>
<p>结果呢？面对稍微复杂一点的任务，你的 Agent 瞬间退化成一个“智障”。</p>
<p>它要么在几十个工具里疯狂迷失，选错了参数导致系统报错；要么陷入无限死循环，把你的 Token 烧个精光，最后无辜地吐出一句：“抱歉，我无法完成该任务。”</p>
<p>我们总以为是自己的 Prompt 没写对，或者是大模型还不够聪明。</p>
<p>直到前些日子，一位名叫 MorroHsu 的顶级实战派大佬（在被 Meta 收购前，他是现象级 AI 产品 Manus 的后端技术负责人）在 Reddit 上<a href="https://www.reddit.com/r/LocalLLaMA/comments/1rrisqn/i_was_backend_lead_at_manus_after_building_agents">抛出了一篇长文</a>。</p>
<p>在过去两年里，他以后端负责人的身份参与构建了包括 Manus、agent-clip 等在内的多个顶尖 Agent。在被大模型的各种奇葩幻觉折磨了无数遍之后，他得出了一个极其震撼、甚至有些反直觉的血泪结论：</p>
<p><strong>别再瞎折腾繁琐的 Typed Function Calls（类型化函数调用）了！给大模型一堆乱七八糟的 API，就是它变“智障”的罪魁祸首。大模型最需要的，仅仅是 50 年前的 Linux 命令行（CLI）。</strong></p>
<p>今天，我们就来看看这位 Manus 前后端大佬的 2 年避坑心法。看看为什么最前沿的 AI，反而需要最古老的 Unix 哲学来拯救。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/building-industrial-grade-agent-skills-qr.png" alt="" /></p>
<h2>为什么给 AI 几百个工具，它反而成了“智障”？</h2>
<p>目前主流的 Agent 框架（如 LangChain），都在教我们怎么给大模型塞满工具箱。你塞的工具越多，系统看起来越庞大。</p>
<p>但 MorroHsu 指出了这背后的致命逻辑错误：<strong>工具选择的认知过载（Cognitive Load）。</strong></p>
<p>大模型每次行动前，都要在几十个有着不同数据结构（Schemas）的工具中艰难地做选择题：<em>“我到底该用哪一个？参数填什么？”</em> 上下文的注意力被极大地分散了，准确率直线断崖式下跌。</p>
<p>大佬的解法粗暴且优雅：<strong>废弃所有花里胡哨的工具，只给大模型提供唯一的一个函数：run(command=”&#8230;”)。</strong></p>
<p>为什么？因为大模型天生就是个 Linux 高手！</p>
<p>大模型的训练语料库里，充斥着 GitHub 上数十亿行的代码、README.md 中的安装指南、以及 Stack Overflow 上的报错日志。这些语料中，密密麻麻全是 CLI 命令行。</p>
<p>如果你让它去调用你发明的 read_log_file(path) API，它还要去猜测你的参数定义；但如果你让它去找日志里的错误，它会凭着肌肉记忆毫不犹豫地写出：</p>
<p>run(command=”cat /var/log/app.log | grep &#8216;ERROR&#8217; | tail -n 20&#8243;)</p>
<p>你看，CLI 本身就是大模型最熟悉的母语。<strong>不要发明新的轮子去教大模型做事，直接把它最熟悉的世界交给它。</strong></p>
<h2>50年前的“管道”魔法，完美解决了 Agent 编排难题</h2>
<p>如果只有一个 run 命令，AI 遇到复杂任务怎么办？</p>
<p>这就引出了 50 年前 Unix 操作系统的伟大设计哲学：<strong>一切皆文件。</strong></p>
<p>Unix 的先驱们设计了大量只做一件事的小工具（cat, grep, sort），然后通过<strong>管道（Pipe |）</strong>将它们串联成无比强大的工作流。</p>
<p>而这，完美契合了大模型的核心本质——大模型只能理解文本输入和文本输出！</p>
<p>在传统的 Function Calling 中，为了完成“下载数据 -> 过滤错误 -> 排序前 10 条”这个任务，你的 Agent 可能需要连续调用 3 个不同的自定义函数，经历 3 轮耗时极长的 LLM 推理，中间稍微错一步就满盘皆输。</p>
<p>但在 CLI 模式下，AI 只需要通过一次组合调用就能秒杀：</p>
<p>run(command=”curl -sL $URL | grep &#8217;500&#8242; | sort | head 10&#8243;)</p>
<p>这种强大的“组合编排能力（Composition）”，不是什么 AI 领域的最新黑科技，而是 Unix 管道原生自带的降维打击。</p>
<h2>把大模型当人看，设计“防智障”导航系统</h2>
<p>当然，光把命令行扔给大模型，它依然会因为瞎猜而犯错。MorroHsu 总结了三个极其硬核的实战设计技巧，教你如何打造一个“防智障”的 Agent 导航系统：</p>
<p><strong>绝招 1：渐进式发现（Progressive Discovery）</strong></p>
<p>不要一开始就把所有命令的长篇大论全塞给大模型，那会瞬间撑爆它的上下文窗口。</p>
<p>只要告诉大模型：<em>“你可以运行 run(“command”)。遇到不懂的，运行 command &#8211;help”</em>。</p>
<p>大模型其实非常懂得自我探索。当它发现报错时，它会自动去查阅说明书。这种“按需发现”的能力，极大地节省了宝贵的 Token。</p>
<p><strong>绝招 2：把报错变成“向导”</strong></p>
<p>这是最具启发性的一点！当大模型敲错命令时，千万别只返回一个冷冰冰的 exit code 127 或者 command not found。大模型无法像人类那样去 Google 搜索错误原因，它只会陷入瞎猜的死循环。</p>
<p>你必须在 stderr（标准错误输出）里加上向导信息。</p>
<p>传统报错：cat: photo.png: binary file</p>
<p>给 AI 的防智障报错：[Error] cat: photo.png is a binary image. Use &#8216;see photo.png&#8217; instead.</p>
<p>不要试图阻止大模型犯错，而是要让它的每一次犯错，都成为指向正确道路的路标。</p>
<p><strong>绝招 3：双层架构（物理隔离幻觉）</strong></p>
<p>大模型的上下文是极其脆弱的。MorroHsu 分享了一个惨痛的真实案例：</p>
<p>一个用户上传了一张系统架构图，Agent 试图用 cat 命令读取它。结果 182KB 的乱码二进制字节流瞬间冲入了大模型的上下文。大模型当场“失了智”，开始不停地胡言乱语、重试、陷入死循环……足足浪费了 20 次推理的钱。</p>
<p>为了解决这个问题，必须在底层 Unix 执行和大模型展示层之间，建立一道<strong>“二进制守卫（Binary Guard）”</strong>和<strong>“截断溢出守卫（Overflow Mode）”</strong>。</p>
<p>当探测到命令输出超过 200 行，或者包含二进制乱码时，系统绝不把原数据返回给大模型，而是强制拦截并返回提示：</p>
<p><em>“&#8212; 输出已截断。请使用 grep 或 tail 命令进行搜索。&#8212;”</em></p>
<p>这就像给大模型戴上了一副防护眼镜，彻底杜绝了上下文被垃圾数据污染、导致智力下降的可能。</p>
<h2>小结：化繁为简，才是架构的最高境界</h2>
<p>目前，全网依然在乐此不疲地比拼谁的 Agent 框架更庞大、谁支持的 Tool Call 种类更多。但 原 Manus 大佬的这套“返璞归真”的血泪总结，给我们狠狠敲响了警钟。</p>
<p><strong>最前沿的 AI，其实最需要最古老的系统智慧。</strong></p>
<p>将 Unix 哲学的精髓（文本流、组合管道、小而美）与大模型的文本处理能力完美结合，放弃给 AI 制造复杂的隔离层和几十个脆弱的 API 接口，这才是真正属于“顶级工程师”的架构审美。</p>
<p>正如他在文末所言：“CLI 并非银弹，对于强类型校验和高安全性要求极高的场景，Typed API 依然不可或缺。<strong>但在广袤的智能体自主探索宇宙中，命令行，就是大模型所需要的全部。</strong>”</p>
<p>资料链接：https://www.reddit.com/r/LocalLLaMA/comments/1rrisqn/i_was_backend_lead_at_manus_after_building_agents</p>
<hr />
<p><strong>今日互动探讨：</strong></p>
<p>你在写 Agent 时，是喜欢用框架提供的一大堆 Tool Calls，还是像这位大神一样，直接让大模型写代码/写命令去执行？在实战中你的 AI 发生过哪些最搞笑的“智障/幻觉”行为？</p>
<p>欢迎在评论区分享你的血泪避坑史！</p>
<hr />
<p>还在为“复制粘贴喂AI”而烦恼？我的新专栏 <strong>《<a href="http://gk.link/a/12EPd">AI原生开发工作流实战</a>》</strong> 将带你：</p>
<ul>
<li>告别低效，重塑开发范式</li>
<li>驾驭AI Agent(Claude Code)，实现工作流自动化</li>
<li>从“AI使用者”进化为规范驱动开发的“工作流指挥家”</li>
</ul>
<p>扫描下方二维码，开启你的AI原生开发之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/ai-native-dev-workflow-qr.png" alt="" /></p>
<hr />
<p><strong>原「Gopher部落」已重装升级为「Go &amp; AI 精进营」知识星球，快来加入星球，开启你的技术跃迁之旅吧！</strong></p>
<p>我们致力于打造一个高品质的 <strong>Go 语言深度学习</strong> 与 <strong>AI 应用探索</strong> 平台。在这里，你将获得：</p>
<ul>
<li><strong>体系化 Go 核心进阶内容:</strong> 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏，夯实你的 Go 内功。</li>
<li><strong>前沿 Go+AI 实战赋能:</strong> 紧跟时代步伐，学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等，掌握 AI 时代新技能。 </li>
<li><strong>星主 Tony Bai 亲自答疑:</strong> 遇到难题？星主第一时间为你深度解析，扫清学习障碍。</li>
<li><strong>高活跃 Gopher 交流圈:</strong> 与众多优秀 Gopher 分享心得、讨论技术，碰撞思想火花。</li>
<li><strong>独家资源与内容首发:</strong> 技术文章、课程更新、精选资源，第一时间触达。</li>
</ul>
<p>衷心希望「Go &amp; AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚，享受技术精进的快乐！欢迎你的加入！</p>
<p><img src="http://image.tonybai.com/img/tonybai/gopher-and-ai-tribe-zsxq-small-card.jpg" alt="img{512x368}" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/03/18/why-ai-agents-act-stupid-manus-expert-pitfall-guide/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>泡沫消退后的冷思考：2026年，AI 工程师的真实生存图景</title>
		<link>https://tonybai.com/2026/03/17/ai-engineer-survival-2026-post-hype/</link>
		<comments>https://tonybai.com/2026/03/17/ai-engineer-survival-2026-post-hype/#comments</comments>
		<pubDate>Tue, 17 Mar 2026 09:45:58 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[2026年]]></category>
		<category><![CDATA[AIEngineer]]></category>
		<category><![CDATA[AI工程师]]></category>
		<category><![CDATA[ArchitectureDesign]]></category>
		<category><![CDATA[Automation]]></category>
		<category><![CDATA[CareerDevelopment]]></category>
		<category><![CDATA[CodeGeneration]]></category>
		<category><![CDATA[CoreCompetency]]></category>
		<category><![CDATA[CriticalThinking]]></category>
		<category><![CDATA[DataGovernance]]></category>
		<category><![CDATA[EfficiencyTrap]]></category>
		<category><![CDATA[FirstPrinciples]]></category>
		<category><![CDATA[GenerativeAI]]></category>
		<category><![CDATA[Imagination]]></category>
		<category><![CDATA[JobMarket]]></category>
		<category><![CDATA[KnowledgeDepreciationRate]]></category>
		<category><![CDATA[Physicalworld]]></category>
		<category><![CDATA[PostHype]]></category>
		<category><![CDATA[RealNeeds]]></category>
		<category><![CDATA[SkillDevaluation]]></category>
		<category><![CDATA[SoftwareEngineering]]></category>
		<category><![CDATA[SurvivalLandscape]]></category>
		<category><![CDATA[SystemsThinking]]></category>
		<category><![CDATA[TalentGap]]></category>
		<category><![CDATA[人才缺口]]></category>
		<category><![CDATA[代码生成]]></category>
		<category><![CDATA[想象力]]></category>
		<category><![CDATA[批判性思维]]></category>
		<category><![CDATA[技能贬值]]></category>
		<category><![CDATA[招聘市场]]></category>
		<category><![CDATA[效能陷阱]]></category>
		<category><![CDATA[数据治理]]></category>
		<category><![CDATA[架构设计]]></category>
		<category><![CDATA[核心竞争力]]></category>
		<category><![CDATA[泡沫消退]]></category>
		<category><![CDATA[物理世界]]></category>
		<category><![CDATA[生存图景]]></category>
		<category><![CDATA[生成式AI]]></category>
		<category><![CDATA[真实需求]]></category>
		<category><![CDATA[知识折旧率]]></category>
		<category><![CDATA[第一性原理]]></category>
		<category><![CDATA[系统思维]]></category>
		<category><![CDATA[职业发展]]></category>
		<category><![CDATA[自动化]]></category>
		<category><![CDATA[软件工程]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=6055</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/03/17/ai-engineer-survival-2026-post-hype 大家好，我是Tony Bai。 在过去几年里，“AI工程师”几乎成为了科技界最耀眼的标签。各大研报和媒体都在不遗余力地描绘一个人才奇缺、薪资突破天际的黄金时代。无数开发者涌入各大在线课程，试图为自己的简历贴上“大模型”、“Agent”、“RAG”等金字招牌。 然而，当我们把视线从光鲜亮丽的科技新闻转向一线招聘市场和开发者社区时，却看到了截然不同的景象。 近日，知名技术社区 r/aiengineering 的版主发布了一篇万字长文，以其作为一线招聘者和资深从业者的视角，揭开了当前 AI 工程领域的另一面。这篇文章没有迎合铺天盖地的炒作，而是抛出了几个令人深思的残酷事实： 所谓“广泛的 AI 人才缺口”可能是一种错觉； 过度依赖 AI 正在削弱开发者的核心竞争力； 而科技行业的“知识折旧率”，正达到前所未有的高度。 当狂热的泡沫开始消退，我们有必要重新审视：在 2026 年，AI 工程师的真实生存环境究竟如何？未来的技术护城河又究竟在哪里？ 被倒置的供需关系：从“拉动型”到“推动型”市场 关于 AI 领域存在巨大人才缺口的论调，在招聘市场的一线数据面前显得苍白无力。 该社区版主直言不讳地指出：“目前并没有‘广泛的’ AI 工程岗位需求。如果你发布一个真实的 AI 工程师职位，一天之内就会收到 300 到 500 份简历。” 这并非个例，整个科技就业市场目前都呈现出类似的拥挤态势。 为了更好地理解当前的处境，我们不妨借用经济学中的概念，将其与过去的科技红利期进行对比： 过去的“拉动型（Pull）”市场：大约 12 年前，当数据工程和自动化 ETL 刚刚兴起时，行业面临着真正的结构性短缺。企业处于“拉动”状态：只要你展现出一定的逻辑能力和对数据的敏感度，哪怕经验不足，公司也愿意花钱、花时间去培养你。技能是可以习得的，潜力才是被争夺的稀缺资源。 现在的“推动型（Push）”市场：如今的 AI 领域则完全相反。企业期望求职者自带极其完备的技术栈（甚至要求精通那些刚发布几个月的框架，甚至是刚发布几周的超热门工具，比如openclaw等），却极少愿意承担培训成本。数以百计的候选人为了一个岗位而拼命“推销”自己，内卷成为常态。 更具讽刺意味的是，当我们跳出科技圈，看看传统的蓝领技术工种（如高级焊接）。在这些领域，雇主依然愿意支付高昂的起薪，甚至在培训期间就支付报酬。这是因为蓝领技能基于稳定的物理定律，一旦掌握便能长期受用；而软件工程的技能，却在框架和工具的不断更迭中迅速贬值。 技能折旧与“伪效率”的陷阱 在生成式 AI 的加持下，代码生成的门槛被史无前例地降低。几句 Prompt 就能生成一个完整的 SaaS 应用原型，这让许多人产生了一种“掌握了魔法”的错觉。 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/ai-engineer-survival-2026-post-hype-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/03/17/ai-engineer-survival-2026-post-hype">本文永久链接</a> &#8211; https://tonybai.com/2026/03/17/ai-engineer-survival-2026-post-hype</p>
<p>大家好，我是Tony Bai。</p>
<p>在过去几年里，“AI工程师”几乎成为了科技界最耀眼的标签。各大研报和媒体都在不遗余力地描绘一个人才奇缺、薪资突破天际的黄金时代。无数开发者涌入各大在线课程，试图为自己的简历贴上“大模型”、“Agent”、“RAG”等金字招牌。</p>
<p>然而，当我们把视线从光鲜亮丽的科技新闻转向一线招聘市场和开发者社区时，却看到了截然不同的景象。</p>
<p>近日，知名技术社区 r/aiengineering 的版主发布了<a href="https://www.reddit.com/r/aiengineering/comments/1rf7myh/the_actual_state_of_ai_engineering_in_2026/">一篇万字长文</a>，以其作为一线招聘者和资深从业者的视角，揭开了当前 AI 工程领域的另一面。这篇文章没有迎合铺天盖地的炒作，而是抛出了几个令人深思的残酷事实：</p>
<ul>
<li>所谓“广泛的 AI 人才缺口”可能是一种错觉；</li>
<li>过度依赖 AI 正在削弱开发者的核心竞争力；</li>
<li>而科技行业的“知识折旧率”，正达到前所未有的高度。</li>
</ul>
<p>当狂热的泡沫开始消退，我们有必要重新审视：在 2026 年，AI 工程师的真实生存环境究竟如何？未来的技术护城河又究竟在哪里？</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/agentic-software-engineering-qr.png" alt="" /></p>
<h2>被倒置的供需关系：从“拉动型”到“推动型”市场</h2>
<p>关于 AI 领域存在巨大人才缺口的论调，在招聘市场的一线数据面前显得苍白无力。</p>
<p>该社区版主直言不讳地指出：“目前并没有‘广泛的’ AI 工程岗位需求。如果你发布一个真实的 AI 工程师职位，一天之内就会收到 300 到 500 份简历。” 这并非个例，整个科技就业市场目前都呈现出类似的拥挤态势。</p>
<p>为了更好地理解当前的处境，我们不妨借用经济学中的概念，将其与过去的科技红利期进行对比：</p>
<ul>
<li>过去的“拉动型（Pull）”市场：大约 12 年前，当数据工程和自动化 ETL 刚刚兴起时，行业面临着真正的结构性短缺。企业处于“拉动”状态：只要你展现出一定的逻辑能力和对数据的敏感度，哪怕经验不足，公司也愿意花钱、花时间去培养你。技能是可以习得的，潜力才是被争夺的稀缺资源。</li>
<li>现在的“推动型（Push）”市场：如今的 AI 领域则完全相反。企业期望求职者自带极其完备的技术栈（甚至要求精通那些刚发布几个月的框架，甚至是刚发布几周的超热门工具，比如openclaw等），却极少愿意承担培训成本。数以百计的候选人为了一个岗位而拼命“推销”自己，内卷成为常态。</li>
</ul>
<p>更具讽刺意味的是，当我们跳出科技圈，看看传统的蓝领技术工种（如高级焊接）。在这些领域，雇主依然愿意支付高昂的起薪，甚至在培训期间就支付报酬。这是因为蓝领技能基于稳定的物理定律，一旦掌握便能长期受用；而软件工程的技能，却在框架和工具的不断更迭中迅速贬值。</p>
<h2>技能折旧与“伪效率”的陷阱</h2>
<p>在生成式 AI 的加持下，代码生成的门槛被史无前例地降低。几句 Prompt 就能生成一个完整的 SaaS 应用原型，这让许多人产生了一种“掌握了魔法”的错觉。</p>
<p>但这种错觉背后，隐藏着巨大的技能危机。</p>
<p>大语言模型（LLM）的本质，是基于海量人类输入数据的概率预测。它擅长寻找“最短路径”，但缺乏基于物理世界常识的真正理解力和创造力。它不是在思考，而是在<strong>反刍</strong>。</p>
<p>当开发者习惯了将一切问题抛给 AI，危险便悄然而至。</p>
<ul>
<li>丧失第一性原理的思考能力：当你不再亲自设计数据流、不再一行行推敲边界条件，而是依赖 AI 直接输出结果时，你实际上是在放弃对系统底层逻辑的掌控。如果遇到复杂架构中牵一发而动全身的非标问题，或者 AI 生成的代码出现了隐蔽的竞态条件，习惯了“一键生成”的开发者将束手无策。</li>
<li>工具异化为“拐杖”：AI 是极其出色的工具（如强大的代码格式化器、高级字典、语法补全器和代码生成器），但它绝不能替代人类的批判性思维。如果一个开发者连撰写一段清晰的需求说明，或者理解一个基础的报错日志都需要求助于 LLM，那么他正在将自己的核心竞争力“外包”。</li>
</ul>
<p>正如版主所警示的：“想象力是创造力的前置条件。当你过度依赖外部的‘搜索引擎’（或现在的 LLM），你实际上是在限制自己想象和构建复杂系统的能力。”</p>
<p>在未来，真正有价值的工程师，绝不是那些只会熟练复制粘贴 Prompt 的人，而是那些能够深刻理解业务痛点、具备严密系统思维，并将 AI 作为提效“手术刀”的架构师。</p>
<h2>软件工程的重塑：回归本质与防御性思考</h2>
<p>如果我们承认 AI 只是一种强大的工具，那么在 2026 年乃至于更远的未来，软件工程的发展方向将发生怎样的变化？</p>
<h3>数据治理与所有权的回归</h3>
<p>AI 的上限取决于其训练数据的质量。随着企业越来越意识到数据的核心资产价值，“数据保护主义”正在抬头。聪明的企业将不再盲目地将核心业务数据和架构信息投喂给公有云的 LLM，而是转向构建私有化部署、安全可控的小模型或混合架构。这意味着，理解如何在企业安全边界内有效利用 AI（如本地 RAG、数据清洗脱敏），将比单纯的 Prompt 技巧更有市场。</p>
<h3>重拾物理世界的基石</h3>
<p>数字世界是脆弱的，极易被复制、攻击甚至完全由机器生成。在未来，能够产生真正不可替代价值的技术创新，将不可避免地与物理世界产生更深度的融合——例如机器人技术、能源革命（核聚变、新型材料开发）以及量子计算等。这些领域无法仅靠敲击键盘和调用 API 来完成，它们需要扎实的工程物理基础和试错成本。</p>
<h3>对技术银弹的祛魅</h3>
<p>我们需要接受一个现实：就像过去 20 年的互联网繁荣并没有从根本上解决住房、医疗等生活成本上升的问题一样，AI 也不是解决所有结构性问题的万能药。它提高了软件生产的效率，但这部分效率的红利最终会流向何处（是转化为开发者的工资，还是变成了资本的利润），还有待时间的检验。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/ai-engineer-survival-2026-post-hype-2.png" alt="" /></p>
<h2>小结</h2>
<p>历史的车轮滚滚向前，AI 技术的浪潮不可逆转。但作为身处浪潮之中的工程师，<strong>保持清醒的认知比盲目追逐风口更为重要</strong>。</p>
<p>不要被短期的喧嚣蒙蔽了双眼。去培养那些 AI 无法轻易替代的能力：对复杂系统的架构设计能力、对模糊业务需求的洞察力、以及在真实物理世界中解决问题的韧性。</p>
<p>AI 是我们手中的剑，不要让它斩断了我们自己的思考之路。</p>
<p>资料链接：https://www.reddit.com/r/aiengineering/comments/1rf7myh/the_actual_state_of_ai_engineering_in_2026/</p>
<hr />
<p><strong>你感到“钝”了吗？</strong></p>
<p>习惯了 AI 这个“认知轮椅”后，你是否也曾有过“离开 AI 不会写代码”的瞬间？在你看来，2026 年最值钱的技能是哪个？是能写出完美的 Prompt，还是能看透 AI 看不透的复杂系统？</p>
<p>欢迎在评论区分享你的生存感悟！</p>
<hr />
<p>还在为“复制粘贴喂AI”而烦恼？我的新专栏 <strong>《<a href="http://gk.link/a/12EPd">AI原生开发工作流实战</a>》</strong> 将带你：</p>
<ul>
<li>告别低效，重塑开发范式</li>
<li>驾驭AI Agent(Claude Code)，实现工作流自动化</li>
<li>从“AI使用者”进化为规范驱动开发的“工作流指挥家”</li>
</ul>
<p>扫描下方二维码，开启你的AI原生开发之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/ai-native-dev-workflow-qr.png" alt="" /></p>
<hr />
<p>你的Go技能，是否也卡在了“熟练”到“精通”的瓶颈期？</p>
<ul>
<li>想写出更地道、更健壮的Go代码，却总在细节上踩坑？</li>
<li>渴望提升软件设计能力，驾驭复杂Go项目却缺乏章法？</li>
<li>想打造生产级的Go服务，却在工程化实践中屡屡受挫？</li>
</ul>
<p>继《<a href="http://gk.link/a/10AVZ">Go语言第一课</a>》后，我的《<a href="http://gk.link/a/12yGY">Go语言进阶课</a>》终于在极客时间与大家见面了！</p>
<p>我的全新极客时间专栏 《<a href="http://gk.link/a/12yGY">Tony Bai·Go语言进阶课</a>》就是为这样的你量身打造！30+讲硬核内容，带你夯实语法认知，提升设计思维，锻造工程实践能力，更有实战项目串讲。</p>
<p>目标只有一个：助你完成从“Go熟练工”到“Go专家”的蜕变！ 现在就加入，让你的Go技能再上一个新台阶！</p>
<p><img src="https://tonybai.com/wp-content/uploads/course-card/iamtonybai-banner-2.gif" alt="" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/03/17/ai-engineer-survival-2026-post-hype/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>被嘲笑比 Python 还慢？扒开 Go 正则表达式的底层，看看它为了防范“系统猝死”付出了什么</title>
		<link>https://tonybai.com/2026/03/17/why-is-go-regex-so-slow/</link>
		<comments>https://tonybai.com/2026/03/17/why-is-go-regex-so-slow/#comments</comments>
		<pubDate>Mon, 16 Mar 2026 23:28:31 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[CatastrophicBacktracking]]></category>
		<category><![CDATA[Codereview]]></category>
		<category><![CDATA[DenialOfService]]></category>
		<category><![CDATA[DFA]]></category>
		<category><![CDATA[DFS]]></category>
		<category><![CDATA[GarbageCollection]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[GoLanguage]]></category>
		<category><![CDATA[Go语言]]></category>
		<category><![CDATA[MemoryManagement]]></category>
		<category><![CDATA[NFA引擎]]></category>
		<category><![CDATA[PCRE]]></category>
		<category><![CDATA[Prefilters]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[RE2]]></category>
		<category><![CDATA[ReDoS]]></category>
		<category><![CDATA[RegularExpressions]]></category>
		<category><![CDATA[RuntimeEfficiency]]></category>
		<category><![CDATA[Rust]]></category>
		<category><![CDATA[SIMD]]></category>
		<category><![CDATA[ThompsonNFA]]></category>
		<category><![CDATA[Zig]]></category>
		<category><![CDATA[代码审查]]></category>
		<category><![CDATA[内存管理]]></category>
		<category><![CDATA[向量化指令]]></category>
		<category><![CDATA[垃圾回收]]></category>
		<category><![CDATA[性能基准测试]]></category>
		<category><![CDATA[拒绝服务攻击]]></category>
		<category><![CDATA[正则表达式]]></category>
		<category><![CDATA[深度优先搜索]]></category>
		<category><![CDATA[灾难性回溯]]></category>
		<category><![CDATA[确定性有限自动机]]></category>
		<category><![CDATA[运行效率]]></category>
		<category><![CDATA[预过滤]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=6050</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/03/17/why-is-go-regex-so-slow 大家好，我是Tony Bai。 如果有人问你：在处理纯 CPU 密集型的文本匹配时，Go 和 Python 哪个快？ 相信 99% 的 Go 开发者会毫不犹豫地把票投给 Go。毕竟，一门编译型的静态语言，怎么可能输给拖着 GIL 锁的解释型脚本语言？ 但现实往往比小说更魔幻。 最近，在 Reddit 的 r/golang 论坛上，一张残酷的 Benchmark 跑分图引发了整个 Go 社区的剧烈震荡。一位开发者，使用极其常见的日志解析正则表达式（提取 IP、时间、URI 等），对各大语言进行了一次横评。 结果令人大跌眼镜：同样的数据集，Rust 跑了 3.9 秒，Zig 跑了 1.3 秒，而 Go 居然跑了整整 38.1 秒！整整比第一名 Zig 慢了接近 30 倍！ 如果你再去翻看 Go 官方的 Issue #26623，会看到更绝望的数据：早在2018年的一次正则基准测试中，Go 不仅被 C++ 和 Rust [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/why-is-go-regex-so-slow-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/03/17/why-is-go-regex-so-slow">本文永久链接</a> &#8211; https://tonybai.com/2026/03/17/why-is-go-regex-so-slow</p>
<p>大家好，我是Tony Bai。</p>
<p>如果有人问你：在处理纯 CPU 密集型的文本匹配时，Go 和 Python 哪个快？</p>
<p>相信 99% 的 Go 开发者会毫不犹豫地把票投给 Go。毕竟，一门编译型的静态语言，怎么可能输给拖着 GIL 锁的解释型脚本语言？</p>
<p>但现实往往比小说更魔幻。</p>
<p>最近，在 Reddit 的 r/golang 论坛上，一张残酷的 Benchmark 跑分图<a href="https://www.reddit.com/r/golang/comments/1rr2evh/why_is_gos_regex_so_slow/">引发了整个 Go 社区的剧烈震荡</a>。一位开发者，使用极其常见的日志解析正则表达式（提取 IP、时间、URI 等），对各大语言进行了一次横评。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/why-is-go-regex-so-slow-2.png" alt="" /></p>
<p>结果令人大跌眼镜：同样的数据集，Rust 跑了 3.9 秒，Zig 跑了 1.3 秒，而 Go 居然跑了整整 38.1 秒！整整比第一名 Zig 慢了接近 30 倍！</p>
<p>如果你再去翻看 Go 官方的 <a href="https://github.com/golang/go/issues/26623">Issue #26623</a>，会看到更绝望的数据：早在2018年的一次正则基准测试中，Go 不仅被 C++ 和 Rust 碾压，甚至连 Python 3、PHP 和 Javascript 都能在正则上把 Go 按在地上摩擦。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/why-is-go-regex-so-slow-3.png" alt="" /></p>
<p>一时间，无数 Gopher 信仰崩塌：“为什么 Go 的标准库 regexp 这么慢？”、“连简单的正则都做不好，Go 凭什么做云原生霸主？”</p>
<p>今天，我们就来硬核扒开 Go 语言 regexp 包的底层设计和实现。你会发现，这不是 Go 团队的技术拉跨，而是一场关于“性能、安全与工程哲学”的博弈。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/agentic-software-engineering-qr.png" alt="" /></p>
<h2>原罪：你以为的慢，其实是替 CGO 负重前行</h2>
<p>面对“为什么 Go 的正则比 Python 还慢”的灵魂拷问，Go 核心团队成员 Ian Lance Taylor 给出了第一层解释。</p>
<p>在 Python、PHP 甚至 Node.js 中，你以为你是在运行脚本，其实它们底层都在悄悄“作弊”。这些语言的正则表达式引擎，几乎全部是用高度优化的 C 语言库（主要是 PCRE，Perl Compatible Regular Expressions）编写的。</p>
<p>当你在 Python 里调用 re.match() 时，它瞬间就穿透到了 C 语言的底层，享受着现代 CPU 指令集的极致加速。</p>
<p>那 Go 为什么不用 C？因为 Go 是一门有着“极度洁癖”的语言。</p>
<p>如果 Go 的标准库引入了 C 语言的 PCRE，就必须通过 CGO 来调用。而 CGO 的上下文切换成本极高，更致命的是，它会彻底破坏 Go 引以为傲的“跨平台交叉编译”能力。你再也不能在一个简单的 go build 后，把二进制文件无痛丢到任何 Alpine 容器里了。</p>
<p>因此，Go 团队做出了第一个艰难的决定：完全使用纯 Go 语言，从零手写一个正则表达式引擎。</p>
<p>脱离了 C 语言几十年的底层优化积累，用原生代码去硬刚别人的 C 引擎，这是 Go 看起来“慢”的表层原因。</p>
<p>但这，仅仅是冰山一角。</p>
<h2>路线之争：为了防止系统“猝死”，Go 抛弃了速度</h2>
<p>真正让 Go 正则变得“慢”的，是算法架构上的降维选择。这牵扯到 Go 语言的缔造者之一、大神 Russ Cox (rsc) 的一段往事。</p>
<p>在正则表达式的底层世界里，存在着两大流派：</p>
<ol>
<li><strong>基于回溯（Backtracking）的 NFA 引擎</strong>：代表人物是 PCRE（被 Python、Java、PHP 广泛使用）。</li>
<li><strong>基于 Thompson NFA / DFA 的引擎</strong>：代表人物是 RE2（被 Go、Rust 采用）。</li>
</ol>
<p>PCRE 引擎极快，它支持各种花里胡哨的语法（如前瞻断言 Lookaround、反向引用 Backreferences）。它的算法逻辑是“不撞南墙不回头”的深度优先搜索（DFS）。在匹配正常字符串时，它快如闪电。</p>
<p>但它有一个极其致命的死穴：ReDoS（正则表达式拒绝服务攻击）。</p>
<p>想象一下你写了一个看似无害的正则：</p>
<pre><code>^([a-zA-Z0-9]+\s?)+$
</code></pre>
<p>如果黑客故意传入一个极其恶意的字符串：aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!（注意最后的感叹号）。</p>
<p>PCRE 引擎会陷入可怕的“灾难性回溯”。它会尝试所有可能的组合，时间复杂度瞬间飙升到 <strong>O(2^n)</strong> 级。短短几十个字符的输入，能让单核 CPU 满载运行几年都算不出结果！</p>
<p>2019 年，互联网巨头 Cloudflare 就因为在 WAF 防火墙中写错了一个极其简单的正则表达式，CPU资源瞬间耗尽，导致全球80% 的通过 Cloudflare 代理的网站受到影响，陷入瘫痪长达 27 分钟。这就是 PCRE 回溯引擎的恐怖破坏力。</p>
<p>Russ Cox 在设计 Go 的 regexp 包时，定下了一条铁律：系统安全与可预测性，绝对高于单次请求的极限性能。</p>
<p>因此，Go 彻底抛弃了危险的回溯引擎，选择了基于 <strong>Thompson NFA</strong> 的算法（源自他之前在Google主导设计的 C++ RE2 引擎）。这种算法保证了匹配时间永远是<strong>线性复杂度 O(n)</strong>。</p>
<p>无论黑客传入多么恶意的字符串，Go 的正则引擎绝对不会发生灾难性回溯。它牺牲了在美好情况下的极致快感，换取了在极端恶劣环境下的金身不坏。</p>
<p>这算是 Go 团队最顶级的“克制”吧。</p>
<h2>硬核剖析：Go 的正则，时间到底去哪了？</h2>
<p>既然算法是 O(n) 的，为什么 Go 依然比同样采用 RE2/DFA 思想的 Rust 慢那么多呢？</p>
<p>如果你去追踪 Go 官方的 <a href="https://github.com/golang/go/issues/19629">Issue #19629</a>和<a href="https://github.com/golang/go/issues/11646">Issue #11646</a>，通过 pprof 分析 Go 正则匹配的 CPU 耗时，你会看到几个令人头疼的瓶颈：</p>
<p><strong>1. 沉重的 UTF-8 解析税</strong></p>
<p>Rust 和 C 的很多正则引擎，底层是直接在“字节（Byte）”级别游走的。而 Go 为了贯彻它对 Unicode 的原生支持，regexp 包在内部极其频繁地将输入流解码为 Rune（Go 的 Unicode 字符单位）。这种逐个解析 Rune 的操作，带来了巨大的计算开销。</p>
<p><strong>2. NFA 虚拟线程的内存震荡</strong></p>
<p>在 Go 的底层源码中，你可以看到耗时最高的两个函数是 (<em>machine).add 和 (</em>machine).step。</p>
<p>Go 是通过维护两个“状态队列（稀疏集）”来模拟 NFA 的并行推进的。每读取一个字符，引擎就要把所有可能的状态添加到下一个队列中。这导致了海量的内存重分配（Allocation）和切片拷贝。哪怕是匹配一个简单的长字符串，底层都在疯狂地挪动内存。</p>
<p>既然这么慢，为什么不把 C++ RE2 里那个极速的 DFA（确定性有限状态自动机）移植到 Go 里呢？</p>
<p><a href="https://github.com/golang/go/issues/11646">Issue #11646</a> 记录了这次尝试。开发者 Michael Matloob 曾经试图将 RE2 的 DFA 移植过来，但被 Russ Cox 拦下了。原因很直接：DFA 虽然快，但它在运行时会动态生成大量的状态，如果不加以严格限制，极易引发内存耗尽（OOM）。在 Go 带有 GC 的内存模型下，频繁创建和销毁庞大的 DFA 状态缓存，会让垃圾回收器不堪重负。</p>
<p>于是，Go 的标准库在“安全、内存、性能”的三角博弈中，选择了妥协于现状。</p>
<h2>社区的探索：SIMD 降维打击与 100倍加速的 coregex</h2>
<p>官方的克制固然令人敬佩，但对于身处一线的业务开发者来说，由于正则太慢导致的 CPU 告警，是实实在在的痛点。</p>
<p>“既然官方不愿意改，那我们就自己造轮子！”</p>
<p>在近期的 Issue #26623 中，一位名为 kolkov 的开发者带着他的开源库 coregex 杀入了战场，向 Go 标准库发起了直接的挑战。</p>
<p>coregex 是一个完全用纯 Go 编写的正则库，它的出现直接将 Go 的正则性能拉到了与 Rust 并驾齐驱，甚至在某些场景下超越 Rust 的境地。</p>
<p>它是怎么做到的？它在底层祭出了几个大杀器：</p>
<ol>
<li><strong>SIMD 预过滤（Prefilters）</strong>：它使用了手写的汇编代码（AVX2/SSSE3 指令集），将正则中的静态字符串提取出来，利用 CPU 的向量化指令，一次性对比 32 个字节。像匹配 .*&#46;txt 这种正则，速度直接飙升了 <strong>1500倍</strong>！</li>
<li><strong>带缓存的 Lazy DFA</strong>：它绕过了标准库每次都重算 NFA 的毛病，在运行时动态构建 DFA 缓存，大幅消除了内存分配。</li>
<li><strong>写时复制（COW）的捕获组</strong>：标准库在处理提取子串时会疯狂分配切片。coregex 通过切片状态共享，让内存分配直接减少了 50%。</li>
</ol>
<p>在 kolkov 提供的 CI 跑分中，在 6MB 的输入下，coregex 处理邮箱、URI 的耗时仅为 1.5 毫秒，而标准库耗时高达 260 毫秒。<strong>足足快了 170 倍！</strong></p>
<p>然而，这段极其硬核的改进，依然很难入Go团队法眼，更不用谈在短期内被合并进 Go 的标准库。</p>
<p>一方面，Go 官方目前正在推进自己的内建 SIMD 方案（Issue #73787），不想接入手写的汇编代码；另一方面，社区大牛 Ben Hoyt 在使用 coregex 时发现，如果开启 Longest() 模式（最长匹配模式），这个库的性能会发生严重退化。</p>
<p>这再次印证了标准库开发的残酷：在某几个特定场景下跑到全宇宙第一很容易，但要在一套 API 里无死角地兜底全世界所有的奇葩正则输入，难如登天。</p>
<h2>在 Go 中写正则的正确姿势</h2>
<p>大致了解了底层原理，回到日常开发中，我们该如何应对 Go 正则的性能瓶颈？作为高级 Go 开发者，请务必将以下三条军规刻在脑子里：</p>
<p><strong>第一条：能不用正则，就坚决不用</strong></p>
<p>如果你只是想检查字符串是否包含子串，或者进行简单的前后缀匹配，<strong>永远优先使用 strings.Contains()、strings.HasPrefix() 等内置函数。</strong> 它们底层有优化的实现，在这样简单场景下，速度是 regexp 包不可比拟的。</p>
<p><strong>第二条：将编译前置，远离循环</strong></p>
<p>如果你翻看新手代码，最常见的低级错误就是在 for 循环或者每次 HTTP 请求里调用 regexp.Compile()。</p>
<p>正则的编译过程（生成 NFA 字节码）极其消耗 CPU。请永远在全局变量或 init() 函数中使用 regexp.MustCompile()，将其编译好并复用。Go 的 Regexp 对象是并发安全的，随便多 Goroutine 调用。</p>
<p><strong>第三条：在极端性能要求下，打破“洁癖”</strong></p>
<p>如果你的核心业务（比如高频日志清洗、海量数据 ETL）确实被 regexp 卡住了脖子，不要硬抗。</p>
<p>你可以选择引入通过 CGO 调用 PCRE的Go binding库（比如https://github.com/GRbit/go-pcre），但要注意防范 ReDoS 攻击，或google/re2的Go binding(比如https://github.com/wasilibs/go-re2)，又或是在业务侧尝试社区的野路子 coregex。在生存面前，架构的“洁癖”是可以适当妥协的。</p>
<h2>小结</h2>
<p>“为什么 Go 的正则这么慢？”</p>
<p>这并非一个简单的工程失误。它是一道分水岭，隔开了“追求跑分好看的玩具代码”与“守护千万级并发集群的生产级设计”。</p>
<p>Russ Cox 宁愿忍受整个开源界的群嘲，也没有为了刷榜而去引入危险的回溯引擎。这或许就是 Go 语言能够成为云原生时代头部语言的原因：<strong>不盲目追求上限的巅峰，而是死死守住安全下限。</strong></p>
<h2>参考资料</h2>
<ul>
<li>https://www.reddit.com/r/golang/comments/1rr2evh/why_is_gos_regex_so_slow/</li>
<li>https://github.com/golang/go/issues/26623</li>
<li>https://github.com/golang/go/issues/19629</li>
<li>https://github.com/golang/go/issues/11646</li>
<li>https://swtch.com/~rsc/regexp/</li>
</ul>
<hr />
<p><strong>今日互动探讨：</strong></p>
<p>在你的日常开发中，有没有被由于“写了糟糕的正则表达式”而导致 CPU 飙升 100% 的惨痛经历？你又是如何排查和优化的？</p>
<p>欢迎在评论区分享你的血泪史</p>
<hr />
<p><strong>认知跃迁：读懂底层机制，才能看透系统架构的本质</strong></p>
<p>从放弃 CGO 选择纯 Go 实现，到防范 ReDoS 采用 NFA，再到社区为了榨干 CPU 性能而引入 SIMD。Go 语言的每一个看似“不合理”的设计背后，都隐藏着深邃的系统级考量。</p>
<p>然而，令人遗憾的是，很多开发者写了五六年的 Go 代码，遇到性能瓶颈依然只能靠“瞎猜”和“重启”。他们对 Go 的内存逃逸、Goroutine 调度机制以及标准库的底层数据结构一无所知。</p>
<p>如果你渴望突破“熟练调包侠”的瓶颈，想要像 Russ Cox 这样的顶级大厂架构师一样，看透 Go 语言背后的底层逻辑，建立起自己坚不可摧的技术护城河——</p>
<p>我的极客时间专栏 <strong>《<a href="http://gk.link/a/12yGY">Tony Bai·Go语言进阶课</a>》</strong> 正是为你量身定制。</p>
<p>在这 30+ 讲极其硬核的内容中，我不仅带你剥开语法糖，深挖 Goroutine 调度、Channel 哲学；更会带你全面吃透 Go 的工程化实践，把底层性能调优背后的逻辑一次性讲透。</p>
<p>目标只有一个：助你完成从“Go 熟练工”到“能做顶级架构决策的 Go 专家”的蜕变！</p>
<p>扫描下方二维码，加入专栏。不要用战术上的勤奋，掩盖战略上的懒惰。让我们一起用架构师的视角，重新认识 Go 语言。</p>
<p><img src="https://tonybai.com/wp-content/uploads/course-card/go-advanced-course-4.png" alt="" /></p>
<hr />
<p>还在为“复制粘贴喂AI”而烦恼？我的新专栏 <strong>《<a href="http://gk.link/a/12EPd">AI原生开发工作流实战</a>》</strong> 将带你：</p>
<ul>
<li>告别低效，重塑开发范式</li>
<li>驾驭AI Agent(Claude Code)，实现工作流自动化</li>
<li>从“AI使用者”进化为规范驱动开发的“工作流指挥家”</li>
</ul>
<p>扫描下方二维码，开启你的AI原生开发之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/ai-native-dev-workflow-qr.png" alt="" /></p>
<hr />
<p><strong>原「Gopher部落」已重装升级为「Go &amp; AI 精进营」知识星球，快来加入星球，开启你的技术跃迁之旅吧！</strong></p>
<p>我们致力于打造一个高品质的 <strong>Go 语言深度学习</strong> 与 <strong>AI 应用探索</strong> 平台。在这里，你将获得：</p>
<ul>
<li><strong>体系化 Go 核心进阶内容:</strong> 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏，夯实你的 Go 内功。</li>
<li><strong>前沿 Go+AI 实战赋能:</strong> 紧跟时代步伐，学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等，掌握 AI 时代新技能。 </li>
<li><strong>星主 Tony Bai 亲自答疑:</strong> 遇到难题？星主第一时间为你深度解析，扫清学习障碍。</li>
<li><strong>高活跃 Gopher 交流圈:</strong> 与众多优秀 Gopher 分享心得、讨论技术，碰撞思想火花。</li>
<li><strong>独家资源与内容首发:</strong> 技术文章、课程更新、精选资源，第一时间触达。</li>
</ul>
<p>衷心希望「Go &amp; AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚，享受技术精进的快乐！欢迎你的加入！</p>
<p><img src="http://image.tonybai.com/img/tonybai/gopher-and-ai-tribe-zsxq-small-card.jpg" alt="img{512x368}" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/03/17/why-is-go-regex-so-slow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>别再卷前端 UI 了！未来万亿级用户的产品，根本没有界面</title>
		<link>https://tonybai.com/2026/03/12/building-for-trillions-of-agents/</link>
		<comments>https://tonybai.com/2026/03/12/building-for-trillions-of-agents/#comments</comments>
		<pubDate>Wed, 11 Mar 2026 23:48:33 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[Agent]]></category>
		<category><![CDATA[AgentExperience]]></category>
		<category><![CDATA[AgenticCoding]]></category>
		<category><![CDATA[AIAgent]]></category>
		<category><![CDATA[AI智能体]]></category>
		<category><![CDATA[APIFirst]]></category>
		<category><![CDATA[API优先]]></category>
		<category><![CDATA[ArchitectureRefactoring]]></category>
		<category><![CDATA[Automation]]></category>
		<category><![CDATA[AX]]></category>
		<category><![CDATA[Composability]]></category>
		<category><![CDATA[DeveloperTools]]></category>
		<category><![CDATA[FrontendUI]]></category>
		<category><![CDATA[HCI]]></category>
		<category><![CDATA[InternetOwnership]]></category>
		<category><![CDATA[M2M]]></category>
		<category><![CDATA[MachineEconomy]]></category>
		<category><![CDATA[MachineTraffic]]></category>
		<category><![CDATA[Privacy]]></category>
		<category><![CDATA[Robustness]]></category>
		<category><![CDATA[SaaS]]></category>
		<category><![CDATA[Web4.0]]></category>
		<category><![CDATA[workflow]]></category>
		<category><![CDATA[ZeroTrust]]></category>
		<category><![CDATA[互联网所有权]]></category>
		<category><![CDATA[人机交互]]></category>
		<category><![CDATA[前端UI]]></category>
		<category><![CDATA[可组合性]]></category>
		<category><![CDATA[工作流]]></category>
		<category><![CDATA[开发者工具]]></category>
		<category><![CDATA[智能体体验]]></category>
		<category><![CDATA[智能体编程]]></category>
		<category><![CDATA[机器流量]]></category>
		<category><![CDATA[机器经济]]></category>
		<category><![CDATA[机机交互]]></category>
		<category><![CDATA[架构重构]]></category>
		<category><![CDATA[自动化]]></category>
		<category><![CDATA[软件即服务]]></category>
		<category><![CDATA[隐私]]></category>
		<category><![CDATA[零信任]]></category>
		<category><![CDATA[鲁棒性]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=6026</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/03/12/building-for-trillions-of-agents 大家好，我是Tony Bai。 如果你看一眼2025年 Web 流量统计报告，你会发现一个令人脊背发凉的残酷真相：人类，在互联网上已经正式成为少数派，机器流量已历史性突破 50%。 硅谷创业教父 Paul Graham 曾有一句被无数创业者和产品经理奉为圭臬的名言：“Make something people want.”（做人们想要的东西）。 但在今天，如果你还在死磕这句话，你可能会死得很惨。在这个 AI Agent（智能体）全面爆发的前夜，这句箴言必须被冷酷地改写为： “Make something Agents want.”（做智能体想要的东西）。 因为未来的超级软件，根本不需要界面。 你精心打磨的 UI，在 AI 眼里一文不值 过去这几年，我们的开发者和 SaaS 创业者都在疯狂地“卷”前端：我们花了无数个熬红双眼的夜晚，去优化页面的停留时长，去测试按钮的颜色，去设计无比华丽的交互动画和留客弹窗。 我们试图把最核心的功能藏在复杂的 Web 界面后，以此作为产品的“护城河”。 但现实狠狠地给了我们一记耳光。 因为在未来，那些高度硬核的知识工作者（首当其冲是程序员），将不再亲自去挑选工具、注册账号、点击鼠标。他们只会向自己的 Claude Code 或 OpenClaw 下达指令：“帮我把这个数据库清洗一遍。” Agent 会成为那个真正“做决定”和“使用产品”的人。 YCombinator 的合伙人 Jared Friedman 曾一针见血地指出过现存系统最致命的 Bug：目前大多数标榜牛逼的开发者工具，依然不允许你通过纯 API 来注册账号和获取 Key。 如果你的系统不能让 Agent 瞬间自动注册并调用，那你的服务在硅基生命眼里就等于“死”了。Agent [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/building-for-trillions-of-agents-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/03/12/building-for-trillions-of-agents">本文永久链接</a> &#8211; https://tonybai.com/2026/03/12/building-for-trillions-of-agents</p>
<p>大家好，我是Tony Bai。</p>
<p>如果你看一眼2025年 <a href="https://www.imperva.com/resources/resource-library/reports/2025-bad-bot-report">Web 流量统计报告</a>，你会发现一个令人脊背发凉的残酷真相：人类，在互联网上已经正式成为少数派，机器流量已历史性突破 50%。</p>
<p>硅谷创业教父 Paul Graham 曾有一句被无数创业者和产品经理奉为圭臬的名言：<em>“Make something people want.”</em>（做人们想要的东西）。</p>
<p>但在今天，如果你还在死磕这句话，你可能会死得很惨。在这个 AI Agent（智能体）全面爆发的前夜，这句箴言必须被冷酷地改写为：<br />
<strong>“Make something Agents want.”（做智能体想要的东西）。</strong></p>
<p>因为未来的超级软件，根本不需要界面。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/agentic-software-engineering-qr.png" alt="" /></p>
<h2>你精心打磨的 UI，在 AI 眼里一文不值</h2>
<p>过去这几年，我们的开发者和 SaaS 创业者都在疯狂地“卷”前端：我们花了无数个熬红双眼的夜晚，去优化页面的停留时长，去测试按钮的颜色，去设计无比华丽的交互动画和留客弹窗。</p>
<p>我们试图把最核心的功能藏在复杂的 Web 界面后，以此作为产品的“护城河”。</p>
<p><strong>但现实狠狠地给了我们一记耳光。</strong></p>
<p>因为在未来，那些高度硬核的知识工作者（首当其冲是程序员），将不再亲自去挑选工具、注册账号、点击鼠标。他们只会向自己的 Claude Code 或 OpenClaw 下达指令：<em>“帮我把这个数据库清洗一遍。”</em></p>
<p>Agent 会成为那个真正“做决定”和“使用产品”的人。</p>
<p>YCombinator 的合伙人 Jared Friedman 曾一针见血地指出过现存系统最致命的 Bug：目前大多数标榜牛逼的开发者工具，依然不允许你通过纯 API 来注册账号和获取 Key。</p>
<p>如果你的系统不能让 Agent 瞬间自动注册并调用，那你的服务在硅基生命眼里就等于“死”了。Agent 根本没有耐心去看你的华丽网页，更不会去看你的网络研讨会（Webinar）。它只会默默绕过你，去寻找那些 API 最清晰、对机器最友好的竞品。</p>
<p>旧时代的 PLG（Product-Led Growth，产品驱动增长）漏斗彻底失效，我们正在进入一个由“API 文档决定生死”的时代。</p>
<h2>旧商业模式崩塌，万亿 Agent 的新基建</h2>
<p>当我深入研究目前最前沿的 Agent 生态时，我发现，不仅仅是前端 UI 失效了，连我们习以为常的“按人头收费（Seat-based）”的商业模式也在崩塌。</p>
<p>试想一下，如果一个企业从 50 个普通人类员工，变成了“50 个人类 + 5000 个全天候运行的 Agent”，按人头收费的逻辑怎么算？</p>
<p>Agent 的工作负载是爆发式的，它可能在一秒钟内发起 50 次并发请求，瞬间击穿你原本为“人类手速”设计的限流（Rate Limit）网关。</p>
<p>不要再去应用层卷那些同质化的 AI 壳子了。真正聪明的开发者，已经开始为万亿规模的 Agent 造轮子。以下是四大正在爆发的基础设施赛道：</p>
<ol>
<li><strong>Agent 的沙盒计算层</strong>：未来的服务器农场不是为了托管人类的网站，而是为了托管 Agent 的无状态执行沙盒（如 <a href="https://github.com/e2b-dev/e2b">E2B</a>）。</li>
<li><strong>Agent 的身份与钱包</strong>：Agent 需要在互联网上爬取付费资源，Stripe 级别的微支付（Microtransactions）将迎来真正的机器间交易刚需。</li>
<li><strong>机器间的服务发现（Service Discovery）</strong>：当人类退居幕后，Agent 之间如何知道对方能提供什么服务？我们需要机器与机器之间的“握手协议”。</li>
<li><strong>信任与越权治理</strong>：当 Agent 带着你的授权去操作公司核心 CRM 时，如何防止它“幻觉越权”？</li>
</ol>
<p><img src="https://tonybai.com/wp-content/uploads/2026/building-for-trillions-of-agents-2.png" alt="" /><br />
<center>图：E2B沙盒运行示意图</center></p>
<h2>Agent-First 时代的生存铁律</h2>
<p>Perplexity CEO Aravind Srinivas 说过一句极具穿透力的话：<em>“把电脑给电脑，让它们为人类创造与人类使用电脑时相同的输出，是一个更好的主意。”</em></p>
<p>在这个不可逆转的软件重心转移中，普通开发者该如何避免被淘汰？请牢记以下三条铁律：</p>
<ul>
<li><strong>铁律一：API 就是你的最终 UI。</strong> 如果你的核心功能没有暴露在 API、CLI（命令行）或 MCP (Model Context Protocol) 接口中，它就不存在。</li>
<li><strong>铁律二：文档是写给机器看的。</strong> 你的 &#8211;help 文档和 API Schema 必须极度结构化，让 Agent 的大语言模型能做到“一秒读懂、零次试错”。</li>
<li><strong>铁律三：放弃闭环壁垒，拥抱极致的可组合性（Composability）。</strong> 打造干净的、无状态的、可被机器随时读取和拼接的工作流。</li>
</ul>
<h2>丢掉鼠标，成为“造规则”的人</h2>
<p>未来的十年，是复杂性从“人机交互”向“机器间协议”下沉的十年。</p>
<p>作为开发者，现在最紧迫的任务，就是明天上班打开你的项目，问自己一个问题：<strong>“如果不用网页，一个纯粹的 AI Agent 能在 5 秒内调通我的核心链路吗？”</strong></p>
<p>去构建那些没有界面的、纯粹的、让 Agent 感到舒适的系统吧，它们才是下一个时代的王者。</p>
<p>参考资料：</p>
<ul>
<li>https://x.com/levie/status/2030714592238956960</li>
<li>https://www.imperva.com/resources/resource-library/reports/2025-bad-bot-report</li>
</ul>
<hr />
<p><strong>今日互动吐槽：</strong></p>
<p>你觉得目前市面上，哪个常用产品/SaaS 的 API 设计得最反人类、最让 AI（和你自己）抓狂？</p>
<p>欢迎在评论区疯狂吐槽！</p>
<hr />
<p><strong>认知跃迁：如何抢跑 Agent 原生时代？</strong></p>
<p>理念再宏大，如果不落实到代码上，宏大叙事就只是别人的狂欢。</p>
<p>很多老读者问我：<em>“Tony 老师，道理我都懂，但我该如何从零开始，改造现有系统，设计一套自描述的 MCP 接口？又该如何让 Claude Code 帮我跑通复杂的自动化工作流？”</em></p>
<p>光靠看研报是学不会造轮子的。与其焦虑自己会被 AI 淘汰，不如抢先一步，成为驾驭 AI 的那个人。</p>
<p>在我的全新极客时间专栏 <strong>《<a href="http://gk.link/a/12EPd">AI原生开发工作流实战</a>》</strong> 中，我将摒弃一切虚无缥缈的理论，直接从代码层面，手把手教你构建面向 Agent 的 API 和工具链。</p>
<ul>
<li><strong>告别低效内耗，重塑开发范式</strong>：带你用 AI 抹平代码复杂度的壁垒，专注于业务与架构的本质。</li>
<li><strong>驾驭 AI Agent 工作流</strong>：手把手教你实现从需求分析、MCP 接口设计到代码生成的自动化流水线。</li>
<li><strong>实现职场跃升</strong>：从苦哈哈的“写死代码的搬砖人”，进化为用规则驱动万物互联的<strong>“工作流指挥家”</strong>。</li>
</ul>
<p>别再执着于网页上按钮的颜色了。扫描下方二维码，加入专栏，我们一起去构建万亿硅基生命的世界基石。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/ai-native-dev-workflow-qr.png" alt="" /></p>
<hr />
<p><strong>原「Gopher部落」已重装升级为「Go &amp; AI 精进营」知识星球，快来加入星球，开启你的技术跃迁之旅吧！</strong></p>
<p>我们致力于打造一个高品质的 <strong>Go 语言深度学习</strong> 与 <strong>AI 应用探索</strong> 平台。在这里，你将获得：</p>
<ul>
<li><strong>体系化 Go 核心进阶内容:</strong> 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏，夯实你的 Go 内功。</li>
<li><strong>前沿 Go+AI 实战赋能:</strong> 紧跟时代步伐，学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等，掌握 AI 时代新技能。 </li>
<li><strong>星主 Tony Bai 亲自答疑:</strong> 遇到难题？星主第一时间为你深度解析，扫清学习障碍。</li>
<li><strong>高活跃 Gopher 交流圈:</strong> 与众多优秀 Gopher 分享心得、讨论技术，碰撞思想火花。</li>
<li><strong>独家资源与内容首发:</strong> 技术文章、课程更新、精选资源，第一时间触达。</li>
</ul>
<p>衷心希望「Go &amp; AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚，享受技术精进的快乐！欢迎你的加入！</p>
<p><img src="http://image.tonybai.com/img/tonybai/gopher-and-ai-tribe-zsxq-small-card.jpg" alt="img{512x368}" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/03/12/building-for-trillions-of-agents/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>拉个 JSON 居然要装 5 个第三方库？终于明白 Go 的标准库到底有多“霸道”</title>
		<link>https://tonybai.com/2026/03/11/standard-library-is-part-of-the-go-success/</link>
		<comments>https://tonybai.com/2026/03/11/standard-library-is-part-of-the-go-success/#comments</comments>
		<pubDate>Wed, 11 Mar 2026 00:48:45 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[BatteriesIncluded]]></category>
		<category><![CDATA[CompatibilityGuarantee]]></category>
		<category><![CDATA[CrossPlatform]]></category>
		<category><![CDATA[DecisionFatigue]]></category>
		<category><![CDATA[DependencyHell]]></category>
		<category><![CDATA[EngineeringPhilosophy]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[GoLanguage]]></category>
		<category><![CDATA[Go语言]]></category>
		<category><![CDATA[HighPerformance]]></category>
		<category><![CDATA[JSONParsing]]></category>
		<category><![CDATA[JSON解析]]></category>
		<category><![CDATA[Microservices]]></category>
		<category><![CDATA[NetworkRequests]]></category>
		<category><![CDATA[Nim]]></category>
		<category><![CDATA[ProductionReady]]></category>
		<category><![CDATA[Rust]]></category>
		<category><![CDATA[standardlibrary]]></category>
		<category><![CDATA[SupplyChainSecurity]]></category>
		<category><![CDATA[Unicode]]></category>
		<category><![CDATA[ZeroDependency]]></category>
		<category><![CDATA[供应链安全]]></category>
		<category><![CDATA[依赖地狱]]></category>
		<category><![CDATA[兼容性保证]]></category>
		<category><![CDATA[决策疲劳]]></category>
		<category><![CDATA[工程哲学]]></category>
		<category><![CDATA[开箱即用]]></category>
		<category><![CDATA[微服务]]></category>
		<category><![CDATA[标准库]]></category>
		<category><![CDATA[生产级]]></category>
		<category><![CDATA[网络请求]]></category>
		<category><![CDATA[跨平台]]></category>
		<category><![CDATA[零依赖]]></category>
		<category><![CDATA[高性能]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=6017</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/03/11/standard-library-is-part-of-the-go-success 大家好，我是Tony Bai。 在现代软件开发中，我们似乎已经患上了一种名为“依赖上瘾”的绝症。 新建一个项目，你敲下的第一行命令大概率不是写业务逻辑，而是 npm install、cargo add 或者 pip install。我们潜意识里已经默认：语言本身只提供最基础的砖块，稍微高级一点的功能（比如发起个网络请求、解析个 JSON），都必须去浩如烟海的开源社区里“淘金”。 但这种习以为常的生态繁荣，真的是一件好事吗？ 近日，在 Reddit 的 r/golang 社区，一个题为《标准库是 Go 成功的一部分吗？》的帖子，像一颗深水炸弹，炸出了无数程序员对于“依赖地狱（Dependency Hell）”的疯狂吐槽。 发帖人分享了一个极其真实且让人啼笑皆非的日常小故事： 他想写一个微型应用，目的非常单纯——从家里的太阳能光伏电池 Web 服务器上抓取一个 JSON 文件，解析出来，然后把能源数据显示在屏幕上。 他首先用 Go 语言写了一版。极其丝滑，仅靠自带的标准库就搞定了网络请求和 JSON 解析，编译出一个干干净净的二进制文件，直接跑通。 几天后，他闲来无事，想测试一下其他编译型语言： 他尝试了 D 语言，发现在不依赖第三方库的情况下，D 语言根本无法在三大主流操作系统上顺利完成“下载并解析 JSON”这个基础任务。 他转头去折腾目前红得发紫的 Rust，结果发现，如果不借助 reqwest（处理 HTTP）和 serde（处理 JSON）这两个庞大的第三方 Crates，面对这个简单的需求，他同样寸步难行。 一圈折腾下来，只有 Nim 勉强做到了原生支持。 这个看似不起眼的小实验，无意间撕开了现代软件工程一块遮羞布，也揭示了 Go 语言在后端开发中一个极其“霸道”、却常被新手低估的绝对优势：降维打击般的标准库（Standard Library）。 今天，我们就来深度剖析一下，为什么大量工程师越来越偏爱 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/standard-library-is-part-of-the-go-success-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/03/11/standard-library-is-part-of-the-go-success">本文永久链接</a> &#8211; https://tonybai.com/2026/03/11/standard-library-is-part-of-the-go-success</p>
<p>大家好，我是Tony Bai。</p>
<p>在现代软件开发中，我们似乎已经患上了一种名为“依赖上瘾”的绝症。</p>
<p>新建一个项目，你敲下的第一行命令大概率不是写业务逻辑，而是 npm install、cargo add 或者 pip install。我们潜意识里已经默认：语言本身只提供最基础的砖块，稍微高级一点的功能（比如发起个网络请求、解析个 JSON），都必须去浩如烟海的开源社区里“淘金”。</p>
<p><strong>但这种习以为常的生态繁荣，真的是一件好事吗？</strong></p>
<p>近日，在 Reddit 的 r/golang 社区，一个题为《<a href="https://www.reddit.com/r/golang/comments/1rkfmnj/standard_library_part_of_the_go_success/">标准库是 Go 成功的一部分吗？</a>》的帖子，像一颗深水炸弹，炸出了无数程序员对于“依赖地狱（Dependency Hell）”的疯狂吐槽。</p>
<p>发帖人分享了一个极其真实且让人啼笑皆非的日常小故事：</p>
<p>他想写一个微型应用，目的非常单纯——从家里的太阳能光伏电池 Web 服务器上抓取一个 JSON 文件，解析出来，然后把能源数据显示在屏幕上。</p>
<p>他首先用 Go 语言写了一版。极其丝滑，仅靠自带的标准库就搞定了网络请求和 JSON 解析，编译出一个干干净净的二进制文件，直接跑通。</p>
<p>几天后，他闲来无事，想测试一下其他编译型语言：</p>
<ul>
<li>他尝试了 <strong>D 语言</strong>，发现在不依赖第三方库的情况下，D 语言根本无法在三大主流操作系统上顺利完成“下载并解析 JSON”这个基础任务。</li>
<li>他转头去折腾目前红得发紫的 <strong>Rust</strong>，结果发现，如果不借助 reqwest（处理 HTTP）和 serde（处理 JSON）这两个庞大的第三方 Crates，面对这个简单的需求，他同样寸步难行。</li>
<li>一圈折腾下来，只有 Nim 勉强做到了原生支持。</li>
</ul>
<p>这个看似不起眼的小实验，无意间撕开了现代软件工程一块遮羞布，也揭示了 Go 语言在后端开发中一个极其“霸道”、却常被新手低估的绝对优势：<strong>降维打击般的标准库（Standard Library）。</strong></p>
<p>今天，我们就来深度剖析一下，为什么大量工程师越来越偏爱 Go 这种“零依赖”的极简哲学。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/agentic-software-engineering-qr.png" alt="" /></p>
<h2>你以为你在写代码，其实你在做“库的选品”</h2>
<p>在很多主打“生态繁荣”的编程语言中，标准库被视为一种“最小公集”。语言的设计者把高级特性推给社区，美其名曰“保持语言的核心轻量”。</p>
<p>这听起来很美好，但在实际的商业工程中，它带来了一个极其消耗心智的隐性成本：<strong>决策疲劳（Decision Fatigue）</strong>。</p>
<p>想象一下，当你用 Node.js 或者 Rust 仅仅需要发起一个异步 HTTP 请求时，你需要经历怎样痛苦的内心戏？</p>
<ol>
<li>打开包管理网站，搜索 “http client”。</li>
<li>面对排名前 5 的主流库，你开始像个电商买手一样比对：A 库的 Star 数最高但半年没更新了；B 库的 API 最优雅但是性能测试差点意思；C 库支持最新的异步模型但文档写得像天书。</li>
<li>你甚至还要去翻看它们的 GitHub Issues，看看有没有致命的内存泄漏。</li>
<li>纠结了一下午，终于选定了一个库，引入依赖，然后开始痛苦地学习它那套独创的 API 调用法则。</li>
</ol>
<p><img src="https://tonybai.com/wp-content/uploads/2026/standard-library-is-part-of-the-go-success-3.png" alt="" /></p>
<p>而在 Go 中，这一切内耗根本不存在。</p>
<p>正如 Reddit 帖子评论区一位资深 Gopher 一针见血指出的：</p>
<blockquote>
<p>“Go 的成功不仅在于它轻量、简单、易学，还在于它自带了一个庞大且极其优秀的标准库。因此，在开始处理每个微小的子任务之前，你不需要去评估一堆第三方库。”</p>
</blockquote>
<p>Go 的哲学是“开箱即用”。net/http 就在那里，encoding/json(以及json/v2) 就在那里。它直接消灭了你在技术选型上的无意义内耗，让你可以把 100% 的脑力，全部砸在能给公司赚钱的业务逻辑上。</p>
<h2>不是所有的标准库，都敢叫“生产级”</h2>
<p>看到这里，Python 开发者可能会不服气：“Python 也有非常丰富的标准库啊，我们叫 Batteries included（自带电池）！”</p>
<p>没错，Python 的标准库确实庞大，但问题在于：<strong>它好用吗？它能直接扛高并发吗？</strong></p>
<p>Python 自带的 urllib API 设计得极其反人类，导致全网的 Python 教程都在教你第一时间去 pip install requests。</p>
<p>如果你提供的标准库只是一个“能跑就行”的玩具，开发者迟早还是要逃向第三方库的怀抱。其他语言的标准库，大多只敢称自己是“开发级（Dev-level）”的替代品。</p>
<p>但 Go 的标准库，是真正意义上的“生产级（Production-ready）”。</p>
<p>以 Go 的 net/http 为例。它不仅仅是能发个请求那么简单，它底层直接内置了工业级的连接池、自动支持 HTTP/2、拥有极其精细的超时控制，并且在骨子里完美契合了 Go 的 Goroutine 并发模型。</p>
<p>在这个世界上，有无数估值数十亿美元的独角兽公司，他们的高并发微服务底层，<strong>没有套 Nginx，没有套 Tomcat 或 Gunicorn，而是直接裸跑在 Go 标准库的 net/http.Server 之上！</strong> 这在其他语言的生态里，简直是不可想象的。</p>
<p>同样，Go 的 crypto 包也不是随便拼凑的开源算法，它是由谷歌著名的密码学家亲自操刀设计和维护的。它被全球安全界公认为是业界最安全、最难被开发者“误用”的密码学实现之一。</p>
<h2>每一次引入第三方库，都是在给系统埋雷</h2>
<p>在现代软件工程中，有一句极其沉重的话：<strong>“依赖即债务”</strong>。</p>
<p>你想要一个香蕉，但开源社区给你的是一只拿着香蕉的大猩猩，以及大猩猩背后的一整片热带雨林。你敲下的每一个 npm install，都在把公司的核心系统暴露给未知的风险。</p>
<p>前几年的 Java Log4j 史诗级漏洞事件，以及三天两头上头条的 NPM 恶意投毒、删库跑路事件（比如著名的 left-pad 事件），给全行业上了血淋淋的一课。当你引入一个计算日期的第三方包时，它可能又间接依赖了 50 个你闻所未闻的子依赖，其中哪怕有一个包的作者被黑客盗了号，你的服务器底裤就被看穿了。</p>
<p>发帖的楼主深刻地探讨了这一点：</p>
<blockquote>
<p>“保持项目没有外部依赖，让维护变得更加容易。开发者经常忘记，向项目中添加一个依赖，就增加了一份审查恶意代码的责任。”</p>
</blockquote>
<p>Go 强大的标准库，为你提供了一道天然的“供应链安全护城河”。</p>
<p>像前面提到的“拉取光伏面板 JSON 并解析”这样的任务，在 Go 中是零外部依赖的。</p>
<p>零外部依赖，就意味着零第三方供应链风险。这种“自给自足”的底气，在如今极度苛求数据安全、合规性审计的企业级开发中，绝对是降维打击般的加分项。</p>
<h2>被忽视的跨平台与 Unicode 魔法</h2>
<p>除了宏观的网络和并发处理，Go 的标准库在极其底层、却又极其折磨人的领域，展现出了极其深厚的内功。</p>
<p>熟悉 C/C++ 的老兵一定懂得，在底层处理多语言编码（locales）和宽字符（wide chars）是一场怎样的噩梦。而 Go 的标准库原生且完美地接纳了 UTF-8。从 strings 包到 unicode/utf8，再到字符串底层极其优雅的字节切片（Byte Slice）设计，让多语言文本处理变得如同呼吸一般自然。</p>
<p>更不用提 Go 那近乎魔法的<strong>跨平台交叉编译</strong>。</p>
<p>Go 的标准库（如 os、path/filepath）对底层操作系统的 API 差异进行了极致的抽象。作为开发者，你可以在一台舒舒服服的 Mac 上写代码，只需加一个环境变量 GOOS=linux，就能瞬间利用标准库编译出一个毫无平台依赖的静态二进制文件，直接扔到 Ubuntu 服务器上完美运行。</p>
<p>这种抽象能力，让一切第三方跨平台打包工具都显得极其多余。</p>
<h2>Go 1 的承诺，十年前的代码今天依然能跑</h2>
<p>最后，Go 的标准库之所以被几百万开发者绝对信任，离不开 Go 团队当年立下的一个近乎严苛的誓言：<strong>Go 1 兼容性保证（Go 1 Compatibility Guarantee）</strong>。</p>
<p>这意味着什么？这意味着你在 2012 年基于 Go 1.0 标准库写下的一段处理 HTTP 的代码，在今天最新的 Go 1.26 编译器下，不仅能一字不改地编译通过，而且运行行为保持绝对一致！</p>
<p>在任何其他语言的开源生态中，很多曾经辉煌一时的第三方霸主库，都会因为作者的精力衰退、兴趣转移或资金断裂，最终走向被废弃（Deprecated）的命运。当你依赖的库停止维护时，你的整个项目组都要被迫进行痛苦的代码大重构。</p>
<p>开源世界充满了不确定性，而 Go 的标准库，背后站着的是谷歌顶级的工程团队，拥有与这门语言同等漫长的寿命周期。</p>
<p>这种确定性的安全感，是任何高星的第三方库都无法给予你的。</p>
<h2>写在最后：最好的工具，就是让你感受不到它的存在</h2>
<p><img src="https://tonybai.com/wp-content/uploads/2026/standard-library-is-part-of-the-go-success-2.png" alt="" /></p>
<p>我们常说，Go 是一门为<strong>“大规模软件工程”</strong>而生的语言。</p>
<p>这种工程基因，不仅仅体现在它的极速编译和极简语法上，更深深地烙印在它那套“霸道”的标准库里。</p>
<p>它逼着你放下对“奇技淫巧”的追求，逼着你放弃花里胡哨的第三方依赖，回归到用最稳固的基石，构建最健壮的系统的正道上来。</p>
<p>当然，Go 的标准库并不完美，比如<a href="https://tonybai.com/2026/03/01/goodbye-google-uuid-go-standard-library-crypto-uuid">千呼万唤始出来的官方 UUID 至今仍让社区望眼欲穿</a>。但在构建现代云原生应用、微服务 API 和数据网关时，它依然交出了一份近乎满分的答卷。</p>
<p>它告诉了所有高级架构师一个硬道理：<strong>最好的工具，是让你感受不到工具存在的工具；最强大的库，是让你根本不用去寻找库的库。</strong></p>
<hr />
<p><strong>今日互动吐槽</strong></p>
<p>你在平时的开发中，被哪个第三方库（依赖地狱）狠狠坑过？或者你觉得 Go 的标准库里，现在最缺哪个核心功能？</p>
<p>欢迎在评论区开喷吐槽！</p>
<hr />
<p><strong>认知跃迁：读懂底层骨架，才能驾驭“降维打击”</strong></p>
<p>很多写了几年 CRUD 的朋友问我：<em>“Tony 老师，既然 Go 的标准库这么牛，那我只要背熟标准库的 API 是不是就能进大厂了？”</em></p>
<p>大错特错。会调 API 只是技工，看懂底层设计才是架构师。</p>
<p>Go 语言“少即是多”的工程美学，其精髓并不在于它提供了什么函数，而在于它是如何用极简的代码，实现千万级并发与跨平台抽象的。比如 net/http 背后那精妙的 Goroutine 调度模型，比如 context 是如何控制全局超时的。</p>
<p>如果你渴望突破技术瓶颈，不再满足于做一个“只会调包的熟练工”，而是想从骨子里吃透 Go 的系统级设计思维——</p>
<p>我的全新极客时间专栏 《<a href="http://gk.link/a/12yGY">Go语言进阶课</a>》正是为你量身打造。</p>
<p>在这 30+ 讲硬核内容中，我将带你剥开语法糖，深入标准库与并发模型的底层骨架，锻造你编写高可用、生产级微服务的顶级工程实践能力。</p>
<p>目标只有一个：助你完成从“Go 熟练工”到“能做架构决策的 Go 专家”的蜕变！</p>
<p>扫描下方二维码，加入专栏，让我们一起深挖这门语言背后的“降维打击”之力。</p>
<p><img src="https://tonybai.com/wp-content/uploads/course-card/go-advanced-course-4.png" alt="" /></p>
<hr />
<p>还在为“复制粘贴喂AI”而烦恼？我的新专栏 <strong>《<a href="http://gk.link/a/12EPd">AI原生开发工作流实战</a>》</strong> 将带你：</p>
<ul>
<li>告别低效，重塑开发范式</li>
<li>驾驭AI Agent(Claude Code)，实现工作流自动化</li>
<li>从“AI使用者”进化为规范驱动开发的“工作流指挥家”</li>
</ul>
<p>扫描下方二维码，开启你的AI原生开发之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/ai-native-dev-workflow-qr.png" alt="" /></p>
<hr />
<p><strong>原「Gopher部落」已重装升级为「Go &amp; AI 精进营」知识星球，快来加入星球，开启你的技术跃迁之旅吧！</strong></p>
<p>我们致力于打造一个高品质的 <strong>Go 语言深度学习</strong> 与 <strong>AI 应用探索</strong> 平台。在这里，你将获得：</p>
<ul>
<li><strong>体系化 Go 核心进阶内容:</strong> 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏，夯实你的 Go 内功。</li>
<li><strong>前沿 Go+AI 实战赋能:</strong> 紧跟时代步伐，学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等，掌握 AI 时代新技能。 </li>
<li><strong>星主 Tony Bai 亲自答疑:</strong> 遇到难题？星主第一时间为你深度解析，扫清学习障碍。</li>
<li><strong>高活跃 Gopher 交流圈:</strong> 与众多优秀 Gopher 分享心得、讨论技术，碰撞思想火花。</li>
<li><strong>独家资源与内容首发:</strong> 技术文章、课程更新、精选资源，第一时间触达。</li>
</ul>
<p>衷心希望「Go &amp; AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚，享受技术精进的快乐！欢迎你的加入！</p>
<p><img src="http://image.tonybai.com/img/tonybai/gopher-and-ai-tribe-zsxq-small-card.jpg" alt="img{512x368}" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/03/11/standard-library-is-part-of-the-go-success/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
