我在學程式設計的路上,都看過哪些神書?

一個偶然的機會,我在學習的過程中發現了一個非常好的網站 :

https://teachyourselfcs。com/

,就叫他計算機自學指南吧,

這是一份從零開始教你看哪些書才能學好計算機的一個網站

,更要命的是,這篇文章已經被同行翻譯成為了中文

入口傳送門(文末即可跳轉):https://github。com/izackwu/TeachYourselfCS-CN/blob/master/TeachYourselfCS-CN。md

如果你是一個自學成才的工程師,或者從程式設計培訓班畢業,那麼你很有必要學習計算機科學。幸運的是,不必為此花上數年光陰和不菲費用去攻讀一個學位:僅僅依靠自己,你就可以獲得世界一流水平的教育。

網際網路上,到處都有許多的學習資源,然而精華與糟粕並存。你所需要的,不是一個諸如“200+免費線上課程”的清單,而是以下問題的答案:

你應當學習

哪些科目

,為什麼?

對於這些科目,

最好的書籍或者影片課程

是什麼?

在這份指引中,我們嘗試對這些問題做出確定的回答。

簡而言之

大致按照列出的順序,藉助我們所建議的教材或者影片課程(但是最好二者兼用),學習如下的九門科目。目標是先花100到200個小時學習完每一個科目,然後在你職業生涯中,不時溫習其中的精髓。

科目

為何要學?

最佳書籍

最佳影片

程式設計

不要做一個“永遠沒徹底搞懂”諸如遞迴等概念的程式設計師。

《計算機程式的構造和解釋》

Brian Harvey’s Berkeley CS 61A

計算機系統結構

如果你對於計算機如何工作沒有具體的概念,那麼你所做出的所有高階抽象都是空中樓閣。

《深入理解計算機系統》

Berkeley CS 61C

演算法與資料結構

如果你不懂得如何使用棧、佇列、樹、圖等常見資料結構,遇到有難度的問題時,你將束手無策。

《演算法設計手冊》

Steven Skiena’s lectures

數學知識

計算機科學基本上是應用數學的一個“跑偏的”分支,因此學習數學將會給你帶來競爭優勢。

《計算機科學中的數學》

Tom Leighton’s MIT 6。042J

作業系統

你所寫的程式碼,基本上都由作業系統來執行,因此你應當瞭解其運作的原理。

《作業系統導論》

Berkeley CS 162

計算機網路

網際網路已然勢不可擋:理解工作原理才能解鎖全部潛力。

《計算機網路:自頂向下方法》

Stanford CS 144

資料庫

對於多數重要程式,資料是其核心,然而很少人理解資料庫系統的工作原理。

《Readings in Database Systems》 (暫無中譯本)

Joe Hellerstein’s Berkeley CS 186

程式語言與編譯器

若你懂得程式語言和編譯器如何工作,你就能寫出更好的程式碼,更輕鬆地學習新的程式語言。

《Crafting Interpreters》

Alex Aiken’s course on Lagunita

分散式系統

如今,

多數

系統都是分散式的。

《資料密集型應用系統設計》

MIT 6。824

還是太多?

如果花幾年時間自學 9 門科目讓人望而卻步,我們建議你只專注於兩本書:

《深入理解計算機系統》

《資料密集型應用系統設計》

。根據我們的經驗,投入到這兩本書的時間可以獲得極高的回報率,特別適合從事網路應用開發的自學工程師。這兩本書也可以作為上面表格中其他科目的綱領。

為什麼要學習計算機科學?

軟體工程師分為兩種:一種充分理解了計算機科學,從而有能力應對充滿挑戰的創造性工作;另一種僅僅憑著對一些高階工具的熟悉而勉強應付。

這兩種人都自稱軟體工程師,都能在職業生涯早期掙到差不多的工資。然而,隨著時間流逝,第一種工程師不斷成長,所做的事情將會越來越有意義且更為高薪,不論是有價值的商業工作、突破性的開源專案、技術上的領導力或者高質量的個人貢獻。

全球簡訊系統每日收發約200億條資訊,而僅僅靠57名工程師,現在的 WhatsApp 每日收發420億條。

— Benedict Evans (@BenedictEvans) 2016年2月2日

第一種工程師總是尋求深入學習計算機科學的方法,或是透過傳統的方法學習,或是在職業生涯中永無止息地學習;第二種工程師 通常浮於表面,只學習某些特定的工具和技術,而不研究其底層的基本原理,僅僅在技術潮流的風向改變時學習新的技能。

如今,湧入計算機行業的人數激增,然而計算機專業的畢業生數量基本上未曾改變。第二種工程師的供過於求正在開始減少他們的工作機會,使他們無法涉足行業內更加有意義的工作。對你而言,不論正在努力成為第一種工程師,還是隻想讓自己的職業生涯更加安全,學習計算機科學是唯一可靠的途徑。

23333 然而他們… pic。twitter。com/XVNYlXAHar

— Jenna Bilotta (@jenna) 2017年3月4日

分科目指引

程式設計

大多數計算機專業本科教學以程式設計“導論”作為開始。這類課程的最佳版本不僅能滿足初學者的需要,還適用於那些在初學程式設計階段遺漏了某些有益的概念和程式設計模式的人。

對於這部分內容,我們的標準推薦是這部經典著作:《計算機程式的構造和解釋》。在網路上,這本書既可供免費閱讀(英文版),也作為MIT的免費影片課程。不過儘管這些影片課程很不錯,我們對於影片課程的推薦實際上是Brian Harvey 開設的 SICP 課程(即 Berkeley 的 61A 課程)。比起MIT的課程,它更加完善,更適用於初學者。

我們建議至少學完SICP的前三章,並完成配套的習題。如果需要額外的練習,可以去解決一些小的程式設計問題,比如exercism。

中文翻譯新增:

關於SICP國內影片觀看地址

MIT的免費影片課程(中英字幕)

Brian Harvey 開設的 SICP 課程(英文字幕)

Scheme 學習的相關資源參見:https://github。com/DeathKing/Learning-SICP

更詳細的補充說明:#3

自從 2016 年首次釋出這份指南以來,最常被問到的一個問題是,我們是否推薦由 John DeNero 講授的更新的 CS 61A 課程,以及配套的書籍

《Composing Programs》

,這本書“繼承自 SICP” 但使用 Python 講解。我們認為 DeNero 的課程也很不錯,有的學生可能更喜歡,但我們還是建議把 SICP, Scheme 和 Brian Harvey 的影片課程作為首選。

為什麼這麼說呢?因為 SICP 是獨一無二的,它可以——至少很有可能——改變你對計算機和程式設計的基本認識。不是每個人都有這樣的體驗。有的人討厭這本書,有的人看了前幾頁就放棄了。但潛在的回報讓它值得一讀。

如果你覺得SICP過於難,試試

《Composing Programs》

。如果還是不合適,那我們推薦

《程式設計方法》(中文版,英文版)

;如果你覺得SICP過於簡單,那我們推薦

《Concepts, Techniques, and Models of Computer Programming》

。如果讀這些書讓你覺得沒有收穫,也許你應該先學習其他科目,一兩年後再重新審視程式設計的理念。

新版原文刪除了對

《Concepts, Techniques, and Models of Computer Programming》

一書的推薦,但這本書對各種程式設計模型有深入的見解,值得一讀。所以譯文中依然保留。— 譯者注

最後,有一點要說明的是:本指南

不適用

於完全不懂程式設計的新手。我們假定你是一個沒有計算機專業背景的程式設計師,希望填補一些知識空白。事實上,我們把“程式設計”章節包括進來只是提醒你還有更多知識需要學習。對於那些從來沒有學過程式設計,但又想學的人來說,這份指南更合適。

我在學程式設計的路上,都看過哪些神書?

計算機系統結構

計算機系統結構——有時候又被稱為“計算機系統”或者“計算機組成”——是瞭解軟體底層的的重要視角。根據我們的經驗,這是自學的軟體工程師最容易忽視的領域。

我們最喜歡的入門書是

《深入理解計算機系統》

。典型的計算機體系結構導論課程會涵蓋本書的 1 - 6 章。

我們喜愛《深入理解計算機系統》,因為它的實用性,並且站在程式設計師的視角。雖然計算機體系結構的內容比本書所涉及的內容多得多,但對於那些想了解計算機系統以求編寫更快、更高效、更可靠的軟體的人來說,這本書是很好的起點。

對於那些既想了解這個主題又想兼顧硬體和軟體的知識的人來說,我們推薦

《計算機系統要素》

,又名“從與非門到俄羅斯方塊”(“Nand2Tetris”),這本書規模宏大,讓讀者對計算機內的所有部分如何協同工作有完全的認識。這本書的每一章節對應如何構建計算機整體系統中的一小部分,從用HDL(硬體描述語言)寫基本的邏輯閘電路出發,途經CPU和彙編,最終抵達諸如俄羅斯方塊這般規模的應用程式。

我們推薦把此書的前六章讀完,並完成對應的專案練習。這麼做,你將更加深入地理解,計算機體系結構和執行其上的軟體之間的關係。

這本書的前半部分(包括所有對應的專案)均可從Nand2Tetris的網站上免費獲得。同時,在Coursera上,這是一門影片課程。

為了追求簡潔和緊湊,這本書犧牲了內容上的深度。尤其值得注意的是,流水線和儲存層次結構是現代計算機體系結構中極其重要的兩個概念,然而這本書對此幾乎毫無涉及。

當你掌握了Nand2Tetris的內容後,我們推薦要麼回到《深入理解計算機系統》,或者考慮Patterson和Hennessy二人所著的

《計算機組成與設計》

,一本優秀的經典著作。這本書中的不同章節重要程度不一,因此我們建議根據Berkeley的CS61C課程 “計算機體系結構中的偉大思想”來著重閱讀一些章節。這門課的筆記和實驗在網路上可以免費獲得,並且在網際網路檔案中有這門課程的過往資料。

我在學程式設計的路上,都看過哪些神書?

硬體是平臺。

— Mike Acton, Engine Director at Insomniac Games (觀看他在CppCon上的演說)

演算法與資料結構

正如幾十年來的共識,我們認為,計算機科學教育所賦予人們的最大能量在於對常見演算法和資料結構的熟悉。此外,這也可以訓練一個人對於各種問題的解決能力,有助於其他領域的學習。

關於演算法與資料結構,有成百上千的書可供使用,但是我們的最愛是Steven Skiena編寫的

《演算法設計手冊》

。顯而易見,他對此充滿熱愛,迫不及待地想要幫助其他人理解。在我們看來,這本書給人一種煥然一新的體驗,完全不同於那些更加經常被推薦的書(比如Cormen,Leiserson,Rivest 和 Stein,或者 Sedgewick的書,後兩者充斥著過多的證明,不適合以

解決問題

為導向的學習)。

如果你更喜歡影片課程,Skiena慷慨地提供了他的課程。此外,Tim Roughgarden的課程也很不錯, 在Stanford的MOOC平臺Lagunita,或者Coursera上均可獲得。Skiena和Roughgarden的這兩門課程沒有優劣之分,選擇何者取決於個人品味。

至於練習,我們推薦學生在Leetcode上解決問題。Leetcode上的問題往往有趣且帶有良好的解法和討論。此外,在競爭日益激烈的軟體行業,這些問題可以幫助你評估自己應對技術面試中常見問題的能力。我們建議解決大約100道隨機挑選的Leetcode問題,作為學習的一部分。

最後,我們強烈推薦

《怎樣解題》

。這本書極為優秀且獨特,指導人們解決廣義上的問題,因而一如其適用於數學,它適用於計算機科學。

我在學程式設計的路上,都看過哪些神書?

我可以廣泛推薦的方法只有一個:寫之前先思考。

— Richard Hamming

數學知識

從某個角度說,計算機科學是應用數學的一個“發育過度”的分支。儘管許多軟體工程師試圖——並且在不同程度上成功做到——忽視這一點,我們鼓勵你用學習來擁抱數學。如若成功,比起那些沒有掌握數學的人,你將獲得巨大的競爭優勢。

對於計算機科學,數學中最相關的領域是“離散數學”,其中的“離散”與“連續”相對立,大致上指的是應用數學中那些有趣的主題,而不是微積分之類的。由於定義比較含糊,試圖掌握離散數學的全部內容是沒有意義的。較為現實的學習目標是,瞭解邏輯、排列組合、機率論、集合論、圖論以及密碼學相關的一些數論知識。考慮到線性代數在計算機圖形學和機器學習中的重要性,該領域同樣值得學習。

學習離散數學,我們建議從László Lovász的課程筆記開始。Lovász教授成功地讓這些內容淺顯易懂且符合直覺,因此,比起正式的教材,這更適合初學者。

對於更加高階的學習,我們推薦

《計算機科學中的數學》

,MIT同名課程的課程筆記,篇幅與書籍相當(事實上,現已出版)。這門課程的影片同樣可免費獲得,是我們所推薦的學習影片。

對於線性代數,我們建議從Essence of linear algebra系列影片開始,然後再去學習Gilbert Strang的《線性代數導論》和影片課程。

我在學程式設計的路上,都看過哪些神書?

如果人們不相信數學是簡單的,那麼只能是因為他們沒有意識到生活有多麼複雜。

— John von Neumann

作業系統

《作業系統概念》

(“恐龍書”)和

《現代作業系統》

是作業系統領域的經典書籍。二者都因為寫作風格和對學生不友好而招致了一些批評。

《作業系統導論》(Operating Systems: Three Easy Pieces)

是一個不錯的替代品,並且可在網上免費獲得(英文版)。我們格外喜歡這本書的結構,並且認為這本書的習題很值得一做。

在讀完《作業系統導論》後,我們鼓勵你探索特定作業系統的設計。可以藉助“{OS name} Internals”風格的書籍,比如

Lion‘s commentary on Unix

The Design and Implementation of the FreeBSD Operating System

,以及

Mac OS X Internals

。對於 Linux ,我們推薦 Robert Love 的

《Linux核心設計與實現》

為了鞏固對作業系統的理解,閱讀小型系統核心的程式碼並且為其增加特性是一個很不錯的方法。比如,xv6,由MIT的一門課程所維護的從Unix V6到ANSI C和x86的移植,就是一個很棒的選擇。《作業系統導論》有一個附錄,記載了一些可能的xv6實驗專案,其中充滿了關於潛在專案的很棒想法。

我在學程式設計的路上,都看過哪些神書?

計算機網路

鑑於有那麼多關於網路服務端和客戶端的軟體工程,計算機網路是計算機科學中價值最為“立竿見影”的領域之一。我們的學生,系統性地學習了計算機網路,最終能夠理解那些曾困擾他們多年的術語、概念和協議。

在這一主題上,我們最愛的書籍是

《計算機網路:自頂向下方法》

。書中的小專案和習題相當值得練習,尤其是其中的“Wireshark labs”(這部分在網上可以獲得)。

如果更喜歡影片課程,我們推薦Stanford的

Introduction to Computer Networking

,可在他們的MOOC平臺Lagunita上免費觀看。

對於計算機網路的學習,做專案比完成小的習題更有益。一些可能的專案有:HTTP伺服器,基於UDP的聊天APP,迷你TCP棧,代理,負載均衡器,或者分散式雜湊表。

我在學程式設計的路上,都看過哪些神書?

你無法盯著水晶球預見未來,未來的網際網路何去何從取決於社會。

— Bob Kahn

資料庫

比起其他主題,自學資料庫系統需要更多的付出。這是一個相對年輕的研究領域,並且出於很強的商業動機,研究者把想法藏在緊閉的門後。此外,許多原本有潛力寫出優秀教材的作者反而選擇了加入或創立公司。

鑑於如上情況,我們鼓勵自學者大體上拋棄教材,而是從2015年春季學期的CS 186課程(Joe Hellerstein在Berkeley的資料庫課程)開始,然後前往閱讀論文。

對於初學者,有一篇格外值得提及的論文:“Architecture of a Database System”。這篇論文提供了獨特的對關係型資料庫管理系統(RDBMS)如何工作的高層次觀點,是後續學習的實用梗概。

《Readings in Database Systems》

,或者以資料庫“紅書”更為人知,是由Peter Bailis,Joe Hellerstein和Michael Stonebraker編纂的論文合集。對於那些想要在CS 186課程的水平更進一步的學習者,“紅書”應當是下一步。

如果你堅持一定要一本導論教材,那我們推薦Ramakrishnan和Gehrke所著的

《資料庫管理系統:原理與設計》

。如需更深一步,Jim Gray的經典著作

《Transaction Processing: Concepts and Techniques》

值得一讀,不過我們不建議把這本書當作首要資源。

如果沒有編寫足夠數量的程式碼,很難鞏固資料庫理論。CS 186課程的學生給Spark新增特性,倒是不錯的專案,不過我們僅僅建議從零實現一個簡單的關係型資料庫管理系統。自然,它將不會有太多的特性,但是即便只實現典型的關係型資料庫管理系統每個方面最基礎的功能,也是相當有啟發的。

最後,資料模型往往是資料庫中一個被忽視的、教學不充分的方面。關於這個主題,我們推薦的書籍是

Data and Reality: A Timeless Perspective on Perceiving and Managing Information in Our Imprecise World

我在學程式設計的路上,都看過哪些神書?

程式語言與編譯器

多數程式設計師學習程式語言的知識,而多數計算機科學家學習程式語言

相關

的知識。這使得計算機科學家比起程式設計師擁有顯著的優勢,即便在程式設計領域!因為他們的知識可以推而廣之:相較只學習過特定程式語言的人,他們可以更深入更快速地理解新的程式語言。

我們推薦的入門書是 Bob Nystrom 所著的優秀的

Crafting Interpreters

,可在網上免費獲取。這本書條理清晰,富有趣味性,非常適合那些想要更好地理解語言和語言工具的人。我們建議你花時間讀完整本書,並嘗試任何一個感興趣的“挑戰”。

另一本更為傳統的推薦書籍是

《編譯原理》

,通常稱為“龍書”。不幸的是,這本書不是為自學者而設計的,而是供教師從中挑選一些主題用於1-2學期的教學。

如果你選擇使用龍書進行自學,你需要從中甄選主題,而且最好是在導師的幫助下。我們建議依據某個影片課程來設定學習的結構,然後按需從龍書中獲取深入的內容。我們推薦的線上課程是Alex Aiken在MOOC平臺 edX 所開設的。

我在學程式設計的路上,都看過哪些神書?

不要做一個只寫樣板程式碼的程式設計師。相反,給使用者和其他程式設計師創造工具。從紡織工業和鋼鐵工業中學習歷史教訓:你想製造機器和工具,還是操作這些機器?

— Ras Bodik 在他的編譯器課程伊始

分散式系統

隨著計算機在數量上的增加,計算機同樣開始

分散

。儘管商業公司過去願意購買越來越大的大型機,現在的典型情況是,甚至很小的應用程式都同時在多臺機器上執行。思考這樣做的利弊權衡,即是分散式系統的研究所在,也是越來越重要的一項技能。

我們推薦的自學參考書是 Martin Kleppmann 的

《資料密集型應用系統設計》

。與傳統的教科書相比,它是一本為實踐者設計的具有很高的可讀性的書,並且保持了深度和嚴謹性。

對於那些偏愛傳統教材,或者希望可以從網上免費獲取的人,我們推薦的教材是Maarten van Steen和Andrew Tanenbaum所著的

《分散式系統原理與範型》(中文第二版,英文第三版)

對於喜歡影片課程的人,MIT的6。824 是一門很好的線上影片課程,由 Robert Morris 教授的研究生課程,在這裡可以看到課程安排。

不管選擇怎樣的教材或者其他輔助資料,學習分散式系統必然要求閱讀論文。這裡有一個不錯的論文清單,而且我們強烈建議你出席你當地的Papers We Love(僅限美國)。

我在學程式設計的路上,都看過哪些神書?

常見問題解答

這份指引的目標受眾是?

我們面向自學的軟體工程師、培訓班學生、“早熟的”高中生或者想要透過自學補充正式教育的大學生。關於何時開啟這段自學旅程,完全取決於個人,不過多數人在有一定的職業經歷後深入學習計算機科學理論會獲益匪淺。比如,我們注意到,如果學生在工作中曾經使用過資料庫,他們會

喜愛

學習資料庫系統課程;如果學生從事過一兩個Web專案,他們會

喜愛

學習計算機網路。

人工智慧/計算機圖形學/XX主題怎麼樣?

我們試圖把計算機科學主題清單限制到那些我們認為

每一個軟體工程師

都應該瞭解的內容,不限於專業或行業。擁有了這些基礎,你將能更加輕鬆地挑選教材或論文,然而無需指引地學習核心概念。在這裡,我們給出一些其他常見主題的自學起點:

人工智慧:透過觀看影片並完成Pacman專案來學習Berkeley的AI課程。至於教材,使用Russell和Norvig編寫的

《人工智慧:一種現代方法》

機器學習:學習吳恩達在Coursera上的課程。耐心學習,先確保理解了基礎概念再奔向類如深度學習的誘人新主題。

計算機圖形學:學習Berkeley CS 184課程的材料,使用《計算機圖形學:原理及實踐》作為教材。

一定要嚴格遵守推薦的學習次序嗎?

事實上,所有主題之間都有一定程度的重疊,彼此迴圈引用。以離散數學和演算法的關係為例:先學習數學可以幫助你更深入地分析和理解演算法,然而先學習演算法可以為學習離散數學提供更大的動力和應用背景。理想情況下,你將在你的職業生涯多次重溫二者。

因此,我們所推薦的次序主要是為了幫助你

起步

……如果你出於某種強烈的原因而傾向以不同的順序學習,那也沒有關係,勇敢開始吧!不過在我們看來,最重要的“先決條件”是:先學計算機體系結構再學作業系統或資料庫,先學計算機網路和作業系統再學分散式系統。

和Open Source Society、freeCodeCamp curricula等比起來,這份指引?

OSS指引涵蓋太多主題,在許多主題中推薦劣質資源,沒有就特定課程哪些方面有價值提供原因或指引。我們努力對這份指引中的課程加以限制,僅僅包括那些你作為軟體工程師

確實需要了解的

,不論你的專業方向,並且對每門課程為何必要做出瞭解釋以幫助你理解。

FreeCodeCamp主要關注程式設計,而不是計算機科學。至於你為什麼要學習計算機科學,參見上文。如果你是個新手,我們建議先學 freeCodeCamp 的課程,一兩年後再回歸本指南。

XX程式語言怎麼樣?

學習一門特定的程式語言和學習計算機科學的一個領域完全不在一個維度——相比之下,學習語言

容易

缺乏價值

。如果你已經瞭解了一些語言,我們強烈建議遵照我們的指引,然後在學習的空當中習得語言,或者暫且不管以後再說。如果你已經把程式設計學得不錯了(比如學完了

《計算機程式的構造和解釋》

),尤其是如果你學習過編譯器,那麼面對一門新的語言,你只需要花一個週末稍多的時間即可基本掌握,之後你可以在工作中學習相關的類庫/工具/生態。

XX流行技術怎麼樣?

沒有任何一種技術的重要程度可以達到學習其使用足以成為計算機科學教學的核心部分。不過,你對學習那門技術充滿熱情,這很不錯。訣竅是先從特定的技術回退到基本的領域或概念,判斷這門流行技術在技術的宏觀大局中位於何處,然後才深入學習這門技術。

為什麼你們還在推薦SICP?

先嚐試讀一下,有些人覺得 SICP 讓人神魂顛倒,這在其他書很少見。如果你不喜歡,你可以嘗試其他的東西,也許以後再回到 SICP。

為什麼你們還在推薦龍書?

龍書依舊是內容最為完整的編譯器單本書籍。由於過分強調一些如今不夠時新的主題的細節,比如解析,這本書招致了惡評。然而事實上,這本書從未打算供人一頁一頁的學習,而僅僅是為了給教師準備一門課程提供足夠的材料。類似地,自學者可以從書中量身按需挑選主題,或者最好依照公開課授課教師在課程大綱中的建議。

如何便宜獲取教材?

我們所建議的許多教材在網上都可以免費獲得,這多虧了作者們的慷慨。對於那些不免費的書籍,我們建議購買舊版本的二手書籍。廣而言之,如果一本教材有多個版本,舊版本大機率是完全足夠使用的。即便新版本的價格是舊版本的10倍,新版本也絕不可能比舊版本好10倍!

中文翻譯新增:

事實上,比起美國,在國內購買技術書籍可以說是相當“廉價”了。如果仍舊尋求更加便宜的購買渠道,可以參考這篇V2EX上的討論帖子,其中提到了一些不錯的購買渠道。

這份指引是誰寫的?

這份指引由Bradfield School of Computer Science(舊金山)的兩位教員:Ozan Onay和Myles Byrne編寫,並由 Oz 於 2020 年更新。這份指引基於我們對數千名自學成才的工程師和培訓班學生教授計算機科學基礎的經驗。感謝我們所有學生對自學資源的持續反饋。

只要有足夠的時間和動力,我們非常有信心,你可以自學完以上所有課程。如果你喜歡一個集中式、結構化、由教師指導的課程,你可能對我們的計算機科學強化班感興趣。我們不建議你去攻讀碩士學位。