我想,如果是打算走進C++編程的同志們,請好好看完這篇文章,或許,對你的發展有所啟發。但是,不要企圖在這里找到你自己發展的規劃和指定好的發展航向和行程??戳诉@篇文章,能夠收到啟發,受到鼓舞,也就是本文的一個成功的地方了。如果能夠切實的給你指導發展方向,那更是榮幸備至。但是,每個人的興趣都不一樣,所處的環境和條件也因人而異,所以,必定會有與你不完全符合的發展方向指導。正如馬克思一樣,本身是好的,但是如果不中國化,就指導不好實際工作。所以,務必自己化,根據文中的指導建議,結合自身的情況,總結一個可行適合自己發展的道路,然后堅持走下去,只要堅持走到最后,你就會成功的。至于成功的定義,我也曾經思考過,再此就不討論,每個人心里都有自己的成功定義,希望每一位有志者能夠達成心中的成功!
對于C++語言的選擇,很多人也會在疑問,C++是否流行,是否有用,是否一直能夠憑借這一門語言讓自己順風順水,諸如此類。有些人是糊里糊涂的就學了,基本上就是學校開設的課程,就這樣稀里糊涂的開始了,然后迷迷糊糊的結束了,最后都不知道C++有些什么,不過學校里學得C++也確實不能深入到地步。還有一些人是徘徊在學與不學之間,沒有踏出這一步就再思考未來,是否有些太超前,導致什么都要評估一下,最后什么都學不踏實,也學不好,最后總結一個結論就是,學的東西沒用。還有一些人就是,知道C++確實挺強大的,既能深入底層,又能方便開發高級軟件,是因為C++是面向對象和面向過程的綜合體,自然兩者的優點都具備。然后就學了,學了基本語法,然后學了面向對象,然后學了點高級點的模板等,然后就覺得學完了,不知道再繼續學什么了。 這些情況,多數人都經歷過。作為使用C++作為主要開發語言的我,自然也經歷了這些。也有很多朋友問我這些問題,到底如何發展,如何學習?我當然也是給予了一定的指導,也主要是結合我的經歷和思考總結,給了一些基本的指導,能夠幫助他們,讓他們找到前進的方向,不再和我以前一樣,走太多的彎路,受過太多的煎熬。感受到他們的笑容和隨之的謝謝,我是多么的欣慰,因為我切切實實的幫助了一個志同道合的人,也正是因為他們,我才不覺得孤獨,也慢慢發現,像我這樣的經歷的人很多,也有不少的正在朝著這個方向走來。我也不可能一個個的指導,簡單幾句話也說不清楚,因此就在本文中詳細說說,希望能夠給予那些急切需要指導的正在奮斗的朋友一些指導。 鑒于被咨詢的眾多朋友的情況,有在校的學生,甚至還有高中生(這個讓我很驚訝,也很高興,也有點慚愧,因為高中我也萌生對計算機的興趣,但是沒條件學習,慚愧的是,他們都已經開始接觸和學習了編程,比我當年可是先進了好遠。),還有研究生,還有沒上過大學的,還有很低學歷的。正因如此,我才感受到,指導的必須性。有些朋友,我也是因為很忙,也就沒有仔細的去指導,雖然鼓勵了也給出了一些基本的建議,其實我更希望能夠掏心掏肺的把我能夠指導建議的都告訴他們。如果你要問我為什么要這樣做,我只想給一個理由,那就是,我走了太多的彎路,以至于一路那么艱辛,也一路那么孤獨,所以,我盡量使他們不再重蹈覆轍,能夠集中更多精力和得到更多的鼓舞,一道前行。 我始終相信一點,興趣才是源源不斷的驅動力,這個由我的經歷已經見證了這一事實,我還會繼續保持下去。那些咨詢我的朋友,基本上也是因為興趣而學習的,所以我更是覺得有必要指導。雖然我水平不夠高,但也正是以一個初學者和入門者以及自學者的角度,才能讓他們切切實實的得到清晰的方向。那下面就詳細說說C++發展方向和學習指導,只是建議,更多結合自身的情況。 C語言和C++語言的關系,請參考《C語言和C++語言的關系對比分析》。下面針對如何學習C++做些分析和建議。C++的學習必須沉下心,這是我反復強調的,請務必記好,當你在猶豫時,請用這句話提醒自己。其實做人和C++一樣,沉不下心是做不好的。 學習編程,與學歷沒有關系,與專業也沒有關系,與性別年齡也沒有關系,只要你想學,是真的感興趣,就能夠學好。當然,為了避免少走彎路,請多借鑒他人的經驗和建議,比如看到本文,也是讓自己少走彎路的一個明智的做法。還有,也有人問數學不好,編程能不能學好?這個問題其實和學歷是同一類問題。大家這么問,其實就是對于編程了解的不夠。只要你是正常人,有著正常的思維邏輯,都是可以學編程的。當然,如果是有興趣,則會學得更好。如果再加上有人指導,那就更好了。 但是,事實并沒有這么美好。但是,可以編程的最基本的條件,想必你一定滿足吧,否則你也不會在著了看這么長的文章了。同時,能夠看到文章這里,說明你確實對編程感興趣,那么我就要恭喜你了,因為這幾個條件你都滿足了。我相信,你再沉下心,你一定能夠成為優秀的程序員,同時,你的生活也會變得更加精彩。 為什么說有正常的思維邏輯就能夠學編程了呢?當然,編程的基本語法,只要你找到一本合適的書,或者有一個好人指導你,這是不成問題的。當然,如果暫時都沒有,網上這么多資源,這么多信息,你絕對能夠找到你要的信息。很幸運的是,你再看到本文時,你已經找到了一個合適的指導你的有用的信息,或者是我這個指導你的人吧。我不敢談什么編程的藝術,因為我自己還不夠層次,但是我有我自己的思考,我有我自己的想法。 所謂編程,就是編寫一個按照我們思維運行的程序。所以其核心就是,我們的思維。編程的邏輯就是我們的思維邏輯。編程不僅是要從生活中的思維中加以利用,再學習別人的經驗時,你還會學到更多的思維,開闊自己的思維,更好的指導自己的生活。然后進一步優化自己的編程思維,循環往復。如果對生活經驗喜歡總結抽象的人,總是能夠比較快的找到解決問題的方法,因為解決問題就是解決生活中的問題,而這個編程邏輯也就來自于生活,所以,通過編程,有時會讓我們更好的理解生活中的一些,從而得到更多的樂趣。 當然,這只是一個最基本的條件,光有這些思維,并不能讓自己真的就能成為合格的程序員。否則,全世界的人都是程序員了。但是全世界的人都是有成為程序員的潛力,除非是植物人之類的,沒有正常思維的人。下一步,我們就是要學好編程的工具。這樣我們才能真正成為程序員。這個工具就是編程語言。至于什么語言,到了最后其實并不重要,但是為了長遠的發展,我建議學習C++,特別適合在校學生。因為在校生可以利用充足的時間來學習基礎。當然其他人只要花大量的時間來學,也是一樣的,只不過是在工作之余,更辛苦些,但是,有興趣,其實也不是很辛苦的。真正的辛苦其實是有一大堆疑問卻無人可問的時候。如果怕辛苦,那就不要學編程了。 為什么我建議學習C++語言呢?當然不是因為我的一味的喜好。對于編程語言本身,要在工作和以后的發展中,你必須學會一些基本的東西。面向過程是所有語言的基礎,面向對象是現在開發的必備基礎,而模板和泛型編程,又是很多語言直接或間接實現的高級工具,java也用容器,C++的STL中也有容器,其實本質就是一個,只不過,Java可能對其進行了封裝,提供了更多的特性而已,但是思想和本質是一樣的。同時,因為Java對其進行了封裝,你要學會使用它是很容易的,但是要深入了解就不那么容易了,因為封裝了,就變得復雜了。而C++則是直接的暴露,很原始的。只有學懂了容器,才能真正用好,而Java即使不懂也能用的很好,這也是前面說的Java上手快深入難,而C++則是上手難,深入簡單。容器的本質都弄明白了,用法就再簡單不過了,然后學其他深入的也變得很簡單了。要是再去用Java的容器,直接秒掉。也真是因為C++提供了這么多的特性,作為長遠的發展,一次性把這些全部學會,融匯貫通,語言就不是阻礙你前行的絆腳石了。再學其他東西,幾乎就不費吹灰之力了。所以,對于語言,把C++的每個部分學好,就不要在語言級別上糾纏,那就是要發展到系統級別了。也只有在系統級別精通,那就是很優秀的程序員了。當然,在各個應用方面,也是成為優秀的人才的,但是,系統必須很精通,否則,總會欠火候。不管什么時候,你編寫的程序,都是在系統運行的,你不可避免這個問題,當然在你腦子里運行的程序就不在此討論范圍了。 學習C++,如果是初學者,不管是在校學生,還是畢業了的,還是低學歷的,或者沒有讀過書的,也不管是以前學過的,還是沒學過的,或者以前學過C的,請都仔細學習一遍《C++ PRimer Plus》這本書,這本書是針對初學者的,講解很詳細很全面,一步一步的解釋,程序實例并不做枯燥的數學運算,而是生活的小例子,從而增加興趣和降低難度。這本書七百多頁,因為我C語言基礎扎實,也學過了Java的面向對象的思想(當初學Java就是去學面向對象的思想的),然后花了一個月,把這本書仔細的學了,當然,面向過程部分就很多略過了,和C語言基本一樣,只是參看不一樣的地方。書中每一個字都看的很仔細,包括書后的習題都基本練習了,結果也正確。不過后面的高級部分,因為當時基礎不夠,所以就沒有一個個做了,只是了解其思想。但是,如果沒學過C語言,也不要緊,那就直接學習這本書吧。這本書學完后,如果要進階,可以學習《高效C++》。然后你就知道語言部分你還需要學什么了?,F在不要問,學完后你自然知道還需要學什么。 當然,學的時候,動手編程是必不可少的,不動手是學不好的,書上的練習,盡量都做出來,不要查答案,也不必對答案,你獨立思考,解決問題了,符合要求,就是答案。編程中沒有標準答案,千萬不要束縛自己的思維。實在做不出來可以參考答案和提示,分析好后再根據思想,重新做,而不是默寫代碼,千萬不要默寫代碼,而是根據答案中的思想去實現,這樣才能真的學會動手編程,因為這問題是有朋友問過我的,他說自己對著書寫的出來,不看書就寫不出來,問題就出在這里,我當時沒有仔細分析,因為沒時間,希望他能看到這個吧。自己根據思想寫出來了,你就真的掌握了思想的精髓,也就可以靈活的變通了,而不是像培訓班里讓學員默寫代碼,那是一種很可笑的做法。但是,要經常寫代碼,把這些思想用熟,讓它成為自己的思想,這樣就成功了。以后就不會沒有思路了,因為思想已經轉化為自己的了。 到這里,語言方面的學習問題都解釋清楚了。下一部分的發展方向就是操作系統。對于操作系統,先不是編程的問題了,而是操作系統的原理問題。這是優秀的程序員必須掌握的知識。不要覺得這些原理枯燥,也不要覺得那些思想過時了,書中的思想是沒有過時的,雖然簡單,但是現在的系統都是基于這些基本思想的。如果這些基本思想都不了解,更別說去學習現在的系統了,那簡直就是噩夢。理解了書中的理論還不夠,必須同時轉變自己的思維,以操作系統的運行邏輯來看操作系統,而不是依你的思維來看,因為它是已經存在的東西,即使不合理,它也存在,你必須接受,而不是你覺得應該怎么樣,除非你自己去寫一個操作系統,來制定它的規則。至于學習的書,可以參考湯子灜的《計算機操作系統》。這是所有操作系統的通用理論。然后你可以去學習《Windows程序設計》和《Windows核心編程》深入學習Windows編程知識,或者學習linux系統等,當然,如果真心想深入研究,建議學習Linux系統,因為它是開源的,你能看到系統所有內核的代碼,深入學習,而Windows是封閉的,你看不到。不過,如果你要在Windows平臺上發展和找工作,那建議學習好,學好后還可以對比學習Linux系統,更好的理解它,從而更能提升操作系統的知識水平,而不限于哪一種操作系統。然后就是各種應用級別的,比如圖形方面的,網絡通信方面的,等等。但是系統是它們的基礎,所以必須先學好,才能更好的學習它們,當然這是建議,可以根據自己的情況做調整。 文中列出的書,除基礎理論的書《計算機操作系統》外的其他編程書籍,在我們網站都可以直接免費下載電子版本閱讀。都是經典書籍,如果喜歡,可以支持作者,可以買正版書籍平時參考,而不是記住書中的所有東西。 然后就是最現實的問題。學完了首先是要找工作。當然,我們學習的目的不是找工作,千萬也不要是找工作,如果只是為了找工作而學C++,那我請你三思。不是找不到工作的問題,也不是工資的問題,而是,C++是一門比較難的語言,不是一下子就能學好的,急于求成只會欲速則不達。但是,愿意花時間學好,當然也是能夠找到工資不錯的工作的。C++方面的工作不是沒有,是公司找不到水平高的C++的人才。半桶水是搞不好C++的,所以要學好,工作是沒問題的,不學好,也不要說C++沒前途,只能說自己學的還不夠。至于工資的高低,是跟技術水平成正比的,技術含量高的,工資自然高,需要投入的時間和精力就自然多,這個毋庸置疑。所以,不要懷疑C++找不到工作的問題,只要懷疑自己學好了沒有的問題。同樣也不要懷疑工資高低的問題,只要懷疑自己水平高低的問題。 當然,C++基礎學好了,還是不夠的。它只是一門語言而已,僅此而已,不要把它想得太神圣了。真正能夠發揮最好的作用的,還是要與平臺結合,還有學會其他的開發工具,比如框架,類庫什么的。初學者一般都是從事Windows開發,當然也有準備從事Linux開發,對于服務器方面的開發,基本上是用Linux了。所以根據自己的發展方向,進行選擇吧。不管是哪個系統平臺,操作系統的基礎理論必須學好,因為它是所有目前操作系統的通用理論。然后再分別深入學習。Linux方面的我水平不夠,雖然學過了Linux系統,也在自己的電腦裝過Windows/Linux雙系統,但是也只是限于Linux系統的使用層面,開發層面不清楚。學習Linux系統的使用,可以參看《鳥哥的私房菜》,編程方面自己網上查閱。我主要說說Windows方面的,因為多數人還是從事Windows平臺的開發。 語言不是問題了,但是在開發項目時,卻是遠遠不夠的。開發項目是要高效率解決實際問題的。因為公司是盈利的,并且還要最大化盈利,是不允許什么都從頭做起,當然是有工具可以借鑒時是不允許這樣的,但是沒有時則還是要從頭做起。鑒于Windows是微軟的操作系統產品,因此,工具最好還是使用微軟的。因為這樣的話,可以和系統做到最高效的對接,提高程序的效率和兼容問題。在平常開發中,使用的開發工具則推薦使用Visual Studio 2010旗艦版(在我們網站可以下載),開發時使用MFC(微軟基礎類庫)。MFC覆蓋了編程中所有的方面。當然,在這之前,需要學習Windows編程,也就是API編程,因為MFC有些功能是API的簡單封裝,簡單的意思就是把一個API函數放在MFC函數中,將API函數需要的句柄作為MFC類中的一個成員變量,從而減少了函數的一個參數。僅此而已。還有的功能,根本就沒有MFC類或者類成員函數對應,因此就必須使用API函數來解決。同時MFC是一個類庫,還是一個程序框架。 所謂的程序框架,就是將Windows程序的流程進行了封裝,然后在MFC中可以輕松的編程而不用關注內部很多細節。有人會說MFC開發的程序效率很低,我之前也聽信了他們的看法。其實,我現在倒不這么覺得。說它效率低是因為MFC是一個框架級別的,因此考慮問題都是很高很遠的,自然,有些方面就要考慮到很全面,自然也就對程序添加了很多一般用不上的東西,導致程序效率變低。之前我也是這么認為了的,從而產生了對MFC的鄙視,相信從底層開發更能體現技術。但是這種想法是錯誤的。效率低不低,其實不關工具的問題,表面上看,確實如此,如果以默認向導配置生成了一個程序,自然會加入很多不必要的東西,程序效率自然變得低了,但是,如果是一個高手,很精通MFC,自然,每個部分是干什么的摸得一清二楚,試想,編出來的程序能低嗎?我想,因為是跟操作系統同源,所以執行效率更高,因為很多東西可以直接是系統的內核的東西,而其他類庫,因為Windows是封閉的,不能夠做到深入內核的一些東西,因此就使用用戶態的東西模擬內核的,因此效率也就變低了寫。就像Java的虛擬機運行程序,如果能在Windows中的程序直接運行,免掉了中間的轉換,自然效率就高了。這里的討論是很模糊的,只是告訴大家,真正精通了,就不存在效率低的問題,如果是菜鳥,再好的寶劍也發揮不出功效。所以,從現在起,希望大家糾正一個思維,工具沒好壞,只有開發者水平高低的問題,就想玩游戲的,沒有不好的游戲角色,只有豬一樣的玩家,道理是一樣的。所以也請務必正確的看待這些開發工具。再實際的開發中,我們還必須學好用好一個或者多個工具,同時還要深入,要精通。 而在學習MFC之前,當然C++必然是要學好的,同時Windows API編程也必須學好。MFC只有C++才能使用的類庫,有些初學者還不知道,我當初開始接觸也不清楚。當然這都是建議,可以根據實際情況調整。當然,如果這兩個不先學好,MFC想要學好就真難了,MFC就像C++一樣,也是博大精深的。因為涵蓋了C++、Windows,還有MFC本身的文檔視圖結構和一些其他的機制,直接學MFC,不可想象。Windows的學習,可以看《Windows程序設計》,MFC初學可以學《MFC Windows程序設計》。這些都是適合初學者的。MFC的深入可以學習侯捷的《深入淺出MFC》。這些都學好了,基本的開發都不成問題了。 要想進一步學習,就要學習更多具體領域的開發,就要學更多的東西了。再此先推薦學一下STL(C++的標準模板庫)和Boost庫,這些庫在實際開發中經常使用。MFC中有容器庫,比如CArray,它是先于STL出現的,有很久的歷史了,也很好用,想Java的容器使用一樣,很方便。但是真要學好容器,還是學習STL。STL是后來添加到C++的,是一個標準的模板庫,當然容器也是標準的,不同的容器有不同的分類,而不是想MFC的容器庫一樣,一個容器類實現了各種容器,使用起來方便,可是理解起來就不是那么容易了。STL中vector和map是不同的容器,用法也不一樣,所以,學會STL,你就能夠很清楚容器的內部原理,使用起來就得心應手。容器的內部構造就是數據機構中的東西,比如樹,鏈表等,正是這些結構,才使得容器可以很容易實現了動態增長,和各種特性。然后STL中的各種算法,當然是與容器分開的,通過適配器將容器和算法連接起來,使算法可以操作容器,這也就是泛型編程的思想的結果。算法中則是數據結構中的算法作為基礎,STL強調效率第一,而這些算法都是世界頂級大師的杰作,效率上絕對是杠杠的。因為注重效率,因此在錯誤控制上就很少,所以使用時務必注意,否則出現的錯誤你都看不懂。而STL是基于模板的,因此,想要學好STL,C++的模板需要有深入的學習,還有數據結構的知識。當然,C++的其他基礎知識也是必要的。數據結構學習的推薦書目是嚴蔚敏的《數據結構》。這本書比較難得理解,但是書中講解的很精練,初學者要準備學不止一遍的心理準備,兩遍三遍都是很必須的。即使有人指導,即使有老師講解,真正的學會和領悟到精髓,還需要自己深入的理解和動手實踐,而不是知道了鏈表如何添加一個節點那么簡單。各種算法不是只是明白了就完事了,需要將其中的精髓吸收,簡化到最簡單,自己能夠輕易的實現。或者自己最算法再加以改造,進一步提高效率。要知道,書中的算法都是人想出來的,千萬不要相信權威,要挑戰權威,說不定,下一版印刷,那個算法就是你的了。當然,STL只是初學者加深的一個選擇,建議學好。即使暫時不學,把MFC中的容器類學會了,使用上是沒有問題的,想要做到出神入化,得心應手,那就必須學習這些東西了。STL就說這么多,然后就是具體的領域的學習,數據庫開發的學習,計算機圖形(GDI)開發、網絡開發(Socket編程)等等,這些就根據公司需要做什么就學什么。但是最好之前就有些基本的,而不是什么也不知道,這樣對于自己在公司的發展是很不利的,至于為什么,大家以后自然會明白。 這些的學習,首先要學習基本的理論,比如,網絡開發,TCP/ip協議都不知道,肯定不能開發一個好的程序的,知道了基礎理論后,再學習相應的編程開發知識,用到什么學什么。此部分說的各個領域的可以先了解基礎,然后再用到再學,但是,前面說的基礎,必須是工作之前就要掌握,否則,工作中就有得你受了。不要簡單的聽信別人說什么不要等什么都學好的再去工作,但是我要告訴你,不要一點基礎都沒有就去工作,這是我的坎坷的經歷告訴我的真理。請相信我這一句忠告吧。 至于C++程序員更遠點發展方向,則不是初學者需要考慮的問題了。先把這些該學的東西學到了,以后自然也會明白自己想往哪方面走的。如果我有幸能夠思考清楚這些問題,我會再給大家分享我的經驗,那時不是指導,只是分享心得了,因為大家那時也都是高手了,大家彼此彼此。我會一直陪著大家,堅持走到最后,我希望,大家都有一個好的發展方向和成果。 最后,務必提醒一句,學習C++是長期的,必須沉下心,不浮躁,急功近利是學不好的,浮躁了請停下腳步,回歸本真,然后重整靈魂,繼續前進。祝愿大家每一個都會成為大神,也使國家貢獻自己的一份強有力的貢獻。 很佩服你能堅持看完,我想你也會有所收獲,我相信你也會成功。如果還有疑問,請直接評論中提出,有不正確的或者不準確的地方,請指正,虛心求教。
新聞熱點
疑難解答
圖片精選