VC學(xué)習(xí)經(jīng)驗(yàn):編程本質(zhì)論
發(fā)布時(shí)間:2008-12-14 閱讀數(shù): 次 來(lái)源:網(wǎng)樂(lè)原科技
作者:byleezy_2000/CSDN
這幾年各種新的技術(shù)井噴一樣的涌現(xiàn)出來(lái)。身處這樣一個(gè)時(shí)代的我們,難免就有一種拔劍四顧,心下茫然的感覺(jué)。在某一方面的做到精專已屬不易,全才似不可能,那么究竟又該何去何從?這篇文章目的是探討編程過(guò)程中一些本質(zhì)的東西,已期對(duì)大家的學(xué)習(xí)有所幫助。
個(gè)人以為,從編程這一職業(yè)誕生開(kāi)始一直至今,其本質(zhì)就沒(méi)有改變過(guò)。對(duì)概念的抽象對(duì)邏輯的描述始終都是編程過(guò)程中最核心的東西。
程序?yàn)榻鉀Q某一問(wèn)題而存在。而問(wèn)題可拆分成某些概念和邏輯關(guān)系。而結(jié)構(gòu)化程序設(shè)計(jì)和面向?qū)ο蟪绦蛟O(shè)計(jì)不過(guò)是對(duì)概念和邏輯進(jìn)行表達(dá)的不同方式。而程序中邏輯關(guān)系的復(fù)雜程度隨程序的規(guī)模而增加。
程序的本質(zhì)不是各種技巧。就算你把EffectiveC++,MoreEffectiveC++中的每一條款都應(yīng)用到了你的C++程序中,如果沒(méi)有對(duì)邏輯關(guān)系的良好組織,你的程序也可能糟不可言??赡芨唏詈系蛢?nèi)聚,可能不可擴(kuò)充―――。
上面這段文字提到了四個(gè)概念,他們分別是:?jiǎn)栴}、概念、邏輯和技巧。
我來(lái)舉個(gè)例子來(lái)說(shuō)明這四個(gè)概念都代表些什么。
現(xiàn)在假設(shè)我們需要根據(jù)已知的一個(gè)文件名產(chǎn)生一個(gè)臨時(shí)文件名。如果輸入為 prog.dat,mydir,hello.,oops.tmp,end.dat那么相應(yīng)的輸出為
prog.dat=>prog.tmp
mydir=>mydir.tmp
hello.=>hello.tmp
oops.tmp=>oops.xxx
end.dat=>end.tmp
什么都不做的程序是不存在的,程序總要解決客觀世界中的某些問(wèn)題。這里的問(wèn)題就是要為一個(gè)已知的文件名產(chǎn)生相應(yīng)的臨時(shí)文件名。
解決這個(gè)問(wèn)題時(shí)涉及的概念主要有兩個(gè):字符串和擴(kuò)展名。擴(kuò)展名可以用字符串進(jìn)行表示。
解決這個(gè)問(wèn)題的邏輯之一可用下面的偽代碼來(lái)表述:
if(輸入文件名沒(méi)有擴(kuò)展名)
{
用輸入文件名、'.'號(hào)和"tmp"生成臨時(shí)文件名;
}
else
{
得到輸入文件名的擴(kuò)展名;
if(擴(kuò)展名為空)
{
用輸入文件名和"tmp"生成臨時(shí)文件名;
}
elseif(擴(kuò)展名為"tmp")
{
把"tmp"替換為"xxx";
}
else
{
把文件名'.'以后的部分替換為"tmp";
}
}
當(dāng)然你還可以有其他的實(shí)現(xiàn)邏輯,而這種邏輯總是可以獨(dú)立于語(yǔ)言、操作系統(tǒng)的。
至于你是用C++標(biāo)準(zhǔn)庫(kù)、還是MFC的Cstring類或者.net中的相應(yīng)類或者不依靠類庫(kù)自己用某種語(yǔ)言來(lái)表述這種邏輯那就是技巧。
上面雖然是個(gè)小例子,但我認(rèn)為完成任何程序:從上層應(yīng)用直到底層驅(qū)動(dòng),都會(huì)涉及到這四個(gè)概念,。
上面所說(shuō)編程時(shí)必須的四個(gè)要素中,我個(gè)人認(rèn)為邏輯和概念是編程中更本質(zhì)的東西,直接的原因是他們?cè)诟蟮某潭壬蠜Q定著程序的質(zhì)量。不要忘了評(píng)價(jià)軟件質(zhì)量的幾個(gè)指標(biāo):
健壯性、可重用性、易擴(kuò)充性、容錯(cuò)性等。
而這些指標(biāo)并不是你選擇了某個(gè)語(yǔ)言或者某個(gè)框架他們就達(dá)到了。而要通過(guò)對(duì)解決的問(wèn)題的邏輯進(jìn)行提煉和精化才可能達(dá)到。不要說(shuō)這是系統(tǒng)分析的責(zé)任,程序每一部分都有自己要解決的問(wèn)題,怎么可能每一部分程序質(zhì)量的保證都是系統(tǒng)分析的責(zé)任。
此外當(dāng)你要把原來(lái)用軟件實(shí)現(xiàn)的功能換做用硬件來(lái)實(shí)現(xiàn)的時(shí)候,這點(diǎn)就分外的明顯--軟件其實(shí)就是一組邏輯關(guān)系。
但眼下主流意識(shí)形態(tài)似乎并不認(rèn)同這點(diǎn),各種招聘廣告可為明證。
下面是一個(gè)招聘軟件工程師的廣告:
1.BSdegreeoraboveincomputerscience.
2.Atleast2yearsofdriverdevelopmentexperience.
3.ExperienceinC,C++,windowsSDK/DDKorLinuxsystemdevelopment.
4.Familiarwithcomputernetworkingortelecommunication802.3,802.11,TCP/IPprotocolisaplus.
5.Familiarwithembeddedsystemdesign.
6.FamiliarwithBluetoothisaplus.
如果把編程與磨刀砍柴做類比的化,那么
當(dāng)某個(gè)人熟悉某種語(yǔ)言、某個(gè)框架、某個(gè)IDE、某個(gè)協(xié)議某個(gè)開(kāi)發(fā)包的時(shí)候我們可以認(rèn)為這個(gè)人擁有一把較鋒利的柴刀。但這和這個(gè)人最終擅不擅長(zhǎng)砍柴并沒(méi)有必然的關(guān)系。夫欲善其事,必先利其器。但利其器了未必就會(huì)善其事。所以說(shuō)上面的廣告一定程度上相當(dāng)于想找一個(gè)會(huì)砍柴的人,但看人的時(shí)候卻更注重他有沒(méi)有一把鋒利的刀子。(更可悲的是掙扎在生存邊緣的我們,縱然不愿卻也不得不迎合這種要求)
未避免矯枉過(guò)正,這里要強(qiáng)調(diào)一點(diǎn),不是說(shuō)基本技能不重要,沒(méi)有對(duì)語(yǔ)言、框架、IDE的一定認(rèn)識(shí),根本就產(chǎn)生不了有用的程序。但當(dāng)我們執(zhí)迷于對(duì)不同語(yǔ)言、框架、IDE的優(yōu)缺點(diǎn)進(jìn)行比較的時(shí)候,不要忘了他們并不對(duì)程序的健壯性、可重用性、易擴(kuò)充性、容錯(cuò)性等最終衡量程序優(yōu)劣的諸多方面起決定作用。起決定作用的是你對(duì)概念的定義方式和對(duì)各種復(fù)雜邏輯關(guān)系的描述方式。
語(yǔ)言是什么?語(yǔ)言是邏輯的載體和描述的工具。當(dāng)你試圖表述邏輯關(guān)系的時(shí)候大多語(yǔ)言應(yīng)該是滿足這一要求的,要不然他早被淘汰了??蚣苁鞘裁??框架是對(duì)邏輯和概念的一種封裝??蚣馨涯骋活I(lǐng)域通用的概念和邏輯封裝起來(lái),進(jìn)而使程序員不必做一些重復(fù)性的工作。而實(shí)際上對(duì)這個(gè)領(lǐng)域的這些通用概念并不只有這么一種表述方式,也就是說(shuō)并不只有一種邏輯表述。你選擇某個(gè)框架的同時(shí)也就意味這你從n種方式中選擇了一種,舍棄了其他。沒(méi)有那個(gè)框架是完美的,選擇的同時(shí)自然也就繼承了這種不完美。所以善用他們,他們很重要,但不會(huì)再重要了。
當(dāng)我意識(shí)到這點(diǎn)時(shí),我發(fā)現(xiàn)雖然編程許久,但在對(duì)邏輯表述方面的能力卻沒(méi)有寸進(jìn),因?yàn)榘?0%以上的時(shí)間都投在了技巧的提升上了。JeffreyRichter和MattPietrek兩位堪稱Windows編程界中的技巧大師??晌椰F(xiàn)在敢說(shuō)即使你把《Windows核心編程》、《ProgrammingServer-SideApplicationforMicorsoftWindows2000》還有MSDN雜志的UndertheHood專欄倒背如流,你可能還是寫不出高質(zhì)量的程序。這些東西是必須的,但遠(yuǎn)不是全部。
林銳寫過(guò)一本《高質(zhì)量C++/C編程指南》,此書在網(wǎng)上流傳甚廣,我想原因有二:一是此書對(duì)C/C++語(yǔ)言中的容易造成模糊的地方進(jìn)行了詳細(xì)說(shuō)明(真的很有用);二是林銳筆法不錯(cuò)。但也正因其流傳甚廣,我覺(jué)得在這里必須指出,此書嚴(yán)重的文不對(duì)題。按照書中所說(shuō)那些就能設(shè)計(jì)出高質(zhì)量的C/C++程序么?那些都是編程所需要的技巧,不過(guò)是告訴你怎么能磨出一把鋒利的刀而已。如果讀過(guò)此書的人都把這些技巧和高質(zhì)量的程序相等價(jià),那么學(xué)習(xí)時(shí)恐怕就難免會(huì)誤入歧途了。
這個(gè)題目太大,我是姑妄言之。這里不過(guò)是剛剛開(kāi)始一種探討而遠(yuǎn)非結(jié)論。歡迎大家一起討論,還望諸君有以教我!