Skip to content

Days I Studied CS61A

前言

今天是我完成 CS61A 的日子。從我開始學習到結束,歷時一個半月。當然我是有一點基礎的,所以其中某些部分會進行跳過,但是總的來說,基本所有的 lecture 我都會過一遍,如果遇到難啃的部分甚至會再看下 discussion 部分。這篇主要是記錄我這段時間的感受和收穫。

緣起

學習這門課程並不是誤打誤撞,隨性而起的。

起因是我在豆瓣的 程序員書單看 到 計算機程序的構造和解釋 這本書。其實很早之前就聽說過這本書,但是那會翻了以下,發現 Lisp 語言對我來說還是有些惱人。各種括號,是我還沒理解那屬於老法師的浪漫。所以就放下了。

後來讀了黑客與畫家,裏面作者對 Lisp 大為推崇,而且他對於語言的觀點讓我耳目一新。由此及彼,我想起這之前沒看下去的上述那本書。

既然我還沒有時間抽出來學習 Lisp,它又是一門函數式編程語言,現在使用的人相比其他流行的語言來說是不多的,遇到我這種情況的人,應該不少,或許已經有人把它用 JS Python 之類的解釋型腳本語言翻了一遍?

果然 SICP JSSICP using Python3 — CS61A textbook 是有的,在我輸出 sicp 關鍵字的時候已經跳出來 jspython 這兩個提示詞。我想也許是它倆的函數式編程特性支持的太明顯了吧。

一看有一版是竟然是 UCB 的教材,那自然質量是有保證的。

一看課程表,還有 lecture 視頻可以看,各種 lab, hw, project 都是公開的。我何不趁此機會體驗一下國外知名大學的教育呢?隨然沒有身在其中,失去氛圍的熏陶,但是我還是覺得花時間去跟學,會有不少收穫。

秉持這這種新鮮感和對 sicp 這本原書和 UCB 的慕名,我開始了 CS61A Fa20 的學習。並在推特上用一條 thread 進行記錄。

過程

體驗

可以看出,授課老師是認真備課,而且在不斷改進課程的,因為每個視頻都是不同時期錄製的,只有老師覺得需要改進的部分才會進行重新錄製。

有一個細節,每一個 labhw 基本都是相同部分的內容,但是他們被安排在相近的日期之內,hw 有 hint video, lab 可以找 TA 進行協助。所有的一切一切都只在幫助你更好地掌握知識。

收穫

總的來說,我並不是零基礎,因此這門課給我也不是進行入門的。

這一個半月下來,給我印象最深的部分就是:

最開心的時候,還記得是在做最後一個 project, 發現竟然可以通過兩個函數相互调用,遞歸地去解決一個問題。這個時候實在是太有成就感了。我相信這種左右搭右手式的解决方法將會在我腦海裏存在,一直存在,因為那個時刻給我的印象太深刻了。

這門課其實前半部分其實一直花很大篇幅在傳遞一個信號:將問題分析出來,抽象,再寫代碼解決問題。

前三個 projects 本質上就是要培養起這個能力。

然後最後一個 project 帶你進行難度上一個臺階的問題。

OOP 編程中去完成一個函數式編程的解釋器和執行器。通過這個設計,既然掌握了 OOP ,又深入理解了函數式編程的奧秘。可以感受到課程老師們的用心良苦,想起國內大量的 PPT 閱讀者,不難理解為什麼每年畢業季都是最難就業季。

終於到後半部分,終於來到重頭戲, scheme 。因為我之前接觸過 OOP 等概念,所以前半部相當於複習。

這部分是收穫最大的部分:

學習完這兩部分,我甚至可以自己去寫一門微語言了。其實實現簡單的運算不難,主要就是解釋器和執行計算的執行器組成。遠看以為發明一門語言是一個很龐雜的工作,其實還是由一些最基礎的組件組成。根本沒必要畏難。所有複雜問題都可以拆解成小問題,一步一步去解決。如果不行,那是問題還沒被正在理解和拆解罷了。

Last but not least

這種形式的自學,比起在課堂上聽老師讀 PPT ,算得上是一種真正的受教育。

課上有舉例,有一言不合 show me your code, 有答疑會在專門的討論課得到解答。

課後有測試機,幫助你實時驗證你的輸入,就像在做 LeetCode 一樣。

當然,還有體驗不到的 TA 協助,以及 office time.

這才知道為什麼那些在校生都在看這些,才知道英語世界的資料是如此的豐富,才知道自己以前錯過了這麼多寶貴的資源。

邁開腿,翻越那堵牆,去發現更大的世界,很多世界頂級的內容在等著你。

What is next?

接下來,我準備在休息時間,做一下這些:

這幾項估計我要學上個大半年。期待學完之後的自己,對接下來的挑戰充滿期待哈哈哈!


Share this post on:

Comments


Previous Post
關於比特幣
Next Post
我是怎麼閱讀一本書的?