{T}

接到需求任务-先定好验收标准

接到一个新的需求,开发一个单点登录的服务,经过几天的奋战,顺利地写完了所有的代码。正好产品经理小王路过他身边,顺便问了他一下

小王:单点登录做得咋样了?

小李:做完了,我给你演示一下。

小李演示了一遍自己做的功能,小王看上去很满意

小王:不错。但怎么没有支持验证码?

小李:为什么要做这个?

小王:这不就是登录的一部分吗?

小李:哪里规定要做验证码了?

小王:现在做登录哪有不用验证码的?

双方有分歧重要的原因是,开始实现这个需求之前,任务双方都没有清晰地定义好边界,没能把需求描述清楚

需求描述的问题

在软件开发中,程序员做什么一般都由需求来定义。需求是软件开发的一个重要组成部分,但不同的需求描述方式,会影响程序员对需求的理解。

很多公司的软件开发模式是基于功能列表的,这个列表规定 程序员要做的功能,各个组从产品经理那里领来开发列表,然后“开始写代码。但是通常这种功能列表只是一些简单的描述,并不能看到全局。

很多团队的状态就是,程序员们都知道要开发的功能是什么,但这个功能是谁在什么样的场景下使用的,很多人却回答不上来。如果你去问他为什么要开发这个功能,他通常会说:这是功能列表里规定的。

不到最后一刻,大多数人并没有一个完整的图景。顺着这个思路做下去,会在最后关头遇到许多意料之外的问题,其结果必然是手忙脚乱。

所以当你的组完成了一个功能时,这个功能却可能上不了线,因为你还要依赖于其他组的工作,而这个组不巧,却刚好把相关的功能开发排在了后面。

所以当我们对产品经理说 “时间不足,砍掉一些需求吧。”得到的答案肯定是,“对不起,做不到,因为需求已破碎,没办法调整。”

因此,一些新的需求描述方式也就应运而生,这其中用户故事(User Story)是比较好的一种方式。它是站在用户的角度来描述了一个用户希望得到的功能,关注用户在系统中完成一个动作需要经过怎样的路径

用户故事

以用户密码登录为例,看看用户故事长什么样?一个完整的用户故事大致包含以下几个部分:

  • 标题,简要地说明这个用户故事的主要内容,比如:注册用户使用用户名密码登录。

  • 概述,简要地介绍这个用户故事的主要内容,一般会用这样的格式:As a (Role), I want to (Activity), so that (Business Value)

    • 意思就是:作为一个什么角色,要做什么样的事,以便达成一种怎样的效果。其中最重要的是,告诉别人为什么要做这件事,虽然只有一句话,却往往是很多人欠缺的思考,只知做,不知为何做

    • 举个概述的例子:作为一个注册用户,我想要通过用户密码登录,以便我可以使用注册用户才能够使用的服务

    • 详述,详细地描述这个用户故事的完整流程,我们会把操作流程、用户界面等信息都放到这里

    • 比如:用户使用正确用户名和密码登录,就可以登录成功;如果密码不正确,则登录页面提示用户“用户名密码不正确”。基本上,看到这个部分,程序员就可以在心中描绘出这个用户故事的样子

    • 超出范围的部分,比如:第三方登录不在范围内,这个部分主要是限定人们不要进一步发散

  • 验收标准,这个部分会描述一个正常使用的流程是怎样的,以及各种异常流程系统是如何给出响应的,这是程序员常常会欠缺的思考。它会把详述中很多叙述的部分变成一个具体的测试用例。比如下面给出的两个验收用例:

    • 正常场景:给定一个注册用户张三,其用户名是 zhangsan,密码是 foobar,当张三使用 zhangsan 和 foobar 登录系统时,可以成功登录,登录成功后,跳转到用户中心

    • 异常场景:给定一个注册用户张三,其用户名是 zhangsan,密码是 foobar,当张三使用 zhangsan 和 wrong 登录系统时,登录失败,在登录页面上提示“用户名密码不正确”

用户故事的关键点:验收标准,它可以清晰地定义出需求边界。

验收标准非常重要的一环是异常流程的描述。大部分程序员都擅长解决正常流程,而异常流程则是最容易忽略的,也是产生扯皮的关键环节。

采用用户故事之后,经常在写完了主要流程之后,再去看一下验收标准,为自己的开发查缺补漏。当说自己开发完成,可以交给测试人员测试时,需要照着验收标准给测试人员演示一遍,证明系统确实能够跑通。这之后,测试人员才会把系统接手过去,做更系统的测试。

验收标准给出了这个需求最基本的测试用例,它保证了开发人员完成需求最基本的质量。如果你了解 BDD(Behavior-Driven Development,也就是“行为驱动开发”),就可以按照验收标准中给出的内容编写验收测试用例了。

在实际工作中,许多产品经理把需求交给开发人员之前,很多细节是没想清楚的,那种功能列表式的需求常常只包含了正常路径,那些缺失的细节就是在后续的过程中,由开发人员补全的。用户故事就是一种固定的格式,让他们把这些应该想清楚的问题想清楚。

如果你的团队采用用户故事的格式进行需求描述固然好,如果不能,在功能列表中,补充验收标准也会极大程度地改善双方协作的效率。

你的角色

产品经理通过用户故事的方式,将需求实现细节都描绘得清清楚楚,那程序员的发挥空间在哪里?请注意,验收标准所给出实现细节应该是业务上的,程序员在这种问题上思考才是真正意义上的浪费时间,我们的发挥空间应该是在技术实现上。然而在现实情况中,很多团队做不到这种程度。

你会发现,在开发中之所以会“丢三落四”,很重要的一个原因是,在开发一个功能特性的时候,因为一些环节的缺失,我们不得已扮演了很多的角色,其中之一就是产品经理。你是一个专业的程序员,但大多数情况下,你却只是一个业余的产品经理,“丢三落四”就在所难免了。

或许你会说,我在一个小公司工作,公司没那么多人,没有专门的产品经理,只有我们几个“全世界都缺”的程序员,需求都是老板扔给我们的,谁来帮我们写验收标准呢?

没办法,答案只能是你自己。虽然你名义上是程序员,但当拿到一个需求的时候,你要做的事不是立即动手写代码,而是扮演产品经理的角色,分析需求,圈定任务范围。相信我,事前分析绝对比你拿一个写好的系统给老板,而他却告诉你这不是他想要的,好太多了。

扮演不同角色的时候,思考模式是不同的。还是以开发用户名密码登录为例,你想到的可能是:输入正确的用户名和密码可以正常登录,输入错误的用户名和密码不能登录,并且给出提示。

如果只扮演开发人员的角色,想到这些就算不错了。但如果扮演的是产品经理的角色,会从产品的角度进行思考,也就会看到不同的内容,比如:

  • 登录是否需要验证码
  • 是否需要第三方登录
  • 用户名和密码的长度在系统内是否有限制
  • 密码是否需要满足一定的规则
  • ……

如果让你来填写,这个列表会更长。可能这并不是都需要完成的功能,但站在分析的角度,这都是我们要考虑的问题,一个登录功能,绝不仅仅是用户名和密码校验那么简单的。我们能想到这些,仅仅是因为我们正在扮演一个不同的角色。

如果要兼顾开发人员和产品经理两个角色,建议先扮演好产品经理的角色,多花点时间把验收标准制定好,再回到开发人员的角色上去写代码。毕竟,最好维护的代码是没有写出来的代码