編程的最困難部分寄摆,是將做事的方式往追求完美的方向調(diào)整
缺乏的時(shí)間進(jìn)度是造成項(xiàng)目滯后的最主要原因:
* 我們對(duì)估算技術(shù)缺乏有效的研究
* 我們采用的估算技術(shù)隱含地假設(shè)人和月可以互換
* 由于對(duì)自己的估算缺乏信心检盼,軟件經(jīng)理通常不會(huì)有耐心地持續(xù)地進(jìn)行估算這項(xiàng)工作
* 對(duì)進(jìn)度缺少跟蹤和監(jiān)督
* 當(dāng)意識(shí)到進(jìn)度的偏移時(shí),下意識(shí)(以及傳統(tǒng))的反應(yīng)是增加人力
系統(tǒng)編程的進(jìn)度安排背后的假設(shè):
* 一切都將動(dòng)作良好筋搏,每一項(xiàng)任務(wù)僅花費(fèi)它所“應(yīng)該”花費(fèi)的時(shí)間
* 用人月作為衡量一項(xiàng)工作的規(guī)模是一個(gè)危險(xiǎn)和帶有欺騙性的神話,它暗示著人員數(shù)量和時(shí)間是可以相互替換的
* 由于我們的樂觀主義戳寸,通常實(shí)際出現(xiàn)的缺陷數(shù)量比預(yù)料的要多得多纺念。因此渠驼,系統(tǒng)測(cè)試進(jìn)度的安排常常是編程中最不合理的部分
* 為了滿足顧客期望的日期而造成的不合理進(jìn)度安排,在軟件領(lǐng)域中比其他的工程領(lǐng)域要普遍的多
軟件任務(wù)的進(jìn)度安排:
* 1/3計(jì)劃
* 1/6編碼
* 1/4構(gòu)件測(cè)試和早期系統(tǒng)測(cè)試
* 1/4系統(tǒng)測(cè)試蔑穴,所有的構(gòu)件已完成
Brooks法則:向進(jìn)度落后的項(xiàng)目中增加人手忠寻,只會(huì)使進(jìn)度更加落后
項(xiàng)目的時(shí)間依賴于順序上的限制,人員的數(shù)量依賴于單個(gè)子任務(wù)的數(shù)量存和。從這兩個(gè)數(shù)值可以推算出進(jìn)度時(shí)間表奕剃,該表安排的人員較少,花費(fèi)的時(shí)間較長(zhǎng)(唯一的風(fēng)險(xiǎn)是產(chǎn)品可能會(huì)過時(shí))捐腿。相反纵朋,分派較多的人手,計(jì)劃較短的時(shí)間茄袖,將無法得到可行的進(jìn)度表
需要協(xié)作溝通的人員的數(shù)量影響著開發(fā)成本操软,因?yàn)槌杀镜闹饕M成部分是相互的溝通和交流,以及更正溝通不當(dāng)所引起的不良結(jié)果(系統(tǒng)調(diào)試)绞佩。系統(tǒng)應(yīng)該由盡可能少的人員來開發(fā)
Mills建議大型項(xiàng)目的每一個(gè)部分由一個(gè)團(tuán)隊(duì)解決寺鸥,該隊(duì)伍以類似外科手術(shù)的方式組建:
* 外科醫(yī)生:首席程度員,天分品山、經(jīng)驗(yàn)胆建、能力
* 副手:外科醫(yī)生的后備,較少的經(jīng)驗(yàn)
* 管理員:控制財(cái)務(wù)肘交、人員笆载、工作地點(diǎn)安排和機(jī)器的專業(yè)管理人員
* 編輯:分析重組開發(fā)文檔
* 兩個(gè)秘書:管理員和編輯每人需要一個(gè)秘書
* 程序職員:維護(hù)編程產(chǎn)品庫中所有團(tuán)隊(duì)的技術(shù)記錄
* 工具維護(hù)人員:保證所有基本服務(wù)的可靠性,以及承擔(dān)團(tuán)隊(duì)成員所需要的特殊工具的構(gòu)建、維護(hù)和升級(jí)責(zé)任
* 測(cè)試人員:大量合適的測(cè)試用例凉驻,搭建測(cè)試平臺(tái)
* 語言專家:尋找合適的編程語言
進(jìn)度壓力要求很多人員來開發(fā)系統(tǒng)腻要,有兩種方法解決這種矛盾:
* 仔細(xì)地區(qū)分設(shè)計(jì)方法和具體實(shí)現(xiàn)
* 一種新的組建編輯開發(fā)團(tuán)隊(duì)的方法
對(duì)于非常大型的項(xiàng)目,將設(shè)計(jì)方法涝登、體系結(jié)構(gòu)方面的工作與具體實(shí)現(xiàn)相分離是獲得概念完整性的強(qiáng)有力方法
系統(tǒng)的結(jié)構(gòu)師雄家,是運(yùn)用專業(yè)技術(shù)知識(shí)來支持用戶的真正利益,而不是維護(hù)銷售人員所鼓吹的利益胀滚,體系結(jié)構(gòu)陳述的是發(fā)生了什么趟济,而實(shí)現(xiàn)描述的是如何實(shí)現(xiàn)
整個(gè)創(chuàng)造性活動(dòng)包括了三個(gè)獨(dú)立的階段:體系結(jié)構(gòu)、設(shè)計(jì)實(shí)現(xiàn)咽笼、物理實(shí)現(xiàn)顷编,在實(shí)際情況中,它們往往可以同時(shí)開始和并發(fā)地進(jìn)行
盡早交流和持續(xù)溝通能使結(jié)構(gòu)師有較好的成本意識(shí)剑刑,以及使開發(fā)人員獲得對(duì)設(shè)計(jì)的信心媳纬,并且不會(huì)混淆各自的責(zé)任分工
想要成功,結(jié)構(gòu)師必須:
* 牢記是開發(fā)人員承擔(dān)創(chuàng)造性和發(fā)明性的實(shí)現(xiàn)責(zé)任施掏,所以結(jié)構(gòu)師只能建議钮惠,而不能支配
* 時(shí)刻準(zhǔn)備著為所指定的說明建議一種實(shí)現(xiàn)的方法,同樣準(zhǔn)備接受其他任何能達(dá)到目標(biāo)的方法
* 對(duì)上述的建議保持低調(diào)和平靜
* 準(zhǔn)備放棄堅(jiān)持所作的改進(jìn)建議
項(xiàng)目經(jīng)理如何避免畫蛇添足七芭?他必須堅(jiān)持至少擁有兩個(gè)系統(tǒng)以上開發(fā)經(jīng)驗(yàn)結(jié)構(gòu)師的決定 萌腿,同時(shí),保持對(duì)特殊誘惑的警覺抖苦,他可以不斷提出正確的問題毁菱,確保原則上的概念和目標(biāo)在詳細(xì)設(shè)計(jì)中得到完整的體現(xiàn)
手冊(cè)、或者書面規(guī)格說明锌历,是一個(gè)非常必要的工具贮庞,盡管光有文檔是不夠的。手冊(cè)是產(chǎn)品的外部規(guī)格說明究西,它描述和規(guī)定了用戶所見的每一個(gè)細(xì)節(jié)窗慎。不但要描述包括所有界面在內(nèi)的用戶可見的一切,它同時(shí)還要避免描述用戶看不見的事物卤材。后者是編程實(shí)現(xiàn)人員的工作范疇
思路是大約十個(gè)人的想法遮斥,但如果想保持文字和產(chǎn)品之間的一致性,則必須由一個(gè)或兩個(gè)人來完成將其結(jié)論轉(zhuǎn)換成書面規(guī)格說明的工作扇丛。對(duì)于在整個(gè)設(shè)計(jì)中术吗,保證這些看似瑣碎的問題處理原則上的一致性,決不是一件無關(guān)緊要的事情
“決不要攜帶兩個(gè)時(shí)鐘出海帆精,帶一個(gè)或三個(gè)”
設(shè)立測(cè)試小組是使設(shè)計(jì)決策得以貫徹執(zhí)行的必要手段较屿,同樣也是需要盡早著手隧魄,與設(shè)計(jì)同時(shí)實(shí)施的重要環(huán)節(jié)
巴比倫塔的失敗原因:交流、組織隘蝎。交流和交流的結(jié)果—組織购啄,是成功的關(guān)鍵。交流和組織的技能需要管理者仔細(xì)考慮嘱么,相關(guān)經(jīng)驗(yàn)的積累和能力的提高同軟件技術(shù)本身一樣重要
團(tuán)隊(duì)如何進(jìn)行交流:
* 非正式途徑
* 會(huì)議
* 工作手冊(cè)
團(tuán)隊(duì)組織的目的是減少不必要交流和合作的數(shù)量狮含,因此良好的團(tuán)隊(duì)組織是解決上述交流問題的關(guān)鍵措施
減少交流的方法是人力劃分和限定職責(zé)范圍
人力劃分存在三種可能關(guān)系:
* 產(chǎn)品負(fù)責(zé)人和技術(shù)主管是同一個(gè)人(小型團(tuán)隊(duì))
* 產(chǎn)品負(fù)責(zé)人作為總指揮,技術(shù)主管充當(dāng)其左右手(大型團(tuán)隊(duì))
* 技術(shù)主管作為總指揮曼振,產(chǎn)品負(fù)責(zé)人充當(dāng)其左右手(中小型團(tuán)隊(duì))
工作量=(常數(shù)) * (指令的數(shù)量)
兩個(gè)關(guān)于工作量的結(jié)論:
* 對(duì)常用的編程語句而言辉川。生產(chǎn)率似乎是固定的。這個(gè)固定的生產(chǎn)率包括了編程中需要注釋拴测,并可能存在錯(cuò)誤的情況。
* 使用適當(dāng)?shù)母呒?jí)語言府蛇,編程的生產(chǎn)率可以提高5倍
沒有人可以在自始至終提倡更緊密的軟硬件設(shè)計(jì)集成的同時(shí)集索,又僅僅就規(guī)模本身對(duì)軟件系統(tǒng)提出批評(píng)
由于規(guī)模是軟件系統(tǒng)產(chǎn)品用戶成本中如此大的一個(gè)組成部分,開發(fā)人員必須設(shè)置規(guī)模的目標(biāo)汇跨,控制規(guī)模务荆,考慮減小規(guī)模的方法,就像硬件開發(fā)人員會(huì)設(shè)立元器件數(shù)量目標(biāo)穷遂,控制元器件的數(shù)量函匕,想出一些減少零件的方法
規(guī)模控制:
* 應(yīng)該制訂總體規(guī)模的預(yù)算蚪黑,應(yīng)該制訂后臺(tái)存儲(chǔ)訪問的預(yù)算
* 在指明模塊有多大的同時(shí)盅惜,確切定義模塊的功能
* 保持持續(xù)的警覺,確保連貫的系統(tǒng)完整性
數(shù)據(jù)的表現(xiàn)形式是編程的根本
計(jì)算機(jī)產(chǎn)品的文檔:
* 目標(biāo)
* 技術(shù)說明
* 進(jìn)度忌穿、時(shí)間表
* 預(yù)算
* 組織機(jī)構(gòu)圖
* 工作空間的分配
* 報(bào)價(jià)抒寂、預(yù)測(cè)、價(jià)格
大學(xué)科系的文檔:
* 目標(biāo)
* 課程概述
* 學(xué)位要求
* 研究報(bào)告(申請(qǐng)基金時(shí)掠剑,還要求計(jì)劃)
* 課程表和課程的安排
* 預(yù)算
* 教室分配
* 教師的研究生助手的分配
軟件項(xiàng)目的文檔:
* 做什么:目標(biāo)
* 做什么:產(chǎn)品技術(shù)說明
* 時(shí)間:進(jìn)度表
* 資金:預(yù)算表
* 地點(diǎn):工作空間分配
* 人員:組織圖
為什么要有正式的文檔:
* 書面記錄決策是必要的
* 文檔能夠作為同其他人的溝通渠道
* 項(xiàng)目經(jīng)理的文檔可以作為數(shù)據(jù)基礎(chǔ)和檢查列表
變化是與生俱來的屈芜,不是不合時(shí)宜和令人生厭的異常情況。開發(fā)人員將會(huì)的是用戶滿意程度朴译,而不僅僅是實(shí)際的產(chǎn)品井佑。用戶的實(shí)際需要和用戶感覺會(huì)隨著程序的構(gòu)建、測(cè)試和使用而變化
為變更計(jì)劃系統(tǒng):細(xì)致的模塊化眠寿、可擴(kuò)展的函數(shù)躬翁、精確完整的模塊間接口設(shè)計(jì)、完備的文檔盯拱,調(diào)用隊(duì)列和表驅(qū)動(dòng)姆另,使用高級(jí)語言和自文檔技術(shù)喇肋,數(shù)字版本號(hào)
為變更計(jì)劃組織框架:
* 把所有計(jì)劃、里程碑迹辐、日程安排都當(dāng)作是嘗試性的蝶防,以方便進(jìn)行變化
* 使管理人員和技術(shù)人才具有互換性
* 管理人員需要參與技術(shù)課程,高級(jí)技術(shù)人才需要進(jìn)行管理培訓(xùn)
程序維護(hù)中的一個(gè)基本問題是——缺陷修復(fù)總會(huì)以(20-50)%的機(jī)率引入新的bug明吩。設(shè)計(jì)實(shí)現(xiàn)的人員越少间学、接口越少,產(chǎn)生的錯(cuò)誤也就越少
系統(tǒng)軟件開發(fā)是減少混亂度(減少熵)的過程印荔,所以它本身是處于亞穩(wěn)態(tài)的低葫。軟件維護(hù)是提高混亂度(增加熵)的過程,即使是最熟練的軟件維護(hù)工作仍律,也只是放緩了系統(tǒng)退化到非穩(wěn)態(tài)的進(jìn)程
“關(guān)鍵的工作是產(chǎn)品定義嘿悬。許許多多的失敗完全源于那些產(chǎn)品未精確定義的地方”
關(guān)鍵的地方和構(gòu)建無bug程序的核心,是把系統(tǒng)的結(jié)構(gòu)作為控制結(jié)構(gòu)來考慮水泉,而不是獨(dú)立的跳轉(zhuǎn)語句
系統(tǒng)集成調(diào)試:
* 使用經(jīng)過調(diào)試的構(gòu)建單元(單元測(cè)試)
* 搭建充分的測(cè)試平臺(tái)(偽構(gòu)件善涨,樁、模)
* 控制變更
* 一次添加一個(gè)構(gòu)件
* 階段(量子)化草则、定期變更
里程碑:必須是具體的钢拧、特定的、可度量的事件炕横,能夠進(jìn)行清晰的定義源内,有明顯邊界和沒有歧義
“我認(rèn)為軟件開發(fā)中困難的部分是規(guī)格化、設(shè)計(jì)和測(cè)試這些概念上的結(jié)構(gòu)份殿,而不是對(duì)概念進(jìn)行表達(dá)和對(duì)實(shí)現(xiàn)逼真程序進(jìn)行驗(yàn)證”
軟件系統(tǒng)的內(nèi)在特性:復(fù)雜度膜钓、一致性、可變性卿嘲、不可見性
針對(duì)概念上根本問題的頗具前途的方法:
* 購買和自行開發(fā)呻此,構(gòu)建軟件最可能的徹底解決方案是不開發(fā)任何軟件
* 需求精練和快速原型
* 增量開發(fā)——增長(zhǎng),而非搭建系統(tǒng)腔寡,先運(yùn)行起來
* 卓越的設(shè)計(jì)人員
大多數(shù)有豐富經(jīng)經(jīng)驗(yàn)的程序員擁有自己的私人開發(fā)庫焚鲜,可以使他們使用大約30%的重用代碼來開發(fā)軟件。公司級(jí)別的重用能提供70%的重用代碼量放前,它需要特殊的開發(fā)庫和管理支持忿磅。公司級(jí)別的重用代碼也意味著需要對(duì)項(xiàng)目中的變更進(jìn)行統(tǒng)計(jì)和度量,從而提高重用的可信程度
每一份發(fā)布的程序拷貝應(yīng)該包括一些測(cè)試用例凭语,其中一部分用于校驗(yàn)輸入數(shù)據(jù)葱她,一部分用于邊界輸入數(shù)據(jù),另一部分用于無效的輸入數(shù)據(jù)
一個(gè)整潔似扔、優(yōu)雅的編程產(chǎn)品必須向它的每個(gè)用戶提供一個(gè)條理分明的概念模型吨些,這個(gè)模型描述了應(yīng)用搓谆、實(shí)現(xiàn)應(yīng)用的方法以及用來指明操作和各種參數(shù)的用戶界面使用策略