---
# System prepended metadata

title: CS3025 軟體工程 Software Engineering
tags: [CS, TaiwanTech]

---

# 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
  * 敏捷式開發流程的一部分
  * 先設計增量式模組，然後做出測試程式，在反推回程式碼應如何撰寫
  * 每個部份的程式碼幾乎都可被測試涵蓋到
  * 一邊建立系統文件
* 發行測試
  * 開發團隊不負責發行測試，由使用者進行
  * 確認使用者需求
