逻辑学家十二年实现“软件工程方法”上的革命

                        ( 回答美国伊利华报报社记者提问 Dec. 31, 2013)

 

你能否通俗地介绍一下,你的 “软件设计编程自动化”的SDDA技术是什么?

 

真正制作电脑软件的语言仅有三代:(1) 第一代是 “机器代码语言”,依据记录了客户要求的设计文件,再人工编制“机器代码程序”;(2)第二代是“编程语言”,依据记录了客户要求的设计文件,再人工编制“语言代码程序”;(3)第三代是“软件设计语言”,它不需要人工编制程序,只要用它写下客户要求,这种记录了客户要求的“设计文件”,就能自动转换成电脑上直接运行的“机器代码程序”。这种强有力软件设计语言都使用了SDDA (S软件,D设计,D编程,A自动化)技术。

 

我十二年的工作是创建了一种“模式逻辑”工具,用它首次突破了SDDA技术。这种SDDA技术,可以为任何系统任何种类的软件,制作它的第三代的“软件设计语言”。为了证明它“既强有力又有普遍意义”,我从二零零一年开始,为两个最复杂的软件系统:(1)为企业经营管理的Window视窗软件,制作了软件设计语言SDDA_window ;  (2) 为互联网平台软件CGI,  制作了软件设计语言SDDA_web.。 这两种“软件设计语言”工具都将在“可视化D++语言” 一书中介绍。

 

当今时代的状况是,一座工厂要成为 汽车制造厂,不必要去学习怎么提炼橡胶,怎么加工轮胎和加工汽车发动机。历史悠久的专业厂已提供各种零部件,让你选购。同样,人们在进入第三代的“软件设计语言”时代之后,一般软件人员也根本不需要学习怎样制作数据库和编制数据库程序。你只要把你要的,是什么样的数据库写出来,就可以了。例如,你要建立一个图书馆目录的数据库,并还要有数据库记录的输入输出的软件。现在, 用第三代的“软件设计语言”,你只要写下你要的“数据库表”的名称是“图书馆目录”一词,不妨,再写下它的每条记录由“书目“与“作者”二个项目。总共,你只不过打了三个词语,一个数据库就产生,并且提供各种需要的输入输出操作软件块。所以,人们在进入第三代的“软件设计语言”时代之后,这种新技术已提供这样的一种可能:一位普通人都可以为他熟悉的业务,制作他自己的电脑视窗应用软件。在以前,这是不可想像的吧。

 

这里要指出的是,可视化D++语言是属于一种 “通常的,用于软件设计的各种基本工具”的大集成,它的操作使用方式,都属于人们使用电脑的常识。它内部的高智能的协调管理,保证它使用非常非常简单方便,又通用可靠。附带地也指出一下:正象第二代语言能具有第一代语言的所有功能,第三代语言也能具有第二代语言的所有功能。因而,若有人问“能产生大软件?能显示美丽的画面吗?”一类问题.,就可知这些问题都是次要的,都是不言而语的,

 

 

你原来是复旦大学数学教师,怎么会去搞计算机软硬件的 ?

 

因为日本,美国解决了用计算机去“光顺”船体数据,有了正确的船体模型数据,从而能用计算机去控制船体制造。一九六七年,上海的造船研究所和计算机技术研究所,邀请了复旦大学数学系三位老师和二位学生加入他们“船体计算机数学光顺” 研究小组。二年下来,仍有一个特大难题解决不了。江南造船厂顾师傅组织领导了一次“攻克难题”大会战。二个半月后,我在原有同事工作的基础上,“模仿人工智能‘机器学习’的方法,使用加‘权’与精选‘权’的非传统方法,使人的意愿和数学公式相结合,攻克了电脑船型光顺的会战难关”(引自“可视化D++ 语言 第1册”一书的后言)。这使我看到了计算机的威力。我先打了一份报告,没成功,后又补充打了一份报告,要求在复旦大学内建立“计算机制造厂”。感谢数学系领导的工宣队张连长的支持,一九六九年,“复旦计算机制造厂”成立了。次年一九七零年,复旦大学“计算机结构”专业正式成立并招工农兵学生。当时,我是计算机制造厂厂长兼任计算机教研组组长,前后做了约十年。就这样,我走上计算机的道路。嗨,中国的计算机制造厂成立比台湾宏碁和美国的DELL早,但是做的都比他们差。我不同意做得差的原因是“工人吃大锅饭”。简单地说,中国大部分人,无论在国营企业,私营企业,以及在美国打工者,毋庸置疑大都是智慧与勤奋的。

 

你十年搞计算机硬体之后,怎么会转去搞计算机理论科学?

 

文化革命刚结束不久,新干部与恢复工作的老干部一大堆,每一位都得安排一个职位。一大批职位,又引出一大批职权。于是,大事小事都要经过层层不同职权的又不了解生产的人员批准。我也无可奈何,最后说“计算机工厂我上缴,你们去管理吧。” 。一九八零年,我加入了 朱洪老师为领导的新建立的“计算机理论”教研组。大家都知道,中国的计算机软件,以及基于电子元件工业基础的计算机硬件,与世界先进水准相差一大截。但是,不涉及工业基础设施的计算机理论科学,要赶上世界先进水平,还是有可能的。一九八一年,我暗暗下决心,在计算机理论科学上,三年达国内先进水平,五年达国际先进水平。我把我的职责干好之外,不丢掉我的决心。即使领导安排我去做‘班主任’行政工作,但我 晚上也可为计算机系,数学系的学生开专题“讨论班“。几年后,我的愿望达到了。复旦校刊登载了:唐同诰五年左右为学生开了五门新课,以及参加了某个讨论班的“ 六人中有三位直升博士生,二位考取硕士研究生“(要说明一下的是,这些学生自己原先都很杰出)。另外,在我的时态逻辑文章在“中国科学”外文版上发表,又受到美国“数学评论” 评论员 (有关语言理论与逻辑)邀请。这样的经历,把我推入了计算机理论科学的阵地。

(我回忆了这些,不是我有什么特殊智慧。事实上,中国聪明的人很多,只要选准方向,沉下心来干上一二十,都能作出不错的成绩。)

 

 

怎么会来美国搞计算机理论研究?

 

在我的时态逻辑文章在“中国科学“上发表之后,我已有足够的理论基础可以去国外进修。一九八六年,我曾经想去牛津大学学习和工作。有一次, 应中科院软件所的的两位资深研究员(文革后最早的院士)唐稚松和周巢尘的邀请,给他们的研究生介绍我在软件时态逻辑方面的研究成果。会后,因为周巢尘老师常被邀请去牛津大学工作,我就请他引荐我去牛津大学计算机系工作,而他建议我去卡内基·梅隆大学计算机系,不去牛津大学计算机系。他对我说:“那儿的人是’大X’级水平,而你已是‘元X’级水平.。你应该去CMU”。此话仅是鼓励,但他的建议我必须接受。回上海后,我带着我的论文,请上海交大的孙永强老教授写一封信,介绍我去CMU卡内基·梅隆大学的埃德蒙·克拉克教授(后为图灵奖获得者)那里学习。孙老师先看了我的论文,然后在一张纸上写了一句话,中文意思是“此人对你必有用”,签了名后交给我。一九八六年底,我飞到匹兹堡机场,见到了克拉克教授。他驾车把我带到他的办公室。我把孙永强教授的信转交他。他问我“你能干什么?”,到了美国,我就不必要过分谦虚,我回答说“我能做你叫我干的任何事情”。过后想想,我的回答不精确,应该补充说,任何事情是指他的科研上的任何事情。如有一次,他建议我去XXX大学做教师,我就没干。因为,当时我的英语水平,只能看懂别人写得,基本上听不懂学生说什么。

 

在美国你得到的最大的收获是什么 ?

 

我到美国是一九八六年十二月底,克拉克教授交给我美国顶级计算机杂志为他刊登一本专辑(共有八章),说这本专辑是我到这里进修的主要学习材料,并说过了圣诞节后一月十日再谈。到了一月十日,我去了克拉克教授办公室,他问我“你看过这本专辑的文章吗?”我说“看了,而且看完了”。他说“你有什么问题要问我吗?”。我说:“没不清楚的问题。整篇文章的结论正确。不过,第八章的证明改写一下更好”,他问我“哪儿?”。接着,我们就讨论起来。以后,他不断地送其他人的稿件给我,要我帮他初审一下,提个意见。这是我的工作,这些论文大都与我的研究领域无直接关系,有些是徧向代数领域,不太熟悉。为了正确审阅这些论文,有的结论查不到资料,我需自己动手证明,我需要花大量时间。事实上,我在 CMU 参加了三个有兴趣的研究课题:软件验证,硬件验证,以及人工智能的知识表达。这些需要的逻辑知识,但都没有超出我以前已经掌握的知识。对我而言,研究比审稿简单,化的时间不多。要说我真正从CMU几位美国教授那儿学到的,是学术上的“思想方法”,也就是“在计算机科学领域里,对每一个概念,主意,想法,思想,方法,都要考虑用一个‘可计算的算法和程序’去描述和实现”。这方面,当时感觉CMU比斯坦福大学大学更强调一些 。因此,当我以后拿到论文,我就思考把它的内容要用可计算的程序写一下。这种做法的结果,有时会令人感到意外。这儿仅仅举一个例子。研究人工智能“机器学习”的人,很少人没读过某位极为著名的人工智能专家的有关“表达式学习”的论文。此论文不长又有软件,仅仅看论文,很难发现有错误。偶然机会,我参加的一个研究小组要用此论文的软件。我拿来论文,依照论文提出的方法,用自编的程序去实现一下,发觉论文中有关“极限”概念错误,导致论文提出的算法错误。如果不用自编的程序去实现一下论文的内容,论文的错误很难识别(错误已在某会议 “ The 7th Australian Joint Conferenceon Artificial Intelligence AI-94 “上报道。但必须指出,虽然论文给出的算法有错误,但论文的主体思想有创见,还是很了不起的)。又有一次,我为校外的一位教授的论文审稿。他在论文中提出一种复杂的理论,并在文末尾说:他已经根据他的理论,制作了一个(软件)系统。我在审稿时,用可计算的原理和程序,模仿他的理论。发现他的理论根本“不可计算”,随后回复克拉克教授说:此论文作者根本不可能制作了一个(软件)系统。一月以后,克拉克教授告诉我,他向论文作者要一个他制作了的系统,作者回复说,他的(软件)系统才开始编。此时,教授才要我写出,为什麽作者的理论不可能已制作出一个(软件)系统。

 

 

在计算机软件理论的研究中,你是否建立了与别人完全不同的新方法?

 

计算机软件理论科学中,早期提出了两大难题:一是算法复杂性的NP问题,另一个是.程序正确性的验证问题。在程序正确性的验证的领域里,验证软件程序中的大大小小循环语句,人们想起完全类似的“数学归纳法”。研究人员都自然而然地使用数学工具,去研究程序正确性的验证问题。此问题太困难了。因此,为验证程序正确性而提出每一种能让人理解而接受的,逻辑或公理化理论的创始人,一般都能获得图灵奖。但是,实际软件程序太复杂,而在执行过程中产生的状态也多的无法估量,用严谨的数学逻辑方法仅能验证简单的小段的程序语句。而且,用数学表达式去验证简单的程序语句,这些复杂的数学表达式更让程序人员难于理解。

 

我在不同的研究组干了多年的程序正确性研究之后,我认为数学方法的潜力到此为止,就这么一点能力,不能彻底解决问题。因而,人们需要化较长的时间,去探索,试试寻找其它的工程的方法,当然不会立竿见影,前几年不会有结果。但一般的研究组的课题,往往以年填写研究计划,年年要求出一些成绩,按年总结汇报。我要探索新的特殊有效方法,一,二年不会成功,只有成功了才能让人相信。我只能化晚上以及假日,用了六年才完成。首先在匹兹堡大学张系国教授建议的一个学术会议上介绍,意在宣告成功。在给CMU计算机系 NanaScott 教授和他的一位助手演示我的工程化的程序验证系统之前,Nana Scott 教授对我说:“用数学方法是不能解决程序验证问题”。表明我们有同样的看法。我的工程化验证程序的路是走对了。

 

那么,什么是我创建的能被程序人员使用的“工程化方法”呢?在我辞职离开澳大利亚“软件验证研究中心”的最后一天,我在研究中心作了唯一的一次演讲,并演示了我的软件验证工程化系统。我的方法就是让普通的编译器(输入变量值为数字),增强为拥有“程序归纳法”机能的符号化编译器(输入变量值为代数表达式),再在程序设计语言里加进六条左右,简易的“前置条件”与“后置条件”等程序语句。整个系统以“计算树”的搜索方式运行:遇到逻辑公式就套用“定理证明器”;遇到循环语句就套用我独创的“程序归纳法”(数理逻辑中的广义归纳原理给了我很大帮助)。整个程序就不断地向前验证。到此你就能理解,这个方法是最自然最简洁的实用方法,明显是一个最佳的途径。在程序验证方法论解决之后,再留在那儿就无意义了。除了把最核心最奇特的“程序归纳法”一套图纸,寄给北京来到华东师大软件学院搞研究的朋友之外,不再接触程序验证具体系统。

 

你搞了这么多的计算机理论研究,怎么会去搞与理论研究毫无关系的软件工程革新呢?

 

编制一款电脑软件,基本状况是:时间长,错误种类多,可靠性低,结果带来价格贵。大家都知道“企业经营管理”方面的软件产品,是大中小应用软件公司的主要收入。看看 SAPOracle IBM等等应用软件公司每年的亿万收入,就知道了。我完成了实用的程序验证“工程化方法”之后。再搞原有的程序正确性的研究已无意义。我考虑把我的软件理论知识与方法,用于软件编程方法的改革上。另外,有两件事的发生,更加强了我这方面的决心。一个是,我曾经在美国第一个数据公司参加一个信用卡软件的项目,听说单单设计费付了一千四百万美金。而且,在我被借调到不同子公司编程时,各个项目的服务器的服务软件,相差不大,可以自动装配;另一个是,我想试用澳洲墨尔本的一款PROLOG 编辑器软件,他们告诉我,不但他们的编辑软件我要付款,而且以后我自己编的程序,用他们编辑器加工后产生的软件产品,也要付钱给他们。正如,我用买来的车床加工的螺丝,我把螺丝卖出后,还要付钱给车床工厂。这好像不太合理。没办法,自己做一个PROLOG编辑器软件。PROLOG 编辑器的程序也不小,而且我也没多余时间。动了一个脑筋,四个月创建了一个模式逻辑,用它可自动制作一个简单能用的PROLOG编辑器。我就不要买澳洲的PROLOG编辑器软件了。第一次能用一个模式逻辑去自动产生一个完整的软件,我自己也惊奇与兴奋。

 

下面我引用某网页公布的一段关于我的PROLOG编辑器的技术讨论:“大约在一九九六年前后,我 曾给CMU的埃德蒙·克拉克教授演示这种自动制作PROLOG编译器软件的技术。要构造一款PROLOG编译器软件,除了一般的编译,还要用到几种特殊算法。埃德蒙曾问了三个问题,(1)“你的编译器是否使用了沃伦机器?”,我回答说:“不用”,(2)“你的编译器使用的垃圾回收算法是什么?”,我回答说:“不需要'“(3)”在编译器里,什么是你的数学合并算法呢?“,我回答说:”合并算法也不需要。我只是用一个简单的一个数据到另一个数据的‘指向', 来代替复杂的合并算法”。突然,埃德蒙站了起来,说:“是的,你是对的”。就是平时这些新技术堆积,我才有基础去考虑软件工程的革新问题。

 

 

你的软件工程的革新方法是怎样的,能让我知道一个大概意思吗?

 

在真正确定软件工程的改革方向之前,先要了解已有的软件工程方法到底存在哪些根本性的问题。原来的软件工程方法,说它是“工程“方法,好像还差很远,我们知道,以现代工程化方法建造一幢大楼,大楼是什麽样子,完全决定于设计文件,而不依赖于哪个建筑工程队去做。一种先进的软件制作技术也应该是如此。同样一份软件设计文件,由不同的软件公司产生的软件应该完全一样。这种机械化工程化的制作过程,才真正实现了软件工程化( Software Engineering )的原旨,但已有的软件工程还不能做到此点。我决心探索,用建造一幢大楼的类似方式:根据设计文件,自动制作模块,自动安装模块,来机械化建造软件。想来,百年后软件制作方法应该是如此。在一九九七年前后,我向我所在的美国第一个数据公司的子公司提交了我的这个建议。后来由于子公司撤销,建议无回应。我化了几年时间,分析了语言理论,实际编程,以及新业务的可行性之后,于二零零一年正式开始研制SDDA技术和“可视化D++语言”的设计与制作。于二零零四年,可行性方案测试成功。于二零零六年开始广泛对外(限于同事,朋友的圈子)表演我的可视化D++语言工具。

 

作为从软件理论科学过来的人,总会想到,怎样改变现有软件工程产生软件的“慢,差,贵”的现象。而这种现状也主要是人工编制程序过程以及程序的复杂性两方面引起的。其实,各大软件公司都想过,直接从记录客户要求的设计文件(或称业务模型”),不用编制程序 而直接生成编辑好的高速软件代码,该多好啊。拥有众多软件尖端人才的德国的大公司SAP, 美国的大公司Oracle & Peop[leSoft,以及大公司IBM  (曾经收购了RationalRose)  都做过这方面的巨大努力(有的已有二十多年的历史了)。即使不谈专用软件,就是通常的企业经营管理软件和网页平台CGI,都 实在太复杂了。要生成完整个软件更是困难。这种困难现象,正如Software Development杂志 [ 2006年4月卷。14日,第4期 ] 指出的:“实施模型到代码和模型到模型转换的任务,还需要做一些工作”。阅读了该篇文章之后,我发Mail给该文作者,告诉他,我已成功“实施模型到代码转换”的技术。他回信说,希望我公开我的软件代码。当然,作为公司的财产,我只能以产品的方式,公开技术。

 

你的“可视化D++语言”书出版后,你有什么打算?

 

电脑软件制作人员是不断地学习新语言,以适应工作的需要。正如前面提到的,真正制作电脑软件的语言仅有三代 (1) 第一代是机器代码语言;(2)第二代是编程语言,如C,JAVA,PROLOG等;(3)第三代是软件设计语言,如使用 SDDA技术的 可视化D++语言。每代语言都有实质差别,一句话“一代比一代使用更方便有效”。

 

写完这本套 书“可视化D++语言”后,我打算给年轻学生上课,并提供的免费软件。希望有利于年轻人创业。此套书也将会很快有英文版出版。

 

这个先进的可视化D++语言发行后,对现有软件行业有什么影响与冲击?

 

电脑软件制作人员是不断地学习新语言,这是他们的习惯。所以,对程序员个人来说,他们能学到更强有力更方便的语言工具,使他们能化较少的时间制作更多的软件。最终,有关的软件人员会喜爱它的。但对大中型的应用软件公司是挑战。如果停迟不进(当然很少可能),大中型的应用软件公司的利润,好多年后会分流给小公司群体。

 

但是,我们也可预见到,在软件历史上临时用于过渡的代用技术,将会逐渐萎缩。例如当网页CGI软件能自动生成,那么ASP平台的历史作用就完成了; 又例如,SAP公司 和 Oracle PeopleSoft 公司 采用的低速的“业务模型的解释“技术,将会逐渐被简便又高速软件替代;又例如, 若主要功能是画流程图,又仅仅产生构架式的程序,又要让程序员去填满构架式的程序。那么这种复杂而又昂贵的IBM的 UML技术,它的使用会收到限制。总之,要存活,就要改革,

 

还再补充一下,“可视化D++语言”软件, 对不同的电脑操作系统有不同的版本,先发行的版本  SDDA_window 和 SDDA_web 都是为MS Window 操作系统的电脑用的。为其它 计算机操作系统用的版本,肯定比大杂烩的Window 操作系统用的版本更简单一些。大家一起干吧。  

 

########################################################################################## 

## (注意:原来报刊的报道中没有如下内容。)                                                                                                                          ##

########################################################################################## 

【希望程序员能学会更多语言,包括 可视化D++ 软件设计语言。从原来的手推车车手,兼任自动车驾驶员。 新的特殊的算法和函数,仍然要用各种编程语言制作成模块,加入到可视化D++语言模块库。 新的技术的扩大应用需要时间逐渐完备,不要着急。发展新技术是科技历史发展必然,快学快用赶上时代潮流。 使用了世界目前独一无二的技术,那国赶超那国不再是问题。希望年轻人成功。】

 

【CTO请看一个更先进的设计自动化的 Video(二年前录像,英语很差,内容仅供参考):

http://www.modeltosoft.com/htdocs/Auto_Internet_Design.avi  (可用复制地址)

(旧技术,网页平台软件CGI从使用高速的 C语言;因为程序难编,改用慢速的Pearl 解释语言;又因为程序难编,改用慢慢速的ASP语言插入HTML网页里。早期2010年左右,可视化D++语言能直接自动生成CGI软件[高速C语言]。ASP等都不要了。在Video里介绍2012左右更高速更方便的技术)

 录像中介绍一种更为先进的正在不断改进的技术:电脑 的SDDA工具对于网页平台(Server 端)的所有 CGI软件,不但能自动生成软件的机器码,就连原来客户需要填写的 “软件要求”(即:初始软件设计文件),在没有填写没有说的什么的情况下,也能预先自动生成软件设计文件。好像炫了,无话可说,非常有意思。】

 

【想多知道几点信息】
(1) 今年 可视化D++语言第二册(视窗软件设计和开发自动化)出版后, 唐同诰将去上海举办短训班一星期(28年没回中国,举办一次讲课作个回报也应该)。它的免费中文版软件是由完整英文版软件转化而来的。英文版软件将在 “Visual D++ Language” 一书出版后,才对外供应。

(有建议也可送 kshdjj@gmail.com )