C++的沉迷与爱恋——侯捷
生活随笔
收集整理的這篇文章主要介紹了
C++的沉迷与爱恋——侯捷
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
每年的 09/28 於我都是一個(gè)特殊的日子 -- 不只是因?yàn)榻處煿?jié)。今年很特殊地沒(méi)有普天同慶,那麼我就寫(xiě)篇文章自己慶祝一下好了。
我於今年七月發(fā)表了一本著作《多型與虛擬》和一本譯作 <深度探索 C++ 物件模型> ,獲得很大的回響。這些作品都不是針對(duì) C++ 的完全初學(xué)者所寫(xiě),但從初階到高階為數(shù)眾多的 C++ guy,熱情地表達(dá)了他們對(duì)這些主題的喜悅。
在許多來(lái)信中,我看到一些有趣的現(xiàn)象,也感受到一些值得整理下來(lái)的想法。所以,根據(jù)我個(gè)人的學(xué)習(xí)過(guò)往、我的教學(xué)經(jīng)驗(yàn)、以及周遭朋友的心得交流,寫(xiě)下這篇文章,或可為後學(xué)者戒。
《多型與虛擬》序言節(jié)錄
首先讓我節(jié)錄《多型與虛擬》一書(shū)序言:
《多型與虛擬》序 節(jié)錄(侯俊杰/松崗/1998/07)
一般而言,C++ 是一個(gè)難學(xué)易用的語(yǔ)言。
C++ 的難學(xué),初始在於其重重的布幕,布幕之中編譯器對(duì)我們的程式碼做了太多的手腳,使我們慣於循序思考的工程腦袋一無(wú)所措。及長(zhǎng),又面臨新的思維模式,使我們必須扭轉(zhuǎn)慣常的思考習(xí)慣。
C++ 的易用則在於其巨大的彈性,能夠以多型(polymorphism)、虛擬(virtual)、模板(template)、泛型(generalization)等種種型式,讓既有的碼去處理未知的、未來(lái)的資料型態(tài)。
當(dāng)然,易用必須先能用。用不好或不能用的話,「寫(xiě) C++ 程式」最後就成了只是「使用 C++ 編譯器」,這是大家常拿來(lái)彼此調(diào)侃的笑話。
在「難學(xué)」的背景下,「易用」是使我們依然前仆後繼的動(dòng)力。愈來(lái)愈多的大學(xué)資訊科系把 C++ 開(kāi)在大一課程,這雖然說(shuō)明 C++ 是多麼地重要,可也苦了資訊新兵們。
其實(shí)「難學(xué)」的最大癥結(jié)在於,很難得有一本書(shū),能夠一針見(jiàn)血地指出多型與虛擬的重要性;在我們粗具語(yǔ)法基礎(chǔ)之後,直接把我們導(dǎo)引到最核心最重要的思想,并且在建立這個(gè)思想的過(guò)程中,提供足夠的必要基礎(chǔ)。
困難度之一
「C++ 是個(gè)難學(xué)易用的語(yǔ)言」,這句話相信很多人心有戚戚。C++ 的學(xué)習(xí)難度,一在於語(yǔ)言本身太多的「幕」,一在於 "paradigm shift" (思考模式的移轉(zhuǎn))。
傳統(tǒng)循序語(yǔ)言如 C, Pascal, Basic, Fortran...,除了模樣看起來(lái)稍有不同,基本上都是函式 call 來(lái) call 去,大同小異,很容易掌握。你想做的動(dòng)作,在 code 中都看得一清二楚。你所看不到的,犖犖大者也不過(guò)就是編譯器為你的函式加上用以處理堆疊的一小段碼(prologue 和 epilogue),這一小段碼基本上做的是 housekeeping 工作,你沒(méi)看到也沒(méi)有關(guān)系(更好),并不影響你對(duì)程式邏輯的思考。
C++ 不一樣,C++ 有太多和程式邏輯息息相關(guān)的動(dòng)作是編譯器為我們加上去的。換句話說(shuō) C++ 編譯器為我們「加碼」。如果不識(shí)清這一節(jié),學(xué)習(xí)C++ 有如霧里看花,霧非霧,花非花。
編譯器為我們的 C++ 程式加了什麼碼呢?很多!物件誕生時(shí) ctor 會(huì)被喚起,物件死亡時(shí) dtor 會(huì)被喚起,這都是加碼的結(jié)果。ctor 中設(shè)定vtpr 和 vtbl,這也是加碼的結(jié)果。new 單一物件時(shí)會(huì)產(chǎn)生 memory block cookie,new 物件陣列時(shí)會(huì)產(chǎn)生一個(gè)內(nèi)部結(jié)構(gòu)記錄著 object size 和 class ctor...,這也都是布幕後的工作。可以說(shuō),程式碼中看不到而卻必須完成的所有與程式邏輯有關(guān)的動(dòng)作,統(tǒng)統(tǒng)都是 C++ 編譯器加碼後的結(jié)果。
當(dāng)「繼承」發(fā)生,整個(gè)情況變得稍微復(fù)雜起來(lái)。「多重繼承」又更復(fù)雜一些,「虛擬繼承」再更復(fù)雜一些。
這些布幕後的主題,統(tǒng)可歸類為所謂的 C++ object model(物件模型)。如果不知道這些底層機(jī)制,你就只能夠把 "make destructors virtual in base classes"(<Effective C++>, item14)或 "never treat arrays polymorphically" (<More Effective C++>, item 3)這類規(guī)則硬背下來(lái),卻不明白它的道理。
用一樣?xùn)|西,卻不明白它的道理,林語(yǔ)堂如是說(shuō):『不高明』。只知道 how,不知道 why,侯捷如是說(shuō):『不高明』。
困難度之二
C++ 的第二個(gè)學(xué)習(xí)難度在於 "paradigm shift"(思考模式的移轉(zhuǎn))。別說(shuō)自己設(shè)計(jì) classes 了,光使用別人的 classes,就都是一種思考模式和行為模式的移轉(zhuǎn)。MFC(或 OWL 或 VCL)programmer 必然甚能夠領(lǐng)略并體會(huì)我的意思。
使用所謂的 application framework(一種大型的、凝聚性強(qiáng)的、有著物件導(dǎo)向公共基礎(chǔ)建設(shè)的 class library),你的碼和 framework 之間究竟是怎樣的關(guān)系呢?framework 提供的一大堆可改寫(xiě)的虛擬函式的意義與價(jià)值究竟在哪里呢?為什麼 framework 所設(shè)計(jì)的種種美好性質(zhì)以及各式各樣的演算法竟然可以施行於我們自己設(shè)計(jì)的 class types 身上呢?framework 被設(shè)計(jì)時(shí),并不知道我們的存在呀!
這正是物件導(dǎo)向中的多型(polymorphism)的威力。
稍早所說(shuō)的 C++ 物件模型,偏屬程式設(shè)計(jì)的低層面;這里所說(shuō)的思考模式移轉(zhuǎn),則是程式設(shè)計(jì)的高層面。能夠把新思維模式的威力發(fā)揮得最淋漓盡致的,當(dāng)推物件導(dǎo)向的 polymorphism(多型)和 generalization(泛型)。如果你沒(méi)有使用這兩項(xiàng)特性,等於入 C++ 寶山而空手返。
反覆 煉,循環(huán)震蕩
想像 C++ 是一把用來(lái)解決程式問(wèn)題的刀,要它堅(jiān)軔,要它鋒利,就必須經(jīng)過(guò)多次的回火,在高熱和驟冷之間 煉。
初學(xué) C++ 語(yǔ)法(syntax)之後,你應(yīng)該盡快嘗試體驗(yàn) polymorphism (大致而言也就是虛擬函式的運(yùn)用)。等到對(duì) OOP 的精神有了大局掌控的能力,但對(duì) C++ 的許多小細(xì)節(jié)不甚清楚,就是回到C++ 物件模型 煉的時(shí)機(jī)。
成長(zhǎng),是在高階(polymorphism)和低階(object model)之間反覆震蕩,才能夠震蕩到更高的位階,而不是平平庸庸於中階(C++ syntax)的一灘死水。
不要沉淪於 C++ syntax
100 個(gè)人跟我說(shuō)他懂 C++/OOP,只有 10% 不到可以讓我認(rèn)為他沒(méi)有胡吹大氣。太多的人,上嘛上不到 polymorphism,下嘛又下不到object model。就這樣不上不下地卡在 C++ 語(yǔ)法層面。大一學(xué)了C++,到大四快畢業(yè)了,連 virtual functions 是怎麼回事都期期艾艾支支吾吾說(shuō)不出個(gè)道理。
有時(shí)候我覺(jué)得,太苛責(zé)同學(xué)也於心不忍,因?yàn)橥瑢W(xué)們事實(shí)上處?kù)兑环N無(wú)知的狀態(tài),既不知道 C++/OOP 該怎麼學(xué),也不知道哪些書(shū)可以教他們那麼學(xué)。所以,苛責(zé)同學(xué),不如責(zé)怪老師。
眾所周知,大學(xué)教授泰半是動(dòng)口不動(dòng)手,普遍的心態(tài)是「論文第一,升等為要;程式語(yǔ)言?哎,末流!」。「末流」課程通常由教授們輪流教,誰(shuí)倒楣誰(shuí)來(lái)教;於是就常常有「下學(xué)期要教 C++ 語(yǔ)言了,這學(xué)期寒(暑)假趕快去要本書(shū)來(lái)惡補(bǔ)」的情況發(fā)生。偏偏程式語(yǔ)言這東西,只動(dòng)口不管用,一定要?jiǎng)邮?#xff0c;而且要常動(dòng)手。老師自己沒(méi)有摸到C++/OOP 的精神,學(xué)生又能學(xué)到什麼?
有些學(xué)校資訊系并不教特定的程式語(yǔ)言,老師們的態(tài)度是「語(yǔ)言是一種自己學(xué)就好了的東西嘛,拿到大學(xué)殿堂來(lái),哎,不入流」!於是應(yīng)該好好為學(xué)生打下實(shí)際基礎(chǔ)的課程,卻天馬行空地騰云駕霧起來(lái),大談抽象意念。飽讀經(jīng)書(shū)的老師們可能忽略了,一個(gè)完全沒(méi)有技術(shù)基礎(chǔ)的學(xué)子,要的不是形而上的道,而是形而下的器。
我們是先能夠欣賞具象畫(huà),還是先能夠欣賞抽象畫(huà)?我們不都是先對(duì)畢卡索的畫(huà)大罵「這是什麼東西」,直到自己的藝術(shù)涵養(yǎng)夠豐富了、人生閱練更飽滿了、能夠舉一隅以三隅反了、能夠接觸類旁通左右逢源了,才轉(zhuǎn)而能夠欣賞甚至進(jìn)入畢卡索的抽象意境嗎?
老師們各有專長(zhǎng),要老師們來(lái)教非彼專長(zhǎng)的大班課、基礎(chǔ)課,我又覺(jué)得似乎也太為難老師了。那麼,苛責(zé)老師,不如責(zé)怪學(xué)校當(dāng)局。如果學(xué)校當(dāng)局能夠聘請(qǐng)經(jīng)驗(yàn)老道又有教學(xué)熱誠(chéng)的工程師來(lái)教這類實(shí)務(wù)學(xué)科,不是三方皆大歡喜嗎?不要說(shuō)什麼制度僵化啦,難以突破啦,大學(xué)是高度自治區(qū),禮聘幾位兼任老師,不全都是系上的權(quán)責(zé)范圍內(nèi)嗎?
當(dāng)學(xué)子們?cè)谡n程上學(xué)不到他要的東西,就只好閉門(mén)自修。但是,循序性(sequential)語(yǔ)言尚有自修學(xué)會(huì)的可能,物件導(dǎo)向語(yǔ)言嘛,以大學(xué)生的程度來(lái)講,我認(rèn)為自修實(shí)在困難,只會(huì)修出個(gè)四不像、半瓶水。
管不到學(xué)校!管不到教授!自求多福的情況下,希望看到這篇文章的你,知道 C++/OOP 該怎麼學(xué)。
不要沉迷於 C++ object model
對(duì)於底層知識(shí)有濃厚興趣的朋友,下探到 object model 領(lǐng)域,一定會(huì)非常開(kāi)心地在 object size、object layout、vptr/vtbl、以及許多布幕後的技術(shù)之間玩將起來(lái)。了解這些東西,當(dāng)然是好的,但是由於一探究竟得其奧秘的快感與成就感,使得一些朋友們?cè)谶@個(gè)層面里「玩」起來(lái)了,小地方玩得很精,玩得不亦樂(lè)乎,玩得忽略了 C++/OOP 的最終目標(biāo)。
最終目標(biāo)是 polymorphism!
我要說(shuō),在 C++ syntax 以及相對(duì)低階的 C++ semantics 里,不要玩得太過(guò)火。過(guò)猶不及,會(huì)傷身的。C++ 經(jīng)典名書(shū)內(nèi)附的一些習(xí)題,在我看來(lái)頗有點(diǎn)玩得過(guò)火的味道。至於什麼百題精選、題庫(kù)大成,除了修練基本功之外,都滿無(wú)趣的東西。
Programming 應(yīng)該是一種天馬行空的想像力與創(chuàng)意的組合;如果你能夠自己想題目,譬如說(shuō)實(shí)作一個(gè)天體運(yùn)行的 class 體系、或是實(shí)作一個(gè)生物分類(界門(mén)綱目科屬種)體系,不是很有趣嗎?準(zhǔn)備資料的過(guò)程中,查查百科全書(shū),你也因此查到了太陽(yáng)系九大行星的幾何資料,哈雷慧星的軌道周期,或是黑面琵鷺的「界門(mén)綱目科屬種」英文名稱,這難道不比鉆研於 ++++i 或 ----i 或 *&*&p 之類的頭腦體操題目有趣嗎?(看過(guò)不少這類好笑題目,沒(méi)一個(gè)記下來(lái),只好胡亂寫(xiě)幾個(gè)運(yùn)算式。諸位應(yīng)該知道我說(shuō)的那種頭腦體操題目)
固然,在科學(xué)與工程的領(lǐng)域里頭,無(wú)技術(shù)無(wú)以為立,但別把自己弄得過(guò)於僵化,過(guò)於匠氣。僵化與匠氣是我們教育體系的最大沉疴。到了高專層次,敗象顯露無(wú)遺。
我於今年七月發(fā)表了一本著作《多型與虛擬》和一本譯作 <深度探索 C++ 物件模型> ,獲得很大的回響。這些作品都不是針對(duì) C++ 的完全初學(xué)者所寫(xiě),但從初階到高階為數(shù)眾多的 C++ guy,熱情地表達(dá)了他們對(duì)這些主題的喜悅。
在許多來(lái)信中,我看到一些有趣的現(xiàn)象,也感受到一些值得整理下來(lái)的想法。所以,根據(jù)我個(gè)人的學(xué)習(xí)過(guò)往、我的教學(xué)經(jīng)驗(yàn)、以及周遭朋友的心得交流,寫(xiě)下這篇文章,或可為後學(xué)者戒。
《多型與虛擬》序言節(jié)錄
首先讓我節(jié)錄《多型與虛擬》一書(shū)序言:
《多型與虛擬》序 節(jié)錄(侯俊杰/松崗/1998/07)
一般而言,C++ 是一個(gè)難學(xué)易用的語(yǔ)言。
C++ 的難學(xué),初始在於其重重的布幕,布幕之中編譯器對(duì)我們的程式碼做了太多的手腳,使我們慣於循序思考的工程腦袋一無(wú)所措。及長(zhǎng),又面臨新的思維模式,使我們必須扭轉(zhuǎn)慣常的思考習(xí)慣。
C++ 的易用則在於其巨大的彈性,能夠以多型(polymorphism)、虛擬(virtual)、模板(template)、泛型(generalization)等種種型式,讓既有的碼去處理未知的、未來(lái)的資料型態(tài)。
當(dāng)然,易用必須先能用。用不好或不能用的話,「寫(xiě) C++ 程式」最後就成了只是「使用 C++ 編譯器」,這是大家常拿來(lái)彼此調(diào)侃的笑話。
在「難學(xué)」的背景下,「易用」是使我們依然前仆後繼的動(dòng)力。愈來(lái)愈多的大學(xué)資訊科系把 C++ 開(kāi)在大一課程,這雖然說(shuō)明 C++ 是多麼地重要,可也苦了資訊新兵們。
其實(shí)「難學(xué)」的最大癥結(jié)在於,很難得有一本書(shū),能夠一針見(jiàn)血地指出多型與虛擬的重要性;在我們粗具語(yǔ)法基礎(chǔ)之後,直接把我們導(dǎo)引到最核心最重要的思想,并且在建立這個(gè)思想的過(guò)程中,提供足夠的必要基礎(chǔ)。
困難度之一
「C++ 是個(gè)難學(xué)易用的語(yǔ)言」,這句話相信很多人心有戚戚。C++ 的學(xué)習(xí)難度,一在於語(yǔ)言本身太多的「幕」,一在於 "paradigm shift" (思考模式的移轉(zhuǎn))。
傳統(tǒng)循序語(yǔ)言如 C, Pascal, Basic, Fortran...,除了模樣看起來(lái)稍有不同,基本上都是函式 call 來(lái) call 去,大同小異,很容易掌握。你想做的動(dòng)作,在 code 中都看得一清二楚。你所看不到的,犖犖大者也不過(guò)就是編譯器為你的函式加上用以處理堆疊的一小段碼(prologue 和 epilogue),這一小段碼基本上做的是 housekeeping 工作,你沒(méi)看到也沒(méi)有關(guān)系(更好),并不影響你對(duì)程式邏輯的思考。
C++ 不一樣,C++ 有太多和程式邏輯息息相關(guān)的動(dòng)作是編譯器為我們加上去的。換句話說(shuō) C++ 編譯器為我們「加碼」。如果不識(shí)清這一節(jié),學(xué)習(xí)C++ 有如霧里看花,霧非霧,花非花。
編譯器為我們的 C++ 程式加了什麼碼呢?很多!物件誕生時(shí) ctor 會(huì)被喚起,物件死亡時(shí) dtor 會(huì)被喚起,這都是加碼的結(jié)果。ctor 中設(shè)定vtpr 和 vtbl,這也是加碼的結(jié)果。new 單一物件時(shí)會(huì)產(chǎn)生 memory block cookie,new 物件陣列時(shí)會(huì)產(chǎn)生一個(gè)內(nèi)部結(jié)構(gòu)記錄著 object size 和 class ctor...,這也都是布幕後的工作。可以說(shuō),程式碼中看不到而卻必須完成的所有與程式邏輯有關(guān)的動(dòng)作,統(tǒng)統(tǒng)都是 C++ 編譯器加碼後的結(jié)果。
當(dāng)「繼承」發(fā)生,整個(gè)情況變得稍微復(fù)雜起來(lái)。「多重繼承」又更復(fù)雜一些,「虛擬繼承」再更復(fù)雜一些。
這些布幕後的主題,統(tǒng)可歸類為所謂的 C++ object model(物件模型)。如果不知道這些底層機(jī)制,你就只能夠把 "make destructors virtual in base classes"(<Effective C++>, item14)或 "never treat arrays polymorphically" (<More Effective C++>, item 3)這類規(guī)則硬背下來(lái),卻不明白它的道理。
用一樣?xùn)|西,卻不明白它的道理,林語(yǔ)堂如是說(shuō):『不高明』。只知道 how,不知道 why,侯捷如是說(shuō):『不高明』。
困難度之二
C++ 的第二個(gè)學(xué)習(xí)難度在於 "paradigm shift"(思考模式的移轉(zhuǎn))。別說(shuō)自己設(shè)計(jì) classes 了,光使用別人的 classes,就都是一種思考模式和行為模式的移轉(zhuǎn)。MFC(或 OWL 或 VCL)programmer 必然甚能夠領(lǐng)略并體會(huì)我的意思。
使用所謂的 application framework(一種大型的、凝聚性強(qiáng)的、有著物件導(dǎo)向公共基礎(chǔ)建設(shè)的 class library),你的碼和 framework 之間究竟是怎樣的關(guān)系呢?framework 提供的一大堆可改寫(xiě)的虛擬函式的意義與價(jià)值究竟在哪里呢?為什麼 framework 所設(shè)計(jì)的種種美好性質(zhì)以及各式各樣的演算法竟然可以施行於我們自己設(shè)計(jì)的 class types 身上呢?framework 被設(shè)計(jì)時(shí),并不知道我們的存在呀!
這正是物件導(dǎo)向中的多型(polymorphism)的威力。
稍早所說(shuō)的 C++ 物件模型,偏屬程式設(shè)計(jì)的低層面;這里所說(shuō)的思考模式移轉(zhuǎn),則是程式設(shè)計(jì)的高層面。能夠把新思維模式的威力發(fā)揮得最淋漓盡致的,當(dāng)推物件導(dǎo)向的 polymorphism(多型)和 generalization(泛型)。如果你沒(méi)有使用這兩項(xiàng)特性,等於入 C++ 寶山而空手返。
反覆 煉,循環(huán)震蕩
想像 C++ 是一把用來(lái)解決程式問(wèn)題的刀,要它堅(jiān)軔,要它鋒利,就必須經(jīng)過(guò)多次的回火,在高熱和驟冷之間 煉。
初學(xué) C++ 語(yǔ)法(syntax)之後,你應(yīng)該盡快嘗試體驗(yàn) polymorphism (大致而言也就是虛擬函式的運(yùn)用)。等到對(duì) OOP 的精神有了大局掌控的能力,但對(duì) C++ 的許多小細(xì)節(jié)不甚清楚,就是回到C++ 物件模型 煉的時(shí)機(jī)。
成長(zhǎng),是在高階(polymorphism)和低階(object model)之間反覆震蕩,才能夠震蕩到更高的位階,而不是平平庸庸於中階(C++ syntax)的一灘死水。
不要沉淪於 C++ syntax
100 個(gè)人跟我說(shuō)他懂 C++/OOP,只有 10% 不到可以讓我認(rèn)為他沒(méi)有胡吹大氣。太多的人,上嘛上不到 polymorphism,下嘛又下不到object model。就這樣不上不下地卡在 C++ 語(yǔ)法層面。大一學(xué)了C++,到大四快畢業(yè)了,連 virtual functions 是怎麼回事都期期艾艾支支吾吾說(shuō)不出個(gè)道理。
有時(shí)候我覺(jué)得,太苛責(zé)同學(xué)也於心不忍,因?yàn)橥瑢W(xué)們事實(shí)上處?kù)兑环N無(wú)知的狀態(tài),既不知道 C++/OOP 該怎麼學(xué),也不知道哪些書(shū)可以教他們那麼學(xué)。所以,苛責(zé)同學(xué),不如責(zé)怪老師。
眾所周知,大學(xué)教授泰半是動(dòng)口不動(dòng)手,普遍的心態(tài)是「論文第一,升等為要;程式語(yǔ)言?哎,末流!」。「末流」課程通常由教授們輪流教,誰(shuí)倒楣誰(shuí)來(lái)教;於是就常常有「下學(xué)期要教 C++ 語(yǔ)言了,這學(xué)期寒(暑)假趕快去要本書(shū)來(lái)惡補(bǔ)」的情況發(fā)生。偏偏程式語(yǔ)言這東西,只動(dòng)口不管用,一定要?jiǎng)邮?#xff0c;而且要常動(dòng)手。老師自己沒(méi)有摸到C++/OOP 的精神,學(xué)生又能學(xué)到什麼?
有些學(xué)校資訊系并不教特定的程式語(yǔ)言,老師們的態(tài)度是「語(yǔ)言是一種自己學(xué)就好了的東西嘛,拿到大學(xué)殿堂來(lái),哎,不入流」!於是應(yīng)該好好為學(xué)生打下實(shí)際基礎(chǔ)的課程,卻天馬行空地騰云駕霧起來(lái),大談抽象意念。飽讀經(jīng)書(shū)的老師們可能忽略了,一個(gè)完全沒(méi)有技術(shù)基礎(chǔ)的學(xué)子,要的不是形而上的道,而是形而下的器。
我們是先能夠欣賞具象畫(huà),還是先能夠欣賞抽象畫(huà)?我們不都是先對(duì)畢卡索的畫(huà)大罵「這是什麼東西」,直到自己的藝術(shù)涵養(yǎng)夠豐富了、人生閱練更飽滿了、能夠舉一隅以三隅反了、能夠接觸類旁通左右逢源了,才轉(zhuǎn)而能夠欣賞甚至進(jìn)入畢卡索的抽象意境嗎?
老師們各有專長(zhǎng),要老師們來(lái)教非彼專長(zhǎng)的大班課、基礎(chǔ)課,我又覺(jué)得似乎也太為難老師了。那麼,苛責(zé)老師,不如責(zé)怪學(xué)校當(dāng)局。如果學(xué)校當(dāng)局能夠聘請(qǐng)經(jīng)驗(yàn)老道又有教學(xué)熱誠(chéng)的工程師來(lái)教這類實(shí)務(wù)學(xué)科,不是三方皆大歡喜嗎?不要說(shuō)什麼制度僵化啦,難以突破啦,大學(xué)是高度自治區(qū),禮聘幾位兼任老師,不全都是系上的權(quán)責(zé)范圍內(nèi)嗎?
當(dāng)學(xué)子們?cè)谡n程上學(xué)不到他要的東西,就只好閉門(mén)自修。但是,循序性(sequential)語(yǔ)言尚有自修學(xué)會(huì)的可能,物件導(dǎo)向語(yǔ)言嘛,以大學(xué)生的程度來(lái)講,我認(rèn)為自修實(shí)在困難,只會(huì)修出個(gè)四不像、半瓶水。
管不到學(xué)校!管不到教授!自求多福的情況下,希望看到這篇文章的你,知道 C++/OOP 該怎麼學(xué)。
不要沉迷於 C++ object model
對(duì)於底層知識(shí)有濃厚興趣的朋友,下探到 object model 領(lǐng)域,一定會(huì)非常開(kāi)心地在 object size、object layout、vptr/vtbl、以及許多布幕後的技術(shù)之間玩將起來(lái)。了解這些東西,當(dāng)然是好的,但是由於一探究竟得其奧秘的快感與成就感,使得一些朋友們?cè)谶@個(gè)層面里「玩」起來(lái)了,小地方玩得很精,玩得不亦樂(lè)乎,玩得忽略了 C++/OOP 的最終目標(biāo)。
最終目標(biāo)是 polymorphism!
我要說(shuō),在 C++ syntax 以及相對(duì)低階的 C++ semantics 里,不要玩得太過(guò)火。過(guò)猶不及,會(huì)傷身的。C++ 經(jīng)典名書(shū)內(nèi)附的一些習(xí)題,在我看來(lái)頗有點(diǎn)玩得過(guò)火的味道。至於什麼百題精選、題庫(kù)大成,除了修練基本功之外,都滿無(wú)趣的東西。
Programming 應(yīng)該是一種天馬行空的想像力與創(chuàng)意的組合;如果你能夠自己想題目,譬如說(shuō)實(shí)作一個(gè)天體運(yùn)行的 class 體系、或是實(shí)作一個(gè)生物分類(界門(mén)綱目科屬種)體系,不是很有趣嗎?準(zhǔn)備資料的過(guò)程中,查查百科全書(shū),你也因此查到了太陽(yáng)系九大行星的幾何資料,哈雷慧星的軌道周期,或是黑面琵鷺的「界門(mén)綱目科屬種」英文名稱,這難道不比鉆研於 ++++i 或 ----i 或 *&*&p 之類的頭腦體操題目有趣嗎?(看過(guò)不少這類好笑題目,沒(méi)一個(gè)記下來(lái),只好胡亂寫(xiě)幾個(gè)運(yùn)算式。諸位應(yīng)該知道我說(shuō)的那種頭腦體操題目)
固然,在科學(xué)與工程的領(lǐng)域里頭,無(wú)技術(shù)無(wú)以為立,但別把自己弄得過(guò)於僵化,過(guò)於匠氣。僵化與匠氣是我們教育體系的最大沉疴。到了高專層次,敗象顯露無(wú)遺。
轉(zhuǎn)載于:https://www.cnblogs.com/newhand-liu/archive/2012/03/06/2793304.html
總結(jié)
以上是生活随笔為你收集整理的C++的沉迷与爱恋——侯捷的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 红苋菜可以晒干了吃吗
- 下一篇: ArcEngine 获取HDF文件中的子