--- title: 108-1 軟體工程筆記 tags: nptu-course lang: zh-tw --- # 108-1 軟體工程筆記 [toc] ## 導論 ### 何謂軟體工程 - 一門注重在生產軟體各方面知識的工程學科 - 為支援專業軟體開發,非個人程式設計 - 包含規格制定、設計、及演進的各項技術 - 基本活動包括軟體規格制訂、軟體開發、確認、及演進。 ### 軟體產品 - 通用產品 - 可自訂規格 - 由軟體開發公司所生產的獨立系統 - 公開銷售給任何顧客 - 客製化產品 - 須遵循規格 - 專為特定客戶所製系統 ```graphviz digraph hierarchy { nodesep=0.5 node [color=Red,shape=box] edge [color=Blue, style=dashed] 軟體產品->{通用產品 客製化產品} 通用產品->{文書處理 資料庫} 客製化產品->{航管系統 電子設備控制系統} } ``` ### 軟體品質 - 包括... - 軟體所做的事 - 執行時的行為、系統程式架構及相關之說明文件 - e.g. 使用者查詢的反應時間快慢、程式碼易讀性等 ### 軟體工程 - 特性 - 須依據其應用環境而訂定 - 重要性 - 人越來越依賴先進的軟體系統 -> 需經濟且快速的生產出可靠系統 - 良好軟體必要特性 - 可維護性 - 軟體須能隨客戶需求改變及演進 - 可信賴度及安全性 - 軟體可靠性、保全性、及安全性 - 效率 - 回應速度、處理時間、記憶體使用率 - 可接受度 - 設計目標為使用者可接受的 ### 軟體工程基本概念 - 使用能被掌控且理解的開發程序 - 可信賴度及效能 - 了解和管理規格和需求 - 對現有資源做最有效率的利用 ### Web 與軟體工程 - **軟體再利用**以變成建構Web系統的主要方法 - Web系統應該以遞增方式開發與交付 - 使用者介面會受限於瀏覽器的功能 ### 道德規範及專業守則 - Public - 維護大眾利益 - Client and Employer - 盡可能讓客戶及雇主得到最佳利益 - Product - 確保產品及相關修改符合最高的專業標準 - Judgement - 判斷應維持正直與中立 - Management - 經理人和主管應在開發與維護上支持合乎道德的管理方法 - Profession - 應提升專業的誠實與名譽,符合大眾利益 - Colleagues - 應公平支援同事 - Self - 在專業領域終身學習,並提倡合乎道德的方法 ## 軟體程序 ### 基本活動 - 規格制定 - 由客戶與工程師定義功能及運作限制 - 開發 - 設計與撰寫軟體 - 確認 - 必須確認是否符合客戶需求 - 演進 - 持續修訂符合客戶及市場的需求變化 ### 常見描述 - 產品 - 程序活動的產物 - e.g. 架構設計的產物為軟體架構模型 - 角色 - 反映相關人員的職責 - e.g. 專案經理、組態管理人員 - 前置和後續條件 - 程序活動執行或產品生產前後需為真的敘述 - e.g. 在架構設計前的前置條件為所有需求已經客戶核准 ### 常見分類 - 計畫驅動式 (plan-driven) 程序 - 所有活動經事先規劃 - 敏捷式程序 - 規劃為遞增式,較能反映現實變化 ### 軟體程序模型 :::info 😀 模組並不互斥,可一起使用 ::: - 瀑布式模型 (Waterfall Model) - 又稱軟體生命週期 - 將規格制訂、開發、確認、和演進等幾個基本的程序活動,表示成各個分開獨立的程序階段 - 增量式開發 (Incremental Development) - 讓規格制定、開發、確認等活動交互進行,系統開發成一連串的增量模組 - 每個版本都是前一版的基礎來增添 - 再利用導向式軟體工程 (Reuse-oriented Software Engineer) - 以現有的可重複原件為基礎 #### 瀑布式模型 :::success **✅ 優點** - 每個階段都會產生文件 - 經理可對照開發計畫掌控進度 ::: :::danger **❌ 缺點** - 將專案分割成相互分離的階段,使專案開發失去彈性 - 早期階段需凍結一些成果 - 當回應一直變動的客戶需求會有困難 ::: - 簡述 - 下一階段許等前一階段完成才可執行 - 時常可能重疊,並互相提供資訊 - e.g. 設計階段發現需求問題 - e.g. 程式撰寫發現設計問題 - 階段性的互相回饋 - 階段 - 需求分析與定義 - 定義系統服務、限制、目標,再詳細定義系統規格 - 系統與軟體設計 - 分割成硬體與軟體系統,建立整體系統架構 - 實作與單元測試 - 軟體實作成一組程式或程式單元 - 單元測試驗證是否符合制定規格 - 整合與系統測試 - 將獨立程式單元或程式整合 - 視完整系統進行測試 - 經測試後交付給客戶 - 運作與維護 - 最久的階段 - 檢查錯誤、改善系統單元的實作,針對新需求改進系統的服務 #### 增量式開發 :::success **✅ 優點** - 降低適應變動客戶需求所需成本 - 容易得到客戶對已開發成果的回應 - 快速交付和部署有用的部分軟體 ::: :::danger **❌ 缺點** - 程序較不透明化 - 結構新的增亮模組加入而越來越差 - 對大型系統且生命週期長的系統,以上問題會變得較為嚴重 ::: - 簡述 - 敏捷式方法的根本 - 初始版本 -> 聽取用戶意見 -> 修改 -> 重複 - 適用於大多數商業、電子商務、和個人系統 - 每個版本涵蓋客戶所需部分功能 #### 再利用導向式軟體工程 :::success **✅ 優點** - 減少實際開發的軟體數量 - 降低成本與風險 - 軟體通常可以比較快完成 ::: :::danger **❌ 缺點** - 需求上必須有些妥協 - 系統可能不符合使用者真正需求 - 可再利用元件的開發不受組織控制 - 元件新版本可能會對系統的演進造成困擾 ::: - 簡述 - 大部分專案會非正式重複使用到軟體 - 較與開發程序無關 - 近期較逐漸被廣泛使用 - 常見軟體元件會利用此程序 - 根據服務標準開發的Web 服務 - 開發成套件的物件集合 - 設定在某特定環境下使用的單機軟體系統 - 元件分析 - 具需求規格尋找符合所需元件 - 需求更改 - 找到元件所提供之資訊來分析系統需求,必要時進行修改 - 以再利用方式進行系統設計 - 設計或採用現有框架 - 開發與整合 - 開發無法購得軟體再進行整合 ### 程序活動 - 軟體程序是一連串**技術**、**合作**、**管理**交錯而成 - **目標**為**制定規格、設計、實作、測試系統** #### 規格制訂 - 可行性研究 - 評估目前技術是否可滿足需求 - 企業考量系統是否符合成本效益 - 研究應快速完成且不會花多少成本 - 需求抽取與分析 - 透過觀察與客戶討論,衍生出系統需求 - 需求規格制定 - 將前項過程收集到的資訊轉譯成需求定義的文件 - 文件可能包含使用者需求與系統需求 - 需求確認 - 檢查需求是否能具體實現 #### 軟體設計與實作 - 架構設計 - 找出系統整體架構、主元件、相互關係 - 介面設計 - 定義元件間的介面與規格 - 元件設計 - 設計元件如何運作及預期實做功能 - 資料庫設計 - 設計系統資料結構 ## 敏捷式軟體開發 ## 需求工程 ## 系統塑模 <style> /* Dark mode */ :root{ --white-text: #ddd; --white-gray-text: #bbb; --black-text: #333; --gray-text: #666; --navbar-background: #242424; --navbar-alt-background: #363636; --gray-background: #23272a; --darkblue-background: #40788A; --darkblue-alt-background: #2c5460; --link-text: #339fff; --link-hover-text: #2d6da4; } body, .ui-comment-container .ui-comments-container { background-color: var(--gray-background) !important; } a{ color: var(--link-text); } a:hover, a:active{ color: var(--link-hover-text); } .navbar-default, .navbar-default * label, .navbar-default * span, .ui-comment-container .ui-comment-header, .ui-comment-container .ui-comment-input-container{ background-color: var(--navbar-background); color: var(--white-text); border-color: var(--gray-text); } .modal-dialog * .modal-body{ background-color: var(--navbar-background) !important; color: var(--white-text) !important; } .ui-notification-label{ color: var(--white-text) !important; background-color: var(--darkblue-background); border-color: var(--darkblue-alt-background) !important; } .ui-notification-label:hover, .ui-notification-label:active, .ui-notification-label:focus{ background-color: var(--darkblue-alt-background); } .navbar-default .announcement-popover * , .modal-dialog * .modal-header, .modal-dialog * .modal-footer, .panel > .panel-heading, .panel-body{ background-color: var(--gray-background) !important; color: var(--white-text) !important; } .dropdown-menu, .dropdown-menu>li>a{ background-color: var(--gray-background) ; color: var(--white-text); } .markdown-body, .ui-toc-dropdown .nav > .active > a, .ui-comment-container .comment-blank-stats, .markdown-body h1 .octicon-link, .markdown-body h2 .octicon-link, .markdown-body h3 .octicon-link, .markdown-body h4 .octicon-link{ color: var(--white-text); } .ui-toc-dropdown .nav > .active > a:hover{ color: var(--gray-text); } .ui-lastchange, .ui-status-lastchange{ color: var(--white-gray-text); } .markdown-body > blockquote{ border-left: 0.25em solid #5882a7; color: var(--white-gray-text); } .markdown-body > table th, .markdown-body > table tr:nth-child(2n){ background-color: var(--navbar-background); } .markdown-body > table tr{ background-color: var(--navbar-alt-background); } .panel-body .markdown-body tr{ background-color: var(--navbar-background); border-color: var(--navbar-background); } .alert > blockquote{ border-left: 0.25em solid #ccc; } .ui-toc-dropdown { background-color: #23272A; border: 1px solid rgba(255,255,255,.15); box-shadow: 0 6px 12px rgba(255,255,255,.175); } /* Dark mode code block */ /* Imported from titangene/hackmd-dark-theme */ .markdown-body pre { background-color: #1e1e1e; border: 1px solid #555 !important; color: #dfdfdf; font-weight: 600; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { background: unset; } /* Dark mode alert boxes */ .alert-info { color: #f3fdff; background: #40788A; border-color: #2F7A95; } .alert-warning { color: #fffaf2; background: #936C36; border-color: #AE8443; } .alert-danger { color: #fff4f4; background: #834040; border-color: #8C2F2F } .alert-success { color: #F4FFF2; background-color: #436643; border-color: #358A28; } /* Stylized alert boxes */ .alert-warning>p::before, .alert-danger>p::before, .alert-info>p::before { white-space: pre; font-weight: bold; } </style> <style> /* * Visual Studio 2015 dark style * Author: Nicolas LLOBERA <nllobera@gmail.com> */ .hljs { display: block; overflow-x: auto; padding: 0.5em; background: #1E1E1E; color: #DCDCDC; } .hljs-keyword, .hljs-literal, .hljs-symbol, .hljs-name { color: #569CD6; } .hljs-link { color: #569CD6; text-decoration: underline; } .hljs-built_in, .hljs-type { color: #4EC9B0; } .hljs-number, .hljs-class { color: #B8D7A3; } .hljs-string, .hljs-meta-string { color: #D69D85; } .hljs-regexp, .hljs-template-tag { color: #9A5334; } .hljs-subst, .hljs-function, .hljs-title, .hljs-params, .hljs-formula { color: #DCDCDC; } .hljs-comment, .hljs-quote { color: #57A64A; font-style: italic; } .hljs-doctag { color: #608B4E; } .hljs-meta, .hljs-meta-keyword, .hljs-tag { color: #9B9B9B; } .hljs-variable, .hljs-template-variable { color: #BD63C5; } .hljs-attr, .hljs-attribute, .hljs-builtin-name { color: #9CDCFE; } .hljs-section { color: gold; } .hljs-emphasis { font-style: italic; } .hljs-strong { font-weight: bold; } .hljs-bullet, .hljs-selector-tag, .hljs-selector-id, .hljs-selector-class, .hljs-selector-attr, .hljs-selector-pseudo { color: #D7BA7D; } .hljs-addition { background-color: #144212; display: inline-block; width: 100%; } .hljs-deletion { background-color: #600; display: inline-block; width: 100%; } </style>