小白學習大型C++源碼項目系列之基礎準備階段

學校課程總是從理論出發,作業項目都看不出有什麼實際作用,不如從工作中的需求出發。

基礎的東西經過很長時間積累而且還會在未來至少10年通用。

一定要動手,例子不管多麼簡單,建議至少自己手敲一遍看看是否理解了裏頭的細枝末節。

一定要學會思考,思考爲什麼要這樣,而不是那樣。還要舉一反三地思考。

以後的趨勢是前端是Web+移動,後端是Linux+開源。

學習一門腳本語言,例如Python,腳本語言可以讓你很快開發出能用得上的小程序

學會用各種print之類簡單粗暴的方式進行調試

學會用Google (phrase, domain, use reader to follow tech blogs)

Vim / Emacs / Notepad++,學會如何配置代碼補全,外觀,外部命令等。

Source Insight (或 ctag)這些編輯器在查看、修改代碼/配置文章/日誌會更快更有效率。

學會使用man來查看幫助

文件系統結構和基本操作 ls/chmod/chown/rm/find/ln/cat/mount/mkdir/tar/gzip …

學會使用一些文本操作命令 sed/awk/grep/tail/less/more …

學會使用一些管理命令 ps/top/lsof/netstat/kill/tcpdump/iptables/dd

瞭解/etc目錄下的各種配置文章,學會查看/var/log下的系統日誌,以及/proc下的系統運行信息

瞭解正則表達式,使用正則表達式來查找文件

重新學C語言,理解指針和內存模型,用C語言實現一下各種經典的算法和數據結構。推薦《計算機程序設計藝術》、《算法導論》和《編程珠璣》。
學習(麻省理工免費課程)計算機科學和編程導論
學習(麻省理工免費課程)C語言內存管理
學習Unix/Linux系統調用(Unix高級環境編程),,瞭解系統層面的東西。
用這些系統知識操作一下文件系統,用戶(實現一個可以拷貝目錄樹的小程序)
用fork/wait/waitpid寫一個多進程的程序,用pthread寫一個多線程帶同步或互斥的程序。多進程多進程購票的程序。
用signal/kill/raise/alarm/pause/sigprocmask實現一個多進程間的信號量通信的程序。
學會使用gcc和gdb來編程和調試程序(參看我的《用gdb調試程序》)
學會使用makefile來編譯程序。(參看我的《跟我一起寫makefile》)
IPC和Socket的東西可以放到高級中來實踐。
學習Windows SDK編程(Windows 程序設計 ,MFC程序設計)
寫一個窗口,瞭解WinMain/WinProcedure,以及Windows的消息機制。
寫一些程序來操作Windows SDK中的資源文件或是各種圖形控件,以及作圖的編程。
學習如何使用MSDN查看相關的SDK函數,各種WM_消息以及一些例程。
這本書中有很多例程,在實踐中請不要照抄,試着自己寫一個自己的例程。
不用太多於精通這些東西,因爲GUI正在被Web取代,主要是瞭解一下Windows 圖形界面的編程。@virushuo 說:“ 我覺得GUI確實不那麼熱門了,但充分理解GUI工作原理是很重要的。包括移動設備開發,如果沒有基礎知識仍然很吃力。或者說移動設備開發必須理解GUI工作,或者在win那邊學,或者在mac/iOS上學”。

學會使用SVN或Git來管理程序版本。
學習C語言和Java語言的coding standard 或 coding guideline。(我N年前寫過一篇關C語言非常簡單的文章——《編程修養》,這樣的東西你可以上網查一下,一大堆)。
推薦閱讀《代碼大全》《重構》《代碼整潔之道》

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等。
寫了那麼多,回顧一下,覺得自己相當的有成就感。希望大家不要嚇着,我自己這十來年也在不斷地學習,今天我也在學習中,人生本來就是一個不斷學習和練級的過程。不過,一定有漏的,也有不對的,還希望大家補充和更正。(

1)有朋友奇怪爲什麼我在這篇文章開頭說了web+移動,卻沒有在後面提到iOS/Android的前端開發。因爲我心裏有一種感覺,移動設備上的UI最終也會被Javascript取代。大家可以用iPhone或Android看看google+,你就會明白了。

2)有朋友說我這裏的東西太多了,不能爲了學習而學習,我非常同意。我在文章的前面也說了要思考。另外,千萬不要以爲我說的這些東西是一些新的技術,這份攻略裏95%以上的全是基礎。而且都是久經考驗的基礎技術。即是可以讓你一通百通的技術,也是可以讓你找到一份不錯工作的技術。

3)有朋友說學這些東西學完都40了,還不如想想怎麼去掙錢。我想告訴大家,一是我今年還沒有40歲,二是學無止境啊,三是我不覺得掙錢有多難,難的是怎麼讓你值那麼多錢?無論是打工還是創業,是什麼東西讓你自己的價值,讓你公司的價值更值錢?別的地方我不敢說,對於互聯網或IT公司來說,技術實力絕對是其中之一。

4)有朋友說技術都是工具,不應該如此癡迷這句話沒有錯,有時候我們需要更多的是擡起頭來看看技術以外的事情,或者是說我們在作技術的時候不去思考爲什麼會有這個技術,爲什麼不是別的,問題不在於技術,問題在於我們死讀書,讀死書,成了技術的書呆子。

5) 對於NoSQL,最近比較火,但我對其有點保守,所以,我只是說了解就可以。對於Hadoop,我覺得其在分佈式系統上有巨大的潛力,所以需要學習。 對於關係型數據庫,的確是很重要的東西,這點是我的疏忽,在原文裏補充。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章