从广告到工程:构建 DIALØGUE 的技术经验总结
我从 AWS 迁移到 GCP,成本下降 92%、性能提升 10 倍——以下是我放下“最佳实践神话”,转向真正可用的务实架构后学到的事。
*这篇是我 DIALØGUE 介绍文 的技术深挖 companion。若你还没看过 DIALØGUE 是什么、以及我为什么做它,建议先从那篇开始!*
这段旅程:从广告从业者到全栈工程师
先把房间里的大象说了——对,我来自广告行业。以前是 media plan、creative brief,不是 data structures、algorithms。但有趣的是:理解系统如何运作,不管是营销漏斗还是分布式架构,本质上都需要同一种分析思维。区别在于:在工程里你搞砸时,电脑会立刻告诉你。你不用等 campaign report 才发现。haha
构建 DIALØGUE 的过程……很硬核。它不只是“写代码”(虽然代码确实写了很多),而是要搭一套复杂系统:要编排多个 AI 服务、处理异步工作流、还要在用户做出意料之外行为时别崩。下面是这段旅程真正教会我的东西——好的、崩溃的、以及“为什么没人早点告诉我?”的那些时刻。
架构决策:为什么复杂度是敌人
新手常被忽略的一件事:复杂度不是你的朋友。我是在痛里学到的。真的很痛。你可以想象我淹没在 CloudWatch logs 里,试图搞清楚为什么我“优雅设计”的系统……就是不工作。T.T
初始架构(过度复杂)
我一开始用 LangGraph 做编排。为什么?因为图结构看起来很优雅!它很灵活!它看起来很可扩展!
现实是:它非常慢。即使本地跑也慢。即使上它的 cloud deployment 也慢。那些漂亮抽象最后都变成了……开销。大量、大量开销。
最终架构(务实且简单)
经过一轮灵魂拷问(和调试)后,真正能跑的是:
```
Frontend (Next.js) → API Gateway → Cloud Run Services → Cloud Workflows → Cloud Storage
↓
Supabase (Auth + Real-time + PostgreSQL + Edge Functions)
```
注:我们在 2025 年 7 月从 AWS Lambda/Step Functions 迁移到 GCP Cloud Run/Workflows,成本下降 92%,性能提升 10 倍。
最大顿悟:当我改成直接 Supabase 查询,而不是把所有访问都再包一层 API 时,性能直接提升 10 倍(450ms → 45ms)。那些“看起来更规范”的 API layering?在这个场景里只是减速器。这种 database-first 架构后来也成为我们 GCP 迁移的基础。
AI 模型选择:别只看 hype
模型格局的现实
来聊聊 AI 模型。我基本都试过。不是“试玩一下午”的那种试,而是实打实放进真实构建流程里跑。几个月测试后(也烧掉了比我愿意承认更多的 API credits),真正可用的是:
我当前的主力栈:
- Claude(via Claude code)& Gemini 2.5 Pro(via Gemini CLI):我的核心开发双人组。能力强到已经基本替代我工作流里的其他选项。
- Claude Sonnet 4 API:驱动 DIALØGUE 的脚本生成,temperature 设为 0 以保证 JSON 可靠性
我过去用过的栈:
DeepSeek:以前我常用它调难 bug,尤其深夜排障时。但 Claude 4 和 Gemini 2.5 Pro 出来后?这些边缘问题它们也能处理,甚至更好。模型能力进化让“专用调试模型”在我工作流里变得冗余。
真正有效的方式:
有趣点在这里:每个模型单独都已经很强。Claude 在架构思考和复杂推理上很出色。Gemini 2.5 Pro?在实现落地和跨超大代码库保持上下文方面非常夸张。Gemini 2.0 到 2.5 的跃升很明显——我真的“能感觉到”差距。响应更快、1M token 上下文窗口(是的,真的),而且它真的理解我在建什么。
但真正魔法发生在:让它们互相审稿。我会让 Claude 先设计方案,再让 Gemini 审查并提出改进;或者让 Gemini 先产出实现,再让 Claude 做边界情况和架构风险分析。那种来回 critique 的过程,往往能得到单模型各自都达不到的解法。
没跑通的(即使外界很热):
- OpenAI o1/o3:大家都在聊,但在我的真实开发场景里,太慢、太贵,实际收益也没高到匹配成本。
- GitHub Copilot Workspace:理念很好,但 token 限制太容易撞天花板,做稍微大点的事就受限。
真实洞察:没人会告诉你的一个点是——不同模型“失败方式”不一样。早期 Gemini 会在某些错误上进入奇怪循环,卡住看不到问题;Claude 往往能很快指出来。但反过来,Claude 有时会把简单实现想太复杂,而 Gemini 几秒就搞定。关键不是找“唯一最强模型”,而是知道什么时候切换。
全栈开发:同一人戴多顶帽子
终端策略
这里有个非常实用、真的救过我 sanity 的习惯:不同上下文开不同终端窗口。听起来很简单?但非常有效。
```bash
# Terminal 1: Frontend Developer Me
cd podcast_generator_frontend_v2
npm run dev
# This is where I think about React components and user experience
# Terminal 2: Backend Developer Me
cd gcp_services
./deploy/deploy-service.sh [service-name]
# This is where Cloud Run services live (much happier than Lambda!)
# Terminal 3: Database Me
supabase start --workdir supabase
# Local Supabase for testing, production for real work
```
我知道听起来有点搞笑,但“身体上切换终端”真的会让大脑跟着切上下文。frontend me 和 backend me 根本是两个人,他们需要自己的空间。
跨栈沟通
单人做全栈很奇妙。你基本是在和自己开会。所以我开始给“另一个自己”留 notes:
```
// Note from Frontend Me to Backend Me
/**
* BACKEND TODO:
* - Need endpoint GET /api/podcasts/:id/segments
* - Should return: { segments: Array<{id, title, status, content}> }
* - Must handle: 404 (not found), 403 (unauthorized)
* - Real-time updates via Supabase subscription would be ideal
* - Future me will thank you for error handling!
*/
```
```
## Backend Developer Summary for Frontend Integration
Current State:
- Endpoints implemented: POST /podcasts, GET /podcasts/:id
- Authentication: Bearer token via Supabase JWT
- Real-time: Supabase channel "podcast-updates"
Next Frontend Tasks:
1. Implement podcast creation form
2. Subscribe to real-time updates
3. Handle error states (401, 403, 404, 500)
```
这些小 note 在我一周后回看代码时就是救命绳。否则我根本不知道过去的我在想什么。
关键技术收获
1. 系统思维可跨领域迁移
广告背景让我习惯系统化思考——用户路径、转化漏斗、归因模型。这些心智模型可以直接迁移到:
- 分布式系统设计
- 用户体验流程
- 性能优化
- 错误处理策略
2. Production-First 心态
# What I learned to prioritize
if works_in_production and meets_user_needs:
ship_it()
else:
fix_only_blockers()
# Perfect is the enemy of done
3. 全栈能力是真实可达的
构建 DIALØGUE 需要:
- Frontend: React 19、Next.js 15、TypeScript、实时订阅、WebSocket 管理(我修过 memory leak!)
- Backend: Python 3.12、Cloud Run(14 个微服务)、Cloud Workflows、PostgreSQL(via Supabase)
- Infrastructure: GCP(从 AWS 迁移)、API Gateway、Cloud Storage、Vercel(前端托管)
- AI/ML: Claude 4.0、Perplexity API、OpenAI TTS、temperature 优化(JSON 场景用 0)
- DevOps: Docker containers、Cloud Build、监控、JWT 安全(P-256 迁移)
- Database: PostgreSQL + RLS、Edge Functions、用于竞态条件防护的原子操作
4. 经典训练的重要性
正式的软件工程训练(系统设计、数据结构、算法)非常关键。它不仅是“让 AI 写代码”,更是你要知道该问什么、以及该如何架构。
最后想法
这一路下来,我对自己的职业身份理解完全变了。以前我是“管理技术团队的人”。现在?我可以真正和他们一起构建。而且说实话,这感觉非常好。 :D 这种演化在我 开始做原生 iOS 应用但并不懂 Swift 时继续被验证——结果发现广告能力(审美、创意方向、知道“好”是什么感觉)有时比编码能力更关键。
从广告到工程,不只是学语法和框架,而是重塑大脑:用系统方式思考、用方法论调试、并接受“你有时会为了一个丢失分号花 3 小时”(好吧 TypeScript 会抓这类错误,但你懂我的意思)。
你知道最有趣的是什么吗?广告里那套分析思维——理解用户路径、优化转化漏斗——几乎可无缝迁移到工程。区别只是,在代码里出错时电脑会立刻给你反馈,不用等 campaign 报告。直接、残酷、即时。
这个“产品”已经在线: podcast.chandlernguyen.com。它能用。还不完美,但它是我做出来的。每次修 bug、每个新功能、每个“aha!”瞬间,都在构成这段持续演进的旅程。
你有没有经历过这种职业大转向——从一个领域跳到完全不同的领域?你最意外的感受是什么?欢迎告诉我!
致敬,
Chandler
P.S:既然说到“踩坑式学习”——想看一个微小 AI 参数改动如何让我每月多花 $54 吗?看这篇 One AI Parameter Change Cost Me $54/Month。它是一个很好的警示:当你把生产代码交给 AI 助手却没明确生产约束时会发生什么。剧透:"make it work" 和 "make it production-ready" 是两种完全不同请求。
P.P.S: 我还在一边踩坑一边学工程。现在继续做 AI 应用,也继续努力不把生产环境搞挂。后面还有新故事,记得回来看看。





