好久沒有上博客了,再次看看之前的文章了,覺得很難受,除了批評(píng)MFC的那篇有點(diǎn)意義之外,其他都是在放屁,如果誤人子弟了,在下很不安,并且里面還有很情緒化的傾向,本來應(yīng)該刪除,免得繼續(xù)禍害初學(xué)者。但是,應(yīng)該勇于面對(duì)自己曾經(jīng)犯過的錯(cuò)誤,就讓它留著吧,只是祈求后來者,不要再看了。
有一種錯(cuò)誤的認(rèn)識(shí),說什么編程語言不重要,編程思想才重要,這種認(rèn)識(shí)很沒有意義,何為編程思想,只怕說這句話的人也不是很清楚,至于編程思想包含了哪些內(nèi)容,那更加是她沒法想象得到的廣闊天地。當(dāng)然,思想很重要,但是,無論多么高妙的思想,終究還得靠語言來表達(dá)。而且,有些語言表達(dá)某些思想,就是要比其他語言要直接,要直白,并且所謂的思想的有些理念本身就是語言的重要組成部分,這種語言還要求學(xué)習(xí)者要經(jīng)歷語言的洗禮,從而盡快的掌握所謂的編程思想,以便能初步使用它。然后,又有些語言天生殘疾,無論如何整頓,就是沒法表達(dá)某種編程思想,好比JAVA。總之,語言的選擇,應(yīng)該是很嚴(yán)肅的問題,不可等閑視之,至于思想,那也是通過具體的語言才能領(lǐng)悟。
不管對(duì)于C++有多么深厚的感情,但是,確實(shí)沒必要讓自己吊死在一個(gè)樹上。走出了那片天地,開闊視野之后,再回來,可以更好更快的處理原來領(lǐng)域上的問題。所以對(duì)于有志于CPPER,就是不要再C++各種語言細(xì)節(jié)上死鉆牛角尖,必須多學(xué)習(xí)幾種語言,吸收他們的優(yōu)點(diǎn),然后回來擬補(bǔ)C++本身的很多不足,學(xué)習(xí)其他語言,其實(shí)也是在學(xué)習(xí)C++,并且是更好地學(xué)習(xí)之法,因?yàn)檫@樣,才能了解到C++的不足,才知道為了擬補(bǔ)其先天的不足,是怎樣的努力,才設(shè)計(jì)出那些逆天的語言復(fù)雜性。
個(gè)人感覺,C語言弱智(將太多的事情交給程序員來做,美其名曰信任程序員,搞得碼農(nóng)一天到晚死鉆細(xì)節(jié),又由于語言的抽象能力嚴(yán)重缺乏,所以很多事情就是吃力不討好。當(dāng)然也要承認(rèn),人寫出來的代碼,始終要比編譯器出來的要好要可控,起碼某種形式上,但是有必要嗎)。至于C++,的確強(qiáng)大,自由,但是,她真的是丑陋無比,由于本身的野心過大,導(dǎo)致其語言核心無比的模糊,想要很好的使用,必須深刻系統(tǒng)的學(xué)習(xí)其靜態(tài)類型系統(tǒng)和各種類型演算,因此,模板元編程必須基礎(chǔ)十分扎實(shí),不是為了用MPL寫代碼,而是學(xué)了之后,才能更深刻的感受到C++的類型系統(tǒng)(某些人十分反感template,不知所謂,殊不知,沒有了template,C++的威力將降低一大半,還有,C++的各種奇技淫巧和宏,也在template這里大放驚人異彩。學(xué)了C#和java的泛型之后,才驚詫C++的template的功能如此的變態(tài)厲害,所謂的圖靈完備,原來是這么回事)。此外,還要知道C++的種種不足,比如GC,比如嚴(yán)重殘缺的動(dòng)態(tài)類型信息,比如……(好吧,想不出來了),但是,這些都不是問題,C++非常神奇,對(duì)于語言上的種種不足,通過有些人種種奇技淫巧,歷經(jīng)千辛萬苦,終于可以實(shí)現(xiàn)了,但是,最后出來的東西,始終還是沒有語言層面上直接支持的來的好,并且有些還不免很丑陋,這是必須的,不過,C++11出來之后,語言的各種不足,都有不同程度的改善,造輪子時(shí)可用的材料也多了,最后,得益于C++11的新特性,輪子的外觀也可以更好看。
C++的學(xué)習(xí)教條,當(dāng)然,重中之重,是,懇請(qǐng)不要學(xué)習(xí)C++,現(xiàn)實(shí)的很多很多問題,都可以不必C++來搞,那些嵌入式的東西,與硬件緊密相關(guān)的,C其實(shí)很能夠勝任了,其實(shí),C還是很好地。
1、忌將精力都放在C++上,多學(xué)習(xí)學(xué)習(xí)其他語言;2、忌學(xué)MFC,這個(gè)東西,碰都不要碰;3、不要用C++解決所有的問題,很多問題用其他語言來解決效果會(huì)更好,無論開發(fā)效率還是運(yùn)行效率;4、眼界很重要,……。作為C++的死忠,說這些實(shí)在有悖于對(duì)C++的感情,其實(shí)也不是,只是曲線救國(guó)之法,因?yàn)椋{馭C++的種種奇怪的復(fù)雜,的確需要C++以外的視野。C++的確不是人人都能使用,合格的C++猿不但要擁抱奇技淫巧,還要能發(fā)明出更好的奇技淫巧,沒有最好的奇技淫巧,只有更好的奇技淫巧,C++就是用來創(chuàng)造奇技淫巧的。
竊以為,對(duì)于語言學(xué)習(xí)者來說,特別是C++猿,以下幾種,C#的實(shí)用,scheme的優(yōu)雅,haskell的嚴(yán)謹(jǐn)簡(jiǎn)潔,都有必要的學(xué)習(xí)學(xué)習(xí)。對(duì)了,還有smalltalk,但是考慮到面向?qū)ο蟊旧淼膯栴},就不推薦了。至于其他語言,在下接觸不深,就不敢多嘴了。對(duì)了,還有設(shè)計(jì)模式,這東西還是很好的,特別是在面向?qū)ο蟮臅r(shí)候。至于以前說到的消息發(fā)送,純屬無稽之談,這東西反人類,那是由于C本身的抽象能力不足,才搞出來的一個(gè)怪胎,無奈之舉。對(duì)于比C更高級(jí)的語言,完全沒必要再模仿了。設(shè)計(jì)模式的一大特點(diǎn)在于把模式的實(shí)現(xiàn)完全固守在靜態(tài)類對(duì)象上,這樣理解起來確實(shí)方便,但是,帶來的問題,就誤導(dǎo)了某些無知的讀者,以為必須一定要用靜態(tài)的面向?qū)ο蟮恼Z言(在這一點(diǎn)上,JAVA是最徹底的實(shí)踐者)來實(shí)現(xiàn)模式,以至于,為了實(shí)現(xiàn)模式,要寫很多很多不必要的狗屎般的代碼。其實(shí),設(shè)計(jì)模式只是思想,書中的實(shí)現(xiàn)只是示范而已,大伙兒不必死盤硬套。對(duì)了,對(duì)于C++沉思錄那道著名的例題,用設(shè)計(jì)模式做出來的效果,始終感覺很別扭,較好的思路是組合運(yùn)算子。
互聯(lián)網(wǎng)上的有害信息真多,很不幸的是,之前寫了那么幾篇狗屁不通的文章,實(shí)在慚愧。