軟件工程jyun5 gin2 gung1 cing4(英文:software engineering)係電腦科學下嘅一門學科,涉及研究點樣去規範噉開發同維護電腦軟件:電腦軟件泛指一隻或者一柞程式,能夠教部電腦做出特定嘅運算嚟達到用家想要嘅功能。例如電子遊戲就係一種廿一世紀初常見嘅電腦軟件,一隻電子遊戲會包含一大柞程式,會教部遊戲機內置嘅電腦做出「對玩家撳嘅掣俾反應」同「顯示啲圖像喺個熒光幕嗰度」等嘅工作,並且靠呢啲嘢嚟達到「令玩家開心過癮」呢種功能。
軟件工程係一樣好有技巧嘅嘢:例如喺寫一隻軟件嘅源碼嗰陣,軟件工程師會特登喺啲碼嗰度留低啲注釋(comment;指個程式行嗰陣部電腦會忽略嘅碼)嚟解釋段碼係要嚟做乜嘅,等自己第時再想改或者返用段碼嗰時可以一眼就睇得出邊段碼係做啲乜嘅,變相等自己第時做嘢冇咁撈絞-「記得要落注釋」就係軟件工程師成日用嘅一種技巧;除此之外,軟件工程上亦都有講軟件測試(指搞掂咗隻原型之後試吓隻軟件行起上嚟有冇問題)同埋軟件維護(指喺隻軟件出咗街之後執同改良隻軟件)等嘅工作上要用嘅技巧。
廿一世紀初嘅軟件工程係一門專業:軟件工程師同電腦科學家甚至仲會有專門嘅軟件工程期刊用嚟發表學術文,喺呢啲文嗰度討論軟件工程上用嘅技巧同新諗法,而一個從事軟件工程相關工作嘅人通常都或多或少噉會睇呢啲期刊嘅文,嘗試令自己做軟件工程嘅技術係噉進步。
軟件工程係專門整電腦軟件嘅工程學:一隻電腦軟件由一個或者一柞電腦程式組成,存在嘅意義係要提供某啲功能;例如一隻 Hello World 嘅程式除咗攞嚟教入門嘅程式編寫之外冇咩功能可言,但
... 如此類推。軟件好多時仲會因為佢哋嘅強大功能而有相當嘅經濟價值,即係可以攞去賣嚟賺取利潤,而且一隻軟件仲可以掕埋拉臣同埋說明書等相關嘅文件;而工程學就係泛指用知識嚟設計同建造一啲有用嘅物品嘅過程,並且喺途中盡可能令成本效益有咁高得咁高(花費最少嘅資源嚟做到最多嘅嘢),例如電子工程專門設計智能電話等嘅電子架生噉,會用到物理學上有關電同磁嘅知識。
無論係開發咩軟件都好,軟件工程工作嘅第一步都係要搞清楚「隻軟件應該要係點嘅樣」。「預想中隻軟件應該要有嘅特徵」就係所謂嘅軟件需求(software requirements),軟件需求可以係由啲客明文噉提出嘅,但軟件工程師有陣時又要理解啲客有冇啲冇講出口嘅需求。軟件需求可以分做功能同非功能兩大種。
功能需求比較簡單直接,係指終端用家(指最後會用隻軟件嘅人)想隻軟件做得到嘅功能。功能需求係隻軟件起碼實要達得到嘅需求,會明確噉講出隻軟件應該要有咩 input 同 output,仲有係有啲咩必要嘅運算要做;如果隻軟件係由一個客主動要求開發嘅,噉個客通常會講明嗮佢對隻軟件嘅功能需求,而且寫合同嗰陣會講明呢啲需求;例-個客想要軟件工程師幫佢手整一隻數據庫管理系統,個系統要做到多種功能,包括係記住啲數據、俾用家摷記住咗嗰啲數據同埋用密碼學等嘅技術保護啲數據... 呀噉。
每隻軟件都會有佢獨特嘅功能方面嘅需求(詳情可以睇返功能需求),不過無論一隻軟件係攞嚟做乜嘅,軟件工程師一般都會希望隻軟件具有以下嘅特性。呢啲响功能以外、但一隻軟件需要有嘅特性就係所謂嘅非功能需求(NFR):
if
有問題,then
用噉噉噉嘅步驟嚟應對」,至少唔會搞到輕機。 冇縮排冇注釋: | 有縮排有注釋: |
---|---|
def find_max (L): max = 0 for x in L: if x > max: max = x return max | # 入嘅嘢:一列冧巴,叫佢做「L」。 # 出嘅嘢:L 入面最大嘅冧巴。 def find_max (L): # 定義乜嘢係「去搵 L 嘅最大值」。 max = 0 # 設最大值做 0。 for x in L: # 為咗 x 喺 L 入面。 if x > max: # 如果 x 大過最大值。 max = x # 設最大值做 x。 return max # 俾返個最大值出嚟。 # 有縮排有注釋嘅程式易睇好多, # 對第時接手嘅編程員嚟講會易用啲。 |
... 等等。
一般嚟講,軟件工程嘅第一步係「理解隻軟件要達到啲乜嘢目的」(詳情睇返軟件需求)。除咗呢樣工作之外,軟件工程涉及嘅主要工序有以下呢啲:
可行度研究(feasibility study)係指諗清楚啲軟件嘅需求之後,首先決定個項目係咪真係有得搞:好多時,啲客對於電腦軟件方面嘅嘢都唔係咁熟,會提出一啲冇可能達得到嘅要求;又或者係位軟件工程師想整一啲有返咁上下嶄新嘅功能,同時又因為呢啲功能嶄新得滯,唔肯定係咪真係有可能整到出嚟;可行度研究就係指
input
:軟件需求),output
:去定唔去)。可行度研究嘅過程會同時用到技術同經濟方面嘅考量-一個軟件開發計劃如果過唔到可行度研究,可以係因為現有嘅軟件技術做唔到啲需求,亦都可以係因為現時嘅技術係就係做到啲需求,但要用嘅成本極高,負責做呢個開發計劃嘅單位唔肯揼咁多本去做。
大細估計(sizing)通常係喺呢個階段做嘅。大細估計係指估計最後整出嚟嗰隻軟件會有幾大。大細估計喺軟件工程上係一個幾大嘅課題,到咗廿一世紀初都仲未有完全標準化嘅大細估計做法,不過軟件工程師可以憑經驗同幅圖則估算吓隻軟件會有幾多行碼,又或者係搵啲類似嘅軟件,睇吓佢哋係幾大左右... 呀噉。睇埋運算複雜度。
可行度研究最常會考慮嘅因素有以下呢啲,英文興嗌呢五大考量做 TELOS(嚟自嗰五個因素分別嘅開頭英文字母):
度好嗮覺得個軟件計劃整得過,啲軟件工程師先會郁手做設計。
可行度研究等嘅設計前工序基本上實會涉及「估隻軟件要用揼幾多本先可以整到出嚟」噉嘅工作。成本估計有好多方法,例如構造成本模型(COCOMO)就係廿一世紀初最常用嘅成本估計法之一,建基於對前人做軟件開發得到嘅數據嘅迴歸分析:迴歸分析(regression analysis)係一種統計學技術,喺最簡單嗰種情況下,攞若干個自變數 同一個應變數 ,而
迴歸分析做嘅就係攞一柞過往嘅數據,估算出啲參數-柞 -嘅數值,最後得出一個迴歸模型。於是第時研究者就可以攞住個迴歸模型(知道咗柞 嘅值),靠觀察啲 嘅數值嚟計 嘅數值大致上會係幾多。喺 1970 年代尾,有美國嘅軟件工程研究者搵咗一大柞軟件工程師嘅開發項目嘅數據返嚟,每個項目做一個個案做迴歸分析,個項目啲特徵(例如係個項目嘅複雜度噉)做 ,而「個項目要用嘅資源」做 ,建立咗迴歸模型,發現用噉嘅迴歸模型能夠大致噉估計一個軟件開發項目嘅成本-由呢個過程形成嘅就係 COCOMO 成本估計法。最基本嗰條 COCOMO 式係噉嘅:
設計(design)係「知想要啲乜」(軟件需求)同埋「知隻軟件整得過」(可行度研究)之後嘅第一個工序,指軟件工程師喺度計劃隻軟件要點樣整。喺呢個階段,軟件工程師仲未郁手整隻軟件,不過都已經大把嘢要做:
而建造(construction)就係指郁手(跟住軟件設計得出嗰個計劃)寫隻軟件嘅源碼。喺呢個過程當中,軟件工程師要一路寫一路做小型測試、debug 同埋配置管理(包括一路睇實隻軟件「喺邊個時間點改過嚟」同埋每次改咗之後「隻軟件嘅表現有咩變化」等嘅資訊)嘅工作,最後得出一件原型(prototype;指隻行得嘅軟件,但要測試所以仲未出街住)。有關寫程式嘅詳情,可以睇吓電腦程式編寫嘅嘢。
測試(testing)係指做一啲特定嘅程序嚟睇吓隻軟件係咪去到出得街嘅質素:最簡單嘅方法係工程師自己試吓行吓隻軟件,睇吓有冇乜嘢 bug;再唔係佢哋又可以索性搵班人返嚟試吓用隻軟件,並且收集場測試嘅數據,用數據嚟評估隻軟件掂唔掂,例如觀察吓班測試者平均要用幾耐先至用隻軟件用得上手-呢樣數據會反映隻軟件夠唔夠易用:p. 2。
响廿一世紀初嘅軟件工程界,測試呢家嘢有好多技巧。以下係軟件工程師傾有關做測試嘅心得嗰陣成日會提到嘅要點:
... 呀噉。
維護(maintenance)係指喺隻軟件出咗街(啲客俾咗錢攞到手)之後再改隻軟件。軟件工程師會想維護自己整嘅軟件可以有好多原因,包括係想改良隻軟件,例如廿一世紀初嘅電子遊戲就係噉-啲遊戲開發者成日都會喺隻遊戲出咗街之後加啲新嘅內容落隻遊戲嗰度,等啲玩家玩得耐啲過癮啲;除此之外,做軟件維護嘅原因仲可以包括:
... 呀噉。軟件維護呢家嘢可以好撈絞-現實嘅軟件好多時都複雜得好交關,喺開發期間想改經已好容易搞到出 bug,而想改一隻複雜得嚟仲要係有客喺度用緊嘅軟件,就更加難搞,而且對有返咁上下舊嘅軟件做維護可能會有「隻軟件同現時嘅軟硬件唔相容」等嘅問題。
軟件開發過程(software development process)係軟件工程上最重要嘅概念之一,指由「開始諗隻軟件」到「真係整咗隻軟件出嚟」之間嗰一大柞工序(設計同建造呀噉)先後要點排。喺最簡單嗰種情況下,軟件開發過程會用到所謂嘅瀑布模型(waterfall model;下圖),啲軟件工程師會跟以下呢啲步驟嚟做:
-即係好似瀑布噉由上面直落。
瀑布模型係一個好理想嘅模型,但現實係唔理想嘅-喺現實嘅應用上,通常啲軟件工程師會整隻軟件會整整吓發現新嘅要求,所以喺出街之前要返去「搞清楚要求」嗰一步嗰度,而且好多時一隻軟件整起上嚟會有好多個唔同嘅部份,唔同部份處於唔同階段。因為噉,廿一世紀初嘅軟件工程都唔會靠瀑布模型嚟做,不過進階嘅軟件開發過程模型-專業嘅軟件工程師做嘢嗰時實際會用嘅-好多時都係建基於瀑布模型之上嘅,簡單嘅例子有喺呢個模型之上添加「喺邊個階段發現到有錯,就返去之前嗰個階段嗰度」噉。
螺旋模型(spiral model)係一種喺 1980 年代尾興起嘅軟件開發方法,指成場開發過程涉及咗若干次嘅迴轉(loop),每一次迴轉都會涉及以下嘅步驟:
同瀑布模型等嘅大多數開發模型比起嚟,螺旋模型最大嘅好處係有效噉應付風險:軟件開發通常都係有風險嘅-要整出一個行得嘅原型要用好耐時間,而且好多時都擔心辛苦整咗件原型出嚟先發覺有問題(例如一個創新嘅遊戲機制,做完試玩先至知冇想像中咁好玩);相比之下,螺旋模型每次迴轉都整一嚿細嘅原型出嚟,每一次迴轉都會令件原型更加接近最後嘅成品-好似條螺線噉愈轉愈大,而且喺每次郁手整原型之前就諗好嗮有乜可能會出錯嘅地方同點應對。喺廿一世紀初,螺旋模型係某啲軟件工程子領域(例如電子遊戲製作)嘅業界標準,尤其常用於大型項目嘅開發。
除咗瀑布模型同螺旋模型之外,廿一世紀初嘅軟件開發上仲有好多種做法:
... 呀噉。
軟件工程呢家嘢始於 1960 年代:早喺廿世紀中,電腦嘅使用喺科學同工程學上經已相當之普遍;但當時啲電腦程式俾好多人詬病話佢哋成日都出錯,跟唔上電腦硬件嘅進展,頻密噉出現超支、喺最後限期前交唔到貨、要求大量嘅 debug 工作、滿足唔到啲客嘅需求、甚至係根本成個開發項目完成唔到胎死腹中。於是當時嘅北大西洋公約組織(NATO)就郁手揼本想改善電腦軟件嘅質素,開始有電腦科學工作者喺度研究點樣改善整軟件嘅過程。
到咗 1965 年,經已有人喺度用英文 software engineering 一詞嚟描述呢班人做緊嘅嘢;打後响 1968 年,北約搞咗人類史上第一個講軟件工程嘅學術研討會,一般認為此舉算係正式奠定咗軟件工程作為一個工程領域嘅地位。到咗廿一世紀初,軟件工程經已俾人視為電腦科學最重要嘅部份之一。
This article uses material from the Wikipedia 粵語 article 軟件工程, which is released under the Creative Commons Attribution-ShareAlike 3.0 license ("CC BY-SA 3.0"); additional terms may apply (view authors). 呢度嘅所有文字係根據 CC BY-SA 4.0 牌照嘅條款發佈;可能會有附加嘅條款。 Images, videos and audio are available under their respective licenses.
®Wikipedia is a registered trademark of the Wiki Foundation, Inc. Wiki 粵語 (DUHOCTRUNGQUOC.VN) is an independent company and has no affiliation with Wiki Foundation.