返回BUILD_SEASON
2026.03.138 min

不会写代码的我用 AI 写人生第一个程序

一个完全不懂开发的普通人,用 48 小时和 Claude Code 做出通过 Apple 公证的 macOS 原生应用 Rockpile。

我不会写代码,不懂 Swift,不懂前端后端,甚至在开始这个项目之前,连 GitHub 账号都没注册过。终端对我来说就是一个黑色的窗口,唯一知道的命令是 cd——还是 AI 教的。我的日常工作和编程没有半点关系,但因为对 AI 感兴趣,这半年一直在用 Claude Code 处理各种杂事,算是一个重度用户。

然后我用两天时间,做出了一个 12800 行的 macOS 原生应用。

Rockpile 已开源:[GitHub - Rockpile](https://github.com/nicekate/Rockpile)

这篇文章是一份记录:一个完全不懂开发的普通人,怎么用 AI 把一个荒唐的想法变成一个真正能安装、能分发的产品。

1. 两个念头的碰撞——想法是怎么来的

产品的起点都是两个不相干的东西撞在一起。

一个是刷到了 Notchi,有人在刘海区域做了个 Claude Code 的状态监控。看完之后脑子就开始转了——原来刘海这块地方是可以拿来用的。

另一个是我自己的场景。MacBook 上跑着 Claude Code,Mac Mini 上养着一只小龙虾(OpenClaw),两边都在消耗 token,但信息散落在不同地方。我想把所有 AI 的状态聚合到一个入口,用一个有情绪的活物来展示——工作的时候它跟着忙,等回复的时候它跟着等,报错了它生气,token 烧完了它翻肚皮。

要是搁以前,这个想法百分之百死在备忘录里。

说句不怕丢人的话,我一直是个"眼高手低"的人。脑子里想法密密麻麻,但真正要落地的时候,总会被各种不会的东西卡住——不懂这个框架、搞不定那个接口、环境配不好、编译报错看不懂。热情消磨殆尽,idea 就安静地烂在备忘录的第 47 行。

这一次我打开了 Claude Code。

一个有经验的开发者听到这个想法,大概会列出一串技术难点:macOS 窗口管理、Notch 区域的特殊渲染、精灵动画系统、Socket 通信协议……然后告诉你这至少要几个月。

但我不知道这些,不知道一件事有多难,恰恰是开始做它的最好理由。

2. 第一行命令——从黑色终端到一只红色的虾

打开 Claude Code,敲了一句话:

"我想做一个 macOS 应用,一只像素小龙虾住在 MacBook 的刘海区域,能跟着 AI 的工作状态动起来。"

Claude 没说"这很难",也没说"你先去学 Swift"。它直接开始干了。

生成 project.yml,用 XcodeGen 创建工程,写了第一个 SwiftUI 视图,让一只静态的像素小龙虾出现在了刘海区域。终端里敲出了一行行编译命令——Claude 告诉我的——然后看到了它。

一只红色的小龙虾,静静地站在刘海下面,那时候大概是晚上十点。

那个瞬间的感觉很奇怪,不是成就感——毕竟代码不是自己写的。是一种从未有过的错位感:我刚才做了一件完全不懂的事情,而它真的发生了。屏幕上有一只虾在看着我,而我甚至说不清它是怎么出现的。

从那一刻开始,我意识到一件事:想法和产品之间那道一直存在的鸿沟,已经被填平了。

3. Vibe Coding 的真实手感——不是写代码,是当产品经理

接下来的开发方式和传统程序员完全不同。不写代码,写需求。说白了,就是在和 AI 聊天。

"小龙虾现在只会站着,我想让它动起来,有不同的动画:思考的时候摆钳子,工作的时候忙碌地爬,空闲的时候悠闲地吐泡泡。"

Claude 改了 CrawfishSpriteView.swift,加上精灵表动画系统。

"水下要有海草在摇摆,有气泡从底部往上飘,有光线从水面透下来。"

Claude 用 Canvas 和 TimelineView 画了整个水下场景——海草摇摆的弧度、气泡的大小和速度、光线的穿透角度,全是它写的。

"AI 消耗的 token 能不能像游戏里的血条一样显示?氧气瓶的概念,满的时候绿色,快用完了红色闪烁,归零就 K.O.。"

于是就有了 O₂ 氧气瓶系统——Street Fighter 风格的像素血条(Pixel Health Bar),颜色从绿到黄到红再到 K.O. 闪烁。

这里面有一个反直觉的发现:不懂技术的人,反而敢提更大胆的需求。

一个懂开发的人会自我审查——"这个动画太复杂了"、"这个通信协议我搞不定"。不懂的人不会。不知道什么是复杂的,所以什么都敢要。复杂不复杂,那是 AI 的事。

4. 踩坑——Vibe Coding 不是童话

如果你以为 Vibe Coding 就是一路顺风地聊天,那就太天真了。

真正的考验不是"代码怎么写",而是"出了 bug 怎么办"。

第一个让人崩溃的问题是 Socket 通信。小龙虾需要接收 Claude Code 发来的状态事件,但大的数据包总是被截断。描述了现象之后,Claude 诊断出是 100ms 的接收超时太短,改成了 5 秒,加上 Content-Length 精确读取。

但更多时候,bug 的表现是"小龙虾突然不动了"或者"应用闪退了"——连怎么描述问题都不知道。这时候学会了一件事:把日志贴给 AI 看。 终端报错、Xcode 崩溃日志、控制台输出——不需要看懂它们,只需要复制粘贴。

有一次,小龙虾的计时器在会话结束后还在后台跑,应用越用越卡。连"内存泄漏"这个词都不知道。跟 Claude 说"用久了会变慢",它排查了一圈,发现是 SessionData 里的 sleepTimer 没有被清理,加了一个 cleanup() 方法解决了。

这段踩坑经历教会我一件事:Vibe Coding 最核心的能力是描述问题的能力。 你不需要知道原因是什么,但你得说清楚发生了什么——哪个操作触发的、什么时候出现的、具体表现是什么。这跟编程毫无关系。会观察、会表达,就够了。

5. 失控式进化——从一只虾到一个生态系统

开发的复杂度是怎么一步步"失控"的?

一开始只是一只虾,然后想:Mac Mini 上也在跑 AI,能不能让远程状态也在 MacBook 上显示?于是有了远程模式,两台机器可以配对连接。

然后想:能不能在 MacBook 上直接给远程的 Agent 发指令?于是有了双向通信,刘海展开后底部多了一个输入框,打字就能遥控另一台机器上的 AI。

然后想:一只虾太孤单了,再养一只?于是有了双生物系统——寄居蟹追踪本机 AI,小龙虾追踪远程 AI。两只生物在同一个鱼缸里各自游动,偶尔碰撞弹开、绕圈追逐、钳子碰拳。第一次看到它俩自己撞到一起又弹开的时候,我笑出了声——凌晨三点,对着刘海里两只像素动画生物傻笑。

后来想想:只支持中文太可惜了。于是有了三语系统——中文、英文、日文,运行时切换。

每一个"后来想",都是 Claude 帮我实现的。从 v0.1 到 v2.0.5,两天里迭代了 7 个版本。第二天下午回头看代码行数的时候吓了一跳——从几百行膨胀到了 12800 行。

回头看这个膨胀过程,会发现一件有意思的事:每一个新功能的边际成本几乎是零。 我唯一付出的是想清楚"我要什么"以及"用什么话跟 AI 描述清楚"。当实现的成本趋近于零,想法本身就变成了唯一的稀缺资源。

6. 最后一公里——真正的"做完"

代码写完不等于做完,这一步是完全没有预料到的。

macOS 应用需要代码签名(Code Signing)、需要 Apple 公证(Notarization)、需要打包成 DMG。Developer ID、Hardened Runtime、Staple 票据嵌入……每一个词都是第一次听到。

Claude 写了 build-release.sh,一键完成编译、签名、打包、公证。过程当然不顺利——公证失败了好几次,每次原因都不一样。但最终,一个带着 Apple 认证的 DMG 文件出现在了桌面上。

双击安装,拖进 Applications,打开。小龙虾出现在刘海里,吐着泡泡,等着 AI 给它派活。

它不是一个 Demo,不是一个原型,是一个可以分发给任何人使用的正式应用。

从"连 GitHub 账号都没有"到"通过 Apple 公证的 DMG",中间只隔了 48 小时。

这 48 小时里到底发生了什么?Claude 创建了 71 个 Swift 源文件,接入了 35 套精灵动画,搭了本机和远程两套通信协议,做完了三语切换,加上了会话历史、菜单栏控制、开机自启——甚至还做了无障碍适配,虽然我根本没想到要做这个。

不是我做了这些。是我和 AI 一起做了这些。更准确地说,是我决定要做什么,AI 负责怎么做。

7. 做完之后想了些什么

做完这个项目之后,我回想自己过去半年用 AI 的方式——基本就是问问题、聊聊天、让它帮忙改改文字。说实话,我以前也觉得 AI 就是一个聪明一点的搜索引擎。但 Claude Code 完全不是那个东西。它能直接操作文件、执行命令、编译代码——它不是在"回答"我,它是在替我干活。这两者之间的差距,比我之前想象的大得多。

但也不是躺着就能出成果。两天里几乎没怎么睡觉。AI 写代码,但决定做什么、怎么描述需求、判断结果好不好、方向对不对——这些全是我的工作。感觉更像是突然有了一个不知疲倦的技术合伙人,而我是产品经理。

回头看,真正变了的是瓶颈的位置。以前那些死在备忘录里的想法,卡在了"从想法到产品"之间的技术鸿沟上。现在 AI 把那道鸿沟填平了。剩下的瓶颈是什么?是想象力——你能想到什么样的东西?你能多清晰地描述你想要什么?

不过,写到这里我得对自己诚实一点。这 12800 行代码,我一行都看不懂。AI 说没问题,我只能选择相信;它要是在哪里埋了雷——一个安全漏洞、一段没清理干净的逻辑——我也看不出来。门槛消失了,可成本没有蒸发,它只是换了个地方:从"会不会写",转移到了"判断得了判断不了"。写代码这部分 AI 替我付了,验证和判断这部分,账还挂在我名下。这笔账迟早要还,只是现在的我还不知道要用什么还。

我不确定这对专业开发者意味着什么,那不是我能评判的。但对我这种"有想法没能力"的人来说,这是第一次觉得,想做一个东西的时候,真的可以直接去做。

8. 一个可以带走的模型

如果这篇记录只能留下一句话,我希望是这一句:

当实现的边际成本趋近于零,想法成为唯一的稀缺资源。

过去做一个产品,想法只占成本的零头,剩下的全是实现:学语言、配环境、调 bug、打包发布。所以想法死得起,烂在备忘录里也不心疼。现在这个比例倒过来了——实现趋近于免费,想清楚"要什么"和描述清楚"要什么",成了全部的成本。备忘录第 47 行那些"等我学会了再做"的念头,从今以后没有"等"这个选项了。

两天前,连 GitHub 账号都没有。现在,MacBook 刘海里住着一只小龙虾和一只寄居蟹,它们会根据 AI 的状态摆动钳子、吐泡泡、闪烁情绪,能追踪三个 AI 平台的 token 用量,能通过 WebSocket 和远程服务器双向通信,支持中英日三语,通过了 Apple 公证。

12800 行 Swift 代码,71 个源文件,35 套精灵动画。

全部是和 AI 聊出来的。

那道曾经挡在"想法"和"产品"之间的门槛,确实不在了。

但成本不会凭空消失,它只会换个地方等你。会写代码,曾经是门槛;看得出好坏,往后才是。

我做出了一个产品,也得到了一堆以前没资格拥有的问题。这大概就是进步的样子。

Rockpile 已开源:[GitHub - Rockpile](https://github.com/nicekate/Rockpile)

Don't Panic. Accelerate.

`时间层:事件层(48 小时个人记录),指向结构层(开发门槛的相变)`

`置信度:实现的边际成本趋近于零 — 高 | 想法成为唯一稀缺资源 — 中(验证与判断的成本尚未计入)`

下一篇
用 AI 写了三万行代码,我连自己用的什么语言都不知道
全部信号