Day 1 - 项目范围与需求
建议用时:180-210 分钟
你将学会什么
- 为什么项目要先写范围
- 什么是 MVP
- 什么是用户故事
- 什么是验收标准
- 怎么把需求拆成页面、数据字段和业务规则
- 怎么写一份后续代码可以直接使用的需求文档
Week 10 开始做完整项目。今天先不急着写界面代码,先把“做什么、不做什么、做到什么程度”写清楚。需求写清楚,后面的数据层、服务层、列表页、编辑页才不会乱。
本页固定顺序
- 先学第一部分:弄懂今天最小、最重要的知识,并运行短例子。
- 再学第二部分:把刚学的知识组合成一个完整例子。
- 然后做第三部分:自己跟着敲,再完成重复训练和每日小测。
- 最后做第四部分:先独立完成作业,再用完整答案检查。
学习衔接
上一页学习的是“复盘与巩固”,今天继续学习“项目范围与需求”。先使用上一页已经会的写法,再只增加今天这个新知识点;如果前置内容还不能独立敲出,先回上一页复习,不要硬跳。
今天的最低通过线
第一次学习不要求背完整页。完成下面 3 项,就可以继续:
- 能用自己的话说明“项目范围与需求”解决什么问题。
- 把第一部分的短例子亲手敲完,并确认每个例子都能运行。
- 不看完整答案完成第三部分至少前 3 个例子,再主动改一个值观察结果。
第一部分:先学原理和最小知识
这一部分从最小知识开始。先读解释,再把紧跟着的短例子敲一遍。需求不是写给别人看的形式,而是用来约束后面代码怎么写。
为什么先写范围
项目最容易失控的原因是:想到什么就加什么。
比如一开始只想做商品列表,写着写着又想加登录、图片、报表、云同步、权限。功能越加越多,第一版永远做不完。
范围就是边界。
范围要同时写两件事:
本次做什么。
本次不做什么。“不做什么”非常重要。它能防止第一版无限膨胀。
什么是 MVP
MVP 是 Minimum Viable Product,意思是最小可用版本。
它不是“随便做一点”,而是:
只保留最少功能,但这些功能必须能完整解决一个真实问题。本项目的真实问题是:用户要维护本地商品清单。
所以第一版必须有:
- 新增商品
- 查看商品
- 编辑商品
- 删除商品
- 搜索商品
- 保存和读取
而这些可以先不做:
- 登录
- 云同步
- 报表
- 图片
- 权限
什么是用户故事
用户故事从使用者角度写,格式通常是:
作为某类使用者,我想做某件事,这样我能得到某个结果。例如:
作为使用者,我想搜索商品,这样我能快速找到目标商品。这句话里有三部分:
| 部分 | 内容 |
|---|---|
| 谁 | 使用者 |
| 做什么 | 搜索商品 |
| 为什么 | 快速找到目标商品 |
用户故事能帮助你避免只写技术词。
“做搜索框”是技术动作。
“快速找到目标商品”才是用户目标。
什么是验收标准
验收标准就是判断功能是否完成的条件。
差的写法:
能新增商品。这个标准太粗,不知道什么叫“能”。
更清楚的写法:
1. 输入合法名称、价格、库存后能新增。
2. 名称为空时不能新增,并显示提示。
3. 价格小于或等于 0 时不能新增,并显示提示。
4. 库存小于 0 时不能新增,并显示提示。这样后面写代码时就知道要写哪些校验。
为什么要先写字段
字段决定数据模型。
如果需求里写了:
Name、Price、Stock、CreatedAt、UpdatedAt那么后面 C# 模型大概率就会有:
public string Name { get; set; } = "";
public decimal Price { get; set; }
public int Stock { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }字段不清楚,数据层就会来回改。
为什么要先写业务规则
业务规则决定服务层。
例如需求里写:
商品名称不能为空。
商品价格必须大于 0。
库存必须大于或等于 0。那么服务层就应该有校验:
名称为空 -> 返回失败
价格 <= 0 -> 返回失败
库存 < 0 -> 返回失败规则写清楚,服务层就不会只处理正常输入。
为什么要先写页面清单
页面清单决定 UI 的基本结构。
本项目第一版只需要:
- 商品列表
- 编辑区
- 状态提示区
这能防止一开始就做复杂导航、多窗口、报表页面。
先把一个页面里的主流程跑通,再考虑扩展。
需求文档常用字段速查
| 需求文档字段 | 作用 | 商品项目例子 |
|---|---|---|
| 项目目标 | 说明为什么做 | 管理本地商品 |
| 使用者 | 说明谁使用 | 店员、管理员 |
| MVP 范围 | 第一版必须有 | 新增、编辑、删除、搜索、保存 |
| 暂不包含 | 防止范围失控 | 多账号、云同步、复杂权限 |
| 数据字段 | 说明保存什么 | 名称、价格、库存 |
| 业务规则 | 说明什么能做、什么不能做 | 价格必须大于 0 |
| 页面清单 | 说明有哪些界面 | 列表页、编辑区 |
| 验收标准 | 说明怎么算完成 | 输入合法商品后列表出现 |
| 完成定义 | 发布前检查 | 构建、测试、文档通过 |
写需求时固定顺序:
目标
-> 使用者
-> MVP 范围
-> 字段
-> 业务规则
-> 页面
-> 验收标准第二部分:把知识组合成完整例子
今天的产出不是 .cs 文件,而是一份项目需求文档。
这份文档要能回答:
- 第一版做哪些功能?
- 第一版不做哪些功能?
- 商品有哪些字段?
- 页面有哪些?
- 新增、编辑、删除、搜索分别怎么判断完成?
- 输入错误时应该怎么提示?
完整需求文档
文件名可以叫:
product-mvp-requirements.md完整内容如下:
# 商品管理 MVP 需求文档
## 第三部分:跟着写需求文档
从这里开始动手。新建一个文件:
```text
product-mvp-requirements.md第 1 步:写项目目标
## 1. 项目目标
做一个桌面端商品管理工具,帮助用户维护一份本地商品清单。
第一版只解决本地商品的新增、查看、编辑、删除、搜索和保存,不做账号系统,不做云同步。解释:
- 第一段说明项目是什么。
- 第二段说明第一版的边界。
第 2 步:写使用者和目标
## 2. 使用者
使用者是需要维护商品清单的人。
他要完成的事情:
1. 查看当前有哪些商品。
2. 新增一个商品。
3. 修改商品名称、价格和库存。
4. 删除录入错误的商品。
5. 按关键字搜索商品。
6. 关闭程序后,下次打开还能看到上次保存的数据。解释:
- 这里写的是人要完成的事情,不是技术实现。
第 3 步:写第一版范围
## 3. 第一版范围
第一版包含:
1. 商品列表。
2. 新增商品。
3. 编辑商品。
4. 删除商品。
5. 关键字搜索。
6. JSON 本地保存。
7. JSON 本地读取。
8. 输入错误提示。解释:
- 这些功能后面都要进入验收。
- 范围里的内容不能只写一半。
第 4 步:写第一版暂不包含
## 4. 第一版暂不包含
第一版不做:
1. 登录。
2. 多用户。
3. 云同步。
4. 图片上传。
5. 条形码扫描。
6. 复杂报表。
7. 权限管理。
8. 自动更新。解释:
- 暂不包含不是永远不做。
- 它只是说明第一版先不做,防止当前版本失控。
第 5 步:写商品字段
## 5. 商品字段
| 字段 | 类型 | 必填 | 规则 |
| --- | --- | --- | --- |
| Id | Guid | 是 | 新增时自动生成 |
| Name | string | 是 | 不能为空,最多 50 个字符 |
| Price | decimal | 是 | 必须大于 0 |
| Stock | int | 是 | 必须大于或等于 0 |
| CreatedAt | DateTime | 是 | 新增时自动记录 |
| UpdatedAt | DateTime | 是 | 新增和编辑时更新 |解释:
- 这张表后面会直接变成 C# 模型。
- 类型先写清楚,代码才不会乱。
第 6 步:写页面清单
## 6. 页面清单
| 页面 | 作用 |
| --- | --- |
| 商品列表页 | 显示商品列表、搜索框、新增按钮 |
| 商品编辑区 | 输入名称、价格、库存 |
| 状态提示区 | 显示保存成功、校验失败、读取失败 |解释:
- 第一版不需要复杂页面。
- 列表、编辑、提示三个区域就能完成主流程。
第 7 步:写业务规则
## 8. 业务规则
1. 商品名称不能为空。
2. 商品名称最多 50 个字符。
3. 商品价格必须大于 0。
4. 商品库存必须大于或等于 0。
5. 新增商品时自动生成 Id。
6. 新增商品时自动设置 CreatedAt 和 UpdatedAt。
7. 编辑商品时只更新 Name、Price、Stock、UpdatedAt。
8. 删除商品前必须先选中一条商品。
9. 搜索时匹配商品名称。
10. 搜索关键字为空时显示全部商品。解释:
- 业务规则会决定服务层代码。
- 每条规则都应该能被测试。
第 8 步:写验收标准
## 9. 验收标准
### 新增商品
1. 输入合法名称、价格、库存后能新增。
2. 名称为空时不能新增,并显示提示。
3. 价格小于或等于 0 时不能新增,并显示提示。
4. 库存小于 0 时不能新增,并显示提示。解释:
- 不要只写正常情况。
- 每个核心功能都要写成功和失败。
第 9 步:写完成定义
## 10. 完成定义
满足以下条件,第一版才算完成:
1. 第一版范围里的功能全部能跑。
2. 验收标准全部通过。
3. 错误输入有提示。
4. 数据能保存和读取。
5. 发布后从发布目录启动仍然能使用。解释:
- 完成定义是最后交付前的总检查。
- 它比单个功能验收更高一层。
1. 项目目标
做一个桌面端商品管理工具,帮助用户维护一份本地商品清单。
第一版只解决本地商品的新增、查看、编辑、删除、搜索和保存,不做账号系统,不做云同步。
2. 使用者
使用者是需要维护商品清单的人。
他要完成的事情:
- 查看当前有哪些商品。
- 新增一个商品。
- 修改商品名称、价格和库存。
- 删除录入错误的商品。
- 按关键字搜索商品。
- 关闭程序后,下次打开还能看到上次保存的数据。
3. 第一版范围
第一版包含:
- 商品列表。
- 新增商品。
- 编辑商品。
- 删除商品。
- 关键字搜索。
- JSON 本地保存。
- JSON 本地读取。
- 输入错误提示。
4. 第一版暂不包含
第一版不做:
- 登录。
- 多用户。
- 云同步。
- 图片上传。
- 条形码扫描。
- 复杂报表。
- 权限管理。
- 自动更新。
5. 商品字段
| 字段 | 类型 | 必填 | 规则 |
|---|---|---|---|
| Id | Guid | 是 | 新增时自动生成 |
| Name | string | 是 | 不能为空,最多 50 个字符 |
| Price | decimal | 是 | 必须大于 0 |
| Stock | int | 是 | 必须大于或等于 0 |
| CreatedAt | DateTime | 是 | 新增时自动记录 |
| UpdatedAt | DateTime | 是 | 新增和编辑时更新 |
6. 页面清单
| 页面 | 作用 |
|---|---|
| 商品列表页 | 显示商品列表、搜索框、新增按钮 |
| 商品编辑区 | 输入名称、价格、库存 |
| 状态提示区 | 显示保存成功、校验失败、读取失败 |
7. 用户故事
- 作为使用者,我想查看商品列表,这样我能知道当前有哪些商品。
- 作为使用者,我想新增商品,这样我能把新商品录入系统。
- 作为使用者,我想编辑商品,这样我能修正名称、价格或库存。
- 作为使用者,我想删除商品,这样我能移除录入错误的数据。
- 作为使用者,我想搜索商品,这样我能快速找到目标商品。
- 作为使用者,我想保存数据,这样关闭程序后数据不会丢失。
8. 业务规则
- 商品名称不能为空。
- 商品名称最多 50 个字符。
- 商品价格必须大于 0。
- 商品库存必须大于或等于 0。
- 新增商品时自动生成 Id。
- 新增商品时自动设置 CreatedAt 和 UpdatedAt。
- 编辑商品时只更新 Name、Price、Stock、UpdatedAt。
- 删除商品前必须先选中一条商品。
- 搜索时匹配商品名称。
- 搜索关键字为空时显示全部商品。
9. 验收标准
商品列表
- 启动后能看到商品列表区域。
- 没有商品时显示空列表,不崩溃。
- 有商品时能显示名称、价格、库存。
新增商品
- 输入合法名称、价格、库存后能新增。
- 名称为空时不能新增,并显示提示。
- 价格小于或等于 0 时不能新增,并显示提示。
- 库存小于 0 时不能新增,并显示提示。
编辑商品
- 选中商品后,编辑区显示商品信息。
- 修改合法内容后能保存。
- 保存后列表同步更新。
删除商品
- 选中商品后可以删除。
- 没有选中商品时不能删除,并显示提示。
搜索商品
- 输入关键字后只显示匹配商品。
- 关键字为空时显示全部商品。
- 没有匹配结果时显示空列表,不崩溃。
本地保存
- 点击保存后生成 JSON 文件。
- 关闭程序再打开,能读取上次保存的数据。
- JSON 文件损坏时显示读取失败提示。
10. 完成定义
满足以下条件,第一版才算完成:
- 第一版范围里的功能全部能跑。
- 验收标准全部通过。
- 错误输入有提示。
- 数据能保存和读取。
- 发布后从发布目录启动仍然能使用。
这份文档不是摆设。后面几天会直接按照它来写:
- Day 2:根据商品字段写数据模型和存储。
- Day 3:根据业务规则写服务层。
- Day 4:根据页面清单写主列表。
- Day 5:根据编辑验收标准写详情和编辑。
- Day 6:根据搜索验收标准写过滤。
## 常见错误和修法
| 错误 | 为什么错 | 修法 |
| --- | --- | --- |
| 需求只写“做商品管理” | 范围太大,后面不知道先做什么 | 拆成新增、编辑、删除、搜索、保存这些具体功能 |
| 字段没有类型 | 后面模型和表单无法落地 | 每个字段写清 `string`、`decimal`、`int`、`DateTime` |
| 规则只写一句“校验输入” | 不知道哪些输入算非法 | 写清空值、长度、数字范围、重复数据 |
| MVP 放太多功能 | 第一版做不完,项目容易失控 | 先保留最小闭环,其他放到后续版本 |
| 验收标准不具体 | 做完无法判断是否通过 | 写清操作、输入、期望结果 |
## 小白重复敲写训练
需求要立刻转成可运行的小模型和规则。
### 训练 1:写最小商品模型
```csharp
public class Product
{
public Guid Id { get; set; } = Guid.NewGuid();
public string Name { get; set; } = "";
public decimal Price { get; set; }
public int Stock { get; set; }
}创建两条商品并输出,确认字段是否够用。
训练 2:把需求写成判断
bool CanSave(Product product)
{
return !string.IsNullOrWhiteSpace(product.Name)
&& product.Price >= 0
&& product.Stock >= 0;
}分别准备合法和非法商品运行。
训练 3:把验收标准写成测试
[Fact]
public void CanSave_EmptyName_ReturnsFalse()
{
var product = new Product { Name = "", Price = 10m, Stock = 1 };
Assert.False(CanSave(product));
}第三遍增加价格小于零的测试。
每日小测
做完本页后,用这 5 题检查是否真的掌握。
1. 判断题
本页的目标不是只把代码运行起来,还要能说清楚“为什么这样写”。
答案:对。能运行只是第一步,能解释原理、常用操作和常见错误,才说明本页内容进入了可复用能力。
2. 填空题
本页主题是:项目范围与需求。今天至少要掌握的 3 个点是:
1. 为什么项目要先写范围
2. 什么是 MVP
3. 什么是用户故事答案:以上 3 点必须能用自己的代码跑通,不能只停留在阅读。
3. 流程题
遇到本页相关功能时,先按什么顺序处理?
答案:先看完整例子,确认最终效果;再读原理和名词;然后跟着第三部分从空项目敲代码;最后对照作业答案检查。
4. 找错误题
如果本页代码运行失败,第一步应该做什么?
答案:先看终端或 IDE 里的第一条错误,找到文件名和行号;不要同时改很多地方。再回到本页的“常见错误和修法”表格,对照错误类型逐项排查。
5. 改需求题
在本页完整例子跑通后,至少改一个小需求。
可选改法:
- 改一个字段名称。
- 多加一个校验条件。
- 多输出一行结果。
- 把固定数据改成用户输入。
- 把一次处理改成多条数据处理。
答案标准:修改后能重新运行,并能说明这次修改影响了哪一段逻辑。重点检查:为什么项目要先写范围。
上位机专项练习
先写需求再写界面。把使用者、设备、点位、报警和操作流程列清楚,避免项目越写越乱。
下面 3 个例子都要亲手敲。先运行原代码,再完成每个例子后面的改动任务。
专项例子 1:写用户故事
作为现场操作员
我想看到所有设备的在线状态和实时温度
以便及时发现停机与高温运行结果或界面效果:
明确了谁、要什么、为什么改动任务: 再写一条工程师修改报警阈值的故事。
专项例子 2:列出功能范围
必须完成:
- 设备总览
- 实时点位
- 报警确认
- 配置保存
暂不完成:
- 云端同步
- 手机 App运行结果或界面效果:
项目边界清楚改动任务: 把历史趋势加入必须完成。
专项例子 3:写验收条件
场景: PLC-01 温度达到 80 C
当: 新采集值为 82 C
那么: 2 秒内显示高温报警
并且: 报警日志记录设备、时间和值运行结果或界面效果:
需求可以被实际测试改动任务: 增加温度恢复正常后的验收条件。
第四部分:作业完整答案
作业要求:写一份商品管理 MVP 需求文档,必须包含目标、范围、暂不包含、字段、页面、用户故事、业务规则、验收标准、完成定义。
答案文件:product-mvp-requirements.md
# 商品管理 MVP 需求文档
## 1. 项目目标
做一个桌面端商品管理工具,帮助用户维护一份本地商品清单。
第一版只解决本地商品的新增、查看、编辑、删除、搜索和保存,不做账号系统,不做云同步。
## 2. 使用者
使用者是需要维护商品清单的人。
他要完成的事情:
1. 查看当前有哪些商品。
2. 新增一个商品。
3. 修改商品名称、价格和库存。
4. 删除录入错误的商品。
5. 按关键字搜索商品。
6. 关闭程序后,下次打开还能看到上次保存的数据。
## 3. 第一版范围
第一版包含:
1. 商品列表。
2. 新增商品。
3. 编辑商品。
4. 删除商品。
5. 关键字搜索。
6. JSON 本地保存。
7. JSON 本地读取。
8. 输入错误提示。
## 4. 第一版暂不包含
第一版不做:
1. 登录。
2. 多用户。
3. 云同步。
4. 图片上传。
5. 条形码扫描。
6. 复杂报表。
7. 权限管理。
8. 自动更新。
## 5. 商品字段
| 字段 | 类型 | 必填 | 规则 |
| --- | --- | --- | --- |
| Id | Guid | 是 | 新增时自动生成 |
| Name | string | 是 | 不能为空,最多 50 个字符 |
| Price | decimal | 是 | 必须大于 0 |
| Stock | int | 是 | 必须大于或等于 0 |
| CreatedAt | DateTime | 是 | 新增时自动记录 |
| UpdatedAt | DateTime | 是 | 新增和编辑时更新 |
## 6. 页面清单
| 页面 | 作用 |
| --- | --- |
| 商品列表页 | 显示商品列表、搜索框、新增按钮 |
| 商品编辑区 | 输入名称、价格、库存 |
| 状态提示区 | 显示保存成功、校验失败、读取失败 |
## 7. 用户故事
1. 作为使用者,我想查看商品列表,这样我能知道当前有哪些商品。
2. 作为使用者,我想新增商品,这样我能把新商品录入系统。
3. 作为使用者,我想编辑商品,这样我能修正名称、价格或库存。
4. 作为使用者,我想删除商品,这样我能移除录入错误的数据。
5. 作为使用者,我想搜索商品,这样我能快速找到目标商品。
6. 作为使用者,我想保存数据,这样关闭程序后数据不会丢失。
## 8. 业务规则
1. 商品名称不能为空。
2. 商品名称最多 50 个字符。
3. 商品价格必须大于 0。
4. 商品库存必须大于或等于 0。
5. 新增商品时自动生成 Id。
6. 新增商品时自动设置 CreatedAt 和 UpdatedAt。
7. 编辑商品时只更新 Name、Price、Stock、UpdatedAt。
8. 删除商品前必须先选中一条商品。
9. 搜索时匹配商品名称。
10. 搜索关键字为空时显示全部商品。
## 9. 验收标准
### 商品列表
1. 启动后能看到商品列表区域。
2. 没有商品时显示空列表,不崩溃。
3. 有商品时能显示名称、价格、库存。
### 新增商品
1. 输入合法名称、价格、库存后能新增。
2. 名称为空时不能新增,并显示提示。
3. 价格小于或等于 0 时不能新增,并显示提示。
4. 库存小于 0 时不能新增,并显示提示。
### 编辑商品
1. 选中商品后,编辑区显示商品信息。
2. 修改合法内容后能保存。
3. 保存后列表同步更新。
### 删除商品
1. 选中商品后可以删除。
2. 没有选中商品时不能删除,并显示提示。
### 搜索商品
1. 输入关键字后只显示匹配商品。
2. 关键字为空时显示全部商品。
3. 没有匹配结果时显示空列表,不崩溃。
### 本地保存
1. 点击保存后生成 JSON 文件。
2. 关闭程序再打开,能读取上次保存的数据。
3. JSON 文件损坏时显示读取失败提示。
## 10. 完成定义
满足以下条件,第一版才算完成:
1. 第一版范围里的功能全部能跑。
2. 验收标准全部通过。
3. 错误输入有提示。
4. 数据能保存和读取。
5. 发布后从发布目录启动仍然能使用。验收结果
这份作业完成后,必须满足:
- 第一版做什么写清楚。
- 第一版不做什么写清楚。
- 商品字段能直接变成 C# 模型。
- 业务规则能直接变成服务层校验。
- 验收标准覆盖成功和失败。
- 完成定义能用于发布前检查。
为什么这个答案是对的
这份需求文档把项目拆成了后续代码能使用的结构:
| 需求部分 | 后续对应代码 |
|---|---|
| 商品字段 | Product 模型 |
| 业务规则 | ProductService |
| 页面清单 | MainWindow.axaml |
| 验收标准 | 手动测试清单 |
| 完成定义 | 发布前检查 |
需求写到这个程度,后面写代码就不是凭感觉加功能,而是按字段、规则、页面和验收逐步落地。