Building in Public2026年3月13日

2 个月前玩笑说要成为全栈,如今,成真了

代码可以让 AI 写,但每一个决策都是我做的。一个前端开发者如何在 2 个月内成为全栈——靠的是判断力,不是语法。

01

俩月前,在打通了和后端的握手后,我发布了这样的一篇文章,标题是,「有了 Supabase,前端可以原地秒变全栈了(附打通教程)」。

然后呢,2 个月后,真的成真了。我,真的成了全栈。

但你要问我写了多少后端代码?

一行都没写。

02

代码是 CC 写的。但每一个决策,是我做的。

这 2 件事,我想说清楚。

做支付系统,难的不是把代码跑起来,难的是知道哪里会出问题,为什么会出问题,出了问题往哪里找。这些判断,AI 不会主动告诉你,是我自己在真实的问题里逼出来的。

来 3 个例子。

03

我质疑了数据库设计。

有一天我在看数据库,发现 profiles 表里有三个字段专门存订阅状态——订阅是否有效、订阅计划、订阅到期时间。我的第一反应是,「这些不是都能从订阅表查到吗?为什么要在这里重复存一遍?

我去测试了一下。删掉一条有效订阅,再去看 profiles 表,里面的订阅状态还是显示「有效」。

数据不一致了。

后来查代码,确认了这三个字段在整个项目里完全没有用到,是死代码。它们存在的唯一效果,就是在关键时刻给你一个错误的数据。

我没有写发现这个问题的代码,但我看到了问题在哪里,用实际测试证实了它,然后把它干掉了。

04

我从产品角度推翻了技术方案。

PayPal 支付失败的时候,AI 给的方案是:只记录日志,不更改订阅状态,因为 PayPal 还会自动重试。

我说不对。「支付失败就应该是 past_due,该支付的没支付,这是事实。」

然后我给出了状态流转的完整链条——

支付失败 → past_due → 如果继续不处理 → expired。

这不是工程思维,是产品思维。

past_due 状态的意义是告诉用户「你有一笔钱没付,去更新付款方式」。

如果等到 PayPal 重试三次失败之后再改状态,用户根本不知道发生了什么,等收到「订阅已停止」的通知,已经晚了,体验也极差,是吧。

技术上「重试机制」没有错,但用户体验上「及时告知」更重要。这个判断,是我做的。

后来业务逻辑又迭代了一次,past_due 直接走 expired——但那,是另一个故事了。

05

我追着一个问题问了三层。

升降级判断逻辑用的是一个抽象打分公式:tier × 10 + cycle(年/月)。所以 pro 年付 = 22分,max 月付 = 31分,系统判定 pro年 → max月 是「升级」。

我看了界面,觉得不对劲。

「我选了 pro 年的,现在选 max 月的,界面上显示升级……这不对吧?年付收费高,max 月付明显更便宜啊。」

我没有被抽象的评分体系糊弄,直接回到最朴素的商业直觉——用户少花钱了,那就是降级。于是把整个打分公式砍掉,改成直接比较实际价格。

但我没停在这里。

我又问了一层,「行业里普遍的做法是什么?允许年付中途切月付吗?」

查完之后发现,大多数 SaaS 不允许年付中途切月付——年付有折扣,退款计算复杂,支付平台升降级容易出问题。对我来说,想清楚的瞬间就是行动的时刻,于是,拍板加了拦截。

一个只管修 bug 的人,会停在第二层——价格比较逻辑改好了,收工。

但第三层才是真正重要的——这种操作,到底该不该被允许?

这是产品策略问题,不是代码问题。

从我这么多年的从业经验来看,永远是策略决定执行,而不是反过来。代码写得再漂亮,方向错了,全部推倒重来。

06

我想主动说出来,不想回避——这两个月,代码几乎全是 CC 写的,CC 确实帮我干了不少活。

但我知道每一行代码为什么要这么写?以及,出了问题,我知道去哪找。遇到边界情况,我能判断怎么处理。

以前「会后端」的定义是会写代码。我觉得这个定义正在变——能判断、能决策、能把系统跑通、出了问题能找到根因,这才是核心。代码只是执行层。

我没有写代码,但我指挥了整个系统的建造。就像一个建筑师,不需要自己砌砖,但他需要知道每一面墙为什么在那里,如果拆掉会怎样,如果地基有问题往哪里看。

07

俩月前随口说了一句「前端可以原地秒变全栈」。

现在,它成真了。

我从高中就会设计,我是前端,作为一个 BUG 中间件,所以,我懂审美和用户体验,我能做产品决策,在公司时这点也常被领导认可,我把整个支付系统跑通了,我还会搞服务器后台,阿里云部署也在 2 天学会,并提交代码自动部署 2 个域名,等等,这不是运维的工作么,哈哈。

接下来,我还要做一件从来没认真做过的事——把它卖出去。

「前端」这个岗位,大概已经装不下我了。