軟件工程

係電腦科學下嘅一門學科，涉及研究點樣去規範噉開發同維護電腦軟件：電腦軟件泛指一隻或者一柞程式，能夠教部電腦做出特定嘅運算嚟達到用家想要嘅功能。例如電子遊戲就係一種廿一世紀初常見嘅電腦軟件，一隻電子遊戲會包含一大柞程式，會教部遊戲機內置嘅電腦做出「對玩家撳嘅掣俾反應」同「顯示啲圖像喺個熒光幕嗰度」等嘅工作，並且靠呢啲嘢嚟達到「令玩家開心過癮」呢種功能。

軟件工程係一樣好有技巧嘅嘢：例如喺寫一隻軟件嘅源碼嗰陣，軟件工程師會特登喺啲碼嗰度留低啲注釋嚟解釋段碼係要嚟做乜嘅，等自己第時再想改或者返用段碼嗰時可以一眼就睇得出邊段碼係做啲乜嘅，變相等自己第時做嘢冇咁撈絞－「記得要落注釋」就係軟件工程師成日用嘅一種技巧；除此之外，軟件工程上亦都有講軟件測試同埋軟件維護等嘅工作上要用嘅技巧。

廿一世紀初嘅軟件工程係一門專業：軟件工程師同電腦科學家甚至仲會有專門嘅軟件工程期刊用嚟發表學術文，喺呢啲文嗰度討論軟件工程上用嘅技巧同新諗法，而一個從事軟件工程相關工作嘅人通常都或多或少噉會睇呢啲期刊嘅文，嘗試令自己做軟件工程嘅技術係噉進步。

定位

軟件工程係專門整電腦軟件嘅工程學：一隻電腦軟件由一個或者一柞電腦程式組成，存在嘅意義係要提供某啲功能；例如一隻 Hello World 嘅程式除咗攞嚟教入門嘅程式編寫之外冇咩功能可言，但
一隻系統軟件－包括作業系統－會負責管理部電腦嘅硬件運作，而廿一世紀初嘅電腦冇咗作業系統基本上唔會用得到；
一隻繪圖軟件－例如 Photoshop 或者小畫家噉－可以俾用家攞嚟製作圖像；
一隻電子遊戲可以俾用家玩一隻遊戲，達到「令佢開心過癮」嘅效果；
一隻數據庫管理系統可以俾用家用嚟管理數據庫；
... 如此類推。軟件好多時仲會因為佢哋嘅強大功能而有相當嘅經濟價值，即係可以攞去賣嚟賺取利潤，而且一隻軟件仲可以掕埋拉臣同埋說明書等相關嘅文件；而工程學就係泛指用知識嚟設計同建造一啲有用嘅物品嘅過程，並且喺途中盡可能令成本效益有咁高得咁高，例如電子工程專門設計智能電話等嘅電子架生噉，會用到物理學上有關電同磁嘅知識。
－軟件工程就係工程學嘅一門，專門用知識嚟設計同建造電腦軟件，尤其係會用到電腦科學上嘅知識。

軟件需求 

無論係開發咩軟件都好，軟件工程工作嘅第一步都係要搞清楚「隻軟件應該要係點嘅樣」。「預想中隻軟件應該要有嘅特徵」就係所謂嘅軟件需求，軟件需求可以係由啲客明文噉提出嘅，但軟件工程師有陣時又要理解啲客有冇啲冇講出口嘅需求。軟件需求可以分做功能同非功能兩大種。

功能需求比較簡單直接，係指終端用家想隻軟件做得到嘅功能。功能需求係隻軟件起碼實要達得到嘅需求，會明確噉講出隻軟件應該要有咩 input 同 output，仲有係有啲咩必要嘅運算要做；如果隻軟件係由一個客主動要求開發嘅，噉個客通常會講明嗮佢對隻軟件嘅功能需求，而且寫合同嗰陣會講明呢啲需求；例－個客想要軟件工程師幫佢手整一隻數據庫管理系統，個系統要做到多種功能，包括係記住啲數據、俾用家摷記住咗嗰啲數據同埋用密碼學等嘅技術保護啲數據... 呀噉。

非功能 

每隻軟件都會有佢獨特嘅功能方面嘅需求，不過無論一隻軟件係攞嚟做乜嘅，軟件工程師一般都會希望隻軟件具有以下嘅特性。呢啲响功能以外、但一隻軟件需要有嘅特性就係所謂嘅非功能需求：
軟件內部：
可測試度：指一隻軟件要容易做測試－喺整好咗隻軟件嘅原型之後就要做測試搵吓隻軟件有冇錯處；舉個簡單例子，軟件工程師可以要隻軟件記低啲 log，而呢點會幫軟件工程師手搵出錯處喺邊。

可維護度：指嗰個程式有幾易可以俾現時或者將來嘅編程員攞去改良、執錯或者調較。高嘅可維護度對於普通嘅用家嚟講重要性唔係咁明顯，但就對一個程式長遠嘅命運同價值嚟講就好緊要－具有高可維護度嘅程式往往會俾人攞去改完又改，因而有一個更活躍嘅用家群。
可移植度：指嗰個程式嘅源碼可以喺幾廣泛嘅電腦硬件同作業系統上面行，一個完美可移植嘅程式能夠喺任何電腦上面行。可移植度由好多因素話事，例如係有啲程式可能用咗一啲比較專業嘅指令，而呢啲指令專業得滯，未必部部電腦都有安裝呢啲指令－噉就會搞到個程式喺某啲電腦上面行唔到。
可返用度：指隻軟件或者隻軟件啲組成部份可以攞去返用－喺軟件工程師做嘢嗰時，佢哋要設計完一隻軟件跟住去設計下一隻，而事實表明咗，有好多演算法同子程序都係唔同嘅軟件都會用到嘅，所以一位軟件工程師做嘢嗰陣成日都會諗起而家整緊嗰隻軟件可以用返某啲打前整過嘅軟件用過嘅嘢；因為噉，軟件工程師通常都會特登將隻軟件整到裏面啲嘢可以輕易噉攞去返用。例子可以睇吓電子遊戲製作當中嘅遊戲資產。
軟件外部：
效率：指個程式用咗幾多資源。呢度嘅「資源」包括咗時間、電腦記憶、同埋係網絡頻寬等等。一個理想嘅程式能夠好好噉管理佢有嘅資源，例如係唔好俾漏記憶嘅情況發生，並且用最少嘅資源做最多嘅嘢。可以運算複雜度方面嘅內容。
可靠度：指個程式有幾常會俾到啱嘅結果，一個完美可靠嘅程式係每次行嗰陣都會成功俾到正確輸出嘅， ；可靠度取決於啲演算法喺概念上嘅正確同寫程式嘅過程當中有冇出錯，唔可靠嘅程式成日會有競爭危害或者緩衝區溢位等嘅問題－即係話如果有呢類問題出現，噉通常表示個程式寫得唔好。
頑健度：指個程式有幾能夠預測同應對一啲佢自身以外嘅差錯，包括輸入嘅資料唔啱款、要用嘅資源唔夠用以及係用家方面嘅出錯呀噉。一個強健嘅程式能夠喺佢自己以外嘅嘢出錯嗰陣有方法應對－簡單講可以想像成「if 有問題，then 用噉噉噉嘅步驟嚟應對」，至少唔會搞到輕機。

易用度：指一個普通嘅用家有幾易可以正確噉運用呢個程式。一個易用嘅程式會寫得好清楚、冇啲唔等使嘅指令、仲會有好多附加嘅內文嚟解釋每段指令係為乜而存在嘅；呢啲因素令到經驗冇咁豐富嘅編程員或者冇份寫嗰個程式嘅編程員能夠一睇就知嗰個程式做緊啲乜嘢，第時有其他人接手隻軟件嗰陣就冇咁撈絞。人機互動呢門專係研究點樣令電子架生更加易用嘅電腦科學領域對易用度有詳細嘅研究。

... 等等。

涉及工序 

一般嚟講，軟件工程嘅第一步係「理解隻軟件要達到啲乜嘢目的」。除咗呢樣工作之外，軟件工程涉及嘅主要工序有以下呢啲：

可行度研究

可行度研究係指諗清楚啲軟件嘅需求之後，首先決定個項目係咪真係有得搞：好多時，啲客對於電腦軟件方面嘅嘢都唔係咁熟，會提出一啲冇可能達得到嘅要求；又或者係位軟件工程師想整一啲有返咁上下嶄新嘅功能，同時又因為呢啲功能嶄新得滯，唔肯定係咪真係有可能整到出嚟；可行度研究就係指
攞住手上嗰啲已知嘅軟件需求，
做一大輪嘅分析，再決定隻軟件係咪真係有可能整得成。
可行度研究嘅過程會同時用到技術同經濟方面嘅考量－一個軟件開發計劃如果過唔到可行度研究，可以係因為現有嘅軟件技術做唔到啲需求，亦都可以係因為現時嘅技術係就係做到啲需求，但要用嘅成本極高，負責做呢個開發計劃嘅單位唔肯揼咁多本去做：
「要完全徹底噉測試嗮所有可能性」係冇可能嘅：測試當中搵到錯處能夠證明隻軟件有錯，但測試搵唔到錯處唔能夠證明隻軟件完美無誤；現實應用上嘅軟件都會頗為複雜，閒閒哋會有成幾萬行源碼，所以「隻軟件行嗰陣有可能處於嘅狀態」呢個數值極之大，現實世界嘅軟件工程師唔會有咁多時間試嗮呢啲可能情況，做大量嘅測試都頂櫳只係能夠減低隻軟件有意外甩漏嘅機率。軟件工程師通常淨係會揀最有可能出現嗰啲情況，再試吓呢啲情況下會唔會有 bug，如果冇，佢哋就會假設隻軟件喺其餘嘅情況下都唔會有問題。歸納。
要盡早做測試：軟件工程師通常會有咁早得咁早開始做測試，喺寫隻軟件嘅源碼嗰時就經已喺度做啲小型嘅測試，行吓隻軟件啲細部份睇吓有冇問題；一般認為，bug 呢家嘢係愈早發現愈好嘅，遲發現嘅 bug 好多時都會搞到工程師損失慘重。
錯誤聚埋一齊：有啲軟件工程師指「80% 嘅錯處都係由 20% 嘅模塊嗰度嚟嘅」；現實嘅經驗表明咗，好多時一隻軟件嘅錯誤都係源自其中一兩個部份嘅錯，而同時淨低嗰啲部份查實冚唪唥都冇問題。
農藥悖論：重複噉用同一個個案嚟做測試係唔會搵到新嘅 bug 嘅，做測試嗰陣有必要用一大堆唔同樣嘅個案嚟做測試，先至可以全面噉搵到唔同嘅 bug。
無錯謬論：如果一隻軟件係 99% 冇 bug 但滿足唔到啲功能需求，噉隻軟件係完全冇用嘅；「測試冇 bug」只不過係一隻軟件要出街嘅必要條件，唔係出得街嘅充分條件。
... 呀噉。

維護

維護係指喺隻軟件出咗街之後再改隻軟件。軟件工程師會想維護自己整嘅軟件可以有好多原因，包括係想改良隻軟件，例如廿一世紀初嘅電子遊戲就係噉－啲遊戲開發者成日都會喺隻遊戲出咗街之後加啲新嘅內容落隻遊戲嗰度，等啲玩家玩得耐啲過癮啲；除此之外，做軟件維護嘅原因仲可以包括：
想改正啲响開發過程當中冇發現到嘅 bug；
啲客對隻軟件提出咗新嘅要求，工程師想加新功能應對；
想令隻軟件可以同更多嘅軟件、硬件或者電訊功能相容；
工程師預想到可能將會出現一啲問題，所以改定隻軟件；
引退一啲過時嘅舊軟件
... 呀噉。軟件維護呢家嘢可以好撈絞－現實嘅軟件好多時都複雜得好交關，喺開發期間想改經已好容易搞到出 bug，而想改一隻複雜得嚟仲要係有客喺度用緊嘅軟件，就更加難搞，而且對有返咁上下舊嘅軟件做維護可能會有「隻軟件同現時嘅軟硬件唔相容」等嘅問題。

開發模型

基本模型 

軟件開發過程係軟件工程上最重要嘅概念之一，指由「開始諗隻軟件」到「真係整咗隻軟件出嚟」之間嗰一大柞工序先後要點排。喺最簡單嗰種情況下，軟件開發過程會用到所謂嘅瀑布模型，啲軟件工程師會跟以下呢啲步驟嚟做：
搞清楚隻軟件嘅要求係啲乜；
郁手設計隻軟件；
實行，即係實際噉寫隻軟件嘅源碼出嚟；
驗證，即係做測試等嘅工作睇吓隻軟件係咪真係達到啲要求；
維護，即係執隻軟件啲錯處，甚至改吓隻軟件，等佢能夠應付隨時間而出現嘅新要求；
－即係好似瀑布噉由上面直落。

瀑布模型係一個好理想嘅模型，但現實係唔理想嘅－喺現實嘅應用上，通常啲軟件工程師會整隻軟件會整整吓發現新嘅要求，所以喺出街之前要返去「搞清楚要求」嗰一步嗰度，而且好多時一隻軟件整起上嚟會有好多個唔同嘅部份，唔同部份處於唔同階段。因為噉，廿一世紀初嘅軟件工程都唔會靠瀑布模型嚟做，不過進階嘅軟件開發過程模型－專業嘅軟件工程師做嘢嗰時實際會用嘅－好多時都係建基於瀑布模型之上嘅，簡單嘅例子有喺呢個模型之上添加「喺邊個階段發現到有錯，就返去之前嗰個階段嗰度」噉。

螺旋模型 

螺旋模型係一種喺 1980 年代尾興起嘅軟件開發方法，指成場開發過程涉及咗若干次嘅迴轉，每一次迴轉都會涉及以下嘅步驟：
決定目標：由「啲客嘅意見」同「距離想要嘅產品爭幾遠」等嘅資訊來源嗰度評估隻軟件需求達到啲咩要求，從而知道隻軟件喺呢一次迴轉當中要達到啲咩目的；喺呢個階段，軟件工程師會諗一柞可能嘅解決方案出嚟；睇返軟件需求。
諗同解決風險：班軟件工程師睇勻嗮柞可能嘅解決方案，由啲方案當中揀出佢哋覺得最掂嗰個，然後佢哋就會度吓採取呢個方案會引起啲乜嘢風險同埋要點樣應對。睇返軟件設計。
郁手整件原型：揀咗方案之後，就郁手寫源碼，整件原型，整好咗就要做測試，知道件原型達唔達得到想要嗰啲要求。
計劃下次迴轉

同瀑布模型等嘅大多數開發模型比起嚟，螺旋模型最大嘅好處係有效噉應付風險：軟件開發通常都係有風險嘅－要整出一個行得嘅原型要用好耐時間，而且好多時都擔心辛苦整咗件原型出嚟先發覺有問題；相比之下，螺旋模型每次迴轉都整一嚿細嘅原型出嚟，每一次迴轉都會令件原型更加接近最後嘅成品－好似條螺線噉愈轉愈大，而且喺每次郁手整原型之前就諗好嗮有乜可能會出錯嘅地方同點應對。喺廿一世紀初，螺旋模型係某啲軟件工程子領域嘅業界標準，尤其常用於大型項目嘅開發。

第啲模型 
除咗瀑布模型同螺旋模型之外，廿一世紀初嘅軟件開發上仲有好多種做法：
增進建造模型，指將隻軟件分做幾部份，每件部份都係整好就出街，逐件逐件噉整同出街。
疊代增進開發，指以某啲形式結合疊代設計同增進建造模型嘅方法。
快速應用程式開發
敏捷軟件開發
Scrum
看板
極限編程
V-模型
... 呀噉。

起源

軟件工程呢家嘢始於 1960 年代：早喺廿世紀中，電腦嘅使用喺科學同工程學上經已相當之普遍；但當時啲電腦程式俾好多人詬病話佢哋成日都出錯，跟唔上電腦硬件嘅進展，頻密噉出現超支、喺最後限期前交唔到貨、要求大量嘅 debug 工作、滿足唔到啲客嘅需求、甚至係根本成個開發項目完成唔到胎死腹中。於是當時嘅北大西洋公約組織就郁手揼本想改善電腦軟件嘅質素，開始有電腦科學工作者喺度研究點樣改善整軟件嘅過程。

到咗 1965 年，經已有人喺度用英文 software engineering 一詞嚟描述呢班人做緊嘅嘢；打後响 1968 年，北約搞咗人類史上第一個講軟件工程嘅學術研討會，一般認為此舉算係正式奠定咗軟件工程作為一個工程領域嘅地位。到咗廿一世紀初，軟件工程經已俾人視為電腦科學最重要嘅部份之一。

電子遊戲製作
整合開發環境
電腦架構
電腦保安
人機互動
項目管理
產品設計
還原工程
公家領域
特徵蔓延

文獻

Bruegge, Bernd; Dutoit, Allen (2009). Object-oriented software engineering: using UML, patterns, and Java (3rd ed.). Prentice Hall. ISBN 978-0-13-606125-0.
Jalote, Pankaj (2005) [1991]. An Integrated Approach to Software Engineering (3rd ed.). Springer. ISBN 978-0-387-20881-7.
Oshana, Robert (2019-06-21). Software engineering for embedded systems: methods, practical techniques, and applications (2nd ed.). Kidlington, Oxford, United Kingdom. ISBN 978-0-12-809433-4.
Pressman, Roger S. (2009). Software Engineering: A Practitioner's Approach (7th ed.). Boston, Mass: McGraw-Hill. ISBN 978-0-07-337597-7.
Sommerville, Ian (2010) [2010]. Software Engineering (9th ed.). Harlow, England: Pearson Education. ISBN 978-0-13-703515-1.

攷

拎

Journal of Software Engineering，一本講軟件工程嘅期刊。
Software Engineering. GeeksforGeeks.
Guide to the Software Engineering Body of Knowledge.
The Open Systems Engineering and Software Development Life Cycle Framework, OpenSDLC.org the integrated Creative Commons SDLC.