分享
 
 
 

再谈软件的开发与遐思

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

再谈软件的开发与遐思

(本文系西北工业大学缑林峰老师原创文章,特此声明)

这两天本科生的毕业设计已经开始了,我负责五个学生。项目的内容是航总APTD计划中的子项目(我对于毕设老师只给本科生一些小儿科题目的做法一直深恶痛绝)。这两天的答疑中,我所遇到最多的提问就是“如何才能编好程序?”这个看似简单的问题,却让我无从回答,朦胧间突有感触无限,故提“盘”敲录,一吐为快。

首先,我们要明确一个基点(否则其它无从谈起)——即什么是软件?这个问题根本的如同问同学“你们为什么要学习?”是啊!什么是软件呢?在我回答之前,我想起一个与之很等价的问题“什么是数学?”伽利略这样回答“数学是上帝书写宇宙的文字”。这个回答力道十足。数学本质上是一种人们对客观世界的抽象映射。举个简单的例子,弹簧的位移与弹簧的拉力之间存在着一定的内在联系,这种内在联系是客观存在的,我们在认识和改造自然的过程中,发现了这种联系。而且我们需要将这种联系以一种人为的定义将它固化。于是,睿智的大脑发明了数学,一种很神奇的符号,其神奇的程度足以让世人为之顶礼膜拜。简单的说就是人们利用数学公式F=KX完成了现实世界的问题到人脑思维问题的映射。以后我们就可以利用这个数学映射,在仅仅看到可观察的位移时就能知道我们所不可以直接觉察到的“力”的存在和大小。神奇吧,放松你的神经,无限拓宽你的思维,充分想象我们所拥有的数学知识,四则运算、方程组、复数、微积分、微分方程、复氏变换……..这所有的一切都来源于我们对现实世界的真实理解!

现在回到最初的问题“什么是软件?”如果你能理解上面的内容,我想你一定可以感悟到我下面的回答。软件同数学、文学一样,也是我们对现实世界的一种理解和描述方法。例如一套财务管理软件,它不是凭空而出,是因为现实生活中客观存在了一种财务管理体系,我们只不过用程序语言,这种神奇的符号,将它映射到了无形的计算机的空间中。想起《骇客帝国》中的经典画面吗?那一串串不断坠落的符号,Huh!,matrix,计算机永恒的母体世界!

在静寂的空宇中,一种神奇的物质形成并诞生了。它立刻便静止了,独自空侯着,毫无动静,然而又处于永恒的运动之中。它是所有软件的源头,我不知它的名字,所以我将它称之为编程之道。

对于我的回答,有人可能会不屑的驳斥,“软件有那么神秘吗?它不就是一行行的程序吗?”非也!软件的“软”主要就体现在它的“无感性存在”(我发明的词语),这个词包含三方面的意义。其一,无感性就是不可感知,无形无义;其二,存在就是客体的运动永恒变化,其三,凡具有此特性的物质,作用非凡。这就是软件真正的本质所在,也是它的高深和难以控制之处。

为了增加对软件科学的理解,许多人将它与其它学科作类比,如建筑科学、制造业等。我个人更愿意将它同数学作类比。回想一下,我们大一参加的生产实习,不管是在机加车间作个小榔头,还是在电路试验室作个小收音机,这些都是“有形存在”,不管它多么复杂,它始终是可以感触的。而软件呢?那一行行的code是软件吗,不是!那只是人们的描述,如同小榔头的设计图纸。

软件的运行态就是CPU晶振所产生的0、1二进制脉冲。而它对有形世界的冲斥缤纷无限。因此软件的固性简单的不值一提,软件的变化复杂的无与伦比。我们对这个世界的一切感知都来源于我们的大脑,而这一切仅仅建立在神经纤维的排列和微弱的生物脑脉冲。再如同质能方程 W= M*C*C,对于质量与能量之间的转换关系,这个困扰物理学家数百年的问题,爱因斯坦用如此简单的算式就表述清楚了。三个数的乘法运算对小学生都是简单不过,但是它所蕴含的杀伤力却足以毁天灭地。

软件的“无感性存在”体现的淋漓尽致!

OK!上面的论述可能太抽象,下面我尽可能用通俗的语言来解释第二个问题,即“什么是软件开发?”

软件开发的过程就是人们使用各种计算机语言将人们关心的现实世界映射到计算机世界的过程。

现在的计算机的数学理论基础是由计算机的开山鼻祖,大名鼎鼎的图灵于1937年提出的图灵机模型。随后不到十年,电子计算机就诞生了(1945)。(埃尼亚克) 我们都知道,它当时的主要任务之一就是用于导弹弹道轨迹的计算。当时的软件开发(如果可以称之为软件开发的话)与现在的大不相同。为了算一道题,要有人事先把完成加减乘除等各类运算的部件像搭积木那样搭起来,如果换一道题,则要把这些部件分解开来,根据新的要求重新搭建,效率极低(与现在比)。

现代电子计算机的体系结构及实际计算模型来自冯.诺依曼的思想。1946年他和他的同事们发现了埃尼亚克的缺陷,发表了一份报告,提出了程序放入内存,顺序执行的思想,这样,当算一道新题时就只需采取改变计算机中的程序的“软”的方法。

英国的科学家维尔克斯实现了冯.诺依曼的思想,领导研制了“艾克萨克”,在技术上比埃尼亚克来了个大的飞跃。因此,现在的计算机通常被称为冯.诺依曼计算机。

软件开发的历史也从此正式开始。

早期程序员们使用机器语言来进行编程运算;随着编译技术的出现,人们设计了许多更高级别的语言;这些语言摆脱了机器语言繁琐的细节,更接近于人的自然语言,迅速流行开来。据统计,全世界的高级语言起码有几千种,但从可计算性的角度看,它们的计算能力都等价于图灵机。已经证明,一个计算机语言,只要除了赋值语句之外,还包括顺序语句,条件语句和循环语句,它的计算能力即相当于图灵机。这里当然要排除其他技术因素的影响,如程序长度,变量个数,数据精度等。

由于图灵机的想法是把问题转化为一步一步按规则执行的机械求解过程,各种计算机语言也不过都是某种形式语言,因此软件开发的过程实质上就是程序员们对客观世界问题域的形式化的过程。程序员们先建立问题的模型(形式化),再用计算机语言加以合适的表达,最后再输入计算机里进行计算。

从 PO(面向过程)到OO(面向对象)

从上面的论述我们知道:

软件开发的过程就是人们使用各种计算机语言将人们关心的现实世界(问题域)映射到计算机世界的过程;如下图:

现实世界问题域 → 建立模型(借助某种建模思想) → 编程实现(借助某种编程语言) → 计算机世界执行求解

在谈论OO之前,先让我们回顾一下高级语言的历史。

最早的高级语言大约诞生于1945年,是德国人楚译为他的Z-4计算机设计的Plan Calcul,比第一台电子计算机还早几个月;在电子计算机上实现的第一个高级语言是美国尤尼法克公司于1952年研制成功的Short Code;而真正得到推广使用,至今仍在流行的第一个高级语言是美国的计算机科学家巴科斯设计,并于1956年首先在IBM公司的计算机上实现的FORTRAN语言。

早期的高级语言主要是应用于科学和工程计算,其代表作有FORTRAN和ALGOL60。计算机进入商业和行政管理领域以后,出现了COBOL和 RPG等便于商界使用的语言。近年来,这类语言和数据库技术,图形界面技术(可视化编程),面向对象的思想及RAD(Rapid Application Devolopment)的概念相结合,形成了一批更方便使用的所谓第四代语言(4GL),如Powerbuilder,Delphi,VB等。

前一类应用于科学和工程计算的大型语言相对来说更为基础,因而也更为灵活,应用范围更为广泛。在FORTRAN,BASIC(学习型)之后,自70年代以来,模块特征更明显,简单易用,可靠性强的PASCAL异军突起,在世界范围内广泛流行。但进入80年代以后,它的地位又逐渐为更实用的C语言替代。到现在,C语言的地位已相当于一种“高级汇编语言”了。

80年代后期,面向对象的语言开始浮出水面,C++借助使用C语言的庞大程序员队伍,一举建立了面向对象语言的老大地位。从而OO的思想正式统治了整个软件开发界。C++的流行甚至使得美国军方从80年开始大力扶植的Ada语言还未及推广便胎死腹中了。

90年代以后,计算机世界更是发生了天翻地覆的变化,原先的单机平台让位于WEB,“网络就是计算机”,新的语言不仅要是OO的,Visual的,更要是基于WEB的。Java语言借INTERNET的东风,横空出世,一夜红遍天下,变化之快令人瞠目结舌。

上述这些变化,表面是不同的编程工具在城头变幻大王旗,但其背后反映的却是一种更为深刻的认识论的改变,即你是用何种观点来认识这个世界的?在PO中,程序员们分析了问题域之后,得到一个PO的模型,其中常见的词语是变量,函数,过程等;

PO: 现实世界 → 流程图(变量,函数) → PO语言 → 执行求解

在OO中,程序员们先得到一个OO的模型,其中常见的词语是类,对象,方法,消息等;

OO: 现实世界 → 类图(对象,方法) → OO语言 → 执行求解

我们可以看到:

PO更接近于计算机世界的物理实现;OO则更符合于人们的认识习惯;

如果说,软件危机的根源在于人们认识表达的过程(不断反复,逐步深化)和冯.诺依曼计算机的实现过程(顺序执行)之间存在巨大鸿沟的话,那么从PO到OO意味这这鸿沟在逐渐缩小;

OO作为一种思想及编程语言,为软件开发的整个过程——从分析设计到coding——提供了一个完整解决方案。OO堪称是软件发展取得的里程碑式的伟大成就,人们无不为之喝彩!

软件开发技术的进步史就是人们对软件科学的认知过程,问题解释到现在这个地步,我们不妨作一个大胆的假设,OO的极限在那里?即OO之后会是什么?如果我们能够预知未来的话,那我们就会明确前进的目标。(可惜,很多时候我们都不知道what’s the future)

一、 从软件工程的发展历史来看

1969年NATO会议之后,“软件危机”成为人们关注的焦点。为迎接软件危机的挑战,人们进行了不懈的努力。这些努力大致上是沿着两个方向同时进行的。一是从管理的角度,希望实现软件开发过程的工程化。这方面最为著名的成果就是提出了大家都很熟悉的“瀑布式”生命周期模型。它是在60年代末“软件危机”后出现的第一个生命周期模型。如下所示。

分析 → 设计 → 编码 → 测试 → 维护

后来,又有人针对该模型的不足,提出了快速原型法、螺旋模型、喷泉模型等对“瀑布式”生命周期模型进行补充。现在,它们在软件开发的实践中被广泛采用。

这方面的努力,还使人们认识到了文档的标准以及开发者之间、开发者与用户之间的交流方式的重要性。一些重要文档格式的标准被确定下来,包括变量、符号的命名规则以及原代码的规范格式。

值得一提的是,在开发者之间、开发者与用户之间的交流方式这方面,由于Internet的出现提供了一种全新的交流手段,也产生了一种基于Internet的全新的开发方式,即OSS(Open Source Software)。 其代表作有Linux(操作系统)等。OSS是一种极有前途的开发方式,借Internet发展的大潮,它势必会对整个软件开发模型产生很大的影响。

软件工程发展的第二个方向,侧重与对软件开发过程中分析、设计的方法的研究。这方面的第一个重要成果就是在70年代风靡一时的结构化开发方法,即PO(面向过程的开发或结构话方法)。PO是人们在用计算机世界来表达现实世界时,追求过程话、模块化、封装以及更高的抽象的结果。人们用计算机来映射现实世界时,最低层的实现无非是靠数字电路技术产生的高电平与低电平信号。用数学的语言来表示,就是像 010101000010111 这样的二进制串。这样的抽象层次是极低的,远离了自然语言,对一般人是不可理解的。人们把这些二进制串分块定义,提出了字节、ASCII码这样的更高抽象层次的概念,使之对应于自然语言的一个个字母。在此基础再借助某种形式语言,抽象出变量、表达式、运算、语句等概念。在这个层面上,一般经过训练的程序员已经可以比较不那么痛苦地进行软件开发了。下一步的抽象就产生了PO。在PO中,人们关注的是如何用函数和过程来实现对现实世界的模拟,将其映射到计算机世界之中。OO是这种抽象层次不断提高的过程的自然发展结果,它采用类和对象的概念,把变量以及对变量进行操作的函数和过程封装在一起,用这种更高一级的抽象来表达客观世界。通常,一个对象包含一些属性和方法,它对应于自然语言中一个有意义的名词,描述了现实世界中的一个物体(物理实体)或概念(抽象实体)。这个抽象层次如下图所示:

计算机世界中的抽象层次

* XO(X?-Oriented) 最高的抽象层次

* OO(对象、类)

* PO(过程、函数、变量)

* 变量、运算、表达式、语句

* 字节(4位、8位、16位、32位、64位)

* 二进制串 0101011110001 最低的抽象层次

从上图及以上的讨论我们知道,软件工程的发展历史就是人们不断追求更高的抽象、封装和模块化的历史。OO当然不会是历史的终结。尽管不能精确得到OO之后是什么,我们至少可以推知,OO之后的XO,必然将是比OO更高一级的抽象。它所依赖的核心概念必然高于并包容对象这一概念。正如对象高于并包容了函数和变量一样。

二、 从维特根斯坦在《逻辑哲学论》一书中的思想来看

维特根斯坦在《逻辑哲学论》 一书中提出了如下思想:

* 世界可以分解为事实 ( The world divides into facts.)

* 事实是由原子事实(atomic facts)组成的。

* 一个原子事实是多个对象(objects)的组合。

* 对象是简单的(基本的) The Object is simple。

* 对象形成了世界的基础。

即: 世界---事实----原子事实----对象这样一个从整体到局部、从抽象到具体的认识之链。在这个层次中,对象作为最基本的模块,构成了整个认识大厦的基石。对象通过相互之间的复杂的关联构成了整个世界。这个观点也是面向对象理论的基石。

上一段我们通过对计算机世界的分析得出,OO之后的发展,必将产生比OO更高一级的抽象的概念用于编程。按照维特根斯坦的思想可以很自然地得出结论:这个概念就是事实(FACT)。即面向对象之后是面向事实,OO之后是FO(Fact-Oriented)。那么,什么是事实(fact)?让我们再次重温一下维特根斯坦的观点。

首先,世界是所有事实的总和。世界可以分解为事实。任一事实或者为真,或者不为真。(即事实应返回一个布尔变量,或为TRUE,或为FALSE)

其次,那些为真的事实,是由原子事实(atomic facts)组成的。

原子事实和简单对象的关系是这样的:一个原子事实是多个对象(object)的组合。在原子事实中,对象以某种确定的方式相连。原子事实中对象相互连接的方式即是原子事实的结构。也就是说,原子事实是有结构的,这种结构被维特根斯坦看作是现实世界的模式(form)。

这里,维特根斯坦提出了几个重要的概念:事实(fact)、原子事实(atomic fact)和模式(form)。

如果我们以上的推理过程正确的话,我们将得出一个结论:面向对象(OO)之后是面向事实(FO),在面向事实(FO)的分析、设计和编程中,我们将主要围绕事实(fact)、原子事实(atomic fact)和模式(form)这些基本概念来组织我们的软件开发活动。在人们认识世界的层次结构中,这些概念是比对象(object)和类(class)更高一级的抽象。

我个人的大胆预测,面向对象之后的软件设计思维将是面向模型驱动(Model_Based-Oriented)的设计方法。它以模型驱动核心,这里的模型包括两个方面:技术模型和事实模型。设计模式(Design Patterns)就是技术模型的前兆。现在已经出现的这一技术转移的趋势,如Rational公司为VS.NET提供的XDE,以及Delphi 7.0包含的模型驱动体系结构。

5. 最后的极限

OO之后如果FO,那么我们当然要问,FO之后又是什么?再往后哪?有没有一个最后的极限?若有,极限何在?这是个很困难的问题,不过还是让我们继续思考下去,看看能有些什么结果,尽管它可能会是十分愚蠢和幼稚。

我们知道,软件的实质是人们以计算机编程语言为桥梁,将客观感知世界映射于计算机世界中去,以解决人们在客观感知世界中要解决的问题。这里牵涉三个主要的范畴:

客观感知世界--------计算机编程语言----------计算机世界

(1)计算机世界

在计算机世界中,可以想象的是,单位面积的一块芯片上可以集成的晶体管数目总会有个上限,摩尔定律早晚要失效。另外,现在多数电脑采用的冯.诺依曼结构也需要被突破。(如并行计算的研究)

(2)计算机编程语言

现在的计算机编程语言,都是某种类型的形式语言。要解决一个问题,首先我们必须为它构造算法。也就是说,对于没有算法的问题,我们是束手无策的。这类问题被成为是“不可计算的”。它们的解不能由图灵机来产生。这是我们面临的一个极限。

那么一个问题有了算法,是不是就一定可以解决哪?很遗憾,答案是不。对于那些NP(非多项式)问题,尤其是NP完备的问题,尽管存在算法,我们仍然是无法在多项式时间内解决的。著名的“哈密顿线路问题”和“旅行推销员问题”都属于这类问题。它们的共同特征是,当问题的规模(或复杂度)线形增加时,解决该问题所要化的时间将呈指数上升,以至于它们尽管理论上是可求解的,但实际上却是不可能的。因为要花费的时间可能已经超过了宇宙的寿命。这也是我们面临的一个极限。

还需要指出,现在的计算机语言作为形式语言的一种,也必然具有形式语言自身所有的局限性。数学的发展史上,曾经有三次危机,第三次危机是有罗素的一个“佯谬”引发的悖论危机。为解决此危机,希尔伯特提出了宏伟的形式化规划,企图使数学一劳永逸地处于无可争辩的安全基础之上。可是,1931年奥地利25岁的天才数学逻辑学家歌德尔提出了一条划时代的定理,粉碎了希尔伯特形式化的美梦。哥德尔定理向我们展示,公理系统本身的协调性的陈述在被编码成适当的算术命题后,将成为一道这样“不能决定的”不能决定的命题。想象一个表达式既不为真,也不为假,它的真假对一个形式系统(计算机)而言它是不可判定的。因此在这方面,哥德尔定理是我们面临的又一个极限。

(3)客观感知世界

现在让我们假设软件工程已经发展到了这样一个理想的境界,有一天我们实现了自然语言编程,是否就万事大吉了?换句话,自然语言是否能很好地描述、表达客观感知世界?维特根斯坦在《逻辑哲学论》里已经指出了。

* 世界的意义必定存在于世界之外;

* 显然伦理学是无法表述的。伦理学是超越现实的;

* 实际上存在着不可表达的东西;这显示了它的存在;它是神秘的。

也就是说,外部世界中存在一些我们可以感知却无法用语言来表达的东西。

他接着说:

“对于那些不可言说的,必须保持沉默。”(Whereof one cannot speak,thereof one must be silent)

这句话,成为我们最后的极限。

在讨论完这三个范畴中我们将面临的主要问题后,我们最后来讨论一下人的主观世界对软件及软件开发的影响。

6. 极限之外的空间

世界可以分为主观想象世界和客观可感知世界,或者说是内世界和外世界。其中,主观想象世界是计算机从未涉足的空间。这是属于我们个人的私有空间,充斥着我们自己离奇古怪的幻想和起伏不定的情绪。它具有极大的跳跃性和不确定性,常常以直觉、想象的方式进行着自己的活动。它们通常是语言所不能表达的。

尽管这个内世界是如此的复杂、混乱、难以捉摸,但它却是我们与生俱来的一部分。 我们就是这样的人。

就是这样的人从事着软件开发的工作。

这样的人开发出来的软件究竟在多大程度上是对客观世界不折不扣的映射?还是这个映射过程已经被扭曲或掺杂了?软件开发者的这个主观想象世界,他们的欢乐、沮丧、奇想、恐惧、希望等等,究竟是怎样影响着软件开发的质量?

人们是要用计算机来复制整个世界?还是来复制人本身?

人们是在扮演上帝的角色吗?

这样的问题我实在不知该如何去解答,甚至觉得根本无从下手。

如果你还有足够的耐心读到这里,请你也来想一想,希望它们不会使你头疼。

最后,我将引用我从网上偶尔发现的一篇文章中的话作为结束语:

“自以为是的立法者(人类)犯下了一个大错,以为自己能定义整个软件开发过程。他们既不了解其开始也不了解其结果。学术界试了一下,然后就知难而退了。商业界则对其毫无办法。大型软件开发商们斥巨资来制造代码,明明想要扮演上帝的角色,却还装作自己是人类的公仆。所有人都在盯着镜子里的自己。计算机却在一旁偷偷的笑。”

写到这里我突然想到最近正在热买的一本软件工程的书《人月神话》,希望有机会你能有所心得。

好了,暂止笔于此,希望大家有所心得,多多交流。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有