一個優秀的程序員應該學完哪些計算機理論的知識?

"優秀的程序員"打個幌子吧, 我想了解一個程序員需要哪些紮實的基礎知識,,

自學的語言是 JS, 慢慢感受到計算機理論方面有完整的知識體系在,

網上的作者背景不同取向不同文章立意不同我沒找到針對性的版本

求一個條理清楚的答案


我覺得數據結構和操作系統是非常重要的課程,操作系統倒不是關於Kernel什麼的,而是讓我們去理解任務調度和並發。至於編譯原理,可能對於很多人稍微難了一些,但是裡面用到的「有限狀態自動機」確實一個非常有用的理論,在各種不同的方面中反覆的用到。

至於可以參考的項目,我覺得sqlite是好的,大約13萬行的代碼,用到的知識包括了除了網路以外本科階段學習的幾乎所有的課程,上面說到的數據結構、操作系統、編譯原理,還有沒說到的資料庫、關係代數、組成原理等等都包括了。


樓主這個問題不好回答,要看你注重哪個方面。

十年前我上大學的時候,我們計算機系的系主任在課堂上說過一段話,那時我印象特別深刻,現在我認為他說得非常對!送給你參考吧——

任何專業的人都可以半路出家學軟體開發,那麼我們作為計算機系的學生和那些半路出家的有什麼不同呢?把三門專業課學好了,就會有本質的不同——數據結構、操作系統、編譯原理。


我曾在這裡做過類似的回答 如何系統、科學地自學編程知識?


-∞.Theory

(Math, Number Theory, Graph, Automata, Geometry)

-3.Hardware

(Processor Architecture, Memory Hierarchy, Cache, System I/O)

-2.Machine-Level Programming

(Assembly, Executable File Format, Linking Loading)

-1.Operating System

(Process Thread, Memory Management, File System, I/O, Kernel Drivers)

0.Programming Fundamentals

(Data Structure, Algorithms)

+1.Programming Language

(Compilation, C is a must; C++ Java recommended; C#,Python, Ruby,Perl,JS, etc, optional)

+2.Advanced Programming Frameworks and Libraries

(Windows Programming, Unix/Linux Programming; STL, MFC, Boost, TR1, Qt, GTK optional)

+3.Programming Design and Software Engineering

(OOP Design Pattern is a must; Agile, RUP, Iterative, and other models are optional; Debugging and QA)

+∞.Applications

(Computer Network, Database, Http Web, Concurrent Programming, Distributed System )

認真學習大學裡的課程:高數,物理,電路、信號與系統,模電、數電、C語言等等,理論決定了你分析問題的深度。


quora上看到的 學到能寫出這些東西的知識的時候就可以了


學一個資料庫引擎的實現,樓上說的所有知識點都有了,什麼 parser、scheduling、data structure、演算法、抽象能力,通滅。


如果用最少的學習項目來涵蓋最多的知識點,那麼:

  • 編譯原理:重點在 parser 的實現。
  • 操作系統:重點在 kernel,可以學習《Understanding the Linux Kernel, 3ed》。其中的數據結構知識足以覆蓋一般的演算法書。


一個優秀的程序員,應該學習的很多,

但是

首先必須學,且需要學好的是 英語


從結論向起點逆向推。

一名優秀的程序員可以對任何類型的軟體開發都做到心中有數,並且能快速開發。

這需要

1 熟練掌握多種編程語言

2 從硬體到軟體貫通的了解計算機

3 熟悉各種演算法,設計模式等等

做到上面三點需要學習至少以下內容

語言相關:

1 底層相關語言 ASM等

2 面向過程語言 C 等

3 面向對象語言 C++ Java 等

4 函數式編程語言 Haskell Erlang等

5 腳本編程語言 lua 等

6 標記編程語言 HTML 等

每種類型語言都涉及了不同的思想,能拓寬思維。從任何角度講,多學幾門編程語言都不是壞事。

硬體相關:

1 電路 模電 數電

2 計算機組成原理

3 不同系統架構 X86和ARM等

硬體是整個軟體的基礎,重要性不言而喻。

軟體相關:

1 操作系統 這裡指的是原理 系統如何啟動,如何管理進程,如何管理內存等

2 資料庫 也是指原理 資料庫如何做到快速檢索,海量數據存儲,數據安全等

3 網路 從OSI一層一層的看吧

對底層了解的越多,對建立在這些底層上的軟體了解就越透徹

演算法相關

1 基礎演算法 排序,HASH,最小生成樹 最短路徑等

2 基礎數據結構 數組 堆 樹 圖 等

3 編譯原理 有些大學把這個課程拿掉了,可能是因為現在編譯相關工具已經很成熟。不過想成為優秀的程序員,這個是應該看看的。

演算法設計很廣很多,學完基礎後可以根據自己的需要學習相關演算法,推薦《演算法導論》這本書入門

設計模式大概20多種,需要有大量的編碼經驗作基礎,否則看起來很晦澀。

上面的內容是一部分,優秀的程序員還需要大量的實戰經驗,否則這些就是紙上談兵了。

針對樓主的情況,最好放下手上的JavaScript

1 先學一門比較基礎的語言,比如CC++

2 學習數據結構和演算法

3 學習編譯原理

4 研究瀏覽器的原理,如何解析、渲染等

有了這些基礎再做HTMLHTML5JavaScript開發會有完全不一樣的感受(一眼看透的感覺:-))。

歡迎指正


我覺得程序員必須要深入理解的,最為重要的計算機課程為《計算機組成原理》、《計算機體系結構》、《操作系統原理》、《編譯原理》、《數據結構》和《演算法設計》

先佔坑,容我以後再詳細補充。


搞明白數理邏輯,搞明白計算機怎麼來的最重要


建議確定好自己的方向。

計算機編程的範圍、方向相當廣。盲目求一個統一的答案只能讓你走彎路。

雖然有些東西學了是有用,但是你的精力時間有限,應該優先學和自己方向相關或者說幫助最大的知識。

你說的js是指Javascript?

那麼建議你優先學下各主流瀏覽器差異 css oop js主流框架extjs prototype等

把拖動 樹形菜單純自己手工不用框架實現。

這些夠你學一陣了。


什麼是優秀的程序員,怎樣才算優秀?一個優秀的程序員應該不知道那些計算機理論知識?還有待題主來解答一下


離散數學(圖論和群還是蠻重要的)、數據結構、操作系統、計算機網路、形式語言與自動機(編譯原理)、計算機組成原理,差不多這6門吧。


大學的時候 老師曾經說過 學好計算機基礎(數據結構 操作系統 面向對象等) 學好數學 學好英語


看樓主可能是純碼向 所以我是贊成其他人都提到的 數據結構 編譯原理的 不過學的時候感覺按照一般路數不大好啃 建議不要用清華那個綠皮教材太難懂了 去chinapub上找機械工業出的黑皮或者翻視頻教程可能會好一些,千萬要耐心死磕啊!

如果是打算以後走策劃類設計方向的最好把系統分析與設計這門課程好好搞定 十分有用


最近兩個月看的書,給我的感覺是假如你是一個純軟體碼農。你儘力提高的應該是抽象能力,不需要太多理論知識。無論是過程式編程,還是函數式編程,或者面向對象編程。能達到優秀的基礎就是優秀的抽象能力。。

入門書就是《程序語言的構造和解釋》。對於初學還是很難的。而且因為很難已經被美國很多學校從教程裡面拿下了。

學個Lisp吧,哈哈。我最近有點迷戀它,雖然沒動手學,哈哈

最後,這個世界沒有萬能鑰匙,不要期待學完了什麼東西,你就是優秀的了。優秀離不開很長很長時間的~~練習~~。


可參考:

http://9.douban.com/site/entry/255901813/

http://9.douban.com/site/entry/250978008/


推薦閱讀:

如何對集合中的數據進行壓縮?
谷歌從 Ingress 遊戲中搜集的地理數據有哪些用途,是否可能用于軍事?
該如何作一條已知曲線的等距曲線?
為什麼Python比C++慢很多?
機器學習演算法中GBDT與Adaboost的區別與聯繫是什麼?

TAG:編程語言 | 演算法 | 編程 | 計算機科學 |