CS50 完結篇 - 關於程式的那些事

文章推薦指數: 80 %
投票人數:10人

以前的我,靠著上一個月的JS課入門程式設計,主要是在工作上自學,學習未從細節開始,所以常常寫出一堆莫名自己難解釋的bug。

謝謝,不厭其煩跟我說著 ... 跳到主要內容 分享 取得連結 Facebook Twitter Pinterest 以電子郵件傳送 其他應用程式 5月22,2018 CS50完結篇 花了1hr翻閱以前的課程和作業,從去年7月開始學習的點點滴滴逐漸清晰浮現。

當初學習動機很單純: 1.完全免費 2.有一直想學的演算法和資結 3.是屬於通識課範圍,我想獲得CS基礎知識 4.有huli老師導讀 5.這堂課很有名我知道 想不到學習曲線極陡,一開始就從最底層的binary開始講,透過撕電話簿讓我們思考何謂演算法和程式邏輯。

並介紹Scratch,之後馬上轉化類比成C語言。

接著說了很多程式細節,包括preprocessing->compiling->assembling->linking,以及singlequotes或doublequotes等等,再擴展到loop、function、condition等等。

以前的我,靠著上一個月的JS課入門程式設計,主要是在工作上自學,學習未從細節開始,所以常常寫出一堆莫名自己難解釋的bug。

謝謝,不厭其煩跟我說著很瑣碎卻很重要的事,讓我寫出安全可靠且具設計感的code。

CS50很多時候就像在床邊說故事的感覺,娓娓道來很多最重要的小事:測試程式時要注意cornercases、程式設計要abstraction、factoringofcode與readabilityofcode、floatingnumberimprecision等等。

再者,CS50中我學習到一個很棒的debuggingtechnique:rubberduckdebugging,這技巧很適合只有一個人寫code遇到困難時。

透過verballywalkingthroughyourowncodes,你會發現有遺漏的地方,因為youhearyourself。

另外,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裡面定義*代表dereferenceoperator,也就是gothereoperator,也就是gotosomeaddress。

所以如果s為isaddressofachar,那*s為meansgotos,但int*x或int*x的int*為theaddressofints。

課程透過實作如何複製文字讓我們分辨address和value,以及給予我們temp的觀念。

而在記憶體的結構也有很多著墨,包括程式呼叫過程記憶體裡的變化,說到駭客會透過破壞return去攻擊程式,以及一些bufferoverflow或bug中常見的segmentationfault、memoryleak等等。

說到如果寫C,呼叫malloc()後忘記free()常常是造成memoryleak。

記得有項作業是要我們記得用Valgrind去檢查有無leak,很不錯的工具。

指標重要是因會帶到linkedlist或hashtables等等資結。

其中CS50不僅以圖示表現資結,也透過C的struct表示資結。

兩相比較下,會更佩服程式的抽象化能力,太美麗、純粹了! 課程後半難度回到人間,首先說明HTTP,是這堂課讓我真正了解router到底如何運作,CS50很詳細一直traceroute給我們看封包的傳遞過程,也telnet聯現好幾個網站,讓我們更了解原理。

第七堂課是MachineLearning,透過由淺入深方式,從最簡單的數學圖形,到用Python實作NearestNeighborClassifier等K-means。

讓ML不再難懂。

課程中也說到ML的圖片辨識和之前用C實作forensics最大不同在於我們事先不知道圖片的結果是什麼?不像之前只是去除雜訊,求得原圖。

因為時間關係,DeepLearning未能好好說明,幸好最近公司內訓有TensorFlow課程,補足那時大多只夠聽到ML的遺憾。

CS50這時也將C一一對照成Python,會發現,各種語言本一家。

其實動態語言也有compiler,只不過不由開發者動手。

且像JS的Object和Python的dict都是從C的strtuct發展而來,只不過威力更強大,多了很多內建的API,因而嚴格來說不全等於struct,但是struct的擴展加強版XD 再來介紹了SQL,說到如何normalizingthedatabase以防duplicateddata儲存情形。

以及如何用flask_sqlalchemy實作ORM(Object-RelationalMapping)。

其實在交易網站作業時,CS50有說有餘力能以ORM寫,但我沒有用,光是寫整個網站還要防一堆呆,¡Nomejodas!(不知為何想起西文XDD) CS50透過幾堂課將MVC觀念貫串其中,先講HTTP時先來個前端介面,之後介紹Python,用Flask做後端。

最後透過CSV、Googlespreadsheet介紹到SQL。

雖然課程中有介紹SQLinjectionattack,但覺得最印象深刻是huli老師直播攻擊過程,好有臨場感,讓開發者認知重視資安重要性。

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

課程大概說完了,其實CS50學習花了近10個月的時間。

因為要工作,而且同學一個個要結婚,不是要去當伴娘,就是要喝喜酒。

或是一堆有的沒有節日,不是家庭旅遊,就是臨時有行程。

加上是英文授課,加上需理解時間。

且寫作業前也是需先複習一次。

作業規格還是一堆英文,就拖到昨天才完全寫完。

當然CS50最後有finalproject部分,這就不在學習範圍內了。

想不到哈佛的通識課這麼有深度,但我一直很感謝遇見了CS50,讓我對CS領域有了commonsense,成為一個基本的工程師。

很喜歡課程中很多的細節,往往是這些細節成就真正的不凡。

也很感謝作業中的WalkThrough,真的很替學生著想,一步步就像嬰兒學步,教導如何拆解問題,培養解決問題的能力。

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

最近是學習程式(相等於從事程式工作)滿2年的日子,開始思考職涯或人生規劃的事,最近在看一本程式界的心靈雞湯,不敢先說是因為想等有收穫或心得時再看要不分享也不遲。

這本書比CS50範圍更廣,是全方位的。

當然,因為現在上TensorFlow,見招拆招,也是有趣的學習方式。

過去有陣子找不到工作,有些缺錢(都拿去買書或上課,最後沒錢只好自學XD),是因自身觀念被語言侷限,拒絕一些工作offer,最後實在沒錢,在皆是全端需求工作機會下,到現在公司上班了, 很謝謝CS50讓我體認語言是工具,解決問題原是根本。

分享 取得連結 Facebook Twitter Pinterest 以電子郵件傳送 其他應用程式 留言 熱門文章 11月30,2016 unicode編碼[\u4e00-\u9fa5]指中文範圍 分享 取得連結 Facebook Twitter Pinterest 以電子郵件傳送 其他應用程式 張貼留言 4月18,2019 Java-Java8中新出現的map()和flatMap()差別結論 分享 取得連結 Facebook Twitter Pinterest 以電子郵件傳送 其他應用程式 張貼留言 LucreciaLin 瀏覽簡介 封存 2021 1 三月 1 2019 66 十月 1 八月 3 七月 6 六月 7 五月 12 四月 17 三月 20 2018 38 十二月 1 十一月 4 八月 10 七月 12 六月 2 五月 4 CS50完結篇 CS50Pset8 Promise文章分享:WriteBetterJavaScriptwithPromises React.js學習(入門) 四月 1 三月 1 二月 3 2017 42 十二月 3 十月 2 七月 2 六月 1 五月 4 四月 4 三月 4 二月 12 一月 10 2016 111 十二月 31 十一月 60 十月 20 顯示更多 顯示較少 檢舉濫用情形



請為這篇文章評分?