宣傳語
勤于思考,豐富經驗,精通技能,做合格的軟體人才。
內容簡介
本書從軟體與三維實物的本質性不同出發研究軟體生產方法論。今天,軟體生產中許多傳統問題並沒有得到質的改善,以“爆炸”形容的技術發展的實質究竟是什麼?先進管理模式下的管理現狀如何?本書首先深入分析以上問題,指出軟體的本質及其至今不能實現工業化生產的內在原因。接著,從軟體設計,測試與管理三個方面,體系化地介紹了作者長年實踐中總結的有效實用方法;最後從軟體本質出發,提出了全新的先進軟體生產模式與方法——代碼驅動生產(Code Driving Production),並指出這將是適合軟體本質的新途徑。
作者簡介
何小朝,1972年生,工學博士,北京大學計算機系博士後,第一屆中國軟體業十大傑出青年候選人,第十六屆世界計算機大會電子商務大會數據管理分會主席,中國航空史研究會會員,科技部中小企業創新基金評審專家。作者1992年起從事軟體的設計、開發與管理工作,涉及信息系統、嵌入式系統及工業設計與生產等領域。曾任北京北大青鳥信息工程有限責任公司總工程師,北京青鳥天橋科技股份有限公司公安事業部副總經理,北京青鳥華光科技有限公司技術管理部部長、總工程師,大唐微電子科技有限公司高級項目經理等職。自2002年起,在北美從事軟體系統分析與設計工作近七年之久,現任北京安德爾國際軟體有限公司總經理,董事,北美PPMC技術總監,北京先進數通科技有限公司BI事業部首席架構師等職。迄今為止,共負責、參與大中型軟體開發項目20多項,在國內外發表科技論文20餘篇,被美國EI《工程索引》檢索6篇。
本書特點
從技術與管理兩個層面研究軟體生產方法論。
深入分析軟體飛速發展的本質及技術與管理現狀,指出軟體與三維實物的本質性不同是其至今不能實現有效工業化生產的內在原因。
結合作者多年經驗,從設計、實現、測試與管理多個角度全面介紹具體的有效實用方法與技術內容。
強調代碼是軟體的核心,指出軟體無法完全可視化表達。
從軟體本質出發,提出以實現為中心的"代碼驅動生產"(Code Driving Production)模式、理論與方法,它不同於以設計為中心的傳統方法。
序
無論技術發展多快,與電子、機械產品的規範化生產相比,軟體開發的實際狀況卻一直不盡人意,被稱為“黑箱技術”。這本書從軟體與三維實物的本質性不同這個全新角度出發,從技術與管理兩個層面,深入分析現狀,研究軟體生產方法論,並給出相應的實用方法與工具介紹。
這裡,我想先談談軟體生產的現狀。今天,軟體的套用已經覆蓋各行各業,幾乎無處不在,無論什麼領域,一定或多或少的存在著軟體設計與開發工作,本書作者稱之為“軟體生產”。應該說,與很多年以前相比,軟體技術的發展更新速度飛快,成果顯著!在開發工具、支撐環境、分析設計方法、軟體工程理論與軟體管理方法等各個方面都有眾多的革新內容。
在實踐中,不難發現,技術進展雖然軟體開發的效率與質量大大提高,但要使其實現如傳統工業那樣的標準化與工業化,仍然感到困惑、困難,甚至還是無從下手。很多組織雖然不斷引進新的技術與方法,但軟體生產中的許多傳統問題卻依然存在並且沒有得到質的改善;在軟體生產管理中,開發者與管理者的不協調比任何其它行業都明顯;在軟體生產理論研究中,研究者與實踐者的脫節也比任何其它領域都嚴重。
在軟體開發、設計與管理的實踐中,人們總是自然地產生對更優方法的需求與渴望,於是對不斷出現的新生理論、管理模式、方法與工具感到興奮異常,繼而學習、使用,卻又一次次產生困惑與疑問!這究竟是怎么回事呢?
作者何小朝曾參與過很多項目與產品開發,他本人也接觸過一些國際先進的軟體組織與著名的資深專家,並與如KDE創始設計師這樣的專家一起工作過,有許多經驗、體會與感觸。作者曾告訴我,在多年的工作與生活中,他深深感到:“大千世界,臥虎藏龍”,平凡世界中隱藏者無數的“大俠”!因而他希望能將自己的體會、觀點與同行們共享,希望能與大家在許多方面進行討論,也希望能為大家提供支持與幫助。
書中,作者分析了經過多年的飛速發展後,軟體生產依然存在的主要問題,指出軟體業飛速發展的本質以及軟體生產至今不能實現如機械電子產品那樣有效工業化的內在原因,並總結了軟體界的兩個矛盾:管理者與開發者的矛盾;研究者與實踐者的矛盾。在其方法論篇,作者先結合多年經驗體系化地介紹了長年實踐中總結的實用軟體生產方法,其中包括:軟體設計方法論,軟體測試方法論,軟體管理方法論等,旨在對現有的生產實踐作出實際的指導與幫助;最後則從軟體本質出發,提出了新的現代軟體生產模式、理論與方法——代碼驅動生產(Code Driving Production),並指出這將是適合軟體本質特徵的新途徑。
本書立意新穎,發人深省,其內容豐富、全面而又實用,我願意向各位推薦這本書,希望能為廣大讀者帶來幫助與啟發。
北京大學教授,歐亞科學院院士
2009年12月
前言
上世紀初,偉大的物理學家愛因斯坦提出了具有劃時代意義的相對論,其全新的時空理念直到今天都很難被人們以常規的形象思維所理解,而愛因斯坦認為,人們不能正確理解世界本質的根本原因是由於:人類的理解能力無法超脫三維空間範圍的限制,正如我們無法想像在四維或多維空間的一個球體的形狀一樣。
現代軟體行業的概念、方法、工具出現速度之快是非常驚人的,幾乎所有的同行每天都在不停地學習新的東西。我相信其中有相當一部分人是期望能從新的方法中找到解決該行業多年需要解決的眾多難題的好途徑,如設計的規範化問題,管理的有效性問題,開發的重複性問題等。
然而,我也相信,當我的同行們懷著期待的心情對這些新的理論與方法不斷學習與嘗試後,他們發現——雖然大量可視化開發工具與眾多套用支撐環境的出現,使現代套用軟體開發者基本擺脫了過去那種將最大精力放在界面、通訊及大量數據管理的狀態,而能集中力量開發自己的核心業務內容;然而,往往在一個具體的項目或具體的企業中,又有眾多的原本令人興奮不已的新方法、新理論,甚至是那些成功者的寶貴經驗,卻是那樣難以真正起到預期的作用,甚至在有些情況下毫無作用,我想,這些可能主要存在於新的設計分析方法與管理方法和具體套用結合等方面。
軟體開發工具不斷更新,軟體工程師們現在可以很輕鬆地構建複雜的圖形用戶界面(多年以前,圖形用戶界面是軟體開發中工作量最大的部分之一),很方便地對數據進行管理,進行調試;同時,一些新軟體開發支撐環境與體系構架的出現,如C/S結構,J2EE,DCOM,CORBA等,一方面使程式設計師可以擺脫RPC、Socket等底層的方法,輕鬆地開發網路化的信息系統,另一方面使複雜系統的構建效率與質量大大提高。近年來,軟體行業在這些方面的發展的確產生了巨大的成效,並為大多數人所接受。
然而,軟體行業在其它方面的革新內容對軟體業的實際貢獻,及在軟體管理、設計、開發人員中的普及與實用程度,都遠不如開發工具與環境的新內容那么明顯與直接。
軟體分析設計方法的革新主要體現在面向對象的技術與思想,數據與方法的封裝、繼承,多態及復用,使設計師們可以更加形象地用軟體來描述客觀事物及其相互關係與作用,這應該是一種非常偉大的創造,也在軟體行業起到巨大的推動作用;然而,另一方面,雖然面向對象技術與思想的優勢已為同行們所公認,但在實際工程中,除了大量使用面向對象的開發工具與語言以外,真正採用面向對象的思想來分析、設計系統、描述設計結果以完成實際項目的作法卻遠不如想像中那么普及。這是因為某些工程太簡單而沒有必要用到它,還是因為它太難以實用化,還是其它什麼原因呢?
軟體工程理論在不斷在構造新的理想:軟體的生產能象生產一部汽車,生產一台電視機或蓋一座大樓一樣,有標準的零件,標準的結構,標準的流程,標準的生產線,標準的組裝……。理論家們充滿了創造性的構想與信心,而大批一線的軟體工程師們卻對這種理想產生懷疑。
軟體企業管理模式的革新也是大部分企業迫切的需求,先進的CMM出現了,其理論不斷被人們所了解,大家都對那些已經獲得某種CMM級別的企業產生了深切的崇拜與嚮往,並異口同聲的宣布,“我們也要做!”但我們同時又發現,大量的軟體企業在把CMM與自己企業的實際情況有機結合的道路上卻遇到了令人頭痛的困難與疑惑,這種困難與疑惑好像不僅僅是為接受新機制而“痛一時,利一生”那么簡單。
問題出在哪裡呢?為什麼在軟體工業化的道路上要達到電子、機械產品的程度會那么困難?多年來,作者也一直思考這個問題。
本文認為,“對一件事物解決方法的制定要基於正確了解該事物的本質。”那么,可能軟體這個事物與傳統其它產品的特徵還是有著巨大的區別,這可能不只是量的區別,而是質的區別。
或許我們應該從這個角度重新審視一下過去採用與傳統工業化類比的思想所得來的靈感、理想與方法。
這裡,要首先感謝家人的支持!感謝長年在日本工作的好友郭果明與施文彪為我提供一些信息,同時,電工工業出版社的袁金敏編輯與顧惠芳老師也為本書的出版提出了許多寶貴的建議,在此一併衷心感謝!
何小朝
2009年12月
目錄
序 11
前言 13
第一部分 現狀與困惑 16
第一章 困難與困惑 16
1.1軟體項目實施的困難 16
1.1.1漫長的維護期 16
1.1.2什麼時候開始編碼——生產過程控制 16
1.1.3開發周期的精確估算 17
1.1.4需求何時確定 17
1.1.5令人頭痛的邊緣問題 18
1.1.6魯棒性 19
1.2飛速發展?——困惑 19
第二章 技術方法的抉擇——軟體設計師的困惑 21
2.1 引言 21
2.2 軟體設計師的理想 22
2.2.1 什麼是軟體設計師 22
2.2.2 技術人員的理想 24
2.2 似有曙光——方法論 25
2.2.1技術進步帶來希望 25
2.2.2軟體技術方法綜述 26
2.2.2.1可視化編程 26
2.2.2.2面向對象 28
2.2.2.3多層體系結構 30
2.2.2.4中間件 31
2.2.2.5統一建模語言——UML 32
2.2.2.6平台無關 32
2.2.2.7 Web Service與SOA 33
2.2.2.8 J2EE, .NET與MVC 34
2.2.2.9格線與雲計算 34
2.2.2.10標準化 36
2.3現實!? 37
2.3.1新技術手段的使用狀況 37
2.3.1.1面向對象分析、設計方法 38
2.3.1.2設計結果的表示 39
2.3.1.3開發調試工具 40
2.3.1.4程式語言 41
2.3.1.5支撐環境 42
2.3.1.6 標準化 42
2.3.2困難沒有得到本質解決 43
2.3.3許多人這樣看 44
2.3.4痛一時,利一生? 44
2.4 疑惑——方法的抉擇 45
2.5方法到底解決了什麼 47
2.5.1通用函式館、類庫與框架的復用 47
2.5.2分層體系使生產集中於套用本身 49
2.5.2.1分層體系綜述 49
2.5.2.2 軟體行業的分層體系 50
2.5.3面向對象有機描述客觀目標 51
2.5.4 “平台無關”是以“時間換空間” 53
2.5.5其它本質探討 54
2.6常用有效技術方法簡介 54
2.6.1 分析與設計的組織 55
2.6.2開發環境的選擇 56
2.6.3編程 60
2.6.4文檔的生成 61
2.6.5其它環節 62
2.7本章小結 62
第三章 如何有效地服務——技術管理者的煩惱 64
3.1 軟體項目管理現狀 64
3.1.1管理過多依賴個人經驗 64
3.1.2管理規則很不成熟 65
3.1.3管理組與開發組不協調 66
3.1.4無通用規則可循,各有特色 67
3.1.5新方法的現實情況 68
3.2軟體項目管理的幾個具體問題 68
3.2.1文檔的管理問題 68
3.2.2設計文檔的作用到底是什麼? 69
3.2.3過程控制問題 70
3.2.3.1軟體過程模型簡介 70
3.2.3.2現狀 71
3.2.4測試的問題 71
3.2.5需求制定的問題 72
3.3管理者的希望與困惑——CMM 72
3.3.1 CMM簡介 72
3.3.2 PSP/TSP 74
3.3.3 CMM套用現狀 75
3.3.4 CMM的困惑 75
3.4 究竟怎么回事? 76
3.5本章小結 76
第二部分 軟體的本質—不是三維 78
四、理想與現實——科學與工程的碰撞 78
4.1軟體工程的理想——生產線與復用 78
4.2工程實踐——與理想模式的距離 79
4.2.1軟體是數位化社會的主體 79
4.2.2軟體生產業的主體是什麼? 80
4.2.3軟體生產工程實踐現狀 80
4.2.3.1系統軟體與支撐軟體生產較規範 80
4.2.3.2套用軟體生產主體處於手工業階段 80
4.2.3.3軟體生產業主體處於手工業階段 81
4.3“飛速發展”的本質 81
4.4本章小結 82
五、不是三維——軟體的本質 83
5.1三維空間——人類形象思維的局限 83
5.2傳統產品簡析 83
5.2.1傳統產品——三維實體 83
5.2.2傳統產品的核心——設計輸出 84
5.2.3傳統產品生產模式——生產線 84
5.3軟體產品簡析 84
5.3.1軟體是一種特殊的產品 84
5.3.2二維可視化設計語言能力分析 85
5.3.3軟體無法完全可視化表達 87
5.3.4軟體產品的核心——代碼 87
5.3.5一個有趣的問題 88
5.4軟體的本質——不是三維 88
5.5本章小結 89
第三部分 軟體生產方法論----實踐與研究 90
六、設計與開發 91
6.1引言 91
6.1.1 構件化生產與自動化的探討 92
6.1.1.1 軟體構件化生產簡介 92
6.1.1.2 關於UML與構件化生產 93
6.1.1.3 軟體構件化生產探討 94
6.1.2 實用技術方法涉及的內容 94
6.2套用系統架構設計 95
6.2.1 什麼是架構 95
6.2.2 幾種常見架構模式 96
6.2.2.1單機套用系統(Standalone) 96
6.2.2.2客戶機/伺服器(Client/Server)結構 97
6.2.2.3 多服務結構(SOA) 103
6.2.2.4 企業數據交換匯流排 105
6.2.3 實踐中的系統架構設計 106
6.2.3.1 兩層,三層還是四層 106
6.2.3.2四層以上的多層體系 109
6.2.3.3伺服器集群 111
6.2.3.4同構系統聚合 114
6.2.3.5調度系統 115
6.2.3.6異構系統集成 116
6.2.3.7數據存放與訪問 117
6.3系統分析與設計 119
6.3.1 軟體分析與設計的內容 119
6.3.2 系統整體結構的軟體描述 120
6.3.3 整體代碼框架搭建 124
6.3.4 系統公共庫設計 124
6.3.5 接口設計 125
6.4代碼編制與調試 127
6.4.1 程式結構搭建 127
6.4.2 多執行緒/多進程程式設計 130
6.4.2.1 什麼時候採用多執行緒/多進程 130
6.4.4.2 技術要點 131
6.4.3 編輯 133
6.4.4 編譯 134
6.4.5 調試 136
6.4.5.1列印語句,DEBUG開關與出錯處理 137
6.4.5.2 gdb與dbx 137
6.4.5.3多執行緒/多進程程式調試 138
6.4.5.4 記憶體異常,智慧型指針與valgrind141
6.4.6 類型安全 146
6.4.7 跨平台程式設計 147
6.4.7.1 字序問題 147
6.4.7.2 32位與64位 148
6.4.7.3 編碼問題 149
6.4.8開源軟體代碼 150
6.5面向對象——正確理解與使用 151
6.5.1何時使用面向對象 152
6.5.2如何使用面向對象 153
6.5.2.1合理分析與設計對象關係 153
6.5.2.2使用成熟設計模式 158
6.6設計的結束與輸出 159
6.6.1實效的制度化,而非教條的制度化 159
6.6.2強化設計結束準則 159
6.6.3設計階段的輸出文檔 160
6.7 本章小結 161
七、軟體測試——質量保證的重要環節 162
7.1測試技術綜述 162
7.1.1測試的階段 162
7.1.2測試的種類 163
7.1.3常用的測試工具 163
7.1.3.1代碼測試工具 163
7.1.3.2 功能測試工具 164
7.1.3.3 性能測試工具 164
7.1.3.4測試管理工具164
7.1.3.5 其它輔助測試工具 165
7.1.4測試步驟 165
7.2 軟體測試中幾個實用問題 166
7.2.1手工測試166
7.2.1.1 程式設計師自編程測試 167
7.2.1.2 測試人員手工測試 169
7.2.2自動化測試 169
7.2.3測試用例的制定 169
7.2.4關於測試驅動開發171
7.2.5測試時間估算 172
7.2.6測試人員的素質 173
7.3對測試標準的探討 174
7.3.1軟體BUG的分布特徵 175
7.3.2測試標準的制定原則 175
7.3.3測試人員的困惑——測試標準如何實施? 176
7.4軟體測試的本質探討與工業化生產 177
7.5本章小結 178
八、軟體項目管理方法論180
8.1軟體項目管理的產生 180
8.2軟體項目管理的作用與地位——為研發服務 181
8.3軟體項目管理的內容 181
8.4軟體項目管理的實用方法 182
8.4.1軟體規模劃分 182
8.4.2軟體類型劃分 184
8.4.3軟體項目實施的階段劃分 185
8.4.4軟體項目的最初需求確定 186
8.4.5軟體項目實施的資源確定 187
8.4.6軟體生產過程 188
8.4.6.1軟體生產過程的傳統理解 188
8.4.6.2實踐中的軟體生產過程 190
8.4.7軟體生產過程控制 194
8.4.8設計與編程的分界點 195
8.4.8.1什麼時候開始編程? 195
8.4.8.2 編碼過程中的設計工作 197
8.4.9測試與研發的交流 198
8.4.10文檔的生成與管理 199
8.4.10.1文檔的生成 199
8.4.10.2文檔的管理 199
8.4.11用軟體進行軟體項目管理 200
8.5軟體生產過程中的實用工具 200
8.5.1軟體配置管理系統 200
8.5.2軟體缺陷追蹤系統 201
8.6國外軟體項目管理簡析 203
8.6.1歐美國家軟體項目管理模式 203
8.6.2最為特色的模式——日本軟體項目管理 205
8.7本章小結 206
九、用軟體管理軟體 208
9.1 引言 208
9.2管理系統功能分析 209
9.2.1問題的提出 209
9.2.2 CMM規範 209
9.2.3策略 210
9.2.4實現管理的要素 210
9.2.5關鍵方法 211
9.3實用系統設計 212
9.3.1系統組成與總體構架 212
9.3.2 軟體開發的計畫與進度管理 214
9.3.3 評分系統 214
9.3.4 界面示例 214
9.4管理系統再分析 215
十、新一代軟體生產方法論探索——代碼驅動生產 217
10.1 原則與依據 217
10.1.1以質為本,以實踐為依據 217
10.1.2不能以類推法制定軟體生產理論框架 218
10.1.3軟體生產方法論應包括現有成果 218
10.2軟體生產技術回顧 219
10.2.1概述 219
10.2.2傳統軟體工業化生產技術分析 220
10.2.2.1基於構件的工業化生產思想再剖析 220
10.2.2.2可視化方法再分析 222
10.2.2.3復用是輔助手段,不是生產主體 223
10.2.2.4復用經驗永遠無法取代創新設計 223
10.2.2.5 構件組合無法創造完整軟體系統 224
10.2.2.6 編碼完成只是很少一部分工作 224
10.2.2.7程式設計師自由空間是軟體開發的重要內容 225
10.2.2.8相當數量的設計需要融合在編碼中 226
10.3先進軟體生產方法分析 226
10.3.1設計思維過程分析 226
10.3.1.1設計思維的過程 226
10.3.1.2從思維特徵出發看軟體生產困難 228
10.3.2 先進軟體生產方法應有的特徵 229
10.3.2.1代碼框架製作是先進軟體生產的重要內容 229
10.3.2.2設計思維的代碼表達類似於藝術表達 229
10.3.2.3人工編碼不可能完全擺脫 230
10.3.2.4需求的難以捉摸無法用技術手段改進 230
10.4代碼驅動生產的定義與內容 231
10.4.1軟體“工業化”生產的新涵義 231
10.4.2代碼驅動生產的要素 232
10.4.2.1構件技術是代碼框架的生產手段 232
10.4.2.2返工與往復的常態化 232
10.4.2.3代碼描述設計思維的標準化 233
10.4.2.4沒有過硬編碼技能的設計師不合格 234
10.4.3代碼驅動生產的組成內容 235
10.5軟體生產模型——代碼為核心的星形模型 236
10.5.1傳統軟體生產順序模型 236
10.5.2以代碼為核心的星形模型 237
10.6代碼驅動生產運行機制(Code Driving Prodution) 239
10.6.1代碼驅動生產運行機制綜述 239
10.6.2代碼驅動需求分析 241
10.6.3代碼驅動設計開發 242
10.6.3.1傳統設計理念再分析 242
10.6.3.2代碼驅動設計 245
10.6.3.3代碼驅動開發 249
10.6.4代碼驅動測試 249
10.7軟體過程——“代碼框架”上的並行協作 252
10.7.1軟體過程的兩個要素 252
10.7.2軟體生產平台——“代碼框架” 252
10.7.3並行協作的軟體過程 253
10.7.3.1常態與非常態疊代 253
10.7.3.2並行協作 254
10.7.4生產過程疊代再探 258
10.7.5代碼核心與文檔弱化 258
10.8 其它討論 259
10.9本章小結 260
後記 261
參考文獻 264