#11 Computer Science 自習指南

Denny
The Bayesian Trap
Published in
8 min readNov 17, 2017
jserv@ptt

這是指南,不是學習清單

比起從頭開始的教學,更像是一個 check list,來看看自己哪裡還沒有補足;這是我一直以來的學習方式,有些人喜歡、有些人不喜歡。

純粹是出自於對這一個領域很有興趣,不管跟工作有沒有關、跟薪水有沒有關,仍然會選擇繼續走下去。

這篇不會放滿一些線上免費程式課程的連結,原文裡面有、某些領域我也會放上去,但我始終認為最適合自己的課程是需要自己研究和安排出來的,學校教授要做到的就是激發我們的興趣,還有展現自己有多強,讓學生知道自己有多廢,這樣就已經很棒了。

medium 上或是各大媒體上,其實都蠻常有各種 CS101 或是 data science 101 的教學文章,裡面喜歡塞滿滿各種課程連結;這些東西是容易吸引人的,但真的要扎實的學習還是靠自己比較實在。(我的觀察啦!)

講個比喻小故事:很多大學生會去接家教來賺外快,對一般人來說,最好賺的不是教程度好的學生,最好是教那種成績奇爛無比的;因為當一個人一無所知的時候,灌輸給他什麼東西他都覺得有學到,備課輕鬆;再來就是考爛也屬正常發揮。因為這些學生根本問題不在於缺乏知識,甚至也不是因為他們笨,只是單純沒有找到學習的動機,還有靠自己就能學習的方法。

當然,學店畢業如我是沒資格對教育做評價,這只是個比喻的小故事而已,要有什麼體會就看個人了。

為什麼要學習 Computer Science?

以下簡稱 CS

世界上有兩種不同的軟體工程師:

  • Type 1: 對於 CS 有堅實基礎,遇到問題知道該如何專業又有創意的去解決它的
  • Type 2: 對於 CS 所知甚少,只對少數 high-level 工具熟悉的。

兩者的薪資在一開始可能差距不大,但長期下來前者可能會讓後者望塵莫及,並不是因為後者做錯了什麼,只是因為前者更有機會去碰觸和解決真正困難的問題。

業界很缺軟體工程師,不過是缺 Type 1 的,Type 2 的一直都是處於 over supply 的狀態。

Type 2 工程師中仍然可能有高手出現。以前曾經看過一篇叫「金庸大學」的文章,金庸大學畢業考要考輕功、內功、掌法和一項選修兵器,要平均下來每科滿六十分才能畢業;令狐冲同學就是一個內功、輕功、掌法都考零分,但選修兵器選了劍法考了 1000 分,最後仍然以第一名成績畢業的王八蛋;我不知道一個人在現實世界成為主角的機率有多高,但我會認為 Type 1 工程師,也就是扎好 CS 的基礎知識是比較可靠一點的選擇。

主題簡介

每個主題的 Why study 都寫的很簡單精要,所以就直接截圖放了過來,下面就是綜合原文的意見加上自己的一些小心得。

https://teachyourselfcs.com/

Programming

還是首推 SICP,直接硬嗑掉整本可能會太過吃力,所以可以搭配 MIT OCW : 6.001 來使用,看了有興趣的人可以自己試試看,之後也會寫一些關於如何規劃讀這本書的文章,畢竟在這裡寫的話,這篇字數就要爆棚了。

學習如何「Program」是一個相當基礎卻常常被忽略掉的技能,大家往往直接被硬推著去學「Design Patterns」,事實上「Design Patterns」就是高手從經驗中提煉出來的抽象化技巧;如果你自己有好的抽象化能力,那可能能想出更適合你當前應用情況的解決方案。

這放在第一個,是所有東西的基本功。

Algorithms and Data Structures

If you want to become a good programmer, you can spend 10 years programming, or spend 2 years programming and learning algorithms.
Erik Demaine @ MIT

簡單來說,如何把資料設計的更好「計算」(包含你想得到的各種操作)、如何設計出更好的「計算方式」;這兩者就是資料結構和演算法,最近面試完之後,覺得如果不使用的話,真的是學過就忘,所以認真建議學而時習之,或是想辦法到一個有挑戰一點的環境去。

就是這樣,Coursera 和網路上的資源有點太多了,可以自己去搜尋。

如果是比較喜歡寫程式或是喜歡 Java 的人可以考慮 Princeton 的 Algorithms: Part 1;如果更喜歡數學,或是想用自己的語言來學習的話,我會推薦 Standford 的 Algorithms Specialization

Mathematics for Computer Science

大部分都是離散數學,而且 CS 其實就是應用數學的一支。

這個領域的數學理解之後,看東西會變得快很多,數學真的沒有想像中的可怕,可以看看這篇:

而這裡推薦的好書是跟主題同名的:Mathematics for Computer Science,幾乎能補足你需要的所有數學知識;這門課的預修課程是微積分,不用把微積分想的太難,畢竟太難的你也不會常用到。

不過裡面的內容沒有包含線性代數,也是一個需要自己去補齊的領域,尤其是如果之後想要讀跟 Machine Learning 相關的話,真的要好好喜歡這一堂課。

Operating Systems

抽象化的美好下永遠有觸碰到髒亂的現實,了解這一點對於一個軟體工程師來說是至關緊要的。

對於 System programming 的了解往往是大部分寫 Application 的工程師所缺乏的(就像我,唉⋯⋯);好加在這是一個很好入門並且開始學習的領域,最近把 Code: The Hidden Language of Computer Hardware and Software看完後再開始學習 CMU 的 CS213,教材是用「CS:APP」這本書,能夠對系統有更廣泛地認識。(還是忍不住推薦一下: Nand To Tetris,有興趣的可以 google,就不在這裡放上連結了,有緣人去試一試,真的是很好玩的一門課)

但如果你仍然很幸運的是個學生,或是真的對系統愛到無可自拔的話,真的是唯一推薦 jserv,請自己到臉書上找到課程的社團加入,或是可以看看這個

Computer Networking

了解我們每天都在用的網路到底是怎麼運作的,在我們設計大型系統時會有更全面的考量。(不管是 Proxy 或是 load balancer,都跟這領域有關係)

it crowd

Databases

Data is at the center of everything.
Joe Hellerstein@CS186

(錄影檔好像看到自己的同學)

不只是學會寫 SQL,還要學會如何設計 Relational Model,以及到底 RDBMS 是怎樣運作的。

今年的 COSCUP 上也有在講相關的主題,雖然需要一點背景知識才能懂:

Languages and Compilers

這個領域最關鍵的一點就是,當你學完這個之後,你就不只是個語言的 user ,而是有辦法設計並實作出來給其他人用的。(能不能用是另一回事 XD)

Distributed Systems

一樣的運算在一台電腦上跑,跟在一千台電腦上用分工的方式跑,會是完全不一樣難度的問題。

現實的系統都是不完美的,你必須做出一些 trade-offs,通常這需要前面多項知識的了解才能做出好的決策,讓你更明白如何去設計出「現實的系統」;假如只是想要有個 High Level 的認識,可以來讀讀這本:「Distributed Systems: Fun and Profit」。

日報目前也開始讀這本好玩的書:

通常會對 Compiler 以及 Distributed systems 有興趣的人,應該都有辦法自己找到資源了。

結論

這篇沒有提到任何 AI 跟 Machine Learning 相關,甚至很多 CS 領域內的也沒提到;因為這只是個包含基礎的指南,當你有了基礎的實力,覺得哪個領域有興趣想要投身進去開始做都是相對簡單的。

期許自己能往 Type 1 工程師靠齊,真的是又要共勉之一下。

--

--