我讀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]