编程思想、哲学、道与术
一切的起源:问题及问题的求解:
编程是为了解决问题,而解决问题可以有多种视角和思路;
世界观与方法论:
马克思:世界是物质的,物质是运动的;运动着的物质是普遍联系和永恒发展的;
编程思想与世界观:
我们知道,哲学领域中,最根本的对立是唯物主义和唯心主义的对立,而附属其下,又有许多对立,如形而上学和辩证法的对立、可知论和不可知论的对立等等。这些对立形成了哲学的基本体系、派别和出发点。实际上,这些对立,都是世界观的对立。世界观,简而言之即如何看待这个世界。世界观是一切哲学问题的本源和出发点。
同样,在程序世界里,也有着不同的世界观。而这其中最根本的对立便是过程论和对象论的对立,这个对立,衍生出了面向过程和面向对象两种方法论。于是,要真正理解面向过程和面相对象,我们就不得不先深究一下程序世界中这两种世界观。
首先要提到的是,不论是过程论还是对象论,都承认一点,那就是程序世界本质上只有两种东西——数据和逻辑。数据天性喜静,构成了程序世界的本体和状态;逻辑天性好动,作用于数据,推动程序世界的演进和发展。尽管上述观点是统一的,但是在数据和逻辑的存在形式和演进形式上,过程论和对象论的观点截然不同。
过程论认为:数据和逻辑是分离的、独立的,各自形成程序世界的一个方面(Aspect)。所谓世界的演变,是在逻辑作用下,数据做改变的一个过程。这种过程有明确的开始、结束、输入、输出,每个步骤有着严格的因果关系。过程是相对稳定的、明确的和预定义的,小过程组合成大过程,大过程还可以组合成更大的过程。所以,程序世界本质是过程,数据作为过程处理对象,逻辑作为过程的形式定义,世界就是各个过程不断进行的总体。
对象论认为:数据和逻辑不是分离的,而是相互依存的。相关的数据和逻辑形成个体,这些个体叫做对象(Object),世界就是由一个个对象组成的。对象具有相对独立性,对外提供一定的服务。所谓世界的演进,是在某个“初始作用力”作用下,对象间通过相互调用而完成的交互;在没有初始作用力下,对象保持静止。这些交互并不是完全预定义的,不一定有严格的因果关系,对象间交互是“偶然的”,对象间联系是“暂时的”。世界就是由各色对象组成,然后在初始作用力下,对象间的交互完成了世界的演进。
软件问题对象的问题:
1)业务逻辑的复杂型;
2)软件组件的规模;
软件复杂度的升级:一维线性(单纯计算);二维平面(带有业务逻辑的结构型计算);三维立体:描述复杂的现实世界;
针对软件开发任务的升级,编程思想也有一个相应的升级过程:
编程思想的进化;
1)面向计算:计算机出现的驱动力,具有唯一解;
2)面向过程、结构:具有有限解;
3)面向对象:具有无限解;
面向过程编程及面向过程的问题:
传统的面向过程的编程思想总结起来就八个字——自顶向下,逐步细化!实现步骤如下:
- 将要实现的功能描述为一个从开始到结束按部就班的连续的步骤(过程);
- 依次逐步完成这些步骤,如果某一步的难度较大,又可以将该步骤再次细化为若干个子步骤,以此类推,一直到结束得到想要的结果;
- 程序的主体是函数,一个函数就是一个封装起来的模块,可以实现一定的功能,各个子步骤往往就是通过各个函数来完成的,从而实现代码的重用和模块化编程!
问题:
1.软件重用性差
重用性是指同一事物不经修改或稍加修改就可多次重复使用的性质。软件重用性是软件工程追求的目标之一。
2.软件可维护性差
软件工程强调软件的可维护性,强调文档资料的重要性,规定最终的软件产品应该由完整、一致的配置成分组成。在软件开发过程中,始终强调软件的可读性、可修改性和可测试性是软件的重要的质量指标。实践证明,用传统方法开发出来的软件,维护时其费用和成本仍然很高,其原因是可修改性差,维护困难,导致可维护性差。
3.开发出的软件不能满足用户需要
用传统的结构化方法开发大型软件系统涉及各种不同领域的知识,在开发需求模糊或需求动态变化的系统时,所开发出的软件系统往往不能真正满足用户的需要。
所有编程思想共同方法论(与其它的普通问题解决相同);
将问题降纬然后重新组装;
它面对的问题:
1)如何分拆成模块;
2)如何将这些模块组装;
物理层面的表现:
文件、类、头文件。
逻辑层面的表现:模块、接口;
抽象、分析与综合;
采用的相应策略为:
1)降低开发时面对的对象的规模;
2)降低问题的复杂度;
软件开发的工作是什么?
软件开发的三次转化:
1)将需求转化为程序模型;
2)将程序模型转化为代码;
3)将代码转化为机器码;
以人为本:
人是软件的不同形态转化的关键
以分解降低复杂度
以分解的方式进行的设计,主要特点是:
- 分离职责(Seperation of Concerns,参考单一职责原则) :强调功能分离;
- 关注接口(定义交互):强调模块的组合;
◆ 面向过程编程
结构化编程思想的核心:功能分解(自顶向下,逐层细化)。
结构化编程思想主要是将一个大的问题划分为几个小的问题,再将几个小的问题划分为更小的问题,我们解决大问题非常困难,但是解决划分后的最小的问题却比较容易。
面向过程编程把编程任务划分成一个一个的步骤,然后按照步骤分别去执行。其中每完成一个步骤就像是完成一个任务中的单个过程一样。
面向对象编程思想的核心:应对变化,提高复用。
面向对象编程思想主要是复用性和灵活性(弹性)。复用性是面向对象编程的一个主要机制。灵活性主要是应对变化的特性,因为客户的需求是不断改变的,怎样适应客户需求的变化,这是软件设计灵活性或者说是弹性的问题。
软件的双重属性:
1)工具属性:软件的目的是给人使用,要实现功能。
2)工程属性:有工程就会有质量;
软件开发的通用策略:
http://blog.csdn.net/xiaojianpitt/article/details/1931058
人们在探索软件工程方法的几十年里,提出了许多软件开发的方法,但这些方法都不是严密的理论。我们不应该教条地套用方法,更重要的是学会"选择合适的方法"和"产生新方法"。
软件开发中的三种基本策略:复用、分而治之、优化与折衷。
1.复用
对于建立软件系统而言,所谓复用就是利用某些已开发的、对建立新系统有用的软件元素来生成新的软件系统。在一个新系统中,大部分的内容是成熟的,只有小部分内容是创新的。一般地,可以相信成熟的东西总是比较可靠的,而大量成熟的工作可以通过复用来快速实现,人们应该把大部分的时间用在小比例的创新工作上,而把小部分的时间用在大比例的成熟工作中,这样才能把工作做得既快又好。
我们将具有一定集成度并可以重复使用的软件组成单元称为软构件(Software Component),软件复用就是直接使用已有的软构件,即可组装(或加以合理修改)成新的系统,而可以不必每次从零做起。一方面,软件复用方法合理化并简化了软件开发过程,减少了总的开发工作量与维护代价,既降低了软件的成本又提高了生产率。另一方面,由于软构件是经过反复使用验证的,自身具有较高的质量,因此由软构件组成的新系统也具有较高的质量。
2.分而治之
分而治之是指把大而复杂的问题分解成若干个简单的小问题,然后逐个解决。这种朴素的思想来源于人们生活与工作的经验,也完全适合于技术领域。诸如软件的体系结构设计、模块化设计都是分而治之的具体表现。
3.优化与折衷
软件的优化是指优化软件的各个质量因素,如提高运行速度、提高对内存资源的利用率、使用户界面更加友好、使三维图形的真实感更强等等。我们应该树立这样的正确认识:优化工作不是可有可无的事情,而是必须要做的事情。
https://zhidao.baidu.com/question/680100884243341852.html
所谓编程思想,就是指用计算机来解决人们实际问题的思维方式。
我们在做一件事情的时候,这种方法是合理的:
- 先将一个问题分为一个个小模块,就好比书到章的这一种关系;
- 将一个小模块分为还要小的部分,就好比章到节的这种关系;
- 最终将它们分为不可分割的部分,就好比节到定义与概念这种关系;
这就好比我们实现一个程序的功能一样,先考虑大体方向,然后再逐步实现,做到不重不漏。
我们在实现程序的功能时的思维方式为:
- 整体法,确定我们想要实现的功能,把思考问题的方向对准全局和整体、从全局和整体出发,我们在此时要确定实现这个功能的主要矛盾,并做合适的取舍。
- 结构法,确定功能内部的联系,进行系统思维时,注意系统内部结构的合理性。系统由各部分组成,部分与部分之间组合是否合理,对系统有很大影响。这就是系统中的结构问题。 好的结构,是指组成系统的各部分间组织合理,是有机的联系。
- 要素法,对系统的构成部分逐个实现。
Booch最先描述了面向对象的软件开发方法的基础问题,指出面向对象开发是一种根本不同于传统的功能分解的设计方法。面向对象的软件分解更接近人对客观事务的理解,而功能分解只通过问题空间的转换来获得。
编程思想、软件工程思想、模块内变化时对其他模块的影响
http://www.cnblogs.com/feng9exe/p/6771956.html
什么是面向对象?
面向对象(Object Oriented)就是以分类的方式进行思考和解决问题。面向对象的思维方式适合于处理复杂的问题。那么,什么叫做复杂的问题?
复杂,往往指的就是“数量相当庞大”。在哲学上,我们有句话叫“量变引起质变”。当数量达到一定级别,就会出现复杂的管理问题。比如:我约一个人晚上吃饭,这个事情很简单,我只要关注整个过程就可以了。但是,如果我今天晚上约了3万人共进晚餐。这时候,首要的问题不是每个人吃饭的问题,而是这3万人怎么处理的问题?最直接的想法就是首先对着3万人进行分类处理。3万人可以分为:不吃饭的、喝粥的、吃素的、吃荤的、吃烧烤的等等。这样,我就可以让员工分类对各种情况进行合理的处理。
这种简单的、朴素的分类思想,实质上就是面向对象的思维方式。依次我们发现,这种分类思想也是管理学的一个核心理念。
面向过程和面向对象的联系
面向对象无法取代面向过程,他们是相辅相成的。面向对象关注于从宏观上把握事物之间的关系,在具体到如何实现某个细节时,仍然采用面向过程的思维方式。
面向对象如何离开了面向过程,就无法实现真正的落地,成为无源之水。
面向对象的本质和面向对象的程序语言:
面向对象的本质是什么?答案是抽象。从面对的问题域抽象出解决问题所需的对象是面向对象方法的核心思想。能否恰当抽象出足够的对象类型,特别是抽象出潜在的对象是决定软件设计好坏的关键。如果从更宽泛的角度讲,对我们所面对的复杂问题进行抽象,抓住本质,得出高度精炼的逻辑模型,对问题的求解具有重要的意义。从这个角度来说,抽象并不仅仅局限于对象的抽象,也包括流程和更高层的系统结构。
而面向对象的程序语言应该为实现面向对象的本质和特征提供支持。我们说一种语言是面向对象的,实际上是对它对面向对象的软件是想提供了支持。因此C++的虚函数、多重继承和面向对象之间并没有什么必然的联系,不过是此种语言用以支持多态和继承的手段选择罢了。
https://zhidao.baidu.com/question/2009948362326949908.html
所谓编程范式(programming paradigm),指的是计算机编程的基本风格或典范模式。
借用哲学的术语,如果说每个编程者都在创造虚拟世界,那么编程范式就是他们置身其中自觉不自觉采用的世界观和方法论。我们知道,编程是为了解决问题,而解决问题可以有多种视角和思路,其中普适且行之有效的模式被归结为范式。比如我们常用的“面向对象编程”就是一种范式。
由于着眼点和思维方式的不同,相应的范式自然各有侧重和倾向,因此一些范式常用‘oriented’来描述。换言之,每种范式都引导人们带着某种的倾向去分析问题、解决问题,这不就是“导向”吗?
如果把一门编程语言比作兵器,它的语法、工具和技巧等是招法,它采用的编程范式则是心法。编程范式是抽象的,必须通过具体的编程语言来体现。它代表的世界观往往体现在语言的核心概念中,代表的方法论往往体现在语言的表达机制中。一种范式可以在不同的语言中实现,一种语言也可以同时支持多种范式。
http://www.cnblogs.com/feng9exe/p/5592577.html
什么是软件设计的复杂度
软件技术发展的使命之一就是控制复杂度(Complexity)。从高级语言的产生,到结构化编程,再到面向对象编程、组件化编程等等。关于复杂度的定义并不一致,想要详细了解的可以读读The Many Faces of Complexity in Software Design.
英文中Complex和Complicated有着微妙的不同。但总结起来,软件复杂度偏负面意义,包括两个要点:
- 难以理解 (难以维护和扩展。)
- 无法预测行为
复杂度是随着软件规模不断扩大而必然产生的。它本身又是一个相对的概念,同一个系统对于设计者、开发者,以及维护者而言,复杂度是不同的。不同时期,一个程序员所能掌握的复杂度也是不同的,这也是一个程序员不断提升的目标。
既然业界已经对抗复杂度几十年了,我们就来整理一下。
以分解降低复杂度
以分解的方式进行的设计,主要特点是:
- 分离职责(Seperation of Concerns,参考单一职责原则)
- 关注接口(定义交互)
这是最常使用的技术了。将一个大问题,不断的拆解为各个小问题进行分析研究,然后再组合到一起。在西方称为Divide and Conquer Principle (分而治之原则)。
在结构化编程的时代,提倡模块化(Modularization)。最早提出软件复杂度的工程师提出了基于组件的软件(Component Based Software)。不知道是不是从乐高积木上得到的启发,将系统中拆分为不同的组件,各自实现,然后再组装在一起。
在架构设计中,无论是C/S风格,分层,还是N-Tier,SOA,和前面组件式一样,都是在进行分解,它们都更加强调组合交互。设计上,分分职责,定义好接口,就可以各自开发了。然后将交互限定于接口层,就能够很好的控制整个系统的复杂度。
比如应用层使用一个语音库(Speech Library,一个以库的形式的模块化应用), 根本不用关心其内部实现,只要了解如何使用它的API就可以了。
从结构化设计到面向对象程序设计
http://www.cnblogs.com/feng9exe/p/6772017.html
随着时代的发展,软件开发项目也越来越复杂。虽然面向过程程序设计思想有诸多优点,但在利用它解决复杂问题的时候,其缺点也逐渐暴露出来:在面向过程程序设计中,数据和操作是相互分离的,这就导致如果数据的结构发生变化,相应的操作函数就不得不重新改写;如果遇到需求变化或者新的需求,还可能涉及模块的重新划分,这就要修改大量原先写好的功能模块。面向过程程序设计中数据和操作相互分离的特点,使得一些模块跟具体的应用环境结合紧密,旧有的程序模块很难在新的程序中得到复用。这些面向过程程序设计思想的固有缺点使得它越来越无法适应大型的软件项目的开发,这真是“成也面向过程,败也面向过程”。
http://www.cnblogs.com/feng9exe/p/6776322.html
还是回到编程语言上来,看它们如何一步步成长起来的。在C语言问世之前的各种语言,行内管它们叫“步骤性”语言(Procedural Language)。所谓“步骤性”语言的特点是,重事件的线性过程,却不重视可能发生的变化;重步骤的前后连系,而忽略步骤的替代性和可置换性。
C语言的产生,在一定程度上解决了这个“计划赶不上变化”的问题,因为它可以把相似事件或步骤写成可置换并可共享的“模块”(Module)。
但“模块化”的编程方式并未从根本上解决问题。我们很容易看到,无论“步骤性”语言,还是“模块化”语言,都只是把世界看成直线平面的,程序只有一个维度:时间,按这个单向维度编出的程序,不足以描绘真实世界的全貌。受上世纪八、九十年代数据库从数据储存场发展到关系型数据库,进而多维数据库的启发,计算机语言也开始转变思想,进一步改革语言,让它变得灵活、立体,容易建构和适用性强,于是“类”(Class)的概念就出现了。
“类”的观念是把同类事物整合到一起,将数据、功能和行为方法捆绑起来,限制其使用权限,增加变通性。
阿尔法狗使用两个“神经网络”(Neural Network):策略和价值,在对弈的每一步,把未来各种变化建成一棵无限伸展的“蒙特卡罗树”,从中搜索出胜算更高,而非着眼于眼前利益的步法。由于人类棋手难以在有限时间内算出百步以外的结果,所以根据大量参数变量,快速运算,稳健选择,是机器人克敌制胜的不二法宝。这种神经网络方法,我在上世纪九十年代中期为一家人工智能公司工作时,也曾用过,我们采用的是美国一位物理学家进行热核聚变的计算方法。
http://www.cnblogs.com/feng9exe/p/6776316.html
结构化设计:
结构化程序设计方法主张按功能来分析系统需求, 原则有 自顶向下, 逐步求精, 模块化等.
面向对象与哲学
http://baike.baidu.com/link?url=L9od0cPynZSezvhH_QoP9kDI8oB1d9trb9hts5OtUqUyAbqsYRP_RJeuLw1oZhjtT7aPjKCB5Ur58bO4aZMKKxRMZKBiGD9aR5Baxo0cKpwUNofsImBZon8nHJe-DyaDPH6BObkIfQxG6iUJlDdaf_
系统中一切事物皆为对象;对象是属性及其操作的封装体;对象可按其性质划分为类,对象成为类的实例;实例关系和继承关系是对象之间的静态关系;消息传递是对象之间动态联系的唯一形式,也是计算的唯一形式;方法是消息的序列。
从世界观的角度可以认为:面向对象的基本哲学是认为世界是由各种各样具有自己的运动规律和内部状态的对象所组成的;不同对象之间的相互作用和通讯构成了完整的现实世界。因此,人们应当按照现实世界这个本来面貌来理解世界,直接通过对象及其相互关系来反映世界。这样建立起来的系统才能符合现实世界的本来面目。
http://www.cnblogs.com/leoo2sk/archive/2009/04/09/1432103.html
“世界观(德文:Weltanschauung)意为‘着眼世界之上’,是人们对世界的总的根本的看法。任何哲学问题的探讨,归其出发点和本源,都是世界观的问题。什么样的世界观决定了什么样的哲学观点。——马克思”
1.1、看世界
我们知道,哲学领域中,最根本的对立是唯物主义和唯心主义的对立,而附属其下,又有许多对立,如形而上学和辩证法的对立、可知论和不可知论的对立等等。这些对立形成了哲学的基本体系、派别和出发点。实际上,这些对立,都是世界观的对立。世界观,简而言之即如何看待这个世界。世界观是一切哲学问题的本源和出发点。
同样,在程序世界里,也有着不同的世界观。而这其中最根本的对立便是过程论和对象论的对立,这个对立,衍生出了面向过程和面向对象两种方法论。于是,要真正理解面向过程和面相对象,我们就不得不先深究一下程序世界中这两种世界观。
首先要提到的是,不论是过程论还是对象论,都承认一点,那就是程序世界本质上只有两种东西——数据和逻辑。数据天性喜静,构成了程序世界的本体和状态;逻辑天性好动,作用于数据,推动程序世界的演进和发展。尽管上述观点是统一的,但是在数据和逻辑的存在形式和演进形式上,过程论和对象论的观点截然不同。
过程论认为:数据和逻辑是分离的、独立的,各自形成程序世界的一个方面(Aspect)。所谓世界的演变,是在逻辑作用下,数据做改变的一个过程。这种过程有明确的开始、结束、输入、输出,每个步骤有着严格的因果关系。过程是相对稳定的、明确的和预定义的,小过程组合成大过程,大过程还可以组合成更大的过程。所以,程序世界本质是过程,数据作为过程处理对象,逻辑作为过程的形式定义,世界就是各个过程不断进行的总体。
对象论认为:数据和逻辑不是分离的,而是相互依存的。相关的数据和逻辑形成个体,这些个体叫做对象(Object),世界就是由一个个对象组成的。对象具有相对独立性,对外提供一定的服务。所谓世界的演进,是在某个“初始作用力”作用下,对象间通过相互调用而完成的交互;在没有初始作用力下,对象保持静止。这些交互并不是完全预定义的,不一定有严格的因果关系,对象间交互是“偶然的”,对象间联系是“暂时的”。世界就是由各色对象组成,然后在初始作用力下,对象间的交互完成了世界的演进。
http://www.cnblogs.com/feng9exe/p/6771887.html
面向过程就是面向解决问题的过程进行编程。
传统的面向过程的编程思想总结起来就八个字——自顶向下,逐步细化!实现步骤如下:
- 将要实现的功能描述为一个从开始到结束按部就班的连续的步骤(过程);
- 依次逐步完成这些步骤,如果某一步的难度较大,又可以将该步骤再次细化为若干个子步骤,以此类推,一直到结束得到想要的结果;
- 程序的主体是函数,一个函数就是一个封装起来的模块,可以实现一定的功能,各个子步骤往往就是通过各个函数来完成的,从而实现代码的重用和模块化编程!
http://www.cnblogs.com/feng9exe/p/6772034.html
面向过程编程是以功能为中心来进行思考和组织的一种编程方法,它强调的是系统的数据被加工和处理的过程,在程序设计中主要以函数或者过程为程序的基本组织方式,系统功能是由一组相关的过程和函数序列构成。
http://www.cnblogs.com/feng9exe/p/6771933.html
对象的抽象与关系的抽象
面向过程的设计更具挑战性,技巧性,面向对象主要在于对象抽象的技术性,一旦完成抽象,
总的来说:
面向对象是将事物高度抽象化。
面向过程是一种自顶向下的编程
面向对象必须先建立抽象模型,之后直接使用模型就行了。
http://www.cnblogs.com/dbEssay/p/6358253.html
面向对象:用线性的思维。与面向过程相辅相成。在软件开发过程中,宏观上,用面向对象来把握事物间复杂的关系,分析系统。微观上,仍然使用面向过程。
“面向过程”是一种是事件为中心的编程思想。就是分析出解决问题所需的步骤,然后用函数把这写步骤实现,并按顺序调用。
http://www.cnblogs.com/feng9exe/p/6776303.html
1)工程隐喻
在各种隐喻中,建筑工程与软件开发的关系最为密切,这个隐喻与软件开发的相似之处最多,因此影响也最为深远。这个隐喻有四个要点:分解、分配、设计和阶段化。
分解是一种极为深刻的思想,将整个过程分为几个阶段,将整个任务分解为几个子任务,将系统分解为多个层次,多个模块,将需求划分为多个类型等等。这样的思路,是解决复杂问题的唯一正确的方法,一团乱麻的需求、任务、项目、设计,根本不可能成功。但是分解也意味着它最好第一次就划分正确,当任务被层层分解,变成了很多很多的子任务、模块、子模块、类的时候。你发现有一个子任务的分解有问题,修改的困难可能极为惊人,而软件开发,在第一次就划分正确的情况,几乎绝无仅有。
分配与分解一样,是工程隐喻所特有的,当一个需要完成的系统,已经被仔细的分解之后,分解的粒度会达到一个人能过独立完成的范围,然后根据现有的资源以及任务的前后依赖关系,合理的分配给各有不同能力和特长的人,没有这样的分配,项目同样会一片混乱,而这个隐喻还包含一种(支配关系),存在分配的人与被分配的人,层层分解的任务与层层分解的人力资源,使得整个项目成为一个严密的金字塔结构,而这样的结构,往往使得项目的应变能力与可能性,随着项目的扩大而缩小。
基于以上的两个要点,工程隐喻极为顺理成章的推出了这样一个结论:“必须严格的控制需求的变更,如果可能,将所有的变更都顶回去。”纯正的软件工程的思想中,任何需求的变更都是不受欢迎的。
设计极为重要,无论是对于建筑还是对于软件开发来说,都是这样。但是设计与设计不同,在建筑行业,不体现设计师理念的建筑,会被称为没有灵魂的“水泥块”。但是在软件开发里,如果开发人员老是想着往程序里加入自己的东西,会被称为过度设计。但是由于软件开发对于建筑工程的模仿,过度设计变得比比皆是。
在建筑工程中,有着极为清晰的阶段划分,分析、设计、施工、验收。最早的软件工程,就是完全模仿这样的阶段而执行的。这样的模仿,后果是严重的,因为这样的阶段不是软件开发的特征,强行套用,大多失败。随后的改进似乎总也跳不出这个思维模式,就像用无数的直线去拟合一条曲线,用N多个正方形去拼出一个圆形。比如说螺旋式开发,在一个螺旋中,还要搞出四个象限,使得软件开发的过程,不断的重走这四个阶段。但是,软件开发的过程,真的是像建筑工程一样吗?
3)舞蹈隐喻
CMM本身不需要隐喻,它的理论基础来源于纯正的软件工程,所有软件工程有关的隐喻,CMM都用得上,但是CMM有它自身的特点,主要是在CMM的实施方面。我看到过一个关于CMM实施的隐喻:软件开发就像跳舞,软件过程改进就像是舞蹈编排,软件开发人员在过程改进专家的知道下,就像舞蹈演员在舞蹈编导的知道下,学习新的节奏、动作。最后开发出令消费者满意的软件产品。就像舞蹈演员为观众带来出色的表演。这样的隐喻,为一个巨大的咨询市场开辟了道路;最天才的舞蹈演员,也不能没有编导的知道,所以想要公司提高CMM等级,就必须找专家来做咨询,果然巧妙!但是这样的隐喻,却经不起推敲,舞蹈编排过程中,演员们排练的目标是达到编导的要求,如果演出的效果不好,自然由编导负责。但是软件开发过程的改进,如果也是为了博得咨询专家的满意,到时候软件开发出来不赚钱,那些专家可不会负责。他们早就赚到咨询费,走人了。关键问题在于,过程改进只能是一种手段,它本身不能成为目的,更不能想当然的认为,完美的过程就一定能带来完美的产品。舞蹈编导不是观众,没有一个编导敢保证自己的这次创作,一定能赢得观众的好评,但是为什么现在CMM专家,就敢作出这样的保证呢?当舞蹈演员在一个“三角形的舞台上”,完美的跌落的时候,谁会为这样的悲剧负责呢?
1. 2. 3. 4. ""Make it run, then make it right, then make it fast.90%100%Delete