核心价值: 一人公司最大的风险不是技术,而是做错了需求。本章讲如何用 AI + 结构化思维做产品设计。


1.1 一人公司的需求陷阱

三大常见错误

❌ 错误 1:过度工程(Over-Engineering)

你想做: 用户能搜索广告
你实际做了: 全文搜索引擎 + 向量相似度 + 实时索引 + 搜索推荐
实际需要: 一个 SQL ILIKE 查询

❌ 错误 2:需求蔓延(Scope Creep)

Week 1: "做一个广告素材保存功能"
Week 2: "顺便加个导出 Excel"
Week 3: "再加个数据可视化"
Week 4: "还需要团队协作..."

结果:3 个月后还没有一个完整版本上线。

❌ 错误 3:猜测用户需求(Build Before Validate)

错误流程: 想法 → 设计 → 开发 6 周 → 找用户 → 没人要
正确流程: 想法 → 找 5 个目标用户对话 → 确认痛点 → 最小版本 → 迭代

1.2 AI 辅助需求分析

方法:用 AI 扮演"苛刻的产品经理"

Prompt 模板

我要做一个 [产品],目标用户是 [用户],解决的问题是 [问题]。

请作为一个苛刻的产品经理:
1. 指出这个需求中最模糊的3个假设
2. 列出 5 个"如果这个假设错了,整个产品就没价值"的风险
3. 建议一个最小可验证版本(MVP)只需要哪些功能
4. 哪些功能是"好有但不必须",可以 V2 再做

Market Vault 实际输出(简化):

  • 最模糊假设: 用户愿意手动触发抓取 vs 期待全自动化
  • 最大风险: Meta 修改 Ad Library API 导致整个抓取失效
  • MVP 必须有: POST 保存广告列表 + 去重 + 按项目浏览
  • V2 再做: AI 推荐、导出、告警、协作

需求文档结构(用 Obsidian + AI 写)

## 功能需求 - [功能名]

**用户故事**: 作为 [角色],我想要 [行为],这样我就能 [目的]

**验收标准**:
- [ ] 当...时,系统应该...
- [ ] 当...时,系统不应该...

**范围外 (Out of Scope)**:
- 明确排除的功能,防止 scope creep

**API 设计**:
POST /api/v1/... 
请求: { ... }
响应: { ... }
错误: 400/422/429 对应场景

**数据库影响**:
- 新增/修改哪些表
- 是否需要迁移

**预估工时**: X 天(含测试)

1.3 结构化任务管理

工具选择:Obsidian Tasks + GitHub Issues

日常工作流

  1. Obsidian(私人脑暴)→ 想法、设计草稿、架构图
  2. GitHub Issues(执行跟踪)→ 具体任务、Bug、PR
  3. Git commit message(历史记录)→ 每次提交关联 Issue

Sprint 拆解原则

RICE 优先级模型: $$RICE = \frac{Reach \times Impact \times Confidence}{Effort}$$

功能 覆盖用户数 影响(1-3) 信心(%) 工时(天) RICE
AI 推荐 100% 2 60% 10 12
导出 CSV 40% 1 90% 2 18
搜索 80% 2 80% 3 43

→ 先做搜索,再做导出,AI 推荐最后

GitHub Issues 模板

## 背景
为什么要做这个?(用户反馈/数据/战略)

## 方案
技术方案(不超过3个选项,选择理由)

## 任务分解
- [ ] 数据库 migration
- [ ] Service 层函数
- [ ] API 路由
- [ ] 测试(单元 + 集成)
- [ ] 文档更新

## 完成标准
- 所有测试通过
- make lint 通过
- 手动 Postman 测试

1.4 文档驱动开发(DDD)

核心思想:先写文档,再写代码

正确顺序

1. 在 Obsidian 写设计文档(高层次,不含代码)
2. 用 AI 评审设计文档,找出漏洞
3. 设计确认后,在 GitHub Issues 拆任务
4. 开始写代码(此时 AI 已有上下文)
5. 代码完成后,更新文档

设计文档 Prompt(给 AI):

我要实现以下功能:[粘贴设计文档]

请帮我:
1. 找出这个设计中的安全漏洞
2. 找出可能导致数据不一致的竞争条件
3. 找出我没考虑到的边界情况
4. 建议测试用例(正常流 + 异常流)

1.5 实战:Market Vault 产品决策记录

决策1:为什么用 ad_archive_id 作为全局唯一键?

背景: Meta Ad Library 的每条广告有唯一 ad_archive_id
选项:

  • A: 每次 POST 都存一条新记录(无去重)
  • B: 以 ad_archive_id 全局去重,多个快照共享同一广告

决策: B
理由:

  • 用户可能多次 snapshot 相同广告(不同时间),重复存储浪费空间
  • 广告素材(图片/视频)一致,可以共用 CDN 资源
  • 查询"某广告在哪些 snapshot 中出现"变得高效

影响: SearchSnapshot ↔ Ad 多对多,通过 snapshots_ads 中间表

决策2:为什么资产文件用 SHA-256 而不是 URL 去重?

背景: 同一张图片可能有不同 URL(A/B 测试、CDN 缓存)
决策: SHA-256 内容哈希去重
收益: 节省 30-60% CDN 存储 + 避免重复下载


小结与行动项

本章学到:

  1. 先验证需求,再写代码(5 个用户对话 > 1 周开发)
  2. 用 AI 扮演苛刻 PM,找出假设漏洞
  3. RICE 模型做功能优先级
  4. 文档驱动开发:设计 → AI 评审 → 实现

行动项:

  • 为下一个功能写设计文档(用本章模板)
  • 用 AI PM Prompt 检查设计是否有漏洞
  • 在 GitHub Issues 拆分执行任务

下一章 → 第2章:AI Agent 协作开发