
“Claude 在这件事情上 3 周取得的进展,比 PDN 自 2014 年使用 Direct2D 以来 12 年里我们见到的还要多。”拥有 20 多年历史的 Windows 经典图像编辑软件 Paint.NET 开发者 Rick Brewster 在发布 5.2 alpha(build 9739)时给出了这句评价 [2]。这个版本首次加入了处于极度实验状态的 WINE 与 Linux 支持,让许多远离 Windows 的老用户首次在 Ubuntu 与 WSL2 环境下看到了图形界面的启动窗口 [2, 4]。
表面上看,这是一次老牌客户端软件跨平台的狂欢,本质上却是一场极其典型的 AI 编程智能体边界压力测试。Rick Brewster 没有选择逐行手写或继续等待开源兼容层完善,而是通过 Anthropic 的 Claude 模型,以逆向推导与 vibe coding(指由 AI 快速生成、人类不逐行审查只测运行结果的编程模式)的方式,在三周内从零写出了一个包含 18 万行代码的 Direct2D 内部托管实现 [1, 2]。这场实践既展示了 AI 在结构化逆向工程中的恐怖生产力,也揭示了大规模代码生成背后必须付出的人工盯防代价 [1]。
12 年未解的跨平台死局,AI 凭什么 3 周破局
Paint.NET 作为 Windows 平台上的轻量级图像处理常青树,核心代码库历经 20 余年积累,规模约 70 万行 [1]。在迁移至 .NET 10 的技术栈后,该程序依然无法脱离 Windows 运行,核心死穴在于微软的 Direct2D(微软专为 Windows 设计的高性能 2D 硬件加速图形渲染接口)。Paint.NET 在 2014 年全面转向 Direct2D 架构,而 Linux 生态中用于运行 Windows 程序的兼容层 WINE,在此后 12 年间始终没有完成对 Direct2D 的完整实现,导致程序只要尝试在 WINE 下启动就会直接崩溃 [2]。
Rick Brewster 放弃了等待 WINE 社区补齐图形接口的被动路径,选择了一种激进方案:利用 AI 编程智能体完全绕过系统底层组件,在 Paint.NET 内部纯手工重新实现一套 Direct2D 托管运行时 PaintDotNet.Windows.Direct2D1.Managed.dll [1, 2]。
这套方案能够成立,是因为该任务具备了极其罕见的工程确定性。AI 面对的不是一个凭空想象的新功能,而是一个有着明确规范的确定任务:
- 输入依据明确:微软官方公开的 Direct2D API 文档与类型签名提供了完整的接口形状。
- 参考实现已知:Windows 原生的
d2d1.dll提供了绝对正确的行为基准 [2]。 - 测试闭环清晰:编译生成的模块可以直接接入完整的
paintdotnet.exe,任何行为偏差都能通过应用是否报错直接验证 [2]。
Claude 可以在数千次试错中永不停歇地比对接口与实现,这是任何人类工程师在精力和时间上都无法承受的机械性逆向重构。
Vibe Coding 逆向工程实录,从推导公式到盯梢纠错
在这场耗时三周的重构中,Claude 的表现呈现出惊人的两极分化。在图形算法与数学逻辑的推导上,AI 展现了超出预期的逆向工程实力。Direct2D 内部自带大量复杂的内置特效库(Direct2D Effects Library),涵盖颜色矩阵变换、模糊、高光与复合渲染算法。Claude 仅凭有限的公开信息与调用上下文,自主推导并补齐了这些特效背后的全部数学公式与渲染管线逻辑。
但在工程底层的系统约定上,AI 却屡屡出现低级常识盲区。Direct2D 深度依赖 COM(微软早期的组件对象模型标准,依靠引用计数来管理内存生命周期)。在初期的代码生成中,Claude 频繁漏掉 AddRef()(增加对象引用计数的关键方法)和配套的内存释放逻辑,导致整个运行时陷入诡异的对象提前销毁或严重内存泄漏中 [1]。
Rick Brewster 明确表示,整个开发过程离不开人类的严密盯梢(babysitting)[1]:
- 持续纠偏底层规范:反复向 AI 强调 COM 引用计数规则与 .NET 垃圾回收器之间的互操作约束。
- 主动打脸架构决策:当 AI 为了跑通单一测试而提出一些违背模块化原则的糟糕补丁时,人类开发者必须强行介入并驳回其设计方案 [1]。
- 高频端到端测试:在 .NET 10 win-x64、WINE 11.14-dev 以及 Ubuntu 构成的交叉环境中高频编译,以应用程序能否正常进入画布作为唯一的验收裁判 [2, 4]。
18 万行代码的信任危机与打脸修正法则
当重写工作告一段落时,生成的单个 DLL 文件代码量已经膨胀至约 18 万行,占整个 Paint.NET 代码总量的四分之一以上 [1]。面对如此海量的代码,人类工程师逐行 Code Review(代码审查)的传统模式彻底失效,开发模式不可避免地滑向了“信任我,兄弟(trust me bro)”的 vibe coding 状态 [1]。
这种依赖运行结果而非代码审查的开发流程,在软件工程全流程中埋下了不同维度的隐患与妥协:
| 阶段 | 核心问题 | 留下的硬伤 |
|---|---|---|
| 接口定义期 | Direct2D 庞大 API 树形结构与类型签名缺失 | 生成了大量冗余的胶水代码,部分边界枚举值存在潜在映射偏差 |
| 算法逆向期 | 内置特效着色公式与混合模式难以人工逐行核对 | 特效库整体可跑,但极端浮点数与边界混合条件下的像素表现未经验证 |
| 系统对接期 | COM 引用计数与底层资源生命周期管理被 AI 遗漏 [1] | 运行时偶发内存泄漏与空指针崩溃,资源回收时序极度依赖 GC 表现 |
| 跨平台集成期 | WINE 11.14 环境下的字体回退与窗口句柄交互异常 [4] | 界面响应迟钝、排版变形、偶发性无预警闪退,整体性能远落后于原生环境 [2] |
目前的 Paint.NET 5.2 alpha 在 Linux 下的真实表现正如作者所言:“充满漏洞且缓慢(buggy and slow)” [2]。虽然它能成功画出图层与画布,但卡顿、崩溃与粗糙的控件渲染随处可见 [2]。Rick Brewster 坦言无法给出正式发布的排期,这一状态可能需要持续到下个月、明年,甚至 2035 年 [2]。
什么样的工程任务才适合交给 AI 编程智能体
Paint.NET 这次跨平台实验给所有尝试在严肃工程中引入 AI 智能体的开发者划定了一条清晰的能力边界。在 Hacker News 的技术讨论中,许多开发者意识到,这并非意味着人类可以退场,而是意味着软件工程的重构分工发生了彻底重组 [3]。
能够被 AI 编程智能体高效解决的任务,必须同时满足三个硬性前置条件:
- 具备不可动摇的设计蓝图:系统输入输出的接口契约、协议标准完全固定,无需 AI 做发散式的需求设计。
- 具备已知正确的物理参照物:存在一个已知正确的商业实现作为真值表,供开发者对比运行状态。
- 具备可高频自动化触发的宿主环境:修改后的代码必须能被现有应用快速加载并暴露问题,以快速试错代替人类脑内推理。
AI 编程智能体是顶级的功能填空者与逻辑推导者,但绝不是系统架构师;一旦脱离既定参照物进入从零设计业务架构的真空区,生成的 18 万行代码就会变成不可维护的技术债务黑洞。
综合判断
这是一次在既定协议框架下利用大模型暴力破解工程历史包袱的阶段性胜利,而非无须人工干预的自动化软件工程奇迹。不能将这次成果误读为“AI 已经能够独立实现跨平台大型桌面软件”,更不能将其看作“放弃代码审查的 vibe coding 模式可以无痛应用于所有生产环境”。
它的真实价值在于证明了:当面临协议逆向、老旧 API 垫片重写、标准算法复刻等枯燥且海量的工作时,AI 编程智能体可以凭借不知疲倦的特性将人类数年未决的技术卡点压缩至数周完成,而人类工程师的职责则彻底转变为规则边界设立者、架构把关者与严厉的审查盯梢者 [1]。
一个未解决的问题
一个在技术社区引发广泛争论但尚未有法律和技术定论的问题是:由大语言模型在没有阅读 Windows 专有源码前提下、通过逆向推导生成的 Direct2D 兼容层,能否在法理上被认定为完全合规的净室逆向工程(clean-room reverse engineering)[3]?由于现代大语言模型的训练集庞大且不透明,AI 生成的代码中究竟多少来自公开文档推导,多少来自训练数据中可能存在的专有代码记忆,依然是未来此类 AI 逆向项目悬在头顶的法律达摩克利斯之剑 [3]。
引用来源
- Simon Willison. A quote from Rick Brewster [EB/OL]. (2026-09-02) [2026-09-02]. https://simonwillison.net/2026/Sep/2/rick-brewster/
- Rick Brewster. Paint.NET 5.2 alpha build 9739 release notes on X [EB/OL]. (2026-09-01) [2026-09-02]. https://x.com/rickbrewpdn/status/2094626538654502939
- Hacker News. Paint.NET 5.2 Alpha: Extremely Experimental WINE / Linux Support (item 49517727) [EB/OL]. (2026-09-01) [2026-09-02]. https://news.ycombinator.com/item?id=49517727
- Paint.NET Forum. Extremely experimental WINE / Linux support: how to get started [EB/OL]. (2026-09-01) [2026-09-02]. https://forums.paint.net/topic/134563-🍷-extremely-experimental-winelinux-support-how-to-get-started/
- GitHub Wine-Mirror. Direct2D implementation status and Wine development updates [EB/OL]. (2026-08-28) [2026-09-02]. https://github.com/wine-mirror/wine