資源分享01_從反及閘到俄羅斯方塊之旅
我今天要分享的,是一個對於學習編程和電腦科學十分有用的課程,畢竟在二十一世紀,基本的電腦科學知識已被視為一種基本素養。
先講結論。不論你是否接觸過程式相關的領域、不論你高中是幾類組、更不論你對自己的未來是否已經做足了打算,只要平常還撥的出時間,我強烈推薦你,到網路上註冊一個 Coursera 的帳號,上上看 From Nand to Tetris 這套課程。
滿天滿谷的資源
在這個網路課程滿天飛的時代,想要自學程式其實是非常簡單的,諸如 Udacity、CodeAcademy、CodeSchool 等程式教學平台都已有一定的成熟度,較為學術性的 Coursera、edx 或商業化的 Udemy 也有許多高品質的課程,許多論壇、Blog 裡頭更是充斥著淺顯卻充滿洞見的閱讀素材。
從軟體設計到網路開發、從程式語言到資料結構與演算法,基本上任何初學者想學的內容,大都可以在網路上找到對應的學習資源。但是,如果要在我至今接觸過的所有編程資源裡頭萬中選一,推薦一套課程給朋友,那麼 From Nand to Tetris 將會是其中首選。
編程的世界十分廣大,光語言就有千百種,其涵蓋的領域更是多如牛毛,諸如作業系統、演算法、App、遊戲、社群網站、搜尋引擎...等等,每個大主題背後更是由無數的支幹撐起,不同領域與支幹上手的難易度也大相逕庭。
若要在這程式碼的茫茫大海中站住陣腳,勢必需要先將出航的基本配備準備周全,例如一艘穩固的船、指北針、航海圖和糧食配備,可以的話最好找幾個出海經驗豐富的人當你的航海士。 Coursera 的這門課所扮演的角色,即是那艘帶著你出海的船,裡面的老師正是你的航海士。
課程價值
在武俠小說裡,如果沒有內功為基礎,練習各種武術招式是沒有實際意義的。學習編程亦是如此。倘若對於電腦的結構和運作原理沒有一定程度的暸解,或是對於程式語言背後在記憶體上的運作機制一竅不通,那麼在編程這條路上愈到後頭走的只會愈加艱難,亦容易因知其然不知其所以然,導致最後處處碰壁。
同時,當今跟程式相關的大學教育主要落於電機和資工兩系,前者著重硬體層面的課程較多,後者則較強調程式設計。然而一直以來除非是將兩方相關領域的課程修好修滿,再查閱資料做自我補強,否則一般學生似乎很難有效率的將硬體和編程之間的隔閡真正扎實的銜接起來,更別提非本科生了。
From Nand to Tetris 有效的解決了這兩個問題。由於這門課的對象是零基礎的學生,只要你有時間願意投入,不需要到大學修一大堆課便可以有系統的掌握從最底層的硬體到最上層的程式之間的結構。
課程結構
在課程的安排上,整門課共分為兩個 Part,每個 Part 有 6 個 Project 實作。Part 1 教你怎麼從最基本的邏輯閘自己組出一些基礎的邏輯元件,再用這些元件製作更高階的電腦元件,接著一步步向上將它們結合成 CPU 和記憶體,最後設計出一台簡單的電腦。同時它也會告訴你怎麼設計一個簡單的組合語言,並將它轉換成這台電腦的機器語言。
Part 2 則是建立在你今天有了這台電腦,並知道如何使用它的情況下,在上面設計虛擬機、編譯器、作業系統和程式語言,再用你所設計出的這個程式語言寫一些小遊戲。課程的名稱之所以為 From Nand to Tetris,即是指當你學完了裡面的東西以後,就可以從最基本的一種邏輯閘:Nand gate,一路向上設計電腦、設計系統、設計語言,最後打造出一款像是 Tetris(俄羅斯方塊)的遊戲。
這一系列的教學過程中,所有的實作都是藉由電腦模擬,而這方面的模擬程式,課程方也以開源讓學生自己下載來用。換句話說,你所需要做的只有準備好一台電腦、到 Coursera 註冊一個免費帳號,按照課程裡頭的教學把環境設定好,就可以踏入計算機科學的世界了。
結論
講了這麼多,到底為什麼我會推薦這門課呢?正如同文初所提,當今技術多如牛毛,且隨著科技日新月異,新的框架總是會一再推出、取代舊有環境。然而這門課的重點並不在掌握細節、亦不在背誦重點。相反的,它透過一個接一個簡單的實作讓你在短時間內於腦中建立了一個很好的底蘊。
我不敢說自己的編程技術有多厲害,畢竟人外有人、天外有天,而身為一個物理/數學系的學生,和真的長期認真鑽研此領域的本科生想必也有不少落差。但是可以確定的是,這門課在我學習編程的路途上給了許多意想不到的幫助;而即使是電機系畢業,在矽谷當網路工程師的老哥,在這門課推出時也一步一腳印的跟著裡面的影片和實作走過了一遍,並給予極大的讚賞。
只要願意花時間掌握這些計算機的基本精神,不僅可以感受到人類工程設計的美學,更能幫助你在這塊領域做進一步探索時避開很多冤枉路。縱使未來沒有要走相關領域的產業,但是對日常生活中使用的電子產品有著深刻一些的暸解,也不乏為一種素養。