前言
其實我之前就已經寫過一篇文章(如海洋般的程式課程:CS50)大力稱讚過 CS50,但那篇比較凌亂一點,比較像是自己的筆記。
今年再修了一次之後,依然覺得這門課很棒,決定再次跟大家分享。
CS50 是什麼?
CS50 的課程名稱叫做 Introduction to Computer Science,是一堂哈佛大學的通識課程,總之就是一門在介紹 Computer Science 的課。
而這門課程的所有資料都有公開在網路上,也有在 edx 上面開課,可以跟著自己的進度來上。
除此之外,在 cs50.tv 也有課程的影片、逐字稿、作業等等的內容供大家自行取用。
CS50 這門課是「完全免費」的,但是在 edX 上面你可以選擇修完課之後付錢購買「修課證明」,意思就是你有修過這門課了並且得到官方認證。但是這個證明要不要花錢買完全是見仁見智,不買的話你還是可以免費修課。
CS50 的課程會教哪些?
我列舉一下 2016 年秋季的課程的每一週的課程大綱:
- Scratch
- C
- Arrays
- Algorithms
- Memory
- Data Structures
- HTTP
- Machine Learning
- Python
- SQL
- JavaScript
每一週的課程都有大概兩小時的影片跟一份要花你超級多時間的作業,但你從它的課程大綱就可以看出來,這門課教的東西非常非常多。
若你想知道得更詳細,我貼一下我之前修的那年(2015)的每一週的更詳細的大綱:
第零週
二進位、ASCII、RGB、二分搜尋法
介紹基本程式語言:條件判斷、變數、迴圈、陣列、函式
作業:用 scratch 寫一個程式
第一週
開始介紹 C 語言,以及講解 compile 的觀念
介紹各種形態,像是 double, float, int, bool, char, long long...
介紹浮點數誤差與 overflow
教你 command line 基本操作,像是 mv
, ls
, cd
, make
等等
作業:寫一個簡單的 C 程式(迴圈印出星星)
第二週
介紹 function, string, array
以及如何利用 argc
, argv
傳入參數
還有講到加密,像是 RSA
教了 command line 的 Redirecting(>
)還有 Pipe(|
)
作業:字串處理,簡單加解密實作
第三週
搜尋、排序(氣泡、插入、選擇、快排、合併)、big O
遞迴、bit 操作
GDB 的使用
作業:實作O(n^2)的排序跟二分搜
第四週
再次講解遞迴
字串、指標、struct
、bitmap 格式
檔案處理(fprint
/fopen
...)
malloc
,記憶體分配
教你用 xxd
看檔案的 hex
作業:給你 bitmap header 的文件,處理 bitmap 圖片,例如說放大兩倍
第五週
深入講解記憶體與指標
資料結構:linked list
, queue
, stack
, tree
, BST
, tries
, hashmap
教你用 wget
抓檔案,以及如何寫 Makefile
作業:實作字典樹或是 hashmap
第六週
這週開始講跟網路有關的,包括:IP
, IPv6
, domain
, nslookup
, traceroute
, 封包, ports
, dns
, vpn
, http
, request
, response
教你用chmod
改檔案權限,以及curl
抓網頁
作業:用 C 寫一個 http server(的部份功能)
第七週
chrome dev tool 的使用,像是看 html
, request
基本 html
與 css
教學
php
簡介
get/post 參數介紹
sql
基本教學
教你用apt-get
安裝套件
作業:完成簡單的 php
網頁以及與資料庫溝通
第八週
示範重構程式碼,講解MVC
的觀念
教基本 SQL
語法
有介紹到SQL Injection
作業:串Google Map API
,使用jQuery
跟ajax
做出互動性較高的網頁
第九週
javascript 語法簡介
json 格式講解
DOM 模型
event handler,事件機制
CS50 值得推薦的另外一個點就是課程會不斷改進,像是我那年之後就把用 C 實作一個 http server 拿掉了,我猜測原因可能是這項作業太難。還有像是以前是學 PHP,現在課程教的是 Python。
每一年 CS50 都在進步,把不適當的作業跟內容拿掉換成新的,儘管我已經修過一次,修第二次的時候依然可以學到一些新東西。
為什麼推薦這門課?
現在網路上其實已經有很多教學資源了,包括各式各樣的文章以及線上課程,可是這些課程有時候會有一個問題,那就是太零散。這邊一點、那邊一點,你修完這個之後還要去修別的才能補齊其他知識。
還有,半路轉職的人跟資工系本科出來的工程師有一個最大的差異:Computer Science 的相關知識。許多職業培訓班教的都只有工具,例如說 Ruby on Rails, PHP 等等,有很多學生結訓之後可以寫出一個網站,但卻完全不知道這樣為什麼可以。
所以常常會看到很多案例是培訓班出來的學生都被公司打槍,因為隨便問個很簡單的問題也回答不出來(但如果直接叫他們做網站,是做得出來的)。
而 CS50 這門課一次幫你補足了知識的廣度與深度。
如果你有認真修完,你會知道:
- 記憶體相關知識,像是 stack 跟 heap 的差別跟什麼是 stackoverflow
- 經典排序演算法,像是 bubble sort, merge sort 等等
- 基礎資料結構,stack, queue, hash table...
- 網路相關知識,像是 TCP/IP, HTTP 等等
除此之外呢,你也會學到怎麼用 python + flask 寫出一個簡單的網站,藉此學習到網站開發相關知識,例如說:
- cookie 與 session
- web server
- database 的使用
- 資訊安全相關知識,像是 sql injection
總而言之,不管你之後想走的是哪個領域的工程師,這堂課對你一定很有幫助。
誰適合這門課?
我最推薦的族群是「正在上或是已經結業的培訓班學生」。
為什麼?
因為這門課的門檻真的不低。你看他要教這麼多東西,然後我又說他不只教的廣,還教的深,學生必須要投入很多時間在上面,才能取得相對應的回報。
如果是「完全新手」,幾乎沒有任何對程式的相關知識,當然還是可以修這門課,但我覺得一定會非常非常非常累,而且挫折感應該滿重的,因為這堂課真的不簡單。想要挑戰看看的話我也十分鼓勵,我敢保證你認真修完之後一定能學到很多東西。
對於那些已經有基礎程式知識的學生來說,這門課的門檻會稍微低一點,但前面五週都在上 C,還是很有挑戰性。之後幾週上 Web 相關的才會比較輕鬆一點。
我心動了,那應該怎麼開始?
最簡單的方法就是去 edX 上面註冊,然後根據上面給的指示開始修課,其實就跟你修其他的開放式課程一樣。
但如果你想先體驗看看,可以直接到 Youtube 去看課程影片,看完之後再決定要不要修課。
在這邊要提醒大家,我覺得 CS50 課程的精華在於作業,如果你只是想看看影片,但你大概只能學到這堂課的一半,因為另外一半都在作業裡了。請大家務必做作業,學程式這種東西光看是不行的,一定要下去動手做才會更有感覺。
之前為了鼓勵更多人來修 CS50,我有做了一系列的導讀,每一週都有一支導讀影片,主要就是聽我稍微再講一下這一週的重點以及做一點小補充。導讀影片的話也可以到 Youtube 上面看。
每一次導讀完我都有把心得記錄下來,想看心得的話可以到這邊。
結論
CS50 以非常生活化而且盡量簡單的方式講授艱澀的電腦科學相關知識,對我本身的教學理念以及風格影響深遠。這門課給了我很多教學上的啟發,讓我知道原來換個方式講,可以把一件事情解釋得清楚許多。
「如海洋般的程式課程」是我之前給它取的稱號,因為它「又深又廣」。講述的知識範圍既廣又同時兼顧了深度,真的是一門很棒的課程。
最後,再次推薦這門課給所有想要更瞭解 Computer Science 的人。
關於作者:
@huli 野生工程師,相信分享與交流能讓世界變得更美好