多哥杂谈 :软件开发的途径

发布:

职坛有人问询有关问题,出了个标题如下: 

问个软件问题? 除了object oriented design, 还有什么其他 design?

问题很笼统,概念也含糊;比如 “软件” 这个词在(问题)句子中的使用。但从问题的整个句子来看, 还是能看出,问的显然是对于软件开发或设计有关的某些课题。

下面是我在职坛对其答复全文:

《从标题来看,有些概念得先跟你理清,才能一句、二句地回答你的问题》

在回答你的问题之前,有些东西还是有必要跟你进一步理清、明确,才能回答你。否侧,公说公有理婆说婆有理的, 会有多种答案。

现在很多资料都把设计指导思想 (design methodologies ) 和具体设计及落实设计方法或手段 (approaches by implementation methodologies) ,混在了一起谈论,有时候还把 software development lifecycle management 的一些软件开发管理方法,放在一起讨论,但又没有明确说明它们之间的关系。这样一来,就很容易给现在不少业内人士,在理论上,造成一定程度的困惑。对于你的问题,从这个角度来讲,就会有多种答案。而你之所以这么问,也具有同样原因。

从你问题的表象来看,你问的是如何 approach,即,如何具体落实设计的思维方法。这个思维方法,也是要体现在 physical coding 里头的。所以 approach,就属于 coding 的指导思想了。这样,我就先从设计指导思想、落实设计方法 (思想)、和软件开发管理方法(思想)等 3 个方面,简单跟你介绍一下,希望借此能帮你理清这里头的关系,从而回答你的问题(我国内学的不是 computer science 或软件工程,所以用词可能和通行的不一样):

1. 设计指导思想,应该说是种艺术,也不完全是种艺术,但绝对不像牛顿三定理是种科学。较为接近科学的且目前广为流行的是 Object-Oriented Analysis (OOA)。说它接近科学,是因为这个分析或设计指导思想, 要 think in objects。这样,就要提炼共性解析个性定义属性等等,运用抽象思维手段,来归纳确立某个 business domain 之内的 business entity 或 entities。这个 entity,在随后的设计过程中,通常就用 object 来指代描述。 在 C++ 没有产生之前,设计思想只能从 structural analysis 的途径出发,然后进行设计落实。C++ 的产生问世,使得指导思想 think in objects 得以在设计中,加以  physical (coding) 的落实。这样,从八十年代中期,一直到九十年代末期,Object-Oriented Design(OOD)一直是软件工程落实设计的思维方法的头版头条的提法。所以人们很多时候,也把 OOA 的指导思想,和它的落实方法,放在一起谈论,即:Object-Oriented Analysis/Design (OOA/D)。而 structural analysis (SA) 也依旧有它的一席之地,它的一个著名的设计落实方法叫 IDEF。IDEF - Integration DEFinition, 其实是一种设计落实语言,和落实 OOA/D 所用的 UML (Unified Modeling Language) 一样, 可以用它们来 visually 展示设计思想和方案。这样,structural 的指导思想和落实方法放在一起讨论,也就叫做 Structured Analysis and Design Technique (SADT)。所以,软件设计指导思想,即:如何具体落实设计的思维方法,就基本是这俩了; OOA/D 和 SADT, 或 OOA 和 SA。

2. 落实设计方法,其实上面我已经给出了,即 OOD 和 IDEF。也许有人会用更“古老”的说法,来代表 SA 的设计落实方法,比如 Case Tools,等等。而 OOD 之下的 physical coding,或 coding practice,则又被叫做 Object-Oriented Programming - OOP。SA 之下的 coding practice, 就叫 procedural programming。除 OOD 和 IDEF 之外,还有很多提法或说法,也很难说它们到底是属于落实管理方法的一种,还是落实设计方法的一种。这个是因为无论它们叫什么,都脱离不了上头介绍的 OOA 和 SA 这两个指导思想范畴,比如 data-driven design, test-driven design, user-centric-driven design 等等五花八门的说法。因为它们不全是科学,所以任何人,都可以在 OOA 或 SA 的设计思想指导之下,通过宣传途径,创立自己的学说。五花八门的这些说法,都离不了 OOA 或 SA 的范畴,但也有很多人忽略 OOA 和 SA 的区别,把它们列在 development methodology 的门下。这也证明了,这些个花哩胡俏的玩意儿,很难说是科学。但说起 development methodology,就和下面要谈的第3个方面,lifecycle management 或 “软件开发管理方法”,发生了关系。

3. 软件开发管理方法,基本上可以说就是 software development lifecycle management,其方式方法也是花样百出目不遐接。对此,时间有限,就不多讲了。我将一些主要的,列在下面:

     a. Agile Software Development 

     b. Crystal Methods

     c. Dynamic Systems Development Model (DSDM)

     d. Extreme Programming (XP)

     c. Feature Driven Development (FDD)

     d. Joint Application Development (JAD)

     e. Lean Development (LD)

     f.  Rapid Application Development (RAD)

     g. Rational Unified Process (RUP)

     h. Scrum

     I. Spiral 

     j. Waterfall (Traditional)

以上花哩胡俏林林种种这些软件开发管理方法,其根本,还都是最后一种, Waterfall 的变种。其中著名的还仅只是 RUP, Agile, XP, 还有就是广为人知的 Scrum。Spiral,在某些官僚主义严重的企事业,也很流行。

综上所述,对你的问题,答案就是,除了 OOD, 还有就只是 SA 之下的 structural design 的方法。另外要指出的是,SA 设计指导思想之下的设计方案,在具体 coding 落实的时候,也可以用 OOD 的思维方法;而这个时候,如我所述,OOD 就通常被叫作 Object-Oriented Programming - OOP。 

希望以上论述能对你有用。另外,由于目前软件半成品的广泛应用,诸如 SAP,OOA/D 或 SADT 都不常有人提了;但这一点,并不具备 OOA/D 或 SADT 面临消亡的意思。毕竟,SAP 这种玩意儿,也是 OOA/D 或 SADT 的产物。而工业领域内的系统工程设计,则还是 SADT 在独挡一面。

最后,再问一句,OOD 或 OOP 更底层的,比如 IUnknown 或 IDispatch 这两个 terms,兄弟您是否听说过啊?

如果没听说过但很感兴趣的话,以后有机会再聊。

有不清楚的地方,请回帖提问啊。。。网友们有不同理解的,也别憋嘴里骂俺是在瞎扯,spit it out!

推荐阅读

科技产能开发中的风险阻拦问题

开发AlphaGo人工智能软件的人原来就是他

开发中国市场, 我于小扎同行

从微软的转型看软件测试的发展 (2)

从微软的转型看软件测试的发展 (1)

多哥杂谈 :软件开发的途径

系统语言与思考的有效探讨

在ubuntu系统安装java详细教程