当Vibe Coding从概念变成生产力:150元token、一个独立开发者、三天三夜,跑通个人+家庭+旅行三合一的记账App。

引子:为什么一个Java后端跑去写SwiftUI?

说起来挺魔幻的。

上个月被Karpathy那篇"Vibe Coding"文章刷屏,我当时的反应和大多数人一样——“这不就是高级点的对话式编程吗?真能写出能上线的代码?”

直到我自己动手做了知途记账

我做这件事的动机很朴素:市面上找不到一个能同时搞定个人记账 + 家庭协作 + 旅行AA的App。个人记账我用随手记,家庭账本和老婆用Excel,旅行AA全靠群收款——三个场景三套系统,月底对账像在做审计。

于是我想,既然没有,为什么不自己做一个?而且,就用最近大火的Vibe Coding来做。

结果出乎意料:一个周末,外加一个晚上,成品跑通了。

这篇文章不吹嘘AI多厉害,而是把这个过程里真实的翻车、补锅、取舍全写出来。希望对想用AI做产品的独立开发者有用。

一、工具链选型:为什么是Claude Code + DeepSeek?

先说结论:这套组合是目前性价比最高的AI编程方案,没有之一。

  • Claude Code:Anthropic推出的IDE插件(对标Cursor),代码生成质量稳,尤其擅长理解多文件上下文。我用的是付费版($20/月),但就这两天消耗的token折算下来大概130块。
  • DeepSeek:国产大模型,API价格是GPT-4的零头,中文理解极好,用来做AI消费分析和旅行手账生成,单次调用成本不到0.01元。

技术栈更"分裂"一些:

  • 后端:Spring Boot 3.x + MongoDB + Redis
  • 前端H5:Vue3(用于免登的旅行账本页面)
  • iOS:SwiftUI(纯原生,为了隐私和流畅)

全程我扮演"产品经理+架构师+测试",代码核心逻辑由AI生成,但我得负责把控方向和兜底

二、两天四阶段:从零到能跑

第一天上午:个人账本(最顺利的部分)

开局很顺。我先让Claude Code生成Spring Boot骨架,配置Spring Data MongoDB、Spring Security、JWT。

第一个Prompt很简单:

“帮我设计用户表、个人账本表、收支记录表,支持多币种,汇率调用外部API。”

AI生成了对应的Document模型和Repository接口,还有最基础的CRUD。接着我让它写首页聚合接口——今日消费汇总、近七日趋势、最近10条记录——2小时,一次过。

唯一翻车是汇率换算:AI默认用double做乘法,我贴了报错给它:“BigDecimal不能和double直接运算”,它秒改成了multiply(BigDecimal.valueOf(rate))

Vibe Coding第一条心法:把报错当成燃料喂给AI。

第一天下午:家庭账本(协作逻辑开始复杂)

家庭账本的核心需求是"邀请制 + 双向确认 + 共同记账":

“用户可以创建家庭账本,输入配偶邮箱,系统发邮件邀请。配偶登录后接受邀请,双方都能记账和看报表。删除账本需要双方确认,否则30天后自动软删除。”

这个Prompt下去,AI生成了邀请记录表、邮件服务(JavaMail)、定时清理任务(@Scheduled)。功能逻辑基本正确,但有一个关键缺陷:邀请链接安全。

AI用的是UUID.randomUUID()生成邀请码,我改成AES加密+时间戳生成短链,这部分代码来回改了三版才满意。这是AI的典型弱点——它会给你"能用"的方案,但不一定是"安全"的方案。

Vibe Coding第二条心法:AI解决的是"有没有",人类负责的是"好不好"。

第二天上午:旅行账本 + AA算法(最硬核的部分)

旅行账本是这个App最复杂的功能,涉及三个难点:

难点1:免登录加入

需求是"创建者添加成员名字→生成链接→分享到微信群→任何人点开选择自己→直接记账,全程不需要注册。"

AI第一次给的方案是内存Map存临时用户,我指出"多实例部署会丢",它改成JWT+Redis。但Redis配置是我自己写的——因为AI不熟悉我的基础设施环境

难点2:多币种分摊

旅行中有人用人民币付、有人用美元付,记账时按当时的汇率换算成统一货币。这个逻辑AI一次过,用了免费的exchangerate-api.com,还包了缓存层(每小时刷新一次)。

难点3:贪心算法最小化转账次数

这个环节AI翻车了。

它第一次生成的算法是遍历所有人,计算差额后直接给出"A转B 100元,B转C 50元"——结果正确,但转账次数不是最优的。

我给它的纠正Prompt是:

“用贪心策略:先计算每个人的净应收/应付,然后每次找最大的债权人和最大的债务人相互抵消,直到全部清零。这能保证转账次数最少。”

AI重新实现后,我手工验证了几个案例(4人、5人、有0余额成员),结果全对。

Vibe Coding第三条心法:算法类的需求,必须给出明确的伪代码或策略描述,AI自己"悟"不出来。

难点4:AI旅行手账

调用DeepSeek API,传入该旅行账本的所有消费记录,生成一段带人设标签的趣味消费故事。

这个Prompt我调了最久(大概调整了5版),最终模板是:

“你是一个有趣的生活观察家。根据以下旅行消费记录,生成一段200字的消费手账,包含:给付款人一个有趣的人设标签(如’火锅消灭者’),总结消费特点,给出下次旅行的小建议。用emoji点缀。”

DeepSeek的中文生成质量很自然,而且成本极低(一次调用不到1分钱)。

第二天下午:联调 + 上线

最后用Xcode连上iPhone,跑SwiftUI客户端。UI全部由Claude Code生成,我只描述了"类似微信账单的卡片列表",它就能生成可用的List+Card样式。

**但UI细节是个无底洞。**AI生成的界面能用,但间距、颜色、字体大小都不够精致。这部分我花的时间比预期多——因为每次让AI调样式,它只改局部,整体感还是不够。后来我直接给了设计稿(Figma导出的标注),让AI按标注生成,才解决了。

三、费用复盘:150元到底花在哪?

项目 费用
Claude Code API 0元(反复修改+大上下文)
DeepSeek API 约150元(手账生成+消费分析测试)
云服务器 199元
苹果开发者 688元
其他(邮件服务免费额度) 0
合计 约1050元

纯AI token费大概150元,其他是基础设施。这个成本远低于雇一个初级程序员写两天代码,但质量需要人工把关。

四、踩坑合集(希望你避开)

  1. AI不懂事务边界:多表操作(同时插入记录和更新余额)AI默认不加事务,我手动加了@Transactional

  2. SwiftUI Preview是魔鬼:Claude生成的SwiftUI代码经常在Preview中崩溃,后来我改为直接跑真机模拟器,预览只用来检查粗粒度布局。

  3. AI不擅长性能优化:报表接口没建索引,我手动加了(userId, date)复合索引,查询速度从2秒降到50ms。

  4. 安全是第一道防线:JWT密钥、数据库密码这些,AI会写死在配置文件里,必须改成环境变量注入。

  5. Prompt要具体到"伪代码级别":对贪心算法、AES加密这类逻辑,不给"做什么",而是给"怎么做"的描述,AI才能精准输出。

五、知途记账的架构与核心代码

这部分分享一些实际落地的技术细节。

数据模型设计

个人账本直接关联userId,家庭账本通过familyMember表关联多个用户,旅行账本则用临时travelerId(Redis缓存)+ JWT token实现免登。

关键表结构(MongoDB Document):

PersonalLedger: { userId, records: [{ amount, category, note, recordAt, currency }] }
FamilyLedger: { familyId, members: [{ userId, role, joinedAt }], records: [...] }
TravelLedger: { travelId, travelers: [{ name, token, isPaid }], records: [...], settled: bool }

AA算法的核心实现(Java伪代码)

public List<Transfer> settle(TravelLedger travel) {
    // 1. 计算每个人的净应收/应付
    Map<String, BigDecimal> balances = new HashMap<>();
    for (TravelRecord r : travel.getRecords()) {
        balances.merge(r.getPayer(), r.getAmount(), BigDecimal::add);
        for (Traveler t : r.getSharedWith()) {
            balances.merge(t.getName(), r.getAmountPerPerson().negate(), BigDecimal::add);
        }
    }
    
    // 2. 分出债权人和债务人
    PriorityQueue<Balance> creditors = new PriorityQueue<>(Comparator.reverseOrder());
    PriorityQueue<Balance> debtors = new PriorityQueue<>();
    // ... 填充两个堆
    
    // 3. 贪心抵消
    List<Transfer> transfers = new ArrayList<>();
    while (!creditors.isEmpty() && !debtors.isEmpty()) {
        Balance c = creditors.poll();
        Balance d = debtors.poll();
        BigDecimal amount = c.amount.min(d.amount.abs());
        transfers.add(new Transfer(d.name, c.name, amount));
        // 剩余部分放回堆中
        if (c.amount.compareTo(amount) > 0) creditors.offer(...);
        if (d.amount.abs().compareTo(amount) > 0) debtors.offer(...);
    }
    return transfers;
}

AI手账的Prompt工程(精简版)

public String generateTravelStory(TravelLedger travel) {
    String prompt = """
        你是一个有趣的生活观察家,擅长用幽默的方式总结旅行消费。
        以下是本次旅行 %s 的消费记录:
        %s
        请生成一段200字左右的消费手账,包含:
        1. 给最活跃的付款人一个有趣的人设(如"火锅消灭者")
        2. 消费特点和亮点
        3. 下次旅行的小建议
        用emoji点缀,语气轻松愉快。
        """.formatted(travel.getName(), formatRecords(travel.getRecords()));
    
    // 调用 DeepSeek API
    return deepSeekClient.chat(prompt);
}

六、总结:Vibe Coding不是银弹,但值得拥抱

如果非要给这次经历一个评价,我会说:Vibe Coding极大地降低了"把一个想法变成可运行软件"的门槛,但它没有消除"把软件做好"所需要的能力。

哪些能力依然重要?

  • 架构设计能力:知道哪些模块放AI生成、哪些必须人工写。
  • 安全判断力:识别AI代码中的安全漏洞(SQL注入、密钥硬编码)。
  • 领域知识:知道AA算法应该是贪心而不是暴力枚举。
  • 产品审美:AI写的UI能用但不好看,得有人把关。

但抛开这些,一个周末就能做出功能完整的全栈应用,放在两年前是完全不可想象的。

如果你也是一个独立开发者,或者想自己折腾点东西,我强烈建议你试试这套组合。先跑通、再打磨、再上线——Vibe Coding加速的是"跑通"这一步,后面的路还是得你自己走。


如果你对技术细节有疑问,或者也在用AI做产品,欢迎在评论区交流。


本文首发于CSDN,作者是位肝完代码后黑眼圈很重的独立开发者。转载请保留原文链接。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐