抖音技术能力大揭密!钜惠大礼、深度体验,尽在火山引擎增长沙龙,就等你来! 立即报名>> 了解详情
写点什么

敏捷的文档

2009 年 2 月 23 日

软件项目中有很多种文档,包括需求文档、设计文档、API 文档、缺陷报告、进度报告、移交文档、验收文档等等。

在传统的软件项目开发中,每个团队成员都要花费很多时间和精力去维护文档及填写各种表格和报告。第二条敏捷宣言是"可工作的软件胜于详尽的文档",据此很多人想当然认为敏捷开发不重视文档。更有甚者,有人为逃避写文档而借口敏捷开发不需要文档,成为所谓的 PAP(Pretty Adventuresome Programming)。其实这些人忽略了敏捷开发中有很多实践(比如坐在一起、现场客户、测试驱动开发、客户测试、结对编程、信息化工作间等等),敏捷借助这些实践进行信息交流,起到了文档在传统软件开发中的作用。本文通过分析项目开发中的文档类型与作用来说明敏捷开发中为什么很多文档是不需要的。

首先,需要明确文档的用途,文档是用来交流信息的。关键是团队中信息分享是否及时准确,而这与文档的多少没有必然的联系。就比如 James Shore 在博文"文档之谜"( http://jamesshore.com/Blog/The-Documentation-Myth.html )里面指出的,很多人指责敏捷开发的文档不够。其实他们忽略了问题的实质,“丰富的文档并不一定是好事,能及时得到答案才是好的”(Myth: Document is good; Reality: Answer is good)。

专业知识或者信息主要分为两类:

  • 可以被整理,文档化的知识,一般只占所有知识的 30%。
  • 占 70% 的存在于人脑中的隐含 (Tacit) 知识,只能通过人与人之间的交流来分享,口口相传。因此促进团队内部以及团队之间的交流对信息的传播更加有效。

软件项目文档通常有三种:

  • 项目文档,用于项目组内部信息交流,比如需求文档、设计文档、进度报告等。
  • 产品文档,通常是有业务价值的,是客户需要的,比如用户手册或者 API 文档。
  • 移交文档,在项目移交或者项目不同阶段之间移交的成果物。

产品文档是客户需要的,是产品的一部分,有业务价值,绝对不能省略。应该在迭代中为其安排一个文档任务。

从敏捷角度来看,另外两类文档中的很多种是可以简化或者省略的。

在敏捷开发过程中,

  • 整个团队坐在一起,移交文档变得多余了。精益思想认为移交(Transportation)是很大的一种浪费(参见 Mary Poppendieck,精益思想的原则 http://www.poppendieck.com/papers/LeanThinking.pdf ),首先移交文档会花费很大的精力,其次很多信息会在移交过程中丢失,另外每个阶段还总会添加一些新的信息。所有团队成员(PO, Dev, QA, Doc)坐在一起,用白板进行面对面的沟通,既省时又省力,还有效。(参见 Alistair Cockburn,敏捷项目中的沟通 http://www.agilemodeling.com/essays/communication.htm
  • Product Owner 跟团队坐在一起,随时回答团队成员的需求问题,是活的文档。
  • 在 Sprint 计划会议中,团队选择要完成的用户故事(Sprint Backlog 上的小卡片),形成 Sprint backlog,这其实就是迭代计划。
  • 在发布计划会议中,Product Owner 会确定发布内容,形成故事墙,这其实就是较为长期的开发计划。
  • Dev 和 QA 一起设计客户测试(一般用 Fit 类工具)。重要的用户逻辑被设计成客户测试。这种需求(客户测试)是可以运行的,因此永远不会过时(如果出现问题,持续集成系统立刻就会发出警报)。这比传统意义上的需求文档要有效得多。传统文档有太多的问题,比如很少会有人去测试文档的正确性,很少有人去及时更新文档,很少有人去检查需求覆盖率(其实根本没有办法检查,很多工具想当然的提供一些从需求到实现的追踪,但这岂不又是一种形而上学?)。
  • 在开发中微观的具体的逻辑可以设计成 TDD(或者 BDD,行为驱动开发 http://behaviour-driven.org/ ))的用例,起到了详细需求文档或者设计文档的作用。
  • 开发人员使用结对编程(很多好处,参见"我喜欢结对编程" http://www.nomachetejuggling.com/2009/02/21/i-love-pair-programming/ ,以及 "结对编程:到底有多重要?" http://xprogramming.com/blog/2009/01/28/pair-programming-how-important-is-it/ )。健康的系统架构应该是动态的,不断演进的。因此如果把它用文档固定下来,也会出现过期或者不全面的问题。在设计具体模块的时候,团队利用白板设计大体框架并确定方向,然后通过结对编程来具体实现。通过结对编程,可以很好的在团队中分享和演进系统架构信息。
  • 团队在每日站立会议中汇报进度,更新状态以及遇到的问题,所有信息会立刻反映到 Sprint Backlog,Burdown chart 以及各种图表上,成为信息化工作间的一部分,团队可以据此进行自我调整。
  • 每一次迭代之后举行反省会议,团队自我改进,也可以设计各种各样的手画表格(Ron Jeffries 在个人网站上给了一些例子, http://www.xprogramming.com/xpmag/BigVisibleCharts.htm )来监控团队自身的问题。因此传统的审查及统计的文档就变得多余了。
  • 敏捷中高层次的需求通过愿景 (Vision) 文档体现,这种文档一般只有一页,变化的可能性不大,很容易维护。
  • 高层的系统架构图还是必要的。这种高层次系统架构变化的可能性也是很小的,维护成本也比较低。
  • 代码即文档。很多敏捷大师十分注重架构清晰度以及代码的可读性(比如 Robert Martin 总结的 S.O.L.I.D 原则,Robert Martin 的 Clean Code,以及 Kent Beck 的"实现模式")。在某种意义上我们写的代码其实就是指导计算机完成任务的式样书。式样书就是为了让别人容易读懂(要不然为什么不用二进制去编写程序,放到机器上就可以运行)。

正如 James Shore 总结的,获得信息的手段有很多。

最优的手段,代码清楚、单元测试完备、命名规范,因此根本不需要问;

其次,只需要问一下旁边的人,或者打一个电话,就可以立刻得到答案,这也就是为什么敏捷鼓励“坐在一起”和“现场客户”r;

再次,Google 一下找到答案,这也不错;

……

很次,可以通过读文档找到答案。可是为了找到答案,需要读的文档越多,效果越差…


作者简介:滕振宇( Daniel Teng),Irdeto BSS 高级软件经理,CSP。对 Scrum、精益软件开发、系统架构设计、领域驱动设计有多年研究,有着丰富的实践经验以及教练经验。创建并领导 Irdeto BSS 上海开发团队并成功导入 Scrum 以及极限编程的一些实践。

2009 年 2 月 23 日 20:423855

评论

发布
暂无评论
发现更多内容

动听百年:音乐播放器发展沉浮史

艾小仙

互联网

使用 Docker 部署 RabbitMQ 没有日志?添加这两条配置,轻松搞定

AlwaysBeta

Docker RabbitMQ 消息队列 消息中间件

Mybatis【14】-- Mybatis如何实现一对多查询?

秦怀杂货店

数据库 mybatis

开放式API安全防护的七大原则

架构精进之路

API 七日更 28天写作

币币交易系统APP开发|币币交易软件开发

开發I852946OIIO

系统开发

什么是上瘾?

石云升

28天写作 上瘾

GoF23 中的对象关系模式!

Arvin

方法论 设计模式 构建模型

[JetPack] androidx.lifecycle库中ViewModel的新旧版本API差异

Changing Lin

android JetPack

如何管理过程质量?新手管理者的陷阱

一笑

管理 管理者 28天写作 质量保证

设计模式【2.1】-- 简单工厂模式怎么演变成工厂方法模式?

秦怀杂货店

设计模式 工厂模式 23种设计模式

悟透前端 | 参悟Javascript中的call和apply

devpoint

JavaScript 前端 call apply

读任正非“星光不问赶路人”有感

JiangX

华为 战略 28天写作 任正非

十个手指头弹钢琴、高水准欣赏探讨优雅益智的古典音乐技术 数学不好很难进行

Geek_459987

区块链电子证照共享平台建设方案,智慧政务系统建设

135深圳3055源中瑞8032

524页《Java中高级程序员必备核心知识》总结,令人犹如醍醐灌顶

Crud的程序员

Java 架构

区块链量化交易怎么做?

v16629866266

提问也是一门学问

xcbeyond

程序人生 方法论 技巧 28天写作

一篇让你彻底了解http请求报文和响应报文的结构

Java架构师迁哥

理解领域驱动设计

云流

编程 领域驱动设计

为什么很多事情说起来容易做起来难

Justin

学习 心理学 成长 心态 28天写作

数字资产钱包系统软件开发|数字资产钱包APP开发

开發I852946OIIO

系统开发

阿里,字节,腾讯,面试题都涵盖了,这一份Java面试文档也太强了

云流

数据库 程序员 java面试

智慧社区建设解决方案,平安社区综合应用平台

135深圳3055源中瑞8032

迁移到 Go Modules

Rayjun

go Module

Soul 源码阅读 03|WebSocket 同步数据分析

哼干嘛

Java 源码分析 Soul网关

区块链数字货币交易所系统开发|区块链数字货币交易所软件APP开发

开發I852946OIIO

系统开发

【CSS】红砖背景

学习委员

css3 前端 html/css CSS小技巧 28天写作

我是如何学习编程的?

熊斌

学习方法 个人成长 编程之路 28天写作

一个系统小BUG修复投产居然花了3个小时来处理(下)

罗小龙

28天写作 投产事故 解决思路

交易所软件系统开发|交易所APP开发

开發I852946OIIO

系统开发

大数据知识专栏 - Hadoop的资源管理 Yarn介绍

小马哥

大数据 hadoop YARN 大数据技术 七日更

Study Go: From Zero to Hero

Study Go: From Zero to Hero

敏捷的文档-InfoQ