Vibe Coding 实践:什么都不会,也能写App?

玉带千条落银碗
金波万顷泛霜纨
un baiser amoureux舌尖舞
一吸入魂暖人间
以上是定场诗。
上周六我开发了一个模拟考试系统,暂时叫做“Sims Exam”,演示站点在https://exam.miyunda.com/,用来给孩子备考复习。开发的全程没有写过一行代码——因为连Hello World都不会写——全程使用自然语言(英语),甚至数据库的schema都不管(虽然它自己想出来的我不太满意但并没有介入),全是Gemini 3 Pro写的,连写带测试断断续续用了大概一白天,我给它定义了功能需求和CSS的颜色。这正是最近流行的Vibe Coding,我作为项目经理/产品经理,负责气氛;Antigravity负责做事。
Antigravity 是一款“以智能体为主”的平台。它预设AI不仅是编写代码的工具,而且是能够规划、执行、验证和迭代复杂工程任务的自主行动者,几乎无需人工干预。
以上摘自它的官网https://codelabs.developers.google.com/getting-started-google-antigravity?hl=zh-cn#9。
而它是这样工作的:
graph TD
Start((开始)) --> Demand[1. 提交核心意图/需求]
Demand --> Design[2. AI 生成设计文档与系统架构]
Design --> Review1{我初审}
Review1 -- 修改 --> Demand
Review1 -- 确认 --> Stack[3. 确认技术栈与依赖库]
Stack --> Plan[4. 制定详细实施计划]
Plan --> Breakdown[5. 任务清单拆解与上下文注入]
subgraph Execution [Vibe Coding 核心执行区]
Breakdown --> Coding[6. 多智能体协作编码]
Coding --> AutoTest[7. 自动化测试与 Lint 自检]
AutoTest -- 失败修复 --> Coding
end
AutoTest -- 通过 --> FinalReview{8. 我最终审查}
FinalReview -- 反馈/迭代 --> Demand
FinalReview -- 部署上线 --> End((发布完成))
style FinalReview fill:#f96,stroke:#333,stroke-width:2px
style Review1 fill:#f9f,stroke:#333
graph TD
Start((开始)) --> Demand[1. 提交核心意图/需求]
Demand --> Design[2. AI 生成设计文档与系统架构]
Design --> Review1{我初审}
Review1 -- 修改 --> Demand
Review1 -- 确认 --> Stack[3. 确认技术栈与依赖库]
Stack --> Plan[4. 制定详细实施计划]
Plan --> Breakdown[5. 任务清单拆解与上下文注入]
subgraph Execution [Vibe Coding 核心执行区]
Breakdown --> Coding[6. 多智能体协作编码]
Coding --> AutoTest[7. 自动化测试与 Lint 自检]
AutoTest -- 失败修复 --> Coding
end
AutoTest -- 通过 --> FinalReview{8. 我最终审查}
FinalReview -- 反馈/迭代 --> Demand
FinalReview -- 部署上线 --> End((发布完成))
style FinalReview fill:#f96,stroke:#333,stroke-width:2px
style Review1 fill:#f9f,stroke:#333在这个流程中,我的主要工作是投喂Vibe(情绪/意图)和结果验收。
假如一个人还在纠结要不要学写代码,学哪种语言,不如先试着学会如何描述梦想。剩下的,交给Vibe Coding Agent然后 ⌘+⏎。
就连以下文字都是它写的(Gemini 3 Flash),我仅对其进行了人肉“lint”,比如删去多余的空格。对,这货会多写空格,甚至有时候会在变量名字开头多写个空格,我还得用对话提示它。我一开始甚至觉得它是个躲在云后面的肯尼亚程序员。
在过去的一段时间里,我有幸参与并主导了 Sims Exam —— 一个轻量级、高性能的在线考试模拟系统的开发。这个项目最初是为了帮助备考 AWS CLF-C02 等认证考试而设计的,但在开发过程中,它演变成了一个通用的考试框架。
本文将分享我们在开发过程中的技术选型、核心功能实现以及一些有趣的细节。
1. 为什么选择 Go + SQLite?
在项目初期,我们面临着一个抉择:是使用重型的 Web 框架和数据库,还是走简约路线?最终我们选择了 Go (Golang) 和 SQLite。
- Go 的简洁性:Go 语言的并发模型和出色的标准库让我们能够快速搭建起核心逻辑。使用了
chi作为路由框架,保持了极简的风格,同时提供了足够的灵活性。 - SQLite 的零配置:对于一个以内容展示为主的考试系统,SQLite 是完美的。它是单文件、自包含的,部署时不需要单独维护数据库服务,这极大地简化了内部测试环境的搭建。
2. 核心挑战与实现方案
2.1 智能题目解析与导入
题库的来源通常是杂乱的 Markdown 或文本文件。我们编写了一个专门的 importer 工具,它不仅能提取题目和选项,还能智能识别正确答案,并将复杂的解析逻辑转化成的结构化的数据存入数据库。
2.2 动态选项限制:让 UI 更有灵感
在 AWS 等认证考试中,复选题(Multiple Choice)通常要求“选择两个”或“选择三个”。 我们不希望在后端为每个题目硬编码限制数量,而是通过 JavaScript 在前端动态解析题目文本。
|
|
这种方案让系统具备了很强的自适应能力:当题目文本提到 “Choose two” 时,UI 会自动禁止用户选择超过两个选项,并在提交前进行校验。
2.3 计时器与准确性
为了真实模拟考试环境,我们实现了一个持续计时器。虽然显示在前端,但为了防止本地时钟偏移带来的误差,我们采用了“后端提供起始时间 + 前端实时计算差值 + 后端最终核对”的策略。
3. 开发过程中的“趣味”挑战
著名的 “(C)” 符号之谜
在开发题目解析功能时,我们遇到了一个非常有趣的 Bug。在 Markdown 渲染结果中,原本代表选项 C 的 (C) 总是被自动转换成版权符号 ©。
这其实是 Markdown 渲染引擎中一个名为 Smartypants 的特性。虽然它在写博客时很有用,但在考试系统中却导致了错乱。最终,我们通过深入 gomarkdown 的配置底层,精确禁用了这个特性,才找回了失踪的“选项 C”。
|
|
4. 总结与感想
项目的开发不仅仅是写代码,更多的是关于平衡。
-
极简主义的胜利:不需要层级复杂的架构,简单的
handlers+models+database模式在小型项目中效率极高。 -
注重反馈循环:在开发过程中,我们通过不断的内部测试(Baseline Release)发现了诸如单选框样式、题目编号清洗渲染等细节问题。这些微小的优化最终决定了用户的使用体验。
-
未来的路:目前系统已完成基准版本的发布。未来我们计划引入 Redis 来实现更稳健的会话管理,并增加更多维度的考后分析。
Sims Exam 是一个典型的“小而美”的项目。它证明了使用正确的工具(Go)配合一点点巧思(动态解析),就能构建出专业感十足的应用。
Antigravity 2025年12月20日