軟件工程的學習心得
什么是軟件工程?
1968年秋季,北約的科技委員會召集了近50名一流的編程人員、計算機科學家和工業(yè)界巨頭,討論和制定擺脫“軟件危機”的對策。在那次會議上第一次提出了軟件工程這個概念,研究和應用如何以系統(tǒng)性的、規(guī)范化的、可定量的過程化方法去開發(fā)和維護軟件,以及如何把經過時間考驗而證明正確的管理技術和當前能夠得到的最好的技術方法結合起來的學科。它涉及到程序設計語言、數據庫、軟件開發(fā)工具、系統(tǒng)平臺、標準、設計模式等方面。其后的幾十年里,各種有關軟件工程的技術、思想、方法和概念不斷被提出,軟件工程逐步發(fā)展為一門獨立的科學。1993年,電氣電子工程師學會(IEEE)給出了一個更加綜合的定義:"將系統(tǒng)化的、規(guī)范的、可度量的方法用于軟件的開發(fā)、運行和維護的過程,即將工程化應用于軟件開發(fā)中"。此后,IEEE多次給出軟件工程的定義。
為什么要學習軟件工程?
工程,是利用技術來克服人自身的限制。軟件工程很大程度上就是解決我們智力上限制的問題,軟件工程師在面對不知所謂的kernel dump的時候、在面對無休止的接口變動的時候、面對改一行代碼系統(tǒng)就全掛的窘境束手無策,所以我們需要微內核、微服務這樣的框架來約束系統(tǒng),降低系統(tǒng)的復雜性,讓我們所有犯的錯誤都能保持在可控的范圍內,讓我們寫出的有bug的代碼也能運行起來。可以多人開發(fā)這件事情在軟件工程上是至關重要的,如果一個工程必須每個程序員都完全理解整個工程的架構才能著手開發(fā),那這個工程一定做不成,不說完全理解一個龐大項目本身不可能這個問題,大家理解也會有偏差,寫出來代碼合不到一起,這就是為什么需要有嚴格的模塊拆分,而且接口必須控制在解耦的、可以理解的、數量盡量少的范圍內,而且通過框架來避免錯誤相互擴散。在現代社會中,軟件應用于多個方面。典型的軟件比如有電子郵件、嵌入式系統(tǒng)、人機界面、辦公包、操作系統(tǒng)、網頁、編譯器、數據庫、游戲等。同時,各個行業(yè)幾乎都有計算機軟件的應用,比如工業(yè)、農業(yè)、銀行、航空、政府部門等。這些應用促進了經濟和社會的發(fā)展,提高人們的工作效率,同時提升了生活質量。
軟件工程學習心得:
在我看來,軟件工程與其說是一門課程,不如說是一門思想。是一個如何去分析和處理問題的過程、能夠解決問題的思想集合。要學習軟件工程,就必須學會如何系統(tǒng)的思考,以及養(yǎng)成良好的編碼習慣。本學期主要講的是需求分析,所以我簡單總結一下上學期軟件工程導論中學習的需求分析部分的學習心得。
·需求分析的重要性 一款成功的軟件是建立在成功的需求分析之上的,而高質量的需求來源于用戶與開發(fā)人員之間有效的溝通與合作。需求獲取可能是最困難、最關鍵、最易出錯及最需要溝通交流的活動。對需求的獲取往往有錯誤的認識:用戶知道需求是什么,我們所要做的就是和他們交談從他們那里得到需求,明白什么是要完成的,什么樣的系統(tǒng)能適合商業(yè)需要就可以了,但是實際上需求獲取并不是想象的這樣簡單。首先需求獲取要定義問題范圍,系統(tǒng)的邊界往往是很難明確的,用戶不了解技術實現的細節(jié),這樣造成了系統(tǒng)目標的混淆。其次是對問題的理解,用戶對計算機系統(tǒng)的能力和限制缺乏了解,他們需要開發(fā)人員的協助和指導,開發(fā)人員要盡量避免在于用戶的交流時出現障礙,更不要忽略那些被認為是"很明顯"的信息。最后是需求的確認,因為需求的不穩(wěn)定性往往隨著時間的推移產生變動,使之難以確認。為了克服以上的問題,必須有組織的執(zhí)行需求的獲取活動。
·需求分析的原則 ?。?)需求分析必須能夠表達和理解問題的數據域和功能域。數據域包括數據流、數據內容和數據結構,而功能域反映上述三方面的控制信息。 (2)需求分析要把一個復雜問題按功能進行分解并逐層細化。通常,軟件系統(tǒng)要處理的問題如果太大、太復雜就很難理解,若劃分成幾部分,并確定各部分間的接口,就可完成整體的功能。在需求分析過程中,軟件系統(tǒng)的用戶需求中的數據、功能和行為都應細化。 (3)需求建模。模型可以幫助系統(tǒng)分析人員更好地理解軟件系統(tǒng)的數據、功能和行為,這些模型是軟件工程中下一階段進行系統(tǒng)設計的基礎。
·需求分析的注意事項 ?。?)確定詳細的需求,否則經費就算不準。經費估計錯誤的原因多為:用戶需求頻繁變動、遺漏重要需求、與用戶交流不夠、需求規(guī)格說明書質量低劣、需求分析不充分等。 (2)在編寫需求規(guī)格說明書之前,應明確要解決的問題。在試圖解決問題之前,要保證已考察了全部可替代的方案。要明白真正的問題出在哪里。這樣,在編寫需求規(guī)格說明書時做到有的放矢,把存在的問題暴露出來。 ?。?)立即確定需求,并記錄下該需求的背景。沒有明確問題,就進行下一步的設計,想回避矛盾,可能會帶來更大的問題。用戶不確定需求,軟件設計人員自己決定需求,將會帶來嚴重的問題。為了避免將來可能出現的問題和軟件工程項目能夠盡快地進入到下一個階段的系統(tǒng)設計中,要盡可能迅速地把用戶需求確定下來。任何決定總比沒有決定要好。 ?。?)一旦在需求規(guī)格說明書中發(fā)現問題,立即改正。如果把存在的問題拖延到系統(tǒng)設計階段去改正,就可能要花數倍的時間和精力才能糾正同一錯誤。 ?。?)在眾多用戶需求中確定各個需求的優(yōu)先順序,并確定可能存在的子集,以便為軟件設計、實施和項目管理等后續(xù)階段提供有利條件。 ?。?)需求分析時,不要進行系統(tǒng)設計的工作。需求分析的主要目的是確定軟件系統(tǒng)的外部特征,充分反映軟件系統(tǒng)應有的面貌,便于讓軟件設計人員根據用戶需求,去全面地考慮軟件系統(tǒng)的體系結構、算法等。在需求分析階段要集中精力解決用戶需求存在的問題,盡可能避免產生遺留問題。 ?。?)對于復雜的軟件系統(tǒng),要從多種視角進行需求分析。根據軟件系統(tǒng)的本質,切合實際地組織多種視角的需求。例如,可從根據用戶的類型,或根據響應的類型,或根據對象的軟件工程案例教程類型,或根據系統(tǒng)的模式等視角來組織用戶需求。通過多個視角來研究用戶需求問題,把可得到的不同的“投影”組合起來形成完整系統(tǒng)的描述。當試圖從整體觀點來描述軟件系統(tǒng)發(fā)生困難,或者有可能發(fā)生錯誤,或者很有可能遺失軟件系統(tǒng)的某些特性。而從不同的視角來 描述軟件系統(tǒng),因為每個視角限制了研究的范圍并能夠將注意力集中于此,所以很容易保證所研究的問題是真正完整的。 ?。?)重視形式化方法,但不放棄自然語言。為了用戶需求表達的精確性和方便用戶的可理解性,一個好方法是把自然語言的表達與形式化規(guī)格說明并立,互相對照,而且在一般情況下,先用自然語言寫出,再給出它的形式模型。 (9)用戶需求中不應存在“待確定”的條款。如若有這種需要,應同時說明何時由誰來解決該問題。
·用戶需求的類型 需求分析是從用戶最初的非形式化需求到滿足用戶要求的軟件產品的映射過程。它實際上是一個對用戶意圖不斷進行揭示和判斷的過程,其目的在于細化、精化軟件的作用范圍,確定擬開發(fā)軟件的功能和性能、約束、環(huán)境等。可將用戶的需求分為兩大類:功能性需求和非功能性需求。 (1)功能性需求。功能性需求主要說明了系統(tǒng)各功能部件與環(huán)境之間的相互作用的本質,即擬開發(fā)軟件在職能上實際應做到什么。一般來說,它是用戶最主要的需求,通常包括系統(tǒng)的輸入、系統(tǒng)能完成的功能、系統(tǒng)的輸出以及其他反應。在功能性需求中還應包括備選功能的定義識別。 (2)非功能性需求。非功能性要求主要從各個角度對所考慮的可能的解決方案起約束和限制作用。
·需求分析的方法 在軟件工程中,常用的需求分析方法有面向數據流的結構化分析方法和面向對象的分析方法。此外,還有以用戶為中心的需求分析方法。這些方法都采用圖文結合的方式,可以直觀地描述軟件的邏輯模型。
軟件工程發(fā)展方向:
“敏捷開發(fā)”被認為是軟件工程的一個重要的發(fā)展。它強調軟件開發(fā)應當是能夠對未來可能出現的變化和不確定性作出全面反應的。敏捷開發(fā)被認為是一種“輕量級”的方法。在輕量級方法中最負盛名的應該是“極限編程”。而與輕量級方法相對應的是“重量級方法”的存在。重量級方法強調以開發(fā)過程為中心,而不是以人為中心。重量級方法的例子比如CMM/PSP/TSP。面向方面的程序設計被認為是近年來軟件工程的另外一個重要發(fā)展。這里的方面指的是完成一個功能的對象和函數的集合。在這一方面相關的內容有泛型編程和模板。
(將持續(xù)更新和完善)
|