3.1 軟件工程
3.1.1 軟件危機(jī)
“軟件工程”這個(gè)詞是不是聽著既有點(diǎn)熟悉又有點(diǎn)陌生?這幾年確實(shí)提得少了,但它在當(dāng)年誕生時(shí),是具有劃時(shí)代意義的。它誕生在1970年左右的“軟件危機(jī)”之時(shí),軟件工程對解決軟件危機(jī)很有幫助。
為什么會有“軟件危機(jī)”呢?當(dāng)時(shí)的情況是,落后的軟件生產(chǎn)方式無法滿足迅速增長的計(jì)算機(jī)軟件需求,從而導(dǎo)致在軟件開發(fā)與維護(hù)過程中出現(xiàn)一系列嚴(yán)重問題。
最初的程序設(shè)計(jì)往往只是一兩個(gè)程序開發(fā)人員,寫一個(gè)由幾百行、幾千行代碼構(gòu)成的“小玩意兒”,運(yùn)行在單臺機(jī)器上,供少數(shù)從事“高精尖”工作的人自給自足地用一用。這種事情,讓那些天才兀自去探索就好了。
然而,隨著時(shí)代的發(fā)展,軟件的規(guī)模越來越大,軟件越來越復(fù)雜,需要有更好的系統(tǒng)架構(gòu);軟件開發(fā)人員變多了,他們之間需要更好地協(xié)調(diào);軟件要支撐的用戶數(shù)量越來越多,需要有更好的性能和可靠性;軟件要持續(xù)使用和維護(hù)的時(shí)間越來越長,需要有更好的可維護(hù)性,等等。以前的小作坊式的工作方法,當(dāng)遇到這些情況時(shí)就不靈了:開發(fā)進(jìn)度變得難以預(yù)測,開發(fā)成本難以控制,質(zhì)量無法保證……這就是“軟件危機(jī)”。
3.1.2 工程化
那么軟件工程怎么解決這些問題呢?軟件工程的核心思想是,把其他行業(yè)和領(lǐng)域里的工程化經(jīng)驗(yàn)借鑒過來,以系統(tǒng)性的、規(guī)范化的、可定量的工程化方法來開發(fā)和維護(hù)軟件。這包括相應(yīng)的流程、工具、方法論等。
下面看一個(gè)對軟件工程的典型的定義。在IEEE的軟件工程術(shù)語匯編中是這么定義軟件工程的:定義一,將系統(tǒng)化的、嚴(yán)格約束的、可量化的方法應(yīng)用于軟件的開發(fā)、運(yùn)行和維護(hù),即將工程化應(yīng)用于軟件;定義二,對“定義一”中所述方法的研究。
接下來我們來看看軟件工程的七條基本原理。
第一,用分階段的生命周期計(jì)劃嚴(yán)格管理。凡事預(yù)則立,不預(yù)則廢。建大橋、蓋高樓需要有詳細(xì)的設(shè)計(jì)規(guī)劃和詳細(xì)的時(shí)間計(jì)劃,軟件的開發(fā)和維護(hù)也一樣。應(yīng)該把軟件生命周期分成若干階段,并相應(yīng)地制訂切實(shí)可行的計(jì)劃:何時(shí)完成哪種類型的工作。然后嚴(yán)格按照計(jì)劃對軟件的開發(fā)和維護(hù)進(jìn)行管理。這樣的計(jì)劃包括項(xiàng)目概要計(jì)劃、里程碑計(jì)劃、項(xiàng)目控制計(jì)劃、產(chǎn)品控制計(jì)劃、驗(yàn)證計(jì)劃、運(yùn)行維護(hù)計(jì)劃等。
第二,堅(jiān)持進(jìn)行階段評審。對軟件的質(zhì)量保證工作不能等到寫完代碼后再進(jìn)行。因?yàn)楦鶕?jù)統(tǒng)計(jì),大部分錯(cuò)誤是在編寫代碼之前造成的,包括需求分析方面的錯(cuò)誤、系統(tǒng)設(shè)計(jì)方面的錯(cuò)誤等。這些錯(cuò)誤,發(fā)現(xiàn)并改正得越晚,所需付出的代價(jià)就越大。所以應(yīng)該在每個(gè)階段都進(jìn)行嚴(yán)格的評審,以便盡早發(fā)現(xiàn)問題,盡量不讓問題遺留到下一個(gè)階段。
第三,對產(chǎn)品需求變更實(shí)行嚴(yán)格的控制。在軟件開發(fā)過程中不應(yīng)隨意改變需求,因?yàn)楦淖冃枨笸馕吨淖冇?jì)劃、重新做系統(tǒng)分析和設(shè)計(jì)、重新編寫代碼等,代價(jià)往往比較大。當(dāng)然也不能一刀切地禁止改變需求:在軟件開發(fā)過程中改變需求是難免的,由于外部環(huán)境等因素的變化,相應(yīng)地改變產(chǎn)品需求是一種客觀需要。所以,對需求變更需要進(jìn)行嚴(yán)格的評審,從多個(gè)角度綜合考慮,確實(shí)需要變更時(shí)再變更。并且當(dāng)需求變更時(shí),要保證其他各個(gè)階段的文檔和代碼都隨之相應(yīng)地改變。
第四,采用現(xiàn)代程序設(shè)計(jì)技術(shù)。從結(jié)構(gòu)化軟件開發(fā)技術(shù)到后來的面向?qū)ο蠹夹g(shù)等,從第一代語言到第四代語言,人們在不斷探索。采用先進(jìn)的技術(shù),既可以提高軟件開發(fā)效率,又可以降低軟件維護(hù)成本。
第五,對中間成果應(yīng)能清楚地審查。必須找到一種方法,在軟件開發(fā)項(xiàng)目的最終成果,也就是軟件,最終運(yùn)行起來之前,就能夠探測到項(xiàng)目的進(jìn)度和質(zhì)量,以便更好地管理和降低風(fēng)險(xiǎn)。為此,軟件開發(fā)過程中的各項(xiàng)活動,要產(chǎn)生可見的中間產(chǎn)物,比如需求文檔、設(shè)計(jì)文檔等。
第六,開發(fā)人員應(yīng)該少而精。開發(fā)人員的素質(zhì)和數(shù)量是影響軟件質(zhì)量與開發(fā)效率的重要因素,開發(fā)人員應(yīng)該少而精。高素質(zhì)開發(fā)人員的效率比低素質(zhì)開發(fā)人員的效率要高幾倍到幾十倍,在開發(fā)工作中犯的錯(cuò)誤也要少得多。此外,隨著人數(shù)的增加,溝通和協(xié)作的成本會顯著增加。通過這個(gè)簡單的模型就能看出來:當(dāng)開發(fā)小組為N人時(shí),可能的通信信道為N(N-1)/2個(gè)。
第七,承認(rèn)不斷改進(jìn)軟件實(shí)踐的必要性。我們不僅要積極采納新的軟件開發(fā)技術(shù),還要注意不斷總結(jié)經(jīng)驗(yàn),收集進(jìn)度、問題等數(shù)據(jù),進(jìn)行統(tǒng)計(jì)和報(bào)告。這些數(shù)據(jù)既可以用來評估新的軟件技術(shù)的效果,也可以用來指明必須著重注意的問題,以及應(yīng)該優(yōu)先進(jìn)行研究的工具和技術(shù)。
以上七條基本原理,主要就是在說,我們要采用工程化的方法來開發(fā)軟件。
今天我們聽到的很多耳熟能詳?shù)脑~匯,都是從那個(gè)時(shí)代流傳下來的。比如:結(jié)構(gòu)化編程、面向?qū)ο?、需求分析、軟件?guī)格說明書、軟件質(zhì)量保證、軟件配置管理、可維護(hù)性、可追蹤性等。軟件工程的思想和方法是前人的非常有價(jià)值的積累與沉淀,在很大程度上仍在指導(dǎo)著我們的工作。
- Vue.js 3.x+Element Plus前端開發(fā)實(shí)戰(zhàn)
- Spring源碼深度解析
- 軟件開發(fā)生產(chǎn)率改進(jìn):軟件管理的有效領(lǐng)導(dǎo)力與量化方法
- Android深度探索(卷1):HAL與驅(qū)動開發(fā)
- 從缺陷中學(xué)習(xí)C/C++
- SQL Server應(yīng)用與開發(fā)范例寶典
- Arduino項(xiàng)目開發(fā):智能家居
- 區(qū)塊鏈:技術(shù)原理與應(yīng)用實(shí)踐
- Unity AR/VR開發(fā):從新手到專家
- CATIA V5 從入門到精通(第二版)
- 混沌工程:通過可控故障實(shí)驗(yàn)提升軟件系統(tǒng)可靠性
- 軟件開發(fā)大講堂·從入門到精通-第一輯(套裝共5冊)
- Android驅(qū)動開發(fā)與移植實(shí)戰(zhàn)詳解
- 軟件平臺架構(gòu)設(shè)計(jì)與技術(shù)管理之道
- Unity 3D游戲開發(fā)技術(shù)詳解與典型案例