CookingCoder:极客菜谱的领域建模

程序员学做饭最大的痛点:“块"是多大块?“勺"是多大的勺?“适量"是多少? 传统菜谱的模糊描述对新手极不友好。CookingCoder 用领域建模的方式重写家常菜:规格(Spec)+ 步骤(Steps)+ 流程(Flow)——把菜谱写成程序。

一、问题:菜谱的"模糊性”

传统菜谱的问题:

" " " " " 土 加 大 适 煸 豆 一 火 量 炒 切 勺 收 盐 至 块 生 汁 " 断 " 抽 " 生 " → " → → → 适 → 多 多 量 大 勺 大 是 什 块 子 火 多 么 ? 多 ? 少 状 2 大 开 ? 态 c ? 最 1 叫 m 调 大 g 断 ? 羹 ? ? 生 5 ? 5 ? c 汤 g m 勺 ? ? ?

核心洞察:菜谱的模糊,不是"无法描述”,是没建立度量体系。做饭和编程一样,需要常量和单位。

二、领域建模:三个核心抽象

1. 规格(Spec):统一的度量体系

把模糊量词全部规格化:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
## 规格表(全局常量)

| 量词 | 规格 | 说明 |
|---|---|---|
| 1 块 | 3×3×2cm(约 40g) | 土豆/萝卜等根茎类 |
| 1 勺 | 15ml(标准汤勺) | 生抽/料酒/油 |
| 1 小勺 | 5ml(调料勺) | 盐/糖/鸡精 |
| 大火 | 炉灶最大火力 | 炒/收汁 |
| 中火 | 火焰约 6cm | 煎/炖 |
| 小火 | 火焰约 3cm | 焖/煨 |
| 断生 | 肉变色无血水 / 菜变软半透明 | 状态判定 |
| 收汁 | 汤汁浓稠挂勺,剩原量 1/3 | 状态判定 |

规格表是全项目的"常量定义”——所有菜谱引用同一套标准,就像代码里抽公共常量。

2. 步骤(Steps):程序化的动作描述

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
## 步骤

1. [准备] 土豆去皮,切成 3×3×2cm 的块(规格:1 块=40g),泡水 5 分钟去淀粉
2. [预处理] 蒜 2 瓣拍碎,葱 1 根切 2cm 段
3. [烹饪] 中火起锅,加 2 勺油(30ml),油温至"筷子放进去冒小泡"
4. [烹饪] 下蒜末煸炒 15 秒至出香(有蒜味无生味)
5. [主料] 下土豆块翻炒 2 分钟,至表面微透明
6. [调味] 加 3 勺生抽、1 小勺糖,翻炒均匀
7. [炖煮] 加开水至没过土豆(约 300ml),大火烧开转小火,盖盖焖 12 分钟
8. [收汁] 开盖转大火,收汁至汤汁浓稠(剩 1/3,能挂勺)
9. [出锅] 关火,撒葱花,装盘

程序化要点:

✅ ✅ ✅ ✅ 每 每 每 每 个 个 个 个 动 时 量 状 作 间 都 态 带 都 引 都 " 具 用 有 可 体 规 " 观 ( 格 验 察 1 表 收 的 5 ( 标 判 3 准 定 秒 " 条 / 勺 ( 件 2 = 断 " 4 生 ( 分 5 = 油 钟 m 变 温 / l 色 = 1 ) 无 筷 2 血 子 水 冒 分 ) 小 钟 泡 ) )

3. 流程(Flow):条件分支与状态机

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
## 判定分支

- 如果土豆切得大(5cm 块)→ 焖煮时间 +5 分钟
- 如果喜欢软糯 → 焖煮 +3 分钟,收汁前压一下
- 如果汤汁剩太多 → 大火收汁多 2 分钟
- 如果太咸 → 加半勺糖平衡(不是加水!)

## 关键节点(状态机)

[准备] → [烹饪] → [调味] → [炖煮] → [收汁] → [出锅]
  ↓        ↓        ↓        ↓        ↓
 切好     油温对   尝味调整 时间到    挂勺     装盘

像代码一样:每个关键节点都有判定条件(if)和修正动作(catch)——新手犯错时知道怎么救。

三、类比:用编程概念讲做饭

CookingCoder 的特色:菜谱里的编程类比,让程序员秒懂:

编程概念 做饭类比
常量定义 规格表(1 勺=15ml、大火=最大火力)
垃圾回收 边做边收拾(洗完用过的碗,最后战场干净)
面向对象 同一道菜换主料 = 继承(宫保鸡丁 → 宫保虾仁)
公共方法抽取 所有炒菜共用的"爆香"步骤(蒜末 15 秒出香)
状态机 烹饪阶段流转(生 → 半熟 → 熟 → 收汁)
单元测试 成品判定(断生=无血水、挂勺=收汁完成)
异常处理 太咸加糖、糊锅关火、补救分支

四、标签体系:菜系 × 口味 × 人群

菜 口 人 系 味 群 : : : 川 辣 新 菜 手 友 好 咸 粤 鲜 / 菜 快 手 酸 ( 家 甜 3 常 0 分 清 钟 江 淡 内 浙 ) . / . . 下 饭 / 低 脂

多维度标签解决"今晚吃什么"的检索问题:新手 + 快手 + 下饭 过滤出符合条件的菜。

五、技术实现

内 结 展 版 容 构 示 本 : : : : M f 静 G a r 态 i r o 站 t k n 点 d t ( 管 o m G 理 w a i ( n t t 菜 ( t B 谱 每 e o 演 道 r o 进 菜 ( k 有 一 标 历 个 签 风 史 文 / 格 ) 件 难 , ) 度 侧 / 边 时 栏 长 导 ) 航 + ) 规 格 + 步 骤 + 流 程
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
---
title: "土豆烧鸡块"
tags: [家常, 下饭, 新手友好]
difficulty: 2/5
time: 35 分钟
serves: 2 人
---

## 规格引用
- 鸡块:4×3cm,去骨
- 土豆:3×3×2cm

## 步骤
...

六、踩坑记录(建模的坑)

  1. 过度规格化:把"盐 1.7g"写死 → 新手没厨房秤反而困惑 → 用"1 小勺(约 5ml)"+“可调整"平衡精确和可用
  2. 忽略"状态判定”:只写时间不写状态(“炒 2 分钟"没写"炒到变色”)→ 每步必须有"判定条件"
  3. 规格表太长:50 个规格新手记不住 → 只留高频 8-10 个,特殊规格随菜谱内联
  4. 没有补救分支:写步骤不写"如果失败怎么办" → 关键节点都加"错误处理"

总结

CookingCoder 的核心认知:

  1. 模糊不是无法描述,是没建度量体系:规格表是菜谱的"常量定义"
  2. 程序化 = 判定条件 + 具体量 + 验收标准:新手照做就能成
  3. 编程类比降低理解成本:程序员秒懂"火候状态机"
  4. 补救分支是新手友好度:会犯错,得有 rescue

把做饭当工程:常量、状态机、异常处理都到位,菜谱就从"玄学"变成"可复现的程序"。