《人月神話》讀書筆記

前言

《人月神話》是一本永不過時的經典,盡管寫在四十多年前,然而書中的觀點和方法論,放到如今的軟件開發中仍然適用,甚至有一些可以作為今后軟件開發的指導。筆者拜讀完《人月神話》這本軟件開發屆的神品之作,不禁感慨其思想博大精深,字字真言,精讀之有不盡的趣味,因此作讀書筆記一篇,記錄引起筆者共鳴的佳句與筆者的思考。


焦油坑

編程為什么有趣?作為回報,它的從業者期望得到什么樣的快樂
首先,這種快樂是一種創建事物的純粹快樂。如同小孩在玩泥巴時感到快樂一樣,成年人喜歡創建事物,特別是自己進行設計。我想這種快樂是上帝創造世界的折射,一種呈現在每片獨特的、嶄新的樹葉和雪花上的喜悅。
......
編程的快樂在于它不僅滿足了我們內心對于創造的渴望,而且還喚醒了每個人內心的情感。

相信絕大多數同學在高考結束后,填報志愿時都有糾結過專業的選擇。今后要做什么工作,從事什么行業,筆者在茫茫專業中選擇了軟件工程,當時覺得軟件開發是一件相當具有創造性的活動,能夠通過編程把腦海中的想法加以實現,能夠通過編程解決生活中的實際問題,能夠通過編程完善一些APP的功能......

經過大學期間緊湊的軟件開發技術訓練,以及課外項目實踐,筆者編程能力和軟件開發能力有了一定的提升,而自己對軟件開發的樂趣也發生了一些變化,不再滿足于單純的創造帶給筆者的樂趣,屏幕上輸出的“Hello, world!”已經不能讓筆者眼前一亮,而是追求將高復雜度的模塊組件拼裝在一起,形成完整的系統。例如在某次課程作業中,為了滿足多種非功能需求,需要對整體系統進行詳細的架構設計,并應用多種未接觸過的技術和框架,盡管開發過程充滿了挑戰,bug頻出,接口易變,但是在克服完重重障礙后,得到一個高可用、高性能的完整系統,完成時的成就感是無可比擬的。

本科畢業階段,筆者以實習生的身份加入到騰訊公司,參加企業級別的真實系統開發,體驗到真實生產環境與學校內實驗環境的巨大差別,企業團隊的規模往往比學校課程作業團隊的規模大的多,10-15人的規模較為常見,這種情況下進行軟件開發的流程與小規模團隊大相徑庭,首先團隊需要頻繁的進行會議交流,確定開發進度、商討下階段開發計劃、解決問題沖突等等,因此分配給系統計劃和設計的時間大大增加了,此外還需要協同編寫各種文檔和說明,用于規范需求、架構、接口等,雖然系統開發的復雜度高出了幾個數量級,但是規范化后的團隊合作給筆者帶來了莫大的樂趣,團隊中每個人都在制作零件,并根據嚴謹的接口定義,將這些零件有效地嚙合在一起,所有的零件都以精妙的方式運行著,構成了企業級的真實系統,這種高度規范化的團隊合作使筆者樂在其中。


人月神話

所有的編程人員都是樂觀主義者: "一切都將運行良好"。
由于編程人員通過純粹的思維活動來開發,我們期待在實現過程中不會遇到困難,但是我們的構思本身是有缺陷的,因此總會有bug。

對于編程人員的樂觀主義,筆者深有體會。在完成課程作業時,經常會出現這么一個現象: 在只有大體思路,而沒有做出清晰詳細的設計方案時,就開始盲目的編程,寫一段看一段,再進行大量的調試,得到最終方案,然而耗費的時間總是遠遠超過預計。因此筆者認為,不論是設計課程作業這種規模較小的程序,還是參與企業級開發的大規模程序,編程前的精細設計都是必須的,并且需要摒棄"一切都將運行良好"這種過于樂觀的觀念,并為編程后的測試工作預留充足的時間,不論是單元測試、集成測試還是系統測試。


貫徹執行

手冊或者是書面規格說明,是一個非常必要的工具,僅有文檔是不夠的。手冊是產品的外部規格說明,它描述和規定了用戶所見的每一個細節;同樣地,它也是結構師主要的工作產物。
修改的階段話是很重要的 -- 在進度表上應該有帶日期的版本信息。
手冊的作者必須注意到自己的思路和語言,達到所需要的精確程度。

實習期間,編寫文檔和手冊的時間不亞于編寫代碼的時間。不同開發階段,不同職責的開發人員需要編寫不同的文檔手冊,并作為團隊開發的標準。筆者作為基礎的編程開發成員,參與了下表中的 3. 和 4. 文檔手冊的編寫,在需要與他人模塊交互時,可以通過文檔手冊快速明確交互的方法和各種條件。

  1. 產品經理制訂出需求文檔
  2. 開發組長(1-2人)制作體系架構文檔,UI設計組制作原型
  3. 系統詳細設計,確定模塊功能,進行接口定義,形成詳細設計文檔
  4. 實際開發過程中,編程人員制作功能說明概要設計,詳細定義接口,例如接口輸入和輸出的格式和邊界條件、各種異常處理、各種情況的測試用例等
  5. 開發完成,測試組制定測試流程,生成測試報告和文檔
  6. 所有的文檔更新時,都需要明確標注,進行版本控制,版本兼容等

未雨綢繆

唯一不變的就是變化本身
為變更設計系統,為變更計劃組織架構
軟件維護主要包含對設計缺陷的修復,軟件變更通常包含了更多的新增功能

軟件發布的越久,用戶越多,用戶提出的新需求也就更多,因此系統應當具備易拓展的特性。因此,在初始設計整個系統時,就應當把易擴展列入考慮范圍內。

  1. 體系架構設計,比如設計網站架構時,針對100人同時在線的網站,可能無法處理10000人同時在線訪問,那設計時應當如何進行負載均衡和集群設計
  2. 數據訪問設計,當前的數據庫可以做到讀取KB-MB級別的數據,用戶多了數據也多了,如何快速擴展成可以處理PB級別的數據
  3. 模塊設計,Release Reuse Equivalency Principle (重用發布等價原則)和The Common ClosurePrinciple(共同封閉原則)作為面向對象開發中模塊開發的重要原則,可以有效地將包組織成易擴展的形式
  4. 類設計,Single Responsibility Principle(單一職責原則)和The Open-Closed Principle (開閉原則)作為面向對象開發中類開發的重要原則,可以有效地將代碼組織成易擴展的形式

沒有銀彈

人工智能AI-2:使用啟發式或基于規則的特定編程技術。在這種方法中,對人類專家進行了研究,判斷他們解決方法的啟發性思維或者經驗法則,程序被設計成以人類解決問題的方式來運行......

專家系統是人工智能領域最先進的、被最廣泛使用的部分,是包含歸納推納引擎和規則基礎的程序,它接收輸入數據和假設條件,通過從基礎規則推導邏輯結果,提出結論和建議。

人工智能領域近幾年又重回人們的視角,人工智能里許多方法的確能很大程度的提升軟件開發的效率,然而其是否能夠泛化成一套解決軟件開發問題的系統,還值得商榷。不過機器學習中,不少算法正朝著人工智能AI-2中的定義發展,筆者認為最具特色的是Neural Networks(神經網絡),神經網絡模仿了人類大腦的神經元的工作方式,以人類解決問題的方式來處理各種復雜的非線性問題。

基于最初始的ANN,機器學習領域的研究者們不斷優化神經網絡,開發了卷積神經網絡(CNN)、循環神經網絡(RNN)、R-CNN等一些高級的深度學習模型,并且可以運用于計算機視覺、自然語言處理等等領域中,目前還有很大的提升空間,即使人工智能不能成為解決軟件開發問題的銀彈,但其在提升效率方面做出了很大貢獻,值得我們在這方面繼續深入。


總結

《人月神話》涉及廣泛,筆者只摘取了某些章節中引起共鳴的語句,實在是一本值得不斷回味的經典之作。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 推薦理由: 作為一部在軟件領域40年暢銷不衰的傳奇經典,很少能有像《人月神話》一樣具有深遠影響力和暢銷不衰的著作。...
    Summery閱讀 3,921評論 1 4
  • 人月神話讀書筆記 焦油坑 為什么兩個人的創業團隊可以超越大公司9倍以上的效率開發任何程序。而大公司的產業化團隊效率...
    陳浩要安靜閱讀 18,476評論 3 34
  • 看了宋老師今天的蛻變指引,有兩句話對我很有觸動,同時我也有同感: 因為苦過,所以能苦別人的苦。 因為受過傷,所以能...
    靜心_安心閱讀 133評論 0 1
  • “你是不是把吃飯前都省下來理財了?”自從我開始學習理財,我父母就抱著一種超級警惕的態度——我們家的白菜不僅...
    Tsingtao蛋蛋閱讀 862評論 6 3