[理解需求变更之一]说说需求变更的必然

        歌德曾说:“哪个少男不钟情,哪个少女不怀春”。 对于需求,我们一开始的时候就是这样的。那时,我们总是希望完全理解它,我们总认为能够完全掌握它,可实际的情况是——需求变更往往在所难免。以前出现这种情况时,总觉得很沮丧,觉得自己的工作做的还不细,有些内容要让用户签字确认就好了。可在读了设计模式精解(Design Patterns Explained)中的一段话后,我忽然恍然大悟,这不是你的错,世界原来是这样子的啊。

需求变更的原因很简单:

1) 当和开发者讨论后,用户看到了软件的可能实现的新的功能,故用户对需求的理解改变了。
2) 当开发者编程来实现需求的时候,他们对需求更加熟悉了,所以他们对需求理解也改变了。

Requirements change for a very simple set of reasons:

1) The users'view of their needs changes as a result of their discussions with developers and from seeing new possibilities for the software.
2) the developers' view of the users' problem domain changes as they develop software to automate it and thus become more familiar with it.

三极世界和需求变更的必然

        我的理解,上面那段话告诉我们——需求、客户(开发者能接触的客户)、开发者是一个三极世界。这三极的沟通是很不容易的,让我们看看一般的需求调研的场景,客户向我们滔滔不绝的描述需求,开发者听得头晕脑胀,但又不得不根据这些来理解需求,有的时候我们也会派好几拨人轮番折腾客户,这样客户也晕头转向,有时巴不得赶快调研结束。

        这样的需求调研像透过布满小水珠的玻璃看世界一样,即使能够看清轮廓,但细节的丢失在所难免,有的时候因为丢失这些,你把女的看成男的,活的看成死的。之所以这样,有下列这些原因:

1) 客户对需求进行了过滤。有的时候是因为他对需求的理解不准确,因为和我们沟通的常常是信息中心的人,他们对需求的理解一般比不上业务人员;有的时候是因为他是某一个部门的人员,他仅仅会以他的视角来描述需求,财务人员的视角和销售人员一定有所不同,一个高管的视角和一个普通人员也一定不同。

2) 开发者对需求的理解偏差。偏差分为两种:一是开发者团队的偏差,由于缺乏知识,我们对有的需求理解错了。二是开发团队中内部的偏差。比如有的公司,有专门的需求调研人员负责需求,他们水平较高,比较专业,可是他们往往同时做好几个项目,所以在调研完成后,他们便不在团队中,这样偏差便难免。还有些时候内部的沟通、人员的更替都是造成偏差的原因。

3) 需求本身的矛盾性和混沌性。矛盾性表现在,有的时候需求本身是矛盾的,一些业务流程是冲突的,如果我们及时不能发现它们,取舍它们,在项目后期,这种大的需求变更将如期而至;混沌表现在,很多的时候,用户希望通过软件来提高他们的管理水平,这种情况下他们的需求往往是不够清楚的,虽然可以从业务流程出发,可是用户通过使用软件,总能发现许多可以改进的地方,这样源源不断的需求变更就来了。

        由此可见,在这样的三极世界,需求变更是必然的。

相关推荐:

如何理解 doctest 中的 “Got nothing” 错误提示

当doctest报错“gotnothing”,意味着被测函数未产生任何可显示的输出(如返回值为none或未显式打印),而预期却有明确输出(如private:80),导致断言失败。 当doctest报错“gotnothing”,意味着被测函数未产生任何可显示的输出(如返回值为none或未显式打印),而...

如何理解 doctest 中的 “Got nothing” 错误及其修复方法

doctest报错“gotnothing”表示函数实际未产生任何可显示的输出(如返回none或无print),但测试用例却期望看到具体值(如'private:80'),本质是返回值与预期不匹配。 doctest报错“gotnothing”表示函数实际未产生任何可显示的输出(如返回none或无prin...

Python生成器yield关键字怎么理解_掌握惰性求值优化大内存处理

yield将函数变为生成器工厂,调用返回generator对象而非执行结果;与return的本质区别在于:return终止函数并丢弃局部变量,yield暂停函数并完整保留栈帧(含局部变量和执行位置),下次从yield下一行继续。 yield是什么,它和return有什么本质区别 yield不是“暂停...

为什么Python中的元组比列表更适合作为字典键_理解元组的不可变性与哈希值

元组能当字典键而列表会报TypeError,因字典依赖哈希表,要求键不可变且__hash__恒定;元组若含可变元素(如列表)也不可哈希,单元素元组须写为(1,),用str或json.dumps替代会丢失语义、降低性能。 为什么元组能当字典键而列表会报TypeError 因为字典底层依赖哈希表,而哈希...

为什么Python 3.11的字典操作变得更快_深入理解哈希表底层优化

Python3.11字典操作更快,因哈希表桶定位改用掩码运算替代取模,且setdefault字节码路径优化;无需改代码,升级即生效,兼容性不变。 Python3.11的字典操作变快,不是靠改dict接口或加新方法,而是解释器底层对哈希表的访问路径做了特化——尤其是键查找和插入时的指令跳转更少、缓存局...