轉自:http://blog.csdn.net/lpstudy/article/details/50980737
閑扯C++道路的經曆
前言
不知道會不會被罵,畢竟作為一個還不能稱為精通C++的人說這些在大神面前總顯得有些班門弄斧了。 周圍有不少的同學朋友程式設計都相對比較差,感覺是缺少一些方法,我把我的曆程經驗貼出來,供大家參考,也歡迎牛人繼續讨論。
大學
大學時候,必修的C,選修的C++,當時就隻知道什麼類呀,繼承啊,多态啊之類的稱呼,根本不能說會用。 寫個Retangle類還行,一碰到實際的需求,還是用C的過程性的描述,外面一大推的全局變量,然後一堆C函數堆砌在一起,就算完成任務了,根本沒有面向對象的思想。後有幸進入一家公司,進行了大約1年半的C++開發。
整個大學完成,會基本的C程式設計,資料結構知識略懂一些,用C實作過基本的資料結構,C++基本沒有用過,知道STL的一些容器的用法。
工作
閱讀底層庫
剛入職的時候,總是充滿着激情,加班不算多,每天都有大量的空閑時間。我們公司有一套1990年左右寫的底層庫,是一個涉及大規模節點保持可靠通信的庫。 過去在學校也沒怎麼看過别人寫的代碼,現在一下子湧出那麼多的代碼,而且寫的那麼好,瞬間感覺自己差距好大。于是晚上下班之後,我的每天的工作就是閱讀公司的底層庫,慢慢的知道了如何實作跨平台的線程,鎖,如何實作多線程之間的消息傳遞,如何進行對象的封裝,如何使用類的多态的特性,如何使用狀态機。因為是一個最原始版本的底層庫,代碼量也不算多,幾千行的樣子,看了好幾周,才完全搞懂内部的流程。 當時感覺寫那個代碼的人真的好nb,這麼複雜的結構都可以設計的出來。
總經理的建議
我有閱讀的習慣,平常周末閑着沒事,就喜歡看看書。 當時有幸和我們的總經理hyy讨論這個庫,總經理特别給我推薦了MFC的實作代碼,其實MFC大學我也看過,但也是淺嘗辄止,當時還裝逼式的買了一本深入淺出MFC,自己還真把他基本看完了,不過隻是看,并沒有真正了解裡面的美妙。 當時總經理特别強調了它裡面用的最好的是宏,他那麼一說,我立刻就反應過來了。确實呀,裡面的動态建立,消息傳遞,運作時類型識别,序列化和反序列化都是用宏實作的,将内部的很多代碼隐藏了起來,就隻需要在類中加入DECLARE(…)這樣的字樣,就可以實作很多特性,這些declare都是宏。 既然總經理大力稱贊,咱必須再次拜讀一下。
重讀深入淺出MFC
有了閱讀開源庫的經曆,我發現再次重讀深入淺出MFC并沒有那麼吃力了,前面講述的虛函數的機制,虛表的一些構成我立刻就心有戚戚焉了,而不是如過去的死記硬背一樣。後面就是關于動态建立,運作時類型識别等等特性的實作機制,我不再像過去那樣,僅僅是閱讀而已,這次我要實作它。 我就按照那本書說的機制,已經書上貼出來的代碼,一點點的敲。書看得很快,一個特性一兩天就可以基本吃透,但是寫代碼自己就慢多了,各種調試錯誤,畢竟書中的代碼是一片一片的,我需要按照自己的感覺将它們整合在一起,自己就會犯各種錯誤。功夫不負有心人,大約1個月的樣子,我把它的所有特性都挨個實作了一遍,總共代碼量有一兩千行的樣子,雖然主要是抄的,但是感覺自己真心學到不少。 這個宏真是太奇妙了,而且還實作的怎麼優雅,那種感覺真的特别好。
看c程式設計語言
這本書大學的時候讀過,當時也寫了不少的代碼,給自己幫助很大,這一次重新讀了一些過去跳過的章節,收獲很豐富。 我建議初學習c++的朋友一定先仔細讀讀這本書,課後習題多做一些。 我自己做不到每題都做,但是書上的例題我全部抄完,課後的習題我選了部分進行了實作。
看設計模式
後面我就開始看設計模式(四人幫的那一本)。很多人都說這本書特别晦澀難懂,說實話,确實有點難度,語言很抽象,比較費勁,雖然書非常薄,但是每一種模式都讓我花了不短的時間才搞定。 有了過去的經驗,我不再滿足于看了,每看完一個模式,我都去實作一種。 當然那種代碼沒有什麼特别的意義,就純粹為了實作而實作,但實作完的感覺就是爽。 現在我已經忘記了自己是否都實作了,常用的我肯定都實作過,而且不隻一遍,大約有10幾種吧。 設計模式是一種思想性的東西,它教會我如何針對一個實際問題,去構造單獨的類,然後設計類内部以及類之間通信的接口,進而給外部提供一個更好的抽象。
看Effective C++
看完設計模式,我又把視角回到了C++的學習上。 大家都說C++程式設計語言是C++最經典的書,我大學的時候買過一本,但是沒怎麼看,感覺太晦澀了。 那難的不行,先選個簡單的看看吧。 于是選了effective C++, 這本書提供了C++程式設計的一些tips,看着真心好,後面公司寫代碼的時候我很多都會參照這些tips去寫代碼,當然也并不是完全照搬的。 這本書有些設計模式的思想和GOF的那本有重疊,讓我對有些設計模式了解的更深入了。 我還買了一本more effective C++,但是讀了前兩章之後,感覺太難讀了,就沒再讀下去。
這中間的工作
這中間我們在一個開源代碼asterisk上進行修改。我主要負責底層dahdi驅動這一層面,當然上層的代碼我也要改。 有很長的一段時間,我都在閱讀asterisk的代碼,代碼是純c語言的,但是整個代碼的架構并不是面向過程,而是面向對象,同時還有繼承,虛函數的思想。 那是我第一次發現c實作面向對象也可以實作的這麼優雅,結構體的嵌套,函數指針作為結構體的成員等等。 後來老大派了一個任務,讓把asterisk的流程梳理一下,這正合我意。 我那一兩周每天就是讀代碼,打日志,跟蹤程式的執行流程,寫了不少的文檔,對c實作面向對象了解的更加深入了。 同時裡面那麼類之間的溝通協作,他們做的非常好,真的很牛。
讀代碼最重要的是真心讀懂,吸收别人的精華,并為我所用。
繼續讀書
後面有兩本書直接将我的c++的能力提升到了一個新的層次。重磅推薦c++程式設計語言以及深度探索C++對象模型。 有了那麼多的讀代碼的經驗,我再看代碼就可以很容易猜出它的意圖了,是以我感覺是時候看c++程式設計語言那本大部頭的書了。 那本書特别厚,我采用的方式是隻看自己感興趣的章節,經常看的時候就發現這和我看過的源代碼的思想有很多重疊,隻不過書中解釋的更清楚,告訴我們它為什麼那麼做,真的很好。 現在依然記得的有異常處理,資源管理建立并配置設定,scoped_ptr,記憶體池,還有設計模式的一些應用,反正看的時候,是各種共鳴,與大學時候一股腦的背書完全是兩碼事。 雖然很厚,我看的很快,很多知道的我直接跳過了。
再後面看了深度探索c++對象模型,這本書又是一本難啃的書。主要講了類,繼承,派生,多态到底是如何實作的,這一下子颠覆我的思維了,過去我一直作為c++的使用者,根本沒有去想這些東西是如何實作的。看了這本書,知道了它的記憶體布局,以及編譯器的處理流程,逼格立刻高了不少,是一本讓我升華的好書。
繼續談工作
後面我的工作轉向了修改sip代碼。 于是下載下傳另一個開源庫,繼續每天的讀代碼,同樣是純c實作的,這次讀起來省力的多了,很多都與自己有共鳴了。看了一部分就能猜出來後面會怎麼實作了。老大知道我擅長搞這個,依然交給我。 我就負責讀代碼,會上報告這個代碼的流程,并給出應該在哪裡修改才能為我們所用。
在後面有一段時間,我迷上了chromium以及webrtc,閱讀了它裡面的很多代碼,這兩個都是c++的,利用很多c++的特性,是以實作起來就比c順暢的多了。有的時候c需要繞個彎才能實作的,c++直接就可以幹。收獲頗豐。
後來
後來我離職了,考了個研,進入了另外一家公司做ios開發。我不喜歡開發界面,在ios組也基本上一直在做用戶端的底層實作。不過那些比起c++開發就容易一些了。現在在讀書,研究方向為分布式存儲編碼容錯,歡迎探讨哈。
總結
對于學習c++,我感覺一個是要練習,多寫代碼,一個是要多讀書,讀經典的書,還有一個是多讀源代碼,吸收别人寫代碼的思想,發現自己寫代碼的不足。 寫代碼是增加自己熟練的程式,做到寫得快;讀書是增加自己的視野,提升自己的能力;看别人的代碼和讀書有相似之處,但是它是以一種直接呈現的方式,是以需要自己細心去體會寫代碼的人的良苦用心,才能真正體會到優秀代碼的美。 這三者要結合在一起才行。學完c++,再學習其他的語言,真的感覺簡單的多。不過我個人建議最好再學習一門腳本語言,我選的是python,看了python基礎教程,同時看了一本計算機程式的構造和解釋(還有兩章沒看),這樣才能對編譯型和解釋型的語言都了解的好一些。
自己沒有統計過寫了多少行的代碼。自我評估大學的時候寫的也就有三四千行的樣子,工作中有兩萬行,現在讀書也就有個1萬行。
認真看過的程式設計書籍清單:
C程式設計語言
C++程式設計語言
effective C++
設計模式Gof
深入探索MFC
header first設計模式
算法導論
資料結構c語言版(大學課本)
Linux程式設計
python基礎教程
java程式設計思想
沒看完整的程式設計書:
計算機程式的構造和解釋
重構
Java核心技術
本人lpstudy,轉載請注明出處 http://blog.csdn.net/lpstudy/article/details/50980737
閑扯C++道路的經曆
前言
不知道會不會被罵,畢竟作為一個還不能稱為精通C++的人說這些在大神面前總顯得有些班門弄斧了。 周圍有不少的同學朋友程式設計都相對比較差,感覺是缺少一些方法,我把我的曆程經驗貼出來,供大家參考,也歡迎牛人繼續讨論。
大學
大學時候,必修的C,選修的C++,當時就隻知道什麼類呀,繼承啊,多态啊之類的稱呼,根本不能說會用。 寫個Retangle類還行,一碰到實際的需求,還是用C的過程性的描述,外面一大推的全局變量,然後一堆C函數堆砌在一起,就算完成任務了,根本沒有面向對象的思想。後有幸進入一家公司,進行了大約1年半的C++開發。
整個大學完成,會基本的C程式設計,資料結構知識略懂一些,用C實作過基本的資料結構,C++基本沒有用過,知道STL的一些容器的用法。
工作
閱讀底層庫
剛入職的時候,總是充滿着激情,加班不算多,每天都有大量的空閑時間。我們公司有一套1990年左右寫的底層庫,是一個涉及大規模節點保持可靠通信的庫。 過去在學校也沒怎麼看過别人寫的代碼,現在一下子湧出那麼多的代碼,而且寫的那麼好,瞬間感覺自己差距好大。于是晚上下班之後,我的每天的工作就是閱讀公司的底層庫,慢慢的知道了如何實作跨平台的線程,鎖,如何實作多線程之間的消息傳遞,如何進行對象的封裝,如何使用類的多态的特性,如何使用狀态機。因為是一個最原始版本的底層庫,代碼量也不算多,幾千行的樣子,看了好幾周,才完全搞懂内部的流程。 當時感覺寫那個代碼的人真的好nb,這麼複雜的結構都可以設計的出來。
總經理的建議
我有閱讀的習慣,平常周末閑着沒事,就喜歡看看書。 當時有幸和我們的總經理hyy讨論這個庫,總經理特别給我推薦了MFC的實作代碼,其實MFC大學我也看過,但也是淺嘗辄止,當時還裝逼式的買了一本深入淺出MFC,自己還真把他基本看完了,不過隻是看,并沒有真正了解裡面的美妙。 當時總經理特别強調了它裡面用的最好的是宏,他那麼一說,我立刻就反應過來了。确實呀,裡面的動态建立,消息傳遞,運作時類型識别,序列化和反序列化都是用宏實作的,将内部的很多代碼隐藏了起來,就隻需要在類中加入DECLARE(…)這樣的字樣,就可以實作很多特性,這些declare都是宏。 既然總經理大力稱贊,咱必須再次拜讀一下。
重讀深入淺出MFC
有了閱讀開源庫的經曆,我發現再次重讀深入淺出MFC并沒有那麼吃力了,前面講述的虛函數的機制,虛表的一些構成我立刻就心有戚戚焉了,而不是如過去的死記硬背一樣。後面就是關于動态建立,運作時類型識别等等特性的實作機制,我不再像過去那樣,僅僅是閱讀而已,這次我要實作它。 我就按照那本書說的機制,已經書上貼出來的代碼,一點點的敲。書看得很快,一個特性一兩天就可以基本吃透,但是寫代碼自己就慢多了,各種調試錯誤,畢竟書中的代碼是一片一片的,我需要按照自己的感覺将它們整合在一起,自己就會犯各種錯誤。功夫不負有心人,大約1個月的樣子,我把它的所有特性都挨個實作了一遍,總共代碼量有一兩千行的樣子,雖然主要是抄的,但是感覺自己真心學到不少。 這個宏真是太奇妙了,而且還實作的怎麼優雅,那種感覺真的特别好。
看c程式設計語言
這本書大學的時候讀過,當時也寫了不少的代碼,給自己幫助很大,這一次重新讀了一些過去跳過的章節,收獲很豐富。 我建議初學習c++的朋友一定先仔細讀讀這本書,課後習題多做一些。 我自己做不到每題都做,但是書上的例題我全部抄完,課後的習題我選了部分進行了實作。
看設計模式
後面我就開始看設計模式(四人幫的那一本)。很多人都說這本書特别晦澀難懂,說實話,确實有點難度,語言很抽象,比較費勁,雖然書非常薄,但是每一種模式都讓我花了不短的時間才搞定。 有了過去的經驗,我不再滿足于看了,每看完一個模式,我都去實作一種。 當然那種代碼沒有什麼特别的意義,就純粹為了實作而實作,但實作完的感覺就是爽。 現在我已經忘記了自己是否都實作了,常用的我肯定都實作過,而且不隻一遍,大約有10幾種吧。 設計模式是一種思想性的東西,它教會我如何針對一個實際問題,去構造單獨的類,然後設計類内部以及類之間通信的接口,進而給外部提供一個更好的抽象。
看Effective C++
看完設計模式,我又把視角回到了C++的學習上。 大家都說C++程式設計語言是C++最經典的書,我大學的時候買過一本,但是沒怎麼看,感覺太晦澀了。 那難的不行,先選個簡單的看看吧。 于是選了effective C++, 這本書提供了C++程式設計的一些tips,看着真心好,後面公司寫代碼的時候我很多都會參照這些tips去寫代碼,當然也并不是完全照搬的。 這本書有些設計模式的思想和GOF的那本有重疊,讓我對有些設計模式了解的更深入了。 我還買了一本more effective C++,但是讀了前兩章之後,感覺太難讀了,就沒再讀下去。
這中間的工作
這中間我們在一個開源代碼asterisk上進行修改。我主要負責底層dahdi驅動這一層面,當然上層的代碼我也要改。 有很長的一段時間,我都在閱讀asterisk的代碼,代碼是純c語言的,但是整個代碼的架構并不是面向過程,而是面向對象,同時還有繼承,虛函數的思想。 那是我第一次發現c實作面向對象也可以實作的這麼優雅,結構體的嵌套,函數指針作為結構體的成員等等。 後來老大派了一個任務,讓把asterisk的流程梳理一下,這正合我意。 我那一兩周每天就是讀代碼,打日志,跟蹤程式的執行流程,寫了不少的文檔,對c實作面向對象了解的更加深入了。 同時裡面那麼類之間的溝通協作,他們做的非常好,真的很牛。
讀代碼最重要的是真心讀懂,吸收别人的精華,并為我所用。
繼續讀書
後面有兩本書直接将我的c++的能力提升到了一個新的層次。重磅推薦c++程式設計語言以及深度探索C++對象模型。 有了那麼多的讀代碼的經驗,我再看代碼就可以很容易猜出它的意圖了,是以我感覺是時候看c++程式設計語言那本大部頭的書了。 那本書特别厚,我采用的方式是隻看自己感興趣的章節,經常看的時候就發現這和我看過的源代碼的思想有很多重疊,隻不過書中解釋的更清楚,告訴我們它為什麼那麼做,真的很好。 現在依然記得的有異常處理,資源管理建立并配置設定,scoped_ptr,記憶體池,還有設計模式的一些應用,反正看的時候,是各種共鳴,與大學時候一股腦的背書完全是兩碼事。 雖然很厚,我看的很快,很多知道的我直接跳過了。
再後面看了深度探索c++對象模型,這本書又是一本難啃的書。主要講了類,繼承,派生,多态到底是如何實作的,這一下子颠覆我的思維了,過去我一直作為c++的使用者,根本沒有去想這些東西是如何實作的。看了這本書,知道了它的記憶體布局,以及編譯器的處理流程,逼格立刻高了不少,是一本讓我升華的好書。
繼續談工作
後面我的工作轉向了修改sip代碼。 于是下載下傳另一個開源庫,繼續每天的讀代碼,同樣是純c實作的,這次讀起來省力的多了,很多都與自己有共鳴了。看了一部分就能猜出來後面會怎麼實作了。老大知道我擅長搞這個,依然交給我。 我就負責讀代碼,會上報告這個代碼的流程,并給出應該在哪裡修改才能為我們所用。
在後面有一段時間,我迷上了chromium以及webrtc,閱讀了它裡面的很多代碼,這兩個都是c++的,利用很多c++的特性,是以實作起來就比c順暢的多了。有的時候c需要繞個彎才能實作的,c++直接就可以幹。收獲頗豐。
後來
後來我離職了,考了個研,進入了另外一家公司做ios開發。我不喜歡開發界面,在ios組也基本上一直在做用戶端的底層實作。不過那些比起c++開發就容易一些了。現在在讀書,研究方向為分布式存儲編碼容錯,歡迎探讨哈。
總結
對于學習c++,我感覺一個是要練習,多寫代碼,一個是要多讀書,讀經典的書,還有一個是多讀源代碼,吸收别人寫代碼的思想,發現自己寫代碼的不足。 寫代碼是增加自己熟練的程式,做到寫得快;讀書是增加自己的視野,提升自己的能力;看别人的代碼和讀書有相似之處,但是它是以一種直接呈現的方式,是以需要自己細心去體會寫代碼的人的良苦用心,才能真正體會到優秀代碼的美。 這三者要結合在一起才行。學完c++,再學習其他的語言,真的感覺簡單的多。不過我個人建議最好再學習一門腳本語言,我選的是python,看了python基礎教程,同時看了一本計算機程式的構造和解釋(還有兩章沒看),這樣才能對編譯型和解釋型的語言都了解的好一些。
自己沒有統計過寫了多少行的代碼。自我評估大學的時候寫的也就有三四千行的樣子,工作中有兩萬行,現在讀書也就有個1萬行。
認真看過的程式設計書籍清單:
C程式設計語言
C++程式設計語言
effective C++
設計模式Gof
深入探索MFC
header first設計模式
算法導論
資料結構c語言版(大學課本)
Linux程式設計
python基礎教程
java程式設計思想
沒看完整的程式設計書:
計算機程式的構造和解釋
重構
Java核心技術
本人lpstudy,轉載請注明出處 http://blog.csdn.net/lpstudy/article/details/50980737