45分钟“搓”出梦中情App:我是如何用AI实现“Vibe Coding”的?
上个周末,我在山景城的 Social Science FOO Camp 参加了一场别开生面的“非会议(unconference)”。在这种场合,任何人都可以随时上台分享。我临时抢了个位置,题目定为《LLM 现状:2026年2月版》,副标题是——“自去年11月以来,一切都变了!”
为了让这场演讲更出彩,我决定在演讲前一晚,用 AI “搓”一个专属的 macOS 演示应用。
为什么我不选 Keynote?
在过去几年里,我一直在密切关注 LLM 的飞速进化。从 2023 年到 2025 年,技术更迭的速度甚至让我随身穿的 Gemini 3 纪念衫在短短几周内就因为 Gemini 3.1 的发布而显得“过时”了。
在演讲这件事上,我有个原则:一定要包含一个 STAR Moment(Something They’ll Always Remember,让人永生难忘的瞬间)。
通常我用 Keynote,但有时我更喜欢直接展示网页。以往的方法是打开一堆浏览器标签页逐个切换,但这有个致命弱点:万一浏览器崩了,我的演示就全完了!虽然我有备份链接,但在讲台上忙乱地重开网页显然不是什么好体验。
45分钟诞生的 Present.app
于是,我向 AI 下达了指令。我把这个应用命名为 Present。它基于 Swift 和 SwiftUI 构建,非常轻量——解压后只有 355KB,压缩包甚至只有 76KB。这就是原生应用的魅力!
我的核心需求非常直接:
- 左侧是一个可以添加、删除和排序 URL 的列表。
- 右侧是网页预览区。
- 点击“播放”,应用进入全屏,可以用左右方向键切换网页。
令人惊讶的是,即使我不精通 Swift,AI 也只用了不到 45 分钟就帮我实现了这一切。它甚至具备了自动保存功能——如果应用崩溃,重启后所有链接和进度都会瞬间恢复。
进阶玩法:手机变成远程翻页笔
基础功能搞定得太快了,我决定再加点猛料。我希望能用手机控制电脑上的幻灯片。
我给 AI 发了新指令:“增加一个监听 9123 端口的 Web 服务器,提供一个手机适配的控制界面,包含‘上一页’、‘下一页’和‘开始演示’按钮。”
配合 Tailscale(一种虚拟组网工具),无论我在哪,我的手机都能通过私有 IP 访问这个控制台。最终的界面长这样:
除了翻页,我还让 AI 增加了一个神奇的功能:远程滚动条。在手机上滑动,电脑上的网页也会随之上下滚动。这完美解决了网页内容过长、演讲时需要翻页查看下方信息的问题。
深挖代码:AI 是如何工作的?
代码跑通后,我并没有就此罢休,而是让 AI 给我做了一个“代码导读(Linear Walkthrough)”。
我惊讶地发现,为了实现远程控制,AI(在这里我使用了 Claude Code)竟然没有调用任何笨重的第三方库,而是直接使用 Socket 编程 手写了一个微型 HTTP 解析器!
// AI 手写的极简路由逻辑
private func route(_ raw: String) -> String {
let firstLine = raw.components(separatedBy: "\r\n").first ?? ""
let parts = firstLine.split(separator: " ")
let path = parts.count >= 2 ? String(parts[1]) : "/"
switch path {
case "/next":
state?.goToNext()
return jsonResponse("ok")
case "/prev":
state?.goToPrevious()
return jsonResponse("ok")
// ... 更多逻辑
}
虽然这种简单的 GET 请求存在 CSRF 安全漏洞,但作为一个私人使用的工具,这完全可以接受。这种“刚刚好”的工程实践,正是 AI 辅助开发的魅力所在。
什么是“Vibe Coding”?
最近“Vibe Coding(氛围编程)”这个词很火。它指的是开发者不再纠结于具体的语法细节,而是通过表达意图、调动 AI 代理来快速构建工具。
这次经历带给我几点启发:
- 语言不再是障碍:我并不精通 Swift,但它是开发 macOS 原生应用的最佳选择。有了 AI,我可以直接调用这种能力。
- 解决真实问题:这不是一个玩具,它解决了我多年来在演讲时的痛点。
- 经验依然重要:虽然 AI 写了代码,但我知道如何配置 Xcode,知道如何使用 Tailscale 解决网络穿透,也知道如何引导 AI 优化架构。
原生开发者并不会因此失业。相反,对于我们这些有经验的软件工程师来说,AI 极大地扩展了我们的疆界。下次当你需要一个特定的小工具时,不要犹豫,试着去“搓”一个吧!
夜雨聆风
