VC++學(xué)習(xí)經(jīng)驗(yàn):也談編程本質(zhì)
發(fā)布時(shí)間:2008-12-14 閱讀數(shù): 次 來(lái)源:網(wǎng)樂(lè)原科技
作者:johnnyxia/CSDN
最近在網(wǎng)上看到leezy_2000的一篇文章,《編程本質(zhì)》,讀了之后頗有感觸。有些觀點(diǎn),我非常贊同,但是,有些我卻有不同的看法。覺(jué)得在文章之后的討論區(qū)不能一吐為快,另外,也早有許多相關(guān)的想法想表達(dá),所以就干脆打開(kāi)Word,敲下了這篇文章。希望能和leezy_2000,以及其他的程序員朋友一同分享。
leezy_2000把程序設(shè)計(jì)歸結(jié)為四大要素:?jiǎn)栴}、概念、邏輯和技巧,并且舉了一個(gè)例子加以說(shuō)明。問(wèn)題是程序的目的,概念是在解決問(wèn)題時(shí)用到的抽象事物(或者說(shuō)是術(shù)語(yǔ)),邏輯是描述如何解決問(wèn)題的,技巧等同于實(shí)現(xiàn),使用何種計(jì)算機(jī)語(yǔ)言或框架等。這四大要素其實(shí)是程序設(shè)計(jì)的四個(gè)步驟,分析、抽象、概要設(shè)計(jì)、實(shí)現(xiàn)。從程序開(kāi)發(fā)的過(guò)程上來(lái)說(shuō),的確如此。
但是,作者把程序的本質(zhì)歸結(jié)為概念和邏輯,我并不贊同。我倒是有些贊同cppTrier的觀點(diǎn),“編程的本質(zhì)是問(wèn)題模型到編程語(yǔ)言的映射”。但是這樣描述的話,程序員變成了翻譯員,抹殺了程序員的創(chuàng)造性。所以我覺(jué)得編程的本質(zhì)更應(yīng)該是以編程語(yǔ)言的思想描述、解決現(xiàn)實(shí)問(wèn)題。Thinking in Programming Language。
關(guān)于語(yǔ)言和框架,leezy_2000的描述非常的經(jīng)典?!罢Z(yǔ)言是邏輯的載體和描述工具,框架是對(duì)邏輯和概念的一種封裝”。使用不同的語(yǔ)言解決相同的問(wèn)題,他們的邏輯是不同的。一個(gè)極端的例子是Prolog語(yǔ)言,這是我見(jiàn)到過(guò)的最奇怪的一種語(yǔ)言,但是用它來(lái)解決一些離散數(shù)學(xué)的問(wèn)題卻很方便。如果同樣的問(wèn)題讓一個(gè)Prolog程序員和一個(gè)C++程序員來(lái)解決,他們的邏輯顯然是不同的。大師說(shuō)“語(yǔ)言磨礪了我們的思維方式,也決定了我們的思考范圍”,就是這個(gè)道理(感謝weihere的引用,有時(shí)間我要去讀讀《The C++ Programming Language》)。每一種語(yǔ)言都有它內(nèi)在的一種描述問(wèn)題的思想和方法。
作為一個(gè)程序員,對(duì)于所使用的語(yǔ)言應(yīng)該有一個(gè)全面、深刻的認(rèn)識(shí),掌握它的思想,學(xué)會(huì)用它來(lái)思考和解決問(wèn)題。這也是Bruce Eckel在他的系列書(shū)籍Thinking in Java,Thinking in C++所提倡的。
那么如何掌握語(yǔ)言的思想呢?看看Bruce的書(shū)就行了嗎?那樣只能學(xué)到一些皮毛。你必須實(shí)踐,寫(xiě)上幾千,幾萬(wàn)行代碼。只有在水里才能學(xué)會(huì)游泳。一本好書(shū)只能幫助我們縮短學(xué)習(xí)的過(guò)程,它不能代替實(shí)踐。我不能想象一個(gè)人如果從來(lái)沒(méi)有寫(xiě)過(guò)面向?qū)ο蟮某绦?,他是如何理解UML之類的東西的;更不能想象一個(gè)初學(xué)C++或是Java的程序員是如何通過(guò)讀讀《Design Pattern》就能掌握設(shè)計(jì)模式的。
計(jì)算機(jī)是一門(mén)實(shí)踐的學(xué)科。當(dāng)我們?cè)谟懻摼幊痰谋举|(zhì)時(shí)候,決不能忘記實(shí)踐是重要的。本質(zhì)固然重要,如果少了實(shí)踐,就會(huì)變得形而上學(xué)。即使是微軟的高級(jí)副總裁,Rick Rashid,仍然每年堅(jiān)持編寫(xiě)大約50 000行代碼。他認(rèn)為,用最新的技術(shù)編程可以使他保持對(duì)計(jì)算機(jī)最前沿的技術(shù)的敏感。(摘自李開(kāi)復(fù)《給中國(guó)學(xué)生的一封信》)。而在我的周?chē)?,一些只帶幾個(gè)程序員的小官,就以編程為恥,他認(rèn)為象他這樣的官(也叫項(xiàng)目經(jīng)理)寫(xiě)程序,太丟份。真讓人汗顏!
我們是程序工人(Coder)還是軟件設(shè)計(jì)師(Designer)?在回答這個(gè)問(wèn)題之前,我們首先要明白,什么是設(shè)計(jì)?設(shè)計(jì)是工程上的概念,設(shè)計(jì)的結(jié)果是一組文檔,制造團(tuán)隊(duì)可以依據(jù)這份文檔,準(zhǔn)確的構(gòu)建出產(chǎn)品。源代碼是滿足這一要求的惟一的軟件設(shè)計(jì)文檔。和一般工程不同的是,根據(jù)源代碼構(gòu)建產(chǎn)品的成本非常低廉,它無(wú)須什么工人,計(jì)算機(jī)可以代勞。現(xiàn)在流行的看法,似乎只有畫(huà)UML圖才是設(shè)計(jì),而使用設(shè)計(jì)模式編碼的設(shè)計(jì)倒不算設(shè)計(jì)。這其實(shí)是本末倒置了,UML圖只能算是輔助設(shè)計(jì)文檔,真正的設(shè)計(jì)文檔是源代碼。因此,我們都是軟件設(shè)計(jì)師,我們是在設(shè)計(jì)軟件,而不是構(gòu)建軟件。(這一觀點(diǎn)出自于Jack Reeves的《源代碼就是設(shè)計(jì)》,《敏捷軟件開(kāi)發(fā)-原則、模式與實(shí)踐》附錄D)
設(shè)計(jì)軟件不是憑空的,你總是要以某一種編程語(yǔ)言來(lái)設(shè)計(jì)。和語(yǔ)言無(wú)關(guān)的設(shè)計(jì),只能算是概要設(shè)計(jì),只能做到一定的程度。要做詳細(xì)設(shè)計(jì)必須和某一種語(yǔ)言相關(guān)。
以上只是我的一家之言,希望能給其他的初學(xué)程序設(shè)計(jì)的程序員一些幫助。