其他CS50的課程介紹
This is CS50”: A Pleasant Way to Kick Off Your Data Science Education
CS50:一堂超過 800 個哈佛學生選修的「硬課」,魅力何在?
目標讀者
若你也是非資工背景,一頭栽進了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
- 什麼是演算法
- 電腦怎麼表達資訊? — 數字、文字、圖片、影片、音訊
- 二進位、ASCII、Unicode、RGB、二分搜尋法、時間複雜度、psudo code
- 介紹基本程式語言:條件判斷、變數、迴圈、陣列、函式
- 作業:用 scratch 寫一個程式
第一週 C
- 以Scratch的block對應C語言的各種語句
- 介紹 C 語言,以及講解 compile 的觀念(使用clang)
- 解釋Error code發生的原因,解釋幻影錯誤(phantom errors)
- 現場debug
- 介紹各種資料型態,像是 double, float, int, bool, char, long long…
- 介紹浮點數誤差與 overflow
- 教你 command line 基本操作,像是 mv, ls, cd, make
- 以馬力歐遊戲的block來介紹迴圈的用途
- 作業:寫一個簡單的 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
- 介紹HTTP,TCP/IP
- IP adress,IPv4,IPv6,Ports,DNS(Domain name system)
- 講解開發者工具使用
- GET,POST
- 寫一個hello world網頁,使用html, javascript, css
- 作業:No
第九週 (Web Track) Web Programming
- 介紹Flask,dynamic web programming
- Cookies,Session
- jinja語法,template使用
- 做出一個TODO List網頁
- 串接database,做出一個虛擬貨幣交易網頁
- 作業 : No
第十週 Information
1. Review前9週的課程及作業內容
2. 講解密碼能夠被破解的方法
3. 各大公司(Facebook,Google,Snapchat)有可能怎麼使用使用者的Cookies
4. 無痕模式
其他你修課時會覺得有意思的資源
- CS50 2020 Problem Set (pset) Collection — youtube上有一大堆problem set的講解,自己寫如果真的搞太久,可以參考看看
- CS50 Office Hours 2020 Clips — 有很多有趣的問題,像是What are some “hard truths” about programming?,或是How to keep yourself motivated? 這些問題,David或助教都會認真回答這些問題,我個人是當心靈雞湯再看,給各位讀者參考….
修完課的5個心得
- 了解編譯是怎麼一回事,工作上的應用點比較多是Paper的github clone下來安裝時更瞭解錯誤訊息背後的原因,尤其是Yolo make不起來的時候QQ,或是opencv compile沒過的時候,對於非Python類的source code安裝會更有信心更有解決問題的能力
- 了解資料皆為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絕對可以帶給你滿滿的知識和美好的電腦科學學習體驗!