《人月神話》讀書筆記④:解決問題

十四、進度落後:禍起蕭牆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):產品設計-產品框架
驗證碼場景和形式

TAG:產品經理 | 互聯網產品 | 軟體工程 |