1. 程式人生 > >程式設計師修煉之路(十)程式設計師必讀經典書籍和成長路線

程式設計師修煉之路(十)程式設計師必讀經典書籍和成長路線

1、C++ / Java 和麵向物件 
   
  我個人以為學好C++,Java也就是舉手之勞。但是C++的學習曲線相當的陡。不過,我覺得C++是最需要學好的語言了。參看兩篇趣文“C++學習信心圖” 和“21天學好C++” 
   
  學習(麻省理工免費課程)C++面向物件程式設計 
  讀我的 “如何學好C++”中所推薦的那些書至少兩遍以上(如果你對C++的理解能夠深入到像我所寫的《C++虛擬函式表解析》或是《C++物件記憶體存局(上)(下)》,或是《C/C++返回內部靜態成員的陷阱》那就非常不錯了) 
  然後反思為什麼C++要幹成這樣,Java則不是?你一定要學會對比C++和Java的不同。比如,Java中的初始化,垃圾回收,介面,異常,虛擬函式,等等。 
  實踐任務: 
  用C++實現一個BigInt,支援128位的整形的加減乘除的操作。 
  用C++封裝一個數據結構的容量,比如hash table。 
  用C++封裝並實現一個智慧指標(一定要使用模板)。 
  《設計模式》必需一讀,兩遍以上,思考一下,這23個模式的應用場景。主要是兩點:1)鍾愛組合而不是繼承,2)鍾愛介面而不是實現。(也推薦《深入淺出設計模式》) 
  實踐任務: 
  使用工廠模式實現一個記憶體池。 
  使用策略模式製做一個類其可以把文字檔案進行左對齊,右對齊和中對齊。 
  使用命令模式實現一個命令列計算器,並支援undo和redo。 
  使用修飾模式實現一個酒店的房間價格訂價策略——旺季,服務,VIP、旅行團、等影響價格的因素。 
  學習STL的用法和其設計概念 - 容器,演算法,迭代器,函式子。如果可能,請讀一下其原始碼。 
  實踐任務:嘗試使用面向物件、STL,設計模式、和WindowsSDK圖形程式設計的各種技能 
  做一個貪吃蛇或是俄羅斯方塊的遊戲。支援不同的級別和難度。 
  做一個檔案瀏覽器,可以瀏覽目錄下的檔案,並可以對不同的檔案有不同的操作,文字檔案可以開啟編輯,執行檔案則執行之,mp3或avi檔案可以播放,圖片檔案可以展示圖片。 
  學習C++的一些類庫的設計,如: MFC(看看候捷老師的《深入淺出MFC》) ,Boost, ACE, CPPUnit,STL (STL可能會太難了,但是如果你能瞭解其中的設計模式和設計那就太好了,如果你能深入到我寫的《STL string類的寫時拷貝技術》那就非常不錯了,ACE需要很強在的系統知識,參見後面的“加強對系統的瞭解”) 
  Java是真正的面向物件的語言,Java的設計模式多得不能再多,也是用來學習面向物件的設計模式的最佳語言了(參看Java中的設計模式)。 
  推薦閱讀《Effective Java》 and 《Java解惑》 
  學習Java的框架,Java的框架也是多,如Spring, Hibernate,Struts 等等,主要是學習Java的設計,如IoC等。 
  Java的技術也是爛多,重點學習J2EE架構以及JMS, RMI, 等訊息傳遞和遠端呼叫的技術。 
  學習使用Java做Web Service (官方教程在這裡) 
  實踐任務: 嘗試在Spring或Hibernate框架下構建一個有網路的Web Service的遠端呼叫程式,並可以在兩個Service中通過JMS傳遞訊息。 
  C++和Java都不是能在短時間內能學好的,C++玩是的深,Java玩的是廣,我建議兩者選一個。我個人的學習經歷是: 
   
  深究C++(我深究C/C++了十來年了) 
  學習Java的各種設計模式。 
  2、加強系統瞭解 
   
  重要閱讀下面的幾本書:
 
   
  《Unix程式設計藝術》瞭解Unix系統領域中的設計和開發哲學、思想文化體系、原則與經驗。你一定會有一種醍醐灌頂的感覺。 
  《Unix網路程式設計卷1,套接字》這是一本看完你就明白網路程式設計的書。重要注意TCP、UDP,以及多路複用的系統呼叫select/poll/epoll的差別。 
  《TCP/IP詳解 卷1:協議》- 這是一本看完後你就可以當網路黑客的書。瞭解乙太網的的運作原理,瞭解TCP/IP的協議,運作原理以及如何TCP的調優。 
  實踐任務: 
  理解什麼是阻塞(同步IO),非阻塞(非同步IO),多路複用(select, poll, epoll)的IO技術。 
  寫一個網路聊天程式,有聊天伺服器和多個聊天客戶端(服務端用UDP對部分或所有的的聊天客戶端進Multicast或Broadcast)。 
  寫一個簡易的HTTP伺服器。 
  《Unix網路程式設計卷2,程序間通訊》訊號量,管道,共享記憶體,訊息等各種IPC…… 這些技術好像有點老掉牙了,不過還是值得了解。 
  實踐任務: 
  主要實踐各種IPC程序序通訊的方法。 
  嘗試寫一個管道程式,父子程序通過管道交換資料。 
  嘗試寫一個共享記憶體的程式,兩個程序通過共享記憶體交換一個C的結構體陣列。 
  學習《Windows核心程式設計》一書。把CreateProcess,Windows執行緒、執行緒排程、執行緒同步(Event, 訊號量,互斥量)、非同步I/O,記憶體管理,DLL,這幾大塊搞精通。 
  實踐任務:使用CreateProcess啟動一個記事本或IE,並監控該程式的執行。把前面寫過的那個簡易的HTTP服務用執行緒池實現一下。寫一個DLL的鉤子程式監控指定視窗的關閉事件,或是記錄某個視窗的按鍵。 
  有了多執行緒、多程序通訊,TCP/IP,套接字,C++和設計模式的基本,你可以研究一下ACE了。使用ACE重寫上述的聊天程式和HTTP伺服器(帶執行緒池) 
  實踐任務:通過以上的所有知識,嘗試 
  寫一個服務端給客戶端傳大檔案,要求把100M的頻寬用到80%以上。(注意,磁碟I/O和網路I/O可能會很有問題,想一想怎麼解決,另外,請注意網路傳輸最大單元MTU) 
  瞭解BT下載的工作原理,用多程序的方式模擬BT下載的原理。 
  3、系統架構 
   
  負載均衡。HASH式的,純動態式的。(可以到Google學術裡搜一些關於負載均衡的文章讀讀) 
  多層分散式系統 – 客戶端服務結點層、計算結點層、資料cache層,資料層。J2EE是經典的多層結構。 
  CDN系統 – 就近訪問,內容邊緣化。 
  P2P式系統,研究一下BT和電驢的演算法。比如:DHT演算法。 
  伺服器備份,雙機備份系統(Live-Standby和Live-Live系統),兩臺機器如何通過心跳監測對方?叢集主結點備份。 
  虛擬化技術,使用這個技術,可以把作業系統當應用程式一下切換或重新配置和部署。 
  學習Thrift,二進位制的高效能的通訊中介軟體,支援資料(物件)序列化和多種型別的RPC服務。 
  學習Hadoop。Hadoop框架中最核心的設計就是:MapReduce和HDFS。MapReduce的思想是由Google的一篇論文所提及而被廣為流傳的,簡單的一句話解釋MapReduce就是“任務的分解與結果的彙總”。HDFS是Hadoop分散式檔案系統(Hadoop Distributed File System)的縮寫,為分散式計算儲存提供了底層支援。 
  瞭解NoSQL資料庫(有人說可能是一個過渡炒作的技術),不過因為超大規模以及高併發的純動態型網站日漸成為主流,而SNS類網站在資料存取過程中有著實時性等剛性需求,這使得目前NoSQL資料庫慢慢成了人們所關注的焦點,並大有成為取代關係型資料庫而成為未來主流資料儲存模式的趨勢。當前NoSQL資料庫很多,大部分都是開源的,其中比較知名的有:MemcacheDB、Redis、Tokyo Cabinet(升級版為Kyoto Cabinet)、Flare、MongoDB、CouchDB、Cassandra、Voldemort等。