1. 程式人生 > >後臺開發,從基礎到高階,有什麼好的書籍推薦?

後臺開發,從基礎到高階,有什麼好的書籍推薦?

這篇部落格原作者的部落格連結:https://blog.csdn.net/analogous_love

 

首先,我覺得你應該好好準備演算法和資料結構,做到常見的演算法和資料結構知識點都能非常熟悉,這樣的話你畢業求職的時候可以輕鬆拿一些大廠(BAT等)的offer。我本人非科班出身,一畢業之後各種摸爬滾打。

一畢業去大廠個人覺得有兩個好處,

第一,你的收入會比一般的的小公司高很多,小公司招人要求相對低一些,薪資給的也少很多,它們是實實在在招能幹本職工作活兒的人。

第二,你的起點也會比一般進入小廠的同學高。

這裡我是強調演算法和資料結構的重要性。尤其是應屆生求職,更應該去好好準備一下這個,因為這個東西是原理性的基礎。企業在面試應屆生時不會過分要求專案經驗和各種作業系統原理、網路通訊原理之類的東西,而唯一能考察一個人的基本功的就是這個了。

我是社招進大廠,基本上演算法和資料結構這類問題問的比專案經驗本身要多許多。但是社招又不太一樣,因為除了要準備演算法和資料結構以外,還得準備有專案經驗、瞭解作業系統原理、熟悉網路通訊、瞭解資料庫、熟悉要求的各種開源框架和技術等等,實在太多了,即使再怎麼準備也不一定能一舉拿下。相反,應屆生基本上只要好好準備演算法和資料結構的東西,大學其他專業課學的不是太差,這基本上就是進大廠的捷徑。

圖書方面,你可以使用你們計算機專業的相關教材,也可以使用《資料結構與演算法分析:C語言描述》《演算法導論》這一類嚴謹的教材,當然,平心而論我是不敢推薦《演算法導論》的,因為這一本書實在是太大部頭了,沒有好的數學知識,真的很難啃。如果想看一下比較幽默輕鬆類的書,可以看看程傑的

《大話資料結構》

 

其次,如果你學有餘力,可以看看作業系統原理方面的書籍,當然也可以使用你們的教材,我這裡推薦一本我看過的吧,Tanenbaum.A.S《現代作業系統》Tanenbaum是荷蘭人,也是Linux之父Linus Torvalds作業系統方面的啟蒙老師。當然,我的建議是這種書畢竟流於理論知識,也不一定要看完,但一定將一些基礎概念,如程序執行緒記憶體模式等基礎概念看懂理解。你如果還有時間強烈推薦看看俞甲子的《程式設計師的自我修養:連結、裝載與庫》,這本書同時涉及到了Windowslinux兩個作業系統平臺,用各種輔助工具剖析了程式從原始碼到二進位制檔案再到裝載到程序地址空間裡面的各個細節,甚至連程序地址空間中的堆結構、棧結構也分析得清清楚楚,同時也分析了

C RuntimeCRT)、glibc這樣的作業系統介面庫的原理和執行邏輯,是一本實實在在難得的幫你實戰作業系統原理的一本好書。我特別喜歡這個書中序言的一段話:

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

 

再次,你學這些東西是為了將來實踐並有產出的,而落實這個產出的東西就是程式語言,如果是入門,我首推C/C++。你只有熟練使用一門程式語言,你才能將你的想法變成現實。注意這裡我把CC++放在一起,但是嚴格意義上說,CC++還是有點區別的,但是除了語法上的一些細節差異,基本上可以認為是相通的。個人覺得C語言是所有想成為高手最應該使用的入門語言,不要和我說現在很火的pythongo這類語言,玄都觀裡桃千樹,盡是劉郎去後栽。我這裡也推薦一本C語言方面的圖書吧,有興趣的可以參考一下:C語言程式設計:現代方法》。至於譚浩強的書就不要提了,還有就是大部頭的C++ Primer,它雖然是一本好書,但實在是太大部頭了。語法層面的東西學會很快,stl庫的東西需要實戰,也不是翻這類字典一樣的書就能很好地掌握的。當然,如果你想掌握好C++《深度探索C++物件模型》是一定要看的。C++實際編碼技巧還有另外一本非常好的書,介紹了常見的C++編碼技巧《提高C++效能的程式設計技術》,建議C++開發的把書中說的技巧全部掌握。

 

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

接著說,以上說的都是一些基礎的東西。其實不管是什麼開發,後臺開發也不例外,你都是需要基於特定的作業系統的,這裡不提Windows系統,單單拿linux作業系統來說,既然你選擇做這個方面的開發,你需要熟悉這個作業系統平臺提供的一些常用的API函式,網路通訊方面上文已經說過,除了網路通訊還有如操作檔案、操作記憶體、字串操作、程序執行緒系列、執行緒同步系列(如互斥體、條件變數、訊號量)、管道等常用的各種API介面函式。這裡的意思是,不是要你背誦記憶每一個介面函式的簽名,而是你要知道何時該用哪個介面,如何用,有什麼注意事項。我入門的時候看的是Robert LoveLinux系統程式設計》,熟悉這個人的應該知道,google的工程師,他還有另外一本非常有名的書Linux核心設計與實現》

 

最後,我強調一下,如果你是快畢業的學生,面臨著找工作的壓力,應該以演算法和資料結構為主。如果你是大一大二或研一這個階段的學生,我上面推薦的書,你還是可以考慮好好咀嚼一下。標準是看懂而不是看完。

再補充一些我覺得要成為高手應該要掌握的東西,先說彙編。雖然第三代第四代語言越來越多,硬體效能越來越好。但是如果你熟練掌握彙編,你就比其他人多很多優勢,你會能透徹地知道你寫的每一行C/C++程式碼背後的機器指令的效率。無論是做安全工程還是自己技術提升上都是非常不錯的。這裡推薦一本王爽老師的《組合語言(3),這本書不厚,語言通俗易懂,你也不用刻意去記憶,基本上當小說書看一下就能很快看完了。彙編實戰類圖書還有另外一本《老""識途:從機器碼到框架的系統觀逆向修煉之路》。我個人是非常喜歡這本書的。當年讀這本書的時候,真的有一種笑看妻子愁何在?漫卷詩書喜欲狂的感覺。儘管那個時候連女朋友都沒有——

 

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

  • Windows程式設計》第五版(第六版以後,這個不再是用Windows Native APIC程式了,而是轉到C#平臺上了),這本書是中國第一代程式的windows啟蒙書籍,你所看到的大多數桌面軟體,如QQ,的開發者可能都是通過閱讀這本書啟蒙起來的。
  • Windows核心程式設計》,這本書搞Windows開發的一定都知道這本書的分量。
  • linux核心情景分析》毛德操老師的書,非常的實在,另外他寫了一套關於Windows原始碼分析的書,這本書是基於開源的“Windows”ReactOS,書名叫《Windows核心情景分析》。
  • 《編譯系統透視:圖解編譯原理》,編譯原理方面的實踐書。
  • 《程式設計之美》,關於面試的,主要是一些演算法和邏輯思維題實戰。
  • 《重構:改善既有程式碼設計》,沒有實際寫程式碼經驗不推薦看。
  • 《程式設計師的修煉之道——從小工到專家》這本書特別推薦學生看一下,能大幅度地提高你實際編碼的技巧和編碼風格。
  • 《程式碼整潔之道》同上
  • 《大話設計模式》
  • Windows PE檔案權威指南》
  • Java程式設計思想》
  • Effective C++》系列
  • 80x86組合語言程式設計教程》

 

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

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

 

仗鼠紅塵已是癲, 
有網平步上青天。 
遊星戲鬥弄日月, 
醉臥雲端笑人間。 
七載尋夢像撲火,
九州誰共我瘋癲?