CS50 完結篇

花了1hr翻閱以前的課程和作業,從去年7月開始學習的點點滴滴逐漸清晰浮現。

當初學習動機很單純:
1. 完全免費
2. 有一直想學的演算法和資結
3. 是屬於通識課範圍,我想獲得CS基礎知識
4.有huli老師導讀
5. 這堂課很有名我知道

想不到學習曲線極陡,一開始就從最底層的binary開始講,透過撕電話簿讓我們思考何謂演算法和程式邏輯。並介紹Scratch,之後馬上轉化類比成C語言。接著說了很多程式細節,包括preprocessing -> compiling -> assembling -> linking,以及single quotes或double quotes等等,再擴展到loop、function、condition等等。以前的我,靠著上一個月的JS課入門程式設計,主要是在工作上自學,學習未從細節開始,所以常常寫出一堆莫名自己難解釋的bug。謝謝,不厭其煩跟我說著很瑣碎卻很重要的事,讓我寫出安全可靠且具設計感的code。

CS50很多時候就像在床邊說故事的感覺,娓娓道來很多最重要的小事:測試程式時要注意corner cases、程式設計要abstraction、factoring of code與readability of code、floating number imprecision等等。

再者,CS50中我學習到一個很棒的debugging technique:rubber duck debugging,這技巧很適合只有一個人寫code遇到困難時。透過verbally walking through your own codes,你會發現有遺漏的地方,因為you hear yourself。

另外,CS50課程內容設計豐富:我永遠難忘為了寫cryptography的作業花一星期,連睡覺時都以為在解題,雖然每天起床超累想到要去公司繼續寫code就有些overwhelmedXD但我卻收穫很多。

我喜歡CS50透過肢體教會大家演算法和資結。肢體不比肉眼敏捷,剛好能模擬電腦行為。也很感謝huli老師提供的網站,讓我在寫作業時,能不斷透過演算法實作過程去實作成C程式。

當然也遇到很多人害怕的指標,這裡我有找到一個對我很受用的連結:https://kopu.chat/2017/05/15/c%E8%AA%9E%E8%A8%80-%E8%B6%85%E5%A5%BD%E6%87%82%E7%9A%84%E6%8C%87%E6%A8%99%EF%BC%8C%E5%88%9D%E5%AD%B8%E8%80%85%E8%AB%8B%E9%80%B2%EF%BD%9E/

CS50裡面定義*代表dereference operator,也就是go there operator,也就是go to some address。所以如果 s為is address of a char,那*s為means go to s,但int *x 或int* x 的int* 為the address of ints 。課程透過實作如何複製文字讓我們分辨address和value,以及給予我們temp的觀念。

而在記憶體的結構也有很多著墨,包括程式呼叫過程記憶體裡的變化,說到駭客會透過破壞return去攻擊程式,以及一些buffer overflow或bug中常見的segmentation fault、memory leak等等。說到如果寫C,呼叫malloc()後忘記free()常常是造成memory leak。記得有項作業是要我們記得用Valgrind去檢查有無leak,很不錯的工具。

指標重要是因會帶到linked list或hash tables等等資結。其中CS50不僅以圖示表現資結,也透過C的struct表示資結。兩相比較下,會更佩服程式的抽象化能力,太美麗、純粹了!

課程後半難度回到人間,首先說明HTTP,是這堂課讓我真正了解router到底如何運作,CS50很詳細一直traceroute給我們看封包的傳遞過程,也telnet聯現好幾個網站,讓我們更了解原理。

第七堂課是Machine Learning,透過由淺入深方式,從最簡單的數學圖形,到用Python實作Nearest Neighbor Classifier等K-means。讓ML不再難懂。課程中也說到ML的圖片辨識和之前用C實作forensics最大不同在於我們事先不知道圖片的結果是什麼?不像之前只是去除雜訊,求得原圖。因為時間關係,Deep Learning未能好好說明,幸好最近公司內訓有TensorFlow課程,補足那時大多只夠聽到ML的遺憾。

CS50這時也將C一一對照成Python,會發現,各種語言本一家。其實動態語言也有compiler,只不過不由開發者動手。且像JS的Object和Python的dict都是從C的strtuct發展而來,只不過威力更強大,多了很多內建的API,因而嚴格來說不全等於struct,但是struct的擴展加強版XD

再來介紹了SQL,說到如何normalizing the database以防duplicated data儲存情形。以及如何用flask_sqlalchemy實作ORM(Object-Relational Mapping)。其實在交易網站作業時,CS50有說有餘力能以ORM寫,但我沒有用,光是寫整個網站還要防一堆呆,¡No me jodas!(不知為何想起西文XDD)

CS50透過幾堂課將MVC觀念貫串其中,先講HTTP時先來個前端介面,之後介紹Python,用Flask做後端。最後透過CSV、Google spreadsheet介紹到SQL。雖然課程中有介紹SQL injection attack,但覺得最印象深刻是huli老師直播攻擊過程,好有臨場感,讓開發者認知重視資安重要性。

最後是我最熟的JS,CS50將C的pointer對照成JS裡的reference的觀念,也介紹Ajax、Google Maps或localStorage等等我已知的事(抱歉我前端起家的)。


課程大概說完了,其實CS50學習花了近10個月的時間。因為要工作,而且同學一個個要結婚,不是要去當伴娘,就是要喝喜酒。或是一堆有的沒有節日,不是家庭旅遊,就是臨時有行程。加上是英文授課,加上需理解時間。且寫作業前也是需先複習一次。作業規格還是一堆英文,就拖到昨天才完全寫完。當然CS50最後有final project部分,這就不在學習範圍內了。

想不到哈佛的通識課這麼有深度,但我一直很感謝遇見了CS50,讓我對CS領域有了common sense,成為一個基本的工程師。很喜歡課程中很多的細節,往往是這些細節成就真正的不凡。也很感謝作業中的WalkThrough,真的很替學生著想,一步步就像嬰兒學步,教導如何拆解問題,培養解決問題的能力。

印象很深一句話,David Malan曾說:遇到未知的問題別怕,你要想你很幸福,身邊還有類似console或terminal的方式去驗證或找出問題所在,全部你需要做的,只是去try it。

最近是學習程式(相等於從事程式工作)滿2年的日子,開始思考職涯或人生規劃的事,最近在看一本程式界的心靈雞湯,不敢先說是因為想等有收穫或心得時再看要不分享也不遲。這本書比CS50範圍更廣,是全方位的。當然,因為現在上TensorFlow,見招拆招,也是有趣的學習方式。過去有陣子找不到工作,有些缺錢(都拿去買書或上課,最後沒錢只好自學XD),是因自身觀念被語言侷限,拒絕一些工作offer,最後實在沒錢,在皆是全端需求工作機會下,到現在公司上班了,


很謝謝CS50讓我體認語言是工具,解決問題原是根本。




留言

熱門文章