簡介
這裏收集了很多學習資源,都是關於一些適合本科生學習的計算機科學“話題(Topics)”。這裏僅僅只提供“話題”列表,而不會提供諸如知識點剖析、練習題等內容。如果你對某一個話題特別感興趣,想深入研究一下,但又買不起文中提到的書籍(實體書),那你可以嘗試通過 LibGen(http://gen.lib.rus.ec/) 這個網站來搜索有關的文章或書籍。如果你想要一個比本文更詳細一點的濃縮版本計算機科學介紹,那可以看看 Great Theoretical Ideas in Computer Science 系列文章,在這裏可以找到你感興趣的話題。因爲每一部分的學習資源都包含了必要的背景介紹,所以如果沒有看第二章——預熱的話,也沒關係。
學習策略
根據牛頓用以自學幾何學的迭代學習法:
當他看懂了前兩三頁,他從頭重新開始並繼續多看三四頁,發現懂的更多了,直到碰到其他令他感到困難的課題爲止,弄懂這個難題後,他繼續重新開始並且越讀越多他懂的也越多,就這樣循環往復直到他能夠精通於所有書上的知識而不需要任何人的啓發和指導
我在理解一場講座時會遵循這樣的章法:看完一場講座或者讀一篇文章,然後做實驗,然後自己動手寫筆記,然後假裝在課堂上向學生講解自己筆記的內容,講解時用最少量的專業術語,如此,直到我能完全理解這個章節或講座。這種學習方法叫做費曼學習法,在這個網站(http://www.calnewport.com/)上詳細解釋了何爲費曼學習法。這個網站有很多營銷學的知識,還有很多關於學習的奇聞異事,比如 如何在離散幾何課上取得好成績。除此以外,網上還有很多其他關於學習方法的建議,比如 如何做學習計劃並付諸實踐。
預熱
關於“計算”的簡介
命令行是如何工作的?如何搭建網絡?基礎防火牆是什麼?包管理工作是如何進行的?
- (Slides) CS 2043 Unix Tools & Scripting 這個PPT中介紹了emacs、vim一類的編輯器
- The Unix Programming Environment 這本書介紹了Awk\Grep\Sed以及Bash腳本
- 這本書 更加清楚的解釋了現代計算機硬件、軟件以及交互網絡的基礎概念
關於“編程”的簡介
- Programming and Programming Languages 布朗大學的教科書,介紹了編程基礎概念並分析了編程語言
- How to Design Programs 同上一本書的作者,並且是一個在線教育項目Bootstrap(不是那個前端框架Bootstrap)的一部分
譯者注:這本書中用的示範編程語言是Pyret,一門在風格上和Python很像,而且是專門用於教編程語言的編程語言
其他內容
Common Lisp(Lisp編程語言的一門方言,適用於人工智能領域)
本文列出的所有課程,至少在理論上,都可以用Common Lisp去實踐一遍,比如當你學完了 15-213 計算機系統之後打造一個你自己的domain-specific machine code,或者玩轉一下基於Common Lisp的函數式數據結構,或者寫一個自己的模式匹配器(編譯器的一部分?),或者模擬一臺圖靈機,等等。當然你也可以用課程裏推薦的編程語言與工具,但是用Lisp語言做一些屬於自己的原型玩具,可以加深你對知識的理解。另外,CommonLisp有一個特點是,即使它的三方庫已經超過20年沒有更新過了,依然可以正常使用...
- (Book) Common Lisp - A Gentle Introduction to Symbolic Computation 這本書假設讀者毫無編程基礎,引導讀者用紙和筆一步一步的學習編程
- Road to Common Lisp 也是介紹CommonLisp,但是示例內容比較新,全是基於2017年的開發規範
- Paradigms of Artificial Intelligence Programming 循序漸進教你學Lisp
- On Lisp
Little Schemer Series(一系列經典教材,學好Lisp很重要)
- The Little Schemer 教你搞懂遞歸
- The Seasoned Schemer 教你搞懂高階函數
- The Little MLer 教你加深對遞歸思想的理解
卡耐基梅隆大學的Python課程
- (Full Course) 15-112 Fundamentals of Programming and Computer Science 2019年春季推出的課程,按周教學,每一節在油管上都有對應的視頻講解,而且每一節都有課後作業(Python完成)
- 介紹如何撰寫好的代碼提交備註 (???)
假設你有數學專業背景
函數式編程
函數式編程的原則(卡耐基梅隆大學的課程)
- (Lecture Notes) 15-150 Principles of Functional Programming
- Daniel R.Licata教授給這門課程做的筆記
- Programming in Standard ML 課程中的一部分
使用OCaml編程
- 康奈爾大學的OCaml課程
- Data Structures and Functional Programming 康奈爾大學 2018年春季的課程,正如其名,既講了數據結構也講了函數式編程
代數
線性代數
- Wildberger Liner Algebra 一個學習線性代數的油管教學視頻
- (Full Course) CS053 - Coding the Matrix 布朗大學的線性代數課程
- Linear Algebra - As an Introduction to Abstract Mathematics 有很多練習題的線性代數免費在線課程
譯者補充
網上公認的講授線性代數最好的教授 網易雲課堂-線性代數 by Prof. Gilbert Strang from MIT
原視頻來自油管,不過網易雲課堂出了整理翻譯版本,適合國人學習
感謝Gilbert教授,讓我這樣的數學渣渣也能理解線性代數
抽象代數
- Wildberger Abstract Algebra 一個學習抽象代數的油管教學視頻
- (Full Course) Math-371 Abstract Algebra 賓夕法尼亞大學的抽象代數課程
- Abstract Algebra Open Learning Course 哈佛大學的抽象代數課程
離散數學
理論數學
- (Book) An Infinite Descent into Pure Mathematics 收集了卡耐基梅隆大學的講座筆記,這個課程時離散數學、理論數學的基礎!
- 康奈爾大學2019年春季的數學課程
用StandardML學離散數學
計算機科學領域的偉大Ideas
- (Full Course) 15-251 Great Theoretical Ideas in Computer Science 卡耐基梅隆大學的課程,是一門大雜燴課程,包含了很多重要的數學概念,但是要先學完前面提到的理論數學的課程
計算機系統與架構
計算機科學不僅僅是關於計算機,你之所以認爲計算機科學就是關於計算機的科學,是因爲你在計算機科學的諸多領域中都剛剛起步,而且無法完全理解其中的各種概念、思維、知識點。
這一部分從一個程序員的視角去學習計算機架構,比如,如何寫緩存友好的代碼,如何爲x86-64架構做優化,用彙編語言寫循環,搞清楚遞歸在最底層是如何運行的,學習機器指令,瞭解編譯器如何工作,return oriented programming (ROP) to bypass stack protections,內存層級,網絡,等等。在這部分,你可以簡單瞭解C語言編程這本書,不過這部分課程會從彙編語言的層級去闡述指針(這句不會翻譯了。。)。
- (Full Course) 15-213 Intro to Computer Systems (CMU) 卡耐基梅隆大學的計算機系統課程,這個課程包羅萬象,從計算機原理、計算機系統、數據庫、計算機網絡等,都有涉及
- The labs (Data Lab, Bomb Lab ect) are on the book website 課程配套的在線實驗課程
設計系統(Designing Systems)
- (Book) MMIXware: a RISC computer for the third millennium - Donald E Knuth 非常老的一本書,闡述瞭如何設計一個計算機系統架構
分析系統(Analyzing Systems)
網絡
計算、經濟、社會學的世界是如何連接在一起的?
- (Book) Networks, Crowds and Markets - Kleinberg & Easley 這本書是基於我們在康奈爾大學教授的跨學科課程,講的不僅僅是計算機網絡,而是廣義的網絡概念,除了信息技術,還涉及經濟學、市場學、社會學等等。
計算機網絡
- (Book) Computer Networks: A Systems Approach - Larry Peterson and Bruce Davie 在上文提到的15-213課程(計算機系統)中介紹了計算機網絡和Socket編程,這本書詳細解釋了網絡架構設計的底層原理
- 15-744: Computer Networks Syllabus 卡梅隆大學的計算機網絡課程,裏面有很多PPT和PDF可以看
編譯器(Compilers)
- (Full Course) CSE 131: Compilers 加州大學聖地亞哥分校的編譯原理課程
- 卡耐基梅隆大學的編譯器課程(一)
- 卡耐基梅隆大學的編譯器課程(二)
- 一個講如何搭建虛擬機的視頻講座
數據庫系統
- 一位教授在2015年寫的關於數據庫技術未來發展的講座
- (Full Course) 15-445 Database Systems (CMU) 卡耐基梅隆大學的數據庫系統課程
- 15-445/645 Intro to Database Systems (Fall 2017) 油管上與上面課程對應的數據庫系統講解視頻,一共25個視頻
- (Book) DatabaseSystem Concepts 一本經典教材,但是最好在學完前面提到的15-213課程後再看
- (Full Course) 15-721 Database Systems (CMU) 進階課程,基於Peloton自己動手打造一個數據庫系統
數據科學實踐
- (Full Course) 15-388 Practical Data Science 卡耐基梅隆大學(額 好像不是)的課程,很有用的一門課,全面講述了數據科學領域需要用到的各種技術,包括數據收集與處理、數據可視化與展示、通過深度學習構建靜態模型、大數據等等
- Computational and Inferential Thinking 康奈爾大學的課程,同樣是全面講解數據科學技術,用的示例開發語言是Python,用到了jupyter notebooks
- (Book) Foundations of Data Science 康奈爾大學的教材
元語言概念(Meta-Linguistic Abstraction)
In computer science, metalinguistic abstraction is the process of solving complex problems by creating a new language or vocabulary to better understand the problem space. It is a recurring theme in the MIT textbook, the Structure and Interpretation of Computer Programs, which uses Scheme as a framework for constructing new languages.【來自wiki的解釋】
- 簡單說就是爲了解決一個特定領域的複雜問題,發明一種新的語言或者詞彙表。源於麻省理工的一門開創性課程——(Full Course) 6.037 Structure and Interpretation of Computer Programs
- 1985年MIT的教授給HP員工上這門課時的全部錄像
- 如果對Lisp這門語言感興趣,可以看看Norvig的一本關於人工智能的書(github)
自然語言處理(NLP)
- 11-411 Natural Language Processing 卡耐基梅隆大學的NLP課程
- 11-411課程對應的視頻講解
- sci-hub 一個論文搜索引擎,上面可以直接搜索NLP有關的文獻資料
- 一些和NLP算法有關的筆記,也是卡耐基梅隆大學的
編程語言理論
- 一篇文章講解爲什麼要學習編程語言
- (Book) Practical Foundations for Programming Languages - Robert Harper(已失效)卡耐基梅隆大學的教材
- Oregon Programming Languages Summer School 一些和上面那本書有關的講座
軟件質量保證
- (Lecture Notes) 15-316 Software Foundations of Security and Privacy CMU的講座筆記,將軟件安全、隱私、測試等
- (Book) Verified Functional Algorithms Andrew Appel 寫的書
- 上面那本書的作者的講座記錄
- (Full Course) 15-424 Foundations of Cyber-Physical Systems
算法
串行與並行算法簡介
這裏講的不是傳統的數據結構與算法,而是專注講解並行與串行機制,如何用基於開發語言的分析模型去評估一些抽象問題的複雜度,比如垃圾回收。
高級算法
- (Full Course) CS224 Advanced Algorithms 哈佛大學的高級算法課程
- Purely Functional Data Structures 和上面課程相關的書
- Functional Data Structures 加拿大滑鐵盧大學的教材,裏面的練習題是用OCaml語言做的
譯者補充
神童教授Prof. Erik Demaine from MIT的算法導論課程(油管)
複雜度理論
本科生階段的複雜度理論課程
研究生階段的複雜度理論課程
- (Full Course) 15-855 Graduate Computational Complexity Theory CMU的課程
- 上面課程的講座視頻
- Computational Complexity: A Modern Approach 劍橋大學的教材
量子計算簡介(研究生階段課程)
- (Full Course) 15-859BB: Quantum Computation CMU的課程,學習這個課程之前需要先學習完複雜度理論、線性代數、離散概率論等課程
- 上面課程的講解視頻
一大堆貼近實戰的專業筆記(或書籍)
研究生研究課題:類型理論(Type Theory)
研究生研究課題:機器學習與人工智能
- (Full Course) 15-780 Graduate Introduction to AI CMU在2019年春季的研究生人工智能課程
- CMU: Spring 2017: 15-780 Graduate Artificial Intelligence CMU在2017年的研究生人工智能課程視頻
- 15-780 Graduate Artificial Intelligence | CMU 研究生人工智能課程視頻
- 一系列MIT的人工智能講座視頻
- 2017年的一套研究生課程,專注回顧一些往年論文中未解決的AI難題或者觀點
- Artificial Intelligence MIT在2010年面向本科生的AI課程
深度學習
- CMU在2016年關於並行GPU編程訓練的課程視頻、講座
- (Full Course) 11-785 Introduction to Deep Learning CMU在2017年秋季的課程,介紹深度學習
- CMU 11-785 spring 2018 CMU在2018年春季的課程,介紹深度學習
- 18-739: Security and Fairness of Deep Learning CMU在2019年春季的課程,介紹深度學習的安全與公正
譯者補充
吳教授的機器學習課程 網易雲課堂-斯坦福公開課:機器學習,斯坦福的公開課課程主頁上有更加詳細的筆記、講義等資料
臺大李宏毅的深度學習課程,B站-李宏毅深度學習
大數據
- (Full Course) CS229r Algorithms for Big Data 哈佛大學的大數據算法課程,這個課程的首頁還介紹了非常多的其他大學的往年的大數據課程
- Principles of Large-Scale Machine Learning 大規模機器學習 康奈爾大學在2019年春季的課程
- https://www.textbook.ds100.org/ 加州大學伯克利分校的本科生入門教材,全英文,介紹數據科學原理,內容較簡單,需要統計學和 Python 基礎