之前上完了 MIT 6.00 課,可謂獲益良多。教這課程的其中一位 Professor 叫 Eric Grimson ,最近榮升 MIT 校長。那課堂用的教學語言是 Python ,但是 Grimson 不停說自己是 old time Lisp programmer 。
從 MIT 6.00 結業,下一課叫 MIT 6.001 - Structure and Interpretation of Computer Programs (SICP)。
由於 MIT 的 Video lectures 很舊,是在八十年代拍攝 ((而且講者講得有點悶)) ,故此想找找有沒有其他的大學有類似課堂。原來在 UC Berkeley 有同樣的課堂 CS61A ,而且影片是 2010 年,於是乎就去了看 UCB 的影片。 ((這是我這種 Self-learner 的便利,反而真正在 MIT 見學的話,並不可以這樣吸收各家之長。)) Instructor 叫 Dr Brian Harvey ,此君講書很有趣。教學語言為 Scheme ,是 Lisp 的方言。
上這一堂之前都有疑問,為何要教 Scheme ?這個東西有甚麼市場價值?該校以甚麼的標準去選用 Scheme 而不用例如 Python, C, Java 之類的大路,或者「有用」的選擇? ((我想很多人問過此問題,在 course 的 FAQ 也有答案。答案是 Lisp/Scheme 是非常 Practical ,不是玩泥沙的。如果是沒有用的話,並不會存在於這個世界 45 年。另外,這個 course 的目的不是教學生一種 Programming language ,而是教 Programming 的 Practice 。而 Scheme 比其他語言好,是因為 Primitives 非常少。另外,課程用書 SICP 的教學語言是 Scheme ,故此用 Scheme 。如果 SICP 教學語言是 COBOL ,會教 COBOL 。)) ((據說 MIT 的 6.001 SICP 已由 Scheme 轉為 Python 。)) ((順帶一提, UCB 用的 Scheme 是 STK , MIT 用的是 MIT/GNU Scheme 。)) ((此外,我正在同時上 UCB Public Health 的課,例如 Public Health 251D, 001 - Applied Epidemiology using R.))
我想很多人在學一種技能時都會問同一個問題。我在讀完 undergrad 出來工作,都在問我讀 undergrad 的課有何用。虛無主義侵蝕時,就會覺得甚麼都是「無用」的,紙上談兵。我們太習慣於市場導向的思維,大學教育都市場化,變成職業訓練。例如我在 Resume 上寫上 C, Java ,與 Resume 上寫上 Scheme / Prolog / brainfuck ,僱主的 impression 已經很不同。
愈學愈多,才發現在 resume 上寫上我識 C/Java 甚至是 SAS/SPSS ,等於告訴他人你識西洋棋的規例。我估一個智商沒有問題的小學生,都可以在一天之內學會西洋棋的規例。問題是你會西洋棋勝出的方法嗎?
玩了一會兒 Scheme ,就突破了之前 recursion 的問題。由於 Scheme 是鼓勵人用 recursion ,一切之前可用 iteration 解決的東西,要用 recursion 方式思考。
(load "simply") ;; need (member?)
(define (buzz n)
(cond ((equal? (remainder n 7) 0) 'buzz)
((member? 7 n) 'buzz)
(else n)))
(define (count n max)
(cond ((equal? n max) (buzz n))
(else (begin (print (buzz n)) (count (+ n 1) max)))))