作为第四届图灵奖得主,AI奠基人之一的Marvin,他发表的演讲主题是关于形式和内容的讨论。他的主论调就是内容要强于形式,而且我们目前过分关注了形式而导致计算机的发展轨迹产生了偏差。
他的观点一经发出就引来了诸多的争论,有支持也有批判。本着辩证唯物的观点,我的看法是,有选择的接受。我的观点是:计算机理论的发展需要形式化,然而计算机软件应用则应该更加关注它的内容实质而非形式。
论文中他主要从计算理论、编程语言、计算机教育三个方面论述了作者的观点。在编程语言方面,Marvin强调,编程语言要足够智能,使得程序员更加关注于实际的逻辑而非语言细节。纵观计算机编程语言的发展方向就会发现他的语言之准确,这或许正是一个大师的真正高深之处。计算机语言的发展大致轨迹,即从面向结构的到面向对象的,再到后来的面向方面的,其中的主轴线,就是解放程序员,使得程序员摆脱掉语言本身的细枝末节。
首先,计算机理论的发展需要形式化。无论是计算机还是土木工程生物等等,都需要很深的理论基础来证明它的正确性、合理性和完备性。而形式化就是这一证明的最有力的工具。数学是一切科学的基础,它的威力不仅仅在于它严谨的证明为各项科学提供了有力的理论基础,而且数学的推演能够为这些科学的发展提供可信并且极为有用的预言。比如对于程序的并发性的研究,如果单纯的实验并发程序的行为,即使通过大量的长时间的测试也很难发现其中的一些规律;但是如果我们将它的行为形式化为Petri网的形式,通过从数学的角度研究Petri网的规律,会对实际的并发行为研究提供更多、更精确并且更有意义的指导。
其次,计算机的应用需要更加关注于内容而并非实质。我所在的专业为计算机软件与理论。我对于这个学科的理解就是,它是介于应用和计算机科学之间的一个学科。具有一定的编程能力成为每一个学生的必备技能,而且成为了一种共识。这种观点的本身是没有错误的,但是过分强调编程能力导致了两个极为严重的后果:
1、 学生片面强调编程语言的学习而忽略了基础学科(主要是算法)的学习。从实验室转一圈,看到最多的是什么C#高级教程、深度探索C++对象模型之类的书,精通某门语言甚至成为了某些同学得以炫耀的资本。去年李开复先生来同济演讲时曾说过:算法是内功,语言是外功。所谓的外功,实际上是说语言仅仅是表达思想的一种工具。从这个角度上说,大学里设置软件学院是非常失败的,一个大一就开始学习C++和J2EE的学生的知识体系是有问题的,他并没有对计算机的体系结构有很深入的理解与探讨。有人说“程序员”就是民工,我认为,这是对民工的极大的不尊敬。程序员所作的工作,实际上是一个翻译,把设计者的思想翻译给机器听。就像Marvin说的,这其实应该是编译器所作的工作。目前一些机构正在研发的傻瓜型编译器也说明了这一点。
2、 很多学生思考问题是从语言的角度出发,而非问题本身出发。相对于上一个错误,这个似乎更加严重。举个例子,阅读英语资料的时候,有两种阅读方法:一种是先把它翻译成中文(即使他没有手动翻译,但是在头脑中是这样做的),另外一种就是类似于Native Reader的方式阅读。孰优孰劣,一目了然。反应在计算机中,就是这样一个问题:从问题本身思考问题和从编程语言角度思考问题。给一个算法题目,马上就想存储结构,用链表还是数组,for循环还是while,int是不是不够。这是非常错误的方式!正确的方式是考虑实际中是如何解决这个问题的,只有在实现的时候才想到数据结构之类的问题。所幸之处是,好多人已经意识到了这一点,于是最新的技术都宣称让用户只关注于业务逻辑本身。
作为学生(计算机科学研究者除外),我们可以从中获取那些东西呢?我认为最重要的一点就是关注算法,而不要把精力放在语言本身的研究。这里,语言可以看作是形式,而内容就是算法。语言是而且永远只是一种工具。除非你要开发编译器,否则过分研究语言是一种时间和精力上的浪费。一门最快的语言(C?亦或汇编?)永远不可能比一门慢的语言快100倍,但是一个O(n)的算法却能轻而易举地比一个O(n^2)的算法快1000倍。有人可能从功利的角度(面试,找工作)认为语言比算法重要,其实算法与它并不冲突。设计好算法或者业务逻辑后,在实现它的过程中,会更好更快地学习编程语言;而且这样不仅仅熟悉了编程语言,而且能够避免从编程语言的角度思考问题,而是从算法本身、业务逻辑本身、事物本身考虑问题。
关注内容,关注算法,语言只是工具,细节只是形式。
转至:
http://blog.csdn.net/millky/article/details/3059127