或許你聽過,電腦只使用 0 跟 1 兩個符號在運作,那麼你是否好奇這究竟是怎麼運作的呢?買電腦的時候,我們仔細挑選的記憶體、CPU、螢幕等等,這些裝置彼此究竟是什麼關聯、怎麼互動的呢?
Coursera 的 Nand2Tetris 這門課將解答你對電腦構造的所有疑惑!
Nand2Tetris 是一門讓你
學會親手組裝一台電腦的
免費線上課程,從只用 0 跟 1 運算的基本 nand 邏輯閘開始、一路建構成可以執行俄羅斯方塊遊戲(Tetris)的完整電腦。這則筆記將介紹
Nand2Tetris 這門課的特色、上課會有多大的收穫,並且告訴你為什麼好豪覺得這門課是電腦科學線上課程的模範!
目錄
這門課在學什麼
課程官方的介紹影片:這就是一門教你做出一台電腦的課程(Source: nand2tetris.org)在資工系大學課程,這每個主題都會獨立開一門課,而
Nand2Tetris 在這每個主題都選擇最核心的部分講解,讓學生獲得恰好足夠學會組裝電腦的最適中知識量、學習沒有過多壓力。Nand2Tetris 也被金門大學採用為
資工系教材 喔。
Nand2Tetris 課程大綱(Source: nand2tetris.org)
- 硬體
- 布林邏輯:計算機的最基礎單位,了解 0 跟 1 的邏輯運算
- 算術邏輯單元(ALU):組合簡單邏輯閘、讓它們運算功能更複雜
- 暫存器與記憶體:了解電腦如何儲存資料
- 機器語言:學習用一串 0 與 1 的指令集操作電腦元件
- CPU:組裝出電腦的運算核心、了解它跟記憶體如何溝通
- 軟體
- 組合語言:機器語言只用 0 與 1 太嚇人了,來學學如何用組合語言「包裝」機器語言、讓它變成人類看得懂的樣子
- 虛擬機器:寫了一支程式,怎麼讓它在任何硬體都能執行
- 高階語言:來學點物件導向
- 編譯器:學會把 C++ 或 Python 轉換成電腦看得懂的語言
- 作業系統:設計出協調更多程式的程式,也學習操控螢幕跟鍵盤的程式
學完這門課之後,可以為你解答很多電腦科學熱門問題,例如:
- 究竟 Java 跟 C++ 有什麼不一樣、我該使用哪個?
- 學過虛擬機器章節後,你將會理解 Java 的設計目的、功能、與優勢,和 C++ 有哪些不同
- Stack-Overflow 是什麼?
- 編譯器不就是把 C++ 翻譯成電腦看得懂的樣子而已嗎?為什麼設計編譯器也是個研究領域?
- 仔細看看自己在這門課親手寫的編譯器以及它編譯出的虛擬機器程式碼有多笨拙吧,你會知道編譯器最佳化是多麽重要的課題!
為什麼我想學這門課在上這門課時,好豪已經在深度學習、或資料科學領域工作與學術研究約三年,雖然這些都算是「資工」的範疇,如果我不知道電腦運作的原理、怎麼能自稱是電腦「科學家」呢?於是我找到了 Nand2Tetris 這門課,開啟了我重新認識電腦的旅程。
在 Coursera 上,Nand2Tetris 分成上、下兩部,
第一部分 主講硬體層面、
第二部分 則是軟體層面,總共有 12 個章節。筆者好豪利用正職工作以外的下班時間以及週末上課與寫作業,12 個章節總共花了我 113 天完成(包含中間休息一個月啦)!各章節難度不一,下圖是我完成各章節花費的時間,如果你正在上課、也想紀錄自己上課花費的時間,我把我的上課天數計算以及視覺化方法收錄在
我的 Github 了,讓你參考使用。
筆者好豪花了 113 天完成 Nand2Tetris 所有課程(Source: My Github)
這門課不只單純讓我扎實學習計算機結構基礎知識,它在系統思考的著墨、以及教學設計方法都給了我很多啟發,有很多元的收穫。
課程特色不需先備知識Nand2Tetris 這門課不需要先備知識,只要你對電腦運作原理有興趣,可以立刻開始上課,老師會從基礎運算邏輯教起,不管你擁有什麼知識背景都能跟上進度。
不過,
第二部分 的軟體層面課程,好豪認為你有學過任何一項程式語言、寫過一點點程式,寫作業的速度才不會太慢、也比較能夠對課程第二部分提到的作業系統、編譯器等主題更有心得喔。
實作式學習這不是讓你躺在沙發上看影片就能完成的線上課程!課程每一個章節,都有完整的作業,作業與影片學習各自份量大約是一比一,也就是說,你必須要動手做才能達到最高學習效果。
- 自創學習用的硬體描述語言、組合語言等等,比實戰用的更簡化、更好上手
- 設計應用程式模擬硬體元件開發,你不需要真的用到一堆電晶體、也能體驗 CPU 設計
- 有各式測試程式,你可以自己檢查寫好的作業是否正確
也因為是實作式學習,不小心寫作業沒靈感的時候,難免會覺得有點挫折。筆者在此提醒你:不要放棄!這門課的作業沒有任何部分是刁難你的,只要細心複習課程內容、或是研讀課程討論區內容,一定能完成作業!突破考驗完成作業將會非常有成就感!並且,練習這門課的作業千萬不能馬虎,各章節的內容連貫,前個章節的作業如果沒有好好寫完、下個章節的作業有可能因此無法完成喔!
你將學會把 C++ 或 Python 等高階語言轉換成只有 0 跟 1 的機械語言(Source: nand2tetris.org)
另外,好豪也在這門課首次學到了「
系統設計」的感覺,每個章節完成的功能就像是整個系統的其中一「層」,透過
抽象化(Abstraction),每一層之間只需要知道彼此如何溝通操作,不需要知道底層如何實作;而作業中,通常會告訴你輸入內容、以及預期輸出各自是什麼,這就是設計好的
API,學生只需像填空題一樣完成中間缺少的實作部分即可。事實上,計算機架構真正需要研究的就是系統設計問題,例如:在這門課設計的架構中,「相乘」功能是在作業系統層次的 Library 實作,那「相乘」能不能寫在 ALU 呢?這樣修改會有好處嗎?這門課
不會回答這類問題,
Nand2Tetris 只是完整地幫你想好其中一種架構,讓學生乖乖照做,如果需要更深入探討計算機結構、當然需要自己思考、或者補充其他知識囉。
教學的模範:「承先啟後」在前言就已經提及,好豪覺得這門課是電腦科學線上課程的模範,因為他為複雜的課程做好「承先啟後」的設計,讓學習過程不會迷路。
每一章節的開頭,講師都會先強調課程摘要的
Big Picture,在章節結尾也有
Perspectives 小節說明該章節內容對計算機研究的影響力,這些內容都是告訴你目前學習章節在整個課程的
定位、說明
為什麼要學習這個章節的內容。過去好豪在研究速讀與學習技巧的時候,也曾學到在開始學習新知前、
在腦中先建立知識架構 將會提高學習效率。
Nand2Tetris 的課程內容範圍遍及計算機各個領域,講師為學生們的摘要與展望小節,可以達到「見樹又見林」的學習效果。
此外,各個章節之間的內容都有強烈的連結,你在前一個章節學習的知識、將立即運用在下個章節裡,每次開啟新章節,你都會立即感受到知識的實用性、學習成就感相當高!
這門課之後…如果你學完這門課,還想累積更多相關知識,好豪個人推薦清大黃婷婷教授的
計算機結構開放式課程,你會發現原本看似艱澀難懂的計算機組織課本,就只是 Nand2Tetris 所學內容的延伸,你學完 Nand2Tetris 之後可以更有信心地深入學習計算機硬體知識。
Nand2Tetris 在作業系統的著墨其實非常淺,可以說幾乎沒有接觸到作業系統領域最核心的記憶體配置、檔案管理等議題,因此推薦你繼續學習清大周志遠教授的
作業系統開放式課程,補充 Nand2Tetris 沒有講清楚的作業系統知識。
結語非常著名的
CS50 線上課程教你「怎麼設計電腦軟體」,
Nand2Tetris 則是教你「電腦怎麼運作」。好豪認為,CS50 + Nand2Tetris 兩門課可以互相補充、加起來可以讓你涉獵大學資工系四年課程的所有內容!
Nand2Tetris 課程內容本身不複雜、但是作業會有點累人,堅持花三個多月完成課程之後,我覺得非常值得、收穫滿滿!推薦對電腦科學有興趣的你,一起來挑戰親手設計一台電腦!
你是線上課程自學的愛好者嗎?好豪還寫過幾篇軟體工程線上課程的心得,推薦熱愛自學的你閱讀!