为什么我们要学习基本理论

为什么我们要学习基本理论
想说这件事很久了,就是我们为什么学习基本理论。我的基本理论非常差劲,很多时候拖了后腿,这也是我对这一点感受很深的原因。
很多同学提到,计算机是个日新月异的学科,每年甚至每个月都在产生新的技术、新的名词。去年可能还很难解决的问题,今年就非常容易了。当年用记事本做个网页那个费劲,现在随便用dreamweaver之类的工具就能画一个来,成了最没技术含量的工作。同学们说,在这种情况下,为什么我们还要学习195X年发明的那些技术,甚至学习电子学这样194X年的技术。
1. 基础理论过时很慢
幸好,我没有听到有同学问,为什么我们还要学习3000年前的数学。一个学科赖以存在的基础,不像新科电视剧,它的出现和消失都是非常缓慢的。即使计算机这样的学科,那些影响到软件工程的理论,也大多在195X年就已经出现了。比如模块化、信息隐藏、编译原理、操作系统。更基本的算法,在电子计算机1946年以前早就出现了。比如世界上第一个计算机程序的作者生活于18XX年,是拜伦的女儿,就是那个诗人拜伦。有人可能会说,她怎么能为计算机这样不存在的东西写程序呢?她当然不是为"电子"计算机写程序,而是个数学家。这倒不是计算机科学为了显得自己有历史,而是她的工作确实是计算机的理论基础–而且对软件工程等有确实的影响。
为什么要学习基本理论,有很多理由。其中一个理由是前一段时间跟建一长聊之后想到的。建一要做一些不止是计算机的工程–事实上,这是一个普遍的现象,我们很少从事纯粹的计算机工作。他遇到的困难之一是,那个领域里充满了各种复杂的细节,其中很多是陌生的。我后来想到,这时基础理论在一定程度上能有帮助。一方面,很多工程类学科都依赖数学,这是共通的那一部分;另一方面,许多工程方法具有相似性,有时候,接近的学科,即使你没有接触,也能猜测到可能会有什么样的机制支持你。这两种情况下,更深刻地理解学科的基础就有意义了。
基础理论的学习,也能帮助学习"方法"。不少同学都提到,大学应该学习"方法",而不是"知识"。 (我略过了另一些观点,有人认为大学应该学习与人交往或者做人什么的。这种观点的价值观估且不讨论,我对它的困惑主要在于,还有一半没上大学的,他们就不需要与人交往或者做人了么?)而"方法"是很难传授的,只有在学习某个东西的过程中才能体悟。学习基础理论,动机之一就是通过它学习"方法"。
这些理论,以及学习这些理论过程中了解到的"方法",在学科的历史中长久地不过时。而你的一生,比学科要短很多,没有见到它们过时的可能。换句话说,那些十年以后就消失了的东西,并非基础理论。
2. 硬件进步的影响呢?
对基础理论的另一种质疑,由学科本身的成长导致。比如,莫尔法则指出,计算机硬件aoao地成长。所以,有人据此认为,程序的优化是没有必要的,又进一步推得,程序优化的技术是没有必要学习的。
我最近在精读CSAPP 就是这本[http://book.douban.com/subject/1896753/]。第四章读了两遍,还有很多没记住,正准备看第四章。这时看到网上有贴子提到,第四章的优化是毫无用处的。他的理由是,你优化了半年,程序效率可能才提高20%,而你这半年啥也不干,或者就只是玩,半年之后你的程序性能自然就达到指标了–因为硬件性能的提高。
这贴子听起来很有诱惑力。如果这个世界以这样的方式运作,那生活简单太美好了,美好到可能很多人都不想活了。你想,如果衣来伸手,饭来张口,啥也不用干,想要啥有啥,所有人都听你的…而根据康德的理论,人类之所以能感受到美,就是因为在过程中感受到自身的力量。
这贴子还有其他的问题,这种美好的生活是不会存在的。没有工作过,没有为别人创造过价值的人,可能难以理解这一点。你工作的意义不仅是实现某个效果(比如你那个程序,没有优化快20%的),而且在于在特定的时间完成这个工作。
我要对每一届进实验室做项目的研究生同学反复说,你的工作不仅是完全某个任务,而是必须在规定时间前完成。凡是在规定时间以后完成的,基本就没有意义了。这跟降落伞差不多,需要你的时候如果你不在,你就永远也不用在了。
为什么。
在万恶的旧社会,有一个时代,叫做486时代。那个时候的主流计算机型叫做486。那时候著名的奔腾还没有出生,像CS这样的游戏还没有它们能运行的硬件。那个时代看碟 (对,基本是碟,而不是AVI) 需要使用硬件解压卡。没有硬件的帮助,CPU的速度还不足以完成播放。那个时代著名的播放器叫做xing,能不用解压卡,但是它是英文的。后来。后来的事件太重要了,我另起一段。
后来,有一个重要的软件出现了,它不需要解压卡就能播放影碟,而且,它是中文的。它叫做金山影霸。是先前和后来著名的金山公司的重要产品。是的,后来有了586,有了奔腾,有了你现在用的这样的机器。这些机器的性能高到不仅不需要解压卡,连声卡和网卡的运算都免了,全在CPU里完成。但是,在金山影霸存在的那个时代,它们全、都、不、存、在。
这就是金山影霸存在的价值,也是你的工作的意义。我在课堂提到的一个比喻这样说,一个将军有多么牛,靠什么度量?如果敌人很牛,天气很差,我方装备非常缺乏,地理环境也不熟悉,而且身陷死地,自己的军队士气低落,全是老农军事素养低下。如果在这样的情况下,你带兵打了胜仗,你就是很牛的将军。如果反过来,敌人全很完蛋,天时地利都利于我方,你的士兵个个特种兵,你也打胜了。那打胜了有什么好说的,应该的啊。
你存在的意义就在于,你能够克服各种困难,完成人所不能。不仅做出来,而且在那个时候就要实现,它们都是你的工作的意义。如果要等半年硬件进步,你的老板为什么要付给你钱?
不仅硬件进步,厂商们,比如MS或GOOGLE还会封装底层的各种机制,让你调用它们的API。它们越封越多,越封越严。一方面,没有对底层的深刻理解,用它们的API做简单的程序非常容易,做难的程序比以前更难;另一方面,如果三两行就能写一个程序了,还是那个问题,你的老板为什么要付你钱。所以,你必须在它们还没封完以前把程序做出来。等它们封完了,你的工作就不值钱了。
3. 有人质疑,那他的聪明呢
这也是跟同学们讨论的一个话题。A同学如果学习了基础理论,才设计出某个程序,和另一种情况比,B同学完全没有学习基础理论,也设计出了某个程序,哪个更牛?
有些人认为,天赋异禀的B同学更牛,他更聪明,更有智慧,更富有创造力。你看,他没看理论,独立地就设计出了与某大公司相同的框架。
不过须知,做工程项目和科学研究,不是奥运会比赛,你聪明不聪明对公司和工资都没啥影响。你徒手或者用弓箭射杀鬼子也没有加分。完全自己设计,不遵循现成的基本理论,不参考 (或否定) 别人的设计,基本是小农经济时代的思维吧。证明你是本小镇最聪明的人又怎么样,你织的布就更好了,就比大机器生产的质量更高更便宜了么?
深入学习基础理论,能避免前人和别人早就做过的蠢事,也更容易重复牛人的成果。你没得到独创的机会,实在是得归疚于生得晚了,要创造也只能创造些别的了。无论你是否知道,是否把耳朵眼睛全睹起来,别人已经创造完了的,总归是创造完了。
有些人误认为古龙莫言之类的创造者,都全身心投入到女人和地方特色中去,两耳不闻窗外事。细读一下他们别的言论你就会知道,他们对于西方文学各种流派和文学基本理论的概念都熟悉得很呢。只是,写小说的时候,跟听故事的读者说不来这些东西就是了。你会跟你的客户说你很了解汇编语言么,有意义么。你应该展示汇编语言的威力。
4. 再说硬件
说到硬件,还有两点。一是,即使半年后硬件进步了,你的优化也还是有意义。如果你优化了20%,你仍然比同样的硬件下别人的东西快20%。就像在列车上奔跑,停步的那个人,还是会落后,不是落后于地面,而是落后于不停奔跑的那个。二是,算法的理论 (和实践) 告诉我们,算法与算法之间性能的差别,比硬件和硬件的性能差得如此之大,以致于一个差的算法,即使运行在银河机上,而好的算法运行在当年的日立小计算器甚至算盘上,好的算法仍然快得多。这个说起来话就长了。
又想起来前一段时间某段对话。某人说,这些东西的技术某公司都有前期研究,所以…言下之意这些工作是不是可以便宜一些。
不能。
有些工作就是体力活,就跟给你家刮大白似的。你会刮也白扯,我给你家装修的时候也不会便宜。不过,问题的另一方面是,如果你不会刮,或者我由于基础理论好,刮得格外好或者格外快,那铁定得加钱了。
5. 最后一段
关于基本理论,齐同学当年提到过一件事。他对考基本概念很反感。我对动手能力强的同学希望考理论的应用,而不考理论,非常理解。
那么为什么还要考察基本概念呢。尤其齐同学还提高,如果按自己的话答,老师就给扣分,老师就希望背下来。
事情是这样,按自己的话答,是不会扣分的。为什么齐同学有此误解呢?估计是他答的知识点不全。基本概念的考核在我做学生的时候,也非常头疼。现在想来,是我理解得不够深刻,所以答得不完整,以后应用的时候也受到负面影响。当然,我并不是说背也来就高超很多,大家都不咋地。
正确地做法是,深刻理解,理解到可以复述,就像背下来一样。你女朋友的电话号码记得那么清楚,为什么用来谋生 (也包括她的生?)的工具,怎么能随手就忘呢?
所以我等读完CSAPP,我还会再次重读第四章。直到能用手把图里的节点以及它们的连接画下来。那个时候,才是真正掌握的开始。
——————–
博客会手工同步到以下地址:
—-
杨贵福
东北师范大学 计算机科学与信息技术学院

Sincerely,
YANG Guifu
School of Computer Science and Information Technology
Northeast Normal University
Changchun, P.R.China

重剑无锋,大巧不工。

无不大工。

Leave a Reply