---
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>