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