幾分鐘幫您解決C++復(fù)雜性問(wèn)題
有些錯(cuò)誤還是只有運(yùn)行的時(shí)候才能發(fā)現(xiàn),這就需要我們加入一些測(cè)試代碼來(lái)保證程序的正確性。結(jié)對(duì)編程就是讓一個(gè)人寫一些C++復(fù)雜性代碼,另一個(gè)人考慮全局,一旦編碼無(wú)法進(jìn)行下去,就可以交換過(guò)來(lái),再不行還可以讓大家一起討論。
為什么獨(dú)獨(dú)這篇能夠激起這么多的回應(yīng),想必是國(guó)內(nèi)的C++社群被C++壓抑太久,或者,嚴(yán)格來(lái)說(shuō),是被C++的教育方式壓抑太久。實(shí)際上,不管是在各大國(guó)內(nèi)論壇上,還是在comp.lang.c++.moderated這樣的國(guó)際C++論壇上,乃至于在douban上的小組內(nèi),有心者都會(huì)發(fā)現(xiàn),對(duì)C++語(yǔ)言的細(xì)節(jié)的關(guān)注一直都沒(méi)有停止過(guò)。
同樣,對(duì)C++語(yǔ)言的細(xì)節(jié)的抱怨也從來(lái)都沒(méi)有停止過(guò)。一個(gè)例子就是comp.lang.c++.moderated上的一個(gè)技術(shù)牛人James Kanze說(shuō)的,他說(shuō)接觸C++十年了,到現(xiàn)在還需要不時(shí)去翻C++標(biāo)準(zhǔn)。這就難怪Eric Raymond老大在《The Art of Unix Programming》中說(shuō)“C++是反緊湊”的了。C++中的細(xì)節(jié)太多,就算都看過(guò)了,也不可能都記住。更關(guān)鍵的是,就算都記住了,也不能讓你成為一個(gè)真正的好程序員。
絕大多數(shù)人都把細(xì)節(jié)太多(或者用貶義詞來(lái)說(shuō)就是“陰暗角落太多”)歸結(jié)為C++復(fù)雜性本質(zhì)問(wèn)題,認(rèn)為一切邪惡由此而生。也正因此,大約9月份的時(shí)候,Linus在郵件列表上說(shuō)“C++是一門有思想包袱的語(yǔ)言;僅僅是為了讓程序員遠(yuǎn)離C++,我也要用C”。#t#
這句短短的話在國(guó)內(nèi)引起了很大的反應(yīng),最初是劉江轉(zhuǎn)了Linus的話,然后云風(fēng)和孟巖都發(fā)表了自己的看法;我也寫了一篇“Why C++”(后來(lái)發(fā)給Bjarne,Bjarne對(duì)這篇文章做了一個(gè)友情評(píng)注)。
然而,這一通渾水?dāng)囘^(guò)之后,我相信引起的變化未必很大。大多數(shù)原先的反對(duì)者能從中找出反對(duì)的理由,于是更加反對(duì);大多數(shù)原先的贊同者也能從中找到贊同的理由,于是更加贊同;而剩下來(lái)的原先沒(méi)有明確意見(jiàn)的,看雙方各有各的道理,可能還是沒(méi)有頭緒。
現(xiàn)在,幾乎每個(gè)學(xué)習(xí)C++的都知道C++的核心問(wèn)題是其復(fù)雜性;甚至本身不在C++社群的,也知道這是事實(shí)。群眾的眼睛是雪亮的,何況這還是個(gè)太顯而易見(jiàn)的事實(shí)。 但看了無(wú)數(shù)篇闡述C++復(fù)雜性的文章,和爭(zhēng)論C++復(fù)雜性的吐沫星子(包括我前段時(shí)間寫的兩篇關(guān)于C++的總結(jié))。
我始終都有一個(gè)感覺(jué)——沒(méi)分析透,就跟盲人摸象一樣。正如“Why C++”的一位讀者批評(píng)的,我在文章里面沒(méi)有寫明到底哪些是C++的“非本質(zhì)復(fù)雜性”。當(dāng)然,我自己憑感覺(jué)就能知道,而接觸C++一段時(shí)間的人大致也能知道,但新手乃至非新手則對(duì)我所謂的“非本質(zhì)復(fù)雜性”根本沒(méi)有一個(gè)具體的認(rèn)識(shí),這就使得那篇“Why C++”脫離了原本的意圖——面向所有C++使用者和學(xué)習(xí)者。
同樣的原因,在寫了“你應(yīng)當(dāng)如何學(xué)習(xí)C++”一文之后,當(dāng)孟巖先生邀請(qǐng)我給《程序員》寫一個(gè)系列的文章,介紹一下我在接觸C++的過(guò)程中的態(tài)度和認(rèn)識(shí)轉(zhuǎn)變時(shí),我雖然非常高興的答應(yīng)了,但直到現(xiàn)在3個(gè)月過(guò)去了還是顆粒無(wú)收。
為什么?因?yàn)槲矣X(jué)得真正本質(zhì)的問(wèn)題沒(méi)有被清晰的觸摸到;所以直到現(xiàn)在我都沒(méi)有動(dòng)筆,免得廢話說(shuō)了一大堆,除了能被當(dāng)成小說(shuō)讀讀之外,對(duì)真正考慮是否要學(xué)習(xí)乃至使用C++的人未必有什么實(shí)際用處。
然而,這么個(gè)念頭一直都放在潛意識(shí)里面。前一陣子和Bjarne通信,談到了關(guān)于C++復(fù)雜性的一些想法,在郵件里面總結(jié)了一下C++的復(fù)雜性來(lái)源,感覺(jué)思路清晰了許多。而這篇文章要達(dá)到的目的,正是傳達(dá)對(duì)C++復(fù)雜性的一個(gè)具體而明確的認(rèn)識(shí),有了這個(gè)認(rèn)識(shí)作為支持,我們便可以推導(dǎo)出學(xué)習(xí)C++的***(實(shí)踐者)的方法。


















