UML
软件工程
组织
北京火龙果软件工程技术中心
软件开发有“统一场”吗?
来自赛迪网 作者:雷年胜 [2003/10/27]
上个世纪20年代,爱因斯坦提出了统一场理论,希望能将引力场和电磁场统一起来,也就是将微观尺度上的量子力学和大尺度上的广义相对论合二为一,爱因斯坦相信,自然界是“简单、完备和统一的”。从自然科学发展史看,自然科学理论基本概念和关系的进化,是沿不断增加逻辑统一性和简单性的方向发展,今天的科学家也仍然在朝着这个方向努力。如果爱因斯坦提出了统一场理论能够真的被证明是正确的话,那么人类对自然界的认识又跨入一个新的里程碑,人类也完美地解开了大自然出给人类的一道方程式。虽然时至今日,“统一场理论”仍然没有被科学求证,但从来如此,真理在无数谬误中潜行,最终被科学家们发现。 现代信息科学相对自然科学来说,是一门新兴的学科,还不到100年的时间,但其对人类的影响却是巨大的,即使以今天的眼光预测,它对人类生活的改变还远远没到尽头。简单的原子构成了如此奇异、多变的大自然,而更简单的“0”和“1”支撑起了信息科学的纷繁复杂,二者有着多么奇妙的相似,那么,软件开发也有自己的“统一场”吗?
软件的简单性和复杂性
软件是简单的,至少某种程度上看来是这样,否则也不会有大量的《21天学会xxx编程》之类的书籍充斥在书架上,有十几岁的少年成为软件开发高手。从学会编程的门槛看,软件开发确实比较简单的,至少和数学、机械学和外语等其它自然科学和工程学科相比,软件开发起步容易。结构化的开发方法和开发工具,如C,FORTRAN等,其线性和流程化的思考模式同人类自身思考问题和解决问题的模式非常贴近,所使用的关键词和表达方式同人类使用的日常语言相比,无论是数量还是在灵活性上,都不会更复杂。即便是现在流行的开发工具C++/JAVA/C#,采用面向对象的开发方法,用类和对象来构件软件系统,其基本模式也没有脱离人类对自然界的认识模式,生物学不就有门、纲、属、种、科吗?按面向对象的软件说法,门是顶层的基类,其它是依次继承的子类。撇开问题域的复杂度,软件开发是简单的。
很多人喜欢下围棋,我也喜欢,也可以说“会”下围棋,围棋的规则非常简单,罗列出来不会超过十多条,可是谁又能否认围棋的复杂性呢?高手如吴清源、聂卫平也认为穷其一生,他们也只能窥围棋之万一。正是围棋的简单性造就了它的复杂性,规则的简单导致下棋时无穷的可能性(当然不是真的无穷,只是数目大得已远远超过人类能把握的范围),对每种可能性的价值判断和取舍构成了围棋的复杂性。
软件开发是复杂的,从本质上看。软件开发和下围棋有些相似,入门容易,精通却相当困难,处在不同水平阶段的人都可以开发软件或下围棋,开发的结果或围棋的下法却有很大差异,认识也有天壤之别。软件本质困难究竟是什么呢?一切工具都是人类自身能力的一种延伸和加强,飞机和火车是传说中的飞毛腿,电视和广播是神话中的千里眼和顺风耳。那么,软件是什么呢?可以说软件是人类思维和智能的一种延伸和在异体上的再现,它大不同于以往人类所创造的其它工具。记得国际象棋棋王卡斯帕罗夫说,当他和“深蓝”进行人机大战时,他不觉得他的对手是一台机器,而是一个极具功力的象棋大师,有时我想“深蓝”和人们常说的一些“白痴天才”(就是某一方面能力非常突出,其它技能极差的人)很象。大型软件项目的数据、状态、操作之间的逻辑关系、人类思维的复杂性和不确定性导致的理解歧义和差异,混合在一起是软件复杂性的本质原因,一个大型软件系统无数种数据、状态和逻辑关系的可能组合使整个系统的复杂性急剧上升,使系统的设计、实现和测试都变的相当困难。软件中的一个极小的改动都可能带来灾难性的后果,形成在密码学中常提到的“雪崩效应”,在对称加密算法DES中采用轮转换位算法,当经过一定的轮次后会产生“雪崩效应”,被加密数据的任何一位数据的小变都会引起加密数据的剧烈变化,其实毛主席他老人家早就在哲学的高度阐述过这个问题,从“量变到质变”。 大型软件系统的无数细节和可能构成其复杂度的质变。
静态的瀑布模型
当上个世纪六七十年代软件开发挣扎在泥沼中的时候,先知先觉们希望找到一种灵丹妙药,拯救程序员们于水深火热之中。软件工程适时而生;由于传统的工业发展得已经比较成熟,对于工业项目的管理有一些成型的流程和控制方法,软件界希望能从中寻找解脱困境的灵感,瀑布模型将软件开发过程分为几个独立的阶段,按照顺序进行;这同制造业中工序概念非常相似,一个产品的加工由多个工序构成,每道工序结束后会测量加工误差,如果加工误差在规定的范围内,则这道工序的工作是合格的,不存在反溯的行为。可以看出,瀑布模型是完全线性的过程,当一个部分结束后,它会处在一个不变的静态。
瀑布模型过高的估计了软件项目参与人员的能力,假设每个过程经历一次后达到完美,不会再改变,但下面的任何一个问题都使这种假设成为泡影。
·人员的知识和能力是有缺陷的,对事物的认识深度有一个渐进的过程
·最终用户并不能在预期的时间里完全说清楚他的要求,有时候,连我们自己都不知道我们真正需要什么,软件开发人员怎么能苛求用户呢?
·世界是变化的,唯一不变的是变化本身,市场在变化,用户和开发人员对软件系统的认识在变化。
·时间和资源是有限的
敏捷软件开发---迭代求解
在代数学中,高次的方程式往往没有有理数解,也就是说,不存在一个人们说的清的数值能完美的符合方程式的要求,你只能无限接近这种状态,却永远也达不到。解这种方程式的方法是采用迭代的方法,给一初值作为假设解,计算结果,根据结果来调整假设解,如果假设解的误差在可以允许的范围内,那么这个假设解就是方程式的解。这和我们开发软件是多么的相似,不能期望软件系统的第一次需求、第一次设计、第一次编码就能达到完美,我们也需要迭代,需要允许变化,需要允许重构,出色的软件开发人员是能根据他的经验、知识给出了一个合理的初值和指明改进的方向来减少我们需要迭代的次数,仅此而已。多次迭代求解的方法承认了程序员、客户的局限性和事物不断变化的合理性,不求一蹉而就。
有“统一场”吗?
软件开发曾经深陷泥沼,因此人们寄希望于救世主般的方法论和开发工具,希望它们能成为软件业的“统一场”,我对此表示怀疑。也许只有当我们人类能真正了解我们自己,了解我们人类的思维模式和大脑的奥秘,我们有可能建立软件业的“统一场”。而现在我们需要是重新踏在陆地上,承认我们所能和我们所不能的,摈弃一切不切实际的幻想,一步一步前行。
版权所有:UML软件工程组织