深度剖析C++復(fù)雜性問題
在C++復(fù)雜性里面這樣的情況很多見:知道了語(yǔ)言實(shí)現(xiàn)的底層機(jī)制,卻不知道語(yǔ)言特性本身的意義在什么地方,C++的復(fù)雜性是根本原因”是個(gè)有漏洞的推理呢?
正如“Why C++”的一位讀者批評(píng)的,我在文章里面沒有寫明到底哪些是C++的“非本質(zhì)復(fù)雜性”。當(dāng)然,我自己憑感覺就能知道,而接觸C++一段時(shí)間的人大致也能知道,但新手乃至非新手則對(duì)我所謂的“非本質(zhì)復(fù)雜性”根本沒有一個(gè)具體的認(rèn)識(shí),這就使得那篇“Why C++”脫離了原本的意圖——面向所有C++使用者和學(xué)習(xí)者。
同樣的原因,在寫了“你應(yīng)當(dāng)如何學(xué)習(xí)C++”一文之后,當(dāng)孟巖先生邀請(qǐng)我給《程序員》寫一個(gè)系列的文章,介紹一下我在接觸C++的過程中的態(tài)度和認(rèn)識(shí)轉(zhuǎn)變時(shí),我雖然非常高興的答應(yīng)了,但直到現(xiàn)在3個(gè)月過去了還是顆粒無(wú)收。
為什么?因?yàn)槲矣X得真正本質(zhì)的問題沒有被清晰的觸摸到;所以直到現(xiàn)在我都沒有動(dòng)筆,免得廢話說(shuō)了一大堆,除了能被當(dāng)成小說(shuō)讀讀之外,對(duì)真正考慮是否要學(xué)習(xí)乃至使用C++的人未必有什么實(shí)際用處。
然而,這么個(gè)念頭一直都放在潛意識(shí)里面。前一陣子和Bjarne通信,談到了關(guān)于C++復(fù)雜性的一些想法,在郵件里面總結(jié)了一下C++的復(fù)雜性來(lái)源,感覺思路清晰了許多。。而這篇文章要達(dá)到的目的,正是傳達(dá)對(duì)C++的復(fù)雜性的一個(gè)具體而明確的認(rèn)識(shí),有了這個(gè)認(rèn)識(shí)作為支持,我們便可以推導(dǎo)出學(xué)習(xí)C++的***(實(shí)踐者)的方法。
底線是:如果把C++中的諸多不必要的復(fù)雜性去掉,留下那些本質(zhì)的,重要的語(yǔ)言特性,簡(jiǎn)化語(yǔ)言模型,消除歷史包袱。即便是C++的反對(duì)者也許也很難找到理由說(shuō)“我還是不用C++”。
在我看來(lái),一個(gè)真正從實(shí)踐意義上理性反對(duì)使用C++的人只有一個(gè)理由:C++的復(fù)雜性帶來(lái)的混亂抵消乃至超過了C++的抽象機(jī)制和庫(kù)(在他的特定項(xiàng)目中)帶來(lái)的好處。 值得注意的是。
這里需要避免一個(gè)陷阱,就是一旦人們認(rèn)定了“C++不好”,那么這個(gè)理由就會(huì)“長(zhǎng)出自己的腳來(lái)”,即,就算我們拿掉C++的復(fù)雜性,他們可能也會(huì)堅(jiān)持還是不用C++,并為之找一堆理由。
我假定你不是這樣的人。不過,也許最可能的是他會(huì)說(shuō):“問題是我們今天用的C++并非如此(簡(jiǎn)潔),你的假設(shè)不成立。”是的,我的假設(shè)不成立。但雖然我們無(wú)法消除復(fù)雜性,我們實(shí)際上是可以容易地避開復(fù)雜性,避短揚(yáng)長(zhǎng)的。這也是本文的要點(diǎn),容我后面再詳述。
那為什么我說(shuō)“C++的復(fù)雜性是根本原因”是個(gè)有漏洞的推理呢?因?yàn)椋屓藗冊(cè)谑褂靡婚T語(yǔ)言去做事情之前耗上大量時(shí)間去學(xué)習(xí)語(yǔ)言中各種復(fù)雜性,除了語(yǔ)言本身的復(fù)雜性的事實(shí)之外。
還有一個(gè)重要的事實(shí),那就是學(xué)習(xí)者的態(tài)度和(更重要的)方法。而目前大多數(shù)C++復(fù)雜性學(xué)習(xí)者的態(tài)度和方法是什么呢?——在真正用C++之前看上一摞語(yǔ)言書(日常編程八輩子都未必用得到)。而為什么會(huì)存在這樣的學(xué)習(xí)態(tài)度呢?這就是真正需要解釋的問題。實(shí)際上,有兩方面的原因。
在C++復(fù)雜性里面這樣的情況很多見:知道了語(yǔ)言實(shí)現(xiàn)的底層機(jī)制,卻不知道語(yǔ)言特性本身的意義在什么地方。本末倒置。為什么?書害的。二,這類書當(dāng)中介紹的所有情景加起來(lái)其實(shí)只屬于那20%(二八法則)。
甚至20%都不到的場(chǎng)景(究竟是哪些書,后面會(huì)介紹,我不便直接列出書名,打擊面太大,但我會(huì)把我認(rèn)為essential的書列出來(lái))。這就是為什么我說(shuō)“八輩子都用不著”的原因。
【編輯推薦】