編程的最困難部分,是將做事的方式往追求完美的方向調(diào)整
缺乏的時間進度是造成項目滯后的最主要原因:
* 我們對估算技術(shù)缺乏有效的研究
* 我們采用的估算技術(shù)隱含地假設(shè)人和月可以互換
* 由于對自己的估算缺乏信心,軟件經(jīng)理通常不會有耐心地持續(xù)地進行估算這項工作
* 對進度缺少跟蹤和監(jiān)督
* 當意識到進度的偏移時,下意識(以及傳統(tǒng))的反應(yīng)是增加人力
系統(tǒng)編程的進度安排背后的假設(shè):
* 一切都將動作良好,每一項任務(wù)僅花費它所“應(yīng)該”花費的時間
* 用人月作為衡量一項工作的規(guī)模是一個危險和帶有欺騙性的神話,它暗示著人員數(shù)量和時間是可以相互替換的
* 由于我們的樂觀主義,通常實際出現(xiàn)的缺陷數(shù)量比預(yù)料的要多得多。因此,系統(tǒng)測試進度的安排常常是編程中最不合理的部分
* 為了滿足顧客期望的日期而造成的不合理進度安排,在軟件領(lǐng)域中比其他的工程領(lǐng)域要普遍的多
軟件任務(wù)的進度安排:
* 1/3計劃
* 1/6編碼
* 1/4構(gòu)件測試和早期系統(tǒng)測試
* 1/4系統(tǒng)測試,所有的構(gòu)件已完成
Brooks法則:向進度落后的項目中增加人手,只會使進度更加落后
項目的時間依賴于順序上的限制,人員的數(shù)量依賴于單個子任務(wù)的數(shù)量。從這兩個數(shù)值可以推算出進度時間表,該表安排的人員較少,花費的時間較長(唯一的風(fēng)險是產(chǎn)品可能會過時)。相反,分派較多的人手,計劃較短的時間,將無法得到可行的進度表
需要協(xié)作溝通的人員的數(shù)量影響著開發(fā)成本,因為成本的主要組成部分是相互的溝通和交流,以及更正溝通不當所引起的不良結(jié)果(系統(tǒng)調(diào)試)。系統(tǒng)應(yīng)該由盡可能少的人員來開發(fā)
Mills建議大型項目的每一個部分由一個團隊解決,該隊伍以類似外科手術(shù)的方式組建:
* 外科醫(yī)生:首席程度員,天分、經(jīng)驗、能力
* 副手:外科醫(yī)生的后備,較少的經(jīng)驗
* 管理員:控制財務(wù)、人員、工作地點安排和機器的專業(yè)管理人員
* 編輯:分析重組開發(fā)文檔
* 兩個秘書:管理員和編輯每人需要一個秘書
* 程序職員:維護編程產(chǎn)品庫中所有團隊的技術(shù)記錄
* 工具維護人員:保證所有基本服務(wù)的可靠性,以及承擔團隊成員所需要的特殊工具的構(gòu)建、維護和升級責任
* 測試人員:大量合適的測試用例,搭建測試平臺
* 語言專家:尋找合適的編程語言
進度壓力要求很多人員來開發(fā)系統(tǒng),有兩種方法解決這種矛盾:
* 仔細地區(qū)分設(shè)計方法和具體實現(xiàn)
* 一種新的組建編輯開發(fā)團隊的方法
對于非常大型的項目,將設(shè)計方法、體系結(jié)構(gòu)方面的工作與具體實現(xiàn)相分離是獲得概念完整性的強有力方法
系統(tǒng)的結(jié)構(gòu)師,是運用專業(yè)技術(shù)知識來支持用戶的真正利益,而不是維護銷售人員所鼓吹的利益,體系結(jié)構(gòu)陳述的是發(fā)生了什么,而實現(xiàn)描述的是如何實現(xiàn)
整個創(chuàng)造性活動包括了三個獨立的階段:體系結(jié)構(gòu)、設(shè)計實現(xiàn)、物理實現(xiàn),在實際情況中,它們往往可以同時開始和并發(fā)地進行
盡早交流和持續(xù)溝通能使結(jié)構(gòu)師有較好的成本意識,以及使開發(fā)人員獲得對設(shè)計的信心,并且不會混淆各自的責任分工
想要成功,結(jié)構(gòu)師必須:
* 牢記是開發(fā)人員承擔創(chuàng)造性和發(fā)明性的實現(xiàn)責任,所以結(jié)構(gòu)師只能建議,而不能支配
* 時刻準備著為所指定的說明建議一種實現(xiàn)的方法,同樣準備接受其他任何能達到目標的方法
* 對上述的建議保持低調(diào)和平靜
* 準備放棄堅持所作的改進建議
項目經(jīng)理如何避免畫蛇添足?他必須堅持至少擁有兩個系統(tǒng)以上開發(fā)經(jīng)驗結(jié)構(gòu)師的決定 ,同時,保持對特殊誘惑的警覺,他可以不斷提出正確的問題,確保原則上的概念和目標在詳細設(shè)計中得到完整的體現(xiàn)
手冊、或者書面規(guī)格說明,是一個非常必要的工具,盡管光有文檔是不夠的。手冊是產(chǎn)品的外部規(guī)格說明,它描述和規(guī)定了用戶所見的每一個細節(jié)。不但要描述包括所有界面在內(nèi)的用戶可見的一切,它同時還要避免描述用戶看不見的事物。后者是編程實現(xiàn)人員的工作范疇
思路是大約十個人的想法,但如果想保持文字和產(chǎn)品之間的一致性,則必須由一個或兩個人來完成將其結(jié)論轉(zhuǎn)換成書面規(guī)格說明的工作。對于在整個設(shè)計中,保證這些看似瑣碎的問題處理原則上的一致性,決不是一件無關(guān)緊要的事情
“決不要攜帶兩個時鐘出海,帶一個或三個”
設(shè)立測試小組是使設(shè)計決策得以貫徹執(zhí)行的必要手段,同樣也是需要盡早著手,與設(shè)計同時實施的重要環(huán)節(jié)
巴比倫塔的失敗原因:交流、組織。交流和交流的結(jié)果—組織,是成功的關(guān)鍵。交流和組織的技能需要管理者仔細考慮,相關(guān)經(jīng)驗的積累和能力的提高同軟件技術(shù)本身一樣重要
團隊如何進行交流:
* 非正式途徑
* 會議
* 工作手冊
團隊組織的目的是減少不必要交流和合作的數(shù)量,因此良好的團隊組織是解決上述交流問題的關(guān)鍵措施
減少交流的方法是人力劃分和限定職責范圍
人力劃分存在三種可能關(guān)系:
* 產(chǎn)品負責人和技術(shù)主管是同一個人(小型團隊)
* 產(chǎn)品負責人作為總指揮,技術(shù)主管充當其左右手(大型團隊)
* 技術(shù)主管作為總指揮,產(chǎn)品負責人充當其左右手(中小型團隊)
工作量=(常數(shù)) * (指令的數(shù)量)
兩個關(guān)于工作量的結(jié)論:
* 對常用的編程語句而言。生產(chǎn)率似乎是固定的。這個固定的生產(chǎn)率包括了編程中需要注釋,并可能存在錯誤的情況。
* 使用適當?shù)母呒壵Z言,編程的生產(chǎn)率可以提高5倍
沒有人可以在自始至終提倡更緊密的軟硬件設(shè)計集成的同時,又僅僅就規(guī)模本身對軟件系統(tǒng)提出批評
由于規(guī)模是軟件系統(tǒng)產(chǎn)品用戶成本中如此大的一個組成部分,開發(fā)人員必須設(shè)置規(guī)模的目標,控制規(guī)模,考慮減小規(guī)模的方法,就像硬件開發(fā)人員會設(shè)立元器件數(shù)量目標,控制元器件的數(shù)量,想出一些減少零件的方法
規(guī)??刂疲?/p>
* 應(yīng)該制訂總體規(guī)模的預(yù)算,應(yīng)該制訂后臺存儲訪問的預(yù)算
* 在指明模塊有多大的同時,確切定義模塊的功能
* 保持持續(xù)的警覺,確保連貫的系統(tǒng)完整性
數(shù)據(jù)的表現(xiàn)形式是編程的根本
計算機產(chǎn)品的文檔:
* 目標
* 技術(shù)說明
* 進度、時間表
* 預(yù)算
* 組織機構(gòu)圖
* 工作空間的分配
* 報價、預(yù)測、價格
大學(xué)科系的文檔:
* 目標
* 課程概述
* 學(xué)位要求
* 研究報告(申請基金時,還要求計劃)
* 課程表和課程的安排
* 預(yù)算
* 教室分配
* 教師的研究生助手的分配
軟件項目的文檔:
* 做什么:目標
* 做什么:產(chǎn)品技術(shù)說明
* 時間:進度表
* 資金:預(yù)算表
* 地點:工作空間分配
* 人員:組織圖
為什么要有正式的文檔:
* 書面記錄決策是必要的
* 文檔能夠作為同其他人的溝通渠道
* 項目經(jīng)理的文檔可以作為數(shù)據(jù)基礎(chǔ)和檢查列表
變化是與生俱來的,不是不合時宜和令人生厭的異常情況。開發(fā)人員將會的是用戶滿意程度,而不僅僅是實際的產(chǎn)品。用戶的實際需要和用戶感覺會隨著程序的構(gòu)建、測試和使用而變化
為變更計劃系統(tǒng):細致的模塊化、可擴展的函數(shù)、精確完整的模塊間接口設(shè)計、完備的文檔,調(diào)用隊列和表驅(qū)動,使用高級語言和自文檔技術(shù),數(shù)字版本號
為變更計劃組織框架:
* 把所有計劃、里程碑、日程安排都當作是嘗試性的,以方便進行變化
* 使管理人員和技術(shù)人才具有互換性
* 管理人員需要參與技術(shù)課程,高級技術(shù)人才需要進行管理培訓(xùn)
程序維護中的一個基本問題是——缺陷修復(fù)總會以(20-50)%的機率引入新的bug。設(shè)計實現(xiàn)的人員越少、接口越少,產(chǎn)生的錯誤也就越少
系統(tǒng)軟件開發(fā)是減少混亂度(減少熵)的過程,所以它本身是處于亞穩(wěn)態(tài)的。軟件維護是提高混亂度(增加熵)的過程,即使是最熟練的軟件維護工作,也只是放緩了系統(tǒng)退化到非穩(wěn)態(tài)的進程
“關(guān)鍵的工作是產(chǎn)品定義。許許多多的失敗完全源于那些產(chǎn)品未精確定義的地方”
關(guān)鍵的地方和構(gòu)建無bug程序的核心,是把系統(tǒng)的結(jié)構(gòu)作為控制結(jié)構(gòu)來考慮,而不是獨立的跳轉(zhuǎn)語句
系統(tǒng)集成調(diào)試:
* 使用經(jīng)過調(diào)試的構(gòu)建單元(單元測試)
* 搭建充分的測試平臺(偽構(gòu)件,樁、模)
* 控制變更
* 一次添加一個構(gòu)件
* 階段(量子)化、定期變更
里程碑:必須是具體的、特定的、可度量的事件,能夠進行清晰的定義,有明顯邊界和沒有歧義
“我認為軟件開發(fā)中困難的部分是規(guī)格化、設(shè)計和測試這些概念上的結(jié)構(gòu),而不是對概念進行表達和對實現(xiàn)逼真程序進行驗證”
軟件系統(tǒng)的內(nèi)在特性:復(fù)雜度、一致性、可變性、不可見性
針對概念上根本問題的頗具前途的方法:
* 購買和自行開發(fā),構(gòu)建軟件最可能的徹底解決方案是不開發(fā)任何軟件
* 需求精練和快速原型
* 增量開發(fā)——增長,而非搭建系統(tǒng),先運行起來
* 卓越的設(shè)計人員
大多數(shù)有豐富經(jīng)經(jīng)驗的程序員擁有自己的私人開發(fā)庫,可以使他們使用大約30%的重用代碼來開發(fā)軟件。公司級別的重用能提供70%的重用代碼量,它需要特殊的開發(fā)庫和管理支持。公司級別的重用代碼也意味著需要對項目中的變更進行統(tǒng)計和度量,從而提高重用的可信程度
每一份發(fā)布的程序拷貝應(yīng)該包括一些測試用例,其中一部分用于校驗輸入數(shù)據(jù),一部分用于邊界輸入數(shù)據(jù),另一部分用于無效的輸入數(shù)據(jù)
一個整潔、優(yōu)雅的編程產(chǎn)品必須向它的每個用戶提供一個條理分明的概念模型,這個模型描述了應(yīng)用、實現(xiàn)應(yīng)用的方法以及用來指明操作和各種參數(shù)的用戶界面使用策略