在Data Science圈打滾之自修完CS50的5個心得

培養從Research Code到Production Code的Sense!

YL-Tsai
9 min readSep 20, 2020

其他CS50的課程介紹

This is CS50”: A Pleasant Way to Kick Off Your Data Science Education

CS50:一堂超過 800 個哈佛學生選修的「硬課」,魅力何在?

別猶豫了,來修 CS50 吧!

目標讀者

若你也是非資工背景,一頭栽進了Data Science的領域,並且開始考量是否要多一些電腦科學、軟體工程的背景知識,那麼看這一篇介紹就對了!

我修CS50的原因

在自學Data Science的過程中,我第一個學習的程式語言是Python,在此之前碩士班碰過的語言則是mathematica,之後相關的經驗就是在Kaggle上讀別人的notebook,看numpy,pandas的官方文件,自己買python的書學習,也刷了一些leetcode,後來從比較偏Data Analytics的工作轉換到Machine Learning Engineer,面對經常需要git clone網路上論文的實作進行重現,以及和後端同事的溝通,我開始感覺到computer science基礎知識的不足,或是每次裝東西會遇到Makefile,CMakeList等,因此決定找一門專門教Computer Science的課程,但又不希望課程內容過於生硬,經過網路上的一陣翻找,我來到的CS50的大門口,第一堂課David Melen課堂上就說每次修課都有2/3的人是完全沒有相關背景的,再搭配他及其生動有趣的教學,13周過去了,我邊上班邊完食這門課(week0 — week10),了解不少Computer Science的基礎,也能夠應用在工作中,我會在下面的修完課的5個心得提到XD。

2019年的課程內容摘要

第零週 Computational Thinking, Scratch

  1. 什麼是演算法
  2. 電腦怎麼表達資訊? — 數字、文字、圖片、影片、音訊
  3. 二進位、ASCII、Unicode、RGB、二分搜尋法、時間複雜度、psudo code
  4. 介紹基本程式語言:條件判斷、變數、迴圈、陣列、函式
  5. 作業:用 scratch 寫一個程式

第一週 C

  1. 以Scratch的block對應C語言的各種語句
  2. 介紹 C 語言,以及講解 compile 的觀念(使用clang)
  3. 解釋Error code發生的原因,解釋幻影錯誤(phantom errors)
  4. 現場debug
  5. 介紹各種資料型態,像是 double, float, int, bool, char, long long…
  6. 介紹浮點數誤差與 overflow
  7. 教你 command line 基本操作,像是 mv, ls, cd, make
  8. 以馬力歐遊戲的block來介紹迴圈的用途
  9. 作業:寫一個簡單的 C 程式(迴圈印出block,直的,橫的),透過貪婪演算法(Greedy Algorithm)來設計找錢程式

第二週 Arrays

1. 講解Complie的4個步驟(preprocessing, compiling, assembling, linking)

2. 講解電腦怎麼存取變數、字串的結束符號等

3. function, string, array

4. 以及如何利用 argc, argv 傳入參數

5. 透過string to number在經過數學函數加密

6. 作業:字串處理,簡單加解密實作

第三週 Algorithm

1. 搜尋、排序(氣泡、插入、選擇、快排、合併)

2. big O、big Omega、Theta

3. 遞迴、bit 操作

4. 作業:實作一個投票問題,過程中會使用到排序

第四週 Memory

1. 16進位,Pointer,adress、struct、bitmap 格式

2. 講解memory取用的順序,從compiler,global variable,heap,最後到local variable,heap及stack

3. 檔案處理(fprint/fopen…)

4. malloc,記憶體分配、檢驗一張圖是不是jpg

5. 作業:寫圖片濾鏡,像是鏡像,模糊化,以及圖片恢復

第五週 Data Structure

1. 深入講解記憶體與指標

2. 資料結構:linked list, queue, stack, tree, tries, hash-table, queues, stacks

3. 作業:實作字典樹或是 hashmap

第六週 Python

1. 又講一個新的程式語言,同樣透過Scratch的各種Block來對應python的各種語句

2. 比較Python和C不同的地方,包含語句的設計,compile的機制,

3. 介紹了正則表達式(Regular expression)

4. 使用google speech API進行語音辨識,透過google face API進行臉部辨識,用了一個package將特定網址產生了一個QR Code

5. 作業 : 把C迴圈印block的code改成python,將貪婪演算法找零從C改成Python,透過字串比對來比對人類DNA。

第七週 SQL

1. 使用python轉寫script來整理IMDB資料,在使用sqlite3整理,比較兩者

2. 介紹database中的資料型態,BLOB,INTERGER,NUMBERIC,REAL,TEXT

3. 下載imdb資料並以sqlite3操作

4. 介紹資料庫正規化,ERD(entity relation diagram)

5. 介紹Key以及Index,sql injection

6. 作業:使用imdb資料集透過sqlite3操作進行EDA,寫10個sql script

第八週(Web Track) HTML, Javsscript, CSS

  1. 介紹HTTP,TCP/IP
  2. IP adress,IPv4,IPv6,Ports,DNS(Domain name system)
  3. 講解開發者工具使用
  4. GET,POST
  5. 寫一個hello world網頁,使用html, javascript, css
  6. 作業:No

第九週 (Web Track) Web Programming

  1. 介紹Flask,dynamic web programming
  2. Cookies,Session
  3. jinja語法,template使用
  4. 做出一個TODO List網頁
  5. 串接database,做出一個虛擬貨幣交易網頁
  6. 作業 : No

第十週 Information

1. Review前9週的課程及作業內容

2. 講解密碼能夠被破解的方法

3. 各大公司(Facebook,Google,Snapchat)有可能怎麼使用使用者的Cookies

4. 無痕模式

其他你修課時會覺得有意思的資源

  1. CS50 2020 Problem Set (pset) Collection — youtube上有一大堆problem set的講解,自己寫如果真的搞太久,可以參考看看
  2. CS50 Office Hours 2020 Clips — 有很多有趣的問題,像是What are some “hard truths” about programming?,或是How to keep yourself motivated? 這些問題,David或助教都會認真回答這些問題,我個人是當心靈雞湯再看,給各位讀者參考….

修完課的5個心得

  1. 了解編譯是怎麼一回事,工作上的應用點比較多是Paper的github clone下來安裝時更瞭解錯誤訊息背後的原因,尤其是Yolo make不起來的時候QQ,或是opencv compile沒過的時候,對於非Python類的source code安裝會更有信心更有解決問題的能力
  2. 了解資料皆為binary,工作上的應用點 :
  • 最常用到是和後端同事協作API溝通時,客製化交換的binary data header,不會在霧煞煞搞不懂對方在說什麼
  • numpy array,PIL等圖像能夠轉成binary format,甚至yolo 原版 source code吃的圖片也是binary 格式

3. Test Driven Development,這個概念並不是第一次接觸到,不過在作業過程中都有一個check50的command,就是對你的程式跑大量的test case,看有沒有問題,作業中也一定都會給example請你驗證你的程式寫得對不對,從此建立先寫Test Case,在寫Code的開發習慣,對於將Research code轉換為production code時是很重要的心法

4. 重構、重構、重構! : David會在課程中不斷的講解新觀念,並透過新的觀念來重構舊的程式碼,讓整份程式碼更清晰容易理解,這一點是相當值得學習的一點,同樣的是將Research code轉換為production code時很重要的心法

5. Learning how to learn a new programming lnguage : 在這一次2019的課程中,教了Scratch,C, Python, HTML, JavaScript, CSS, SQL,David Melen經常使用類比的方式讓你了解不同語法怎麼對應到同樣的邏輯操作(例如條件、迴圈等),這樣的思考邏輯可以套用到所有程式語言的學習上,從一個更高的層次來理解不同語言的特色,也是筆者覺得很有用的一個心法

總結

以上就是筆者學完CS50的心得分享,邊學時你會逐漸感覺到自己對電腦逐漸開始了解,並且常常看David直接在課堂上Live coding, debugging,會逐漸養成看Error message的習慣,如果你還考慮在Data Science的路上要不要多了解一點電腦科學及軟體工程的知識,正在找一門合適的課,那麼這堂單次最高有800人修課,102名助教助陣,由上課生動幽默的David Melen帶領的CS50絕對可以帶給你滿滿的知識和美好的電腦科學學習體驗!

This is CS50 2018 at Harvard

--

--

YL-Tsai
YL-Tsai

Written by YL-Tsai

Machine Learning Engineer with 4y+ experience | Exploring the data world | Recommendation, Search, Ad System.

No responses yet