我读Tanenbaum的计算机教学十大准则
Eric Tyler
 
    荷兰鹿特丹自由大学的Andrew Tanenbaum教授是计算机教育界大名鼎鼎的人物,他写的操作系统、计算机网络等书籍是全世界公认的经典教材。
 
    Tanenbaum在1997年获得ACM/SIGCSE的计算机科学教育杰出贡献奖(Outstanding Constributions of Computer Science Education)时的演说里提出计算机科学教育的十大准则,笔者在这里尝试以自己浅薄的见识从学生的角度对其一一进行解读。

1、目光长远 (Think long-term)
    计算机科学是一门发展迅速的学科,任何一个目光短浅限于当前的人和思想都将被淘汰,这是计算机科学最重要的特性。
    比如MS-DOS这样的操作系统有着单用户单任务的设计、不支持连网(早期)等缺陷,即便有微软的大力支持,仍然逐渐淡出历史舞台,当然它的文字界面是一个重要原因,由文字界面往图形界面的发展也是一个进步,Jobs当年就看到了这一点。实在是佩服Xerox PARC的研究人员,凭空发明了现在可视化界面的几乎一切创意和概念。
    不论作为计算机科学学生,还是计算机从业人员,都不能局限于当前的技术和思考方式,大胆的想,大胆的干,正是计算机科学如此快速发展最大的动力。

2、强调原则,而非事实 (Emphasize principles, not facts)
    在科学研究中的得出的结论反映在计算机科学上就是所谓原则。应该在原则的指导下工作,而不是仅凭借自己看到的很有局限性的事实。
    我们写一个程序实现某个任务,用结构化方法可能可以用不是很长的代码实现,但我们不认为这个程序是好的,因为它没有实现面向对象,就没有做到代码的可重用,可扩展性不好,你写的代码永远都是你的,而不是别人的,这样的代码最多写到一两万行就得停下来。在大型软件工程中面向对象就是一条最基本的原则。我想,大家现在都能体会到这一点。
    再进一步,我们可以自己去研究一些原则性的东西,这也是很有意义的工作。

3、对重大变革有所准备(Expect paradigm shifts)
    这一点在Tanenbaum的书里有一个很好的反映,在说到以后技术的发展时,他从来不用肯定的语气,而是尽量带有怀疑性的,因为谁也无法预测技术的走向。
    很多时候我们可以看到技术的进步和变革就在眼前,能不能跟上?这就是你和最优秀的人的区别。
    作为学生,首先是基础要牢,这些基础就是上面所谓的原则,指导性思想有了,再来应对这些有血有肉的东西,我想这里的准备就是指这个。
    不能保守,要时刻准备革命!呵呵

4、解释事物内在工作原理(Explain how things work inside)
    在计算机科学中,知其然不而知其所以然是一个很容易犯的错误,我们很容易以为自己懂了,会了,但你能解释清楚这个东西到底怎么做到的吗?如果你不能做到,那么你在这里的发展很有限,知道你真正去了解它。
    这和数学很像,你可以知道一大堆定理,但你不去读它们的证明,就永远无法改进它,写出一个新的证明来,而只能套用公式,做一些大家都会做的事情。
    我想学软件的都应该学点组成原理,应该读读《深入理解计算机系统》一类的书,不要觉得没有用。这也是专业学生比自学者的优势所在。

5、向学生展示怎么驾驭复杂度(Show students how to master complexity)
    算法的复杂度、一个工程的复杂性……都是很重要的概念,很多时候是一种良好的感觉。计算机和自然科学最大的不同是它是非常务实的,我们不是要提出一种做事情的方法,而是要做成一个事情,而且要做得最好。我想他这里就是讲怎么样把一件事情做得最好做到极至的。

6、计算机科学不是科学(Computer science is not science)
    这个很有意思,Tanenbaum应该是把计算机科学和自然科学来比较,正如上面所说,自然科学讲究方法,我们提出一个能解决问题的方法,而计算机科学不但要方法,还要能实现的方法,不能做出来的方法意义不大。另一方面自然科学讲究逻辑性,理论都要有一个坚实的基础和逻辑的检验,计算机科学不然,在这里实践是检验真理的唯一标准。我想,Tanenbaun这样说肯定还有别的原因,我想不到了。

7、在系统角度思考(Think in terms of systems)
    当年读他老人家的《计算机网络》,很快陷入一章章的具体技术而不能自拔,好不容易读完以后回过头来看第一章,发现什么都明了了。这里第一章就是对整个网络理论的一个系统的阐述。
    计算机科学中往往会有这样的情况,你在这个地方做了局部优化,会影响别的地方的性能,你必须得去考虑那里的损失,这一点认真学过组成原理的可能深有认识。你必须得学会全局性的思考问题,如果一个优化让全局性能下降了,那还不如不做。

8、讲述理论要适度(Keep theory under control)
    这一点是针对教师说的,对我们就可以说“学习理论要适度”,这还是个实用性的问题,任何理论都是理论,你把RFC都读完了,也不会配置路由器。
    笔者不好把握这个适度是指的什么程度。以笔者水平,再学几年理论也不嫌多,理论比较扎实,实践起来更能理解透彻一些,而且理论也帮你知道了前面说的“事物内在原理”。
    笔者想这样理解这句话:学理论的时候,不要忘记你最终是要实践的。

9、忽略大而无当的潮流(Ignore hype)
    IT界各种潮流和新的概念太多了,我看到过不少人不停追求这些所谓时髦的技术而忽略了真正的进步。真正的技术革新并不频繁。
    我想,要做到这点,就是要把握住核心、关键。我们花很多时间去学习一个热门的东西的时候,应该去想想自己是为了什么?如果只是为了跟上技术的潮流,那么你应该先多去了解它和以往的技术有哪些区别,这些区别和进步是不是根本的,还是只是换了一套说辞或者概念。

10、毋忘过去(Don't forget the past)
    这个我想大家都有自己的看法而且都认同。我想,不止对于技术人员,对决策者,这点也是至关重要的。建议专业学生多读读IT史,就几十年的事情,看上十几本书就可以深入细节了。读历史也是不要只看表面,要看到错误的思想是怎么产生的,比如李维先生的《Borlang传奇》就说了很多失败的细节,值得思考。
 
    笔者水平有限,不当之处欢迎指正,欢迎一起讨论。转载请注明出处 [url]http://ieric.blog.51cto.com/blog/119640/18296[/url]