一个零代码基础的中年人,怎么用 Trae SOLO 在10天里"变"出一个小程序

这不是一篇产品说明书,是一次"人+AI"协作开发的真实手记。


一、先交代底细:我是谁,为什么站在这里写这篇东西

我今年四十出头,职业履历里没有任何一行代码。Excel公式就是我接触过的最复杂的"编程"。在朋友眼里,我大概是那种"电脑崩溃都要找人帮忙反复重装"的数码难民——这种印象不算冤枉。

但我也做了一件他们没想到的事:在10天里,我用 Trae SOLO 独立做出了一款能跑的小程序,从立项到上线,全流程走通。

小程序叫「喵了个鱼」,是个帮朋友决定"聚餐去哪吃"的工具。它有25个页面、35个云函数、6000多行前端代码、2000多行后端代码。功能包括双模式投票、房间管理、约饭定时、拼单、商家发现、匿名投票、忌口过滤……听起来不少,对吧?但今天要聊的不是这些功能本身 ,而是另一个问题:一个完全不会写代码的中年人,凭什么能在10天里把这些东西做出来?

答案是 Trae SOLO。

不过,回答这个问题之前,我想先聊聊为什么这件事值得写。因为现在市面上的 AI 编程工具不少,ChatGPT、Claude、Cursor、CatPawAi、WorkBuddy……每个人都在说"AI让编程变简单"。但"变简单"和"真能做成事"之间,隔着一条不小的河。我的这篇报告,想站在一个真·外行 的视角,讲讲 Trae 是怎么帮我渡过这条河的。


二、为什么我会走到"用AI做小程序"这一步

2.1 这事儿的缘起

起因很日常:每次朋友约饭,"去哪吃"都是一场灾难。

微信群里的典型场景是这样的:

  • A说:火锅吧?

  • B回:太辣了,最近上火。

  • C说:日料?

  • D回:太贵了,随便吃点就行。

  • E一直没说话,到餐厅了才说:我不吃海鲜。

20分钟过去了,没有结论。最后发起人说"就那家吧",有人附和,有人勉强,有人心里不爽但不说。这顿饭吃得别扭,下次约饭的热情也打了折扣。

我观察这个现象很久了。市面上不是没有工具——问卷星可以投票,微信群可以接龙,大众点评可以找店。但这些工具都有个共同问题:它们是为"收集信息"设计的,不是为"帮人做决定"设计的 。问卷星太正式,像是在做市场调研;微信群接龙太乱,信息散落在聊天记录里;大众点评只能查店,不能帮你协调一群人的口味冲突。

我想做一个东西,让"约饭"这件事变得顺滑。不是更复杂,是更顺滑。

2.2 三条路摆在面前

有了这个念头之后,我面临三个选择:

第一条路:自己学代码,从头写。

我认真考虑过。买了几本书,看了一些视频教程。但很快发现一个根本问题:小程序开发涉及的技术栈太多了——WXML(类似HTML)、WXSS(类似CSS)、JavaScript、云函数、数据库操作、微信API……每一门都需要时间消化。我算了一下,就算每天投入4小时,把基础学完至少也要一两个月。而我需要的是一个能在两周内跑起来的东西。这条路,时间窗口不允许。

第二条路:找外包或者朋友帮忙做。

也想过。但问题是,我的产品想法每天都在变。今天觉得投票页应该上下滑动,明天觉得左右滑动更好;今天想做两种投票模式,后天又冒出第三个模式。如果要和开发者高频沟通这些细节,对方的耐心和我的钱包可能都撑不住。更重要的是,我想亲手把这个想法做出来 ,而不是把需求文档扔给别人,等一个月后拿到一个可能和我设想差很远的东西。

第三条路:用AI辅助开发。

这时候正好看到 Trae SOLO 挑战赛。说实话,我对"AI写代码"这件事本来是半信半疑的。之前用过 豆包啥的问过一些简单的编程问题,它能给出代码片段,但都是零散的、片段式的。你可以让它写一个排序算法,但你很难让它"帮我做一个完整的小程序,要包含用户登录、数据库、投票逻辑、UI界面"。中间的衔接、调试、Bug修复,AI似乎插不上手。

但 Trae 的宣传让我有点动心:它不是聊天机器人,是一个集成在IDE里的AI编程助手 ,能理解整个项目上下文,能帮你写代码、改代码、调Bug,还能看截图给设计建议。我想,要不试试?反正最差的结果就是10天后发现做不出来,也没什么损失。


三、用过才知道:Trae和其他AI工具到底差在哪

在深入讲我怎么用Trae做「喵了个鱼」之前,我想先聊聊工具对比 。因为我这段时间其实不止用了Trae,也试过其他几个方案。对比之后,我才真正理解为什么Trae适合我这种外行人。

3.1 ChatGPT / Claude:知识渊博,但"站着说话不腰疼"

先说大家最熟悉的 ChatGPT 和 Claude。

它们的优点是知识储备惊人 。你问它们任何一个技术问题,它们都能给出教科书式的回答。你想了解微信小程序的生命周期?它们能给你讲20分钟。你想知道云函数怎么连数据库?它们能列出五种方案并比较优劣。

但问题是:它们不干活

它们像一位博学的教授,站在讲台上给你讲课。你听完之后觉得"懂了",但一打开代码编辑器,发现还是不知道怎么下手。你能让ChatGPT写一段登录逻辑的代码,但它不会帮你把这段代码放进正确的文件位置,不会帮你配好项目结构,不会在你运行时报错的时候自动定位问题。

更要命的是上下文断层 。ChatGPT的聊天窗口是有长度限制的。当你跟它聊了20轮,前面关于项目架构的讨论可能被"遗忘"了。你得不断重复"我在做一个微信小程序"“我的技术栈是云开发”“我之前跟你说过这个房间状态机的设计”……这种重复很消耗耐心,也容易出现"AI记错了"的情况。

还有一个问题:ChatGPT给的代码往往是"理想化"的 。它假设你的项目结构是标准的、依赖都已经装好了、配置文件是对的。但现实中,外行人面对的是一个乱七八糟的项目,可能连app.json里少了个逗号都不知道。ChatGPT给的代码贴进去跑不起来,你也不知道是它错了还是你贴错了。

所以我的感受是:ChatGPT和 Claude 是很好的知识库 ,但不是很好的合作伙伴 。它们能回答"怎么做",但很难陪你一步步"做下去"。

3.2 Cursor:专业程序员的"外脑",门槛还是高

Cursor 是另一个我很期待的工具。它把AI直接嵌进了代码编辑器,能读你的项目文件,能根据光标位置生成代码,甚至能自动修改多个文件。听起来很强大。

但我实际用下来的感受是:Cursor是为会写代码的人设计的

它的强大之处在于:如果你已经知道JavaScript的语法、知道Promise和async/await的区别、知道什么是闭包,那么Cursor能帮你写得更快、更少出错。它像一个经验丰富的搭档,在你写代码的时候随时补刀。

但如果你不知道这些基础概念 ,Cursor的代码补全和自动修改会让你很慌。它突然在一堆文件里改了好几处,你根本看不懂它改了什么、为什么改。它生成的代码里如果有你不认识的语法,你不敢问它"这是什么意思",因为你连怎么描述这个问题都不知道。

举个例子:我在Cursor里试着让它帮我写一个云函数。它唰唰唰生成了一段代码,里面用了async/await。我看不懂。我问它"这是什么",它解释了一通,我还是似懂非懂。最后我决定不用这段代码,因为我不知道它会不会在其他地方引发问题。Cursor的"智能"反而成了我的负担——它太快了,我跟不上

3.3 GitHub Copilot:自动补全很强,但不会"带路"

Copilot 我用得不多,但感受很明确:它是超级自动补全工具 ,不是项目导师

你在写代码的时候,它能在你打了一半的时候猜出后半段,准确率还挺高。这种体验很爽,像是在和一个默契的搭档 Pair Programming。但前提是你已经在写了 。你得先知道要写什么,它才能帮你补完。

对于外行人来说,最大的困难恰恰是"不知道怎么开始"。Copilot 不会告诉你"这个项目应该先建哪些文件"“登录功能应该怎么拆分模块”“数据库集合怎么设计才合理”。它只在你在键盘上敲字的时候帮你加速,不会在你面对空白屏幕发呆的时候给你方向。

3.4 WrokBuddy、CatPawAI、 通义灵码 / 国内其他AI编程助手:还在追赶

我也试过几款国内厂商的AI编程工具。坦白说,它们的功能和体验还处于"能用"的阶段,离"好用"有距离。主要问题集中在:

  • 中文理解能力 :虽然界面是中文的,但对复杂的自然语言需求描述理解不够精准。我用中文描述一个投票逻辑,它生成的代码经常漏掉条件分支。

  • 上下文感知 :项目级别的理解能力较弱,经常"顾头不顾尾",改了A文件破坏了B文件。

  • 调试辅助 :出错之后给的建议往往停留在"可能是语法错误,请检查"这种层面,不会深入分析。

我体验下来,这些工具更适合作为程序员的"加速轮",而不是外行人的"学步车"。

3.5 Trae SOLO:一个愿意"蹲下来"跟你说话的AI

最后说 Trae。

用Trae的第一天,我就感觉到它和前面那些工具不一样。这种差异不是某个单一功能的差异,而是整体协作体验的差异

第一个不同:Trae 会"带路"。

我不是打开编辑器对着空白屏幕发呆,而是打开Trae的对话框,告诉它:“我想做一个微信小程序,帮助朋友决定聚餐去哪吃,应该有哪些功能?”

它没有给我一堆零散的知识点,而是直接给了我一个完整的骨架

“建议分为四大模块:1.投票决策系统 2.房间管理系统 3.用户系统 4.辅助功能。其中投票系统是核心,可以考虑支持两种模式……”

这就像一个老师傅不会先给你讲"锤子的材质分类",而是直接说"要打个柜子,你需要先备这四样木料"。它把"知识"包装成了"步骤" ,这对我是救命稻草。

第二个不同:Trae 能记住整个项目。

Trae不是聊天机器人,它是和你的项目文件深度绑定 的。你跟它说的每一句话,它都知道你当前项目的结构、你已经写了哪些文件、你之前做过什么决定。你不需要反复交代背景。

比如我在第三天跟它讨论投票页面的状态管理,到第七天我问"怎么在用户退出后恢复投票状态",它自动关联到了之前的状态设计,给出了wx.setStorageSync的方案。这种连贯性 在ChatGPT里很难实现,除非你自己做很复杂的提示工程。

第三个不同:Trae 能"看图说话"。

这个功能我在其他工具上没见过。我把UI截图直接发给Trae,问"这个配色有点单调,怎么改?“它不仅给出了具体的色值(#F5F0E8奶油白、#FF6B6B珊瑚红),还解释了"为什么用暖色调更适合聚餐场景”。后来IP形象橘仔的设计,也是靠截图对话一步步迭代出来的。

对于一个不会写代码但有审美直觉 的人来说,这种"视觉对话"能力太重要了。我不需要懂代码,我只需要说"我觉得这里不舒服",它能听懂并给出技术实现方案。

第四个不同:Trae 会"陪你debug"。

这是我用得最多的功能。开发过程中报错是常态,云函数报个错、前端页面白屏、数据没写进数据库……以前我看到报错信息就头皮发麻,完全不知道从哪里下手。

但Trae的处理方式是:你贴报错信息 → 它分析原因 → 给出修改方案 → 你照着改 → 它验证是否解决。整个过程像有一个耐心的教练站在旁边,不是替你做,而是教你做 。而且因为它能看到你的项目文件,定位问题很准,不会瞎猜。

第五个不同:Trae 能切换"沟通模式"。

这是我觉得Trae最被低估的能力。它不是一个固定性格的AI,你可以根据当前需要,让它扮演不同角色:

  • 架构师模式 :帮我拆分模块、选技术栈、设计状态管理

  • 编码助手模式 :给我写具体函数的代码、补全逻辑、写注释

  • 审查模式 :帮我检查代码有没有Bug、性能好不好、风格统一吗

  • 设计顾问模式 :看截图、给配色、建议布局

这种"多面手"能力,让Trae在项目的不同阶段都能派上用场。不像有些工具,只擅长某一环,其他环节帮不上忙。

四、从0到1的10天:Trae怎么陪我走完这条路

下面这部分,我想按时间线的方式,讲讲这10天里Trae具体帮我做了什么。不是为了罗列功能,而是想呈现一种协作感 ——一个人和AI是怎么一步步把一个想法变成现实的。

Day 1-2:立项和架构——Trae当"老师傅"

我的状态 :脑子里有一团模糊的想法,但不知道怎么变成技术方案。

Trae的角色 :架构师 + 技术顾问。

第一天的对话是这样的:

我:“我想做一个微信小程序,帮朋友决定聚餐去哪吃。”

Trae:“好的,建议从以下几个维度梳理:1.用户场景 2.核心功能 3.数据流转 4.技术选型。你想先聊哪个?”

我没有被直接丢进代码里,而是先被引导做结构化思考 。Trae问我的问题包括:

  • “用户是谁?发起人还是参与者?”

  • “投票结果需要匿名吗?”

  • “发起人是否需要最终拍板权?”

  • “除了投票,还有什么场景?比如约饭定时、拼单?”

这些问题我自己其实没想清楚。被Trae一问,我才意识到"啊对,匿名很重要,不然大家不好意思真实投票"。

两天后,我们共同确定了双模式设计:

  • 模式A「你们来定」:发起人筛店→成员海报投票→发起人拍板

  • 模式B「我来推荐」:发起人提想法→成员匿名填偏好→系统聚合→推荐餐厅

这个设计不是Trae强加给我的,是它先给了我几个选项,我选了最符合直觉的,它再帮我细化。这种"共同决策"的感觉,和"AI给我下指令"完全不同。



Day 3-4:技术选型和项目搭建——Trae当"导航仪"

我的状态 :知道要做什么,但不知道用什么做。

Trae的角色 :技术选型顾问。

我问了一个很关键的问题:“该用原生小程序,还是Taro/uni-app?”

Trae没有直接说"用原生",而是先问我的需求:

  • “你需要跨平台吗?(iOS/Android之外还有别的平台吗?)”

  • “比赛评分看重什么?”

  • “你对学习成本和时间的要求?”

然后它给了对比表:

维度 原生小程序 Taro/uni-app
云开发支持 原生专属,无额外配置 需额外适配
学习成本 WXML/WXSS/JS从零学 需要学框架+转换思维
开发周期 文档完善,社区活跃 生态成熟但配置复杂
比赛加分项 代码质量、原生能力展示 跨端能力(本项目用不上)

看完这个表,我自己就能判断了:用原生。这个决定不是我"听AI的话",而是Trae把信息结构化呈现之后,我自己做的判断 。这种体验很好,我没有被推着走,而是被陪着走。

项目搭建阶段,Trae给了我详细的目录结构建议:

miniprogram/
├── pages/
│ ├── index/ // 首页
│ ├── createRoom/ // 创建房间
│ ├── vote/ // 投票页(核心)
│ ├── roomDetail/ // 房间详情
│ └── …
├── components/ // 公共组件
├── utils/ // 工具函数
├── cloudfunctions/ // 云函数
└── app.js // 全局逻辑

它还解释了每个目录的作用,以及为什么这样拆分"对后期维护更友好"。这些信息对我这种外行人来说,就像装修房子时师傅告诉你"水管走顶不走地"——不是必须知道,但知道了以后会少踩坑。


Day 5-6:投票页面的"地狱难度"——Trae当"拆弹专家"

我的状态 :遇到了整个项目最复杂的技术挑战,差点想放弃。

Trae的角色 :深度技术搭档 + 状态管理教练。

投票页面是整个项目的核心,也是技术难度最高的部分。因为它要同时支持两种完全不同的交互模式,状态管理极其复杂。

模式A是"抖音式"的上下滑动海报投票:用户滑一张餐厅海报,喜欢就双击点赞,不喜欢就上滑跳过。需要记录:当前看到第几张、哪些点了喜欢、哪些跳过了、滑动的历史轨迹(方便撤销)、13项忌口的选择。

模式B是"两步式"分类投票:先网格选大类(火锅/日料/烧烤等,最多选3个),再swiper滑动选细类(每个大类下5个细类)。需要记录:选了哪些大类、每个大类下选了哪个细类、当前在第几步。

这两种模式的数据结构完全不同,交互逻辑也完全不同,但它们共用同一个页面。我一开始完全不知道该怎么组织代码。

我跟Trae说:“这个投票页面的状态管理太复杂了,我完全没思路。”

Trae没有直接甩给我一段代码,而是先画了一张图 (用文字描述的层级结构):

// 第一层:页面级状态
mode: ‘a’ | ‘b’ // 当前是哪种模式
currentStep: ‘category’ // 模式B的第一步还是第二步

// 第二层:模式A私有状态
posters: // 海报数据
currentIndex: 0 // 当前看第几张
likedIndices: // 喜欢的序号
vetoedIndices: // 跳过的序号

// 第三层:模式B私有状态
selectedCategoryIds: // 选中的大类ID
selectedSubCategories: {} // 每个大类对应的细类

// 第四层:通用状态
hardTaboos: // 13项忌口
swipeHistory: // 撤销历史栈
timeInfo: {} // 时间偏好

这张图的价值在于,它让我第一次看清了混乱背后的结构 。原来只要把"共用的"和"各自私有的"分开,再把"页面级的"和"数据级的"分开,复杂就变成了清晰。

然后Trae带我做了三步:

第一步:写状态管理的骨架。

Trae给我写了vote.js的核心结构,约200行。它解释了data对象里每个字段的含义,以及setData的使用规则(这是微信小程序更新UI的机制)。我逐行看,不懂的就问,Trae用比喻解释:“data就像你前台展示的账本,setData就是更新账本后让客人看到最新数字的过程。”

第二步:实现撤销功能。

这是用户体验的关键点。用户滑错了一张,或者点错了喜欢,需要能回退。

Trae引入了"历史栈"的概念:每次用户操作(滑动、点赞),就把当前完整状态拍个快照存进数组。撤销时,从数组末尾弹出一个快照,恢复到那个状态。

recordSwipeHistory(action) {
const snapshot = {
currentIndex: this.data.currentIndex,
likedIndices: […this.data.likedIndices],
vetoedIndices: […this.data.vetoedIndices]
};
this.setData({
swipeHistory: […this.data.swipeHistory, snapshot]
});
}

undoLast() {
const history = this.data.swipeHistory;
if (history.length === 0) return;

const lastState = history[history.length - 1];
this.setData({
currentIndex: lastState.currentIndex,
likedIndices: lastState.likedIndices,
vetoedIndices: lastState.vetoedIndices,
swipeHistory: history.slice(0, -1) // 移除最后一条
});
}

Trae特意提醒了我一个坑:"快照要用[…array]做浅拷贝,不能直接用引用。否则你修改当前状态时,历史记录里的旧状态也会被改掉。"这种细节,如果没人提醒,我自己根本发现不了。

第三步:状态持久化。

用户投票到一半,手机来电话了,退出小程序。再进来的时候,应该恢复之前的状态。

Trae给的方案是wx.setStorageSync,把当前房间的状态存到本地。但加了两个保护:

  1. 过期机制 :24小时后清除,防止拿过期的状态。

  2. 房间隔离 :每个房间的存储key不同,不会串。

const STORAGE_KEY = vote_state_${roomId};

saveState() {
wx.setStorageSync(STORAGE_KEY, {
…this.data,
saveTime: Date.now()
});
}

restoreState() {
const saved = wx.getStorageSync(STORAGE_KEY);
if (!saved) return false;
if (Date.now() - saved.saveTime > 24 * 3600 * 1000) {
wx.removeStorageSync(STORAGE_KEY);
return false;
}
this.setData(saved);
return true;
}

这三步走完,vote.js从0膨胀到了约1500行。这段代码我花了整整两天,和Trae对话了几十轮。但结果是:我不仅得到了能跑的代码,还理解了为什么要这样设计 。这对我后续自己改代码、加功能,至关重要。


Day 7:云函数的"暗礁"——Trae当"排雷手"

我的状态 :前端基本跑通了,但后端云函数一直提心吊胆。

Trae的角色 :后端教练 + 数据一致性守护者。

微信小程序用"云开发"做后端,好处是不需要自己搭服务器,坏处是功能相对受限。其中一个很大的坑是:没有真正的事务机制

什么是事务?简单说就是:你要同时做两件事(比如"记录用户的投票"和"更新房间的统计"),这两件事要么都成功,要么都失败。不能出现"记录了投票但没更新统计"这种半吊子状态。

传统数据库有事务保护,但微信云开发的云函数没有。这意味着,如果代码写不好,数据很容易错乱。

我第一版代码是这样的:

exports.main = async (event) => {
const { roomId, voteData } = event;

// 第一步:记录投票
await db.collection(‘participants’).add({ data: voteData });

// 第二步:更新房间统计
await db.collection(‘rooms’).doc(roomId).update({
data: { count: _.inc(1) }
});

return { success: true };
};

看起来没问题,对吧?但Trae看了一眼就说:“这里有隐患。如果第一步成功了,第二步失败了(比如网络断了),数据库里就会有一条投票记录,但房间统计没更新。发起人看到’只有5人投票’,实际上已经有6条记录了。”

我问:“那怎么办?”

Trae给的修复方案堪称"穷人大法"——既然没有事务,那就用try-catch+“手动回滚”:

exports.main = async (event) => {
const { roomId, voteData } = event;
let participantId = null;

try {
// 先检查房间是否还在投票中
const room = await db.collection(‘rooms’).doc(roomId).get();
if (!room.data || room.data.status !== ‘voting’) {
return { success: false, error: ‘投票已结束或房间不存在’ };
}

// 检查是否重复投票
const existing = await db.collection(‘participants’)
.where({ roomId, openid }).get();

if (existing.data.length > 0) {
// 已有记录,更新
participantId = existing.data[0]._id;
await db.collection(‘participants’).doc(participantId).update({
data: { vote: voteData, updatedAt: db.serverDate() }
});
} else {
// 新记录
const result = await db.collection(‘participants’).add({
data: { roomId, openid, vote: voteData, createdAt: db.serverDate() }
});
participantId = result._id;
}

return { success: true, participantId };

} catch (err) {
// 如果已经插入了记录但后续报错,尝试清理
if (participantId) {
try {
await db.collection(‘participants’).doc(participantId).remove();
} catch (e) {
console.error(‘清理失败:’, e);
}
}
return { success: false, error: err.message };
}
};

这个方案虽然不完美(极端情况下清理也可能失败),但在云开发的限制内,已经是能做到的最优解。更重要的是,Trae解释了每一步为什么要这样做 :为什么先查房间状态?为什么要检测重复投票?为什么participantId要在外面声明?

这些解释让我明白了一个原则:写云函数时,要把"最坏情况"都想一遍 。网络断了怎么办?数据重复了怎么办?房间突然被删除了怎么办?想得越多,代码越健壮。


Day 8:UI交互的"魔鬼细节"——Trae当"强迫症治疗师"

我的状态 :功能基本跑通了,但用户体验很糙。滑动不顺、点击不灵、界面呆板。

Trae的角色 :UI/UX微调师 + 交互逻辑教练。

这一天的工作很细碎,但Trae帮我解决了很多"看似小、实则关键"的问题。

问题1:swiper滑动延迟。

小程序的swiper组件有个通病:bindchange事件触发有延迟,导致用户滑到下一张了,界面还没更新状态。体验上就是"卡了一下"。

Trae的方案是"预判":在touchstart的时候记录起点,在change的时候判断方向,提前处理逻辑。

touchStart(e) {
this.startY = e.touches[0].clientY;
},

onCardChange(e) {
const newIndex = e.detail.current;
const oldIndex = this.data.currentIndex;
const direction = newIndex > oldIndex ? ‘next’ : ‘prev’;

// 提前处理状态,不要等到change事件
this.handleSwipe(direction, newIndex);
}

Trae还加了一个细节:在滑动动画期间,暂时屏蔽其他操作,防止用户疯狂滑动导致状态错乱。这种"防手贱"设计,我自己绝对想不到。

问题2:双击和单击的冲突。

投票页面上,单击海报应该放大预览,双击应该点赞。但这两个动作怎么区分?如果用户点得快,系统会误判。

Trae的方案是"300毫秒阈值":记录每次点击的时间戳,如果两次点击间隔小于300ms,算双击;否则算单击。单击不立即执行,而是等300ms,确认没有第二次点击后再执行。

onTapPoster(e) {
const now = Date.now();
const index = e.currentTarget.dataset.index;

if (this.lastTap && now - this.lastTap < 300) {
// 双击:点赞
this.toggleLike(index);
this.doubleTapped = true;
} else {
// 单击:延迟执行预览
this.doubleTapped = false;
setTimeout(() => {
if (!this.doubleTapped) {
this.previewImage(index);
}
}, 300);
}
this.lastTap = now;
}

这个代码我看了很久才完全理解。Trae用了一个很妙的比喻解释:“就像敲门,你敲一下,屋里人要等一会儿才开门,看看你是不是还要敲第二下。如果等了一下没有第二下,才确认你是单敲。”

问题3:配色和IP形象。

我把初始界面的截图发给Trae,说"感觉不够温馨"。

Trae给出了完整的色彩系统:

–bg-cream: #F5F0E8; /* 奶油白 /
–accent-coral: #FF6B6B; /
珊瑚红 /
–text-primary: #5A4A42; /
深棕 */

并且解释了为什么:“聚餐是温暖的社交场景,冷色调会让人有距离感。奶油白比纯白更柔和,珊瑚红比正红更亲切。”

橘仔(IP形象)的设计也是靠截图对话迭代出来的。我先说"想要一只猫",Trae给了方向;我说"要橘色的,胖一点",Trae调整了描述;我说"能不能有’饿晕了’的表情",Trae给了表情包建议。整个过程像和设计师聊天,而不是对着代码编辑器发呆。

Day 9-10:收尾和打磨——Trae当"质检员"

我的状态 :主要功能都跑通了,但代码很乱,Bug还有不少。

Trae的角色 :代码审查员 + Bug猎手 + 优化顾问。

最后两天,我把整个项目的代码贴给Trae,让它做"全面体检"。

Trae的审查报告分几个维度:

1. Bug扫描

它找出了三处我根本没意识到的隐患:

  • 一个页面在onUnload时没清除定时器,可能导致内存泄漏。

  • 一个云函数里用了Date.now()而不是db.serverDate(),客户端和服务端时间不一致时会出问题。

  • 一个列表页面没有上拉加载更多,数据量大了会卡死。

2. 性能建议

  • 图片懒加载:海报列表在屏幕外的图片先不加载,滑到附近再加载。

  • 数据分页:房间列表一次只拉20条,下拉到底再拉下一页。

  • 缓存策略:高德地图API调用结果缓存1小时,避免重复请求。

3. 代码规范

  • 命名不统一:有的地方用camelCase,有的地方用snake_case,Trae建议统一为camelCase(微信小程序的惯例)。

  • 注释缺失:核心函数没有注释,Trae帮我补了。

  • 重复代码:两个页面有相同的权限检查逻辑,Trae建议抽成公共函数。

这些工作很枯燥,但对项目的"健康度"很重要。Trae不会嫌烦,你让它检查一百遍,它还是一样认真。这种"无限耐心"是人类搭档很难提供的。


五、Trae的"隐藏技能":不只是写代码

上面讲的是开发流程,但Trae还有一些"隐藏技能",在关键时刻帮了大忙。

5.1 文案调性教练

「喵了个鱼」的文案风格是"猫咪化、口语化"的。这个风格不是我想出来的,是Trae建议的。

我最初用的文案很普通:“喜欢”“跳过”“报名成功”。Trae看了之后说:“你的IP是猫,为什么文案里没有猫的感觉?”

然后它给了一版:

原稿 优化稿
喜欢 想要喵
跳过 不想喵
报名成功 已喵
暂无数据 橘仔饿晕了,什么都没有
我来买单 喵大佬请客
AA制 分摊一下

这种"调性统一"的能力,说明Trae不只是在处理代码逻辑,它还能理解产品的气质和情感 。这对于非技术背景的开发者来说,是意外的收获。

5.2 合规顾问

微信小程序对个人主体有很多限制:不能有支付功能、不能有公开社区、不能获取手机号。这些规则散落在微信官方文档的各个角落,自己查很费时。

Trae直接给了我一份"合规检查清单":

  • :cross_mark: 不涉及资金交易

  • :cross_mark: 不涉及UGC公开传播

  • :cross_mark: 不涉及陌生人社交

  • :white_check_mark: 工具属性优先

  • :white_check_mark: 隐私保护指引完整

  • :warning: 地理位置收集需单独用户同意

这份清单让我在开发初期就避开了所有雷区,不需要等到提交审核被拒了再返工。

5.3 "假设性问题"引导

Trae有个很妙的习惯:它经常在回答完当前问题后,主动提出你可能没想到的问题

比如我让它写了一个投票提交的云函数,它给完代码后说:“另外,你需要考虑如果用户重复提交怎么办?如果房间已经关闭了怎么办?如果网络超时怎么办?”

这些问题我本来没意识到,但被它一提,就觉得"对啊,这确实可能发生"。这种"前瞻性"的引导,让我少踩了很多坑。

5.4 降级方案提供者

有些功能我最初想得很复杂,Trae会主动建议"先做个简单的版本"。

比如"拼单功能",我最初的设想是:用户在小程序里勾选菜单单品、计算总价、AA分摊。Trae说:“这个功能涉及菜单数据、价格计算、分摊逻辑,复杂度很高。建议先降级为’成员只决定是否参与+选哪家店,小程序不介入支付’。这样既保留了核心体验,又避开了支付合规问题。”

这个建议非常务实。我没有被"做不出来"打击,也没有被"一定要做完美"绑架,而是拿到了一个能跑起来的中间方案


六、那些踩过的坑,和Trae也帮不了的事

Trae很强,但不是万能的。有些坑,它也帮不了我。

6.1 坑1:swiper组件的硬限制

微信小程序的swiper组件有一些底层限制,比如:

  • 不能无限循环(到头了会弹回)

  • bindchange延迟无法根本消除

  • 动态增删卡片时会闪一下

这些问题不是代码逻辑问题,是组件本身的问题。Trae能做的只是"绕过",而不是"解决"。比如用touch事件预判,用cover-view覆盖避免闪烁。但终究不是完美方案。

这个经历让我明白:AI助手只能在平台能力范围内发挥,平台的硬限制,谁也突破不了

6.2 坑2:云函数没有真正的事务

前面提到的数据一致性问题,Trae给的方案是"手动回滚"。但这个方案在极端情况下也会失效——比如回滚的时候网络又断了。这时候数据库里就是脏数据,需要人工介入清理。

Trae很坦诚地告诉我:“在云开发的架构下,这是能做到的最优解。如果业务对一致性要求极高,可能需要考虑自建服务器或使用支持事务的数据库。”

这种"诚实告知边界"的态度,比盲目承诺更能建立信任。

6.3 坑3:AI理解不了的"感觉"

有些设计决策,不是逻辑问题,是"感觉"问题。

比如按钮的颜色,Trae可以给出色值,但它不知道"这个按钮在屏幕上是不是太显眼了"“和周围元素是不是协调”。这些需要开发者自己的审美判断。

再比如交互节奏:滑动动画应该0.3秒还是0.5秒?弹窗提示应该停留2秒还是3秒?这些细微的"手感",AI只能给参考值,最终还是要靠人一个一个试。

6.4 Trae帮不了的事:你必须理解自己的代码

这是最重要的一条。

Trae能帮你写代码、改代码、解释代码,但它不能替你做代码的主人 。如果你完全不懂代码逻辑,Trae改完之后你不敢用,因为它改了哪里、为什么改、改了之后会不会影响别的地方,你一无所知。

我在开发过程中养成了一个习惯:Trae给的每一段代码,我都要逐行问"这是什么意思"“为什么要这样写”“如果改一下会怎么样”。有时候Trae的解释我一遍听不懂,我就让它换种说法,或者用比喻讲。直到我真的懂了,才把这段代码合并进项目。

这个过程很慢。但正是因为慢,我才能在10天结束时,对自己的项目有基本的掌控感 。哪里出问题了,我能大概知道去哪个文件、哪个函数里找。而不是像一个完全依赖翻译的旅客,一旦翻译不在就寸步难行。

七、写给和我一样的普通人:AI协作的四个心得

如果你也是一个"有想法但不会写代码"的普通人,正在犹豫要不要用AI工具做点什么,以下是我这10天里沉淀下来的四条心得。

心得1:提问的能力,比写代码的能力更重要

和AI协作,本质上是一场"对话"。你的问题问得越清晰,AI的回答就越精准。

我总结了一个提问公式:

场景 + 需求 + 约束 + 预期输出

举例:

  • :cross_mark: 低效提问:“怎么实现投票功能?”

  • :white_check_mark: 高效提问:“我在做微信小程序投票页(场景),需要支持海报上下滑动和分类两步选择(需求),要求能撤销和本地恢复(约束),请帮我设计状态管理方案(预期输出)。”

这个公式对任何AI工具都适用。Trae之所以在我这里表现好,很大程度上是因为我学会了怎么跟它"好好说话"。

心得2:迭代,再迭代,不要一步到位

不要指望AI一次性给你完美方案。正确的姿势是:

  1. 第一轮:要骨架(架构、模块拆分)

  2. 第二轮:要核心逻辑(关键函数、状态设计)

  3. 第三轮:要错误处理(边界情况、异常分支)

  4. 第四轮:要优化(性能、代码风格、注释)

每一轮都基于上一轮的成果,逐步细化。Trae在这种迭代中表现很好,因为它能记住之前的上下文,不会"失忆"。

心得3:让AI审查,而不是只让AI写

很多人用AI编程工具只是"让它写代码",但忽略了另一个更有价值的用法:让它审查你的代码

我的做法是在每个功能模块写完之后,把完整代码贴给Trae,问:“请审查这段代码,关注:1.潜在Bug 2.性能问题 3.代码风格 4.是否符合微信小程序最佳实践。”

Trae的审查经常能发现我自己完全没意识到的问题。而且审查的过程,也是我自己学习的过程——看它指出的问题,理解"为什么这是问题",下次就能自己避免了。

心得4:截图是最低成本的沟通方式

如果你不会用专业术语描述UI问题,截图就是最好的语言

我把界面截图发给Trae,说"这里看着不舒服",它能理解我的意思,并给出具体的调整建议(色值、间距、字体大小)。这种"视觉对话"的方式,极大降低了非技术人员和AI之间的沟通门槛。


八、结语:一个中年人的10天,和一点感受

10天前,我连WXML和WXSS是什么都不知道。10天后,我做出了一个能跑的小程序。

这个变化不是因为我突然变聪明了,而是因为工具变了

Trae SOLO 没有替我思考,但它把我的思考翻译成了可执行的代码 。它也没有替我决策,但它把决策需要的信息结构化地摆在了我面前 。它更没有替我承担学习的责任,但它让学习的过程变得有引导、有反馈、有节奏

我想特别说一点:作为一个40多岁的中年人,我一开始是有心理障碍的。"学编程"这件事听起来像是年轻人的专利,我这个年纪开始,是不是太晚了?别人会不会觉得我在瞎折腾?

但Trae的存在让我意识到:门槛已经变了 。以前学编程的门槛是"记住语法、理解算法、配置环境"。现在的门槛是"能想清楚自己要什么,并能用自然语言表达出来"。后者对中年人来说,往往是优势——我们有更多生活经验,更清楚"用户真正需要什么",也更耐得住性子做迭代和打磨。

我不是在鼓吹"AI让所有人都能当程序员"。程序员的职业门槛依然很高,专业的软件工程需要深厚的技术积累。我想说的是,对于"想亲手做一个东西"的普通人来说 ,AI工具已经把"从0到1"的门槛,降到了历史最低。

最后,我想用一句话总结这次经历:

以前我觉得,不会写代码就做不了小程序。现在我发现,只要有清晰的想法和一个愿意陪你一步步走的AI,普通人也能把想法变成现实。

Trae SOLO 就是那个"愿意陪你一步步走"的AI。它不耀眼,不炫技,但它很稳。对于一个需要稳稳走到终点的人来说,这就够了。


联系方式: vx(oygq15510183555)

  • 欢迎交流,特别欢迎同样是"零基础起步"的朋友。

感谢 Trae SOLO 在这次开发中的陪伴。

也感谢那个决定"试试看"的自己。

颜值太好了,太强了大佬 :+1:

感谢阅读和表扬哈 :laughing:真心希望做个有价值、爱用的小程序

1 个赞

:+1: :+1: :+1:

写得太好了,这篇帖子本身就是一个"零基础的人用AI做出高质量内容"的最佳案例——不只是小程序,连这篇帖子都像是AI辅助写出来的(夸你文笔好:joy:)。

你提到的那个约饭场景特别真实:“一直没说话,到餐厅了才说:我不吃海鲜。”——这让我想到另一个群体:有些人不是"不说",是真的"说不了"。中风失语者连"我不吃海鲜"这六个字都表达不出来,只能沉默。

我做的是KineTap,一个帮言语障碍者一键发声的工具,171个离线短语覆盖日常场景,桌面快捷键一点就播。和你一样,我也是零基础用SOLO做的,5MB体积老人手机都能装。

你总结的心得4我特别认同——“截图是最低成本的沟通方式”。对失语者来说,KineTap就是他们的"截图":不用打字不用说话,点一下就能把想说的话"发"出去。

同为"不是程序员但用AI做出了真实可用的东西"的人,这篇帖子给我很大启发,已收藏!

2 个赞

太强了,10天就做出了小程序

1 个赞

实话说,是AI辅助写的帖子,我提供素材、要求和润色。看了你的介绍,我为你的真诚回复而感动,也特别赞同用心做好用的产品思想,而且您做的这个应用确确实实是个有温度的实用工具,替特殊人群感谢您

1 个赞

哈哈 如果不放五一假期、如果足够熟练和不完美主义应该更快 :smiling_face:吹吹牛。你也可以的

2 个赞

暂时小程序因为涉及投票功能,需要从个人迁移到企业,因为有冻结和审核时间,预计7天后可以上线使用,希望能给大家带来点便利

1 个赞

写的真好,像资深全栈程序员了

1 个赞

谢谢表扬 受之有愧 全靠AI辅助 :grin:

1 个赞