对底层的需求就是高层的设计么?

“对底层的需求就是高层的设计。”

我把这句话和很多软件方面的专家,系统方面的牛人还有软件开发的经理确认过,几乎所有的人都不约而同的认同这个说法。这句话听起来似乎有道理。如果上层是这样设计的,那么下层就要满足这些设计,这样这些上层的设计就成了下层的需求。
然而我认为,这是个致命的错误
“为领导服务还是为人民服务?”
Requirement和Design是软件开发的两个维度,Design用来承载Requirement的实现。就像体积和重量一样,两者不能互相转换,设计也不能变成需求。需求经过分析,可以被细化,分解。并且需求分析也可以有很多选择。但无论如何细化,如何分解,其结果还是需求。同样的,设计也有高层架构和底层实现,也有很多可选的方案。但不论是多么高层次的设计,它总还是于设计,成不了需求。
之所以说这是个致命的错误,是因为正是因为这个错误的理念,软件的设计者在不断的人为创造“需求”。架构的设计者做了大量的BDUF(Big Design Up-Front,预先的大量设计),然后把它们交给下面的工程师当做需求去实现。这时大部分的工程师工作的目的已经不再是满足客户需求了,而是满足这些人为创造的所谓“需求”。这样一来,一方面,产生了大量无用的代码及其相关工作;另一方面,如此设计并不一定能满足最终需求,往往要等到最后的集成测试才突然发现其实设计没有满足需求,这时往往已经大势晚矣。
在我们动手设计之前,需求分析应该已经完成了,否则设计什么东西?当然,除非是为了设计而设计。在迭代开发的模式下,在进入每一个迭代之前,需求一定已经是清楚的,并且在这一个迭代中要花时间为今后的迭代进行需求分析。现在流行的描述需求的方法是用user story,它有这样的格式:
做为<某用户角色>,我需要<某功能>,因为<某原因>。
这样,需求就明显的和设计区分开了。
设计应该是“进化”式的,随着需求不断的被实现,系统的架构与设计逐渐的浮现出来。而不是先有了架构再向里面加东西。软件设计和建筑设计不同,对于软件这样复杂而充满未知的系统,其设计只能是“长(grow)”出来的,而不是“计划(plan)”出来
诚然,有时系统的设计会影响到需求的细分。举一个例子:一个软件需要从网络自动下载网页进行处理,这个需求比较大,需要把它分解开才能进行迭代开发。那么根据系统架构,可以把需求分解为,1.从模拟接口(stub)下载网页进行处理;2.从真正的网络下载网页进行处理。这样做的好处不单单是让需求变小了,可以分成两次做甚至由不同的team来做。并且,它解开了网页处理和网络之间的依赖关系,方便实现依赖倒置
感谢Craig Larman的耐心指正,让我理清了对需求与设计的混乱概念。总之,需求就是需求,设计就是设计。

This entry was posted in Reading notes. Bookmark the permalink.

21 Responses to 对底层的需求就是高层的设计么?

  1. Yi says:

    其实前面的说法也不见得就不对,只不过容易出现“上梁不正下梁歪”的局面,而且一旦上层倾斜,下层是无论如何也无法扭转乾坤的。所以。。即使是底层的工程师也需要了解我们的客户,了解我们的行业,这才是好员工,对吧,孙悟空?哈哈

  2. 大马 says:

    概念多了就是容易混淆,以致誤事。其實軟件本無需求,設計,編碼,測試之說,不知為什么被分開來了,還分出了三六九等,直接導致貴公司的編碼者不肯承認自己是程序員。現在的敏捷,不就是再把這些匯(hui3)成一塊兒嗎?TDD,測試先行,雖然還叫test,但是已經跟瀑布式的測試不是一回事了;設計已死(指傳統方式的);連需求都變成講故事了(story)。二十一世紀,程序員,王!

  3. Terry says:

    我一直认为这是个“毁”字,英文译作shuffle。东北话里有些字眼和词是相当传神地。无端创造更多的概念当然是不应该的。但一定的基本概念对于交流和分工是很有帮助的。人类社会经历了上千年来的经验证明了抽象概念和社会分工的重要性。即便是在敏捷开发的方式下,这些经验仍然成立。所谓“hui成一块儿”,只不过是再次回到远始社会重新发现人类社会已有知识的一个无聊的过程。然而要意识到这个问题,在一个大型项目中往往要付出沉重的代价……

  4. zheng says:

    初学还是得练套路,什么时候把招式都忘了你就成了。

  5. 大马 says:

    其實我也認為是“毀”字,怕大家會誤解,以為是破壞。不去東北,無法意會。所謂毀成一塊兒,形式上似乎是退步到原始社會從新來一遍,但主人公不一樣了,我們不是原始人吧?雖然“形”是一樣的,但原始人做出來的事情是混沌,我們做出來的事情是道,有序。一個在起點,一個在終點。具體來講,我們的毀成一塊兒,是在經歷過最初的自己胡搞,然后的自以為很規矩的胡搞之后,終于明白還是要毀成一塊兒。有點兒大師那段山啊水啊的意思。大貓的意思也對,但他指的是個人修為。

  6. Yi says:

    我想起太极。。电影里的情节,无招胜有招,但只有高手才能玩得动。低级的玩招式,很好看,但没内涵;高级点的,玩内功,招式也有,但招招有内涵;顶级的,知晓天下武功,方能灵活运用,因地制宜。。

  7. zheng says:

    我是崇尚野火烧不尽春风吹又生的。鬼子那修修补补的干法瞧不上。

  8. Terry says:

    软件开发是一种社会化行为,概念与分工是不可缺的。大师山啊水啊的比方我想主要是针对个体的。当然在软件开发中第一要素是人,人的能力对生产力的影响远远高于其它任何因素。但就算是两个大师在一起工作,也要有概念才能交流,而且有所分工。

  9. zheng says:

    软件开发最好是个体行为,一个好头脑,七手八脚。

  10. 大马 says:

    又回到中庸之道,概念太多分工太細不行,但也不可缺。夠用就好。

  11. Terry says:

    中庸之道总是无往不利:-)

  12. zheng says:

    中医也是无往不利

  13. 羿人 says:

    >>设计应该是“进化”式的,随着需求不断的被实现,系统的架构与设计逐渐的浮现出来。总感觉这样长出来的东西需要定期的推倒重来。每重生一次,就会更加的漂亮。反过来说,对于不敢推到重来,或者来不起的机构或者产品,就会怕,怕长出来的东西有一天必须被推倒。不知道我们单位有没有怕过。

  14. 羿人 says:

    >>"软件开发最好是个体行为,一个好头脑,七手八脚。"太喜欢这句了

  15. Terry says:

    为什么要“七手八脚”? 大师经常问的一个问题是:“Do you think it\’s that a good engineer types faster?”为什么要“定期的推倒重来”?为什么不经常的推倒重来?大师喜欢的一句话是:“If it hurts, do it more often.”

  16. 大马 says:

    我嘗試翻譯一下給不懂英文的小朋友們聽。“Do you think it\’s that a good engineer types faster?”–天才與白癡其實是一樣的,都在某方面是天才,其他方面是白癡。天才的那方面被發現了的人就是天才,沒被發現的人就是白癡。“If it hurts, do it more often.”–長痛不如短痛,一次輪奸勝過數次強奸。

  17. zheng says:

    我怎么觉着大马第二句翻译反了呢?

  18. Terry says:

    第二句大马是翻译反了。大师的意思是次数多了就不痛了……比如说,代码的集成很痛苦。一个解决的方法是各做各的,尽量少集成,一个月或者几个月集成一次。按照大师的意思,就是如果集成很痛苦,那么就要多集成,每天集成,随时集成,即continuous integration。还有很相似的一句反话:“If it doesn\’t work, do it more often”。是用来嘲讽盲目的管理者的。

  19. 羿人 says:

    还经常推倒呢今天我们planning,我跟PO说推倒重来的方案,差点被直接枪毙掉。推一次都不一定推得动啊

  20. 大马 says:

    小朋友們看的可真仔細!

  21. Terry says:

    群众的眼睛是雪亮的。

Leave a comment