<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      原文出處:《敏捷軟件開發(fā):原則、模式與實(shí)踐》
      網(wǎng)絡(luò)出處:http://www.csdn.net/develop/article/21/21645.shtm

      源代碼就是設(shè)計(jì)
      (鄧輝 譯)

      至今,我仍能記起當(dāng)我頓悟并最終產(chǎn)生下面文章時(shí)所在的地方。那是1986年的夏天,我在加利福尼亞中國湖海軍武器中心擔(dān)任臨時(shí)顧問。在這期間,我有幸參加了一個(gè)關(guān)于Ada的研討會(huì)。討論當(dāng)中,有一位聽眾提出了一個(gè)具有代表性的問題,“軟件開發(fā)者是工程師嗎?”我不記得當(dāng)時(shí)的回答,但是我卻記得當(dāng)時(shí)并沒有真正解答這個(gè)問題。于是,我就退出討論,開始思考我會(huì)怎樣回答這樣一個(gè)問題。現(xiàn)在,我無法肯定當(dāng)時(shí)我為什么會(huì)記起幾乎10年前曾經(jīng)在Datamation雜志上閱讀過的一篇論文,不過促使我記起的應(yīng)該是后續(xù)討論中的某些東西。這篇論文闡述了工程師為什么必須是好的作家(我記得該論文談?wù)摼褪沁@個(gè)問題——好久沒有看了),但是我從該論文中得到的關(guān)鍵一點(diǎn)是:作者認(rèn)為工程過程的最終結(jié)果是文檔。換句話說,工程師生產(chǎn)的是文檔,不是實(shí)物。其他人根據(jù)這些文檔去制造實(shí)物。于是,我就在困惑中提出了一個(gè)問題,“除了軟件項(xiàng)目正常產(chǎn)生的所有文檔以外,還有可以被認(rèn)為是真正的工程文檔的東西嗎?”我給出的回答是,“是的,有這樣的文檔存在,并且只有一份——源代碼?!?br>
       把源代碼看作是一份工程文檔——設(shè)計(jì)——完全顛覆了我對(duì)自己所選擇的職業(yè)的看法。它改變了我看待一切事情的方式。此外,我對(duì)它思考的越多,我就越覺得它闡明了軟件項(xiàng)目常常遇到的眾多問題。更確切地說,我覺得大多數(shù)人不理解這個(gè)不同的看法,或者有意拒絕它這樣一個(gè)事實(shí),就足以說明很多問題。幾年后,我終于有機(jī)會(huì)把我的觀點(diǎn)公開發(fā)表。C++ Journal中的一篇有關(guān)軟件設(shè)計(jì)的論文促使我給編輯寫了一封關(guān)于這個(gè)主題的信。經(jīng)過幾封書信交換后,編輯Livleen Singh同意把我關(guān)于這個(gè)主題的想法發(fā)表為一篇論文。下面就是這篇文章。
      ——Jack Reecves, December,22,2001

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

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

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

       幾年前,我參見了一個(gè)討論會(huì),其中討論到軟件開發(fā)是否是一門工程學(xué)科的問題。雖然我不記得了討論結(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)更是確信無疑。
       任何工程活動(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í)物,完全無需設(shè)計(jì)者的任何進(jìn)一步的介入。在按照我的理解方式審查了軟件開發(fā)的生命周期后,我得出一個(gè)結(jié)論:實(shí)際上滿足工程設(shè)計(jì)標(biāo)準(zhǔn)的惟一軟件文檔,就是源代碼清單。

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

       在把代碼看作是軟件設(shè)計(jì)所帶來的結(jié)果中,有一個(gè)結(jié)果完全蓋過了所有其他的結(jié)果。它非常重要并且非常明顯,也正因?yàn)槿绱?,?duì)于大多數(shù)軟件機(jī)構(gòu)來說,它完全是一個(gè)盲點(diǎn)。這個(gè)結(jié)果就是:軟件的構(gòu)建是廉價(jià)的。它根本就不具有昂貴的資格;它非常的廉價(jià),幾乎就是免費(fèi)的。如果源代碼是軟件設(shè)計(jì),那么實(shí)際的軟件構(gòu)建就是由編譯器和連接器完成的。我們常常把編譯和連接一個(gè)完整的軟件系統(tǒng)的過程稱為“進(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)很長的時(shí)間,但是構(gòu)建一個(gè)具有和50 000行C++程序同樣設(shè)計(jì)復(fù)雜性的硬件系統(tǒng)要花費(fèi)多長的時(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)行更多的討論)。我很想問一下,是否還有任何其他的學(xué)科可以在如此短的時(shí)間內(nèi),產(chǎn)生出和軟件具有同樣復(fù)雜性的設(shè)計(jì)來,不過,首先我們必須要弄清出如何來度量和比較復(fù)雜性。然而,有一點(diǎn)是明顯的,那就是軟件設(shè)計(jì)可以 極為迅速地變得非常龐大。

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

       盡管確實(shí)存在一些硬件設(shè)計(jì),它們看起來似乎和軟件設(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ì)于軟件來說,沒有這種限制。目前,已經(jīng)有數(shù)以百計(jì)的軟件機(jī)構(gòu)和數(shù)以千計(jì)的非常復(fù)雜的軟件系統(tǒng)存在,并且數(shù)量以及復(fù)雜性每天都在增長。這意味著軟件行業(yè)不可能通過仿效硬件開發(fā)者找到針對(duì)自身問題的解決辦法。倘若一定要說出有什么相同之處的話,那就是,當(dāng)CAD和CAM可以做到幫助硬件設(shè)計(jì)者創(chuàng)建越來越復(fù)雜的設(shè)計(jì)時(shí),硬件工程才會(huì)變得和軟件開發(fā)越來越像。

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

      一般的看法認(rèn)為,當(dāng)真正的工程師完成了一個(gè)設(shè)計(jì),不管該設(shè)計(jì)有多么復(fù)雜,他們都非常確信該設(shè)計(jì)是可以工作的。他們也非常確信該設(shè)計(jì)可以使用公認(rèn)的技術(shù)建造出來。為了做到這一點(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)行測試。簡而言之,在建造前,設(shè)計(jì)者會(huì)使用他們能夠想到的一切方法來證實(shí)設(shè)計(jì)是正確的。對(duì)于一架新型客機(jī)的設(shè)計(jì)來說,情況甚至更加嚴(yán)重;必須要構(gòu)建出和原物同尺寸的原型,并且必須要進(jìn)行飛行測試來驗(yàn)證設(shè)計(jì)中的種種預(yù)計(jì)。

      對(duì)于大多數(shù)人來說,軟件中明顯不存在和硬件設(shè)計(jì)同樣嚴(yán)格的工程。然而,如果我們把源代碼看做是設(shè)計(jì),那么就會(huì)發(fā)現(xiàn)軟件工程師實(shí)際上對(duì)他們的設(shè)計(jì)做了大量的驗(yàn)證和改進(jìn)。軟件工程師不把這稱為工程,而稱它為測試和調(diào)試。大多數(shù)人不把測試和調(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ī)方法來驗(yàn)證他們的設(shè)計(jì),是因?yàn)檐浖?gòu)建周期的簡單經(jīng)濟(jì)規(guī)律。

      第一個(gè)啟示:僅僅構(gòu)建設(shè)計(jì)并測試它比做任何其他事情要廉價(jià)一些,也簡單一些。我們不關(guān)心做了多少次構(gòu)建——這些構(gòu)建在時(shí)間方面的代價(jià)幾乎為零,并且如果我們丟棄了構(gòu)建,那么它所使用的資源完全可以重新利用。請(qǐng)注意,測試并非僅僅是讓當(dāng)前的設(shè)計(jì)正確,它也是改進(jìn)設(shè)計(jì)的過程的一部分。復(fù)雜系統(tǒng)的硬件工程師常常建立模型(或者,至少他們把設(shè)計(jì)用計(jì)算機(jī)圖形直觀地表現(xiàn)出來)。這就使得他們獲得了對(duì)于設(shè)計(jì)的一種“感覺”,而僅僅去檢查設(shè)計(jì)是不可能獲得這種感覺的。對(duì)于軟件來說,構(gòu)建這樣一個(gè)模型既不可能也無必要。我們僅僅構(gòu)建產(chǎn)品本身。即使正規(guī)的軟件驗(yàn)證可以和編譯器一樣自動(dòng)進(jìn)行,我們還是會(huì)去進(jìn)行構(gòu)建/測試循環(huán)。因此,正規(guī)的驗(yàn)證對(duì)于軟件行業(yè)來說從來沒有太多的實(shí)際意義。
       這就是現(xiàn)今軟件開發(fā)過程的現(xiàn)實(shí)。數(shù)量不斷增長的人和機(jī)構(gòu)正在創(chuàng)建著更加復(fù)雜的軟件設(shè)計(jì)。這些設(shè)計(jì)會(huì)被先用某些編程語言編寫出來,然后通過構(gòu)建/測試循環(huán)進(jìn)行驗(yàn)證和改進(jìn)。過程易于出錯(cuò),并且不是特別的嚴(yán)格。相當(dāng)多的軟件開發(fā)人員并不想相信這就是過程的運(yùn)作方式,也正因?yàn)檫@一點(diǎn),使問題變得更加復(fù)雜。

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

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

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

       關(guān)于軟件開發(fā)有一個(gè)壓倒性的問題,那就是一切都是設(shè)計(jì)過程的一部分。編碼是設(shè)計(jì),測試和調(diào)試是設(shè)計(jì)的一部分,并且我們通常認(rèn)為的設(shè)計(jì)仍然是設(shè)計(jì)的一部分。雖然軟件構(gòu)建起來很廉價(jià),但是設(shè)計(jì)起來卻是難以置信的昂貴。軟件非常的復(fù)雜,具有眾多不同方面的設(shè)計(jì)內(nèi)容以及它們所導(dǎo)致的設(shè)計(jì)考慮。問題在于,所有不同方面的內(nèi)容是相互關(guān)連的(就像硬件工程中的一樣)。我們希望頂層設(shè)計(jì)者可以忽視模塊算法設(shè)計(jì)的細(xì)節(jié)。同樣,我們希望程序員在設(shè)計(jì)模塊內(nèi)部算法時(shí)不必考慮頂層設(shè)計(jì)問題。糟糕的是,一個(gè)設(shè)計(jì)層面中的問題侵入到了其他層面之中。對(duì)于整個(gè)軟件系統(tǒng)的成功來說,為一個(gè)特定模塊選擇算法可能和任何一個(gè)更高層次的設(shè)計(jì)問題同樣重要。在軟件設(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ì)只有在其被編寫和測試后才算完成。測試是設(shè)計(jì)驗(yàn)證和改進(jìn)過程的基礎(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ì)周期的過程。如果設(shè)計(jì)的任何一個(gè)方面內(nèi)容被凍結(jié)在改進(jìn)過程之外,那么對(duì)于最終設(shè)計(jì)將會(huì)是糟糕的或者甚至無法工作這一點(diǎn),就不會(huì)覺得奇怪了。

       如果高層的軟件設(shè)計(jì)可以成為一個(gè)更加嚴(yán)格的工程過程,那該有多好呀,但是軟件系統(tǒng)的真實(shí)情況不是嚴(yán)格的。軟件非常的復(fù)雜,它依賴于太多的其他東西?;蛟S,某些硬件沒有按照設(shè)計(jì)者認(rèn)為的那樣工作,或者一個(gè)庫例程具有一個(gè)文檔中沒有說明的限制。每一個(gè)軟件項(xiàng)目遲早都會(huì)遇到這些種類的問題。這些種類的問題會(huì)在測試期間被發(fā)現(xiàn)(如果我們的測試工作做得好的話),之所以如此是因?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)問題被發(fā)現(xiàn)時(shí),當(dāng)然已經(jīng)錯(cuò)過了更改A的抽象體的時(shí)機(jī)。正如所料,所發(fā)生的就是把一個(gè)日益增長的復(fù)雜的“修正”集應(yīng)用到A的內(nèi)部設(shè)計(jì)上。在我們還沒有安裝完版本1時(shí),就普遍感覺到設(shè)計(jì)正在衰退。每一個(gè)新的修正很可能都會(huì)破壞一些老的修正。這是一個(gè)正規(guī)的軟件開發(fā)項(xiàng)目。最后,我和我的同事決定對(duì)設(shè)計(jì)進(jìn)行更改,但是為了得到管理層的同意,我們不得不自愿無償加班。

       在任何一般規(guī)模的軟件項(xiàng)目中,肯定會(huì)出現(xiàn)像這樣的問題,盡管人們使用了各種方法來防止它的出現(xiàn),但是仍然會(huì)忽視一些重要的細(xì)節(jié)。這就是工藝和工程之間的區(qū)別。如果經(jīng)驗(yàn)可以把我們引向正確的方向,這就是工藝。如果經(jīng)驗(yàn)只會(huì)把我們帶入未知的領(lǐng)域,然后我們必須使用一開始所使用的方法并通過一個(gè)受控的改進(jìn)過程把它變得更好,這就是工程。
       我們來看一下只是作為其中很小一點(diǎn)的內(nèi)容,所有的程序員都知道,在編碼之后而不是之前編寫軟件設(shè)計(jì)文檔會(huì)產(chǎn)生更加準(zhǔn)確的文檔?,F(xiàn)在,原因是顯而易見的。用代碼來表現(xiàn)的最終設(shè)計(jì)是惟一一個(gè)在構(gòu)建/測試循環(huán)期間被改進(jìn)的東西。在這個(gè)循環(huán)期間,初始設(shè)計(jì)保持不變的可能性和模塊的數(shù)量以及項(xiàng)目中程序員的數(shù)量成反比。它很快就會(huì)變得毫無價(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ì),并且是使用某種編程語言完成的。因此,當(dāng)我們得出設(shè)計(jì)時(shí),我們不應(yīng)該害怕對(duì)它們進(jìn)行編碼。在必要時(shí),我們必須應(yīng)該樂于去改進(jìn)它們。

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

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

       最后,軟件設(shè)計(jì)必須要用某種編程語言表現(xiàn)出來,然后通過一個(gè)構(gòu)建/測試循環(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,而它看起來像什么呢?
       這表明,在軟件業(yè)的共同潛意識(shí)中本能地知道,編程技術(shù),特別是實(shí)際開發(fā)所使用的編程語言的改進(jìn)和軟件行業(yè)中任何其他東西相比,具有壓倒性的重要性。這還表明,程序員關(guān)心的是設(shè)計(jì)。當(dāng)出現(xiàn)更加具有表達(dá)力的編程語言時(shí),軟件開發(fā)者就會(huì)使用它們。

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

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

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

       輔助文檔的第一個(gè)用途是從問題空間中捕獲重要的信息,這些信息是不能直接在設(shè)計(jì)中使用的。軟件設(shè)計(jì)需要?jiǎng)?chuàng)造一些軟件概念來對(duì)問題空間中的概念進(jìn)行建模。這個(gè)過程需要我們得出一個(gè)對(duì)問題空間中概念的理解。通常,這個(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)容中的許多來說,圖形是最好的描述方式。這就使得它們難以作為注釋包含在代碼中。這并不是說要用圖形化的軟件設(shè)計(jì)符號(hào)代替編程語言。這和用一些文本描述來對(duì)硬件科目的圖形化設(shè)計(jì)文檔進(jìn)行補(bǔ)充沒有什么區(qū)別。

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

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

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

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

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

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

      ——Jack Reeves, 2002年1月1日

      posted on 2004-05-26 02:20  taowen  閱讀(887)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产一区二区三区不卡观| 亚洲精品麻豆一二三区| 国产激情免费视频在线观看| 欧美牲交videossexeso欧美| 九九久久亚洲精品美国国内| 久久精品不卡一区二区| 久久精品国产中文字幕| 欧美牲交a欧美牲交aⅴ一| 狠狠亚洲色一日本高清色| 国产在线精品一区二区夜色| 国产精品日日摸夜夜添夜夜添无码| 国产女人叫床高潮大片| 成人精品天堂一区二区三区 | 中文字幕色av一区二区三区| 伊人成色综合人夜夜久久| 亚洲国产精品自在拍在线播放蜜臀| 国产999久久高清免费观看| 国产激情一区二区三区四区 | 无码人妻斩一区二区三区| 亚洲高潮喷水无码AV电影| 中文字幕乱码人妻二区三区| 中文字幕成熟丰满人妻| 樱花草视频www日本韩国| 桐梓县| 亚洲跨种族黑人xxxxx| 最新精品露脸国产在线| 97在线视频人妻无码| 国产黄色三级三级看三级| 少妇人妻真实偷人精品| 伊人蕉久影院| 亚洲精品无码成人A片九色播放| 秋霞人妻无码中文字幕| 久久av色欲av久久蜜桃网| 开心激情站开心激情网六月婷婷| 欧美国产日产一区二区| 91精品国产蜜臀在线观看| 国产99精品成人午夜在线| 99热门精品一区二区三区无码| 国产精品小视频一区二页| 中文字幕av无码不卡| 亚洲AV无码专区亚洲AV桃|