不少程序員,包括計算機專業出身的程序員,也包括經過自學成爲程序員的非科班同窗,在工做一兩年後甚至更久後,基本上都會碰到技術瓶頸,由此可能產生很長一段時間的迷茫期。程序員
在這個迷茫期,不少程序員都在思考相似本身是否是適合作程序員、是否要作一生程序員、是否要轉行到其餘職業,好比產品經理等問題。若是不能很快地獲得這些問題的答案,那麼這些程序員就會一直被這些問題所困擾,舉步難行,浪費大好光陰。面試
這篇文章不是用來探討程序員是否能幹一生、程序員如何轉型到產品經理等問題的。相反,這篇文章的目的是想要幫助那些迷茫的程序員可以更加堅決地在程序員的道路上一直走下去,甚至走的更遠。算法
本文的題目是"計算機專業學生必定要學好這幾門課",並不必定指的是計算機專業的學生纔要學習、掌握這些內容,我認爲任何程序員都有必要學習和掌握這些內容。編程
這篇文章的題目能夠更改成"程序員必須認真學習的課程",但題目之因此沒有這樣定,一是由於這些課程基本上都是計算機專業本科所教授的課程,因此計算機專業的學生學好這些是有必要的,但同時非計算機專業出身的程序員也是很是有必要學習好這些課程的;二是以計算機專業的學生要學好的課程爲題,更能體現這些課程的價值,也能在必定程度上激起非計算機專業程序員的興趣來學習這些課程。網絡
幾乎全部的程序員,剛開始學習編程時,都是先從具體的編程語言開始學起的。因爲早期尚未高級語言出現,因此很早以前的程序員所能接觸到是彙編語言、機器語言,甚至是直接操做電子電路來編程;而近幾十年,因爲高級編程語言的出現,程序員首先接觸到的都是這些高級語言,好比Python、Java、C++等等。數據結構
對於剛開始學習編程的同窗來講,可以用正在學習的高級語言作出一些軟件,是學習時的根本動力,也是最終目標。因此,在這個階段,你們都是如飢似渴、孜孜不倦地學習着如何用Python、Java、C++等編程語言寫出一些諸如貪吃蛇、課程管理系統等軟件,以此來展現本身學會了某種編程語言。多線程
當某個同窗可以用某種編程語言來寫出一些別人寫不出的軟件時,就開始自認爲學會了編程,同時也自認爲掌握了計算機科學的相關知識。因而這位同窗進入到了一家公司開始作着程序員的工做,也許這份工做還很不錯。天天按時完成既定的編程任務、學習着最新的編程技術,一切都過得開開心心。併發
但是,在不斷學習的過程當中,不時或者常常地感受到困惑、或者一頭霧水,而這種感受又沒法描述,說不清道不明。好比在學習編程語言時,別人說Java是面向對象的,而C語言是面向過程的,可什麼是面向對象,什麼是面向過程?我真的懂面向對象麼?爲何在工做中我體會不到面向對象的好處呢?數據結構和算法
再好比說Java是靜態類型語言,而Python是動態類型語言,那麼什麼是靜態類型語言?什麼又是動態類型語言呢?編程語言
再好比學習多線程編程時,常常會碰到鎖、互斥、信號量等等概念,那這些概念又表明着什麼呢?
再好比最新出現的Kotlin語言比Java語言擁有更好的語法糖,那語法糖是什麼呢?
等等諸如此類的疑問,會不時地在咱們的學習的道路中出現,甚至阻礙咱們前進的步伐,使得咱們只能浮於表面,不能抓住技術的本質。而這,正是本篇文章想要表述的,但願每一個程序員可以認真地學習、掌握下面幾門課程:
一、數字電路
二、計算機組成原理
三、彙編語言
四、計算機操做系統
五、計算機編譯原理
六、離散數學
七、數據結構與算法
八、計算機網絡
固然,程序員須要學習的還有更多,不過這裏列出的都是計算機本科期間學習到的課程,而且這些課程都很是重要。估計不少同窗像我同樣,大學本科期間忙着學習高級編程語言,而無暇顧及這些課程,或者當時根本就聽不懂或者不知道學習這些課程有什麼用。不過,我認爲如今是時候來好好認識下這些課程了。
對於上圖,相信計算機專業的同窗確定不會陌生,是計算機系統層次結構圖。從下往上表明着從計算機硬件到軟件,最下層是計算機硬件部分,最上層表明着咱們用編程語言寫出的應用程序。這裏每一層都表明着上面八門課程的一門或者兩門課程。
硬聯邏輯:表明着計算機硬件,也就是電子元器件。數字電路和計算機組成原理這兩門課則專門用來闡述如何經過電子元器件來表示計算機中的1和0,同時這些電子元器件是如何配合以及如何計算的。這是計算機的根本,也是程序員最應該掌握的。
微程序:硬件級別的程序,這一層沒有專門的課程來介紹,不過能夠綜合計算機組成原理和彙編語言來理解此層。
機器語言:初步印象中,提到機器語言,首先想到的就是01代碼,這是軟件和硬件的分界線,能夠經過彙編語言來理解此層。
操做系統:此層主要有兩個做用,一方面是爲上層的編程語言提供接口,另外一方面則是管理底層的硬件操做。在此層引入了很是多而且很是重要的概念,好比線程與進程、併發、信號量、鎖、內存管理等等。
彙編語言:早期的程序員首先是用紙帶上打孔來編程的,能夠理解爲直接用01來編程;然後爲了方便開發,則發展出了彙編語言,能夠經過add等簡單的命令來實現一些基本的程序邏輯;後來才發展出如今的高級語言。因此,理解彙編語言,對理解高級語言有直觀重要的做用,而且目前不少程序的底層也是用匯編來實現的。
高級語言:高級語言則是以前提到的Python、Java、C++等編程語言,對於不少程序員學習的技術基本上都是在這一層。不太高級語言想要運行在機器上,通常都會通過編譯器進行編譯,或者經過解釋器進行解釋執行,而編譯器和解釋器則是在計算機編譯原理這門課中講述的,以前提到過的語法糖等概念也是在這裏介紹的。
最後三門課離散數學、數據結構與算法、計算機網絡則在此結構圖中沒有體現,不過這三門倒是貫穿整個系統結構的,上述提到的各個層級中,都或多或少地用到了這三門課程中的相關知識點。須要特別提出的則是數據結構與算法這門課,對於應屆生而言,這門課是企業面試的重點;對於已經工做的同窗而言,這門課是技術提高的關鍵。
以上這些課程的學習並非一朝一夕可以搞定的,也不是在大學期間就可以徹底學懂的,不過若是有可能,仍是盡本身全力能掌握多少就掌握多少,剩下的不是特別明白的,須要在之後的工做中慢慢體會、慢慢理解。
所以,不管是對於大學生仍是對於已經工做的同窗,都不能急於求成,須要持續不斷地學習,這個過程可能持續三至五年,甚至更久。同時,爲了加快你們對這塊知識的理解和掌握,下面簡單推薦一些筆者正在學習和已經學習過的一些資料,但願可以帶給你們一些幫助。
一、數字電路
說實話,數字電路是徹底被低估的一門計算機基礎課,其餘大學筆者並不清楚,不過筆者的大學至少沒有嚴肅地來對待這門課,致使筆者在大學期間基本上只瞭解了一下基本的邏輯門電路,對於更高級的知識則知之甚少。
另外,有關數字電路的書籍也很難找出比較出衆的,適合初學者或者計算機專業讀的書籍,因此這裏也不打算推薦有關數字電路的書籍。
不過,有關數字電路的視頻網絡上倒有一些,好比清華大學、東南大學都有一些視頻,你們能夠自行百度搜索便可。
最近在中國大學MOOC網站上發現南京理工大學的數字邏輯電路的公開課,很是適合計算機專業的同窗,這裏推薦給你們:
http://www.icourse163.org/course/NJUST-1001753091
二、計算機組成原理
計算機組成原理這門課很好地向咱們闡述了計算機是如何工做的,是如何計算和輸出咱們想要的數據的,同時因爲本門課是考研科目,因此各個大學都會有一些公開課視頻,好比清華大學等,你們能夠自行搜索獲得,筆者就再也不推薦了。這裏推薦的是筆者看過的幾本書。
首先推薦的是兩本比較通俗易懂的書《大話處理器》和《編碼》,這兩本書都偏科普一些,閱讀起來相對輕鬆,也更有趣味性,是不錯的入門書籍。
最近筆者在看的另外一本比較通俗易懂的書叫《穿越計算機的迷霧》,我的以爲寫的比上面兩本更通俗一些,你們也能夠先讀這本書。不過因爲這本書已經絕版了,你們能夠嘗試到淘寶上看可否找到。
最後須要重點介紹的是《深刻理解計算機系統》這本書,這本書是從程序員的角度來看待整個計算機系統的,因此是很是適合程序員的。可是這本書不只僅包含了計算機硬件的相關知識,同時還包含了包括操做系統、計算機網絡等相關知識,所以須要讀者具有相關的知識才能學得更好,不過從零開始也是能夠的,不過可能會比較吃力些。
一個好消息是國外一些大學在使用這本教材來教學,而且有教學視頻和實驗課程,好比我看過的華盛頓大學的視頻:
https://courses.cs.washington.edu/courses/cse351/
不過壞消息是這些視頻是英文版的(因此學好英語是多麼的重要)。
三、彙編語言
彙編是一門相對比較難而且抽象的課程,可是倒是能夠方便地進行實操的一門課,就像學習編程同樣,能夠實際的去運行書中的一些代碼。一樣地,你們能夠去找找網絡上存在的一些公開課視頻,筆者這裏推薦一門比較經典的書,是清華大學出版社出版的《彙編語言》這本書,能夠配合視頻一塊兒學習。
四、計算機操做系統
跟計算機組成原理同樣,計算機操做系統一樣是一門考研課程,因此網絡上存在的資料是很是多的,你們能夠自行搜索。不過筆者仍是須要推薦兩本書,一本是筆者本科和研究生期間都學過的一本書《現代操做系統》,研究生期間有幸獲得這本書的譯者陳向羣老師的親自授課,也是學到很多知識。
另一本須要推薦的就是《UNIX環境高級編程》,這本書到底有多經典,筆者也不想多作介紹了,你們能夠自行查閱。之因此須要推薦是由於這本書是基於Unix系統的,而不少程序員在工做之後接觸到最多的操做系統差不過就是Unix或Linux操做系統,所以仍是很是有必要進行學習的。
五、計算機編譯原理
不少自學編程的同窗(包括計算機專業和非計算機專業)都不是很清楚編程語言編譯時到底發生了什麼事情,而且對什麼是編譯期、什麼是運行時都只知其一;不知其二。編譯原理這門課就是告訴咱們高級語言是如何一步一步地被轉化爲低級語言,並最終可以在計算機上運行的。
書籍推薦的話固然是經久不衰的《編譯原理》這本書了,教學視頻的話,你們能夠到網絡上找下。
六、離散數學
離散數學我的認爲對於計算機學生而言是很是重要的一門課,惋惜的是因爲在本科期間對計算機認知的不夠,致使在學習這門課的時候只是把它當作一門數學來學習,而且也沒有花太大的精力來學習,相信對於大部分的計算機專業的同窗來講也是這樣的。
不過我認爲若是有時間和精力最好仍是再從新學習這門課或者在大學期間就好好學習,並持續不斷地來複習這麼課中提到的知識,直到掌握爲止。
離散數學在國內使用的教材比較偏向於數學層面,而且沒有和計算機知識有太多的關聯,不過《離散數學及其應用》這本書比較好地闡述了離散數學的相關知識,而且和計算機中經常使用的知識進行告終合,學習起來更爲順暢。
七、數據結構與算法
相信不管是已經畢業的同窗仍是正在學校學習的同窗,都或多或少地被數據結構與算法這門課給折磨過。數據結構與算法這門課開篇就講了一個很是重要的概念:程序 = 數據結構 + 算法,對於初學者可能還不能徹底地理解這句話,不過對於已經工做兩三年的同窗相信對這句話是深信不疑的。
對於數據結構與算法的學習,我我的認爲應該分層三個步驟:首先先大體瞭解什麼是算法,能夠經過一些科普讀物來入門,這個過程我稱之爲入門階段;接着能夠嘗試實現一些比較容易的數據結構和算法,這樣能夠更加深對數據結構和算法的瞭解,這個過程我稱之爲實踐階段;最後去了解數據結構與算法背後的相關數學原理等,這個過程我稱之爲原理階段。
那麼對於這三個階段,我分別分享兩本本人在讀或者讀過的書,你們能夠參考和借鑑。
入門階段我推薦的是《算法圖解》和《啊哈!算法》,這兩本書經過簡單通俗易懂的方式闡述了幾個經常使用的算法,讓你們對算法有個大體的瞭解,並學習一些基本的、經常使用的數據結構與算法。
實踐階段我推薦的是《數據結構(Java版)》,因爲本人是從Java開始學起的,你們能夠根據本身學習的語言找來對應的實踐書籍來學習。經過實踐過程,你們能夠一方面學習書中各類數據結構的實現原理和算法的設計思路,同時能夠對照着編程語言中這些數據結構的實現原理,好比能夠對照Java中對於鏈表是如何實現的,這樣不只能夠了解數據結構與算法是怎麼回事,同時也對本身學習的編程語言進一步作了深刻的研究。
理論階段我推薦的是《算法心得》和《算法導論》這兩本書,其中特別是《算法導論》這本書,其中可能牽涉到不少數學的推理過程,不過經過這個階段的學習可以讓本身的思路更上一層樓。
其實,對於理論部分還有一套讀起來特別費勁的書籍,這裏沒有作推薦,是由於我以爲對於大部分的程序員,可能沒有太大必要去研究它。這裏之因此說起,是以爲你們若是有空閒時間,閒來無事翻翻也行。這套書叫《計算機程序設計藝術》,做者是唐納徳·E. 克努特(Donald E.Knuath,中文名高徳納),目前已經出到了第四捲上卷,書中大量的數學推理,因此數學比較好,而且愛好鑽研的同窗能夠嘗試讀讀。
八、計算機網絡
計算機網絡的相關知識在工做時使用的頻率仍是挺多的,即便不是直接的使用其相關的知識,也會經過一些軟件間接的使用相關的知識。對計算機網絡的認知也可能成爲往後自身發展的瓶頸,好比作分佈式系統的同窗。
對於計算機網絡一樣有兩個階段的書籍來推薦,第一個階段,也就是入門階段,《圖解HTTP》和《網絡是怎樣鏈接的》能夠比較快速地瞭解計算機網絡中比較基礎的相關概念,創建起對網絡的認知。
第二個階段,也就是理論和實踐階段,推薦的是比較著名的《TCP/IP詳解》這套書,這套書共分爲三卷,分別從協議的原理、協議的實現等角度來闡述TCP/IP。
以上是我的的一些愚見,同時也是本人工做幾年後的一些感悟,但願可以幫助到正在大學學習或者正在迷茫的程序員們。
連接:https://www.jianshu.com/p/ab20dc455132