AI 独立开发:设计不能等功能做完再补

Design can't wait until features are done

最近做产品,我遇到了一个很直接的问题:

功能已经做了不少,但产品特别丑。

不只是颜色、字体不好看,而是不同页面放在一起明显不是一套东西:

  • 信息层级不一样
  • 相似操作用了不同交互
  • 页面结构各做各的
  • 组件也越来越散

我当时的流程大概是:

ChatGPT/Claude 梳理需求 → Codex/Claude Code 实现 → 功能基本完成 → Claude Design 再处理设计

和 Codex 复盘时,它给我的判断是:

设计介入太晚了。

但我第一反应其实是困惑。

独立开发本来就是边做边确定。很多需求在真正实现以前,我自己都不知道最后会长成什么样。

难道为了让设计早点介入,要在开发前先完整做一遍 UX 和 UI?

后来我发现,不需要走到另一个极端。

真正的问题是:

不能等功能做完以后,才第一次认真处理体验和设计。

Coding Agent 写代码时,其实已经在替你定UI/UX

一个功能只要开始实现,就必须回答很多问题:

  • 用户从哪里进入
  • 第一眼看到什么
  • 信息怎么分组
  • 主要操作放在哪里
  • 用 modal、drawer 还是新页面
  • 用卡片、列表还是表格
  • loading / empty / error 怎么处理
  • 做完以后去哪里

如果前面没有定义,Codex 为了完成任务,只能自己选。

单看某一个页面,方案可能都说得过去。

问题是,不同页面是在不同任务、不同上下文里生成的。

最后就很容易变成:

  • 这个地方用 modal,另一个类似操作却跳新页面;
  • 这个页面全是卡片,另一个页面完全是表格;
  • 每一次都有理由,合起来却不像一个产品。

所以等功能全部完成,再让设计工具“统一一下”,有时候已经不是换颜色、调间距的问题了。

页面结构和交互本身都可能要返工。

但设计也没必要在开发前一次做完

另一边的问题也很现实。

独立开发里,很多事情确实只有做出来以后才能判断:

  • 真实内容到底有多少
  • AI 输出实际有多长
  • 用户会在哪里卡住
  • 页面放入真实数据以后挤不挤
  • 某个功能是不是真的需要存在

所以我现在不会走:

需求全部确定 → UX 全部完成 → UI 全部完成 → 开始 Coding

我更倾向于让设计分三次进入。

第一次:开发前,先把体验骨架定下来

这一步很轻,不需要完整设计稿。

谁来做:

我 + ChatGPT 为主。

如果是全新的产品,或者第一次确定整体视觉方向,会让 Claude Design 轻量介入。

先确定什么:

ChatGPT 不只是帮我写“这个功能要做什么”,还要补到体验这一层:

  • 用户来这里做什么
  • 从哪里进入,完成后去哪里
  • 最重要的信息是什么
  • 主要操作是什么
  • 有哪些 loading / empty / error 状态
  • 哪些问题还没有确定

Claude Design 如果介入,主要看更全局的东西:

  • 产品整体气质
  • navigation / app shell
  • 基本页面结构
  • 信息密度
  • 最基础的视觉方向

产出:

两个很轻的东西就够:

UX skeleton

  • User goal
  • Entry / exit
  • Primary flow
  • Information hierarchy
  • States
  • Open questions

DESIGN.md v0

  • 产品气质
  • UX 原则
  • navigation / app shell
  • layout 原则
  • 明确不希望出现的做法

它不是完整 Design System。

更像是先画几条边界,不让 Coding Agent 每次从零开始决定。

第二次:一条真实路径跑通后,正式做设计

这是我现在觉得最重要的时间点。

不是刚开始,也不是全部做完。

而是已经有一件真实的事情,可以让用户从头做到尾。

这时终于有:

  • 真实数据
  • 真实内容
  • 真实页面
  • 真实交互
  • 真实的信息密度

谁来做:

我 + Claude Design。

先基于已经运行的产品看 UX:

  • 流程顺不顺
  • 信息层级对不对
  • 用户知不知道下一步
  • 有没有不必要的复杂度

再做 UI:

  • 页面结构
  • typography
  • spacing
  • color
  • components
  • visual hierarchy

设计确定以后,Codex马上回来实现。

不然 Claude 那边已经是一套设计,Codex 还在按旧结构继续开发,很快又会分叉。

产出:

这一轮开始有比较实在的公共基础:

  • 几个代表页面
  • App shell
  • typography / spacing / color tokens
  • button / input / card / table 等基础组件
  • empty / loading / error patterns
  • 真正落进代码里的 shared components
  • DESIGN.md v1

也就是说,公共设计不是一开始凭空想出来的。

它是从真实页面里慢慢长出来的。

第三次:后面哪里变了,就让对应的工具回来

第二次结束,不代表“设计完成”。

但也没必要每改一个字段都重新找 Claude。

我现在会先判断变的是什么。

只是内容变化

例如多一个字段、少一段说明。

→ Codex 复用已有模式。

用户流程或需求变化

例如增加新入口、完成后要去新的地方。

→ 先和 ChatGPT 更新 UX skeleton。

出现新的页面或复杂交互

例如第一次出现:

  • Review AI output
  • Compare
  • Timeline
  • Complex filter
  • Bulk action

→ Claude Design 再介入,把这个新模式设计清楚。

如果以后还会反复使用,再加入 DESIGN.md 和公共组件。

页面开始越长越不像

→ Claude Design 做一次整体 design audit,再由 Codex 统一修正。

所以 DESIGN.md 也不是一次写完的

我之前会觉得:

产品都没做完,怎么可能先定义 Design System?

现在觉得,本来就不需要。

它可以分阶段长出来。

早期先定比较稳定的:

  • 产品气质
  • UX 原则
  • navigation
  • app shell
  • layout

真实页面出现后再补:

  • tokens
  • 基础组件
  • common states
  • interaction patterns

某种业务模式真的重复出现后,再抽象它。

不是先造完整 Design System 再做产品。

也不是所有页面做完以后再统一。

而是先解决真实问题,再把反复有效的解法留下来。

回头看我原来的流程:

ChatGPT 写需求 → Codex 全部开发 → Claude 最后设计

现在我会改成:

ChatGPT 把需求补到 UX 层→ Codex 先跑通一条真实路径→ Claude Design 基于真实产品做 UX + UI→ Codex 把设计基础真正落进代码→ 后面哪里发生变化,再让对应工具回来

几个 AI 工具可以分别提供产品、设计、工程能力。

但它们不会自动组成一个产品团队。

ChatGPT 没讲清楚的体验,Codex 会为了把功能做出来自己补。

Codex 已经补出来的页面结构,Claude 最后只能在上面继续改。

最后还是需要人不断判断:

现在缺的是产品判断、体验设计、视觉设计,还是实现?

所以这次“产品为什么这么丑”,最后并没有让我得出:

以后要先把设计全部做完。

反而是一个更简单的结论:

设计不用一次做完,但不能最后才开始。