---
# System prepended metadata

title: 人月神話：Chapter 13-16
tags: [讀書會筆記]

---

###### tags: `讀書會筆記`
# 人月神話：Chapter 13-16

# Chapter 13 化整為零(如何除錯)
* **避免發生錯誤的設計方式**
    1. 做好定義以防止誤解：包含定義清楚產品（詳細的功能定義、詳細的規格說明、規範良妤的防錯設施與錯誤處理技術），以達概念整體性
    2. 規格審查：類似我們的BA 文件的確認
    3. 由上而下的設計方式：持續細分精製的步驟（refinement steps)，由大到小的去細緻展開，以達到模組化，過程中可能會前前後後的不斷梳理。（有點像龍捲風思考模式？
    4. 結構化的程式設計 

* **組件除錯**
    1. 上機除錯：實際上真的直接執行測試（必須細節規劃除錯程式）
    2. 記憶體傾印：儘量縮短個人佔用電腦的時間
    3. 記憶體即時擷取（選擇性傾印）
    4. 交談式除錯：使用監督程式，分配不同程式在電腦記憶體上執行（分時除錯）
    5. 測試案例

=>**現行作法應該已經不太類似上述提到的過程，因為電腦資源不如以前稀少。但某些概念仍適用，比如細節規劃除錯程式（log要長在哪）和測試案例的撰寫。**

* **系統除錯**
    1. 使用除錯完成的組件：嘗試整合or讓組件彼此互測（較粗糙），但可以少掉建立測試鷹架的時間。不要累積一堆錯誤之後才解決。
    2. 建立充分的測試鷹架：dummy or miniature file (類似pytest?)，甚至有輔助程式分析
    3. 控制改變
    4. 一次只整合一個組件（上線前）
    5. 固定改版（上線後）
    
=> **現行的做法中，我們好像很難針對系統做除錯，通常都是看到跑DevOp的流程失敗，慢慢找log再去問DE，而DE是否有辦法有效監控？還是他們用什麼方式監控呢？我們是否也能自己看？是否有任何系統除錯的方式發想?**


# Chapter 14 釀成大災難(專案延宕怎麼辦)
* **明確的里程碑才不會讓人無所適從**
eg., 明確的里程碑如下
「規格文件已被架構設計師和實作人員簽署」、
「程式碼已全部完成、打完孔，並且已存入了硬碟中的程式庫」、「除錯完成的版本通過了全部的測試案」

* **無形的幹勁**
    1. 激發成員解決問題的鬥志 -> 是否可以讓技術人員知道問題的嚴重性，甚至是激發他們思考問題嚴重性？
    2. PERT chart or critical-path scheduling (確認可以有一點點延誤的點和不能被延誤的點是什麼）-> 可以知道Task之間的相依性
https://ithelp.ithome.com.tw/articles/10212208

* **順利的表象之下？(高階主管如何掌握專案狀態)**
    1. 基層主管需掌握小組落後的狀態，並處理
    2. 老闆須知道未如計畫進行的意外和計劃執行狀況。若要避免老闆無法得知意外與計劃：
        1. 降低角色衝突 （不要干涉部署自己有能力處理的問題，也不在了解階段就馬上處理問題）
        2. 定期審查（里程碑的執行狀態）-> 規劃和預估的日期都可以寫出來
        
=>議題討論：
**1. 是否需要計劃監控小組？
2. 大家都會怎麼激勵自己的小組呢？
3. 大家的里程碑都會怎麼訂?**

# Chapter 15 一體兩面(如何文件化與其重要性)

* **文件必備：**(可以思考看看專案文件是否時常包含這些內容)
    1. 概觀性的描述 (overview）
    2. 目的
    3. 環境：程式要在哪種機器上跑？硬體和作業系統的組態該如何設定？
    4. 輪入值域與輸出值域：程式輸人與輸出資料的合理範圍為何？
    5. 欲達成的功能與使用的演算法：很精確地說出程式到底要做什麼事情？
    6. 輸出入格式：要精確而完整地描述
    7. 執行過程中的指示
    8. 選項使用者在功能上有哪些選擇彈性？這些選項該如何正確地加以指定？
    9. 執行時間
    10. 輸出結果的精準度跟檢驗方式

* **測試文件**
    1. 主案例
    2. 罕見的合法案例（合理邊界值）
    3. 罕見的不合法案例（不合理的邊界值是否有辦法處理）

* **修改紀錄文件**
    1. 流程圖或副程式的結構圖
    2. 演算法的完整描述
    3. 所有運用到的檔案的一份設計說明 
    4. 解譯階段結構（pass structure）的概觀：從硬碟中載入資料的程序紀錄
    5. 與修改相關的研討紀錄，包括原設計構想、可插入點 （hooks)與離開點 （exits）的類型與位置，以及原設計者對一些可能的變化所做的推論與提供的因應之道。對於一些修改上的潛在陷阱，他的評論是具參考價值的。
    
**=> 解譯階段結構（pass structure）的概觀好像比較偏DE在紀錄？我們是否需要獲得這樣的資訊？要如何才能快速獲得這樣的資訊？**

    

* **流程圖or 程式架構圖**
（非必要，但若無，會需要自我說明程式）

* **自我說明程式**
    1. 程式跟說明融合
    2. 利用coding style 來協助閱讀
    3. 為每次的執行 都取一個獨立的工作名稱，並以此名稱來維護用以記載目的、時間、結果的執行紀錄。
    4. 易記的程式名稱。名稱中包含版本的識別碼
    5. 以一般口語化的叙述方式為此程序 (PROCEDURE）加上註解。
    6. 記錄程式中所使用的演算法可供參考的文獻。
    7. 指出程式與文獻中所記載的演算法之間的關係：
        a. 改變 b. 使用上的特例 c. 代表性的做法
    8. 宣告所有的變數，並使用易記的名稱，以註解來對所宣告（DECLARE）的變數做更進一步的解釋。
    9. 以標籤來標明一個區塊的程式片段，表示出同屬一個演算法
    10. 以縮排來突顯結構與分段

=>議題討論：
**1. 大家的測試文件通常都怎麼訂? 是否有建議的方式?**


# Chapter 16 沒有銀彈：軟體工程的本質性與附屬性工作

(這章重點少少的，感覺就是想說寫程式本質上有其困難性，所以想要有辦法解決大家的真正痛點(耗時耗腦)很難)

* 軟體工程本質上的困難點：
    * 複雜性
    * 配合性
    * 易變性
    * 隱匿性
* 嘗試過解決本質上問題但僅解決附屬性問題的方法：
    * 高階語言
    * 分時技術
    * 統一的軟體開發環境
* 尚未嘗試過解決本質上問題但作者認為僅解決附屬性問題的方法：
    * 其他高階語言
    * 物件導向程式設計
    * 人工智慧
    * 專家系統
    * 自動化程式設計（只是更高階的語言而已）
    * 圖形化程式設計
    * 軟體驗證
* 作者覺得有機會解決本質上問題的方法：
    * 外購軟體(利用各家新創公司的新技術)
    * 需求的提煉與快速原型製作(明確的需求)
    * 漸進式的開發(基於前人的肩膀來開發)
    * 偉大的工程師(如何吸引更厲害的工程師)

**=> 我們有什麼方式可以協助解決軟體工程上的本質問題？**

