# CS3025 軟體工程 Software Engineering Textbook: Sommerville, I. *Software Engineering*. Pearson Education Limited. Instructor: 俞光回 David Kuang-Hui ###### tags: `TaiwanTech`, `CS` ## Chapter 1 Introduction * 只有三分之一的軟體專案是成功的 * 硬體故障曲線:浴缸曲線 * 初期故障率高,因還在進行 * 末期故障率也高,因老舊惡化不穩定 * 軟體故障曲線 * 理想 * 初期開發不穩定,故障率高 * 後穩定故障率低(無硬體損耗問題) * 實際 * 故障率到底部後後期仍會緩緩上升 * 設計變更 * 系統複雜度 * 沒有使用適當軟體工程方法 * 歷史 * 1968會議提出「軟體危機」:個別方法無法擴展到大型專案上使用 * 1970~1980新軟體方法:結構化程式、資訊隱藏、物件導向 * 1968北約軟體工程會議:棄用goto * 1990 物件導向、Java * 2000 整合是開發環境 * 2010 網路系統與軟體即服務 * 計算機科學是理論,軟體工程是實務 * 系統工程是複雜系統開發,軟體工程是其中一部 * 軟體開發成本中人力佔60%,測試成本佔40%,客製化成本超過開發成本 * 軟體產品 * 通用產品(套裝軟體) * 客製系統 * 軟體產品必須屬性 * 可行性 * 獨立與安全性 * 效率 * 維護性 * activities of software * 規格 * 發展 * 驗證 * 演進 * issues * Heterogeneity * Business and Social Change * Security and trust * Scale * 重複利用是現代趨勢 ## Chapter 2 Software Process * 軟體開發流程模型 * 計畫驅動的流程: 一切規劃與細節都預先規劃 * 瀑布 waterfall: 流程一路衝下去(理論上,實際上每個案子都會回到前面的流程) 1. 需求定義(分功能需求與非功能需求) 2. 系統與軟體定義(需求可行性、矛盾分析) 3. 實作與模組測試 4. 整合與系統測試 5. 運轉與維護 * 適用客戶穩定性高 * 含硬體生產成本較為合用 * 對軟體必要性沒那麼高 * 嵌入式系統、關鍵系統 * 敏捷流程: 增量式開發 * Incremental development * 與客戶的互動更快 * 提早交付部分功能 * 整體進度不明 * 整合建構模式 * 軟體專案常見反覆利用(COTS商用現貨系統) * 重新建構現有資源使其符合客戶需求 * 2000年後已相當廣泛 * 某些情況會需要請客戶變更需求 * 減少開發數量 * 需求誘導分析 * interview * 清楚目的 * 5W: * 規格不清楚要問到底 * 相關人員群組會議 * 行政作業觀察 * 需求規格 * 產品元件數量 * 介面 * 需求驗證 * 可行性一致性完整性 * operational concept, use case * 需求功能(函式架構、處理流程)、品質屬性 * 確認矛盾 * 系統需求與用戶需求 * 把想法化成量化 * 安全性 * 系統需求在乎使用的工具 * 使用者觀點與開發者觀點 * 設計活動 * 架構設計 * 資料庫設計:資料流管理 * 介面設計:模組與模組的互動 * 元件(選擇與)設計:(reused系統)物件導向 * 系統實作(開發) * 沒有標準流程 * coding standard * 除錯(設計師個人的debug) * 系統測試 * Verification and validation 確認與驗證 * 交互review coding standard * test case * 步驟 * 元件:可能使用自動化測試工具進行 * 系統整合 * 驗收測試:使用客戶提供資料測試,而非工程模擬資料 * 軟體具有更彈性的演化 * 開發完仍可能要進行維護 * 可能導致rework成本增加 * 降低rework成本的方式 * 預留彈性、容忍變更 * 小部分開發、小部分交付(增量式開發) * Prototype * 流程、描述、psudocode * 針對較難描述者 * 僅為釐清需求 * 不做為下一步發展雛形 * 通常無(技術規格)文件記錄 * 可能跟不上時代 * 沒有安全性 * 增量交付 * 敏捷式開發 * 不適合用在汰舊換新 * 流程度量目標是改善流程 * 度量指標不要與人有關 * SEI capability maturity level * 美國工程協會設立的評級 ## Chapter 4 * 系統需求是一份結構化文件 ## Chapter 5 * 模型:忽略系統實作的抽象 * UML * Activity diagram * Use case diagram * Sequence diagram: 使用者與系統或系統與系統間的傳遞資訊 * 使用箭頭表示因果 * 框起Alt表示分支 * Class diagram: 顯示系統類別與類別間關係 * 物件導向系統模型 * 聚合:一個物件可以由其他物件組合形成 * State diagram: 系統對內外部事件的狀態改變 * 實心圓:起點 * 實心圓加一環:終點 * 圓角矩形:活動流程 * 系統邊界 * 受不同文化影響 * 組織標準與工程師個人偏好的平衡要求 * 互動模式 * 系統與系統間的互動以模型呈現 * Use case * 需求引導的一環 * 後併入UML系統 * Behavioral models * data-driven * Model-driven engineering (MDE) 模式驅動 * 軟體開發方法 * 輸出不是程式,是模式,再由模式自動產生程式碼 * 支持者認為提升軟體工程抽象層級 * 處於早期研究階段(處於研究階段n年了) * 不必關心較低階層設計細節 * 可能降低成本 * 不一定適合實作(30年前就在做,不算很成功) * UML為基礎來描摹系統 * Type * CIM 計算獨立模式 * 描述領域抽象概念 * 開發不同CIM,反應系統的不同觀點 * 保全CIM(注重安全)、患者紀錄CIM(病歷、就診資料) * PIM 平台獨立模型 * 用UML描述顯示系統靜態結構與內外部事件 * PSM 平台特定模型 * 針對特定平台的模型 * 具有平台細節 * 第一級PSM: 中間特定層 * MDA轉換 * 由軟體工具定義與套用 * 自動轉換的最後一層PSM將產生可運行程式碼 * 自動化的困難來自連接CIM * PIM to PSM * 技術問題 * PIMS, Java2EE轉譯器 * 多平台程式要有多個PSM(轉譯,自動產生) * w/ Agile * MDA支援增量開發(學理) * 大量前期塑模與敏捷式開發矛盾(實務) * 如果真能大量生成程式碼,**原則上**可以用於敏捷 * MDA的採用 * 需要專門工具支援才能轉換層級 * 訓練人才效益 * 促進討論軟體設計 ## Ch6 架構設計 * 架構確定一組可以相互溝通的元件 * 抽象層級 * 小型:軟體內部架構 * 大型:複合系統架構 * 優勢 * 溝通 * 分析 * 大規模重用 * 表現方式 * 非正式方塊圖 * 最常用的方式 * 缺乏語意、沒有顯示組件性質系統屬性 * 主要是畫圖的功力 * 元件 * box * line * 架構模式使用 * 與業界矛盾 * 方式一:輔助系統設計討論 * 與相關關鍵人員討論 * 針對關鍵討論,忽略無關抽象部分 * 方式二:將設計紀錄為文件 * 留下可以變成code的資料 * 兩種方式差異很大 * 架構決策 * 架構設計是一種創造性流程 * 滿足系統功能與非功能需求 * 好的系統架構師根據客戶需求做出決策而非創造活動 * 有些共同決策跨越整個設計過程 * 系統架構師應考量到 * 現有通用應用程式架構作為模板 * 考量硬體做出分散的設計 * 可使用的架構模式與樣式 * 構建系統的基本方法 * 控制系統中元件操作 * 將系統元件分解為子元件 * 最適合交付系統非功能性需求 * 非功能性需求的架構要求 * 效能:實作關鍵功能與最小通訊 * 保全:關鍵資產給予額外層 * 安全:實作安全關鍵特點 * 可用:冗餘與容錯 * 維護:分解獨立元件、資料分離 * 軟體架構的觀點 * 由邏輯流程表達 * 由程式組合表達 * 由開發的個體為單位表達:開發工程師 * 由系統硬體分散在系統中表達:部署工程師 * 2006: 主要是以非正式的輔助來用 * 論文作者認為應該要普及到所有系統 * 課本作者認為應該要在物件導向中使用 * ADL: 更專業的架構語言 * 太專業而難懂 * 架構模式 * 表現分享與重用知識的方法 * pipe and filter patten * 運作的模型 * 適用互動有限的批次處理系統/嵌入式系統 * 資料處理應用程式 ## 業界專案實例:轉爐自動化電腦SRS * 版本歷史,從第一版開始 * 目錄 * 功能規格 * 關係圖 * 功能 * 系統測試要求 * 說明簡寫 * 參考文件 * 功能規格書對外,程式規格對內 ## 設計與實作 * 設計需求 --> 功能架構 --> 軟體元件 --> 交互介面 * Class Diagram Object * a messaging system on a mobile (cell) phone or tablet * 聯絡人 * message * send() * receive() * ack() * a printer for a personal computer * buffer * setting * 單雙面 * 黑白彩色 * 紙張大小 * load() * scan() * print() * a personal music system * library * playlist * current_play * volume * play() * pause() * next() * previous() * addtoplaylist() * remove......() * random() * volumeup() * volumedown() * a bank account * name * password * 餘額 * login() * withdraw() * deposit() * balance() * trascation() * a library catalogue * database * tag * hash * search() * overload 各種不同搜尋方法 * add() * remove() * reuse * IDE * open source dev * linux * 開發方式 * 採用開源元件開發 * 採用開源開發 * 收入來自販賣支援服務 * 使軟體開發便宜快速 * 獲得特定用戶青睞 * 不表示著作權表示 * 著作權歸屬? * 授權繼承 * GPL: 使用後依同等方式公開 * LGPL: 使用可不公開 * BSE: 任意使用修改 ## 軟體測試 * 測試驅動軟體開發 * 先做測試計畫再開發 * 發行測試 * 使用者測試 * 測試佔40% * TDD * 敏捷式開發流程的一部分 * 先設計增量式模組,然後做出測試程式,在反推回程式碼應如何撰寫 * 每個部份的程式碼幾乎都可被測試涵蓋到 * 一邊建立系統文件 * 發行測試 * 開發團隊不負責發行測試,由使用者進行 * 確認使用者需求
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up