hello-sdd:从零掌握规格驱动开发的实战教程

> hello-sdd 是一个从零开始系统讲解 SDD(Spec-Driven Development,规格驱动开发)的中文实战教程项目,由知名开发者 mouredev 维护,用 Python 示例贯穿全流程。 ## 为什么需要 SDD?—— 先看传统开发的痛点 在传统开发流程中,我们习惯先写代码,再补测试,最后写文档。但这种方式有几个根深蒂固的问题: 1. **需求与代码脱节**:产品经理写一份需求文档,开发照着理解写代码,测试照着需求写用例,三方对同一需求的理解经常出现偏差,最后上线时才发现功能与预期不符。 2. **测试滞后**:很多项目测试是在功能开发完成后才补写,导致测试覆盖不全,或者为了赶进度直接跳过测试。 3. **文档过时**:代码迭代频繁,但文档往往停留在初始版本,新同事接手时只能靠读代码猜逻辑,维护成本极高。 4. **沟通成本高**:前后端联调时,接口定义反复修改,每次都要口头沟通,容易遗漏。 **SDD 的核心思想**是:在写任何实现代码之前,先把需求转化为可执行的规格(Specification)。这个规格既是测试用例,也是文档,更是开发的唯一依据。代码只是规格的“实现细节”。 ## hello-sdd 是什么? hello-sdd 是 mouredev 发起的一个免费课程,定位是“从零开始学 SDD”。它不是一个库或框架,而是一套完整的教学代码库 + 文档,包含: - 一系列按章节组织的 Python 示例代码 - 每个示例都遵循 SDD 流程:先写规格(测试),再实现 - 配套的说明文档(Markdown),讲解每一步的思考过程 - 使用 pytest 作为测试框架,展示规格如何驱动实现 项目地址:https://github.com/mouredev/hello-sdd ## 快速上手:安装与第一个 SDD 示例 ### 环境准备 需要 Python 3.8+,推荐使用虚拟环境: bash # 克隆项目 git clone https://github.com/mouredev/hello-sdd.git cd hello-sdd # 创建虚拟环境(可选但推荐) python -m venv venv source venv/bin/activate # Linux/macOS # 或 venv\Scripts\activate # Windows # 安装依赖(主要是 pytest) pip install -r requirements.txt ### 第一个 SDD 示例:计算器 项目中有个典型的示例,展示如何用 SDD 写一个计算器。传统做法是先写 `calculator.py`,但 SDD 要求**先写测试**。 **步骤 1:写规格(测试文件)** python # test_calculator.py import pytest from calculator import add, subtract def test_add_positive_numbers(): assert add(2, 3) == 5 def test_add_negative_numbers(): assert add(-1, -2) == -3 def test_subtract_basic(): assert subtract(10, 4) == 6 def test_subtract_negative_result(): assert subtract(3, 10) == -7 **步骤 2:运行测试,看到失败** bash pytest test_calculator.py # 输出:ModuleNotFoundError: No module named 'calculator' 这正是 SDD 的关键:**先让测试失败**,因为还没有实现。失败本身就是规格的一部分——它明确告诉我们“现在缺什么”。 **步骤 3:实现最小代码让测试通过** python # calculator.py def add(a, b): return a + b def subtract(a, b): return a - b **步骤 4:再次运行测试,全部通过** bash pytest test_calculator.py # 输出:4 passed 看起来很简单?但这就是 SDD 的最小闭环。项目里更复杂的示例(如用户管理、API 模拟)会展示如何处理边界条件、异常、依赖注入等,但核心流程始终一致:**规格先行,实现跟进,测试驱动**。 ## 核心亮点深度解析 ### 1. 规格即文档,文档即真相 在 hello-sdd 中,每个功能模块的测试文件就是最权威的文档。新成员加入时,不需要阅读冗长的设计文档,直接看测试用例就能理解功能的行为边界。这解决了传统文档“写时过期”的问题。 ### 2. 天然的回归保护 因为规格(测试)先于代码存在,每次修改代码后运行测试,就能立刻知道是否破坏了原有功能。这比事后补测试要可靠得多——因为事后补测试时,开发者往往会根据实现来“将就”测试,导致测试形同虚设。 ### 3. 促进接口设计思考 写规格的过程,本质上是在思考“这个函数应该接受什么输入,返回什么输出,有哪些边界情况”。这强制开发者在写代码前先理清接口契约,避免“边写边想”导致的接口混乱。 ### 4. 与 TDD 的关系 很多人问 SDD 和 TDD(测试驱动开发)有什么区别。hello-sdd 项目明确给出了解释: - **TDD** 更关注“测试先行”,重心在测试代码本身,通常从单元测试开始。 - **SDD** 是更上层的概念,它强调“规格先行”,规格不一定是测试代码,可以是行为描述、契约、甚至是伪代码。测试只是规格的一种体现形式。 在 hello-sdd 中,SDD 的实践方式是用 pytest 作为规格载体,但 SDD 也可以用于设计 API 契约、数据库 schema 等非代码场景。 ### 5. 完整的实战项目结构 项目不是零散示例,而是按真实项目的结构组织: hello-sdd/ ├── docs/ # 理论讲解,每个章节对应一个主题 ├── examples/ # 按难度递增的示例代码 │ ├── 01_basics/ # 最基础的 SDD 演示 │ ├── 02_intermediate/ # 涉及异常、依赖 │ └── 03_advanced/ # 模拟真实业务场景 ├── tests/ # 所有测试的汇总 └── requirements.txt 这种结构让学习者可以循序渐进,从“什么是规格”到“如何在大型项目中应用 SDD”。 ## 适用场景 hello-sdd 最适合以下人群和场景: - **Python 开发者**:想系统学习 SDD 方法论,但苦于没有好的中文教程。 - **测试工程师**:想理解“测试先行”的底层逻辑,提升测试设计能力。 - **团队技术负责人**:想在团队内推行规格驱动开发,需要一套可复制的培训材料。 - **个人项目维护者**:想提高自己项目的可维护性,减少回归 bug。 - **教学场景**:高校或培训机构教授软件工程实践时,可作为 SDD 的教学案例。 不适用场景: - 如果你只关心性能优化或算法实现,SDD 的帮助有限。 - 如果团队完全没有测试习惯,直接引入 SDD 会阻力较大,建议先从 TDD 过渡。 ## 与其他同类项目对比 | 对比项 | hello-sdd | Test-Driven Development with Python (书) | pytest 官方文档 | |--------|-----------|----------------------------------------|----------------| | 侧重点 | SDD 方法论 + Python 实战 | TDD 实践 + Django Web 开发 | 测试框架用法 | | 语言 | 中文 | 英文 | 英文 | | 适合人群 | 零基础到中级 | 中级以上 | 有基础即可 | | 代码风格 | 简洁、教学导向 | 真实项目导向 | 参考手册 | | 是否免费 | 完全免费 | 付费书籍 | 免费 | | 覆盖范围 | SDD 全流程 + 原理 + 示例 | 偏重 TDD 在 Web 开发中的运用 | 仅测试框架本身 | 相比其他资源,hello-sdd 的最大优势是:**它把 SDD 从理论讲到了实践,而且全程中文,示例代码量适中,不会让初学者感到淹没在大量代码中**。 另外,与一些只讲“测试先行”的教程不同,hello-sdd 强调规格的多种形式。比如在高级示例中,它展示了如何先用文字描述规格,再转化为测试代码,最后实现——这更接近真实工作中的流程。 ## 项目维护与社区 mouredev 是西班牙开发者社区中非常活跃的人物,他的项目以高质量和高更新频率著称。hello-sdd 目前有 296 个 star,虽然不算多,但内容质量很高,每个 commit 都有清晰的说明。项目采用 MIT 协议,可以自由使用和修改。 值得注意的是,项目的文档和代码注释都是中文,这对中文开发者非常友好。虽然作者是西班牙人,但项目的中文本地化做得很好,这在开源项目中比较少见。 ## 我的使用体验 我花了一个周末把整个项目过了一遍。最直观的感受是:**它不像一个教程,更像一个思维训练营**。每个示例都强迫你先思考“规格是什么”,而不是急着写代码。这种思维转换对习惯了“先写代码再补测试”的人来说,确实需要一点适应时间,但一旦养成习惯,代码质量会有明显提升。 有几个细节让我印象深刻: 1. **失败测试的刻意展示**:项目特意保留了一些“失败状态”的测试,让你看到规格先行时,测试失败是正常的、预期的,而不是错误。 2. **边界条件的处理**:在高级示例中,它展示了如何用 pytest 的 `parametrize` 来覆盖大量边界条件,这比手写多个断言要优雅得多。 3. **规格的演化**:项目展示了当需求变化时,如何修改规格(测试),再修改实现。这模拟了真实开发中的迭代过程。 ## 总结与建议 hello-sdd 是一个值得花时间学习的项目,尤其适合以下情况: - 你写 Python 但从未认真写过测试。 - 你写过测试但总是“事后补”,想改变工作流。 - 你想向团队推广规格驱动开发,但需要一个可落地的参考。 - 你想理解“规格”和“测试”的本质区别,以及它们如何协作。 建议学习路径:先阅读 `docs/` 下的理论部分,然后按顺序跑通 `examples/` 中的代码,最后尝试用 SDD 方法重写一个自己以前的项目(比如一个简单的 CLI 工具),这样体会最深。 **项目链接**:https://github.com/mouredev/hello-sdd
查看工具