2016年1月5日 星期二

軟體工程學習心得 : the Art of Software Development

 

本篇為台大李允中教授所授之軟體工程課程修課心得,李教授以軟體工程角度闡述軟體開發的理論與經驗,並以多人小組(約10人)的方式讓同學們實際執行整個軟體開發流程,從中受益良多,遂成此文以資紀念。




一、軟體工程的歷史


在1970、1980年代,許多軟體都邁向一個悲慘的結局,軟體專案開發時間大大超過規劃的時間表,且開發出來的軟體品質十分糟糕;一些專案導致了財產的流失,某些軟體甚至導致人員傷亡。因此,北約的科技委員會(NATO)召集了近50名一流的編程人員、計算機科學家和工業界巨頭,討論和制定擺脫「軟體危機」的對策。在那次會議上第一次提出了軟體工程(software engineering)這個概念。


爾後,在1986年,IBM大型電腦之父佛瑞德·布魯克斯發表了他的著名論文〈沒有銀彈〉(佛瑞德·布魯克斯著名作品還有《人月神話》)。在這篇著名的論文中他斷言:「在10年內無法找到解決軟體危機的銀彈」,開發軟體的困難是內生的,只能漸進式的改善。整體環境沒有改變以前,唯一可能的解決方法是培養優秀的工程師。




二、軟體流程簡介


在軟體工程的理論學習與實際的專案執行中,可以理解到軟體工程對「流程 (process)」的重視,軟體開發的本質是一種問題解決的過程,從而產出可以隨著環境變化而演進的系統。小至日常生活中的刷牙、洗澡,大至大樓的建造、太空任務的執行,無不與流程相關。



軟體流程是一組部份相依、為達到目標而執行的一系列步驟。包含定義、分析、設計、建構及測試等活動。而活動(Activity)中包含由誰執行、何時做、做什麼、如何做、預定產出之文件與編碼、使用的電腦資源與組織結構與限制。最粗略的軟體生命週期如下:

  • 定義(Definition) : What
  • 開發(Development) : How
  • 維護(Maintenance) : Change

專案生命周期刻畫了一個工程從起始到完成,是如何進行計劃、控制和監控的模型。瀑布模型 (Waterfall Model) 雖是最陽春的模型,但也是所有其他模型的根源。


瀑布模型之後,有許多著名的軟體開發過程模型已被提出,如 Spiral Model(Risk-Driven)、Automatic Synthesis Model、Object-Oriented Approach、Unified Process。

雖然模型眾多,但軟體工程的大部份理論都有共同的核心價值,是導源於開發軟體時需要很多人一起合作,因此必須建立共同的溝通方法與工作紀律,以避免過去軟體危機所面臨的問題。




三、本課程專案的執行


本課程專案的執行由以下兩個面向所組成:

  • 專案管理面向: Work Breakdown Structure(WBS)、Meeting Minutes (Action Item Tracking) 
  • 工程實行面向:需求工程流程、系統架構設計軟體設計

簡單來說,這次的專案流程是從時程預估、需求獲取分析並產生需求規格文件(System Requirements Specification, SRS),設計系統架構圖(System Architecture),並把需求對應在系統架構圖上,再將每個自然語言的需求敘述轉類別圖(Class diagram),最後做程式的撰寫與測試


在這次的軟體專案執行中,讓我了解到「需求」的重要性。上面所提的所有工作,都是為了滿足需求而來。在軟體工程中,軟體是為了需求使用者而因應產生的,如果開發者與客戶之間缺乏足夠的溝通,即使開發者擁有精良的程式撰寫能力,但還是無法開發出客戶真正合用的軟體。因此藉由反覆(iteration)改進(refinement)漸進式(incremental)的開發方法,才得以不斷的貼近進而滿足需求。




四、結語:軟體工程的反思


至今為止,軟體產業的工程師可以說是最不工程導向的工程師,大多數軟體開發項目的失敗,並不是由於軟體開發技術方面的原因。它們的失敗是由於不適當的管理造成的。因此,如何以系統性的、規範化的、可定量的程序化方法,去開發和維護軟體,正是軟體工程這門學科的核心課題,我們應該繼續努力,把每一種藝術轉變成科學:在這個過程中,我們得以把藝術向前推進。

“Science is what we understand well enough to explain to a computer; art is everything else.” 
― Donald Ervin Knuth, Things a Computer Scientist Rarely Talks About






References


台大李允中教授講義 (研究所課程)

wiki - 軟體工程
https://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B

同人的生活派對 - 軟體開發是工藝還是工程?
http://www.lifeparty.idv.tw/blog/archives/175






技術提供:Blogger.