1. 程式人生 > >溫故而知新,人月徒傷悲

溫故而知新,人月徒傷悲

前言:“扒一扒你遇到過最NB的開發專案”,看到CSDN上舉行這個活動,就迫不及待的趕緊點進去看看到底是什麼玩意er,一不小心看到了《人月神話》的試讀活動,內心有兩個聲音就悄悄鑽了出來:一個有點怨言,一個有點激動。所謂怨言,就是活動姍姍來遲,如果《人月神話》能夠早一點讓我一睹芳容,而不是在苦苦尋找後相見恨晚該多好;所謂激動,自然是“終於等到你,還好我沒錯過”(好像詞有點跑偏)。

溫故而知新

其實在CSND舉行這個活動之前,我已經認識了《人月神話》,那是在看Jeff的《高效能程式設計師修煉之道》一書後,強烈的感受到,作為一個程式設計師,我竟如此的孤陋寡聞,Jeff推薦的必讀書籍列表,我一本都沒有讀過。深深地自責後,我從京東上買下了《人月神話》和《軟體方法上冊》。對於《人月神話》,我的札記已經寫到了“

禍起蕭牆”一章,然而當我今天重新再讀“焦油坑”、“人月神話”兩個章節時,一種素不相識,卻又似曾相識的感覺”撲面而來“。

我所收集的書中,軟體工程書大都屬於精品,神品只有兩本,Brooks的這本就屬於神品之列”。我對“Dave wang”的代序之言由衷的表示贊成,所謂“書讀百遍其義自見”,有幸再次拜讀Brooks的書籍,我深感自豪。

程式設計師的苦與樂

我自認為,程式設計師很“悶騷”,當然我自己就是一個程式設計師,哈哈。不過我認為悶騷的含義應該是這樣的:
悶,代表我們很單純,我們通過程式設計,不斷地解決使用者的痛點,我們深陷於這種快樂而無法自拔,我們不願意花費精力在其他方面,唯有程式設計;騷,代表我們富有活力,一旦有事情激起我們的興趣,我們為之亢奮,不惜暴露我們的激情。

程式設計,Brooks稱之為焦油坑,這個讓我們苦苦掙扎,卻又充斥著苦惱,但又充滿著快樂的創造性活動。作為程式設計師,我們愛之深,責之切,我們經常抱怨加班、需求變更、外行的無厘頭要求,但是我們享受軟體釋出後的快樂,我們享受程式設計過程中的美好時光,我們享受使用者使用後的讚美。

那麼快樂來自於什麼呢?

  1. 創造事物的純粹快樂
  2. 開發對他人有用的東西

而那些苦惱又從何而來呢?

  1. 追求完美
  2. 他人設定目標、提供資源
  3. 專案完工了,她也該香消玉碎了

人月徒傷悲

在國內,有這樣一群領導:
- 他們要求產品應該在一個月、兩個月、半年內完成;
- 他們認為專案進度一旦拖延,立即增加人手就可以馬上解決問題;
- 開發能遇到什麼問題,產品優良他們並不看重,他們只在乎利益。
- ……

顯然,我們的領導迷信了人月的“神話”,對於這樣的神話,Brooks在書中論證了為什麼“Adding manpower to a late software project makes it later”,也就是說向進度落後的專案中增加人手,只會使進度更加落後。

Brooks舉了兩種型別的例子:
1. 無論對於哪一個母親,孕育一個孩子都需要10個月。
2. 割麥子的時候,人手多一些,顯然麥收會提早完成。

對於軟體開發領域的我們來說,人月徒傷悲的原因有哪一些呢?
- 開發團隊需要溝通,很少有專案是一個人來完成的,即使只有一個開發人員,也免不了和外界溝通,況且孤獨的開發者需要被鄙視,閉門造車會讓專案更容易失敗。
- 開發團隊的成員能力並不能確保完全同級,如果相互差距比較大的時候,溝通的成本就會越高。所謂木桶理論就是一個證明,決定木桶盛水的容量是由高度最低的那塊木板決定。

讓神話離我們遠去

我從一篇人月神話的讀者感言中瞭解到,為了能夠主動出擊,我們可以做一些改變:
1. 不再低估每一個產品的難度,保持警惕而不是“樂觀”會讓我們更從容。也就是說,在計劃每一個任務的時候,盡你所能,保持客觀冷靜。
2. 提前多幹一些。進度表上的時間與實際開發中的時間不可能步調一致,那麼很多人容易這樣想,反正今天的任務已經完成了,就算是有空閒時間,我也不再繼續了;更糟糕的是,今天的任務雖然沒有解決,但是明天的任務好像挺簡單的,今天就結束吧,明天再繼續。請拋棄這種可怕的想法吧,儘量提前多幹一些!!!
3. 在領導施壓下,請盡力堅持自己的進度安排。Brooks也說了:“在顧客的催促下,廚師選擇把火加大,不過結果常常是無法挽救的煎蛋—-一面已經焦了,而另一面還是生的”。

從華夏三方存管平臺對接中總結經驗

我們的“期貨交易平臺”要對接華夏的三方存管平臺,任務從今年4月份已經開始了,我曾經這樣和客戶講:“如果一切順利的話,我只需要一天半的時間就能對接完”。現在回想起來,我自己都情不自禁的笑了,我是有多欠!時至今日,兩個月就要過去了,正式環境上的介面對接還遲遲沒有疏通完成。

首先,樂觀主義害死人。說樂觀都有點牽強人意,我當時完全是一種盲目自大,當然我還給自己留了一點點餘地,“如果一切順利的話”。但是,現在回想起來,正應了Brooks那句話“他們所犯的第一個錯誤是假設一切都會進行得很順利

其次,“程式設計人員很少能控制工作環境和工作目標”,這兩個月的工作讓我深有體會,依賴別人,太過痛苦

在對接華夏介面的兩個月內,先是CFCA的keystore斷斷續續阻礙了三個星期的時間;

再者是華夏銀行的阻力:
1. 現在都2015年了,華夏提供的介面文件竟然是2011年做成的,最後我們要了一份2014年改版的。
2. 華夏提供的jar包有嚴重bug,他們的getter、setter方法有的是大寫,有的是小寫,導致轉換json字串時出現問題,最後只能是採用迂迴戰術解決。
3. 分行的對接人員垃圾的一塌糊塗,你還必須強顏歡笑,他們對業務的熟練程度還不如我。
4. 總行的一些人員推脫責任,早上說下午就可以了,下午說明天就可以了,尼瑪明天是星期六,他們不上班!
5. 華夏內部的稽核機制有太多NM,這個就不能太多透漏了。

再者,輕視測試。在完成程式碼編寫後,沒有程式碼評審、沒有單元測試、系統測試也不夠全面,這就會滋生很多顯而易見的bug,不過值得慶幸的是,我在正式上線前解決了這些問題。

完美與放棄

我個人在生活和工作中都有點追求完美,這一點在工作中表現的尤為突出:
我受夠了那些垃圾程式碼,從2014年2月接收專案,到如今,我對程式碼進行了不計其數的重構,舉個例子,我們使用的一個web管理系統最開始打完war包足足有48M,而現在只有17M,當然這還有點多。

而對於一些功能,我會選擇放棄,尤其是對於客戶那些”無理取鬧“的需求,我會通過各種手段讓他放棄自己的想法。

Brooks說了:”實際上,我認為,學習程式設計最困難的部分,是將做事的方式向追求完美的方向調整“,好吧,看到這點,我有點沾沾自喜了。

總結:《人員神話》不愧是一本”神品“,前兩個章節,我已經讀了不下十遍了,但每次都完,都覺得如沐春風,哈哈!最後,來看看文言版的”人月神話“:

問:今有程式設計師五人,需時日幾何?
答曰:一年。
問:吾急需之!若有十人,幾何?
答曰:兩年。
問:百人若何?
答:萬世。

相關推薦

故而傷悲

前言:“扒一扒你遇到過最NB的開發專案”,看到CSDN上舉行這個活動,就迫不及待的趕緊點進去看看到底是什麼玩意er,一不小心看到了《人月神話》的試讀活動,內心有兩個聲音就悄悄鑽了出來:一個有點怨言,一個有點激動。所謂怨言,就是活動姍姍來遲,如果《人月神話》能夠早

Android群英傳筆記——摘要概述的出發點故而能夠為師矣!

ram hide 基本 pretty 工具 log 透明 scroll 好的 Android群英傳筆記——摘要。概述,新的出發點,溫故而知新。能夠為師矣! 當工作的越久,就越感到力不從心了,基礎和理解才是最重要的,所以買了兩本書,醫生的《An

故而重溫 Java 7 的那些“”特性

2009 年 4 月 20 日,Java 的親生父親 Sun 被養父 Oracle 以 74 億美元收購,這在當時可是一件天大的事。有不少同學都擔心 Java 的前途,我當時傻不啦嘰地也很擔心:自己剛學會如何通過記事本編寫 Java 程式碼,然後通過 cmd 列印 Hello World 呢,這一下難道白學了

Mohican_2/4 連結裝載與庫 學習筆記— 故而 計算機硬體基本結構

第一章 計算機軟硬體基本結構 引言: 本章是對於計算機軟硬體的基本瞭解和回顧,包括大致如下內容: ü  CPU與外部件的連線 ü  計算機軟硬體層次結構 ü  SMP與多核 ü  作業系統,虛擬空間,物理空間 ü  多訊號 PV原語的理解 ü  對於執行緒和程序的理解,和

面試必談的雜湊.Net 程式設計師故而

 引言: 作為資深老鳥,有事沒事,出去面試;找準差距、定位價值。 面試必談雜湊, Q1:什麼是雜湊? Q2:雜湊為什麼快? Q3:你是怎麼理解雜湊演算法利用空間換取時間的? Q4:你是怎麼解決雜湊衝突的? Q5:你有實際用寫過雜湊演算法嗎? 1. 知識儲備   雜湊(也叫雜湊)

故而java事務

date操作 dst 語句 port 分割 數據庫引擎 再次 lec con 一、什麽是Java事務 通常的觀念認為,事務僅與數據庫相關。 事務必須服從ISO/IEC所制定的ACID原則。ACID是原子性(atomicity)、一致性(consistency

故而(java實現)單例模式的七種寫法

反序 防止 代碼 工作 html 我想 變種 evel 才會 第一種(懶漢,線程不安全): Java代碼 public class Singleton { private static Singleton instance; private S

C#故而——訪問修飾符

組合 protected 訪問修飾符 當前 net 程序 reference csharp internal C#包含四種訪問修飾符以及一種組合修飾符: public:訪問不受限制。 protected:訪問僅限於包含類或從包含類派生的類型。 internal:訪問僅限於當

故而-String類

true 一次 sci 能夠 start 匹配 第一個 pop substring String不算是一種類型,而算是一個類。就是說String不僅能夠表示string類型,另一些自帶的方法能夠調用。溫故而知新。如今給大家總結了String類應該註意的地方。 (1

故而---淺析三層架構(一個超簡單的系統登錄三層架構實例)

lda code windows comm 面向 box reader 業務 兩個 剛開始接觸三層架構是在快兩個月前,那時候找了好多例子感覺也都看不怎麽懂,今天閑著沒事,就把以前學的東西翻出來,算是溫習溫習。由於本人也接觸時間不長,所以以下言論有不正確之處,多多

【C# in depth 第三版】故而(1) (轉)

64位 icm stringbu 值傳遞 關於 ota 現在 函數變量 出發 聲明 本文歡迎轉載,原文地址:http://www.cnblogs.com/DjlNet/p/7192354.html 前言 關於這本書(《深入理解C# 第三版》)的詳細

Spring故而 - bean的裝配(續)

metadata test BE 狀態 放心 cati 如果 需要 efi 按條件裝配bean 就是當滿足特定的條件時Spring容器才創建Bean,Spring中通過@Conditional註解來實現條件化配置bean package com.sl.ioc; imp

Spring故而 – AOP代理

for 過程 orm machine create 輸出 scac finally mac AOP的概念 AOP:Aspect-Oriented Programming(面向切面編程),維基百科的解釋如下:Aspect是一種新的模塊化機制,用來描述分散在對象、類或者函數中的

Spring MVC故而 – 從零開始

resolve 它的 完成後 web框架 攔截器 加載 class lns 目錄 Spring MVC簡介 Spring MVC是一款基於MVC架構模式的輕量級Web框架,目的是將Web開發模塊化,對整體架構進行解耦。 Spring MVC有一下優點: 作為Spr

故而 js 的錯誤處理機制

HA 機制 dom 處理 process test web ucc 報錯 // 在函數塊的try中return,會直接成為函數的return值 function test() { try { alrt(123) return ‘su

故而之:IUS、IFS、IFFS

INDEX SCANIFS: 索引全掃描這裏要註意的一點就是不需要掃描所有branch的分支塊,因為葉子塊與葉子塊之間有雙向指針,所以找到最左邊的葉子塊,就可以依序掃描。所以這裏可以有 兩個結論:1 索引鍵值是排序的,不需要額外對索引鍵值再一次order 2 通常情況下依序讀取則是單塊讀,因為多塊離散讀,你

Spring MVC故而 – 參數綁定、轉發與重定向、異常處理、攔截器

單獨 UC exclude require 加載 pre buffered nts 節點 請求參數綁定 當用戶發送請求時,根據Spring MVC的請求處理流程,前端控制器會請求處理器映射器返回一個處理器,然後請求處理器適配器之心相應的處理器,此時處理器映射器會調用Spr

故而-PHP文件操作函數

單位 contents 結果 fgets HP 提示 文件句柄 etc 取整 1 文件操作流程 打開文件-》讀取或者寫入文件-》關閉文件 fopen->fread,fwrite->fclose fopen可以打開ftp或者http協議的文件,前提示對方支持 ph

web前端開發故而(二)

b前端開發 溫故而知新 行數 row 溫故 tab padding ram 列合並 2.0:帶機構的的表格分為<thead></thead> <tbody></tbody> </tfoot><

web前端開發故而(三)

隱藏 area for value 隱藏域 span selected orm web前端開發 3.1:input屬性hidden隱藏域 例:<input type="hidden" name="hidden" value="這是一個隱藏域" /> 3.2: