精通C++是一個艱巨的任務。為什么C++比別的語言難學這么多?
其實這基本上是因為C++他爹Bjarne Stroustrup說過的一句話“我特別討厭語言的設計者把自己的喜好強加給用戶”(看向go)。
結果C++為了不限制你的想法,于是也就變成了現在這個樣子——包含若干范式,大概有:
面向對象(靈活應用virtual繼承+shared_ptr可以達到java/C#的效果)
模板(這里分兩類,分別為type rich programming和meta programming,區別很大)
函數式編程(如今有了lambda,配合<algorithm>文件,簡直無敵了)
過程式
但是難能可貴的是,這幾種東西在C++混在一起用也是多么的自然。不過,這需要你花時間去掌控他。
那到底有沒有必要真的學到這個地步呢,我覺得跟你的領域是有關系的。譬如說我,基本上算是人格分裂的,因為:
當我搞語言設計和編譯器的時候,我總是會傾向于創造各種小DSL來給自己用,用的都是模板(想想boost的spirit大概就明白我的意思了,雖然我不用它),盡量讓跟我有同樣背景的人一眼能看懂我代碼的意思。
當我做我那個GUI庫(www.gaclib.net)的時候,純粹是用OO和IoC那一套。
當我寫3D渲染程序的時候,我會變成一個為了性能不惜犧牲可讀性的人。
當我是不同的我的時候,我當然只會用C++的一部分來完成我當前的這個任務。這好像是多重標準,但是實際上是由于項目本身的性質而定的。到了這個時候你會覺得,C++真是一門好語言。當你需要為了你的項目放棄不同的部分的時候,C++都能幫你做到。當你需要不同的抽象層次需要不同的性能要求的是,C++還是能夠幫你做到。如果你用別的語言,你最終會發現那個語言只能做某幾類的項目。這是因為,C++能夠自由的讓你放棄某些部分,而別的語言會阻止你放棄某些部分。
為了達到這個層次,你必須進入一個無限接近于精通C++的狀態里,這個時候你才能收放自如,不被C++社區的各種不同的價值觀所捆綁。倘若你的項目非常大,不同的部分有不同的特征的時候(什么,一個沒有遍布全世界的一兩千人寫了20年的程序能叫程序嗎?),就更加需要你有這種本事了。
說到這里,大家大概都明白精通C++大概是個什么感覺了吧——大丈夫能屈能伸。
最近在全職做c++程序的優化,發現這個語言真的是太復雜了。心累,但是非常有挑戰性。我覺得精通c++這件事情是水到渠成的,硬來不行的。
原答案:
-至少一次遇到 "Sorry, feature not implemented"
-至少一次遇到template報錯長到你找不到頭,因為terminal的buffer不夠
-能看懂gcc想表達什么,而不再看gcc字面上寫了什么(clang不算)
-代碼里面看不到new/delete,再敢于用起new/delete
-各種design pattern的好處壞處都能理解
- 跟人在論壇上面大干一架
- 理解“精通c++”這件事情連committe都沒幾個人能做到,每個公司還對這個語言的未來有不同的理解
-放棄“精通c++”這個偉大而艱巨的任務
抖個機靈。其實個人理解,編程要上一個檔次,要多接受不是跟c++直接相關的新知識。我對c++理解有質的飛躍其實是學了OS 和 OCaml/Java了之后一波,上班之后被人code review是一波,修c++的程序又是一波。后面看meyers的書其實意義已經不是很大了。很多時候只是通過那些書了解這個輪子的細節,而不能理解這個輪子到底在那種車上跑,能跑多快,什么時候會散架。
谷歌工程師對C++的掌握有兩個級別:
1.擁有C++的readability(可讀性)認證。通過這個認證需要在實際工作中寫出一個比較復雜的完整的類,然后將這個類提交到一個委員會進行審查,委員會會幫你糾正常見的錯誤,如果你的這個類滿足style guide[1]的所有要求,一兩個星期之后你就可以拿到可讀性認證。一般來說,你需要在實際工作中寫過至少幾千行代碼才能達到這個要求。C++的readability對工程師的意義主要有兩個,一個是熟悉并避免C++的缺陷(比如不要使用iostream和exception),另一個是熟悉一些常用的庫函數(比如string的各種操作,hash_map和smart pointer的使用等)。通過這個認證之后,工程師就有權利在code review中審閱其他人寫的C++程序(注意這個不是readability review)。絕大多數工程師對C++的掌握處在這個水平。
.
2. 顧問級C++程序員。一般需要寫過數萬行C++代碼,用C++實現過比較復雜的系統,熟悉常見的設計模式并在實際工作中應用,對代碼重構有豐富經驗,最重要的是,成為小組以及周圍同事的C++顧問,是同事有C++使用問題時最先想到詢問的人。顧問級C++程序員通常是高級工程師(senior engineer)及以上級別,不僅對某種程序語言,對工作中的各種工程問題也經驗豐富。
其實“精通C++”并不僅僅是熟悉C++本身,你需要對C++需要實現的工程問題和周邊問題同樣精通;而且“精通C++”這種說法是相對的,如果你能成為組里的C++顧問,能夠幫助同事正確使用這種語言有效率地解決工程問題并避免C++的誤區,你就算是精通C++的那個人。
如有問題請聯系我們,我們7*24小時竭誠為您服務