計算機科學與技術(CS)專業學生該如何系統地自學?

目前二本cs專業大一學生,因為興趣選擇了這個專業,學校課程太少,唯一能上關於計算機的課程就是計算機導論,每天看著老師照著ppt念著一些籠統的概念,下學期才能學習c語言,我自己已經通過自學掌握了c語言的一些基礎,所以我想通過自學更多更快地掌握專業知識,可不知道該從哪學起,經常刷知乎,看到許多我不懂的知識就會感到自己的無知,不知從何學起,周圍的同學室友只會整天lol、玩手機,對比之下常對未來感到迷茫,希望有經驗的前輩傳授一些自學的步驟或經驗。


以下是Berkeley的cs專業的一些必修課以及我個人認為很有必要的課,希望可以幫助你選擇自己學習的方向:

1. 數學類:

微積分

線性代數

概率論

離散數學

2. CS類:

程序結構與理解 Structure and interpretation of computer programs

數據結構 Data structure

機器結構 Machine structures

演算法 Algorithms

人工智慧 Intro to AI

操作系統 Intro to OS

編譯器 Intro to compiler

資料庫 Database

安全 Intro to security

機器學習 Intro to ML

(以上排序並不是嚴格的從簡入難,一些講cs的不同分支的課完全可以混著順序上

學習方式有很多,上網上豐富的公開課、自己看書、看名校這些課的視頻,都是很棒的選擇。

(至於很多人提到的語言:比較受認同的觀點是不必要特別去學語言,以上的這些cs核心知識比單純的語言更加有用。個人建議是在學習這些知識的過程中慢慢達到精通一兩門語言,會用四五門。其餘的需要再pick up就是了。

除此之外,根據我個人的一些簡單的經驗,我建議盡量在有系統地學習的同時,思考一下自己學習cs,除了滿足求知慾和興趣之外,想要達成什麼樣的追求。常見的一些,比方說:工作、科研、創業、投身於cs相關的一些公益組織、留學,等等。其實這些都是需要在學習之外付出很多額外的精力的。

畢竟大學裡前進的道路遠遠不只是學習好知識這一個方面,做好人生下一步的規劃並為之努力是更重要的一部分。如果現在還不確定想做什麼,那就去儘可能多體驗多了解一些吧。日後不斷改變自己的目標不要緊,但一定要有個目標啊。

加油吧。

有問題請儘管回復,我很樂意幫忙。

edit: language


————於07.14.2016更新————

今天突然發現有人私信我,詢問在學這個專業前應該掌握些什麼

其實,我也是剛剛大三結束開始奮力找實習的透明小弱一個

在專業學習方面經過這三年的摸爬滾打總體來說還是有一些經驗

專業學習在次,更為重要的是怎麼安排大學生活,這方面我就完全沒有資格對學弟學妹們進行「指點」。知乎上面有@肥肥貓 大神的被無數知乎用戶認可的經驗:

在大學裡怎樣保持飽滿的精神狀態? - 肥肥貓的回答

現在這個暑期時段,很多高考畢業生已經填報好了志願

當然也有很多已經選擇進入我們這所謂的「熱門」的計算機、互聯網行業

如果有預習打算的,其實並不推薦剛開始就接觸 程序設計語言,應該找一個好的導論課程建設好自己對這個學科的整體結構的認識

這種課程我個人推薦的是很出名的那個"哈佛大學公開課:計算機科學CS50」

在網易公開課上面有完整的中文字幕: 哈佛大學公開課:計算機科學cs50_全20集

當然,如果自備梯子,而且希望完成該課程的課後練習什麼的

可以直接進入該課程的哈佛的官網:http://cs50.tv/ (在沒有科學上網的情況下也可以訪問,但是裡面的視頻最方便的觀看方式是進入YouTube進行觀看,或者你願意下載也可以直接在該網站進行下載 )

如果只是希望了解一下有哪些課程,我記得網上有這麼一張課表,大概就是這些吧

——————————————————————————

以下系答案原文

——————————————————————————

同二本CS狗,年級較你稍高。

同一直自學,但一樣認真上課,切勿以自學為借口而逃避上課。

而且,每個人有自己的選擇,LOL是一種,電視劇也是一種,我們認真啃書編碼同樣也是一種生活方式。

首要放正心態,正視他人的選擇,找到適合自己的環境學習,然後剛開始不求精,只求廣,就是在各方面都應該懂些,這樣才能更好的知道自己的興趣所在。

然後確定方向,切記切記,既然選擇了就一直走下去,不要隨意被他人改變,貴在堅持

還有就是要充分利用資源,不只是書本和教學視頻,博文等等,更重要的是當被一個難題困住之後要及時解決,比如向老師請教。

最難得的是時刻保持謙卑,渴望的心,stay foolish,stay hungry!(感謝 @Aniota 的提醒,已修改錯誤)

手機碼字,共勉


題主你好,在大批前輩趕來為你指點迷津之前,我查閱了一下我校CS專業大一大二的課程。專業直接相關的方面列舉如下,英語課、統計學課、物理課等未予收錄。這些課程網易公開課,iTunes U,coursera,edX等等地方都有豐富的課程資源;每個方面也有各自的經典教材。希望能拋磚引玉,也助樓主一臂之力。

  • 離散數學(基礎的邏輯運算、集合等)

  • 演算法與數據結構 (無數次聽前輩強調這是CS專業萬變不離其宗的核心要義)

  • 軟體工程(開發軟體的範式和方法)

  • 計算機結構(了解從電路構成到 CPU 指令等底層的構造)

  • 更多類型的語言(面向過程,面向對象,函數語言,腳本語言等)
  • 操作系統

  • 網路(主要是 TCP/IP 這套東西)

  • 資料庫

  • 信息安全

  • 圖形圖像,多媒體

以上這些方面都有涉獵之後,其他的CS專業知識基本上都建立於此基礎之上了。我校的高年級課程基本上也都以以上列舉的這些為前提要求。另外關鍵是要上手,刷出題目來/寫出代碼來,實踐起來,切忌只看書不實踐。

歡迎各位前輩、同學補充更多信息,靠譜的課程資源、經典書籍等。


//* 2017.2.20 paris rewrite

個人經驗,歡迎指正

//*******************************************************

PS 建議: 這是我在計算機領域求學的第六個年頭了, 我得到的最重要的經驗就是

「要學什麼,就學什麼。

要學演算法,就學演算法,遇到數學問題,就查,就問,不要分心。」

摘自 @ze ran

想學好計算機演算法,是否需要重新學數學呢? - 知乎用戶的回答 - 知乎

所以下面這段廢話大可跳過直接去文末看原答案

0. 找準定位

0.1

首先由於國內的教育環境導致一個問題, 就是計算機領域教育類別模糊, 所以大家一定要先明白自己要做什麼, 再決定自己要學什麼

(可參考CC2005 http://www.acm.org/education/curric_vols/CC2005-March06Final.pdf)

計算機領域具體的工種成百上千, 且實際知識體系全不重合, 這都需要大家選擇或在工作中逐漸習得. 只從教育的角度來看, 大致分為

Computer Science :計算機科學, 為之後工作特別是研究工作而進行的通才型教育, 需要大量的數學知識, 各種理論知識, 可能頒發理學學位

Computer Engineering :更偏向電氣工程師的專業, 硬體方向

Software Engineering :軟體工程師, 國內絕大部分人的最終方向, 實際也分為兩個子類, 一個是工程方向的, 需要掌握諸如 大到系統架構 軟體設計 面向對象/切面/服務 之類的思想 小到 設計模式 開發模型 測試等等等;另一個是管理方向, Function Point,cocomo等等軟體規模估計 人員管理 等等 都可能成為教學的主體

Information Systems : 不了解, 似乎比下者更接近計算機, 也更注重理論

Information Technology : 不了解, 但我認為數據科學家之類的應在此處

0.2

從實際工作的角度講, 除去科研 可以從騰訊校招中參考分類

(軟體開發-後台開發方向 | Tencent 校園招聘)

-軟體開發(CS,SE)

---後台開發

---PC端

---移動端

---WEB前端

其實就是一個後台技術(Web Service,REST,JAVAEE等),加上對應不同客戶端(PC,移動設備,瀏覽器)的技術。

-安全技術

您點的炫酷黑客攻防戰做好了, 請參考美劇《MR.Robot》

-軟體測試

寫好代碼扔給測試部分領錢走人,滿分

-基礎研究(CS)

認真學了計算機科學又不想混學術圈的好去處

//*******************************************************

1. 對於CS 計算機科學

樓下 @劉華俊 的答案就非常的好事實上也幾乎沒有冗餘

計算機科學與技術(CS)專業學生該如何系統地自學? - 劉華俊的回答 - 知乎

以下為一些解讀

當然事實上對於大部分玩家,請大家在你們的離散數學書/課里獲得計算機絕大部分數學知識的概述就夠了

-計算機數學基礎 {數理邏輯, 集合, 代數, 演算法,組合數學, 概率,統計,運籌學,圖論, 計算理論{形式語言與自動機, 可計算, 複雜性}}

(等等,而且上述都是很重要的,即使對於非CS專業也如此,如個人認為最複雜的計算理論部分,事實上你總要先明白什麼問題不可解,什麼問題可解,能不能在合理時間解 在開始解決問題(編程)吧)

-電工電基,邏輯電路,計算機組成原理 等硬體知識

-操作系統, 網路, 數據結構, 編譯原理等架構知識

-人工智慧等應用知識

-語言等

-然後就是軟體工程師的工程知識

2. SE 軟體工程師

太多了 還是那句話你要定位自己的方向

軟體工程 數據結構與演算法 面向對象/過程/服務/介面/切面/...

系統架構(CS SOA)具體到細節伺服器端的(Web Service,細節的EJB ,傳統輕框架(三大框架)等等)

軟體設計(設計原則,設計模式,UML等等)

管理方面的計算規模,風險控制,開發方式等。

3. ...

寫不動了,也不可能全部列完,找准大方向的定位去學習理論,找准實際工作崗位去學習具體技術,這很重要

//**************************原答案*************************************

我原答案認為這個書單在保證最簡的模式下涵蓋了全部計算機的核心知識,而且恰都是實用且通用的。

——————
我可以給你推薦一個我親自用過的書單,私認為很適合「計算機科學」這個專業的修行體系。如果你想省心的話,以下是最簡模式。

第0層:理工基礎
《數學複習全書》數一 《英語六級》
第一層:
《離散數學及其應用》《計算理論導引》
第二層:
《軟體設計師教程》第四版
第三層:
《演算法》||《演算法導論》
if cpp
《數據結構演算法與應用cpp語言描述》
第四層:(具體工程類)
-《軟體體系結構設計》《設計模式 可復用面向對象軟體的基礎》等等等各種實際的工作技能的理論基礎

(-JAVA語言畢業全家桶

{《JAVA 核心技術 卷1》,《JAVA編程思想》,《effective Java》,[ android, javaee ,其他實際應用]}。)

對於普通大學生我非常建議以考帶學,因為考試本身帶給你一直繼續的動力,目標明確,考察結構合理清晰,但不要為了考試而考試。

ps:第0層是一個理工類學生的基本素養,
英語幾乎算是計算機的專業課了,此外數一中的前二者基本是現代數學體系的開始(分析與代數)而概率則是現代科學解決許多問題的根本原理。
第一層則是一個cs方向的基本理論素養,離散中已經涵蓋了數門學科,如果有興趣的話可以再單獨掌握《組合數學》一些《運籌學》知識,就構成了完善的通用計算機科學基礎。
第二層是cs的一個實用基礎,特別是面對現代計算機工程領域的一個精簡,推薦你另外考計算機四級資料庫方向和ccna,這三個方向很重要是因為他基本代表了數據的存儲(資料庫)處理(計算機)和傳輸(網路),是每個cser都應該掌握的核心線。
第三層則是軟體構建層面的部分,工程的基礎部分,演算法。
第四層則是工程的具體部分軟工,軟體體系結構,設計模式等等,自行決定具體便好

下邊也補一句

這個書單的另一個好處就是你三年搞完了還多出了考研能力,一個國家中級職稱(工程師),一個四級計算機證,一個六級英語證,一個ccna證。基本本科找工作把這些證摔出去對大多數公司也是很強的說服力了

//********************************************************

最後

如今認為這是適合中國本科生大三之前的, 實際上有點不符合真實的CS的要求,也不算滿足實際工作需要(因為對每個人來說第四層第五層都不同),所以你要在大三大四發現自己的

但我也認為很少有人能一直走在通往成功的正確的道路上,而我這條歪路應該算是比較直的了,如果實在想走直請參考上方的新答案自行參悟

//********我的技能樹書單作為參考*****軟體開發-後台***********

工具:理工數學 人類語言

基礎:離散數學({數理邏輯, 集合, 代數, 演算法,組合數學, 概率,統計,運籌學,圖論, 計算理論{形式語言與自動機, 可計算, 複雜性}}),深化學習的計算方法

專業基礎:軟體設計師教程(計算機組成原理,網路,操作系統,數據結構,演算法,軟體工程,資料庫,開發流程,知識產權,專業英語等)

專業:設計模式,面向對象設計,系統架構,軟體工程等等

技能:JAVA EE (EJB), WEB Service等伺服器後台技術

語言:JAVA全家桶

//********

說起來了,還有個好東西

[譯] Google Interview University 一套完整的學習手冊幫助自己準備 Google 的面試

google-interview-university/README-cn.md at master · jwasham/google-interview-university · GitHub


首先,為題主的態度點贊,記得我上大學那會光顧著玩遊戲,沒有為自己的職業好好規劃一下。

作為一個過來人,我說說我的看法: 看樣子樓主要走開發這條路了,這樣的話不論考研與否,首先要打好基礎,學校開設的課程如c語音,數據結構,離算數學,操作系統,組成原理,計算機網路等,相信我這些都很重要,如果不考研的話,大三大四多關注一下業界,看看自己感興趣的方向,是嵌入式還是伺服器亦或是前端,再做相應分涉獵,這個網上資料還是挺豐富的,做的這些我相信以後找個滿意的工作還是挺輕鬆的。


GitHub - open-source-society/computer-science: Path to a free self-taught education in Computer Science! 從數學到UX Designer, 都是各大MOOC平台上的免費課程


搬運自Teach yourself computer science ,文章把CS分類了九個Subject,建議題主閱讀原文,以下總結文章里給出的乾貨

編程

教材: Structure and Interpretation of Computer Programs

視頻:Brian Harvey』s SICP lectures

練習:exercism

計算機結構

教材: Computer Organization and Design

視頻:Berkeley - CS61C

演算法與數據結構

教材:The Algorithm Design Manual

視頻:http://www3.cs.stonybrook.edu/~algorith/video-lectures/

練習:Leetcode

離散數學

教材:MIT - Mathematics for Computer Science

視頻:Mathematics for Computer Science

操作系統

教材:

Operating System Concepts(龍書)

Modern Operating Systems

Operating Systems: Three Easy Pieces

練習:xv6

計算機網路

教材:Computer Networking: A Top-Down Approach

視頻:Stanford - Introduction to Computer Networking

練習:Mini TCP Stack

資料庫

教材:Readings in Database Systems

視頻:Berkeley - CS186

編譯原理

教材:Compilers: Principles, Techniques, and Tools

視頻:Compilers

練習:Make a Lisp

分散式系統

教材:Distributed Systems, 3rd Edition

視頻:MIT 6.824

論文:http://dsrg.pdos.csail.mit.edu/papers/


最近做了一張關於計算機科學與技術專業課程的 Concept Map,發現可以從數學課程開始構建這個專業的知識體系,我刪除了部分自己不感興趣的課程(網路、資料庫、遊戲等),從而作出了如下的課程安排,以下學習順序與大多數高校的課程設置有很大不同,也並不適合完全沒有編程基礎的同學自學,但非常適合有一定編程基礎且想要系統掌握該學科知識體系的同學,從而做到知其然也知其所以然。以下安排完全偏向計算機科學方向(技術基本被忽略了…需要的同學可以自行補充相關領域的技術知識)。

## 集合論

 - Set Theory [Kenneth Kunen]

 - Set Theory [Thomas Jech]

 - 集合論:對無窮概念的探索 [郝兆寬]

## 圖論

 - Graph Theory [Adrian Bondy, U. S. R. Murty]

 - 圖論 [王樹禾]

## 數理邏輯

 - Logic for Applications (應用邏輯) [Anil Nerode, Richard Shore]

 - A Mathematical Introduction to Logic (數理邏輯) [Herbert B. Enderton]

 - 數理邏輯 [汪芳庭]

## 電工電子學

 - 電工學簡明教程 [秦曾煌]

------

## 拓撲學

 - Basic Topology (基礎拓撲學) [M. A. Armstrong]

 - Topology (拓撲學) [James R. Munkres]

## 組合學

 - Discrete Mathematics and Its Applications (離散數學及其應用) [Kenneth H. Rosen]

 - Introductory Combinatorics (組合數學) [Richard A. Brualdi]

 - Concrete Mathematics : A Foundation for Computer Science (具體數學:計算機科學基礎) [Ronald L. Graham, Donald E. Knuth, Oren Patashnik]

## 計算理論

 - Introduction to the Theory of Computation (計算理論引導) [Michael Sipser]

## 數字邏輯電路

 - 數字電路基礎 [閻石]

------

## 形式語言與自動機

 - An Introduction to Formal Languages and Automata (形式語言與自動機導論) [Peter Linz]

 - Introduction to Automata Theory, Languages, and Computation (自動機理論、語言和計算導論) [John E. Hopcroft]

## 可計算性理論

 - Computability and Logic (可計算性與數理邏輯) [George S. Boolos]

## 計算複雜性理論

 - Computational Complexity : A Modern Approach [Sanjeev Arora, Boaz Barak]

## 計算機組成原理

 - Computer Organization and Design : The Hardware/Software Interface (計算機組成與設計:硬體/軟體介面) [David A. Patterson, John L. Hennessy]

------

## 形式語用學

 - Programming Language Pragmatics (程序設計語言:實踐之路) [Michael L. Scott]

## 形式語義學

 - The Formal Semantics of Programmin (程序設計語言的形式語義) [Glynn Winskel]

## 編譯原理

 - Compilers, Principles, Techniques and Tools (編譯原理) [Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman]

 - Modern Compiler Implementation in C (現代編譯原理:C 語言描述) [Andrew W. Appel]

 - Advanced Compiler Design and Implementation (高級編譯器設計與實現) [Steven S. Muchnick]

## 微機原理

 - 微機原理與介面技術 [孟虎]

## 計算機體系結構

 - Computer Architecture : A Quantitative Approach (計算機體系結構:量化研究方法) [John L. Hennessy, David A. Patterson]

------

## 程序設計語言

 - Thinking in Java (Java 編程思想) [Bruce Eckel]

 - CLR via C# [Jeffrey Richter]

 - The C Programming Language (C 程序設計語言) [Brian W. Kernighan]

 - The Standard C Library (C 標準庫) [P. J. Plauge]

 - C Programming : A Modern Approach (C 語言程序設計:現代方法) [K. N. King]

 - C Interfaces and Implementations : Techniques for Creating Reusable Software (C 語言介面與實現) [David R. Hanson]

 - C++ Primer [Stanley B. Lippman]

 - The C++ Programming Language (C++ 程序設計語言) [Bjarne Stroustrup]

 - The C++ Standard Library : A Tutorial and Reference (C++ 標準庫) [Nicolai M. Josuttis]

 - STL 源碼剖析 [侯捷]

 - Effective C++ [Scott Meyers]

 - More Effective C++ [Scott Meyers]

 - Effective STL [Scott Meyers]

 - Effective Modern C++ [Scott Meyers]

 - Inside the C++ Object Model (深度探索 C++ 對象模型) [Stanley B. Lippman]

 - Modern C++ Design : Generic Programming and Design Patterns Applied (C++ 設計新思維) [Andrei Alexandrescu]

 - Python Cookbook [Alex Martelli]

 - The Python Standard Library by Example (Python 標準庫) [Doug Hellmann]

 - Python 源碼剖析 [陳儒]

## 數據結構與演算法

 - Introduction to Algorithms (演算法導論) [Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein]

 - The Art of Computer Programming (計算機程序設計藝術) [Donald E. Knuth]

 - Data Structures and Algorithm Analysis in C++ (數據結構與演算法分析:C++ 語言描述) [Mark Allen Weiss]

## 演算法分析與設計

 - Introduction to the Design and Analysis of Algorithms (演算法設計與分析基礎) [Anany Levitin]

 - Algorithmic Puzzles (演算法謎題) [Anany Levitin, Maria Levitin]

## 彙編語言

 - 彙編語言 [王爽]

## 操作系統

 - Modern Operating System (現代操作系統) [Andrew S. Tanenbaum]

 - Operating Systems : Internals and Design Principles (操作系統:精髓與設計原理) [William Stallings]

 - Understanding the Linux Kernel (深入理解 Linux 內核) [Daniel P. Bovet, Marco Cesati]

 - Linux Kernel Development (Linux 內核設計與實現) [Robert Love]

 - Programming Applications for Microsoft Windows (Windows 核心編程) [Jeffrey Richter]

--------------------------------------------------------------------------------------------------------------------------------------------

## 線性代數

 - 線性代數 [李尚志]

 - 高等代數簡明教程 [藍以中]

 - Linear Algebra Done Right (線性代數應該這樣學) [Sheldon Axler]

 - Introduction to Linear Algebra (線性代數導論) [Serge Lang]

 - Linear Algebra and Its Applications (線性代數及其應用) [David C. Lay]

 - Introduction to Linear Algebra [Gilbert Strang]

 - Linear Algebra and Its Applications [Gilbert Strang]

## 數學分析

 - 簡明微積分 [龔昇]

 - 數學分析新講 [張築生]

 - Thomas" Calculus (托馬斯微積分) [George B. Thomas]

 - 數學分析 [卓里奇]

 - 數學分析習題集 [吉米多維奇]

 - Mathematical Analysis (數學分析) [Tom M. Apostol]

 - Mathematical Analysis [Vladimir A. Zorich]

 - Principles of Mathematical Analysis (數學分析原理) [Walter Rudin]

## 概率論

 - A First Course in Probability (概率論基礎教程) [Sheldon M. Ross]

 - 概率論 [蘇淳]

 - 概率論與數理統計 [陳希孺]

 - 概率論與數理統計教程 [茆詩松]

## 數理統計

 - 數理統計學簡史 [陳希孺]

 - 數理統計學教程 [陳希孺]

 - Introduction to Mathematical Statistics (數理統計學導論) [Robert V. Hogg, Allen T. Craig, Joseph W. McKean]

 - All of Statistics (統計學完全教程) [Larry Wasserman]

 - 數理統計 [韋來生]

------

## 矩陣論

 - 線性代數與矩陣論 [許以超]

 - 矩陣論 [方保鎔]

 - Matrix Analysis (矩陣分析) [Roger A. Horn]

## 常微分方程

 - 常微分方程 [阿諾爾德]

## 實變函數

 - 實變函數論 [那湯松]

## 複變函數

 - 複變函數 [嚴鎮軍]

 - 複變函數論方法 [拉夫連季耶夫, 沙巴特]

## 隨機過程

 - 隨機過程 [伊藤·清]

 - Stochastic Processes (隨機過程) [Sheldon M. Ross]

 - Introduction to Probability Models (應用隨機過程:概率模型導論) [Sheldon M. Ross]

## 回歸分析

 - 回歸分析 [謝宇]

## 運籌學

 - Introduction to Operations Research (運籌學導論) [Frederick S. Hillier]

------

## 偏微分方程

 - Basic Partial Differential Equations (基礎偏微分方程) [David Bleecker]

 - Partial Differential Equations [Lawrence C. Evans]

## 實分析

 - 陶哲軒實分析 [陶哲軒]

 - Real Analysis [Halsey L. Royden]

 - Real Analysis : Measure Theory, Integration, and Hilbert Spaces [Elias M. Stein, Rami Shakarchi]

## 複分析

 - 簡明複分析 [龔昇]

 - Complex Analysis (複分析) [Lars V. Ahlfors]

 - Complex Analysis [Elias M. Stein]

## 數值分析

 - Numerical Analysis (數值分析) [Timothy Sauer]

## 最優化理論

 - 最優化理論與方法 [袁亞湘]

 - 最優化理論與演算法 [陳寶林]

 - 非線性優化計算方法 [袁亞湘]

 - Nonlinear Programming (非線性規劃) [Dimitri P. Bertsekas]

 - Convex Optimization (凸優化) [Stephen Boyd, Lieven Vandenberghe]

 - Numerical Optimization (數值最優化) [Jorge Nocedal, Stephen Wright]

## 多元統計分析

 - 多元統計分析 [王靜龍]

 - 實用多元統計分析 [管宇]

 - Applied Multivariate Statistical Analysis (實用多元統計分析) [Richard A. Johnson]

------

## 泛函分析

 - 實變函數論與泛函分析 [夏道行, 吳卓人, 嚴紹宗, 舒五昌]

 - Introductory Functional Analysis with Applications [Erwin Kreyszig]

 - Functional Analysis (泛函分析) [Walter Rudin]

## 測度論

 - 測度論講義 [嚴加安]

 - Measure Theory (測度論) [Paul R. Halmos]

## 數學模型

 - Mathematical Modeling (數學建模方法與分析) [Mark M. Meerschaert]

 - A First Course in Mathematical Modeling (數學建模) [Frank R. Giordano, William P. Fox, Maurice D. Weir]

## 機器學習

 - 機器學習 [周志華]

 - Computational Intelligence : An introduction (計算智能導論) [Andries P. Engelbrecht]

 - 統計學習方法 [李航]

 - The Nature of Statistical Learning Theory (統計學習理論的本質) [Vladimir N. Vapnik]

 - 支持向量機:理論、演算法與拓展 [鄧乃揚, 田英傑]

 - Machine Learning (機器學習) [Tom M. Mitchell]

 - Machine Learning in Action (機器學習實戰) [Peter Harrington]

 - Pattern Classification (模式分類) [Richard O. Duda]

 - Pattern Recognition And Machine Learning [Christopher M. Bishop]

 - The Elements of Statistical Learning [Trevor Hastie, Robert Tibshirani, Jerome Friedman]

 - Machine Learning : A Probabilistic Perspective [Kevin P. Murphy]

 - Probabilistic Graphical Models : Principles and Techniques (概率圖模型:原理與技術) [Daphne Koller, Nir Friedman]

## 電路分析

 - 電路原理 [江緝光, 劉秀成]

 - Introductory Circuit Analysis (電路分析導論) [Robert L. Boylestad]

------

## 信號與系統

 - 信號與系統 [鄭君里]

 - Signals and Systems (信號與系統) [Alan V. Oppenheim, Alan S. Willsky]

## 數字信號處理

 - 數字信號處理:理論、演算法與實現 [胡廣書]

 - Digital Signal Processing : A Practical Guide for Engineers and Scientists (實用數字信號處理:從原理到應用) [Steven W. Smith]

 - Discrete-Time Signal Processing (離散時間信號處理) [Alan V. Oppenheim, Ronald W. Schafer, John R. Buck]

## 數字圖像處理

 - Digital Image Processing (數字圖像處理) [Kenneth R. Castlema]

 - Digital Image Processing (數字圖像處理) [Rafael C. Gonzalez, Richard E. Woods]

## 計算機圖形學

 - The Nature of Code (代碼本色:用編程模擬自然系統) [Daniel Shiffman]

 - Fundamentals of Computer Graphics (計算機圖形學) [Peter Shirley, Michael Ashikhmin, Steve Marschner]

 - Computer Graphics : Principles and Practice in C (計算機圖形學原理及實踐:C 語言描述) [James D. Foley, Andries van Dam, Steven K. Feiner, John F. Hughes]

 - Physically Based Rendering [Matt Pharr, Greg Humphreys]

 - OpenGL Programming Guide (OpenGL 編程指南) [Dave Shreiner]

------

## 認知神經科學

 - Principles of Neural Science (神經科學原理) [Eric R. Kandel]

 - Cognitive Neuroscience : The Biology of the Mind (認知神經科學:關於心智的生物學) [Michael S. Gazzaniga, Richard B. Ivry, George R. Mangun]

 - The Quest for Consciousness : A Neurobiological Approach (意識探秘:意識的神經生物學研究) [Christof Koch]

 - Theoretical Neuroscience : Computational and Mathematical Modeling of Neural Systems [Peter Dayan, Laurence F. Abbott]

 - 視覺信息處理的腦機制 [壽天德]

 - Neuronal Dynamics : From single neurons to networks and models of cognition [Wulfram Gerstner, Werner M. Kistler, Richard Naud, Liam Paninski]

## 神經網路

 - Neural Networks : A Comprehensive Foundation (神經網路原理) [Simon O. Haykin]

 - Neural Networks and Learning Machines (神經網路與機器學習) [Simon O. Haykin]

 - Neural Networks for Applied Sciences and Engineering (神經網路在應用科學和工程中的應用) [Sandhya Samarasinghe]

 - Neural Network Design (神經網路設計) [Martin T. Hagan]

 - Parallel Distributed Processing [David E. Rumelhart, James L. McClelland]

 - Deep Learning [Ian Goodfellow, Yoshua Bengio, Aaron Courville]

 - Learning Deep Architectures for AI [Yoshua Bengio]

## 計算機視覺

 - Concise Computer Vision : An Introduction into Theory and Algorithms [Reinhard Klette]

 - Computer Vision : A Modern Approach (計算機視覺:一種現代方法) [David A. Forsyth, Jean Ponce]

 - Computer Vision : Algorithms and Applications (計算機視覺:演算法與應用) [Richard Szeliski]

 - Multiple View Geometry in Computer Vision (計算機視覺中的多視圖幾何) [Richard Hartley]

 - 計算機視覺中的數學方法 [吳福朝]

 - Learning OpenCV : Computer Vision with the OpenCV Library (學習 OpenCV) [Gary Bradski, Adrian Kaebler]

--------------------------------------------------------------------------------------------------------------------------------------------

## 其他

 - Code : The Hidden Language of Computer Hardware and Software (編碼:隱匿在計算機軟硬體背後的語言) [Charles Petzold]

 - Computer Science : An Overview (計算機科學概論) [J. Glenn Brookshear]

 - Structure and Interpretation of Computer Programs (計算機程序的構造和解釋) [Harold Abelson, Gerald Jay Sussman, Julie Sussman]

 - Computer Systems : A Programmer"s Perspective (深入理解計算機系統) [Randal E. Bryant]

 - Artificial Intelligence : A Modern Approach (人工智慧:一種現代方法) [Stuart J. Russell, Peter Norvig]

 - On Intelligence (人工智慧的未來) [Jeff Hawkins, Sandra Blakeslee]

 - Introduction to Data Mining (數據挖掘導論) [Pang-Ning Tan, Michael Steinbach, Vipin Kumar]

 - Refactoring : Improving the Design of Existing Code (重構:改善既有代碼的設計) [Martin Fowler]

 - CUDA by Example : An Introduction to General-Purpose GPU Programming (GPU 高性能編程 CUDA 實戰) [Jason Sanders, Edward Kandrot]

 - The CUDA Handbook : A Comprehensive Guide to GPU Programming (CUDA 專家手冊:GPU 編程權威指南) [Nicholas Wilt]


2016.6.8:

這是我從一本書里截的圖,希望能幫到你。

作者用類似金字塔的結構體現了本科四年的課程體系。電路和數學是基礎,然後是各種數據結構、語言、組原、操作系統等等。

圖片出處:我是一隻IT小小鳥.pdf_微盤下載

2017.3.12:

系統自學計算機的話還是上圖那幾個方向:

【數學基礎】

●高數(數分);

●概率論與數理統計(數理統計是概率論和統計學的交叉部分,感覺統計學了解下即可);

●線代(高代);------但是應對考研的話這三門只把括弧外的學好就行了

●組合數學;

●隨機過程;

●離散數學(集合論,圖論,數理邏輯,代數結構)

●數論;

【電子學基礎】

●電路 邱關源

●模電 童詩白

●數電 閆石

這三門課的視頻教程很好搜,聽說西安交大的不錯(大學物理就別看了,什麼鬼)

【主要課程】

●語言:C C++ Java Python,看能力學吧,最好是會一些腳本語言

參考:C 語言進階有哪些優秀的代碼可以閱讀?

●數據結構,演算法:大公司的面試比較注重考察演算法,《演算法導論》第2、6、7、10、11、15、16、22章建議在本科期間看,讀完就已經比大多競爭對手強了。

參考:本科生如何才能進入騰訊,阿里等一流的互聯網公司?

●Forouzan的《計算機科學導論》

●Yale N. Patt的《計算機系統概論》

●微機原理與應用(我看的是北京大學王克義的教材)

●彙編語言(王爽)

●嵌入式和單片機(不走這個方向簡單學下就行,有助理解組成原理和計算機體系結構)

●計算機組成原理

●操作系統原理

●資料庫原理(Jeffrey D. Ullman的《資料庫系統基礎教程》入門)

●計算機網路原理(感興趣可以提前學,對信息安全感興趣還可以搜一下【知道創宇研發技能表】)

●軟體工程、設計模式

●編譯原理

【Linux】

●不管是進行深層次的學習還是為了找工作,Linux都很重要。Linux發行版很多建議學CentOS,網上教程多。

參考:如何更深入地學習 Linux?

【計算機英語】

英語比較重要,建議看看英文原著。

不想買紙書的話,谷歌上可以直接搜到原版pdf

谷歌搜索

GET√

2017.8.7:

系統自學計算機專業可以參考一下這三個大學的培養方案,比較優質,除了課程安排還給出了課程體系圖。

●培養方案:

北京郵電大學計算機學院本科專業培養方案

西安電子科技大學計算機科學與技術專業培養方案

中國科學技術大學計算機專業培養方案

●課程體系:

北京郵電大學↑

西安電子科技大學↑

中國科學技術大學↑


我想這張圖應該對題主有用:

這是網易公開課的學習路徑圖,對哪個感興趣就去學吧,計算機的很多知識都是相互關聯的,不用糾結切入點,隨便選一個,最後都能連成網。


我說一下我上過的課程順序吧。

大一上:

c語言,高數上,線性代數

大一下:

c++,數字邏輯,高數下,彙編語言,概率論和數理統計

大二上:

java,數據結構,計算機組成原理,離散數學上

大二下:

操作系統原理,編譯原理,軟體工程概論,離散數學下,UML

大三上:

XML,數值分析,嵌入式操作系統(linux,android),J2EE,資料庫系統原理,軟體測試,雲計算

大三下:

計算機網路基礎,軟體體系結構,多媒體技術,移動互聯網應用開發技術,軟體體統分析和設計,計算機視覺,VC++程序設計

有些是選修課,僅供參考


1.學好英語

2.刷完伯克利61A 61B 61C,推薦再看看龍書

3.刷完leetcode

到這步差不多也知道要學什麼更細的方向了

Ps:編程實踐及其重要,每一個知識點都一定要編程實現一下,可以動手寫一個操作系統、編譯器之類的對整個計算機體系結構理解會加深很多,千萬不要只看書


先看sicp,然後把語言基礎打好,c的話可以看 the c programing language,至少掌握一門面向對象語言,然後學離散數學,數據結構與演算法。以後可以上操作系統,資料庫,計算機網路,不要在大一時候學太多商業化技術(比如說web開發,app開發),雖然很容易激發興趣,但是以後很可能會發現自己浪費了很多時間在寫白菜代碼。基礎是萬年不變的硬道理。根基打好再去確定小方向。

要注意的是寫代碼和看書一樣重要(國內高校很多都不重視代碼能力),多打代碼你看的書才有意義。


編程入門指南 v1.4 - 蕭井陌的專欄 - 知乎專欄


感覺自己在知乎經常被罵,匿名吧

以下是我的書單↓↓↓


如果題主英語基礎好可以看MITOpenCourseWare 那裡基本上大部分cs課程都有授課視頻 筆記 還有課後作業和 答案

另外除了MITOCW還有code academy也有一些不錯的資源

另外推薦兩本書

一本是HMC的CS for All(這本書是非常好的小白入門書籍 尤其對於遞歸和計算機構成講的很細 讀起來也很有趣)

另一本是MIT Press的Introduction to Algorithm 都是非常不錯的教科書

不過如果說列出一個課程綱目的話

1.計算機導論

2.數據結構和離散數學

3.演算法

上面是cs最最核心的(ps:題主最好會一點微積分 至少極限要知道 演算法中的某些概念會應用到極限) 然後可以就有不同分支了 比如軟體方向 人工智慧方向 應用啊 資料庫啊之類 等等

另外cs裡面非常重要的除了演算法就是操作系統和編譯器設計


本人大四,即將面臨畢業~先草草回答一下佔個坑,有空來完善

首先推薦兩個網站

慕課網,程序員的夢工廠,在這裡你可以學習編程語言,實際項目,質量很高~

只會寫代碼是不行的,還要懂點理論知識~我覺得學堂在線還不錯~是我比較喜歡的綜合類慕課網,這裡你可以學數據結構,操作系統,計算機網路,還有一些數學知識等

現在大學必學的語言基本上就是C,C++,Java,前端,J2EE

我認為剛入門的時候先學C語言,優酷有曾怡主講的譚浩強書版的視頻,雖然視頻很老了,但是真的很好,我當時上課沒聽懂就回去看視頻搞懂得。

學c需要最重要的是寫代碼!寫代碼!寫代碼!可以去網上找c語言題庫~然後自己練

每天兩小時,大概練了一百來題你就可以結束了~(理解函數思維,指針這個點可能會比較難但是一定要搞懂,數據結構的難點也是它,別問我為什麼知道,我當初快被它搞瘋了,原理都懂,只要一寫代碼總是內存溢出,出錯~)

學完了就找個小項目練練手,比如五子棋,貪吃蛇~沒思路可以網上下載源碼前提是看懂了一定要自己敲!!!!自己理清思路敲一遍代碼

~~~~~

然後就是數據結構了,這個比較難,可以去學堂在線網站看~我覺得這個網站課程還不錯

然後呢就是自學JAVA了,可以去慕課網_程序員的夢工廠~

寫項目軟體工程概論很重要~

學了上面這些,也要個最少半年到一年~

那個時候你的思維已經打開了就知道自己要學什麼了~

就業來說一定要學好

數據結構

C語言,Java,jsp

操作系統

離散數學

寫幾個小項目~比如圖書館管理系統~新聞發布系統~

然後就投簡歷面試!看看自己離能入職工作的距離還有多遠,選擇性聽取面試官的建議~然後不斷調整自己的學習方向~到畢業的時候你就知道自己該怎麼做了

我覺得一上來就看一堆書是不行的,堅持不下去的,畢竟現在的大學生都是血一學期忘一學期,更何況你個自學的~

不懂就百度,中國的博客園,CSDN論壇有很多結果問題的帖子~

最重要的是不要被。。。培訓機構給忽悠了。。。。


一點從職業角度的看法:

語言不是最重要的,先多關注行業內方向,找到自己想做的方向,要麼前端,後端,遊戲,通信。

找准一個方向之後,就可以有針對性的學習。在選擇方向的時候,可以找一些前輩或者業內大牛的參考。


執行力特別重要!!!!!!


好多課程,比如說coursera,還有一大堆國際名校課程,比如說cs61a,還有網易雲課堂,挺好的,


推薦閱讀:

為什麼asp.net沒能比php更流行?
易語言是圖靈完備的嗎?
不同編程語言的Delay函數分別是什麼?
總是糾結於編程語言標準怎麼辦?
用易語言寫過的最大的項目是什麼?

TAG:程序員 | 編程語言 | 大學 | 計算機技術 | 計算機科學 |