Skip to Content
Week 10Day 1 - 项目范围与需求

Day 1 - 项目范围与需求

建议用时:180-210 分钟

你将学会什么

  • 为什么项目要先写范围
  • 什么是 MVP
  • 什么是用户故事
  • 什么是验收标准
  • 怎么把需求拆成页面、数据字段和业务规则
  • 怎么写一份后续代码可以直接使用的需求文档

Week 10 开始做完整项目。今天先不急着写界面代码,先把“做什么、不做什么、做到什么程度”写清楚。需求写清楚,后面的数据层、服务层、列表页、编辑页才不会乱。

本页固定顺序

  1. 先学第一部分:弄懂今天最小、最重要的知识,并运行短例子。
  2. 再学第二部分:把刚学的知识组合成一个完整例子。
  3. 然后做第三部分:自己跟着敲,再完成重复训练和每日小测。
  4. 最后做第四部分:先独立完成作业,再用完整答案检查。

学习衔接

上一页学习的是“复盘与巩固”,今天继续学习“项目范围与需求”。先使用上一页已经会的写法,再只增加今天这个新知识点;如果前置内容还不能独立敲出,先回上一页复习,不要硬跳。

今天的最低通过线

第一次学习不要求背完整页。完成下面 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. 使用者

使用者是需要维护商品清单的人。

他要完成的事情:

  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. 商品字段

字段类型必填规则
IdGuid新增时自动生成
Namestring不能为空,最多 50 个字符
Pricedecimal必须大于 0
Stockint必须大于或等于 0
CreatedAtDateTime新增时自动记录
UpdatedAtDateTime新增和编辑时更新

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. 发布后从发布目录启动仍然能使用。
这份文档不是摆设。后面几天会直接按照它来写: - 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. 发布后从发布目录启动仍然能使用。

验收结果

这份作业完成后,必须满足:

  1. 第一版做什么写清楚。
  2. 第一版不做什么写清楚。
  3. 商品字段能直接变成 C# 模型。
  4. 业务规则能直接变成服务层校验。
  5. 验收标准覆盖成功和失败。
  6. 完成定义能用于发布前检查。

为什么这个答案是对的

这份需求文档把项目拆成了后续代码能使用的结构:

需求部分后续对应代码
商品字段Product 模型
业务规则ProductService
页面清单MainWindow.axaml
验收标准手动测试清单
完成定义发布前检查

需求写到这个程度,后面写代码就不是凭感觉加功能,而是按字段、规则、页面和验收逐步落地。