程式規格書(Program Specification Document)範本#
版本:1.0
參照標準:IEEE 1016-2009、ISO/IEC/IEEE 12207:2017、ISO/IEC 8631:1989
適用對象:系統分析師(SA)、開發工程師、委外/外包開發廠商
文件性質:單一程式/批次工作之詳細規格文件,作為程式撰寫與驗收的直接藍圖
📋 使用說明#
程式規格書是以「單一程式或批次工作」為撰寫單位的實作藍圖,將 TSD(技術規格文件)的模組/服務層級設計,進一步展開為可直接編碼的輸入輸出欄位、處理邏輯、畫面或報表版面與錯誤代碼。相較於 TSD 偏重物件導向的類別/方法設計,程式規格書更貼近傳統主機、批次、報表與轉檔程式的撰寫方式。
何時使用本範本#
- 批次程式(Batch Job):日結、月結、對帳、資料清算等排程程式
- 報表程式:產出固定版面報表、對外申報檔案
- 介面轉檔程式:與外部系統的檔案交換、資料匯入匯出
- 委外/外包開發:需要逐支程式驗收,規格必須避免「口頭補充」
- 任何需要精確定義輸入輸出欄位與處理邏輯、無法僅以 TSD 類別設計涵蓋的程式
與其他文件的關係#
SDD(如何設計整體架構) → TSD(模組/服務層級技術規格) → 程式規格書(單一程式的實作藍圖) → Source Code
↑ ↑ ↑ ↑
架構師 開發工程師 SA / 開發工程師 開發工程師
- TSD 定義模組內的類別、方法、演算法與資料結構,適合物件導向、微服務式的系統設計
- 程式規格書 則是「向下再展開一層」:把 TSD 的設計具體落實到單一程式的輸入來源、輸出目的、逐步處理邏輯與例外情境,讓程式撰寫者(含委外廠商)不需回頭詢問即可完成編碼
- 兩者可搭配使用:物件導向服務層級用 TSD;批次/報表/轉檔類程式或委外驗收則另補程式規格書
填寫原則#
- 輸入輸出明確:每個欄位都需標註型別、長度、必要性與驗證規則,不可只用文字概略描述
- 處理邏輯可執行:流程敘述與虛擬碼需精確到可直接轉換為程式碼,邏輯表示法建議依循 ISO/IEC 8631 的慣例(結構化流程圖/虛擬碼),避免撰寫者各自發明符號
- 正常與異常並重:正常流程之外,需完整列出所有已知的例外情境與對應處理、錯誤代碼
- 可獨立驗收:規格本身應足以作為驗收依據,尤其用於委外開發時
📄 範本正文#
[程式代號/程式名稱] 程式規格書#
1. 文件資訊#
| 項目 | 內容 |
|---|
| 文件編號 | PSD-[專案代碼]-[程式代碼]-[序號] |
| 版本 | v0.1 |
| 建立日期 | YYYY-MM-DD |
| 最後更新 | YYYY-MM-DD |
| 撰寫者 | [SA / 開發工程師姓名] |
| 審核者 | [技術主管 / 架構師] |
| 狀態 | 草稿 / 審查中 / 已核准 |
版本歷程#
| 版本 | 日期 | 修改人 | 修改內容摘要 |
|---|
| v0.1 | YYYY-MM-DD | [姓名] | 初版建立 |
關聯文件#
| 文件名稱 | 文件編號 | 版本 | 關聯性 |
|---|
| 技術規格文件(TSD) | TSD-XXX-001 | v1.0 | 所屬模組技術設計 |
| 系統設計文件(SDD) | SDD-XXX-001 | v1.0 | 系統架構來源 |
2. 程式基本資訊#
| 項目 | 內容 |
|---|
| 程式代號 | [如 BATCH-CUST-RECON-001] |
| 程式名稱 | [程式中文名稱] |
| 程式類型 | Online(線上)/ Batch(批次)/ Report(報表)/ Interface(介面轉檔) |
| 所屬系統/模組 | [系統名稱] |
| 觸發方式 | 排程(Cron)/ 人工執行 / 事件觸發 / API 呼叫 |
| 執行排程 | [如:每月最後一個工作日 02:00] |
| 前置程式 | [執行前必須先完成的程式代號,無則填「無」] |
| 後續程式 | [本程式完成後接續執行的程式代號,無則填「無」] |
| 預估工時 | [人天] |
3. 功能說明#
3.1 程式目的#
一句話說明本程式解決什麼問題、為何需要。
3.2 功能摘要#
- [功能 1 描述]
- [功能 2 描述]
- [功能 3 描述]
3.3 使用者/呼叫端#
| 呼叫來源 | 說明 |
|---|
| [排程系統 / 上游程式 / 使用者角色] | [呼叫情境說明] |
4. 輸入規格#
4.1 輸入來源#
| 來源類型 | 來源名稱 | 說明 |
|---|
| 資料表 | [TABLE_NAME] | [用途] |
| 檔案 | [檔名格式,如 CUST_YYYYMMDD.csv] | [來源系統、傳輸方式] |
| API / 訊息佇列 | [端點/Topic 名稱] | [呼叫方式] |
4.2 輸入欄位定義#
| 欄位名稱 | 型別 | 長度 | 必要 | 驗證規則 | 說明 |
|---|
| [FIELD_NAME] | VARCHAR/NUMERIC/DATE | [長度] | ✅/❌ | [規則] | [說明] |
5. 輸出規格#
5.1 輸出目的#
| 目的類型 | 目的名稱 | 說明 |
|---|
| 資料表 | [TABLE_NAME] | [用途] |
| 檔案 | [檔名格式] | [下游系統、傳輸方式] |
| 報表 | [報表名稱/編號] | [用途、送達對象] |
5.2 輸出欄位定義#
| 欄位名稱 | 型別 | 長度 | 來源/計算方式 | 說明 |
|---|
| [FIELD_NAME] | VARCHAR/NUMERIC/DATE | [長度] | [公式或來源欄位] | [說明] |
5.3 輸出檔案/報表格式範例#
[以固定寬度或分隔符號範例呈現實際輸出格式,供程式撰寫者比對]
6. 處理邏輯#
6.1 前置條件#
6.2 處理流程#
1. [步驟一:讀取輸入資料]
2. [步驟二:資料驗證]
└─ 驗證失敗 → [處理方式,如寫入例外檔]
3. [步驟三:核心運算/轉換邏輯]
4. [步驟四:寫入輸出]
5. [步驟五:異動稽核記錄]
6.3 虛擬碼(Pseudocode)#
依 ISO/IEC 8631 結構化虛擬碼慣例撰寫,需可直接轉換為程式碼。
function processProgram(inputRecords):
validRecords = []
errorRecords = []
for each record in inputRecords:
if not isValid(record):
errorRecords.append(record)
continue
transformed = applyBusinessRule(record)
validRecords.append(transformed)
writeOutput(validRecords)
if errorRecords is not empty:
writeErrorReport(errorRecords)
return { processedCount: len(validRecords), errorCount: len(errorRecords) }
6.4 業務規則與計算公式#
| 規則編號 | 規則描述 | 公式/邏輯 |
|---|
| BR-001 | [規則名稱] | [計算公式或條件邏輯] |
7. 畫面/報表版面配置#
若為 Online 程式,附畫面欄位配置圖;若為 Report 程式,附版面配置圖。無適用情境者填「不適用」。
8. 資料庫/檔案存取設計#
8.1 存取資料表清單#
| 資料表名稱 | 存取方式 | 說明 |
|---|
| [TABLE_NAME] | 讀取 / 寫入 / 更新 / 刪除 | [用途] |
8.2 主要查詢/處理邏輯摘要#
-- 摘要說明核心 SQL 邏輯,非完整程式碼
SELECT ...
FROM ...
WHERE ...
8.3 交易控制#
| 項目 | 說明 |
|---|
| 交易範圍 | [單筆 Commit / 批次 Commit,如每 1000 筆 Commit 一次] |
| 交易失敗處理 | [Rollback 策略] |
9. 錯誤處理與訊息代碼#
| 錯誤代碼 | 錯誤情境 | 處理方式 | 是否中斷程式 |
|---|
| [E-XXX] | [情境描述] | [記錄例外檔 / 通知 / 略過] | 是/否 |
10. 效能與作業排程考量#
| 項目 | 內容 |
|---|
| 預估資料量 | [如:日均 5 萬筆,月結尖峰 200 萬筆] |
| 執行時間限制 | [如:需於 03:00 前完成,避免影響營業時間] |
| Rerun / Restart 機制 | [是否支援斷點續跑、重複執行是否具冪等性] |
| 相依排程 | [與前後程式的排程相依關係] |
11. 測試要點#
11.1 測試案例摘要#
| 測試案例 ID | 測試場景 | 預期結果 |
|---|
| TC-001 | 正常資料處理 | 輸出筆數與輸入相符,無例外記錄 |
| TC-002 | 輸入含不合法資料 | 該筆寫入例外檔,其餘正常處理 |
| TC-003 | 輸入為空 | 程式正常結束,不產生輸出檔 |
11.2 邊界值與驗收標準#
- [邊界值情境,如:金額為 0、日期為月底、資料量為單一極大批次]
- 驗收標準:[如:連續 3 次執行結果一致、效能符合第 10 節限制]
12. 附錄#
12.1 呼叫關係圖#
12.2 特殊注意事項#
範例:客戶月結對帳批次程式(BATCH-CUST-RECON-001)#
程式基本資訊#
| 項目 | 內容 |
|---|
| 程式代號 | BATCH-CUST-RECON-001 |
| 程式名稱 | 客戶月結對帳批次程式 |
| 程式類型 | Batch |
| 觸發方式 | 排程(Cron) |
| 執行排程 | 每月最後一個工作日 02:00 |
| 前置程式 | BATCH-ORDER-CLOSE-001(訂單月結批次) |
| 後續程式 | RPT-CUST-STATEMENT-001(客戶對帳單報表) |
輸入欄位定義(節錄)#
| 欄位名稱 | 型別 | 長度 | 必要 | 驗證規則 | 說明 |
|---|
| CUSTOMER_ID | VARCHAR | 20 | ✅ | 需存在於 CUSTOMER 主檔 | 客戶編號 |
| ORDER_DATE | DATE | - | ✅ | 需介於結算月份區間 | 訂單日期 |
| TOTAL_AMOUNT | DECIMAL(15,2) | - | ✅ | ≥ 0 | 訂單金額 |
處理流程#
1. 讀取結算月份區間內的 CUSTOMER_ORDER 資料
2. 依 CUSTOMER_ID 分組加總 TOTAL_AMOUNT
3. 比對客戶帳戶餘額(CUSTOMER_BALANCE)
└─ 差異超過容許誤差(NT$1)→ 寫入差異明細表 RECON_EXCEPTION
4. 產出對帳結果至 CUSTOMER_RECON_RESULT
5. 寫入批次執行日誌(含處理筆數、差異筆數)
錯誤代碼(節錄)#
| 錯誤代碼 | 錯誤情境 | 處理方式 | 是否中斷程式 |
|---|
| E-RECON-001 | 客戶編號不存在於主檔 | 記錄至 RECON_EXCEPTION,繼續處理下一筆 | 否 |
| E-RECON-002 | 對帳金額差異超過容許誤差 | 記錄至 RECON_EXCEPTION,發送告警通知 | 否 |
| E-RECON-099 | 資料庫連線失敗 | 記錄錯誤日誌並中止程式,等待重跑 | 是 |
效能與作業排程考量#
| 項目 | 內容 |
|---|
| 預估資料量 | 月均 200 萬筆訂單資料 |
| 執行時間限制 | 需於 03:00 前完成,避免影響 03:30 報表批次 |
| Rerun 機制 | 具冪等性,可依結算月份重複執行且結果一致 |
📌 填寫提醒
- 程式規格書應由 SA 或資深開發工程師撰寫,技術主管審查後方可交付撰碼
- 輸入輸出欄位定義須與實際資料表/檔案結構一致,避免與 TSD、SDD 內容衝突
- 委外開發時,本文件為驗收依據,內容須完整、不可有「口頭補充」的隱含規則
- 處理邏輯章節的虛擬碼須可直接轉換為程式碼,避免僅有文字概述
- 程式異動時應同步更新本文件,保持與實際程式邏輯一致