2023 CS50 完課啦

Ann
Product Code: Ann
Published in
7 min readJan 1, 2024

CS50 課程全名是 CS50’s Introduction to Computer Science,是哈佛大學開設予任何科系選修、零基礎的電腦科學通識課,同時教學資源也放上網路,供世界各地的學生選修、提交作業並領取證書,可謂是相當佛心的一門課。

為什麼選這門課?

原因有二:學的是計算機基礎而非語言應用、還有免學費。

台灣早已有充足的程式教材,我自己也有修過 Python、Javascript 各半年課程的經驗,注意到台灣常見的程式課程以及坊間資源都很重視「單一程式的應用」,期待期末寫出可互動的 web app、或是在 local 跑得起來的小遊戲。因此課綱大多都已選定程式語言,從常見邏輯開始教授,卻沒有幫助我們更認識計算機的一分一毫。

工作性質的關係,作為產品經理必須周旋在工程師之間,規劃功能流程、設計 schema、參與 web 或 app service 的 trouble shooting;要從關鍵字知道工程師正在討論網路傳輸、資料型別、演算法效率、或實作框架哪一層面的問題。

工作初期,往往只想像得到開發跟撰寫程式邏輯有關,但這其實奠基在 git 協作統一或容器化的運行環境、甚或跨部門通用的開發框架溝通協定。工程師寫好程式後,還應該提高測試覆蓋率,加快交付效率,此外也要關注雲端部署的機器容量及運算效率採購得是否合理。與此同時,也要防範資安威脅,防堵 session 或資料傳輸時被攔截、竄改的風險。

在建立起開發工作中關鍵的知識領域前,我常常被關鍵字搞得暈頭轉向。從上述的舉例而言,這顯然無法只靠著熟練特定的程式語言習得,反而是要對於計算機、網路、開發應用都有足夠的想像及理解。

這邊同時也推薦一個 Developer’s Roadmap 的網站(https://roadmap.sh/),展示出工程師由淺入深應該掌握的知識。作為產品經理,目的不在精熟這些內容,而是知道關鍵概念出自哪個領域,與工程師溝通時就能更快踩在同一艘船上。

工作需求的另一方面,就是這門課,全!部!免!費!

修完課程、完成所有 problem set 後即可申請上方的完課證書,不花任何一分錢,也有其公信力。當時跟老闆 1:1 時簡單聊過,一致認為這門課是適合產品經理進修的方向,也因此成了我 2023 下半年每天下班後相處的對象。

CS50 教什麼?

上圖是 2023 年的課綱,每一年課程及作業會有所微調,如果修課有跨到不同年份,記得查看跨年度修課進度的認列標準,以免進度遺失。

每一週課程大約是 2.5 小時的實體授課錄影,不得不說授課老師 David J. Malan 的口條十分清晰、又隨時能說起相當生活化的故事,全英文的授課搭配校閱過的逐字稿,觀課過程開 1.5 倍速也能充分吸收課程內容。

以下用自己的筆記簡單敘述各週的學習內容

week 0–1

  • 以 scratch、底層的 C 語言示範基本 I/O 觀念
  • 介紹 binary、bits 到應用 ASCII、unicode 及理解圖片、影片、音樂的儲存方式
  • 示範基本 command line tools

week 2

  • 示範程式檔案如何 compile 為電腦可理解的指令
  • 介紹 command line argument、exit status 的意義

week 3

  • 示範多種 searching & sorting algorithms 之間 upper bound、lower bound 的效率差異
  • P.S. 這邊甚至調用快十個學生上台來示範 bubble sort、merge sort 兩種方法下,怎麼排序 1–10 的燈泡 XD

week 4–5

  • 示範如何用 C 語言存取、釋放暫時記憶。
  • P.S. 由於 C 語言是早期的語言,有很多需要指定記憶體位置、手動釋放空間的問題要處理,這兩週作業崩潰難,也是網路上提到最多學生放棄停修的兩週

week 6

  • 示範親民的 Python 語言,重寫所有之前用 C 寫的作業邏輯。
  • 介紹 Object-oriented programming
  • P.S. 發現 C 跟 Python 主要差異在於合併及新增了資料型別、省略 main function 而能直接 top-down 執行、直觀的運算子及 loop 寫法,Python 真的使用者友善多了。

week 7

  • 介紹 SQL 及對資料庫的 CRUD 應用觀念
  • P.S. SQL 是本來工作中就會使用、與資料庫溝通的軟體,不過之前總是只停留在讀取(GET)及分析資料。經由這門課,總算也釐清它不能算程式語言的原因(缺乏 function、loop 等運算邏輯)並且知道如何搭配 API 對資料庫做 CRUD。

week 8

  • 介紹基本的通訊協定:IP、TCP
  • 介紹 HTTP 協定中 request & response headers 的基本架構
  • 介紹前端三本柱 HTML、CSS、JavaScript 在前端扮演的角色

week 9

  • 以 Python Flask 框架示範撰寫 API
  • 強調 client、request 分別的 validation,必須防止不合規範的資料寫入

CS50 修課心得

很慶幸自己是邊工作邊修課,課程中常常瞥見關鍵字,可能是前一個月苦思不懂的觀念、或是工程師花了一兩天才修好的 issue。

例如資料數太多到達資料庫能儲存的極限,得把 schema 中欄位的 datatype 從 int 換成 long,牽涉的是記憶體從 32 bits 換到 64 bits,整個過程還需要 database migration 才能重新上線。

例如工程師曾經抱怨程式一直 compile 不成功,可能其實歸功於嚴格的 linter 把關了不夠嚴謹的撰寫邏輯,讓它不會 compile 後、甚至到 runtime 才出現意想不到的錯誤。

在工作上並不會有躍進式的產出,但是我能感受到向工程師討論 issue root causes 時,能更快地掌握相關知識詳盡地記錄原因及解法。這也是大大地減少溝通誤差及時間。

修課的過程除了前幾週的 C 語言有如地獄之外,還是相當有趣的。

Week 7 SQL 那週作業,課程方提供給我們將近 10 個 table 的 database,包含了一個小鎮的銀行進出紀錄、機場出入境紀錄、公共電話通聯紀錄、目擊者筆錄,要我們藉由熟練 SQL 語法分析出搶銀行的嫌疑犯。

Week 9 Flask 那週作業,課程方只提供了基本的前端框架,我們要自己實作出查詢股票報價、買賣股票及查看自己 portfolio 的 web app。這包含寫出前端操作邏輯,也包含設計 API、設計 schema、還有阻擋不合法的寫入邏輯。

原來寫開發日誌就是不停自言自語的過程

修課結束,整體而言很推薦給半年內有需要使用計算機基礎知識的工作者,如產品經理、想跟工程師更密切合作的設計師、或想參與前後端、schema 設計的資料分析師等。

如果你是學生、沒有特別使用到計概知識的需求,很可能在學期前半因為與自身沒有密切關聯就失去學習動機;如果你打算轉職前後端工程師,那也許專攻特定程式語言及相關概論,會來得更有效率。

Final Project,課程無硬性要求題目及產出為何,我做了跟前一週買股票邏輯相近的 web app,用來記錄自己的重訓資料。不過因爲對前端框架以及 AJAX 不夠熟悉,做不出那種在同一頁更新狀態的流暢感,只提供了簡單的寫入、刪除跟查看功能。

如果你對 CS50 的課有興趣,隨時就可以報名修課囉 → https://www.edx.org/learn/computer-science/harvard-university-cs50-s-introduction-to-computer-science

--

--