2017.12.12
最近剛開始寫代碼,為了完成某一樣功能去學習一種新的技能,在寫的過程中總感覺都是支離破碎的,沒有一個大體的框架,在遇到需求時不知道有哪些實現的選擇,總之就是沒有經驗,下班之后也沒有學習什么,不知道從何學起,心里虛虛的。忽然想起可以去以前的同學那里借鑒一番,找找方向。以下轉載可能並不能解決眼前的問題,但覺得以后總有用到的時候。
轉自:http://www.nowamagic.net/librarys/veda/detail/2192
為了成為牛逼的程序員,知識儲備也一定要牛逼!
計算機專業概念有點大。就計算機科學與技術專業而言,以下這些是必修的:
1、計算機組成原理(包括先修課程“數字邏輯與數字系統”,簡稱“數電”):這是一門硬件基礎課,學完后你能清楚的知道如何從用最簡單的數字元件,像搭積木一樣構成整個計算機系統,那就算及格了。
2、線性代數,概率論和離散數學:要知道,凡是能稱之為“科學”的專業,就必須有一定的數學功底,否則難以稱作“科學”。這三門課我覺得是本科時期最重要的三門數學課,比高等數學重要。如果你想在計算機科學的道路上走遠點,那這三門可是必修的。
3、MIT開設的《Introduction To algorithm》,中文版叫《算法導論》:我覺得應該學習它而不是國內習慣開設的《數據結構》。數據結構僅僅是算法的一部分,國內的數據結構課程回避了很多本質的東西,僅僅是對一些常見的數據結構的羅列,學起來總有些不痛不癢的感覺。《Introduction To algorithm》雖然有些章節夾雜着很多很讓人討厭的“數學”,但卻能從本質上帶你領略這門十分必要而且有趣兒的課。
4、操作系統與編譯原理:操作系統可以說是《算法導論》的實驗課,最好能在學習期間自己實現一個小型的操作系統,或者操作系統各分系統的Demo。編譯原理可能是普遍本科生覺得難的一門課,但是作為軟件科學家,這是基礎中的基礎,學完之后所有的語言在你看來應該沒有太大的區別,這么課應該是離散數學+算法導論的實驗課。最好能在學習期間自己實現一個小型的編譯器,語言最好是自創。
5、掌握一門常用的編程語言和編程技術:能了解你用過的所有的程序內部大致是怎樣的,能用你熟悉的語言編寫大部分的程序,至少不能是對任何一個程序滿頭霧水。
以上這些不難做到,我覺得是基礎中的基礎,我偏激的以為,不能掌握他們就不應該獲得學位。
簡而言之:
- 數學課 (概率,統計,微積分等等)
- 語言課(java,c++等)
- 數據結構和算法
- 計算機網絡
- 操作系統和編譯原理
其實只要算法和數學牛,可以吃遍硅谷大多數的IT公司。
具體書籍
- Concrete Mathematics 具體數學,絕對是計算機科學的數學基礎“之一”,國內的計算機科學跟不上國外的一大原因,我始終認為是數學上的差距。
- Introduction to Algorithms 算法導論,所有的程序都需要算法作為基礎,所以算法是不得不學的。
- Introduction to Computer Science and Programming 整體的介紹了計算機,同時也讓學生了解CS能干嘛,自己該干嘛。
- Operating System Engineering 操作系統的重要性不言而喻,同時也介紹了編譯器。
- Network 網絡編程,中國 大學的本科生們有多少能熟練於網絡編程。當今又有多少程序不需要考慮到網絡。
有時候問自己幾個問題:
- 當你學完各種數學、原理、算法之后,你能用這些知識解決什么問題?
- 你能開發出什么應用或系統嗎?你具備多強的開發能力?
- 是更多人對這個專業更感興趣了,還是心生厭倦、恐懼、甚至放棄了?
- 大學畢業到現在,還有多少知識你還記着?有多少還在用?
其實能解決問題的課程才是最重要的。