• <u id="saeeq"><wbr id="saeeq"></wbr></u>
  • <s id="saeeq"><div id="saeeq"></div></s>
  • <u id="saeeq"></u>
  • <u id="saeeq"><noscript id="saeeq"></noscript></u>
  • <s id="saeeq"></s>
  • 四十年軟件工程故事

    文章來源:  |  發布時間:2009-09-02  |  【打印】 【關閉

      

      2008年5月14-16日,在德國迷人的小鎮Garmisch,舉辦了軟件工程四十年紀念會議,Peter Naur、Brian Randell、M. Douglas McIlroy、Albert Endres、Luigi Dadda等40年前軟件工程會議的關鍵人物重聚舊地。

      40年前的1968年,正是在此地舉行的NATO(北約)科技委員會會議上,“軟件工程”作為正式的術語被確定下來,標志著一個新學科的開始。 Peter Naur和Brian Randell主編的會議報告中這樣寫道:“我們特意選擇‘軟件工程’這個頗具爭議性的詞,是為了暗示這樣一種意見:軟件的生產有必要建立在某些理論基礎和實踐指導之上——在工程學的某些成效卓著的分支中,這些理論基礎和實踐指導早已成為了一種傳統。”

      軟件工程這個學科還很年輕,Peter Naur和Brian Randell今天依然健在。作為著名的編程語言歸約BNF范式中的N,Peter Naur因設計和定義了ALGOL 60而在2005年獲得圖靈獎。因IBM System360的工作于1999年獲得圖靈獎的Fred Brooks在《人月神話》的結尾比較了化學工程和軟件工程。他認為:軟件系統可能是人類所創造的最錯綜復雜的事物,軟件工程還很年輕,需要繼續探索和嘗試。

      這四十年的過程就是探索和嘗試的過程,讓我們來細細品味其中的科學精神之美。

    軟件工程是什么

      軟件工程的定義有很多版本,比較權威的是IEEE給出的定義:(1)將系統化的、規范的、可量化的方法應用于軟件的開發、運行和維護,即,將工程應用于軟件。(2)在(1)中所述方法的研究。

      所以,軟件工程遠沒有想象中那么高大神秘,它研究的就是我們日常開發軟件的工作方式。“程序員”這三個字本就屬于軟件工程的范圍。

      關于軟件工程和計算機科學的區別,Fred Brooks說:A scientist builds in order to learn; an engineer learns in order to build. 更詳細的可以看看David Parnas的“Software Engineering Programs Are Not Computer Science Programs”和Steve McConnell所著“Professional Software Development”的第4章。或者對照一下圖靈獎獲得者:軟件工程領域的David Parnas、Frederick P. Brooks和計算機科學領域的Donald E. Knuth、《程序員》上期介紹的YAO。

      軟件是為人開發的,軟件是由人開發的。正是因為人的心理難以捉摸,人的大腦處理復雜性時速度和容量的局限,我們才需要過程來規范人的行為,需要方法來幫助人腦面對復雜性,需要工具來貫徹這些過程和方法。所以,軟件工程的知識體系分為以下幾層。我們按照這個金字塔結構,逐層回顧四十年來的歷史。

    過程

      一開始,軟件團隊是沒有過程的,甚至沒有團隊概念。沒有需求規格說明,沒有設計,程序員在大腦中直接將代碼思考出來,拼湊到一起,交給客戶使用。客戶如果有要求,再修改代碼,如此反復。這種“編碼-修改”做法對于小程序可以應付,當程序規模變得復雜時,付出的代價就很大了。

    瀑布

      “軟件工程”概念的提出,促進了需求、分析、設計、實現、維護等軟件生命周期概念的成熟。瀑布模型是最早的軟件過程模型,從名字“瀑布”可以看出,通常人們認為瀑布模型中的各個步驟是一條線完成的。實際上在Winston W. Royce1970年的經典論文“Managing the Development of Large Software Systems”中有反饋的過程(見圖3),作者本人也并不提倡以順序模型作為團隊的過程模型,另外,Royce并沒有在論文中把他的過程模型叫做“瀑布 ”,只是后來其他人這么叫了。很多團隊使用時是按照線性的方式使用的,這是一種誤解。

      這里要提一下,瀑布模型的提出者Winston W. Royce(已于1995年去世)有時被簡寫為W. Royce,所以經常會引起誤會,把他當成Walker Royce,后者是軟件項目管理專家,曾任Rational軟件公司副總裁,著有《Software Project Management: A Unified Framework》一書。

    增量和迭代

      使用瀑布模型,可以運行的產品很遲才能看到,這就潛伏了巨大的風險:很可能,集成之日也就是爆炸之日。為了提早獲得可以運行的版本,可以先實現一些功能,再實現一些功能……每個增量交付一個可以運行的版本。

      增量開發顯著降低了風險,而且還因可運行產品的出現大大提升了士氣。最有名的實踐應該是Microsoft在1989年就開始使用的Daily Build(每日構建),被稱為項目的“心跳”。當然,增量開發不一定意味著每日構建,如Fred Brooks所述,Bell Northern Research是“每周構建”。

      增量經常和迭代連在一起說,不過兩者是有區別的。增量是逐塊建造的概念,迭代是反復求精的概念。二者不一定要綁在一起使用,但很明顯,結合這兩種方式是一種有效的做法。現在很多過程所說的迭代開發,默認的意思就是增量&迭代。Jeff Patton最近用兩幅圖表達了增量和迭代(http://www.agileproductdesign.com/blog/dont_know_what_i_want.html)。

  • <u id="saeeq"><wbr id="saeeq"></wbr></u>
  • <s id="saeeq"><div id="saeeq"></div></s>
  • <u id="saeeq"></u>
  • <u id="saeeq"><noscript id="saeeq"></noscript></u>
  • <s id="saeeq"></s>
  • 久久久综合香蕉尹人综合网