基于自然语言的软件工程和程序设计(上)

软件发展至今,无论是编程语言,还是软件工程,乃至是互联网的趋势发展,都是飞速发展。于是,我们便迷茫于这样形形色色的语言和概念之间,无所适从。其实,我们不妨返璞归真,回到最初,让我们从语义出发,来讨论这形形色色的种种,你是否恍然大悟呢?

1. 何为语义

我们无论是在编程,还是在架构一个完整而庞大的软件,总结起来,无外乎在构建一个场景,或者说,在搭建一个虚拟的世界。

那么我们在回想一下我们在小学写作文的过程,无外乎也是在描述一段场景,或者是重绘当初的场景,也就是老师常说的要写真人,写真事,抒发真实情感;或者是描述自己虚幻的场景,或表达梦境,或表达理想。

让我们对比这两件事情,我们会发现,他们都是在用语言构建一个世界,唯一不同的只是一个是用我们的自然语言,一个是用我们的计算机语言,只此而已。

那么,当我们埋怨我们被无数的概念所砸到,被无数的编程思想所淹没的时候,埋怨着设计无从下手的时候,我们是否可以去尝试着返璞归真,用我们小时候最擅长的作文来反过来思考这些问题呢?说白了,也就是从自然语言向计算机语言,或者是自然语言思维向计算机语言思维的转化过程。

这就是我想在本文中提出的,针对自然语言的编程。

2. 看编程语言的发展

让我们先来探讨下编程语言的发展。

从第一代语言开始,当时的世界只有0和1,伟大的程序员们靠着向纸带上打孔来编程。

而后到了第二代产生了汇编语言,程序员们可以用一些指令来操作内存,从而达到自己想要的效果。

在我看来,机器语言到汇编语言的转变绝对是一个质的飞跃,不仅代表着软件和硬件地分离,更是程序员们可以用自己的语言(类英语)来表达自己的想法

在之后就产生了过程式语言,这里以C语言为代表,这时也产生了一种编程思想,叫做面向过程的软件设计。程序员们可以用自己的思维去思考问题:这个事情应该先做什么,后做什么,而每个步骤就是一个方法。我们也称之为自顶向下的软件过程

随着软件的发展,软件越来越庞大,功能越来越多,从软件过程的角度来讲,我们可以说,树顶越来越多,我们再也无法像曾经一样,抓住一个或少数的树顶,然后向下延伸,这时,便产生了近十年的热潮:面向对象的软件设计。

面向对象的软件设计是考虑,这个有哪几个对象,每个对象都能干什么,从而根据对象的协作去完成一个大的任务。而每个对象对其他的对象都是不知情的,也就是说每个对象都可以不去关注整个软件的整体业务逻辑,我也把这个特性称为软件对对象的透明性

在旁支,又产生了函数式语言,面向服务的软件设计,面向契约的软件设计,并发式编程等形形色色的概念,而这些,我会在下文中来简要探讨。

3. 思维成熟的历程

短短地几十年,看软件世界的变革,你是否有些无所适从呢?那么,在未来的软件世界里,也就是在我们未来的工作里,编程语言又会变成什么样呢?当面向过程与面向对象这些我们熟悉地概念被时代所抛弃后,我们又该何去何从呢?

好,我们先不去想这些烦心的事,让我们向前追溯,回归童年时代,来想想我们写作文的历程。

从幼儿园时,我们不认识几个字,我们想写一篇文章,想的不是我们怎么样构建好一个场景,而是我们要如何把我认识的这些有限的字用上,而最后故事的过程,我们不得而知。这时,我们不是在为了写作文而写作文,而是为了可以向大人们展示,我认字的多少。这不正像最初的机器语言时代么?我们关注的是0和1的组合,把自己的着重点都放在了词汇之间的组合上,而一些程序员却常常会为此忽略了整个宏观的程序。

接下来,我们上了小学,我们不再沉迷于生字,生词的堆积,我们学会了很多漂亮的句子,诗词,名言警句,那么这里,我们可能关注的是,我们如何更好地组织这些句子,让整个文章读起来更通顺,也是在小学时,诞生了中国经典的语文题目:改病句。好,我们来想想汇编语言,汇编语言把0,1代码封装,暴露给我们一个个操作内存和运算的指令,我们需要关注的是我们怎么样把这些指令组合到一起,是先mov然后add然后中断,抑或是……..否则,整个程序很可能都因此崩溃。

然后,我们上了初中,我们开始写记叙文,这时的情节非常简单,出场人物很少,这时,老师向我们灌输了经典的“三段论”思想:事情的起因是什么,事情是什么样的,事情的结果是什么。当我们构思一篇文章的时候,需要做的就是把这件事情考虑清楚,然后按照顺序去一件事情一件事情按顺序去写,这也就是我们的面向过程编程。

当我们长大了,成熟了,当时韩寒,郭敬明,安妮宝贝,以及越来越多的网络小说让我沉迷上了构造一个个悲情的故事,故事的主角开始多了起来,主角之间都有着错综复杂的关系,三角恋,甚至四角恋的横行,以及多故事线索的穿插,让我们曾经的思维越来越不够用。于是,就产生了一种当时我很痴迷的格式,在文章开始,我会首先介绍所有的故事主角,然后根据他们的角色去划他们的关系,行为。这就是我们的面向对象软件设计。

由此可见,软件设计思想的发展其实和我们的思维是一样的,是随着世界的复杂性的增加而调整设计的思维,调整我们思考问题的方式和出发点。

4. 未来的发展历程

在前文我们说到,世界的复杂性增加驱动着软件工程思维的成熟,那么我们关注未来软件工程的发展方向,实际上也就是在关注未来软件世界,也就是软件业务,需求的发展方向,也就是关注未来人们需要什么样的软件。然后从自然语言出发,究竟怎么样的组织思维可以更好地我们所要构建的虚拟世界。

同样,当我们理解一个全新的软件思维时,如果我们无法理解,我们不妨去思考着与之对应的自然语言思维。

诸如面向服务的概念产生时,其实是不是,我们在借用着其他文章的结果或者结局呢?比如我想写一篇作文,其中有一个场景是我想抨击政府,我可能就直接说“刘和珍君的死,在今天是否依然会重演呢”,这里我只是引用了,或者说是借用了鲁迅先生所为我搭建好的场景,而只关注其结果,然后对外展示,或者作为我整个文章过程的一个小插曲。如果我们没有面向服务,那么我们是不要要再把整个《纪念刘和珍君》的文章再重写一次呢?

下文简介:

在本文中,主要是很笼统的介绍了自然语言和软件工程之间的想通之处,在接下来的两篇文章中,我会着重描述从语义上去分析各种编程范式,以及基于语义的一些旁支细节,再到自然语言与软件工程之间的关系,敬请关注。谢谢!

 

posted @ 2009-12-27 23:16  飞林沙  阅读(3921)  评论(19编辑  收藏  举报