飞跃迷雾,把OO看清楚(二)

(二)不值得做的事情,更不值得做好——再探需求
有的人说,软件建模过程有一套科学的方法论,有自己的规律,是软件长期发展演进总结出来的。对此,我是赞同的。也有人对上面电梯例子列举了一些更加优化改进的业务流程,比如更科学的算法以至于让等待电梯的人获得更加公平的机会。对此,我也认为这可能是电梯未来的发展方向。但是,以上两者看似无关联的意见以及我们讨论的电梯例子都忽视了一个重要的因素——需求,更进一步说是客户欲望。

这里可能有个问题,难道电梯运行流程不是需求吗?如果将需求看成客户欲望,那么电梯流程就不是需求。我上面例举的电梯系统,其实没有引入一个软件系统的重要因素——客户。不同客户有着不同的需求,如果客户是电梯整套设备制造商,那么他的诉求可能是安全、稳定、长期运行、无人看守等等;如果客户是要开发一套如“电梯惊魂”之类的惊悚类游戏,而要模拟一个不太正常的电梯,那么客户的诉求可能是不确定、阴暗、复古、恐怖等等。这样,客户不同,我们就得出侧重点不同的电梯(也有可能连电梯都不是)。

光讨论方法论是不够的。比如,有人说,有一套杀死蟑螂万无一失的方法——将蟑螂固定在一块木板上,用另外一块木板敲打它。这样做,蟑螂肯定必死无疑,问题是没有人会花钱“引进”这套方法。因为这个方法把最难的部分——将蟑螂固定在木板上(可以把这个过程看成捕获需求)交给了客户。所以方法论可以解决我们“怎么做”的问题。但是,不能解决“做什么”的问题。先搞清出发的方向,再考虑怎么走。我同意软件建模是有一套科学的、有规律的方法,但是不同意有了这个共识就使得建模结果趋于一致。因为即便相同的客户和相同的方法论,建模者对需求不同的考量,也会产生不同的软件模型。

写到这里,我考虑回头再看看我的标题——飞跃迷雾,把OO看清楚。我看见过,有老前辈这样的言论:“软件工程看起来已经‘进化’成一门诡辩方法论的科学,它不去解决引起问题的根源,而是力图去安抚和使用花言巧语来哄骗参与其中的人们”。可能言过了,但是事实正在向这方面发展。现在很多人在软件工程领域就言必称“模式”、“框架”,还有层出不穷的方法论,仿佛越是晦涩难懂,越让人感觉有见解有深度。我并不是贬低那些模式、框架、方法论。有人将模式定义为一种表达一定的上下文、问题和解决方案之间某种特定关系的三部分规则。我则认为,这个“上下文”、“问题”、“解决方案”三要素也可以引申到框架、方法论中。而现在正是这许多抛开“上下文”只由“问题”和“解决方案”构造的软件工程领域,让人感觉浓雾重重,深陷其中不知所在。

在软件工程世界里,一名战士手拿OO(抽象化)这把利剑,毫无畏惧的向一头怪兽,一头总是在变化的怪兽——需求,刺去……

软件工程之所以是工程,而不是工匠,其实是个人和群体的区别,而要驱动群体协同工作,需要一套方法论或模式,否则只有靠权威和专制了。

方法论是解决“怎么做”,是解决如何把客户需求“分析细化”这个方向的“怎么做”问题,这样我们才能了解客户到底是想“做什么”。不能就“方法论”论方法论,这是片面的。

为什么楼主自己在阐述客户需求和方法论时,没有想到他们之间的联系呢?而是认为彼此没有联系的两个事物呢?

引用我在我新浪微博中一个案例:
昨湖卫相亲节目,研究生有洁癖,相亲丈母娘认为会影响事业,双方各执一词,这是典型中西思维两个极端,丈母娘代表中思维,注重事物之间的联系;研究生接受西教育是西方分析思维,容易割裂联系孤立看事物。

另外关于你的老前辈一句话:软件工程看起来已经‘进化’成一门诡辩方法论的科学,它不去解决引起问题的根源,而是力图去安抚和使用花言巧语来哄骗参与其中的人们

这句话本身就逻辑上矛盾,软件工程本身就是不是科学,而是工程技术,“软件科学”才是科学,专攻算法和数学,还是取名“软件算法或算术”好了,混淆视听,老前辈说这句话本身是因为其屁股坐在软件算法这个地盘。

所以,要引导大家搞他的纯学术研究,可惜,软件工程技术中都是日常与人打交道,还是学会一套正常人的思维语言方法比较好服务于人类,否则就是你再智慧是外星人,和我们语言不通,如何服务呢?如何协调呢?每次都要翻译吗?谁保证翻译不失真?数学家先把信息传播不失真这道题目求解了再来插足软件工程吧。

人类那点数学知识能够上天入地了,可惜就能飞往星际边缘,也就离人自身越来越远,少点科学迷信,多点理智,多点朴素象形思维,不好吗?你看老美人多可爱,人家可是两者娴熟结合,而我们总是在走极端 啊。

2011年03月26日 08:48 "
banq"的内容
软件工程看起来已经‘进化’成一门诡辩方法论的科学,它不去解决引起问题的根源,而是力图去安抚和使用花言巧语来哄骗参与其中的人们 ...

表明这一观点的人,本身就是老美资深需求分析方面专家,上面所说的“问题的根源”就是现实客观世界的需求问题。事实上,他的观点是——运用方法论之前要考虑客户愿望,要考虑方向性问题,如诺不然就会出现“不值得做得事情,也不值得去做好”的问题。
比如:用例是获得业务流程的半形式化方法。那么,严格的恪守该方法,实践这一方法就能获得清晰的业务流程吗?不见得。重要的不是在于用例这一方法,而是在于获得业务流程的过程。客观世界可能有100条业务流程,根据客户需求,软件系统只需专注了解其中5条。那么,用例来表示其中的5条,就是如虎添翼。而重点是如何确定只需要了解其中5条,这是需求分析师的工作重点,是通过问题分析、寻找切入点、降低含混性、促进需求推进等一系列过程获得的。而其中用到的的沟通谈话技巧,心里分析,语言运用等等并不是软件工程特有的,而是很早就产生的学科。
所以,本文强调的是——不值得做的事情,也不值得去做好。

说的好.需求可以视为方法论的context之一.
可够选择的方法论,也可以视为实现需求的一个context,即策略集.
强调需求,还是强调需求的实现:)....两者其实都重要.

写得很很好,不值得做的事情不值得做好,也可谓是一个哲学观点,实践难度就在如何知道值得的尺度。
我随想探讨一下,成语有句:过犹不及,指事情过了还不如原来不及的程度,以很小的代价尝试也许是一种方法。客户的需求也许在不断尝试实现中不断明朗和确定的。

这个很小的代价看什么人判断标准,会模式框架的人用现成框架就迅速搭出架子尝试,而不懂模式框架的人则认为那费时,本身就是尝试不值得做好。

方向性问题研究实际是最重要的,我们宁可花费大量时间和精力在研究值得与否上,都不能拔腿立即出发。

这个现象和投资股票很类似,个股选择耗费时间精力,一旦确定个股方向确定,战术阶段就是等待。而软件需求不同是还需要讲究战术阶段的方法,否则影响判断依据。

不知我的想法方向是否已经纠正到楼主本帖强调的方向上?

其实关于某些一遇项目就想解决方案的(不深入的分析,或者根据某些过往经验),一般是一种预热做法,也就是在自己角度分析多个方面,但这些分析不是决定项目解决方案,而是去避免片面地观察问题。因为需求描述是一种形的行为,你只能通过形而描述“道”——心智模型。发表需求不是用户的职业,所以很难避免片面地看问题。所以,我们的预热行为,在这里起到作用,如对某方面描述出现缺失作出提醒,出现相悖逻辑则需认真理解,在用户不知道怎么去说的时候引导用户(如问答)……所以电梯一例中,你可以把那些分析思考当作参照,这样你就能更全面准确地获取模型。如100条需要5条,可用户描述能力有限,于是只能理解其中3条,而预热有利于发现另外的2条,同时向客户确认。

不要想着用户能够完整地描述出他自己的心智模型,我们可以不深入地先了解大概,收集多方面信息, 这些预热建模是有利的。这与我们把一个相似的项目作为参照的目的是一样的。当然不要把预热的行为,当作一切的决定。
[该贴被SpeedVan于2011-03-27 16:45修改过]

我对“不值得做的事情,更不值得做好”这个命题思考了一下,如果提升到哲学高度,实际是一个无解的题目,所以古代人做重大事情之前都要求神问卦,易经八卦就是想解决预知这个问题;如果现代科学解决这个问题,美国就可能不会陷入现在伊拉克被动局面,上帝弄人实际就是在意料之外。如果提一个试图让上帝回答的问题实际是无解的。

“不值得做的事情,更不值得做好”落实到软件领域,方法论可能都不奏效,就只能靠领域专家了,靠人了,这就是楼主谈的要不断沟通等等,但是我认为如果辅助工程技术中一些方法论,注意是辅助,比如快速建立原型系统,这些都会对沟通有帮助。

等待楼主继续,基本支持楼主的观点。

我写的这两篇文章,一个强调我认为面向对象的本质——抽象化。抽象化是实现收敛的迭代开发过程的理论基础。它也是花繁就简,实现软件创作参与者之间高效沟通的“力量源泉”。它还是适应不断变化的需求,实现开闭原则的哲学思想(迭代开发和开闭原则其实在思想上是相通的)。
另一个强调的因素是我们必须重视的——需求。抛开现时那些流行的诸多方法论,回归传统面向对象开发思想,去直接面对现实客观世界,去解决领域内的问题。
事实上DDD本身也是出于这一点而诞生的,并且更系统化的提出代码实现规律性的方法,让方案设计向实现平滑过渡。很可惜,现时又是有点太注重DDD系统设计的实现方法论,而忽略它诞生本因。仿佛有了这些方法论就能解决软件中由来已久的“银弹”问题。当然,我并不是贬低方法论,我认为重要的是有选择的使用这些方法论。

感觉已经表述完了我所想说的,不必要写第三篇了。

我觉得这与技术交流本身有关,交流不是做项目。当没有明确的需求时,则可以把一些一般认识作为需求。类似原型系统。

然而诞生的本因,很难作为一个论题,不可能与实现有相当程度的讨论。实现可以不断改进,完善,而诞生的思考不可能天天有新话题。

当然,也同意你“有选择的使用这些方法论”。但论坛本身就出于推举DDD、DCI、CQRS等这一类框架(主DDD,立场问题),当没有明确问“XXX需求,用DDD是否适合”或者“DDD的适应性”等问题时,就会自动判为已经选择DDD,而接下来就是考虑如何设计实现,可以这么说这个论坛本身就是这么一个场景。还有,“实现要先掌握才能有选择”这句话也不能忽视。

DDD不是银弹,但它在众多子弹中,是一颗相当有实力的子弹,他的确解决了我们很多时候面对的问题。选不选择他都有理由,只是我觉得选择他的理由会更多而已。