很多讀者都問過一個問題:程序員如何實現高速成長?之前也寫過相關的文章,強調的主要是夯實計算機體系基礎知識。
再說另一個訣竅:多看經典開源項目,這些項目大多是眾多頂尖程序員智慧的結晶,通常都有著不錯的架構和代碼實現。甚至有可能的話,在深入理解某個開源項目之后,最好能參與開源項目的研發。
拿我自己舉例,本來是個C++菜雞,后來因為在360遭遇領導被調崗,從菜雞狀態就被推到部門技術專家的位置,當時差點就把團隊玩廢了。
好在無意中發現了可以通過看開源代碼快速成長,于是每天半夜瘋狂研究,才平穩過關。
經典開源代碼無論是架構還是實現,都充滿了編程之美,學習優美的代碼能最快速度找到前進的方向。
今天也給大家推薦幾個很不錯的C++開源項目:
1.TinyWebServer
這是一個幫助初學者快速實現網絡編程、搭建屬于自己的輕量級Web服務器的小項目。
項目雖小但真的五臟俱全:
- 使用線程池、非阻塞Socket、epoll(ET/LT均實現)、事件處理(Reactor及模擬Proactor)的并發模型。
- 使用狀態機解析HTTP請求報文,支持解析GET和POST請求
- 訪問服務器數據庫實現web端用戶注冊、登錄功能,可以請求服務器圖片和視頻文件
- 實現同步/異步日志系統,記錄服務器運行狀態
- 經Webbench壓力測試可以實現上萬的并發連接數據交換
代碼地址:
https://github.com/qinguoyi/TinyWebServer
2. OpenSSL
一個強大的安全套接字層密碼庫,加密HTTPS,加密SSH都賊好用,同時它還可以用于跨平臺密碼工具。
OpenSSL實現了以下功能:
- 數據保密性:信息加密就是把明碼的輸入文件用加密算法轉換成加密的文件以實現數據的保密。加密的過程需要用到密鑰來加密數據然后再解密。
- 數據完整性:加密也能保證數據的一致性。例如:消息驗證碼(mac),能夠校驗用戶提供的加密信息,接收者可以用MAC來校驗加密數據,保證數據在傳輸過程中沒有被篡改過。
- 安全驗證:加密的另外一個用途是用來作為個人的標識,用戶的密鑰可以作為他的安全驗證的標識。SSL是利用公開密鑰的加密技術(RSA)來作為用戶端與服務器端在傳送機密資料時的加密通訊協定。
代碼地址:
https://www.openssl.org/source
3.log4cpp
一個支持多線程、重定向的強大日志庫,精簡的代碼實現絕對能讓你有所收獲。
Log4cpp有以下優點:
- 提供應用程序運行上下文,方便跟蹤調試
- 可擴展的、多種方式記錄日志,包括命令行、文件、回卷文件、內存、syslog服務器、Win事件日志等
- 可以動態控制日志記錄級別,在效率和功能中進行調整
- 所有配置可以通過配置文件進行動態調整
- 支持JAVA、C++、C、Python等多種語言
代碼地址:
http://log4cplus.sourceforge.net
4.Chromium
這個開源代碼學習起來難度較大,光是編譯通過都要花費不力氣,但的確值得好好學習。
還記得我從初中級工程師進化到高級工程師就是在一個個通宵研讀Chromium代碼中度過的。
Chromium的確夠復雜,比如Chromium的多進程架構圖:
chromium的代碼目錄包含這些模塊:
base:通用代碼集合基礎組件實現庫,包含字符串、文件、線程、消息隊列等工具類集合。
cc:負責渲染繪制,chrome為什么高效就是因為有它。chrome:瀏覽器界面模塊,大量調用了cc提供的接口。
content:多進程沙盒瀏覽器莫款,管理多進程和多線程。
gpu,OpenGL封裝實現:CommandBuffer和OpenGL的兼容支持模塊。
net:網絡功能實現模塊。
media:多媒體封裝代碼,實現視頻播放等功能。
mojo:跨語言(C++ / Java / JavaScript)跨平臺的進程間對象通信模塊,類似AIDL的功能。
skia:圖形庫。
third_party:排版引擎。
ui:UI庫。
ipc: 網絡進程通信模塊。
v8,V8 JavaScript 引擎庫。
以上每一個模塊要想真正理解,都得花很大的功夫,簡單用一張圖來說明以上模塊的關系:
代碼地址:
https://chromium.googlesource.com/chromium/src.git
講真,如果你是C++技術棧,把以上四個小項目學會,基本就是C++高級工程師水平了。
當年我看完這些代碼瘦了好幾斤,還流了不少鼻血,真的是一點點硬啃下來的。
今天就分享這么多了,如果大家覺得不錯,別忘記點贊,點贊可以的話,下一期出一個Java開源項目合集哈。






