2015年9月3日 星期四

edX HarvardX:CS50x3 Introduction to Computer Science修課記(一)

修了edx上哈佛大學的CS50,一方面是想一探這門哈佛最受歡迎的課程,另一方面則是想好好複習一下C語言。

誤打誤撞進了碼農(?)這行,僅僅憑著從前在大學草草修過的C語言課程,與一路上同事們的熱心協助,就這樣載浮載沉地打滾了幾年。
總覺得基礎仍然薄弱,於是就趁著這個機會,帶上從前修課用的教科書-C Primer Plus(厚厚一本959頁),展開我的複習大業!

哈佛大學的這門CS50(Introduction to Computer Science)並不假設學生有寫過程式的經驗,事實上,這門課程也許是許多非工科的哈佛學生唯一的一門電腦課程,所以在課程設計上,也盡量不講得太過理論,而是用了許多比喻幫助學生理解程式如何運作,習題的設計也與生活盡量貼近。

課程一共為期十二週,每週的課程包含
lecture     : 包含兩段各一小時David Malan教授在大教室的授課影片
walkthrough : David Malan帶著走一遍程式碼
section     : 助教演習課
shorts      : 針對學習主題解說的小短片
problem set : 習題

現在上到課程第四週,目前的感想是,如果想要有個人手把手地帶著你一步步由淺入深地學習,只是看過lecture的影片其實很不夠。課程並沒有指定的教材與講義,每週兩小時的課程也僅僅是帶著你走過幾個觀念及語法,長篇大論幾十頁的習題,卻要你集當週教學的大成寫個程式出來。

David Malan上課的模式比較像是先為他要你知道的東西做個摘要,並安排一些與學生互動的遊戲引發興趣。像是在談到swap-交換兩個變量值的步驟時,就準備了兩個裝了牛奶和柳橙汁的杯子,請學生示範如何交換兩個杯子的飲料。生動的比喻很容易讓學生印象深刻,但每週兩個小時的時間並不夠好好說明一個觀念並舉些應用的實例。

在這方面,針對一個個學習主題做的short彌補了上大堂課的不足,例如compile的步驟、何謂function、演算法、pointer...等等,每一個小短片都針對一個觀念詳細解說,知識的含量很高。但儘管如此,要真正變成自己的東西,還是得自己動手做過一遍才行。

課後的習題分成兩個部分,第一部分是程式實作題,融入了許多應用的場景作為題材,例如判斷信用卡號碼是否有效、加密程式、打磚塊遊戲等等,在練習之時也會感覺到自己學的東西是真的能做出一些有用的程式出來。不過每一次的習題對於初學者來說,可能都是一個很大的跳躍,可能才剛學會迴圈和if else判斷不久,就得做出一個複雜的結構判斷信用卡號碼的位數,並配合運算式判斷是否有效和是哪家的卡等等。課程並沒有在中間安排幾個小小的練習讓你慢慢摸熟,也因為這是一門網路上的課程,並不像親自在哈佛有個面對面的助教和同學能與你討論,所以自己查資料和debug的工夫可不能少。在完成程式實作的習題後,第二部分則是幾個問答題,像是何謂function、某個演算法為何要這麼作等等問題,幫助你抓住學習的重點。

我認為整個課程含金量最高的就是shorts和習題這兩塊,其實shorts裡講的觀念書上大都找得到,不過有個人帶著走過一遍後,再回去看書就很容易抓到重點。

在哈佛校園裡的這堂課,中間還不時穿插社交活動、課外的project,期末還有個要組隊參加的hackathon,只可惜在網路上無法參與。

回想起在高中、大學的階段,自己未來的方向就得在上過一堆課後逐漸做出選擇,中間遇到過很有心、卻不知道怎麼把學生帶起來的老師,也遇過嘗試突破傳統框架教學、充滿熱忱的老師,也曾經歷過自己上完課完全不知所云,到了做實驗時才領悟的成就感。大部分學過的東西早已還給老師,但幾個自己印象深刻的作品、幾個感動的時刻仍然記得。

學習一個東西,我想除了功利地考量到學會什麼樣的求生技能、多了點機會外,另一樣收穫在增加了見識,瞭解到看起來很厲害的表象,底下原來就是遵循著這一套規則在運作。