Javascript是世界上最受誤解的語言,其實C++何嘗不是。坊間流傳的錯誤的C++學習方法一抓就是一大把。我自己在學習C++的過程中也走了許多彎路,浪費了不少時間。
為什么會存在這么多錯誤認識?原因主要有三個,一是C++語言的細節(jié)太多。二是一些著名的C++書籍總在(不管有意還是無意)暗示語言細節(jié)的重要性和有趣。三是現(xiàn)代C++庫的開發(fā)哲學必須用到一些犄角旮旯的語言細節(jié)(但注意,是庫設計,不是日常編程)。這些共同塑造了C++社群的整體心態(tài)和哲學。
單是第一條還未必能夠成氣候,其它語言的細節(jié)也不少(盡管比起C++起來還是小巫見大巫),就拿Javascript來說,作用域規(guī)則,名字查找,closure,for/in,這些都是細節(jié),而且其中還有違反直覺的。但許多動態(tài)語言的程序員的理念我猜大約是學到哪用到哪罷。但C++就不一樣了,學C++之人有一種類似于被暗示的潛在心態(tài),就是一定要先把語言核心基本上吃透了才能下手寫出漂亮的程序。這首先就錯了。這個意識形成的原因在第二點,C++書籍。市面上的C++書籍不計其數(shù),但有一個共同的缺點,就是講語言細節(jié)的書太多——《C++ gotchas》,《Effective C++》,《More Effective C++》,但無可厚非的是,C++是這樣一門語言:要拿它滿足現(xiàn)代編程理念的需求,尤其是C++庫開發(fā)的需求,還必須得關注語言細節(jié),乃至于在C++中利用語言細節(jié)已經(jīng)成了一門學問。比如C++模板在設計之初根本沒有想到模板元編程這回事,更沒想到C++模板系統(tǒng)是圖靈完備的,這也就導致了《Modern C++ Design》和《C++ Template Metaprogramming》的驚世駭俗。
這些技術的出現(xiàn)為什么驚世駭俗,打個比方,就好比是一塊大家都認為已經(jīng)熟悉無比,再無秘密可言的土地上,突然某天有人挖到原來地下還蘊藏著最豐富的石油。在這之前的C++雖然也有一些細節(jié),但也還算容易掌握,那可是C++程序員們的happy old times,因為C++的一切都一覽無余,everything is figured out。然而《Modern C++ Design》的出世告訴人們,“瞧,還有多少細節(jié)你們沒有掌握啊。”于是C++程序員們久違的激情被重燃起來,奮不顧身的踏入細節(jié)的沼澤中。尤其是,模板編程將C++的細節(jié)進一步挖掘到了極致——我們干嘛關心涉及類對象的隱式轉(zhuǎn)換的優(yōu)先級高低?看看boost::is_base_of就可以知道有多詭異了。
但最大的問題還在于,對于這些細節(jié)的關注還真有它合適的理由:我們要開發(fā)現(xiàn)代模板庫,要開發(fā)active library,就必須動用模板編程技術,要動用模板編程技術,就必須利用語言的犄角旮旯,enable_if,type_traits,甚至連早就古井無波的C宏也在亂世中重生,看看boost::preprocessor有多詭異就知道了,連C宏的圖靈完備性(預編譯期的)都被挖掘出來了。為什么要做這些?好玩?標榜?都不是,開發(fā)庫的實際需求。但這也正是最大的悲哀了。在boost里面因?qū)嶋H需求而動用語言細節(jié)最終居然能神奇的完成任務的最好教材就是boost::foreach,這個小設施對語言細節(jié)的發(fā)掘達到了驚天地泣鬼神的地步,不信你先試著自己去看看它的源代碼,再看看作者介紹它的文章吧。而boost::typeof也不甘其后——C++語言里面有太多被“發(fā)現(xiàn)”而不是被“發(fā)明”的技術。難道最初無意設置這些語言規(guī)則的家伙們都是Oracles?
因為沒有variadic templates,人們用宏加上缺省模板參數(shù)來實現(xiàn)類似效果。因為沒有concepts,人們用模板加上析構(gòu)函數(shù)的細節(jié)來完成類似工作。因為沒有typeof,人們用模板元編程和宏加上無盡的細節(jié)來實現(xiàn)目標… C++開發(fā)者們的DIY精神不可謂不強。
然而,如果僅僅是因為要開發(fā)優(yōu)秀的庫,那么涉及這些細節(jié)都還是情有可原的,至少在C++09出現(xiàn)并且編譯器廠商跟上之前,這些都還能說是不得已而為之。但我們廣大的C++程序員呢?大眾是容易被誤導的,我也曾經(jīng)是。以為掌握了更多的語言細節(jié)就更牛,但實際卻是那些語言細節(jié)十有八九是平時編程用都用不到的。C++中眾多的細節(jié)雖然在庫設計者手里面有其用武之地,但普通程序員則根本無需過多關注,尤其是沒有實際動機的關注。一般性的編碼實踐準則,以及基本的編程能力和基本功,乃至基本的程序設計理論以及算法設計。才是真正需要花時間掌握的東西。
學習最佳編碼實踐比學習C++更重要??磧?yōu)秀的代碼也比埋頭用差勁的編碼方式寫垃圾代碼要有效。直接、清晰、明了、KISS地表達意圖比玩編碼花招要重要…
避免去過問任何語言細節(jié),除非必要。這個必要是指在實際編程當中遇到問題,這樣就算需要過問細節(jié),也是最省事的,懶惰者原則嘛。一個掌握了基本的編程理念并有較強學習能力的程序員在用一門陌生的語言編程時就算拿著那本語言的圣經(jīng)從索引翻起也可以編出合格的程序來。十年學會編程不是指對每門語言都得十年,那一輩子才能學幾門語言哪,如果按字母順序?qū)W的話一輩子都別指望學到Ruby了;十年學習編程更不是指先把語言特性從粗到細全都吃透才敢下手編程,在實踐中提高才是最重要的。
至于這種摳語言細節(jié)的哲學為何能在社群里面呈野火燎原之勢,就是一個心理學的問題了。想像人們在論壇上討論問題時,一個對語言把握很細致的人肯定能夠得到更多的佩服,而由于論壇上的問題大多是小問題,所以解決實際問題的真正能力并不能得到顯現(xiàn),也就是說,知識型的人能夠得到更多佩服,后者便成為動力和仿效的砝碼。然而真正的編程能力是與語言細節(jié)沒關系的,熟練運用一門語言能夠幫你最佳表達你的意圖,但熟練運用一門語言絕不意味著要把它的邊邊角角全都記住。懂得一些常識,有了編程的基本直覺,遇到一些細節(jié)錯誤的時候再去查書,是最節(jié)省時間的辦法。
C++的書,Bjarne的圣經(jīng)《The C++ Programming Language》是高屋建瓴的?!洞笠?guī)模C++程序設計》是挺務實的?!禔ccelerated C++》是最佳入門的?!禖++ Templates》是僅作參考的?!禖++ Template Metaprogramming》是精力過剩者可以玩一玩的,普通程序員碰都別碰的。《ISO.IEC C++ Standard 14882》不是拿來讀的。Bjarne最近在做C++的教育,新書是絕對可以期待的。
P.S. 關于如何學習編程,g9的blog上有許多精彩的文章:這里,這里,這里,這里… 實際上,我建議你去把g9老大的blog翻個底朝天 :P
再P.S. 書單?我是遑于給出一個類似《C++初學者必讀》這種書單的。C++的書不計其數(shù),被公認的好書也不勝枚舉。只不過有些書容易給初學者造成一種錯覺,就是“學習C++就應該是這個樣子的”。比如有朋友提到的《高質(zhì)量C/C++編程》,這本書有價值,但不適合初學者,初學者讀這樣的書容易一葉障目不見泰山。實際上,正確的態(tài)度是,細節(jié)是必要的。但細節(jié)是次要的。其實學習編程我覺得應該最先學習如何用偽碼表達思想呢,君不見《Introduction to Algorithm》里面的代碼?《TAOCP》中的代碼?哦,對了它們是自己建立的語言,但這種僅教學目的的語言的目的就是為了避免讓寫程序的人一開始就忘了寫程序是為了完成功能,以為寫程序就是和語言細節(jié)作斗爭了。Bjarne說程序的正確性最重要,boost的編碼標準里面也將正確性列在性能前面。
此外,一旦建立了正確的學習編程的理念,其實什么書(只要不是太垃圾的)都有些用處。都當成參考書,用的時候從目錄或索引翻,基本就對了。
再再P.S. myan老大和g9老大都給出了許多精彩的見解。我不得不再加上一個P.S。具體我就不摘錄了,如果你讀到這里,請務必往下看他們的評論。轉(zhuǎn)載者別忘了轉(zhuǎn)載他們的評論:-)
許多朋友都問我同一個問題,到底要不要學習C++。其實這個問題問得很沒有意義。“學C++”和“不學C++”這個二分法是沒意義的,為什么?因為這個問題很表面,甚至很浮躁。重要的不是你掌握的語言,而是你掌握的能力,借用myan老大的話,“重要的是這個磨練過程,而不是結(jié)果,要的是你粗壯的腿,而不是你身上背的那袋鹽巴。”。此外學習C++的意義其實真的是醉翁之意不在酒,像C/C++這種系統(tǒng)級語言,在學習的過程中必須要涉及到一些底層知識,如內(nèi)存管理、編譯連接系統(tǒng)、匯編語言、硬件體系結(jié)構(gòu)等等等等知識(注意,這不包括過分犄角旮旯的語言枝節(jié))。這些東西也就是所謂的內(nèi)功了(其實最最重要的內(nèi)功還是長期學習所磨練出來的自學能力)。對此大嘴Joel在《Joel On Software》里面提到的漏洞抽象定律闡述得就非常漂亮。
所以,答案是,讓你成為高手的并不是你掌握什么語言,精通C++未必就能讓你成為高手,不精通C++也未必就能讓你成為低手。我想大家都不會懷疑g9老大如果要抄起C++做一個項目的話會比大多數(shù)自認熟練C++的人要做得漂亮。所以關鍵的不是語言這個表層的東西,而是底下的本質(zhì)矛盾。當然,不是說那就什么語言都不要學了,按照一種曹操的邏輯,“天下語言,唯imperative與declarative耳”。C++是前者里面最復雜的一種,支持最廣泛的編程范式。借用當初數(shù)學系入學大會上一個老師的話,“你數(shù)學都學了,還有什么不能學的呢?”。學語言是一個途徑,如果你把它用來磨練自己,可以。如果你把它用來作為學習系統(tǒng)底層知識的鑰匙,可以。如果你把它用來作為學習如何編寫優(yōu)秀的代碼,如何組織大型的程序,如何進行抽象設計,可以。如果掉書袋,光啃細節(jié),我認為不可以(除非你必須要用到細節(jié),像boost庫的coder們)。
2021-07-09
2021-07-08
2021-07-08
2021-07-08
2021-07-08
2021-07-08
2021-07-07
2021-07-07
2021-07-07
2021-07-07
2021-07-07
2021-07-06
2021-07-06
2021-07-06
工作態(tài)度怎么寫 具有穩(wěn)定的工作心態(tài)
2021-07-06
該文觀點僅代表作者本人,查查吧平臺系信息發(fā)布平臺,僅提供信息存儲空間服務,不承擔相關法律責任。圖片涉及侵權(quán)行為,請發(fā)送郵件至85868317@qq.com舉報,一經(jīng)查實,本站將立刻刪除。