前 言
在60年代計算機發展初期,程式設計是少數聰明人幹的事。他們的智力與技能超群,編寫的程式既能控制弱智的計算機,又能讓別人看不懂、不會用。那個時期編程就跟捏泥巴一樣隨心所欲,於是他們很過分地把程式的集合稱為軟體,以便自己開心或傷心時再把程式捏個面目全非。人們就在這種美滋滋的感覺下熱情地編程,結果產生了一堆問題:程式質量低下,錯誤頻出,進度延誤,費用劇增……。這些問題導致了“軟體危機”。
在1968年,一群程式設計師、計算機科學家與工業界人士聚集一起共商對策。通過借鑑傳統工業的成功做法,他們主張通過工程化的方法開發軟體來解決軟體危機,並冠以“軟體工程”這一術語。三十年餘年來,儘管軟體的一些毛病如人類的感冒一樣無法根治,但軟體的發展速度超過了任何傳統工業,期間並未出現真真的軟體危機。這的確是前人的先見之明。如今軟體工程成了一門學科。
軟體工程主要講述軟體開發的道理,基本上是軟體實踐者的成功經驗和失敗教訓的總結。軟體工程的觀念、方法、策略和規範都是樸實無華的,平凡之人皆可領會,關鍵在於運用。我們不可以把軟體工程方法看成是諸葛亮的錦囊妙計─—在出了問題後才打開看看,而應該事先掌握,預料將要出現的問題,控制每個實踐環節,並防患於未然。研究軟體工程永遠做不到理論家那么瀟灑:定理證明了,就完事。
我在讀大學的十年里有八年從事軟體開發,儘管編寫了幾十萬行C++/C程式,也經歷了若干次小不點兒大的成功和失敗,可老感覺只學了些皮毛,心裡慌兮兮的。在博士研究生畢業前的半年裡,我告戒自己不應該再稀里糊塗地在程式堆里滾爬下去了,於是就面壁反省,做了一陣子木訥的和尚。在“打坐”時,每有心得體會便記錄下來,不知不覺湊成了八章經,我就給此經書起名為《軟體工程思想》。
經典的軟體工程書籍厚得象磚頭,或讓人望而卻步,或讓人看了心事重重。請寬恕我的幼稚,我試圖用三個問題:是什麼、為什麼、怎么辦,來解釋軟體工程的道理。所以本書薄得象餃子皮─—用來包“思想”這種有味道的“餡”。本書的八章經分別為:
第一章“軟體工程基本觀念”;
第二章“程式設計師與程式經理”;
第三章“項目計畫與質量管理”;
第四章“可行性分析與需求分析”;
第五章“系統設計”;
第六章“C++ 面向對象程式設計”;
第七章“測試與改錯”;
第八章“維護與再生工程”。
附錄“大學十年”可以充當飯後的水果。
我偶爾也擔心此書寫得太膚淺,內容少得可憐。就象一隻雞在水裡撲騰了幾下,並不能產生美味的雞湯。但是如果您化了幾分鐘時間翻閱本書的任意章節,您馬上就願意再化幾個小時一口氣讀完全書,並且樂得直拍桌子:“好!很好!非常好!”
您可以把這本科技書當小說看,但在看書時請不要吃東西,免得噴了別人或者嗆著自己。
如果您買了本書後覺得不值得,我一定賠償您的損失。
目錄
軟體工程思想
目錄
1序言、前言4
1.1序4
1.2前 言4
1.3致 謝5
2軟體工程基本觀念7
2.1軟體工程的目標與常用模型7
2.2軟體開發的基本策略9
2.2.1復用9
2.2.2分而治之10
2.2.3最佳化——折衷11
2.3一些不正確的觀念12
2.4一些有爭議的觀念13
2.5小 結14
3程式設計師與程式經理15
3.1了解程式設計師15
3.2了解程式經理17
3.3程式設計師升為經理後是否還要編程18
3.4經理與技術隊伍的建設18
3.5向錯誤與失敗學習20
3.6提高綜合素責21
3.7小結22
4項目計畫與質量管理22
4.1項目計畫23
4.1.1知己知彼23
4.1.2進度安排24
4.2零缺陷質量管理的觀念25
4.2.1高目標25
4.2.2可執行的規範26
4.3軟體的質量因素26
4.3.1正確性與精確性27
4.3.2性能與效率28
4.3.3易用性28
4.3.4可理解性與簡潔性28
4.3.5可復用性與可擴充性29
4.4質量檢查29
4.5小結31
5可行性分析與需求分析31
5.1可行性分析的要素32
5.1.1經濟32
5.1.2技術33
5.1.3社會環境34
5.1.4人35
5.2可行性分析案例35
5.2.1可行性分析案例之一36
5.2.2可行性分析案例之二38
5.2.3可行性分析案例之三42
5.3需求分析為什麼困難44
5.3.1客戶說不清楚需求44
5.3.2需求自身經常變動44
5.3.3分析人員或客戶理解有誤45
5.4如何進行需求分析46
5.4.1應該了解什麼46
5.4.2通過什麼方式去了解47
5.5小結47
6系統設計48
6.1體系結構設計49
6.1.1層次結構49
6.1.2客戶機/伺服器結構51
6.2模組設計53
6.2.1信息隱藏53
6.2.2內聚與耦合54
6.2.3封閉、開放性55
6.3數據結構與算法設計56
6.4用戶界面設計57
6.4.1界面設計中美的需求與導向作用57
6.4.2界面美的內涵58
6.5系統設計示例60
6.5.1設計背景60
6.5.2Intra3D 2.061
6.5.3支持協同工作的網路通訊開發系統 CNC 1.064
6.5.4套用示例69
6.6小 結69
7C++面向對象程式設計70
7.1C++面向對象程式設計的重要概念71
7.1.1類與對象72
7.1.2繼承與組合73
7.1.3虛函式與多態77
7.2良好的編程風格81
7.2.1命名約定81
7.2.2使用斷言82
7.2.3new、delete與指針83
7.2.4使用const85
7.2.5其它建議87
7.3小結88
8測試與改錯89
8.1對測試的理解89
8.1.1測試的目的90
8.1.2測試的心理要求90
8.1.3測試的真理90
8.1.4測試與質量的關係91
8.2測試人員的選擇91
8.2.1Microsoft公司的經驗教訓91
8.2.2測試人員的分工92
8.3測試的主要內容與常用方法93
8.3.1正確性測試93
8.3.2容錯性測試94
8.3.3性能與效率測試94
8.3.4易用性測試95
8.3.5文檔測試95
8.4改錯95
8.5小結96
9維護與再生工程97
9.1軟體維護的常識97
9.2維護的代價及其主要因素98
9.3再生工程99
9.3.1重構100
9.3.2逆向工程100
9.3.3前向工程100
9.4小 結100
第一章 軟體工程基本觀念
本章講述軟體工程的基本觀念,是關於軟體工程巨觀上的探討。如果你是軟體公司的老
板,用不著在第一線工作,那么看這一章就夠了。但你一定要讓員工們相信不停地工作是人
生最大的快樂,並且讓他們把本書看完。
1.1 節講述軟體工程的目標和常用的軟體工程模型。1.2 節講述軟體開發的基本策略:
“復用” 、 “分而治之” 、 “最佳化——折衷” ,有助於指導實踐者選擇方法和產生新方法。1.3
節例舉一些不正確的觀念,取材於早期軟體人員比較幼稚的想法,初學者可以引以為戒。1.4
節探討一些有爭議的觀念。
看完本章, 要樹立這樣的信念: 軟體開發過程中的坎坎坷坷, 仿佛只是人臉的凹凸不平,
用熱水毛巾一把就可抹平。讓我們高舉程式主義、軟體工程思想的偉大旗幟,緊密團結在以
Microsoft 為核心的軟體公司周圍,沿著比爾·蓋茨的生財之道,不分白天黑夜地編程,把
建設有中國特色的軟體產業的偉大事業全面推向 21 世紀。