AI Coding 能力边界探索

2026-01-17

最近一段时间,我写代码的时候,几乎都会顺手开着一两个 coding agent。

有时候是在跑一个 demo,有时候是直接丢给它一个完整仓库,让它慢慢改。我自己在旁边干别的事情,隔一会儿切回来看看它现在在干嘛。久而久之,这事儿就有点像是在观察一个不太聪明、但手速很快、而且永远不嫌加班的同事。

慢慢地,我开始不太满足于“哇,这也能写”,而是开始问一个更工程化的问题:

现在这个阶段,AI 写代码的能力边界到底在哪里?

我不是想讨论那种“AI 会不会取代程序员”的宏大命题,那种话题太空了。对我来说,更重要的是一些非常具体的问题:

这个任务,我能不能把它交给 AI?
如果不能,是哪一步开始搞不定的,为什么?

下面这些例子,都是我这段时间真实跑过的。有成功得让我吃惊的,也有失败得让我意识到“哦,原来边界在这里”。


一个几乎满分的例子:C++ 服务器整体转 C

先说一个让我非常震惊的成功案例。

任务本身不复杂,代码量也不大:把一个用 C++ 写的网络服务器 demo,完整改写成 纯 C 语言实现

原项目是这个:
https://github.com/yuesong-feng/30dayMakeCppServer

用的工具和模型是 kiro + opus 4.5,需求描述其实也很简单:

保留原有行为,把 C++ 的实现完整改成 C

然后我就基本没管它了。过了一会儿切回来看,发现事情已经做完了。更关键的是:不是那种“看起来差不多”,而是真的能用。

具体表现包括:

  • C++ 的 class 被完整拆成了 struct + 一组函数
  • 构造 / 析构逻辑被显式地翻成 init / free
  • socket、epoll、事件循环这些地方完全没乱
  • 没有偷偷混进 C++ 语法
  • 代码风格甚至还挺干净

我把代码拉下来直接编译,一把过。最终的结果在这里:
https://github.com/tiancaiamao/tcp_server/tree/main/src

这件事对我的冲击其实挺大的,因为它几乎是 0 人工干预。我只是定义了边界,它就把整个体力活干完了。这类任务我给 98 分,一点不夸张。

后来冷静想了一下,其实也能理解它为什么能干得这么好:

  • 网络服务器是非常高频的编程模式
  • 有完整、清晰的参考实现
  • 目标语言(C)和源语言(C++)都极其成熟
  • 项目规模不大,但结构完整

在这种条件下,AI 更像是一个极其熟练的“代码搬运 + 重构机器”。


IDE 里的代码补全:已经是基础设施了

这一类能力大家每天都在用,但已经不太会特意讨论了。

比如:

  • 写到一半的函数补全
  • for / if / error handling 的模板
  • 常见 API 的调用方式

VS Code、Zed 这些编辑器现在基本都自带 AI 功能。

对于补全这种场景,用户的心理预期本身就很低:

对了就 tab,不对就当没看见

所以模型只要别太离谱,体验就已经不错了。copilot-nano 之类的小模型,在这里都完全够用。90 分起步。


中等复杂度,但反馈完整:ad 编辑器的两个例子

接下来是我觉得非常有代表性的一类任务

不只是补全,而是需要读项目、理解上下文、再改代码

我现在的主力编辑器,是我 fork 之后一直在用的这个项目:
https://github.com/sminez/ad

它不算成熟,时不时会冒出一些问题。好几次我干脆让 AI 直接参与真实开发。

例子一:实现一个小功能

ad 的键位设计更偏 Kakoune,而不是 vim。我平时是重度 vim 用户,所以有些地方用得非常别扭。

其中一个点就是屏幕滚动。在 vim 里有 ctrl-f / ctrl-b / ctrl-d / ctrl-u / ctrl-e 这一套,而 ad 里没有完全对齐。

下面这个 commit,基本就是 AI 直接完成的:
https://github.com/tiancaiamao/ad/commit/8332b513b7ce2c19b86efca8b581de850875b7dd

它需要做的事情其实不少:

  • 理解 ad 这个编辑器的整体结构
  • 搞清楚 buffer / window / view 之间的关系
  • 在现有设计约束下改代码,而不是随便 patch

这已经明显超过“写几行代码”了,但 AI 还是能完成。原因其实也很直接:

  • 用的是成熟语言(Rust)
  • 能直接编译
  • 能运行
  • 行为是不是对的,可以立刻验证

例子二:帮忙修 bug + resolve review comment

另一个我觉得更有意思的例子,是这个 PR:
https://github.com/sminez/ad/pull/173

背景是这样的:

  • 我自己先提了一个非常小的修复(基本就是一行代码)
  • 作者 review 之后指出:实现思路不太对

于是我干脆把整个 PR 链接丢给 AI,让它:

  • 抓 PR 页面
  • 读评论里的讨论
  • 理解 reviewer 真正想要的行为
  • 再回到代码里修

结果是:它真的能做

不是一次就完美,但在几轮修改之后,它给出的方案是合理的,而且明显是“对着 review 意图来的”,不是瞎改。

我依然会自己过一遍代码,但它已经帮我省掉了大量“理解上下文 + 尝试实现”的时间。


开始失败的地方:小众语言 + 相对复杂的功能

让我真正意识到能力“边界”的,是我自己的编程语言项目 cora:
https://github.com/tiancaiamao/cora

这是一个 Lisp 方言,很多基础设施都是我自己写的。

前段时间我在博客里写了一篇文章,讨论接下来要怎么实现多核并发模型:
/cora-multicore-support-2.md

于是我尝试了一件现在看来有点天真的事情:

  • 把那篇博客描述丢给 AI
  • 把代码仓库也丢给 AI
  • 要求它按照博客里的设计,把并发框架实现出来

一开始,一切看起来都还不错。

它能理解博客在讲什么,也能照着改代码,甚至改出来的代码乍一看好像那么回事

但很快问题就暴露出来了。cora 这种小众东西,实在太不成熟:

  • 没有调试器
  • 报错信息非常原始
  • 有些错误可能直接卡死,而不是返回错误
  • 出了问题,很多时候只能靠我自己在脑子里跑

这些东西,AI 完全接不上。

它习惯的工作方式是:

写代码 → 编译 → 看报错 → 再改

而在 cora 这里,这条反馈链路当前是断的。它不知道该怎么定位问题,于是只能不停地产生看起来合理、但根本没法工作的代码,然后反过来向用户要更多描述。


另一个失败案例:跨 TiDB / client-go / TiKV 的小 PR

还有一个失败得非常典型的例子,是工作里的这个 TiKV PR:
https://github.com/tikv/tikv/pull/19166

这个例子有意思的地方在于:问题并不复杂。

逻辑上只是协议层有变化,需要从 TiDB → client-go → TiKV,从上到下把相关的地方都改一点点。

但 AI 在这里的表现是:

  • 能看懂“局部”
  • 能改某一个 repo 里的某一段
  • 但对整个链路的语义负责起来就比较困难

你让它在单个仓库里修一个点,它是能修的;
但你让它理解「为什么上游这么设计,下游必须那样实现」,它就开始搞不定了。


一个几乎不可能的任务:大型开源游戏

我还试过把一个大型开源游戏项目直接丢给 AI:
https://github.com/opendarkeden/client

这是一个几十年前的 MMORPG,代码量是百万行级别,依赖关系极其混乱,编译环境是 Windows + DirectX + VC6。

这种项目,如果没有 AI,我以前连想都不敢想。因为保守估计都是全职一年起步的工作量。

有了 AI 之后,情况发生了一点变化。反正烧的是 token,而不是我自己的时间,心理负担小很多。

第一次尝试:从边缘做 demo

我一开始的策略很保守:

  • 让 AI 从资源解析开始
  • 比如动画、地图格式
  • 用 SDL 渲染出来
  • 做一个小 demo,让角色能在地图上走

到这一步为止,一切都非常顺利,AI 做得也很漂亮。

接着我让它开始动 UI 相关的代码,重写、移植用到的库,也还能跑 demo。

但一旦进入「真实整合原始素材 + 还原原始执行逻辑」这一步,就开始不行了。

这个项目的依赖写得非常糟糕:

  • 抽象层不完整
  • 上层代码直接引用 DirectDraw API
  • 本来应该层层封装的地方,全都糊在一起

AI 很快就卡住了。它会试图 stub 掉一些东西来完成我描述的任务,但一旦不 stub,原始依赖又解决不了,直接编译不过。

到这里,总是需要人的介入。

第二次尝试:先强行造一层抽象

后来我换了一种方式。

不再从 demo 一点点往上扩,而是:

  • 先在某一层封装好统一的 API
  • 下层可以用不同实现
  • 这层向上完全屏蔽细节
  • 上层代码尽量不动

这个方式对人类来说不那么平滑,但有一个巨大好处:反馈非常明确

AI 可以不停地:

改代码 → 编译 → 报错 → 再改

在这种模式下,它居然真的一点点把事情推进了。

在烧掉了 1,034,292,253 token 之后,它真的把这条链路跑通了。


一条非常清晰的分界线:反馈循环

回头看这些成功和失败的例子,我现在觉得真正的分水岭只有一条:

AI 能不能拿到真实、快速、明确的反馈?

只要有:

  • 编译
  • 运行
  • 报错
  • 测试结果

哪怕任务不算小,AI 都能靠疯狂试错硬推进度。

而一旦:

  • 没法运行
  • 没法观察状态
  • 错误语义不清晰

AI 就会迅速退化成一个“看起来很懂”的文本生成器。

从早期 Cursor 那种“人主导、AI 辅助”,到现在的 agentic coding,除了模型本身更聪明,一个更重要的变化是:AI 学会用工具、并且能形成反馈闭环

AI 作为大脑,agent 负责调用各种工具:读文件、访问网站、遍历目录、编译、跑脚本……一旦闭环跑起来,自动化 coding 的能力几乎是被突然解锁的。

有一次在做游戏 demo 的时候,我只告诉它「某个按钮点了没反应」。它居然自己:

  • 在代码里推断程序大概运行到多少帧
  • 主动加 debug
  • 模拟点击
  • 在事件处理处加 log
  • 跑程序观察 log

那一刻我是真的被惊到了。

现在它还不太会用调试器,但一旦这些工具也被掌握,效果会完全不一样。这件事我觉得只是时间问题。


最后一点个人感受

2025 年明显是一个 vibe coding 从概念走向落地的年份,而 2026 年,AI 的 coding 能力只会更强。

以前写代码,是设计、拆任务、一点点写,预估一个月的工作量。现在很多事情,丢给 AI,一天以内就能看到结果。

而且这个变化来得非常快。一个月前做不到的事,一个月后可能已经是完全不同的故事。

我用自己前不久发的一条朋友圈作结:

从纸带,到汇编,到高级编程语言,再到 AI 问世;
从 vibe coding 的概念,到它真的开始普及……
时代的车轮滚滚向前,我们大概是最后一代经历“古法编程”的程序员了。

2026 年,见证历史。

AI