《人月神話》讀書筆記④:解決問題
十四、進度落後:禍起蕭牆Hatching a Catastrophe
- 如果在活動開始之前就著手估計,並且兩周進行一次修訂;那麼無論如何它都不會有太大變化
- 活動期間對時間長短的過高估計會隨著活動的進行持續而下降
- 人們總是會過低估計活動進行中不會太大變化,直到結束日期前三周
- 減少角色衝突:老闆不要對經理可以解決的問題做出反應,並且不在某些檢查狀態時做任何安排
十五、文檔:另外一面The Other Face
- 使用程序:對程序進行描述的文字
1、目的:主要功能是什麼?開發原因
2、環境:程序運行在什麼樣的機器、硬體配置和操作系統上
3、範圍:輸入的有效範圍是什麼?允許顯示的合法輸出範圍是什麼?
4、實現功能和使用的演算法:精確闡述它做了什麼
5、「輸入-輸出」格式
6、操作指令:包括控制台及輸出內容中正常和異常結束的行為
7、選項:用戶的功能選項有哪些?如何在選項之間進行挑選?
8、運行時間:在指定的配置下,解決待定規模問題所需時間
9、精度和校驗:期望結果的精確程度
- 驗證程序:即測試用例。包括:常規數據測試,對程序主要功能的用例;合法數據測試,用於檢測輸入數據範圍邊界內的可靠性,確保最大可能值、最小可能值和其他有效特殊數據可以工作;非法數據測試,在邊界外檢查數據範圍邊界進行檢查
- 修改程序:調整/修復程序的所有細節。包括:流程圖;對所用演算法的完整描述(或類似演算法的參考資料);對所有文件規劃的解釋;數據流處理的概要描述;初始設計中,對修改的討論
- 流程圖:顯示程序的流程判斷結構,但不一定是必要的
- 自文檔化的程序:即把文檔整合到源程序
1、藉助標籤、聲明語句和符號名稱,儘可能表達文檔信息
2、儘可能用空格和一致格式提高程序可讀性,表現從屬和嵌套關係
3、以段落注釋的形式,向程序中插入必要的記敘性文字
4、為每次運行使用的任務名稱,且維護一份記錄了時間和結果的日誌
5、使用包含版本號和能幫助記憶的程序名稱
6、儘可能地為基本演算法提供參考引用
7、顯示和傳統演算法的關係:更改、定製細化、重新表達
8、聲明所有變數
9、用標籤標記出初始化位置
10、對程序語句進行分組和標記
11、利用縮進表現分組和結構
12、在程序列表中,手動添加邏輯箭頭
13、使用行注釋和標記不清楚的事物
14、適當拆分/合併語句
十六、軟體工程中的根本和次要問題:沒有銀彈No Silver Bullet——Essence and Accident in Software Engineering
- 根本任務:打造構成抽象軟體實體的複雜概念結構
- 次要人物:使用編程語言表達這些抽象實體,在空間和時間限制下將它們映射成機器語言
- 在獲取和制定軟體需求時,將快速原型開發作為迭代計劃的一部分
- 有機地更新軟體,隨著系統的運行、使用和測試,逐漸增加功能
- 軟體系統中的內在特性:複雜度、一致性、可變性和不可見性
- 解決次要問題的一些突破:高級語言、分時、統一編程環境
- 潛在銀彈①:高級編程語言
- 潛在銀彈②:面向對象編程,包括抽象數據類型和層次化類型(後者簡稱類)
- 潛在銀彈③:人工智慧和專家系統,接受輸入的數據和假設、通過基礎規則推導邏輯結果,提出結論和建議
- 潛在銀彈④:「自動」編程
- 潛在銀彈⑤:圖形化編程,這一源於晶元設計的方法對晶元更為適合;因為晶元設計是對二維對象的層次設計,幾何特性反映了本職,但軟體系統不是
- 潛在銀彈⑥:程序驗證,在源代碼階段就消除bug
- 潛在銀彈⑦:環境和工具
- 生產率公式:任務時間=頻率1*時間1+頻率2*時間2+頻率3*時間3……
- 購買和自行開發:構建軟體最可能的徹底解決方案就是不開發任務軟體,購買比重新開發更低廉
- 需求精鍊和快速原型:用原型演示待開發系統的主要功能
- 增量開發:增長、而非搭建系統。逐步發育成熟,不奢求一次性搭建
- 卓越的設計人員:提高軟體行業的核心
以上內容為《人月神話》(作者:[美]小弗雷德里克·布魯克斯)的第14-16章讀書筆記及部分摘要,本人加入一定量自己的理解;因水平有限,歡迎大家交流指正,謝謝~
另:《人月神話》是比較偏技術側的書籍,翻譯過來有點佶屈聱牙,我這裡更多只是列了提綱,大家有機會自己去看、可以有更多收穫~
推薦閱讀:
※<產品篇>做好互聯網產品的獎勵機制之顯性獎勵·二
※快餐用戶與正餐用戶
※寫給部門管理者的諫言:你敢了解你的員工嗎?
※課程篇(9):產品設計-產品框架
※驗證碼場景和形式