今天看到Andrew Tanenbaum (minix的作者。讀過CS的人應該不陌生吧)。在SIGCSE的電腦科學教育傑出貢獻獎(Outstanding Constributions of Computer Science Education)上發言的文字材料。A.T在演說裡提出十大電腦科學教育的十大準則:
- 目光長遠 (Think long-term)
- 強調原則,而非事實 (Emphasize principles, not facts)
- 對重大變革有所準備(Expect paradigm shifts. 翻成範式轉變也忒生硬了,不知道有沒有標準翻法)
- 解釋事物內在工作原理(Explain how things work inside)
- 向學生展示怎麼駕馭複雜度(Show students how to master complexity)
- 電腦科學不是科學(Computer science is not science)
- 在系統角度思考(Think in terms of systems)
- 講述理論要適度(Keep theory under control)
- 拒絕炒作(Ignore hype)
- 毋忘過去(Don't forget the past)
教學一體,這10大教育準則其實同樣適用於CS學習。準則1,2,3, 9告訴我們學習時應當注重思想,而不是某個具體的實現或巧合。今天的熱門技術可以轉眼明日花黃。OS360的任務控制可能今天沒幾個人知道了,但進程管理的原理仍然值得學習。程式設計語言幾年一換,但抽象,資料封裝,演算法原理仍然幾十年不變。要想在技術變遷的洪流裡不疲於奔命,只有原理優先,以不變應萬變。準則3還提出了應對突變的對策:批判性思考,自學,和隨時檢驗自己的假設。第三條尤其重要。套用Steven Seagal(當年我對他的合氣道推崇之極)的電影Under Siege 2: The Dark Territory裡那個邪惡工程師Travis Davis的話說:“假設是他媽失敗之母"(Assumption is the source of all screw-ups).
準則4, 5, 7告訴我們深入瞭解系統工作原理的重要性。這就是為什麼這本書 仍然是CS學生的必讀。高德納早也知道內外兼修的重要性,所以才會在《電腦編程的藝術》裡雄辯地闡述了為什麼他要用MMIX(一門他創造的彙編)來描速演算法。
6和8頗有意思。A.T相當強調CS務實的一面。準則6的最佳註解是一句流行的引言:工程師為了建立而學習,科學家為了學習而建立(Engineers learn to build,. Scientists build to learn). 關於準則7的例子隱隱有理論如果不能刻劃現實,就用處不大的意思。這個俺有保留意見。理論本來就是一個演化的過程。無數優秀理論都是由無數人改進不夠完美的理論二來。最近重讀Klaus Scheider的Verification of Reactive Systems第一章,形式化驗證的家譜,就可以看出精彩的理論往往來自一系列向現實逼近的粗糙理論。何況當年看似粗糙的理論因為外界的變化也許就變得有吸引力了呢?這不是沒有例子的。
準則10尤其重要。現在的電腦工業出了名的喜歡“重發現”當年的技術。虛擬機器不是新鮮東西。垃圾處理不是新鮮東西。delegate不是新鮮東西。匿名函數不是新鮮東西。clsoure不是新鮮東西。OO不是新鮮東西。continuation不是新鮮東西。泛型不是新鮮東西。硬體的進步,軟體開發技術的進步,以及理論的進步往往讓當年被束之高閣的技術重見天日,再煥活力。所以瞭解曆史絕對有助現實。Andy Kessler的力作How We Got Here(免費書,敘述及其精彩,強烈推薦哈)也可旁證以古為鑒的重要性。