C++學到什麼程度才能叫精通?

羅鎮鴻


當你能自如的運用數據結構和算法、TCP/IP原理、編譯原理、操作系統原理、數據庫以及Win32API調用、構造自己的C++庫(網絡庫、數學庫、測試庫、圖形庫)以及各種引擎,出去畢業應該能在短短半年時間裡薪水至少有7000以上甚至上萬吧(其實畢業生出去95%以上可能沒達到這個水平)。  其實也不用說太多,你問你自己幾個問題,如果你都能做到或者學習半到2個月就能做到,那肯定是達標了:  1、我能用C++做出2D的RPG遊戲嗎?(C++與api或框架的結合運用能力)  2、我能用C++通過3種以上的方法寫出四則運算表達式分析器嗎?(C++與數據結構、算法的結合能力)  3、我能用C++寫出類似STL的簡化版的庫嗎?(庫與框架設計能力與C++高級語法運用能力的結合)  補充:  ①、你能這麼問,說明你知道編程能力對IT行業高薪工作的重要性是至關重要的。  ②、你的目的性已較強(知道要深入下去),但是你也想有更加明確的目標,我可以給你講一下怎麼自己去尋找目標和路線以及怎樣學習。  ③、計算機專業領域一共有幾個大方向,十幾個分支方向,而每個分支方向又有幾十個小方向,每一個方向的深入學習與熟練到一定火候都不是一朝一夕,互相之間也不是完全沒聯繫的,但是你現在就應該選擇一個大方向並在其中的一個小方向內深入(為什麼要這麼早就選擇具體的分支方向?後面說)。  ④、這裡列出計算機的幾個大方向(非編程開發類的我就不說了):  基本方向:  1、單片機、嵌入式方向  2、網絡編程:涉及到服務器程序、客戶端開發、腳本設計等。  3、系統編程:基礎API開發、桌面開發、系統程序開發、服務程序  4、圖形學:3D、2D、圖像識別、人臉識別  5、音頻:語音識別、音頻解碼、音頻軟件  6、編譯原理:編譯器設計、腳本解釋器、虛擬機、非自然語言翻譯系統  7、應用層開發:利用高層語言去開發表層應用  8、安全:反工程、病毒、反病毒、木馬、反木馬、軟件破解、軟件加殼  附加方向:  8、人工智能:遺傳算法、神經網絡、灰色系統等等  9、遊戲設計:各種遊戲引擎設計以及業務邏輯設計等  ⑤、基本方向是你一定要選的,附加方向只是基於基本方向的一些錦上添花,但是不管你怎麼選,最開始某些東西一定要深入而不是隻是懂就夠(當然你對自己要求似乎不會很低),我把這個列出來:  數據結構:下面其他理論的基礎。  操作系統原理:理解操作系統的架構和細節,你才能對以後關於多線程、文件管理、內存管理、指令優先級等有一個正確理解和運用。  編譯原理:能夠昇華你對計算機編程語言的理解,對以後出現的各種編譯、解釋、兼容、移植、優化、併發與並行算法等有一個深入理解。  數據庫系統原理:這個是進入公司都要會的,也是大型軟件開發的基礎。  軟件工程:這個是你能夠在經驗不足還能保證大項目正常完成的理論基礎。  網絡技術:這個是必須學的,因為目前幾乎沒有一款裝幾率很高的軟件或者平臺跟網絡無關。  數學的話,主要是:離散數學、線性代數、高等數學、計算機圖形學、概率論  以上幾個基礎就是你成為一個融匯各個主要分支牛人必須學的(當然不是指理論,而是理論+實踐編碼能力)  ⑥以上都是大的基礎,要一一攻破並深入學習,雖然網絡時代計算機專業知識爆炸式的增長,但是以上幾個基礎掌握後,會發現,以後的什麼新的理論和技術都是基於這些大基礎,你就很容易理解了。  ⑦我為什麼開頭不講你要具體學什麼怎麼順序學呢?因為那些技術你要掌握的話,根本可以自己解決,但是如果你由於興趣,沉迷於一些自己可見的小範圍技術的話,那麼畢業後雖然也能找到不錯的工作,薪水也可能高,但是不能成為一個大牛。  現在才開始講學習順序,雖然你說不要推薦書,不過我還是要用書來做順序。  C語言是可以寫很多核心和高級的東西,而不只是小東西,但是從你代碼來看,居然用到了goto,我不是說你那些程序用到GOTO有什麼不好,而是一定要避免用GOTO,goto是錯誤之源,如果你有什麼內容非要用到goto才能寫到,說明你的編碼技巧還有不少提高空間。  你的學習順序應該是:  C:做一個超級馬里奧出來,並能夠讀取文本腳本來更新關卡。  C++:寫一個2D圖形引擎,封裝掉細節,實現面向對象設計和可複用設計,並且用到《設計模式》中提到的一些設計模式,這樣才能算對C++有一個很好的掌握。  MFC:MFC技術雖然近期已經冷下來了,但是你能熟練掌握它,才能證明你的C++OO技術夠純熟,嚴格證明你掌握了MFC很簡單,你只要用MFC做出一個殺毒引擎就差不多了。推薦的書有《深入淺出MFC》。  《Windows程序設計》:和MFC不同的是,用的是windows核心SDK,也就是API,這本書學完後,你才能從操作系統層面上算掌握了win32平臺下的機理(其實win64和win32大部分機理類似)。  C#:C#裡集合了當代和前沿計算機科學裡最先進的一些語法(雖然執行效率一直被人質疑),但是你學完C#並深入後,至少能夠算是對計算機語言有一個更加深刻的理解了。如何證明你C#學的不錯了?也很簡單,再次寫一個隨便什麼遊戲,比如俄羅斯方塊。如果更加證明自己呢?用它寫一個P2P網絡對戰遊戲。  (如果你注意的話,會發現我說的學習順序都是沿著語言和某些技術的,為什麼呢?因為這些語言和技術涉及到特定的領域技術和計算機理論思想,比如【真正】學完了C#的話,就不單指學完了C#,而是把多種語言範式都學習了一遍,以及現代的程序開發思維(因為裡面用到了很多讓你一勞永逸的技術))  以上5個步驟都是基礎大步驟,要解決的話要沒1-2年應該不夠。  與此同時,要儘快選出文中你感興趣的方向作為3-5年的長期方向,不要擔心過早選擇分支方向會有什麼損失,因為計算機很多分支是相通的,只有你把分支方向深入進去,才能真正理解很多理論的實踐意義。並且一旦你在某個分支領域形成了較強的優勢(比如,到公司裡只有你這方面最強),那麼你就是稀缺人才。  關於大方向的步驟就不說了,你主要就是要把我說的這幾個基礎步驟先解決,同時平時要注重大方向理論結合實際去編碼和開發。  如果只是看了一本經典的C++教材,基本上也就只能做一個基於控制檯的的“圖書管理系統或者類似而的東西”,而真正需要的東西往往總是與一些其它東西結合的。  比如如果要做一個Windows程序員,首先肯定要會開發Windows下的GUI程序,這就涉及了兩個常用工具――MFC和.netframework。關於MFC有兩本經典的書,候俊傑的《深入淺出MFC》和孫鑫的另外一本,如果要學習.netframework,那麼不妨順便學習一下C#,經典書籍無疑是《C#入門經典》。順便說一下,有了C++的基礎,C#的語言部分基本上兩三天就能熟悉了。  Windows程序員如果要對操作系統更加的熟悉,肯定還要了解Win32API。無論是MFC還是VB、.netframework其本質都是對API的封裝,在對API的瞭解過程中,可以更深刻的理解Windows的運行機制。這裡推薦的無疑是《Windows核心編程》  如果需要開發Windows平臺下比較底層的程序,比如RamDisk、殺毒軟件、防火牆等,那麼就又有兩個必學的課題了。一個是Win32彙編,一個是基於C/C++的驅動程序編寫。Win32彙編的書無疑就是羅雲彬的《琢石成器》,而驅動程序的書實在是太少了,將WDM的書可能還有一兩本算是經典,WDF就是開玩笑了。  如果要用C++開發Windows下的遊戲,那麼DirectX無疑是一個必學項目。  如果要用C++開發嵌入式系統,那麼當然要看看單片機和ARM的書籍了(順便說一下,單片機程序基本上都用匯編或者C語言來寫)  如果是編寫用於Linux的GUI程序,那麼就有必要了解幾個流行的GUI庫。QT、GTK+、wxWidgets是其中最優秀的幾個。順便說一下,QT還是跨平臺的,一次編寫,然後就可以編譯到Linux、Windows、Mac不同的系統中。關於QT的書這裡推薦《C++GUIQt4編程》,官方教材。  如果是編寫涉及網絡的程序,比如說類似eMule這樣涉及應用層協議的東西,那麼首先學習一下網絡的基本知識是很必要的,這裡推薦的是《計算機網絡:自頂向下方法》  最後再加一些比較根本的東西:算法。算法始終是軟件的靈魂,經典教材有《算法導論》和《具體數學》等  C++的高級技巧。一般的C++通用教材不會涉及的,而在實踐中又會遇到的某些很彆扭的、比較難回答的問題。這類涉及C++高級技巧的書,最經典的無疑是《EffectiveC++》,另外關於C語言的《C陷阱和缺陷》、《C專家編程》也不錯。


甘肅農村小潘潘


C++語言學透是不可能學透的,這輩子不可能學透的,C又不會用,就只有學學C++,維持上班不忘記這樣子。

每天晚上我都要學習C++,就只有網上找找女朋友,我才會不去看看C++這樣子,可我找不到,學C++時候感覺各個知識點都好難,比找女朋友難多了,學C++時候又只有我一個人學,他們都組團一起去學java了,一個人孤單學習也找不到女朋友一起玩。

去學java之後感覺各個都很有趣,寫的又簡單,還很容易實現,超喜歡java的。

剛畢業一兩年時候,還能天真無知說著自己,熟悉C++,甚至說精通C++,而工作為五六年,卻發現自己都還不配說自己精通。這輩子都感覺不會精通C++了,畢竟C++在你學習時候也在悄然迭代,就跟社會一樣,你猛地追趕,最後才發現你永遠慢人一步,學會了放下。

越難得到的東西越忘不了,好比越渣的人越令人牽腸掛肚,所以放棄吧,你永遠不可能精通C++,能做的就是熟練跟上這個磨人小妖精的步伐。

最新C++資源用起來吧。這些資源關注我私聊發送:“C”就可以獲得啦,記得關注私聊哦。

C/C++詳細圖解

資源

輕鬆掌握C語言視頻教程(會打字就能學會) 對應1、2、3、4知識點。

C++基礎完整視頻 對應1、2、3、7知識點

C語言數據結構 培養架構師思維 對應4、5、6知識點

C++核心編程_打造你的核心編程技能 對應1-9知識點

QT界面開發 對應1、2知識點

MFC 對應3知識點

linux系統編程 對應上面所有。

服務器開發之linux網絡編程 對應所有。

最後的實戰項目網上一搜一大把


這些資源關注我私聊發送:“C”就可以獲得啦,記得關注私聊哦。


黑馬程序員


很有意思的問題,作為一個主要使用C++做開發超過十年的老碼農,來聊聊我個人的一點看法。


這麼說吧,C++是一門極度複雜的語言,而且隨著新標準的提出,這種複雜性還在不斷的增加中,所以說什麼程度算是精通C++語言,其實是一個無法給出明確答案的問題。比如就我來說,使用了十多年的C++,可以輕鬆的使用C++設計一個方案並實現,比如用它實現過圖像處理SDK,也用它做過IDE開發,即使如此,我也不敢說自己已經精通C++。原因很簡單,你對這門語言的理解越深,也就越能發現諸多的不足,既包括自己的不足,也包括語言本身的缺陷與不足。舉個簡單的例子,我最開始學習的標準是C++98,可是後來又出現了C++03、C++11、C++14,甚至還有C++17,對於這些新標準出提出的內容,說實話,有些聽過,有些甚至都沒有聽說過,更別說在實際應用中使用了,以此來說很難算是精通C++了。


不過話又說回來,有很多使用了多年C++的程序員,有著和我類似的情況,他們可以輕鬆的使用C++開發一個應用程序,但是C++中依然有他們未曾觸碰的領域。所以我認為C++語言變得越來越複雜,想要完全掌握除了編譯器和C++語言專家,其他人是可望而不可及了,要不然就連Linux之父——Linus Torvalds也會炮轟C++,說它是一門糟糕(horrible)的語言。


綜上,我認為想要給出一個明確的精通C++語言的標準,是一件費力不討好的事情,學習任何語言都是為了解決實際問題,所以只要你能夠使用C++語言開發出好的應用,你就是一個合格的C++程序員。下面是幾條熟練使用C++的需要掌握的技能:

1、最基本的要求自然是熟練掌握C++的基本語言,包括常用的和不常用的;

2、因為C++是一種面向對象的語言,所以要掌握面向對象程序(OOP)設計思想;

3、能夠使用C++描述常用的數據結構,並實現在這些數據結構上的各種操作;

4、理解C++對象模型,比如對象指針、虛函數表等內容,以及類的構造過程,以及在此過程中編譯器會在背後做那些事情等等;

5、能夠使用C++做程序設計,這裡除了基本的OOP思想外,最重要的是熟練應用設計模式;

最後,再對C++發一點牢騷,雖然我還在使用C++做開發(部分任務已經使用其它語言),但是我認為C++是一門尷尬的語言。談效率吧,它不如C語言簡單直接;談面向對象設計吧,它又不如C#、Java等純粹;談開發效率吧,它又不如Python高效……太多的功能如模板、智能指針、多重繼承等讓這門語言變的越來越複雜,所以我是越來越不喜歡C++,並且建議程序員不要將C++作為首選開發語言。


分享到:


相關文章: