後臺開發應該讀的書

後臺開發應該讀的書

原創 2018-03-30 張小方 高性能服務器開發python

根據個人經驗來談一談,先介紹一下個人狀況,座標上海,後臺開發(也帶團隊了),某知名互聯網公司。linux

 

目前主流的有C++和JAVA,C++個人經驗稍微多一點。我就說說我關於C++方面的學習經驗。若是您是學生,臨近畢業,沒有那麼多時間讀許多書,能夠按下面列舉的重要程度來參考。程序員

 

 

  • 首先,我以爲你應該好好準備算法和數據結構,作到常見的算法和數據結構知識點都能很是熟悉,這樣的話你畢業求職的時候能夠輕鬆拿一些大廠(BAT等)的offer。我本人非科班出身,一畢業以後各類摸爬滾打。一畢業去大廠我的以爲有兩個好處,第一,你的收入會比通常的的小公司高不少,小公司招人要求相對低一些,薪資給的也少不少,它們是實實在在招能幹本職工做活兒的人。第二,你的起點也會比通常進入小廠的同窗高。我這裏並非歧視小廠,只是說一種廣泛的狀況。我本人也是從小廠一路過來的。這裏我是強調算法和數據結構的重要性。尤爲是應屆生求職,更應該去好好準備一下這個,由於這個東西是原理性的基礎。企業在面試應屆生時不會過度要求項目經驗和各類操做系統原理、網絡通訊原理之類的東西,而惟一能考察一我的的基本功的就是這個了。我是社招進大廠,基本上算法和數據結構這類問題問的比項目經驗自己要多許多。可是社招又不太同樣,由於除了要準備算法和數據結構之外,還得準備有項目經驗、瞭解操做系統原理、熟悉網絡通訊、瞭解數據庫、熟悉要求的各類開源框架和技術等等,實在太多了,即便再怎麼準備也不必定能一舉拿下。相反,應屆生基本上只要好好準備算法和數據結構的東西,大學其餘專業課學的不是太差,這基本上就是進大廠的捷徑。圖書方面,你可使用大家計算機專業的相關教材,也可使用《數據結構與算法分析:C語言描述》《算法導論》這一類嚴謹的教材,固然,平心而論我是不敢推薦《算法導論》的,由於這一本書實在是太大部頭了,沒有好的數學知識,真的很難啃。若是想看一下比較幽默輕鬆類的書,能夠看看程傑的《大話數據結構》。面試

 

  • 其次,若是你學有餘力,能夠看看操做系統原理方面的書籍,固然也可使用大家的教材,我這裏推薦一本我看過的吧,Tanenbaum.A.S《現代操做系統》,Tanenbaum是荷蘭人,也是Linux之父Linus Torvalds操做系統方面的啓蒙老師。固然,個人建議是這種書畢竟流於理論知識,也不必定要看完,但必定將一些基礎概念,如進程線程內存模式等基礎概念看懂理解。你若是還有時間強烈推薦看看俞甲子的《程序員的自我修養:連接、裝載與庫》,這本書同時涉及到了Windows和linux兩個操做系統平臺,用各類輔助工具剖析了程序從源碼到二進制文件再到裝載到進程地址空間裏面的各個細節,甚至連進程地址空間中的堆結構、棧結構也分析得清清楚楚,同時也分析了C Runtime(CRT)、glibc這樣的操做系統接口庫的原理和執行邏輯,是一本實實在在可貴的幫你實戰操做系統原理的一本好書。我特別喜歡這個書中序言的一段話:redis

   

「CPU體系結構、彙編、C語言(包括C++)和操做系統,永遠都是編程大師們的護身法寶,就如同少林寺的《易筋經》,是最爲上乘的武功;學會了《易筋經》,你將無所不能,任你創造武功;學會了編程「易筋經」,大師們能夠任意開發操做系統、編譯器,甚至是開發一種新的程序設計語言!」算法

 

 

 

  • 再次,你學這些東西是爲了未來實踐並有產出的,而落實這個產出的東西就是編程語言,若是是入門,我首推C/C++。你只有熟練使用一門編程語言,你才能將你的想法變成現實。注意這裏我把C和C++放在一塊兒,可是嚴格意義上說,C和C++仍是有點區別的,可是除了語法上的一些細節差別,基本上能夠認爲是相通的。我的以爲C語言是全部想成爲高手最應該使用的入門語言,不要和我說如今很火的python、go這類語言,「玄都觀裏桃千樹,滿是劉郎去後栽」。我這裏也推薦一本C語言方面的圖書吧,有興趣的能夠參考一下:《C語言程序設計:現代方法》。至於譚浩強的書就不要提了,還有就是大部頭的《C++ Primer》,它雖然是一本好書,但實在是太大部頭了。語法層面的東西學會很快,stl庫的東西須要實戰,也不是翻這類字典同樣的書就能很好地掌握的。固然,若是你想掌握好C++,《深度探索C++對象模型》是必定要看的。C++實際編碼技巧還有另一本很是好的書,介紹了常見的C++編碼技巧《提升C++性能的編程技術》,建議C++開發的把書中說的技巧所有掌握。數據庫

 

 

  • 接着說,咱們再說說網絡方面的,首先網絡基礎方面的書籍,我就沒啥推薦了,如今不少計算機學院也開始使用《計算機網絡:自頂向下方法》這本不錯的教材,若是沒有看過的能夠看下。固然仍是那句話你必定要看懂而不是看完。好比三次握手和四次揮手的細節,你必定要很清楚。而後你就能夠找一本網絡編程的實戰書來看下,若是你沒有使用任何socket api編程的經驗,你能夠看看韓國人尹聖雨寫的這本《TCP/IP網絡編程》,這本書從基礎的socket api介紹到比較高級的io複用技術,有很是詳細和生動的例子。若是你是初級水平,強烈建議看看這本書。網絡編程的細節須要注意的地方實在太多了,這本書上都有介紹。不少人尤爲是一些學生,寫了一些能夠相互聊天的小程序就以爲本身熟悉網絡通訊了,可是這類程序拿到互聯網上或者離開局域網,不是鏈接出錯,就是數據老是收發不全。我當年也是這麼過來的,看看這本書,你就能明白許多網絡故障的緣由。等你有了必定的網絡編程之後(熟練使用常見socket API),你能夠看看遊雙的《Linux高性能服務器編程》,這本書給沒有基礎的人或者基礎不紮實的人的感受是,尤爲是書的前三章,這書怎麼這麼垃圾,又把網絡理論書上面的東西搬過來湊字數,可是若是你有基礎再按照書上的步驟在機器上實踐一遍,你會發現,真是一本可貴的、良心的書,桃李不言下自成蹊吧。若是你掌握了這本說上說的這些知識,你再看陳碩老師的《Linux多線程服務端編程》或者去看像libevent這樣的開源網絡庫,你會進一步的獲得提高。這也是我學習網絡編程的一些經驗和經歷吧。注意這裏有必要提一下:像UNP、APUE、還有《TCP/IP詳解》這一類書,若是你未來不是專門作網絡方面的工做或研究,實際上是很是不建議抱着他們看的,由於部頭太大,其次太多理論和Unix的東西,花的時間產出投入比很低的。編程

 

  • 接着說,以上說的都是一些基礎的東西。其實無論是什麼開發,後臺開發也不例外,你都是須要基於特定的操做系統的,這裏不提Windows系統,單單拿linux操做系統來講,既然你選擇作這個方面的開發,你須要熟悉這個操做系統平臺提供的一些經常使用的API函數,網絡通訊方面上文已經說過,除了網絡通訊還有如操做文件、操做內存、字符串操做、進程線程系列、線程同步系列(如互斥體、條件變量、信號量)、管道等經常使用的各類API接口函數。這裏的意思是,不是要你背誦記憶每個接口函數的簽名,而是你要知道什麼時候該用哪一個接口,如何用,有什麼注意事項。我入門的時候看的是Robert Love的《Linux系統編程》,熟悉這我的的應該知道,google的工程師,他還有另一本很是有名的書《Linux內核設計與實現》。小程序

 

 

  • 最後,我強調一下,若是你是快畢業的學生,面臨着找工做的壓力,應該以算法和數據結構爲主。若是你是大一大二或研一這個階段的學生,我上面推薦的書,你仍是能夠考慮好好咀嚼一下。標準是看懂而不是看完。windows

 

 

  • 再補充一些我以爲要成爲高手應該要掌握的東西,先說彙編。雖然第三代第四代語言愈來愈多,硬件性能愈來愈好。可是若是你熟練掌握彙編,你就比其餘人多不少優點,你會能透徹地知道你寫的每一行C/C++代碼背後的機器指令的效率。不管是作安全工程仍是本身技術提高上都是很是不錯的。這裏推薦一本王爽老師的《彙編語言(第3版)》,這本書不厚,語言通俗易懂,你也不用刻意去記憶,基本上當小說書看一下就能很快看完了。彙編實戰類圖書還有另一本《老"碼"識途:從機器碼到框架的系統觀逆向修煉之路》。我我的是很是喜歡這本書的。當年讀這本書的時候,真的有一種「笑看妻子愁何在?漫卷詩書喜欲狂」的感受。儘管那個時候連女友都沒有——!

 

 

另外補充一些我學生時代看過的書吧,我本人是熟悉Windows和linux兩個平臺的開發,這也歸功於我學生時代看過的一些經典書籍,可能有點跑題了,若是不介意,我能夠和你說說:

  • 《Windows程序設計》第五版(第六版之後,這個再也不是用Windows Native API寫C程序了,而是轉到C#平臺上了),這本書是中國第一代程序的windows啓蒙書籍,你所看到的大多數桌面軟件,如QQ,的開發者可能都是經過閱讀這本書啓蒙起來的。

  • 《Windows核心編程》,這本書搞Windows開發的必定都知道這本書的份量。

  • 《linux內核情景分析》毛德操老師的書,很是的實在,另外他寫了一套關於Windows源碼分析的書,這本書是基於開源的「Windows」ReactOS,書名叫《Windows內核情景分析》。

  • 《編譯系統透視:圖解編譯原理》,編譯原理方面的實踐書。

  • 《編程之美》,關於面試的,主要是一些算法和邏輯思惟題實戰。

  • 《重構:改善既有代碼設計》,沒有實際寫代碼經驗不推薦看。

  • 《程序員的修煉之道——從小工到專家》這本書特別推薦學生看一下,能大幅度地提升你實際編碼的技巧和編碼風格。

  • 《代碼整潔之道》同上

  • 《大話設計模式》

  • 《Windows PE文件權威指南》

  • 《Java編程思想》

  • 《Effective C++》系列

  • 《80x86彙編語言程序設計教程》

 

 

總的來看,我學生時代主要是側重基礎知識來讀書的。本科四年、碩士三年,多謝這些書幫助我成長,記得大學畢業的時候,我光讀書筆記就有滿滿十個筆記本。

工做之後,也讀了像redis、netty、分佈式這一類書。可是那都是工做須要吧。因爲我紮實的基礎,固然也多是由於運氣成分吧吧,因此獲得一些注重紮實的技術基礎公司的青睞,給了目前這個階段看起來還不錯的薪資(固然可能還有人比我更厲害,那我這裏就貽笑大方了,因此請不喜勿噴)。同時很是感謝我一路上遇到的公司和同事給個人技術上和生活上的幫助。薪資自己不能說明一我的是否成功,我碼這麼多字,但願廣大的開發者注重基礎,勿在浮沙築高臺。尤爲是學生,你有大把讀書的機會,必定要珍惜大學時光。畢竟工做之後,尤爲是畢業後,面臨着工做、家庭等各類問題,你可能再也沒有心思和完整的時間去學習和提高了。因此前期的積累很重要,畢竟選擇技術這條路,提升技術是升職加薪改善生活水平最直接的方法。最後用我學生時代看到一個技術前輩寫的一首詩來結束吧:

 

仗鼠紅塵已經是癲, 

有網平步上青天。

遊星戲鬥弄日月,

 醉臥雲端笑人間。

七載尋夢像撲火,

 九州誰共我瘋癲?

 

====================================

關於JAVA方面須要看哪些書籍,我會在個人公衆號再開一個專題來介紹。敬請期待,若是您有興趣,也能夠經過下面的公衆號聯繫我。

 

以上是個人經歷,我也曾迷惘和無助過。也有不少朋友找到我,但願我作一些經驗分享和職業規劃指導。爲此我特意開辦了一個微信公衆號『easyserverdev』。若是有任何技術或者職業方面的問題須要我提供幫助,可經過這個公衆號與我取得聯繫,此公衆號不只分享高性能服務器開發經驗和故事,同時也免費爲廣大技術朋友提供技術答疑和職業解惑,您有任何問題均可以在微信公衆號直接留言,我會盡快回復您。

相關文章
相關標籤/搜索