惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threatpost
WordPress大学
WordPress大学
Martin Fowler
Martin Fowler
博客园 - 聂微东
L
LangChain Blog
D
Docker
大猫的无限游戏
大猫的无限游戏
人人都是产品经理
人人都是产品经理
D
DataBreaches.Net
aimingoo的专栏
aimingoo的专栏
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
腾讯CDC
C
Cisco Blogs
L
LINUX DO - 热门话题
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
有赞技术团队
有赞技术团队
Forbes - Security
Forbes - Security
C
Cybersecurity and Infrastructure Security Agency CISA
博客园 - 三生石上(FineUI控件)
S
Secure Thoughts
N
News and Events Feed by Topic
Latest news
Latest news
PCI Perspectives
PCI Perspectives
TaoSecurity Blog
TaoSecurity Blog
博客园 - 司徒正美
量子位
Stack Overflow Blog
Stack Overflow Blog
Know Your Adversary
Know Your Adversary
SecWiki News
SecWiki News
美团技术团队
C
CERT Recently Published Vulnerability Notes
Attack and Defense Labs
Attack and Defense Labs
AWS News Blog
AWS News Blog
C
Check Point Blog
S
Security Affairs
Vercel News
Vercel News
Google DeepMind News
Google DeepMind News
K
Kaspersky official blog
IT之家
IT之家
A
About on SuperTechFans
Help Net Security
Help Net Security
博客园 - 【当耐特】
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Recorded Future
Recorded Future
月光博客
月光博客
博客园_首页
小众软件
小众软件
H
Help Net Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解 【002】HTTPS 粗解:证书、TLS 握手与对后端配置的影响 Hermes Agent 一周暴涨五万 Star,但我劝你别急着追 明明连接的是Redis的DB0,为什么能查到DB3的数据? 【从0到1构建一个ClaudeAgent】协作-Agent团队 熟悉电子元器件之后,电子小白下一步该怎么走? MAF快速入门(23)通过C#类定义Skills .NET 高级开发 | 手写一个对象映射框架 FastAPI数据库ORM怎么选?我肝了三个Demo后,终于不再纠结了 mysqldump 参数拾遗:在遗忘与铭记之间 C# .NET 周刊|2026年3月5期 Claude code入门 - 陈彦斌 一文学习入门 ThingsBoard 开源物联网平台 GitHub 热门项目 | 2026年04月16日 如何为GIT设置全局勾子,为每次提交追加信息 Number.isFinite和isFinite与isNaN()和Number.isNaN的区别 PortSwigger SQL注入LAB2 推荐一个测试人必备的Skills,从功能到性能全搞定(附详细实操和安装下载方式) 筑基期:掌握Odoo基础核心知识点02(Odoo XML 开发方式详解) GLM模型这么火,咱们用vllm也咧一个呗! 深入理解 AbortController:从底层原理到跨语言设计哲学 字符串学习笔记 多租户系统框架的基础模块设计和分析设计 Apache SeaTunnel Zeta 为什么能做到“又快又稳”? AI开发-python-LangGraph框架(3-26-LangGraph基本概念及第一个简单样例) Vue 3 组件通信,别只会用 Props 和 Emits 了,这几个狠活儿你得看看 ElasticSearch7.X版本配置密码 用Manim实现动态交点计算--从一个动点问题说起 团结引擎+Addressable+Instant Game打包抖音小游戏 function call 实战:让 LLM 自动判断 pod 异常、调用日志工具并完成故障分析 bubseek —— 让 Agent 的足迹,变成团队的洞察 通过 C# 读取并导出 PDF 书签 如何用 GitHub Actions 实现 Steam 自动化发布 【从0到1构建一个ClaudeAgent】并发-后台任务 .NET 高级开发 | 定制 ASP.NET Core 框架 电子小白:什么是运算放大器(运放) zero2Agent:面向大厂面试的 Agent 工程教程,从概念到生产的完整学习路线 堆上的ORW HC32F460 USB CDC通信异常:非对齐访问异常排查 20260413-Hyperbridge 攻击事件:发生在默克尔山上的验证绕过 那些喊着AI 要淘汰你的人,正在靠你的焦虑赚大钱! 深度学习进阶(八)Swin Transformer 最小二乘问题详解19:带先验约束的增量式SFM优化与实现 SnapTranslate 3.0 正式发布:全局划词翻译 + 完整英语学习闭环,一站式搞定查词、记词、复习 工作的意义、工作的困难认知再思考 .NET + AI 进阶实战:基于类的技能开发 - 打造可治理的 Agent 能力模块 【从0到1构建一个ClaudeAgent】规划与协调-技能 上周热点回顾(4.6-4.12) 电子小白的工具三件套:面包板、杜邦线、万能板 单表五亿数据的查询优化 | Mysql、StarRocks 2. WorkBuddy:从“我是谁”到“帮我干活” C# 如何减少代码运行时间:7 个实战技巧 基于HelixToolkit.SharpDX 渲染3D模型 - 笺上知微 从零开始的双臂具身VLA起源及现阶段发展综述 - SkyXZ 记对 xonsh shell 的使用, 脚本编写, 迁移及调优 - pluvium27 受够了Vibe Coding的失控?换个起点,让AI事半功倍 从开始配置漏洞环境到漏洞复现流程 - 難しい 关于10年工作经验的程序员对OpenClaw的实战经验分享以及看法 - 虚无境 Any metadata 的内存布局 C# .NET 周刊|2026年3月2期 - InCerry 我帮你测过了,测试圈排名第二的 Skill 依然很牛逼 Skill Discovery | 无监督技能发现的经典工作总结 - MoonOut 上下文工程是什么?过时了么?一文讲明白! - 一枫说码 开了 TUN 模式还是直连?90% 的人都踩过这个坑 AScript扩展多种脚本语言 - rockey627 AI 学习笔记:Agent 的记忆机制 你能被装进一个文件里吗?——7 万人把同事"蒸馏"成了 AI - 我没有三颗心脏 Claude Code 通关手册(七):给 AI 装上技能包——Skills 完全指南 - 暮色之狐 在浏览器中快速编辑代码:VSCode Web 集成实践 - Newbe36524 蒸馏自己 skill?基于 Deepseek 的蒸馏器,丐版蒸馏方式,简单便捷 - To_Carpe_Diem Spring AI Aliababa和AgentScope,哪个更好? - 苏三说技术
别让AI再从零写一堆优美的屎山了
海滨code · 2026-05-20 · via 博客园_首页

别让AI再从零写一堆优美的屎山了

被 AI 代码山压住的程序员 vs 手握成熟模块基石

TL;DR:AI 一次任务能写出 8000 行重复代码不是段子,是真实事故。本文从 hbcore(10 年、26 模块、10 万行 C++)实战经验出发,给出三条不依赖任何工具的工程纪律——古法打底 / 粒度即生死 / 写薄胶水,外加最后一节聊聊我做的小工具 GufaForge 怎么把这三条编进流程。


一、为什么 AI 写的越多,反而越乱

有时候 AI 能在一次任务里写出 8000 多行重复代码。听起来像段子,是我前几天亲身遇到的——让 Codex 重构一块视频输入源接入层,它给四类来源(本地设备采集、IPC 摄像头、ONVIF、GB28181)各自实现了一套解码器和缓冲队列。后面会详细讲这事故是怎么发生的。

问题是这种事远远不止一次。稍微用过 AI 编程一段时间的人,大概都有过同样的感觉:它不知道我们的代码库长什么样、不知道项目里已经有哪些成熟模块、不知道团队约定的命名规则。它每次都从训练样本出发,把"最常见的写法"套进来——但每个项目里最常见的写法,恰恰是它没见过的那一份。

更要命的一点是:AI 写得越多,这种偏移就放大得越厉害。生成几千行只要几分钟,但要理解、审完、合并这几千行,常常是好几天起步——而且代码库越大、协议越多、上下文越复杂,这个比例就恶化得越快。

8000 行只是单次事故,更普遍的体感是:加了 AI 之后整个项目反而越来越没人能改。每个文件单看都很专业,整体却像一座优美的屎山。真问题不是 AI 能力不够,而是缺约束的生成 = 优美屎山

那约束从哪来?是工具吗?后面会讲到 GufaForge,但坦白说工具只是把人本来就该做的事自动化——真正管得住 AI 的,是工程纪律本身。

下面是我在 hbcore(10 年、26 模块、10 万行 C++)和 GufaForge 实战里反复验证出来的三条。


二、古法打底:别让 AI 重新发明你已有的轮子

先讲一个尴尬事实:hbcore 这个我维护快 10 年的 C++ 流媒体技术栈,26 个模块、10 万行代码,覆盖从设备采集到服务端推流的全链路。听上去挺像样,但去年我用 repo-scan 做过一次全量交叉审计,结果让我自己都吓了一跳:

能力域 重复实现数量
H.264 NAL 解析 3 份独立实现(base / record_play / rtsp_server)
FAAC 音频编码 3 份独立实现
位流读写 4 份(base 3 套 + mp4_parser 1 套)
YUV 色彩转换 / x264 编码 / 缓冲区管理 / Base64 各 2 份

七个能力域全部有重复。光是 base 基础库,在整个代码库里被复制粘贴了 30+ 份

连我自己写代码都在重复造轮子——AI 来了只会更严重。它看不到其他模块里有什么,每次都从零写一份新的。如果不主动告诉 Claude Code"你应该用 base 模块的 h264_frame_parser",它会非常勤快地给我写第 31 份。

后来我做过一次实测对照:同一个"文件批量处理子系统"需求(支持并发、错误重试、进度回调),分别用两种方式让 AI 写。具体数字我没精确统计,大致是这个量级——

起点 业务代码量 幻觉 API 我审完合并的时间
让 AI 从零写 ~1800 行 几处虚构(印象最深的是 ConcurrentPool.batch_submit_async(),根本没这函数) 大半天
先把现成的并发池/重试装饰器/日志模块清单喂进去再写 ~400 行 没遇到 半小时

差四五倍的代码量、几乎没碰到幻觉、合并时间从大半天压到半小时——不是因为 AI 这次更聪明,而是因为它没机会去发挥。

古法基石 + AI 胶水:5 个成熟模块在底层,AI 只补薄薄一层胶水

这条原则真正落地比看上去费劲。AI 经常"礼貌地无视"你提供的现成模块——它读了,但生成时还是按训练里见过最多的 pattern 写。所以 prompt 里得强制约束:"使用 X 模块的 Y 接口,禁止重新实现"。光说"我有这个模块"不够。

另一件容易忽视的事:现成模块的接口契约(输入/输出/错误码/调用顺序)必须显式描述出来——AI 看不到 .h 文件背后的隐含约定,写过 5 年的常识对它来说是空白。


三、粒度即生死:规划归人,执行归 AI

回到开头那个 8000 行重复代码的事故。

任务我交代得挺清楚:"把本地设备采集、IPC 摄像头、ONVIF、GB28181 四类视频输入源的解码和缓冲管理收敛成一个共享层"——一句话,但里面其实有"判断哪些可以共享、哪些得保留差异"的隐含规划工作。Codex 接到任务后没问就开干,跑了一轮回来,我打开 diff 一看——它给四类输入源各自写了一套解码器、各自一个缓冲队列、各自一份帧时间戳处理逻辑,而且四份实现的接口风格还都不一样。

这是把规划和执行一起塞给它的典型后果。中段开始 lost in the middle,方向偏移、上下文污染——产出的代码单看还算专业,跟最初要"收敛成共享层"的描述已经走反了。

把同样的任务切成 5 到 15 分钟一轮的小粒度,每轮人审一次,AI 不再决策架构、只做执行——这一改,翻车率几乎归零。

长任务 vs 分粒度循环:AI 注意力衰减 vs 稳定节奏

这里有两个边界,划在哪儿决定翻不翻车。一个是规划与执行必须分离——人决定"做什么"和"怎么拆",AI 只决定"具体写什么代码"。规划这件事 AI 现在还做不好,也许过几代会变,但今天硬让它做就是要 lost in the middle。另一个是每轮 50 到 200 行 diff 的上限,超过就该拆。10 个文件混着改的时候,已经看不出哪一行有问题了。

还有几个反复踩到的小坑:

  • AI 会主动问"要不要顺便把 X 也改了"——99% 的情况应该说不。
  • "继续"这个词是糖衣陷阱——多数情况下应该停下来重新规划。
  • "上下文窗口够大就一次性丢全部"这个诱惑也得警惕——窗口够大不等于注意力分布均匀,长上下文里中段位置的信息几乎会被忽略。

四、胶水代码要尽量写薄:不要追求完美抽象

我现在删 AI 写的代码,比让它新写还多。

光是 hbcore 最近一个月的重构,git 统计下来累计删了 5.8 万多行——清单里排在前面的是一批"看起来很专业、其实没怎么用过"的中间层:几个用了一年也没复用过的接口塔、只有一个实现的 Adapter、连过总线的事件类型都没几个的 Observer。删完之后,业务代码读起来反而顺了。

一开始以为是 AI 能力不够,后来才发现是我让它去做了它不该做的事——一上来就抽象。

让 AI 写一个"小工具",它给你一套 IoC 容器、工厂模式、Observer 总线、Adapter 层的"企业级"架构。看到那一刻的惊艳能撑半天,第二天打开来改的时候就开始头疼:没人记得每层为什么存在,删起来比当初写还慢。

我现在的做法是先写最薄的胶水层——直接调用、最少封装。等同样的逻辑真正出现第 3 次再抽象。这就是工程经验里的 rule of three:3 次出现才抽象,2 次的硬编码就硬编码。

薄胶水 vs 完美抽象:3 行胶水今天能跑 vs 抽象塔 3 个月后没人能改

这条原则成本结构很扭曲:AI 写抽象的成本是 0,删抽象的成本是无穷大。它一句话生成 200 行接口塔,要删的时候得先理解每一层为什么存在。所以一开始就要拒绝"看起来很专业"的设计模式——一个还没复用过的接口、一个只有一个实现的工厂,本质上都是为未来的不确定性付的预付款,而未来 90% 不会兑现。

养成每周 review 一次"哪些抽象其实没用"的习惯,删代码比新增代码更重要。AI 在 review 阶段经常舍不得自己之前写的抽象,需要强制下令"删掉"——它的偏差是保留,开发者的偏差应该是删除。


五、从原则到工具:GufaForge 是怎么把这三条编进流程的

GufaForge 扫描分析界面:自动产出的古法清单

三条原则我自己都同意,难的是每次都要从头复述。每次让 AI 干活前,都得重新解释一遍"我已有什么、什么不能重写、粒度该多大"。这件事我手动做了大半年,受够了,于是有了 GufaForge。

它做的事很直接:扫描代码库 → 自动产出"成熟模块清单 + 接口契约" → 自动生成 prompt 前缀,一次性附在每次让 AI 干活的最前面。再加一条强制约束:"必须使用清单里的模块 X,禁止重新实现"。

hbcore 50 多个子项目用下来,我没做精确统计,但有一点直观感受——不带古法清单时,AI 重新发明轮子是常态,本文开头那 8000 行重复代码就是典型;加上之后,大部分新需求都能落到"复用 + 薄胶水"上,重复造轮子从默认状态变成了稀有事件。

GufaForge 工作流:扫描 → 古法清单 → prompt 前缀 → AI 执行

不一定要装 GufaForge——今天就把最熟的 3 到 5 个模块整理成一份"古法清单"(每个模块 50 字接口说明 + 一句"什么时候必须用"),下次让 AI 干活前先粘进 prompt 顶部,立刻见效。如果想要工具自动化的版本:[GufaForge GitHub 链接 — 待回填],pip 安装一行。

也欢迎在评论区或公众号留言,把你自己的"古法清单"长什么样发过来。我会精选几份做下一篇拆解。


作者:海滨code | 公众号:海滨code | GitHub:@haibindev | 个人主页
WX:hbstream