學習 C++ 編程,怎麼才能找到合適的練手項目?
卡馬克曾說過:只要有一台計算機,一個linux安裝盤,和網路,就能學到任何想學的計算機技術。現在我們的學習條件遠勝於以前,CSDN上有各種基礎教程,編程書籍也更加豐富,有更多的可以學習的開源項目。儘管資料如此的豐富,但還是進步緩慢。
學習編程快2年了,我現在的編程水平很尷尬,按照coolshell博客主的C++學習建議,讀了C++primer這樣的基礎書,寫了一些類似腳本語言解析這樣的簡單的代碼,但讀到effective C++時,就覺得很多條款中說的東西離我很遙遠,根本沒機會用到。感覺從C++新手到會用C++獨立開發的跨度太大。自從用C++之後感覺編程水平再也沒進步過,在windows上要寫出帶界面的程序還的去看windows via c/c++等書,但是就算看完也很難寫出以前用C# WPF幾行代碼就能實現的界面效果。主要問題還是代碼量不夠,我能找到的開源C++項目幾乎都看不懂,請問有沒有類似TankCode這樣適合練手又有意思的項目?大家可能把我當做大一的新手了,介紹的項目有點太基礎,C# php java nodejs C++的項目我都做過。其實我是想問怎麼才能達到能從簡單的web伺服器到寫出 陳碩 muduo庫那樣的水平,想靠自學到達能熟練使用C++的特性編程境界,有沒有適合學習的開源項目?這個問題的答案我已經知道了。目前在看LevelDB的源碼,以及一些簡短的C源碼,例如:Webbench,httpsqs,還有 序列化與反序列化 Protocol Buffers
內存分配 tcmalloc
外存 LevelDB網路編程 Redis
有一些比較好的開源框架可以學習,比如:
- Webbench
Webbench是一個在linux下使用的非常簡單的網站壓測工具。它使用fork()模擬多個客戶端同時訪問我們設定的URL,測試網站在壓力下工作的性能,最多可以模擬3萬個並發連接去測試網站的負載能力。Webbench使用C語言編寫, 代碼實在太簡潔,源碼加起來不到600行。
下載鏈接:GitHub - EZLippi/WebBench
- Tinyhttpd
tinyhttpd是一個超輕量型Http Server,使用C語言開發,全部代碼只有502行(包括注釋),附帶一個簡單的Client,可以通過閱讀這段代碼理解一個 Http Server 的本質。
下載鏈接:GitHub - EZLippi/Tinyhttpd。
- Libev
libev是一個開源的事件驅動庫,基於epoll,kqueue等OS提供的基礎設施。其以高效出名,它可以將IO事件,定時器,和信號統一起來,統一放在事件處理這一套框架下處理。基於Reactor模式,效率較高,並且代碼精簡(4.15版本8000多行),是學習事件驅動編程的很好的資源。
下載鏈接:http://software.schmorp.de/pkg/libev.html
- Memcached
Memcached 是一個高性能的分散式內存對象緩存系統,用於動態Web應用以減輕資料庫負載。它通過在內存中緩存數據和對象來減少讀取資料庫的次數,從而提供動態資料庫驅動網站的速度。Memcached 基於一個存儲鍵/值對的 hashmap。Memcached-1.4.7的代碼量還是可以接受的,只有10K行左右。
下載地址:memcached - a distributed memory object caching system
- SQLite
SQLite是一個開源的嵌入式關係資料庫,實現自包容、零配置、支持事務的SQL資料庫引擎。 其特點是高度便攜、使用方便、結構緊湊、高效、可靠。足夠小,大致3萬行C代碼,250K。
下載地址:SQLite Home Page 。
- 高性能鍵值對存儲系統antirez/redis · GitHub,支持主從同步,支持的數據結構和操作比memcached多,現在使用越來越廣泛
- Google的鍵/值對(Key/Value Pair)嵌入式資料庫google/leveldb · GitHub
這個網站整理的比較全,可以看看值得推薦的C/C++框架和庫
主要問題還是代碼量不夠,我能找到的開源C++項目幾乎都看不懂。
========
代碼量不夠不是重點,你需要的不是學習語言,也不是學習開源項目,而是基本功。基本功太爛,源碼當然幾乎都看不懂。比如CSAPP,algorithms 4th,tcpip詳解之類的。不然你去看nginx源碼之類的,一定會滿頭包。基本功的書都很枯燥,而且花時間,但你遲早要看的。基本功要修鍊到 知其所以然。比如,談到紅黑樹,STL,nginx,innodb,linux內核都用到了,你知道分別用來幹嘛嗎?或者反過來,你知道nginx用了哪些數據結構,分別用來幹嘛?學習很多時候都是「無趣」的,不經歷無趣的學習你永遠也做不了有趣的工作。最後,我覺得c++最有趣的是寫一個正則引擎,或者存儲引擎。學習一門語言,最好寫一些不用它不行的東西,比如上面那倆。貪吃蛇什麼語言不能寫,垃圾代碼寫再多也沒用,在CodeProject上有很多適合初學練手的例子除了在網上找,其實也可以自己設計自己實現一個小程序,比如某個小遊戲,這樣不僅能鍛煉自己,還可以從中獲得很多開發的樂趣參考俄羅斯方塊http://www.chenlq.net/tag/%e4%bf%84%e7%bd%97%e6%96%af%e6%96%b9%e5%9d%97貪吃蛇http://www.chenlq.net/tag/%e8%b4%aa%e5%90%83%e8%9b%87
復刻你看得到的東西。比如寫個俄羅斯方塊什麼的,不停地復刻。
第一:你學的書過於基礎了,帶不了你什麼真正的項目需求
第二:你說你離某些技巧越來越遠,就證明你寫代碼都是沒有效率過代碼質量的問題。
第三:看不懂c++項目,證明你還是不過關的,不要懷疑,這就是事實。第四:項目不是有沒有趣的,你需要做的就是用戶需求的東西,而不是你想做的。去了解一下你身邊不懂電腦的人,一般需要什麼軟體或者是助手之類的,嘗試做一個可以滿足他們的軟體。GUI的話,就直接用WPF唄,為什麼要綁在C++上呢。學習編程最好是練習編碼,越複雜的項目越鍛煉,如果天天寫demo之類的小程序,變著花樣寫也沒用啊。所以在公司的平台里容易成長嘛,因為公司的代碼是幾個人寫的,就算新項目也會很快複雜起來,程序複雜起來才能學到東西啊。
我原來跟你有相同的困惑,看一些大部頭的書,但是學完一點忘一點,根本什麼都沒剩下,建議你要是想進行圖形化的開發可以看看MFC,或者直接用qt,再不然就學習ACM,用C++寫演算法
超威
如果只是尋找項目的,可以看這裡Github C++ Topic ,其中最高贊的那個項目fffaraz/awesome-cpp推薦了很多
個人觀點來看對於初學要加強基礎比如操作系統、數據結構有助於分析問題理解問題,至於看不懂開源代碼原因很簡單,開始必須選擇簡單的小項目看,書上講的內容大多是一些基本的東西,開源項目中會應用很多書上的語言技巧和擴展的特性,如果你看明白了你可能會茅塞頓開,原來可以這樣用,原來訪問內存需要控制內存對齊,原來還支持這樣的功能,初學者甚至一些中級程序員一般是語言本身還不夠熟,這些東西不是說看一般的書能看會的,編程書一般介紹都是基礎內容。對項目首先要分清大致項目的文件結構,分清主次,逐步弄清楚處理流程,看你需要的重點地方,理解設計思想和一些有用的編程技巧。
推薦閱讀:
※沒參加過ACM如何訓練數據結構與演算法能力?
※未接觸過編程的妹子希望通過做小項目來學習編程,有哪些類型的項目比較適合?
※先學什麼編程語言比較好 你們有沒有後悔過?
※為什麼我覺得Python的學習很沒有條理?
※非計算機專業的程序員能達到什麼樣的高度?