我用一位架构师和 AI 打造了一个 200 万美元的平台——方法如下
去年,我们交付了一个估值 200 万美元的平台。整个工程团队?一位资深架构师和 Claude Code。没有离岸团队。没有承包商大军。只有一个深知项目方向的人,配合一个真正能写生产级代码的 AI。
我写这篇文章不是为了炒作 AI。我在炒作周期中被烧伤过够多次了。我写这篇文章是因为这个项目发生的事从根本上改变了我对团队组成、项目估算以及将深厚的架构知识与 AI 辅助开发相结合时实际可能性的看法。数字不会说谎——我们在不到 5 个月内完成了传统 6-8 名工程师大约需要 18 个月的里程碑。
让我详细讲解一下。
目录
- 项目:我们实际上在构建什么
- 为什么选择一位架构师而不是完整团队
- Claude Code 如何真正融入实际工作流
- 技术栈和架构决策
- Claude Code 做得好的地方
- Claude Code 失败的地方以及我们的应对方案
- 经济学:成本分解和投资回报率
- 考虑采用 AI 加速开发的团队经验教训
- 常见问题
项目:我们实际上在构建什么
我不能说出客户名字——保密协议的限制——但我可以描述这个平台。这是一个物流领域的 B2B SaaS 产品。多租户架构。实时跟踪仪表板。跨越组织、团队和个人用户的复杂基于角色的访问控制。与 14 个不同第三方 API 的集成(承运人、支付处理商、海关数据库)。客户面向的门户网站和内部管理系统。
这是一个典型的项目,在传统代理机构的设置中,你会配置一个技术主管、2-3 名资深开发人员、几名中级开发人员、一个专职 DevOps 人员和也许一个 QA 工程师。客户从另一个代理机构获得的原始估价是 20 个月内 320 万美元,团队规模为 9 人。
我们提议了 200 万美元、5 个月、一位架构师。他们认为我们疯了。老实说?我也有点这么想。
为什么选择一位架构师而不是完整团队
这是关于小团队的反直觉之处:9 人项目的沟通开销是巨大的。Fred Brooks 在 1975 年写过这个,现在仍然成立。有 9 名工程师,你有 36 个潜在的沟通渠道。会议成倍增加。合并冲突成为日常仪式。总有人在等待别人的 PR 审查而被阻止。
有一位架构师,整个系统状态存在于一个人的脑子里。从 PR 中解释你的方法没有上下文切换的税收。没有设计委员会。没有两小时的冲刺规划会议。
但一个人只能打字这么快。一个人只能在工作记忆中容纳这么多文件。一个人在晚上 6 点变得疲倦,在晚上 8 点犯错误。
这就是 Claude Code 的用武之地。不是作为架构师的替代品,而是作为力量倍增器。架构师做每一个决定。Claude Code 以否则需要 4-5 名开发人员的速度执行。
架构师的角色
我们的架构师——让我们称他为 Marcus——有 15 年的经验。他曾在这个规模的系统中工作。他在这个项目的工作是:
- 系统设计和架构决策
- 定义模块边界和数据契约
- 编写关键路径代码(身份验证、支付处理、数据管道编排)
- 审查和完善 Claude Code 生成的所有内容
- 基础设施和部署架构
- 安全审计
他没有做的是:编写样板 CRUD 端点、从设计中构建 UI 组件、为直接逻辑编写单元测试、创建数据库迁移或构建新服务。Claude Code 处理所有这些。
Claude Code 如何真正融入实际工作流
让我具体说明"使用 Claude Code"在日常工作中实际上是什么样子,因为营销材料没有捕捉到现实。
Marcus 每天早上开始时,会以结构化的方式定义工作。不是模糊的提示,比如"给我构建一个用户管理系统"。相反,他会创建我们开始称之为"架构简报"的东西——详细文档,指定:
- 模块的职责和边界
- 具有确切字段类型和关系的数据模型
- API 契约(端点、请求/响应形状)
- 业务规则和边界情况
- 错误处理期望
- 它需要与哪些现有模块集成
然后他会分块将这些输入给 Claude Code。一个典型的会话看起来像这样:
# Marcus 会使用 Claude Code CLI 在项目目录中工作
# 首先,建立上下文
claude "读取 /src/modules/shipment/ 和 /src/lib/database/schema.ts。
我需要你在构建发票模块之前理解现有的模式。"
# 然后,使用架构简报的实际构建指令
claude "按照 /docs/briefs/invoicing.md 中的架构简报构建发票模块。
遵循与发货模块相同的模式用于服务层、存储库层和路由处理程序。
使用现有错误处理中间件。为服务层中的所有业务逻辑编写测试。"
Claude Code 随后会生成模块——通常是 15-30 个文件,包括类型、模式、服务、存储库、路由处理程序、中间件和测试。Marcus 会审查输出,做出更正,并进行迭代。整个中等复杂性模块的周期大约需要 2-3 小时,而不是资深开发人员需要的 2-3 天。
迭代循环
这里是没有人告诉你的关于 AI 辅助开发的事情:第一次输出很少是生产就绪的。它可能只有 70-80% 的距离。但剩余的 20-30% 是架构师的专业知识最有意义的地方。
Marcus 开发了一个节奏:
- 生成 — Claude Code 生成初始实现
- 审查 — Marcus 阅读每个文件,标记问题
- 改进 — 反馈给 Claude Code 的具体更正
- 硬化 — Marcus 手动处理安全关键部分
- 测试 — 运行生成的测试,添加 Claude 遗漏的边界情况
这个循环通常对每个模块进行 2-3 个周期。到项目的第三个月,Claude Code 生成的首次代码更接近 85-90% 的生产就绪,因为代码库有足够的建立模式供其遵循。
技术栈和架构决策
我们特意选择了技术栈以最大化 AI 辅助生产力:
- Next.js 14(App Router) — 用于客户门户和管理仪表板
- Node.js with Fastify — 用于 API 层(与 Next.js 分离)
- PostgreSQL — 主数据库
- Redis — 缓存、会话管理、实时 pub/sub
- Drizzle ORM — 类型安全的数据库访问
- Turborepo — Monorepo 管理
- Vercel — 前端部署
- AWS(ECS Fargate) — API 和后台工作人员
我们之所以选择 Next.js 是因为模式已经成熟,Claude Code 对 App Router 约定有深入的训练数据。这比人们想象的更重要。如果我们选择了像基于 Rust 的后端配合 HTMX 这样的奇特东西,AI 输出质量会大幅下降。
Drizzle ORM 是本项目超过 Prisma 的刻意选择。Claude Code 生成更好的 Drizzle 模式,因为它们就是 TypeScript——没有自定义 DSL 可能出错。另外,当你快速生成大量模式变化时,迁移故事更简单。
// 示例:Claude Code 首次生成了这个发票模式
// 需要最小更正
import { pgTable, uuid, varchar, decimal, timestamp, pgEnum } from 'drizzle-orm/pg-core';
import { relations } from 'drizzle-orm';
import { shipments } from './shipments';
import { organizations } from './organizations';
export const invoiceStatusEnum = pgEnum('invoice_status', [
'draft', 'pending', 'sent', 'paid', 'overdue', 'cancelled', 'refunded'
]);
export const invoices = pgTable('invoices', {
id: uuid('id').primaryKey().defaultRandom(),
organizationId: uuid('organization_id').notNull().references(() => organizations.id),
shipmentId: uuid('shipment_id').references(() => shipments.id),
invoiceNumber: varchar('invoice_number', { length: 50 }).notNull().unique(),
status: invoiceStatusEnum('status').notNull().default('draft'),
subtotal: decimal('subtotal', { precision: 12, scale: 2 }).notNull(),
taxAmount: decimal('tax_amount', { precision: 12, scale: 2 }).notNull().default('0'),
totalAmount: decimal('total_amount', { precision: 12, scale: 2 }).notNull(),
currency: varchar('currency', { length: 3 }).notNull().default('USD'),
dueDate: timestamp('due_date', { withTimezone: true }).notNull(),
paidAt: timestamp('paid_at', { withTimezone: true }),
createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),
});
export const invoiceRelations = relations(invoices, ({ one, many }) => ({
organization: one(organizations, {
fields: [invoices.organizationId],
references: [organizations.id],
}),
shipment: one(shipments, {
fields: [invoices.shipmentId],
references: [shipments.id],
}),
lineItems: many(invoiceLineItems),
}));
Claude Code 做得好的地方
让我们具体一点。这是 Claude Code 真正加速开发的地方:
样板和 CRUD 操作
这是显而易见的。生成 REST 端点、请求验证模式(我们使用了 Zod)、响应序列化器、基本服务方法——Claude Code 在几分钟内完成了这些。在整个项目中,我们估计大约有 180 个 API 端点。也许其中 140 个是标准 CRUD 或查询操作,Claude Code 生成了最小的修改。
测试生成
Claude Code 在整个项目中编写了大约 2,400 个测试。它们都完美吗?不。大约 15% 需要重大返工。但让 85% 的测试套件生成并工作是一个巨大的时间节省。Marcus 将他的测试精力集中在集成测试和 Claude Code 无法预见的复杂边界情况上。
UI 组件开发
客户门户有大约 60 个独特的页面视图。对于每一个,Marcus 会提供 Figma 设计参考和 API 契约,Claude Code 会生成 React 组件、用于数据获取的钩子(我们使用了 TanStack Query)、带有 React Hook Form + Zod 的表单处理,以及加载/错误状态。输出始终很好——也许首次生成时 75% 像素完美。
数据库迁移和模式演变
当需求演变时(它们总是这样),Claude Code 顺利处理了模式迁移。描述你需要的变化,它生成迁移文件,更新模式,更新受影响的查询,并调整 TypeScript 类型。曾经是一个 45 分钟的仔细重构会话变成了一个 10 分钟的审查批准周期。
文档
Claude Code 生成了 API 文档、内联代码注释、README 文件,甚至运维文档。Marcus 会审查和调整,但基线输出是真正有用的。我们最终获得了比 90% 我见过的项目更好的文档,仅仅因为生成成本太低。
Claude Code 失败的地方以及我们的应对方案
这部分比成功故事更重要。如果你计划这样使用 AI,你需要知道墙在哪里。
具有多个依赖关系的复杂业务逻辑
发货路由引擎——需要同时考虑承运人可用性、成本优化、海关要求、交付窗口和容量限制——超出了 Claude Code 的良好处理能力。它会生成看似合理的东西,但有可能花费真实金钱的微妙逻辑错误。
Marcus 手工编写了这个模块。花了大约两周。这正是证明拥有资深架构师而不是尝试通过 AI 解决所有问题的工作类型。
安全关键代码
我们从未在没有逐行审查的情况下相信 Claude Code 处理身份验证流、支付处理或加密。幸好——它偶尔会生成技术上功能性的 JWT 验证,但遗漏了边界情况,比如令牌过期时钟偏差,或在数据库查询之前没有正确清理输入,尽管使用了 ORM。
经验法则:如果这段代码中的错误可能会亏损或暴露数据,人类编写并且另一个人审查。
长期架构一致性
到第三个月,代码库足够大,Claude Code 有时会"忘记"更早建立的模式,即使提供了上下文。它可能在一个模块中使用不同的错误处理方法,而在另一个模块中使用不同的方法。Marcus 必须警惕地捕捉这些不一致。
我们通过维护一个活跃的"约定"文档来缓解这个问题,该文档包含在每个 Claude Code 会话中。把它想象成风格指南,但用于架构模式。
性能优化
Claude Code 生成有效但不一定快速的代码。进行 N+1 获取的数据库查询。不必要地重新渲染的 React 组件。加载超过需要的数据的 API 端点。
Marcus 花费大约 20% 的审查时间在性能优化上。不是交易破坏者,但需要计入预算中。
经济学:成本分解和投资回报率
这是每个人都想看的部分。真实数字。
| 成本类别 | 传统团队(估计) | AI 加速(实际) |
|---|---|---|
| 工程工资(18 个月 / 5 个月) | $1,890,000 | $175,000 |
| Claude Code API / 订阅 | $0 | $12,400 |
| 基础设施(开发/登台) | $48,000 | $8,200 |
| 项目管理 | $216,000 | $0* |
| QA / 测试 | $180,000 | $22,000** |
| 设计(外包) | $120,000 | $95,000 |
| DevOps / 基础设施设置 | $96,000 | $35,000 |
| 总计 | $2,550,000 | $347,600 |
Marcus 使用 Linear 自我管理任务跟踪。无 PM 开销。
*在最后 6 周签订了一个 QA 专家。
Claude Code 成本分解为每月大约 $2,500。这是 Max 计划(订阅 $100/月)加上扩展会话的 API 成本。有些日子 Marcus 会在重型生成会话中消耗 $150-200 的 API 调用。大多数日子是 $40-80。
该项目以 200 万美元的价格计费。我们的总交付成本低于 $350,000。我让你做一下利润数学。
速度对比
| 里程碑 | 传统时间表 | AI 加速时间表 |
|---|---|---|
| 架构与设计 | 6 周 | 3 周 |
| 核心平台(身份验证、多租户、基础 API) | 10 周 | 3 周 |
| 功能开发(所有模块) | 32 周 | 10 周 |
| 集成(14 个第三方 API) | 12 周 | 4 周 |
| 测试 & QA | 8 周 | 3 周 |
| 部署与硬化 | 4 周 | 2 周 |
| 总计 | 72 周 | 25 周 |
考虑采用 AI 加速开发的团队经验教训
在这个项目之后,我一直在思考这对我们未来如何构建软件意味着什么。这是我会告诉任何考虑这种方法的团队或代理机构的。
你仍然需要一位资深架构师。也许比以往更多。
AI 不消除对专业知识的需求——它放大了你带来的任何专业知识(或缺乏)。使用 Claude Code 的初级开发人员将更快地交付初级质量代码。使用 Claude Code 的资深架构师将以以前不可能的速度交付资深质量代码。
最坏的情况是一个认为自己是资深的中级开发人员使用 AI 生成他们无法正确评估的代码。这是代码库表面看起来很好但在负载下崩溃的方式。
约定优于配置,到处都是
你的代码库的模式越可预测,AI 的表现就越好。我们在每个模块中使用相同的文件结构、命名约定和代码组织。当 Claude Code 学会匹配现有模式时,这种一致性支付了巨大的股息。
如果你正在使用 headless CMS 架构,对内容类型、API 路由和组件结构有严格的约定使 AI 生成的代码大幅更可靠。
投资于架构简报
Claude Code 输出的质量与 Marcus 的架构简报的质量直接相关。模糊的指令生成模糊的代码。有明确数据模型、业务规则和集成要求的详细简报生成接近生产就绪的代码。
我们估计 Marcus 花费了他时间的大约 30% 编写架构简报和审查输出,而 70% 传统团队会花费在实际实现上的时间由 Claude Code 处理。
AI 辅助开发改变定价模式
如果你是一个代理机构,这是不舒服的对话。当一位架构师可以交付过去需要 8 个人的东西时,你如何定价?我们相信基于价值的定价——客户为成果付费,而不是工时。平台价值 200 万美元,无论是 1 人还是 10 人花费时间构建。
并非每个项目都适合这个模式
这有效是因为:
- 需求明确定义(物流是一个成熟的领域)
- 我们有真正的资深架构师可用
- 技术栈是主流(很好的 AI 训练数据)
- 客户信任我们交付而不微管理团队规模
具有模糊需求、重型 R&D 组件或专业领域(医疗设备、具有监管要求的金融工具)的项目需要更多人工判断,应该相应地配置人员。
对于使用像 Astro 这样的框架构建的项目,生态系统较新,AI 训练数据较薄,与 React/Next.js 项目相比,你会看到 AI 工具的加速较少。
常见问题
对于重型开发使用,Claude Code 每月实际花费多少?
在这个项目上,我们平均每月 $2,500。Claude Max 订阅是 $100/月(或截至 2025 年初 $200/月,用于更高的层级),API 使用费取决于你生成多少代码。重型日子达到 $150-200 的 API 成本。轻型审查和改进日子是 $40-80。Anthropic 还在 $200/月推出了 Max 计划,包括可以降低可变成本的大量使用。
初级开发人员能否以相同方式使用 Claude Code?
不能,这很重要。Claude Code 放大你现有的技能水平——它不能替代架构知识。初级开发人员使用 Claude Code 会更快地生成代码,但他们不会捕捉资深工程师立即发现的微妙错误、安全问题、性能问题或架构不一致。你需要有人能够评估输出,而不是仅接受它。
代码质量如何——AI 生成的代码可维护吗?
这完全取决于你给它的约束。我们的生成代码通过了与人工编写代码相同的 linting 规则、类型检查和代码审查标准。诀窍是在项目早期建立强大的模式,以便 AI 有好的例子遵循。我们维护了一个在每个 Claude Code 会话中包含的活跃"约定"文档。上线后六个月,维护平台的团队没有报告任何异常维护负担。
这种方法对前端繁重的项目有效吗?
是的,有警告。Claude Code 在生成 React 组件、表单处理、数据获取钩子和状态管理代码方面很出色。它在从设计中生成像素完美的 CSS 布局方面不太可靠——你需要更多的迭代周期用于视觉抛光。我们发现它在首次生成 UI 时的准确率约为 75%,相比后端代码为 85-90%。
只有一个开发人员时,如何处理代码审查?
Marcus 本人审查了每一行 AI 生成的代码。我们还在项目期间带入了一个承包安全专家进行两次重点审计会议(第 12 周和第 22 周)。在最后阶段,一个 QA 专家加入了六周。缺乏同行代码审查是真正的风险——我们通过自动化工具(TypeScript 严格模式、激进规则的 ESLint、覆盖阈值的 Vitest)和外部审计来缓解它。
当 Claude Code 生成错误代码时会发生什么?
这定期发生。第一次通过很少是完美的。我们将这个期望融入工作流——生成、审查、改进、硬化。大多数错误在 Marcus 的审查周期中被捕捉。自动化测试套件(也主要是 AI 生成但经人工审查)捕捉回归问题。关键是调试 AI 生成的代码比从头开始编写正确的代码更快,因为你从基本上正确的东西开始。
这只对 greenfield 项目可行,还是对现有代码库有效?
Claude Code 实际上对现有代码库有效,因为它可以读取并理解现有的模式。在这个项目上,后期模块受益于将早期模块作为参考。我们之后在现有客户项目上使用 Claude Code 进行功能添加,取得了很好的成果。关键是给它足够的关于现有约定和模式的背景。如果你的代码库不一致或文档记录不良,AI 生成的添加将继承该不一致。
你会再做一次吗?
绝对会。我们已经在这样做。两个更多项目目前以这个模式运行——一个有单个架构师,另一个有两个工程师用于更复杂的系统。经济学太引人注目了,不能忽视。但我想澄清:这不是关于替换开发人员。这是关于改变资深架构师到输出的比率。你仍然需要人类专业知识。你只是需要更少的人类打字。如果你考虑一个项目并想探索这个模式可能看起来像什么,请随时联系我们——我们很高兴讨论它是否合适。