前言
今天是我完成 CS61A 的日子。從我開始學習到結束,歷時一個半月。當然我是有一點基礎的,所以其中某些部分會進行跳過,但是總的來說,基本所有的 lecture 我都會過一遍,如果遇到難啃的部分甚至會再看下 discussion 部分。這篇主要是記錄我這段時間的感受和收穫。
緣起
學習這門課程並不是誤打誤撞,隨性而起的。
起因是我在豆瓣的 程序員書單看 到 計算機程序的構造和解釋 這本書。其實很早之前就聽說過這本書,但是那會翻了以下,發現 Lisp 語言對我來說還是有些惱人。各種括號,是我還沒理解那屬於老法師的浪漫。所以就放下了。
後來讀了黑客與畫家,裏面作者對 Lisp 大為推崇,而且他對於語言的觀點讓我耳目一新。由此及彼,我想起這之前沒看下去的上述那本書。
既然我還沒有時間抽出來學習 Lisp,它又是一門函數式編程語言,現在使用的人相比其他流行的語言來說是不多的,遇到我這種情況的人,應該不少,或許已經有人把它用 JS Python 之類的解釋型腳本語言翻了一遍?
果然 SICP JS 和 SICP using Python3 — CS61A textbook 是有的,在我輸出 sicp 關鍵字的時候已經跳出來 js 和 python 這兩個提示詞。我想也許是它倆的函數式編程特性支持的太明顯了吧。
一看有一版是竟然是 UCB 的教材,那自然質量是有保證的。
一看課程表,還有 lecture 視頻可以看,各種 lab, hw, project 都是公開的。我何不趁此機會體驗一下國外知名大學的教育呢?隨然沒有身在其中,失去氛圍的熏陶,但是我還是覺得花時間去跟學,會有不少收穫。
秉持這這種新鮮感和對 sicp 這本原書和 UCB 的慕名,我開始了 CS61A Fa20 的學習。並在推特上用一條 thread 進行記錄。
過程
體驗
可以看出,授課老師是認真備課,而且在不斷改進課程的,因為每個視頻都是不同時期錄製的,只有老師覺得需要改進的部分才會進行重新錄製。
有一個細節,每一個 lab 和 hw 基本都是相同部分的內容,但是他們被安排在相近的日期之內,hw 有 hint video, lab 可以找 TA 進行協助。所有的一切一切都只在幫助你更好地掌握知識。
收穫
總的來說,我並不是零基礎,因此這門課給我也不是進行入門的。
這一個半月下來,給我印象最深的部分就是:
- 遞歸
最開心的時候,還記得是在做最後一個 project, 發現竟然可以通過兩個函數相互调用,遞歸地去解決一個問題。這個時候實在是太有成就感了。我相信這種左右搭右手式的解决方法將會在我腦海裏存在,一直存在,因為那個時刻給我的印象太深刻了。
- 抽象
這門課其實前半部分其實一直花很大篇幅在傳遞一個信號:將問題分析出來,抽象,再寫代碼解決問題。
前三個 projects 本質上就是要培養起這個能力。
然後最後一個 project 帶你進行難度上一個臺階的問題。
在 OOP 編程中去完成一個函數式編程的解釋器和執行器。通過這個設計,既然掌握了 OOP ,又深入理解了函數式編程的奧秘。可以感受到課程老師們的用心良苦,想起國內大量的 PPT 閱讀者,不難理解為什麼每年畢業季都是最難就業季。
- scheme
終於到後半部分,終於來到重頭戲, scheme 。因為我之前接觸過 OOP 等概念,所以前半部相當於複習。
這部分是收穫最大的部分:
學習完這兩部分,我甚至可以自己去寫一門微語言了。其實實現簡單的運算不難,主要就是解釋器和執行計算的執行器組成。遠看以為發明一門語言是一個很龐雜的工作,其實還是由一些最基礎的組件組成。根本沒必要畏難。所有複雜問題都可以拆解成小問題,一步一步去解決。如果不行,那是問題還沒被正在理解和拆解罷了。
Last but not least
這種形式的自學,比起在課堂上聽老師讀 PPT ,算得上是一種真正的受教育。
課上有舉例,有一言不合 show me your code, 有答疑會在專門的討論課得到解答。
課後有測試機,幫助你實時驗證你的輸入,就像在做 LeetCode 一樣。
當然,還有體驗不到的 TA 協助,以及 office time.
這才知道為什麼那些在校生都在看這些,才知道英語世界的資料是如此的豐富,才知道自己以前錯過了這麼多寶貴的資源。
邁開腿,翻越那堵牆,去發現更大的世界,很多世界頂級的內容在等著你。
What is next?
接下來,我準備在休息時間,做一下這些:
這幾項估計我要學上個大半年。期待學完之後的自己,對接下來的挑戰充滿期待哈哈哈!