乐于分享
好东西不私藏

无人值守开发 App,我用 AI 的尤里卡时刻

无人值守开发 App,我用 AI 的尤里卡时刻

我也曾面对难懂的数学论文感到挫败,面对优秀的同行天马行空而又非常深刻的想法而感到痛苦,面对浩如烟海的技术文档而感到焦躁,面对设计非常差劲剥削人的注意力的应用而感到愤怒,在 AI 的协助下,我终于可以做点什么了。

前一天晚上,我把需求文档和原型交给 AI,就去睡觉了。第二天早晨醒来,我看到一个已经能跑起来的 APP。

那一刻我才真正意识到,AI 编程最有意思的地方,便是终于让人可以认真去满足那些小众、具体、此前几乎不值得专门开发的软件需求。

这就是我用AI的尤里卡时刻。

为什么要做这个 APP

我想做这个 APP,是为了舒缓生活里的堵点,也为了把生活本身更好地记录下来。过去我们靠日记本记录,但纸本的局限很快就会出现:信息很难高效组织,很难再次呈现,也很难被别的机制重新利用。维护它也是问题。我想象中的生活总是长期处在流动之中。那样的话,老是带着一箱日记本,本身就不现实。

这些年我一直在做的事情,其实就是把记录电子化。我的博客和电脑里的文本仓库,某种程度上已经完成了这个任务。但它们的门槛还是太高了。

我女朋友也想做类似的事情,但如果要让她去学 Git,或者 Hexo 这类带着黑客味道的工具,学习曲线就太陡了。而且一旦出了问题,她也没法自己处理。所以我一直想开发一个遵循我相同生活哲学的产品。市面上并没有现成的,因为它的需求太专一,也太小众。我之前就判断过,AI 编程真正有前途的地方,就是满足每个人这种细微而特殊的需求。

我之前做家庭藏书管理系统的时候,就已经感受到这一点了。那个项目本身也是一个很小的需求。做完之后,我开始意识到,整个流程还可以更高效。甚至我可以尝试一个以前没有试过的想法:把需求和设计稿交给 AI,然后我去睡觉,第二天早晨再看它能不能把应用做出来。

但这个 APP 既然是给我女朋友用的,第一步就不能是代码,而必须是交流。我给她打了一个小时的电话。我们讨论这个应用到底要达成什么目标,哪些需求其实太复杂,不该在这个应用里解决,哪些需求才是最迫切、最需要的。这个过程也让我更确定了一点:在我想象中的 AI 时代,人最不可替代的一环,依然是发现需求、理解需求、整理需求。你得先知道对方真正想要什么,然后才谈得上满足它。

我怎么把它交给 AI

在我确定这个 APP 要做什么之后,下一步不是直接把需求丢给 AI,而是先把原型做对。因为如果你只是把一段需求扔过去,它很容易天马行空地给你生成一个非常丑陋的原型。那我为什么不先让更擅长设计界面的 AI,把原型做漂亮?

我先用谷歌的 Stitch 生成应用设计稿,再把它交给 AI Studio,做成一个可以交互的网站。Stitch 本身也是一个基于 Gemini 的设计工具,它能把应用或者网页的展示页面先做出来。

但只有图片还不够,因为图片背后没有交互逻辑。这个按钮点了之后会跳去哪里?页面要怎么滑动?哪些地方能编辑,哪些地方只能查看?这些东西必须先被编码成一个能跑的网页。到了这一步,原型就不再只是「好看的图」,而是 AI 能够直接读取的交互代码了。

这一步对我很重要。因为我很早就发现,本地的 Codex 在界面审美上并不稳定,不如这种专门为设计搭建的 AI 工具。我的做法其实很简单:先让擅长设计的 AI 产出好看的、合理的原型,再把这个原型导出为压缩包,放到本地,让 Codex 根据网站和需求文档,把它翻译成 iOS 上真正能运行的应用。

换句话说,到这一步,本地 AI 要做的事已经不是凭空发明一个产品,而是把一个已经被设计好的交互原型,翻译成 iPhone 上的代码。

以下是我当时写给它的功能需求文档。这里面其实不只是功能清单,也塞进了我在上一个项目里积累下来的经验。AI 时代很有意思的一点就在这里:一旦某件事做成一次,这份经验就可以几乎无痛地复制到后面的很多项目里。你把一件事认真做过一次,AI 以后就能陪你把它做很多次。

# 我的需求

我已经快速实现了一个网页的原型 lumina,请你将其作为 UI 参考。

## 基本功能

我想要实现的功能如下:

1. Journal 页面
   (a) 页面正上方默认显示当天的日期。
   (b) 页面主体按照年份显示一系列小框,每个框包含图片和文字。
   (c) 框的下方显示星期几。
   (d) 核心逻辑:将每一年的同一天所创建的文章(或带图的文章)显示在同一个位置。
   (e) 点击页面左上方的日历图标,跳转至日历页面。

2. 日历页面
   (a) 这是一个标准的日历组件,支持年份和月份的显示。
   (b) 点击日历中的某一日期,即可跳转到当天的 Journal 内容。

3. Search 页面
   (a) 用户输入搜索关键词,系统迅速检索并显示相关的文章。

4. Blog 页面
   (a) 该页面需要一个添加按钮,用于创建新文章。
   (b) 此处添加的文章与前面的 Journal 文章无关,是单独的内容。
   (c) 这些文章不会出现在 Journal 或 Reflect 中,但会出现在 Search 的搜索结果中。
   (d) 页面按照时间流排列,目前每篇文章仅限于一张图片和一大段文字。

请根据以上 UI 逻辑开发一个 iOS App。要求编写完整的测试代码。

## 联网功能

需要有一个联网功能。整个页面应该再找一个合适的地方,让我能够放设置页面。

设置页面的布局要求如下:
1. 放在第一页的右上角
2. 把原先右上角的「搜索」改为「设置」

关于设置页面的功能逻辑:
1. 可以通过 CloudKit 的功能,把整个存储仓库分享出去
2. 分享方式:通过邀请链接分享给别人
3. 邀请逻辑:请参考我已经实现的另外一个项目 /Users/wangyu/code/homeLibraryApp/homeLibrary
4. 注意,作为仓库的所有者,我可以设定在邀请他人时,对方不能修改当前仓库的任何内容,只能查看。当然也可以给他修改权限,这全都是我在这里设置的。

## 注意

注意:如果当前的 UI 有哪里不合理的地方,请进行修改。

因为这只是我的一个实现原型,并不一定最终所有的功能都测试到了,你需要按照功能要求去修改这个 UI。

注意到在这个过程中,你需要记录 log.md 文件。也就是说,当你完成一个比较大的、跨越性的功能实现时,就要记录在 log 里面。

同时,你也要参考我在需求中提到的,给我写一份 README 文件。

请你根据当前的需求帮我把这个应用构建出来,并且要进行完整的测试。

在整个过程中,我是无人值守的,所以你碰到任何问题都需要自己解决。我最终的目标是你完成这里所有的功能,同时要提供完整的测试代码,并确保跑通全部测试。

那天晚上,我就是把这些东西交给 AI,然后去睡觉。第二天早晨起来,我惊奇地看到,一个可用的 APP 已经出来了。后面当然还有返工,因为设计稿里总会有一些之前没想清楚的细节。但那个效率已经非常惊人了。我甚至可以一边吃早饭,一边让 AI 继续修改。

做到这里之后,我的经验也越来越清楚了。原型稿必须尽可能细,最好把你能想到的交互都先想进去。Stitch 的价值不只是把页面画得漂亮,而是帮你把整个应用的视觉和页面关系先站稳。接着把几个关键页面导进 AI Studio,让它变成一个能点击、能跳转、能编辑的网页,再继续打磨,直到整个流程足够顺。最后再把整个项目下载到本地,配合需求文档,让 Codex 去生成真正的 iOS 应用。

这个流程跑通之后,速度确实快得惊人。整个过程只花了一个小时左右,就已经能产出一个非常漂亮的应用。之后根据真实使用情况,我脑海里又不断冒出新的修改想法,于是就继续让 AI 在现有基础上细修技术细节。

我还在测试时发现,Codex 其实支持模拟人工的 UI 测试。也就是说,除了在命令行里写测试文件,你还可以让它模拟点击页面、模拟输入,去做更接近真实用户行为的测试。这样就能补上纯测试代码覆盖不到的那部分情况,避免用户做出一些没有被你预料到的动作时,应用直接崩溃。

从晚上提出需求,到第二天早晨拿到一个已经很好看的、基本满足需求的应用,中间人真正花掉的时间,还不到两个小时。

真正让我震动的,不是速度本身

这个应用的诞生过程,背后其实是一套生活哲学。那就是尽可能高效地生产信息、复用信息,尊重自己的每一份产物,然后把它记录下来,再重新组织起来。

如果之后还需要和别人合作,那就继续把门槛降到足够低。你要细微地体察别人的需求,要做到开箱即用。对方不需要读教程,也没有耐心被教育。最好是在他第一次打开应用时,就能通过精心设计的引导,立刻学会如何使用它。某种程度上说,这也是 iPhone 那套设计理念真正迷人的地方。

哲学先行。需求导向。以人为本。然后再借助 AI 强大的执行能力,把它做成一个漂亮的产品。

而这一切,只用了两个小时左右。

这件事也让我重写自己的文章

昨天有一位朋友批评我,说我的公众号阅读体验非常不好。问题不在于内容没价值,而在于写法对读者不够友好。对没有基础的人来说,里面充斥着技术名词,也默认大家都懂。这种姿态会让人很不爽。

这让我开始警惕,自己是不是也陷入了知识的诅咒。虽然我现在会让 AI 帮我校对,也会让它提醒我文章是不是太艰深,是不是没有把读者放在第一位,但很明显,这还远远不够。我还需要继续迭代自己的写法。

有些数学论文就是这样。想法和写作彼此背离。论文只留下最后那个漂亮的结果,把真正的思考路径、失败的尝试、搭建过的脚手架全都拆掉了。读者看完之后,并不知道它是怎么被想出来的,也就很难在此基础上继续往前做。

我理想中的数学论文不该这样。我理想中的公众号文章,其实也不该这样。它当然可以长,但它应该把「怎么想到的」、哪些路走不通、最后为什么走到这里,都诚实地写出来。这样读者读完之后,才能继续思考,甚至继续创造。

我希望读者在看我公众号的时候,不只是看到一个结论,还能看到我是怎么设计产品、怎么学习知识、怎么在 AI 浪潮里找到安放自己的位置的。同时,他们也应该看得到,我还在不断地创造,不断地满足他人的需求。

但这也意味着,我得把公众号的写法继续往前推。我现在的文章更像面向同行的高强度思想碰撞,可我将来的授课产品,面对的是完全没有基础的普通人。最好从现在开始,就把写法迭代成另一种状态:一方面还能容纳那些深刻、前沿、复杂的东西,另一方面也真的能对普通人有帮助。

我希望自己在生活的方方面面里,都践行这套理念。每一次写作、创造、交流、展示,都尽量以人为本。

因为我也曾面对难懂的数学论文感到挫败,面对优秀同行天马行空而又极其深刻的想法感到痛苦,面对浩如烟海的技术文档感到焦躁,面对那些设计糟糕、不断剥削人注意力的应用感到愤怒。在 AI 的协助下,我终于可以为这些事情做点什么。

这就是我这次使用 AI 的尤里卡时刻。它让我第一次真的觉得,我们离那个更理想的世界,近了一点。