国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
向大家推薦一文《源代碼就是設(shè)計(jì)》
引用
按]這是一篇偉大的論文,該文撰寫于1992年,作者在當(dāng)時(shí)就能有這樣的反思,實(shí)在是非常了不起。

 

至今,我仍能記起當(dāng)我頓悟并最終產(chǎn)生下面文章時(shí)所在的地方。那是1986年的夏天,我在加利福尼亞中國(guó)湖海軍武器中心擔(dān)任臨時(shí)顧問(wèn)。在這期間,我有幸參加了一個(gè)關(guān)于Ada的研討會(huì)。討論當(dāng)中,有一位聽眾提出了一個(gè)具有代表性的問(wèn)題,“軟件開發(fā)者是工程師嗎?”我不記得當(dāng)時(shí)的回答,但是我卻記得當(dāng)時(shí)并沒有真正解答這個(gè)問(wèn)題。于是,我就退出討論,開始思考我會(huì)怎樣回答這樣一個(gè)問(wèn)題?,F(xiàn)在,我無(wú)法肯定當(dāng)時(shí)我為什么會(huì)記起幾乎10年前曾經(jīng)在Datamation雜志上閱讀過(guò)的一篇論文,不過(guò)促使我記起的應(yīng)該是后續(xù)討論中的某些東西。這篇論文闡述了工程師為什么必須是好的作家(我記得該論文談?wù)摼褪沁@個(gè)問(wèn)題——好久沒有看了),但是我從該論文中得到的關(guān)鍵一點(diǎn)是:作者認(rèn)為工程過(guò)程的最終結(jié)果是文檔。換句話說(shuō),工程師生產(chǎn)的是文檔,不是實(shí)物。其他人根據(jù)這些文檔去制造實(shí)物。于是,我就在困惑中提出了一個(gè)問(wèn)題,“除了軟件項(xiàng)目正常產(chǎn)生的所有文檔以外,還有可以被認(rèn)為是真正的工程文檔的東西嗎?”我給出的回答是,“是的,有這樣的文檔存在,并且只有一份——源代碼。”

把源代碼看作是一份工程文檔——設(shè)計(jì)——完全顛覆了我對(duì)自己所選擇的職業(yè)的看法。它改變了我看待一切事情的方式。此外,我對(duì)它思考的越多,我就越覺得它闡明了軟件項(xiàng)目常常遇到的眾多問(wèn)題。更確切地說(shuō),我覺得大多數(shù)人不理解這個(gè)不同的看法,或者有意拒絕它這樣一個(gè)事實(shí),就足以說(shuō)明很多問(wèn)題。幾年后,我終于有機(jī)會(huì)把我的觀點(diǎn)公開發(fā)表。C++ Journal中的一篇有關(guān)軟件設(shè)計(jì)的論文促使我給編輯寫了一封關(guān)于這個(gè)主題的信。經(jīng)過(guò)幾封書信交換后,編輯Livleen Singh同意把我關(guān)于這個(gè)主題的想法發(fā)表為一篇論文。下面就是這篇文章。

——Jack Reecves, December,22,2001

什么是軟件設(shè)計(jì)?
Jack W.Reeves, 1992

面向?qū)ο蠹夹g(shù),特別是C++,似乎給軟件界帶來(lái)了不小的震動(dòng)。出現(xiàn)了大量的論文和書籍去描述如何應(yīng)用這項(xiàng)新技術(shù)。總的來(lái)說(shuō),那些關(guān)于面向?qū)ο蠹夹g(shù)是否只是一個(gè)騙局的問(wèn)題已經(jīng)被那些關(guān)于如何付出最小的努力即可獲得收益的問(wèn)題所替代。面向?qū)ο蠹夹g(shù)出現(xiàn)已經(jīng)有一段時(shí)間了,但是這種爆炸式的流行卻似乎有點(diǎn)不尋常。人們?yōu)楹螘?huì)突然關(guān)注它呢?對(duì)于這個(gè)問(wèn)題,人們給出了各種各樣的解釋。事實(shí)上,很可能就沒有單一的原因。也許,把多種因素的結(jié)合起來(lái)才能最終取得突破,并且這項(xiàng)工作正在進(jìn)展之中。盡管如此,在軟件革命的這個(gè)最新階段中,C++本身看起來(lái)似乎成為了一個(gè)主要因素。同樣,對(duì)于這個(gè)問(wèn)題,很可能也存在很多種理由,不過(guò)我想從一個(gè)稍微不同的視角給出一個(gè)答案:C++之所以變得流行,是因?yàn)樗管浖O(shè)計(jì)變得更容易的同時(shí),也使編程變得更容易。

雖然這個(gè)解釋好像有點(diǎn)奇特,但是它卻是深思熟慮的結(jié)果。在這篇論文中,我就是想要關(guān)注一下編程和程序設(shè)計(jì)之間的關(guān)系。近10年來(lái),我一直覺得整個(gè)軟件行業(yè)都沒有覺察到做出一個(gè)軟件設(shè)計(jì)和什么是真正的軟件設(shè)計(jì)之間的一個(gè)微妙的不同點(diǎn)。只要看到了這一點(diǎn),我認(rèn)為我們就可以從C++增長(zhǎng)的流行趨勢(shì)中,學(xué)到關(guān)于如何才能成為更好的軟件工程師的意義深遠(yuǎn)的知識(shí)。這個(gè)知識(shí)就是,編程不是構(gòu)建軟件,而是設(shè)計(jì)軟件。

幾年前,我參見了一個(gè)討論會(huì),其中討論到軟件開發(fā)是否是一門工程學(xué)科的問(wèn)題。雖然我不記得了討論結(jié)果,但是我卻記得它是如何促使我認(rèn)識(shí)到:軟件業(yè)已經(jīng)做出了一些錯(cuò)誤的和硬件工程的比較,而忽視了一些絕對(duì)正確的對(duì)比。其實(shí),我認(rèn)為我們不是軟件工程師,因?yàn)槲覀儧]有認(rèn)識(shí)到什么才是真正的軟件設(shè)計(jì)?,F(xiàn)在,我對(duì)這一點(diǎn)更是確信無(wú)疑。

任何工程活動(dòng)的最終目標(biāo)都是某些類型的文檔。當(dāng)設(shè)計(jì)工作完成時(shí),設(shè)計(jì)文檔就被轉(zhuǎn)交給制造團(tuán)隊(duì)。該團(tuán)隊(duì)是一個(gè)和設(shè)計(jì)團(tuán)隊(duì)完全不同的群體,并且其技能也和設(shè)計(jì)團(tuán)隊(duì)完全不同。如果設(shè)計(jì)文檔正確地描繪了一個(gè)完整的設(shè)計(jì),那么制造團(tuán)隊(duì)就可以著手構(gòu)建產(chǎn)品。事實(shí)上,他們可以著手構(gòu)建該產(chǎn)品的許多實(shí)物,完全無(wú)需設(shè)計(jì)者的任何進(jìn)一步的介入。在按照我的理解方式審查了軟件開發(fā)的生命周期后,我得出一個(gè)結(jié)論:實(shí)際上滿足工程設(shè)計(jì)標(biāo)準(zhǔn)的惟一軟件文檔,就是源代碼清單。

對(duì)于這個(gè)觀點(diǎn),人們進(jìn)行了很多的爭(zhēng)論,無(wú)論是贊成的還是反對(duì)的都足以寫成無(wú)數(shù)的論文。本文假定最終的源代碼就是真正的軟件設(shè)計(jì),然后仔細(xì)研究了該假定帶來(lái)的一些結(jié)果。我可能無(wú)法證明這個(gè)觀點(diǎn)是正確的,但是我希望證明:它確實(shí)解釋了軟件行業(yè)中一些已經(jīng)觀察到的事實(shí),包括C++的流行。

在把代碼看作是軟件設(shè)計(jì)所帶來(lái)的結(jié)果中,有一個(gè)結(jié)果完全蓋過(guò)了所有其他的結(jié)果。它非常重要并且非常明顯,也正因?yàn)槿绱耍瑢?duì)于大多數(shù)軟件機(jī)構(gòu)來(lái)說(shuō),它完全是一個(gè)盲點(diǎn)。這個(gè)結(jié)果就是:軟件的構(gòu)建是廉價(jià)的。它根本就不具有昂貴的資格;它非常的廉價(jià),幾乎就是免費(fèi)的。如果源代碼是軟件設(shè)計(jì),那么實(shí)際的軟件構(gòu)建就是由編譯器和連接器完成的。我們常常把編譯和連接一個(gè)完整的軟件系統(tǒng)的過(guò)程稱為“進(jìn)行一次構(gòu)建”。在軟件構(gòu)建設(shè)備上所進(jìn)行的主要投資是很少的——實(shí)際需要的只有一臺(tái)計(jì)算機(jī)、一個(gè)編輯器、一個(gè)編譯器以及一個(gè)連接器。一旦具有了一個(gè)構(gòu)建環(huán)境,那么實(shí)際的軟件構(gòu)建只需花費(fèi)少許的時(shí)間。編譯50 000行的C++程序也許會(huì)花費(fèi)很長(zhǎng)的時(shí)間,但是構(gòu)建一個(gè)具有和50 000行C++程序同樣設(shè)計(jì)復(fù)雜性的硬件系統(tǒng)要花費(fèi)多長(zhǎng)的時(shí)間呢?

把源代碼看作是軟件設(shè)計(jì)的另外一個(gè)結(jié)果是,軟件設(shè)計(jì)相對(duì)易于創(chuàng)作,至少在機(jī)械意義上如此。通常,編寫(也就是設(shè)計(jì))一個(gè)具有代表性的軟件模塊(50至100行代碼)只需花費(fèi)幾天的時(shí)間(對(duì)它進(jìn)行完全的調(diào)試是另外一個(gè)議題,稍后會(huì)對(duì)它進(jìn)行更多的討論)。我很想問(wèn)一下,是否還有任何其他的學(xué)科可以在如此短的時(shí)間內(nèi),產(chǎn)生出和軟件具有同樣復(fù)雜性的設(shè)計(jì)來(lái),不過(guò),首先我們必須要弄清出如何來(lái)度量和比較復(fù)雜性。然而,有一點(diǎn)是明顯的,那就是軟件設(shè)計(jì)可以 極為迅速地變得非常龐大。

假設(shè)軟件設(shè)計(jì)相對(duì)易于創(chuàng)作,并且在本質(zhì)上構(gòu)建起來(lái)也沒有什么代價(jià),一個(gè)不令人吃驚的發(fā)現(xiàn)是,軟件設(shè)計(jì)往往是難以置信的龐大和復(fù)雜。這看起來(lái)似乎很明顯,但是問(wèn)題的重要性卻常常被忽視。學(xué)校中的項(xiàng)目通常具有數(shù)千行的代碼。具有10 000行代碼(設(shè)計(jì))的軟件產(chǎn)品被它們的設(shè)計(jì)者丟棄的情況也是有的。我們?cè)缇筒辉訇P(guān)注于簡(jiǎn)單的軟件。典型的商業(yè)軟件的設(shè)計(jì)都是由數(shù)十萬(wàn)行代碼組成的。許多軟件設(shè)計(jì)達(dá)到了上百萬(wàn)行代碼。另外,軟件設(shè)計(jì)幾乎總是在不斷地演化。雖然當(dāng)前的設(shè)計(jì)可能只有幾千行代碼,但是在產(chǎn)品的生命期中,實(shí)際上可能要編寫許多倍的代碼。

盡管確實(shí)存在一些硬件設(shè)計(jì),它們看起來(lái)似乎和軟件設(shè)計(jì)一樣復(fù)雜,但是請(qǐng)注意兩個(gè)有關(guān)現(xiàn)代硬件的事實(shí)。第一,復(fù)雜的硬件工程成果未必總是沒有錯(cuò)誤的,在這一點(diǎn)上,它不存在像軟件那樣讓我們相信的評(píng)判標(biāo)準(zhǔn)。多數(shù)的微處理器在發(fā)售時(shí)都具有一些邏輯錯(cuò)誤:橋梁坍塌,大壩破裂,飛機(jī)失事以及數(shù)以千計(jì)的汽車和其他消費(fèi)品被召回——所有的這些我們都記憶猶新,所有的這些都是設(shè)計(jì)錯(cuò)誤的結(jié)果。第二,復(fù)雜的硬件設(shè)計(jì)具有與之對(duì)應(yīng)的復(fù)雜、昂貴的構(gòu)建階段。結(jié)果,制造這種系統(tǒng)所需的能力限制了真正能夠生產(chǎn)復(fù)雜硬件設(shè)計(jì)公司的數(shù)目。對(duì)于軟件來(lái)說(shuō),沒有這種限制。目前,已經(jīng)有數(shù)以百計(jì)的軟件機(jī)構(gòu)和數(shù)以千計(jì)的非常復(fù)雜的軟件系統(tǒng)存在,并且數(shù)量以及復(fù)雜性每天都在增長(zhǎng)。這意味著軟件行業(yè)不可能通過(guò)仿效硬件開發(fā)者找到針對(duì)自身問(wèn)題的解決辦法。倘若一定要說(shuō)出有什么相同之處的話,那就是,當(dāng)CAD和CAM可以做到幫助硬件設(shè)計(jì)者創(chuàng)建越來(lái)越復(fù)雜的設(shè)計(jì)時(shí),硬件工程才會(huì)變得和軟件開發(fā)越來(lái)越像。

設(shè)計(jì)軟件是一種管理復(fù)雜性的活動(dòng)。復(fù)雜性存在于軟件設(shè)計(jì)本身之中,存在于公司的軟件機(jī)構(gòu)之中,也存在于整個(gè)軟件行業(yè)之中。軟件設(shè)計(jì)和系統(tǒng)設(shè)計(jì)非常相似。它可以跨越多種技術(shù)并且常常涉及多個(gè)學(xué)科分支。軟件的規(guī)格說(shuō)明往往不固定、經(jīng)??焖僮兓@種變化常常在正進(jìn)行軟件設(shè)計(jì)時(shí)發(fā)生。同樣,軟件開發(fā)團(tuán)隊(duì)也往往不固定,常常在設(shè)計(jì)過(guò)程的中間發(fā)生變化。在許多方面,軟件都要比硬件更像復(fù)雜的社會(huì)或者有機(jī)系統(tǒng)。所有這些都使得軟件設(shè)計(jì)成為了一個(gè)困難的并且易出錯(cuò)的過(guò)程。雖然所有這些都不是創(chuàng)造性的想法,但是在軟件工程革命開始將近30年后的今天,和其他工程行業(yè)相比,軟件開發(fā)看起來(lái)仍然像是一種未受過(guò)訓(xùn)練(undisciplined)的技藝。

一般的看法認(rèn)為,當(dāng)真正的工程師完成了一個(gè)設(shè)計(jì),不管該設(shè)計(jì)有多么復(fù)雜,他們都非常確信該設(shè)計(jì)是可以工作的。他們也非常確信該設(shè)計(jì)可以使用公認(rèn)的技術(shù)建造出來(lái)。為了做到這一點(diǎn),硬件工程師花費(fèi)了大量的時(shí)間去驗(yàn)證和改進(jìn)他們的設(shè)計(jì)。例如,請(qǐng)考慮一個(gè)橋梁設(shè)計(jì)。在這樣一個(gè)設(shè)計(jì)實(shí)際建造之前,工程師會(huì)進(jìn)行結(jié)構(gòu)分析——他們建立計(jì)算機(jī)模型并進(jìn)行仿真,他們建立比例模型并在風(fēng)洞中或者用其他一些方法進(jìn)行測(cè)試。簡(jiǎn)而言之,在建造前,設(shè)計(jì)者會(huì)使用他們能夠想到的一切方法來(lái)證實(shí)設(shè)計(jì)是正確的。對(duì)于一架新型客機(jī)的設(shè)計(jì)來(lái)說(shuō),情況甚至更加嚴(yán)重;必須要構(gòu)建出和原物同尺寸的原型,并且必須要進(jìn)行飛行測(cè)試來(lái)驗(yàn)證設(shè)計(jì)中的種種預(yù)計(jì)。

對(duì)于大多數(shù)人來(lái)說(shuō),軟件中明顯不存在和硬件設(shè)計(jì)同樣嚴(yán)格的工程。然而,如果我們把源代碼看做是設(shè)計(jì),那么就會(huì)發(fā)現(xiàn)軟件工程師實(shí)際上對(duì)他們的設(shè)計(jì)做了大量的驗(yàn)證和改進(jìn)。軟件工程師不把這稱為工程,而稱它為測(cè)試和調(diào)試。大多數(shù)人不把測(cè)試和調(diào)試看作是真正的“工程”——在軟件行業(yè)中肯定沒有被看作是。造成這種看法的原因,更多的是因?yàn)檐浖袠I(yè)拒絕把代碼看作設(shè)計(jì),而不是任何實(shí)際的工程差別。事實(shí)上,試驗(yàn)?zāi)P?、原型以及電路試?yàn)板已經(jīng)成為其他工程學(xué)科公認(rèn)的組成部分。軟件設(shè)計(jì)者之所以不具有或者沒有使用更多的正規(guī)方法來(lái)驗(yàn)證他們的設(shè)計(jì),是因?yàn)檐浖?gòu)建周期的簡(jiǎn)單經(jīng)濟(jì)規(guī)律。

第一個(gè)啟示:僅僅構(gòu)建設(shè)計(jì)并測(cè)試它比做任何其他事情要廉價(jià)一些,也簡(jiǎn)單一些。我們不關(guān)心做了多少次構(gòu)建——這些構(gòu)建在時(shí)間方面的代價(jià)幾乎為零,并且如果我們丟棄了構(gòu)建,那么它所使用的資源完全可以重新利用。請(qǐng)注意,測(cè)試并非僅僅是讓當(dāng)前的設(shè)計(jì)正確,它也是改進(jìn)設(shè)計(jì)的過(guò)程的一部分。復(fù)雜系統(tǒng)的硬件工程師常常建立模型(或者,至少他們把設(shè)計(jì)用計(jì)算機(jī)圖形直觀地表現(xiàn)出來(lái))。這就使得他們獲得了對(duì)于設(shè)計(jì)的一種“感覺”,而僅僅去檢查設(shè)計(jì)是不可能獲得這種感覺的。對(duì)于軟件來(lái)說(shuō),構(gòu)建這樣一個(gè)模型既不可能也無(wú)必要。我們僅僅構(gòu)建產(chǎn)品本身。即使正規(guī)的軟件驗(yàn)證可以和編譯器一樣自動(dòng)進(jìn)行,我們還是會(huì)去進(jìn)行構(gòu)建/測(cè)試循環(huán)。因此,正規(guī)的驗(yàn)證對(duì)于軟件行業(yè)來(lái)說(shuō)從來(lái)沒有太多的實(shí)際意義。

這就是現(xiàn)今軟件開發(fā)過(guò)程的現(xiàn)實(shí)。數(shù)量不斷增長(zhǎng)的人和機(jī)構(gòu)正在創(chuàng)建著更加復(fù)雜的軟件設(shè)計(jì)。這些設(shè)計(jì)會(huì)被先用某些編程語(yǔ)言編寫出來(lái),然后通過(guò)構(gòu)建/測(cè)試循環(huán)進(jìn)行驗(yàn)證和改進(jìn)。過(guò)程易于出錯(cuò),并且不是特別的嚴(yán)格。相當(dāng)多的軟件開發(fā)人員并不想相信這就是過(guò)程的運(yùn)作方式,也正因?yàn)檫@一點(diǎn),使問(wèn)題變得更加復(fù)雜。

當(dāng)前大多數(shù)的軟件過(guò)程都試圖把軟件設(shè)計(jì)的不同階段分離到不同的類別中。必須要在頂層的設(shè)計(jì)完成并且凍結(jié)后,才能開始編碼。測(cè)試和調(diào)試只對(duì)清除建造錯(cuò)誤是必要的。程序員處在中間位置,他們是軟件行業(yè)的建造工人。許多人認(rèn)為,如果我們可以讓程序員不再進(jìn)行“隨意的編碼(hacking)”并且按照交給他們的設(shè)計(jì)去進(jìn)行構(gòu)建(還要在過(guò)程中,犯更少的錯(cuò)誤),那么軟件開發(fā)就可以變得成熟,從而成為一門真正的工程學(xué)科。但是,只要過(guò)程忽視了工程和經(jīng)濟(jì)學(xué)事實(shí),這就不可能發(fā)生。

例如,任何一個(gè)現(xiàn)代行業(yè)都無(wú)法忍受在其制造過(guò)程中出現(xiàn)超過(guò)100%的返工率。如果一個(gè)建造工人常常不能在第一次就構(gòu)建正確,那么不久他就會(huì)失業(yè)。但是在軟件業(yè)中,即使最小的一塊代碼,在測(cè)試和調(diào)試期間,也很可能會(huì)被修正或者完全重寫。在一個(gè)創(chuàng)造性的過(guò)程中(比如:設(shè)計(jì)),我們認(rèn)可這種改進(jìn)不是制造過(guò)程的一部分。沒有人會(huì)期望工程師第一次就創(chuàng)建出完美的設(shè)計(jì)。即使她做到了,仍然必須讓它經(jīng)受改進(jìn)過(guò)程,目的就是為了證明它是完美的。

即使我們從日本的管理方法中沒有學(xué)到任何東西,我們也應(yīng)該知道由于在過(guò)程中犯錯(cuò)誤而去責(zé)備工人是無(wú)益于提高生產(chǎn)率的。我們不應(yīng)該不斷地強(qiáng)迫軟件開發(fā)去符合不正確的過(guò)程模型,相反,我們需要去改進(jìn)過(guò)程,使之有助于而不是阻礙產(chǎn)生更好的軟件。這就是“軟件工程”的石蕊測(cè)試。工程是關(guān)于你如何實(shí)施過(guò)程的,而不是關(guān)于是否需要一個(gè)CAD系統(tǒng)來(lái)產(chǎn)生最終的設(shè)計(jì)文檔。

關(guān)于軟件開發(fā)有一個(gè)壓倒性的問(wèn)題,那就是一切都是設(shè)計(jì)過(guò)程的一部分。編碼是設(shè)計(jì),測(cè)試和調(diào)試是設(shè)計(jì)的一部分,并且我們通常認(rèn)為的設(shè)計(jì)仍然是設(shè)計(jì)的一部分。雖然軟件構(gòu)建起來(lái)很廉價(jià),但是設(shè)計(jì)起來(lái)卻是難以置信的昂貴。軟件非常的復(fù)雜,具有眾多不同方面的設(shè)計(jì)內(nèi)容以及它們所導(dǎo)致的設(shè)計(jì)考慮。問(wèn)題在于,所有不同方面的內(nèi)容是相互關(guān)連的(就像硬件工程中的一樣)。我們希望頂層設(shè)計(jì)者可以忽視模塊算法設(shè)計(jì)的細(xì)節(jié)。同樣,我們希望程序員在設(shè)計(jì)模塊內(nèi)部算法時(shí)不必考慮頂層設(shè)計(jì)問(wèn)題。糟糕的是,一個(gè)設(shè)計(jì)層面中的問(wèn)題侵入到了其他層面之中。對(duì)于整個(gè)軟件系統(tǒng)的成功來(lái)說(shuō),為一個(gè)特定模塊選擇算法可能和任何一個(gè)更高層次的設(shè)計(jì)問(wèn)題同樣重要。在軟件設(shè)計(jì)的不同方面內(nèi)容中,不存在重要性的等級(jí)。最低層模塊中的一個(gè)不正確設(shè)計(jì)可能和最高層中的錯(cuò)誤一樣致命。軟件設(shè)計(jì)必須在所有的方面都是完整和正確的,否則,構(gòu)建于該設(shè)計(jì)基礎(chǔ)之上的所有軟件都會(huì)是錯(cuò)誤的。

為了管理復(fù)雜性,軟件被分層設(shè)計(jì)。當(dāng)程序員在考慮一個(gè)模塊的詳細(xì)設(shè)計(jì)時(shí),可能還有數(shù)以百計(jì)的其他模塊以及數(shù)以千計(jì)的細(xì)節(jié),他不可能同時(shí)顧及。例如,在軟件設(shè)計(jì)中,有一些重要方面的內(nèi)容不是完全屬于數(shù)據(jù)結(jié)構(gòu)和算法的范疇。在理想情況下,程序員不應(yīng)該在設(shè)計(jì)代碼時(shí)還得去考慮設(shè)計(jì)的這些其他方面的內(nèi)容。

但是,設(shè)計(jì)并不是以這種方式工作的,并且原因也開始變得明朗。軟件設(shè)計(jì)只有在其被編寫和測(cè)試后才算完成。測(cè)試是設(shè)計(jì)驗(yàn)證和改進(jìn)過(guò)程的基礎(chǔ)部分。高層結(jié)構(gòu)的設(shè)計(jì)不是完整的軟件設(shè)計(jì);它只是細(xì)節(jié)設(shè)計(jì)的一個(gè)結(jié)構(gòu)框架。在嚴(yán)格地驗(yàn)證高層設(shè)計(jì)方面,我們的能力是非常有限的。詳細(xì)設(shè)計(jì)最終會(huì)對(duì)高層設(shè)計(jì)造成的影響至少和其他的因素一樣多(或者應(yīng)該允許這種影響)。對(duì)設(shè)計(jì)的各個(gè)方面進(jìn)行改進(jìn),是一個(gè)應(yīng)該貫穿整個(gè)設(shè)計(jì)周期的過(guò)程。如果設(shè)計(jì)的任何一個(gè)方面內(nèi)容被凍結(jié)在改進(jìn)過(guò)程之外,那么對(duì)于最終設(shè)計(jì)將會(huì)是糟糕的或者甚至無(wú)法工作這一點(diǎn),就不會(huì)覺得奇怪了。

如果高層的軟件設(shè)計(jì)可以成為一個(gè)更加嚴(yán)格的工程過(guò)程,那該有多好呀,但是軟件系統(tǒng)的真實(shí)情況不是嚴(yán)格的。軟件非常的復(fù)雜,它依賴于太多的其他東西?;蛟S,某些硬件沒有按照設(shè)計(jì)者認(rèn)為的那樣工作,或者一個(gè)庫(kù)例程具有一個(gè)文檔中沒有說(shuō)明的限制。每一個(gè)軟件項(xiàng)目遲早都會(huì)遇到這些種類的問(wèn)題。這些種類的問(wèn)題會(huì)在測(cè)試期間被發(fā)現(xiàn)(如果我們的測(cè)試工作做得好的話),之所以如此是因?yàn)闆]有辦法在早期就發(fā)現(xiàn)它們。當(dāng)它們被發(fā)現(xiàn)時(shí),就迫使對(duì)設(shè)計(jì)進(jìn)行更改。如果我們幸運(yùn),那么對(duì)設(shè)計(jì)的更改是局部的。時(shí)常,更改會(huì)波及到整個(gè)軟件設(shè)計(jì)中的一些重要部分(莫非定律)。當(dāng)受到影響的設(shè)計(jì)的一部分由于某種原因不能更改時(shí),那么為了能夠適應(yīng)影響,設(shè)計(jì)的其他部分就必須得遭到破壞。這通常導(dǎo)致的結(jié)果就是管理者所認(rèn)為的“隨意編碼”,但是這就是軟件開發(fā)的現(xiàn)實(shí)。

例如,在我最近工作的一個(gè)項(xiàng)目中,發(fā)現(xiàn)了模塊A的內(nèi)部結(jié)構(gòu)和另一個(gè)模塊B之間的一個(gè)時(shí)序依賴關(guān)系。糟糕的是,模塊A的內(nèi)部結(jié)構(gòu)隱藏在一個(gè)抽象體的后面,而該抽象體不允許以任何方法把對(duì)模塊B的調(diào)用合入到它的正確調(diào)用序列中。當(dāng)問(wèn)題被發(fā)現(xiàn)時(shí),當(dāng)然已經(jīng)錯(cuò)過(guò)了更改A的抽象體的時(shí)機(jī)。正如所料,所發(fā)生的就是把一個(gè)日益增長(zhǎng)的復(fù)雜的“修正”集應(yīng)用到A的內(nèi)部設(shè)計(jì)上。在我們還沒有安裝完版本1時(shí),就普遍感覺到設(shè)計(jì)正在衰退。每一個(gè)新的修正很可能都會(huì)破壞一些老的修正。這是一個(gè)正規(guī)的軟件開發(fā)項(xiàng)目。最后,我和我的同事決定對(duì)設(shè)計(jì)進(jìn)行更改,但是為了得到管理層的同意,我們不得不自愿無(wú)償加班。

在任何一般規(guī)模的軟件項(xiàng)目中,肯定會(huì)出現(xiàn)像這樣的問(wèn)題,盡管人們使用了各種方法來(lái)防止它的出現(xiàn),但是仍然會(huì)忽視一些重要的細(xì)節(jié)。這就是工藝和工程之間的區(qū)別。如果經(jīng)驗(yàn)可以把我們引向正確的方向,這就是工藝。如果經(jīng)驗(yàn)只會(huì)把我們帶入未知的領(lǐng)域,然后我們必須使用一開始所使用的方法并通過(guò)一個(gè)受控的改進(jìn)過(guò)程把它變得更好,這就是工程。

我們來(lái)看一下只是作為其中很小一點(diǎn)的內(nèi)容,所有的程序員都知道,在編碼之后而不是之前編寫軟件設(shè)計(jì)文檔會(huì)產(chǎn)生更加準(zhǔn)確的文檔?,F(xiàn)在,原因是顯而易見的。用代碼來(lái)表現(xiàn)的最終設(shè)計(jì)是惟一一個(gè)在構(gòu)建/測(cè)試循環(huán)期間被改進(jìn)的東西。在這個(gè)循環(huán)期間,初始設(shè)計(jì)保持不變的可能性和模塊的數(shù)量以及項(xiàng)目中程序員的數(shù)量成反比。它很快就會(huì)變得毫無(wú)價(jià)值。

在軟件工程中,我們非常需要在各個(gè)層次都優(yōu)秀的設(shè)計(jì)。我們特別需要優(yōu)秀的頂層設(shè)計(jì)。初期的設(shè)計(jì)越好,詳細(xì)設(shè)計(jì)就會(huì)越容易。設(shè)計(jì)者應(yīng)該使用任何可以提供幫助的東西。結(jié)構(gòu)圖表、Booch 圖、狀態(tài)表、PDL等等——如果它能夠提供幫助,就去使用它。但是,我們必須記住,這些工具和符號(hào)都不是軟件設(shè)計(jì)。最后,我們必須創(chuàng)建真正的軟件設(shè)計(jì),并且是使用某種編程語(yǔ)言完成的。因此,當(dāng)我們得出設(shè)計(jì)時(shí),我們不應(yīng)該害怕對(duì)它們進(jìn)行編碼。在必要時(shí),我們必須應(yīng)該樂(lè)于去改進(jìn)它們。

至今,還沒有任何設(shè)計(jì)符號(hào)可以同時(shí)適用于頂層設(shè)計(jì)和詳細(xì)設(shè)計(jì)。設(shè)計(jì)最終會(huì)表現(xiàn)為以某種編程語(yǔ)言編寫的代碼。這意味著在詳細(xì)設(shè)計(jì)可以開始前,頂層設(shè)計(jì)符號(hào)必須被轉(zhuǎn)換成目標(biāo)編程語(yǔ)言。這個(gè)轉(zhuǎn)換步驟耗費(fèi)時(shí)間并且會(huì)引入錯(cuò)誤。程序員常常是對(duì)需求進(jìn)行回顧并且重新進(jìn)行頂層設(shè)計(jì),然后根據(jù)它們的實(shí)際去進(jìn)行編碼,而不是從一個(gè)可能沒有和所選擇的編程語(yǔ)言完全映射的符號(hào)進(jìn)行轉(zhuǎn)換。這同樣也是軟件開發(fā)的部分現(xiàn)實(shí)情況。

也許,如果讓設(shè)計(jì)者本人來(lái)編寫初始代碼,而不是后來(lái)讓其他人去轉(zhuǎn)換語(yǔ)言無(wú)關(guān)的設(shè)計(jì),就會(huì)更好一些。我們所需要的是一個(gè)適用于各個(gè)層次設(shè)計(jì)的統(tǒng)一符號(hào)。換句話說(shuō),我們需要一種編程語(yǔ)言,它同樣也適用于捕獲高層的設(shè)計(jì)概念。C++正好可以滿足這個(gè)要求。C++是一門適用于真實(shí)項(xiàng)目的編程語(yǔ)言,同時(shí)它也是一個(gè)非常具有表達(dá)力的軟件設(shè)計(jì)語(yǔ)言。C++允許我們直接表達(dá)關(guān)于設(shè)計(jì)組件的高層信息。這樣,就可以更容易地進(jìn)行設(shè)計(jì),并且以后可以更容易地改進(jìn)設(shè)計(jì)。由于它具有更強(qiáng)大的類型檢查機(jī)制,所以也有助于檢測(cè)到設(shè)計(jì)中的錯(cuò)誤。這就產(chǎn)生了一個(gè)更加健壯的設(shè)計(jì),實(shí)際上也是一個(gè)更好的工程化設(shè)計(jì)。

最后,軟件設(shè)計(jì)必須要用某種編程語(yǔ)言表現(xiàn)出來(lái),然后通過(guò)一個(gè)構(gòu)建/測(cè)試循環(huán)對(duì)其進(jìn)行驗(yàn)證和改進(jìn)。除此之外的任何其他主張都完全沒有用。請(qǐng)考慮一下都有哪些軟件開發(fā)工具和技術(shù)得以流行。結(jié)構(gòu)化編程在它的時(shí)代被認(rèn)為是創(chuàng)造性的技術(shù)。Pascal使之變得流行,從而自己也變得流行。面向?qū)ο笤O(shè)計(jì)是新的流行技術(shù),而C++是它的核心?,F(xiàn)在,請(qǐng)考慮一下那些沒有成效的東西。CASE工具,流行嗎?是的;通用嗎?不是。結(jié)構(gòu)圖表怎么樣?情況也一樣。同樣地,還有Warner-Orr圖、Booch圖、對(duì)象圖以及你能想起的一切。每一個(gè)都有自己的強(qiáng)項(xiàng),以及惟一的一個(gè)根本弱點(diǎn)——它不是真正的軟件設(shè)計(jì)。事實(shí)上,惟一一個(gè)可以被普遍認(rèn)可的軟件設(shè)計(jì)符號(hào)是PDL,而它看起來(lái)像什么呢?

這表明,在軟件業(yè)的共同潛意識(shí)中本能地知道,編程技術(shù),特別是實(shí)際開發(fā)所使用的編程語(yǔ)言的改進(jìn)和軟件行業(yè)中任何其他東西相比,具有壓倒性的重要性。這還表明,程序員關(guān)心的是設(shè)計(jì)。當(dāng)出現(xiàn)更加具有表達(dá)力的編程語(yǔ)言時(shí),軟件開發(fā)者就會(huì)使用它們。

同樣,請(qǐng)考慮一下軟件開發(fā)過(guò)程是如何變化的。從前,我們使用瀑布式過(guò)程?,F(xiàn)在,我們談?wù)摰氖锹菪介_發(fā)和快速原型。雖然這種技術(shù)常常被認(rèn)為可以“消除風(fēng)險(xiǎn)”以及“縮短產(chǎn)品的交付時(shí)間”,但是它們事實(shí)上也只是為了在軟件的生命周期中更早地開始編碼。這是好事。這使得構(gòu)建/測(cè)試循環(huán)可以更早地開始對(duì)設(shè)計(jì)進(jìn)行驗(yàn)證和改進(jìn)。這同樣也意味著,頂層軟件設(shè)計(jì)者很有可能也會(huì)去進(jìn)行詳細(xì)設(shè)計(jì)。

正如上面所表明的,工程更多的是關(guān)于如何去實(shí)施過(guò)程的,而不是關(guān)于最終產(chǎn)品看起來(lái)的像什么。處在軟件行業(yè)中的我們,已經(jīng)接近工程師的標(biāo)準(zhǔn),但是我們需要一些認(rèn)知上的改變。編程和構(gòu)建/測(cè)試循環(huán)是工程軟件過(guò)程的中心。我們需要以像這樣的方式去管理它們。構(gòu)建/測(cè)試循環(huán)的經(jīng)濟(jì)規(guī)律,再加上軟件系統(tǒng)幾乎可以表現(xiàn)任何東西的事實(shí),就使得我們完全不可能找出一種通用的方法來(lái)驗(yàn)證軟件設(shè)計(jì)。我們可以改善這個(gè)過(guò)程,但是我們不能脫離它。

最后一點(diǎn):任何工程設(shè)計(jì)項(xiàng)目的目標(biāo)是一些文檔產(chǎn)品。顯然,實(shí)際設(shè)計(jì)的文檔是最重要的,但是它們并非惟一要產(chǎn)生的文檔。最終,會(huì)期望某些人來(lái)使用軟件。同樣,系統(tǒng)很可能也需要后續(xù)的修改和增強(qiáng)。這意味著,和硬件項(xiàng)目一樣,輔助文檔對(duì)于軟件項(xiàng)目具有同樣的重要性。雖然暫時(shí)忽略了用戶手冊(cè)、安裝指南以及其他一些和設(shè)計(jì)過(guò)程沒有直接聯(lián)系的文檔,但是仍然有兩個(gè)重要的需求需要使用輔助設(shè)計(jì)文檔來(lái)解決。

輔助文檔的第一個(gè)用途是從問(wèn)題空間中捕獲重要的信息,這些信息是不能直接在設(shè)計(jì)中使用的。軟件設(shè)計(jì)需要?jiǎng)?chuàng)造一些軟件概念來(lái)對(duì)問(wèn)題空間中的概念進(jìn)行建模。這個(gè)過(guò)程需要我們得出一個(gè)對(duì)問(wèn)題空間中概念的理解。通常,這個(gè)理解中會(huì)包含一些最后不會(huì)被直接建模到軟件空間中的信息,但是這些信息卻仍然有助于設(shè)計(jì)者確定什么是本質(zhì)概念以及如何最好地對(duì)它們建模。這些信息應(yīng)該被記錄在某處,以防以后要去更改模型。

對(duì)輔助文檔的第二個(gè)重要需要是對(duì)設(shè)計(jì)的某些方面的內(nèi)容進(jìn)行記錄,而這些方面的內(nèi)容是難以直接從設(shè)計(jì)本身中提取的。它們既可以是高層方面的內(nèi)容,也可以是低層方面內(nèi)容。對(duì)于這些方面內(nèi)容中的許多來(lái)說(shuō),圖形是最好的描述方式。這就使得它們難以作為注釋包含在代碼中。這并不是說(shuō)要用圖形化的軟件設(shè)計(jì)符號(hào)代替編程語(yǔ)言。這和用一些文本描述來(lái)對(duì)硬件科目的圖形化設(shè)計(jì)文檔進(jìn)行補(bǔ)充沒有什么區(qū)別。

決不要忘記,是源代碼決定了實(shí)際設(shè)計(jì)的真實(shí)樣子,而不是輔助文檔。在理想情況下,可以使用軟件工具對(duì)源代碼進(jìn)行后期處理并產(chǎn)生出輔助文檔。對(duì)于這一點(diǎn),我們可能期望過(guò)高了。次一點(diǎn)的情況是,程序員(或者技術(shù)方面的編寫者)可以使用一些工具從源代碼中提取出一些特定的信息,然后可以把這些信息以其他一些方式文檔化。毫無(wú)疑問(wèn),手工對(duì)這種文檔保持更新是困難的。這是另外一個(gè)支持需要更具表達(dá)力的編程語(yǔ)言的理由。同樣,這也是一個(gè)支持使這種輔助文檔保持最小并且盡可能在項(xiàng)目晚期才使之變成正式的理由。同樣,我們可以使用一些好的工具;不然的話,我們就得求助于鉛筆、紙以及黑板。

總結(jié)如下:
  實(shí)際的軟件運(yùn)行于計(jì)算機(jī)之中。它是存儲(chǔ)在某種磁介質(zhì)中的0和1的序列。它不是使用C++語(yǔ)言(或者其他任何編程語(yǔ)言)編寫的程序。
  程序清單是代表軟件設(shè)計(jì)的文檔。實(shí)際上把軟件設(shè)計(jì)構(gòu)建出來(lái)的是編譯器和連接器。
  構(gòu)建實(shí)際軟件設(shè)計(jì)的廉價(jià)程度是令人難以置信的,并且它始終隨著計(jì)算機(jī)速度的加快而變得更加廉價(jià)。
  設(shè)計(jì)實(shí)際軟件的昂貴程度是令人難以置信的,之所以如此,是因?yàn)檐浖膹?fù)雜性是令人難以置信的,并且軟件項(xiàng)目的幾乎所有步驟都是設(shè)計(jì)過(guò)程的一部分。
  編程是一種設(shè)計(jì)活動(dòng)——好的軟件設(shè)計(jì)過(guò)程認(rèn)可這一點(diǎn),并且在編碼顯得有意義時(shí),就會(huì)毫不猶豫的去編碼。
  編碼要比我們所認(rèn)為的更頻繁地顯現(xiàn)出它的意義。通常,在代碼中表現(xiàn)設(shè)計(jì)的過(guò)程會(huì)揭示出一些疏漏以及額外的設(shè)計(jì)需要。這發(fā)生的越早,設(shè)計(jì)就會(huì)越好。
  因?yàn)檐浖?gòu)建起來(lái)非常廉價(jià),所以正規(guī)的工程驗(yàn)證方法在實(shí)際的軟件開發(fā)中沒有多大用處。僅僅建造設(shè)計(jì)并測(cè)試它要比試圖去證明它更簡(jiǎn)單、更廉價(jià)。
  測(cè)試和調(diào)試是設(shè)計(jì)活動(dòng)——對(duì)于軟件來(lái)說(shuō),它們就相當(dāng)于其他工程學(xué)科中的設(shè)計(jì)驗(yàn)證和改進(jìn)過(guò)程。好的軟件設(shè)計(jì)過(guò)程認(rèn)可這一點(diǎn),并且不會(huì)試圖去減少這些步驟。
  還有一些其他的設(shè)計(jì)活動(dòng)——稱它們?yōu)楦邔釉O(shè)計(jì)、模塊設(shè)計(jì)、結(jié)構(gòu)設(shè)計(jì)、構(gòu)架設(shè)計(jì)或者諸如此類的東西。好的軟件設(shè)計(jì)過(guò)程認(rèn)可這一點(diǎn),并且慎重地包含這些步驟。
  所有的設(shè)計(jì)活動(dòng)都是相互影響的。好的軟件設(shè)計(jì)過(guò)程認(rèn)可這一點(diǎn),并且當(dāng)不同的設(shè)計(jì)步驟顯示出有必要時(shí),它會(huì)允許設(shè)計(jì)改變,有時(shí)甚至是根本上的改變,
  許多不同的軟件設(shè)計(jì)符號(hào)可能是有用的——它們可以作為輔助文檔以及工具來(lái)幫助簡(jiǎn)化設(shè)計(jì)過(guò)程。它們不是軟件設(shè)計(jì)。
  軟件開發(fā)仍然還是一門工藝,而不是一個(gè)工程學(xué)科。主要是因?yàn)槿狈︱?yàn)證和改善設(shè)計(jì)的關(guān)鍵過(guò)程中所需的嚴(yán)格性。
  最后,軟件開發(fā)的真正進(jìn)步依賴于編程技術(shù)的進(jìn)步,而這又意味著編程語(yǔ)言的進(jìn)步。C++就是這樣的一個(gè)進(jìn)步。它已經(jīng)取得了爆炸式的流行,因?yàn)樗且婚T直接支持更好的軟件設(shè)計(jì)的主流編程語(yǔ)言。
  C++在正確的方向上邁出了一步,但是還需要更大的進(jìn)步。

后 記

當(dāng)我回顧幾乎10年前所寫的東西時(shí),有幾點(diǎn)讓我印象深刻。第一點(diǎn)(也是和本書最有關(guān)的)是,現(xiàn)今,我甚至比那時(shí)更加確信我試圖去闡述的要點(diǎn)在本質(zhì)上的正確性。隨后的一些年中,許多流行的軟件開發(fā)方法增強(qiáng)了其中的許多觀點(diǎn),這支持了我的信念。最明顯的(或許也是最不重要的)是面向?qū)ο缶幊陶Z(yǔ)言的流行?,F(xiàn)在,除了C++外,出現(xiàn)了許多其他的面向?qū)ο缶幊陶Z(yǔ)言。另外,還有一些面向?qū)ο笤O(shè)計(jì)符號(hào),比如:UML。我關(guān)于面向?qū)ο笳Z(yǔ)言之所以得到流行是因?yàn)樗鼈冊(cè)试S在代碼中直接表現(xiàn)出更具表達(dá)力的設(shè)計(jì)的論點(diǎn),現(xiàn)在看來(lái)有點(diǎn)過(guò)時(shí)了。

重構(gòu)的概念——重新組織代碼基礎(chǔ),使之更加健壯和可重用——同樣也和我的關(guān)于設(shè)計(jì)的所有方面的內(nèi)容都應(yīng)該是靈活的并且在驗(yàn)證設(shè)計(jì)時(shí)允許改變的論點(diǎn)相似。重構(gòu)只是提供了一個(gè)過(guò)程以及一組如何去改善已經(jīng)被證實(shí)具有缺陷的設(shè)計(jì)的準(zhǔn)則。

最后,文中有一個(gè)敏捷開發(fā)的總的概念。雖然極限編程是這些新方法中最知名的一個(gè),但是它們都具有一個(gè)共同點(diǎn):它們都承認(rèn)源代碼是軟件開發(fā)工作中的最重要的產(chǎn)品。

另一方面,有一些觀點(diǎn)——其中的一些我在論文中略微談到過(guò)——在隨后的一些年中,對(duì)我來(lái)說(shuō)變得更加重要。第一個(gè)是構(gòu)架,或者頂層設(shè)計(jì)的重要性。在論文中,我認(rèn)為構(gòu)架只是設(shè)計(jì)的一部分內(nèi)容,并且在構(gòu)建/測(cè)試循環(huán)對(duì)設(shè)計(jì)進(jìn)行驗(yàn)證的過(guò)程中,構(gòu)架需要保持可變。這在本質(zhì)上是正確的,但是回想起來(lái),我認(rèn)為我的想法有點(diǎn)不成熟。雖然構(gòu)建/測(cè)試循環(huán)可能揭示出構(gòu)架中的問(wèn)題,但是更多的問(wèn)題是常常由于改變需求而表現(xiàn)出來(lái)的。 一般來(lái)說(shuō),設(shè)計(jì)軟件是困難的,并且新的編程語(yǔ)言,比如:Java或者C++,以及圖形化的符號(hào),比如:UML,對(duì)于不知道如何有效地使用它的人來(lái)說(shuō),都沒有多大的幫助。此外,一旦一個(gè)項(xiàng)目基于一個(gè)構(gòu)架構(gòu)建了大量的代碼,那么對(duì)該構(gòu)架進(jìn)行基礎(chǔ)性的更改,常常相當(dāng)于丟棄掉該項(xiàng)目并重新開始一個(gè),這就意味著該項(xiàng)目沒有出現(xiàn)過(guò)。即使項(xiàng)目和機(jī)構(gòu)在根本上接受了重構(gòu)的概念,但是他們通常仍然不愿意去做一些看起來(lái)就像是完全重寫的事情。這意味著第一次就把它作對(duì)(或者至少是接近對(duì))是重要的,并且項(xiàng)目變得越大,就越要如此。幸運(yùn)的是,軟件設(shè)計(jì)模式有助于解決這方面問(wèn)題。

還有其他一些方面的內(nèi)容,我認(rèn)為需要更多地強(qiáng)調(diào)一下,其中之一就是輔助文檔,尤其是構(gòu)架方面的文檔。雖然源代碼就是設(shè)計(jì),但是試圖從源代碼中得出構(gòu)架,可能是一個(gè)令人畏懼的體驗(yàn)。在論文中,我希望能夠出現(xiàn)一些軟件工具來(lái)幫助軟件開發(fā)者自動(dòng)地維護(hù)來(lái)自源代碼的輔助文檔。我?guī)缀跻呀?jīng)放棄了這個(gè)希望。一個(gè)好的面向?qū)ο髽?gòu)架通??梢允褂脦追鶊D以及少許的十幾頁(yè)文本描述出來(lái)。不過(guò),這些圖(和文本)必須集中于設(shè)計(jì)中的關(guān)鍵類和關(guān)系。糟糕的是,對(duì)于軟件設(shè)計(jì)工具可能會(huì)變得足夠聰明,以至于可以從源代碼的大量細(xì)節(jié)中提取出這些重要方面的內(nèi)容這一點(diǎn),我沒有看到任何真正的希望。這意味著還得必須由人來(lái)編寫和維護(hù)這種文檔。我仍然認(rèn)為,在源代碼完成后,或者至少是在編寫源代碼的同時(shí)去編文檔,要比在編寫源代碼之前去編寫文檔更好一些。

最后,我在論文的最后談到了C++是編程——并且因此是軟件設(shè)計(jì)——藝術(shù)的一個(gè)進(jìn)步,但是還需要更大的進(jìn)步。就算我完全沒有看到語(yǔ)言中出現(xiàn)任何真正的編程進(jìn)步來(lái)挑戰(zhàn)C++的流行,那么在今天,我會(huì)認(rèn)為這一點(diǎn)甚至要比我首次編寫它時(shí)更加正確。

——Jack Reeves, 2002年1月1日


引用

我的實(shí)踐報(bào)告 發(fā)表時(shí)間: 2004-2-1 下午3:26 by boyibolomi

一 來(lái)點(diǎn)認(rèn)可
經(jīng)過(guò)一段時(shí)間的實(shí)踐之后,我現(xiàn)在更加的認(rèn)可“源代碼就是設(shè)計(jì)”。
以代碼為中心,絕對(duì)是值得再次強(qiáng)調(diào)的。
我學(xué)會(huì)了正確的對(duì)待UML圖,在有必要拿圖形化的東西來(lái)討論和交流的時(shí)候,才畫UML。
它們能夠形象的表達(dá)了設(shè)計(jì)中的某個(gè)方面,但UML圖并不是設(shè)計(jì)本身。

 

二 來(lái)點(diǎn)批評(píng)
在實(shí)際工作中,通常有人這樣完成一個(gè)設(shè)計(jì)任務(wù),給了我一個(gè)Rose畫的圖,
指著里面的類圖,說(shuō),看吧,這就是我的設(shè)計(jì),我的架構(gòu)是這樣這樣的……
接著我就問(wèn),讓我們來(lái)看看有關(guān)的代碼,證明一下你的設(shè)計(jì)。沒有。

多數(shù)情況下,這樣的“設(shè)計(jì)”意義不大,會(huì)被“編碼階段”碰到的問(wèn)題和需求的變化搞
得面目全非。結(jié)果是,由一位“架構(gòu)師”或者“分析員”,設(shè)計(jì)的一個(gè)“良好”的架構(gòu),
其壽命只能延續(xù)到“設(shè)計(jì)評(píng)審”結(jié)束之后。

事實(shí)上,一堆人對(duì)著UML圖來(lái)做設(shè)計(jì)評(píng)審,通常只是一個(gè)形式。提問(wèn)的人在不是很清楚的情況下提問(wèn),設(shè)計(jì)的人努力的解釋(辯解),多數(shù)人似懂非懂的評(píng)價(jià)著一個(gè)都不太清楚的東西,最后累了,決定評(píng)審結(jié)束。

三 實(shí)踐中我碰到的困難:人
當(dāng)我在我的小組中實(shí)踐敏捷方法的時(shí)候,感到比較困難的,是碰到一種情況:
組員已經(jīng)有一些經(jīng)驗(yàn),并且已經(jīng)有了非常根深蒂固的看法,認(rèn)為“設(shè)計(jì)就是設(shè)計(jì),編碼就是編碼”,這兩個(gè)階段一定要明確的界定,“否則,我無(wú)法做設(shè)計(jì)”,他們通常認(rèn)為,設(shè)計(jì)是高手做的,而編碼,交給軟件藍(lán)領(lǐng)就可以了。

對(duì)此我沒有辦法,重構(gòu)一段代碼容易,重構(gòu)一個(gè)人的習(xí)慣就太困難了。

四 重構(gòu)的例子
我拿我以前寫的一段程序做了重構(gòu),在不改變外部行為的情況下,我看到原來(lái)拙劣的設(shè)計(jì)逐漸的被改善。具體的過(guò)程比較羅嗦,我放到了個(gè)人主頁(yè)上,有興趣和耐心的朋友,歡迎訪問(wèn)

現(xiàn)在,我正致力于重構(gòu)公司的一個(gè)軟件產(chǎn)品,不能說(shuō)自己做得很好,但每次都更好一點(diǎn),更重要的是,我非常的enjoy,以編碼、重構(gòu)為樂(lè)。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
做好軟件制品的復(fù)用,就夠你爽翻天
都快2021了,你還不知道怎么成為優(yōu)秀程序員?大牛推薦6個(gè)軟件開發(fā)步驟
軟件開發(fā)文檔模板
軟件開發(fā)成本測(cè)量之軟件項(xiàng)目規(guī)模和工作量測(cè)量
軟件的生命周期與過(guò)程模型
作為軟件開發(fā)人員應(yīng)該知道的最基本的東西 - C/C++ / C語(yǔ)言
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服