全面講解如何構(gòu)建穩(wěn)定可靠的軟件
《軟件工程入門經(jīng)典》揭秘專業(yè)開(kāi)發(fā)人員為設(shè)計(jì)和構(gòu)建穩(wěn)定、可靠、高效軟件所運(yùn)用的軟件工程技術(shù)和方法。本書通俗易懂,在大量案例的引導(dǎo)下,演示適用于任何編程語(yǔ)言的重要概念和技術(shù);即使你目前不具有編程、開(kāi)發(fā)和管理經(jīng)驗(yàn),同樣可以閱讀和學(xué)習(xí)本書。每章末尾附有精選習(xí)題,以測(cè)試你對(duì)知識(shí)的理解程度,引導(dǎo)你悟透主要概念。本書全面介紹了瀑布、生魚片、敏捷、RAD、Scrum、看板和極限編程等各種開(kāi)發(fā)方法所涉及的基本任務(wù)。
主要內(nèi)容
◆詳述軟件工程概念
◆闡釋參與軟件工程項(xiàng)目的團(tuán)隊(duì)成員的角色和職責(zé)
◆指出軟件工程項(xiàng)目都必須經(jīng)歷哪些重要階段才能開(kāi)發(fā)出功能卓越的可靠應(yīng)用程序
◆詳述主流軟件開(kāi)發(fā)方法及其處理重要開(kāi)發(fā)任務(wù)的不同方式
◆提供從每章主要知識(shí)點(diǎn)引申的習(xí)題
◆附有詳明的軟件工程術(shù)語(yǔ)表
◆詳述軟件工程概念
◆闡釋參與軟件工程項(xiàng)目的團(tuán)隊(duì)成員的角色和職責(zé)
◆指出軟件工程項(xiàng)目都必須經(jīng)歷哪些重要階段才能開(kāi)發(fā)出功能卓越的可靠應(yīng)用程序
◆詳述主流軟件開(kāi)發(fā)方法及其處理重要開(kāi)發(fā)任務(wù)的不同方式
◆提供從每章主要知識(shí)點(diǎn)引申的習(xí)題
◆附有詳明的軟件工程術(shù)語(yǔ)表
前 言
如今的編程是“程序員正努力創(chuàng)建一個(gè)更大更傻的程序”和“世界在嘗試創(chuàng)造更多更傻的人”之間的一種角逐。到目前為止,后者是贏家。
——Rick Cook
借助一些現(xiàn)代開(kāi)發(fā)工具,不需要事先設(shè)計(jì)和計(jì)劃,坐在鍵盤旁就可以敲打出一個(gè)可以工作的程序。某些情況下,這還是可行的。我的VB Helper(www.vb-helper.com)和C# Helper(www. csharphelper.com)站點(diǎn)就包含了數(shù)以千計(jì)的Visual Basic和C#示例程序——這些程序正是通過(guò)這樣的方法進(jìn)行創(chuàng)建的。每當(dāng)我有一個(gè)想法(或是別人向我提出一個(gè)問(wèn)題時(shí)),我都會(huì)敲擊出一個(gè)簡(jiǎn)單示例程序。
如果只有你自己使用而且只是短期使用這些程序,那么還好。如果只用于實(shí)驗(yàn),演示一些編程技巧,那么也還好。
如果是將這種草率粗糙的程序用于生產(chǎn),其結(jié)果將是災(zāi)難性的。即便作最樂(lè)觀的估計(jì),使用這些程序的非編程員也將很快束手無(wú)策。最糟的情況下,它們可以破壞計(jì)算機(jī),甚至嚴(yán)重影響你和朋友、同事之間的關(guān)系。
即使經(jīng)驗(yàn)最豐富的開(kāi)發(fā)人員有時(shí)也會(huì)被這種不靠譜的程序弄得焦頭爛額。我知道有人(我不想指名道姓,但我絕不會(huì)干這種事情)編寫一些簡(jiǎn)單的遞歸腳本來(lái)刪除某個(gè)目錄層次中的文件。遺憾的是,這樣的腳本將以遞歸方式爬行到目錄樹(shù)頂部,然后幸災(zāi)樂(lè)禍地刪除系統(tǒng)中的每個(gè)文件。這種腳本在停止前僅運(yùn)行大約5秒鐘,但它已經(jīng)破壞了足夠多的文件,從而導(dǎo)致必須重新安裝操作系統(tǒng)(實(shí)際上,一些開(kāi)發(fā)人員認(rèn)為每隔一年左右重裝一次操作系統(tǒng)是在鍛煉意志力。如果認(rèn)同這樣的看法,不妨嘗試一下)。
我還認(rèn)識(shí)一位經(jīng)驗(yàn)豐富的開(kāi)發(fā)人員。她在測(cè)試Windows系統(tǒng)設(shè)置時(shí),曾設(shè)法把每種系統(tǒng)顏色都設(shè)置為黑色,結(jié)果卻導(dǎo)致黑色光標(biāo)懸停在黑色的桌面上,顯示的是帶有黑色邊框、菜單以及文本的黑色窗口。此人(不是我)最終通過(guò)重啟的方式,通過(guò)另一臺(tái)色彩正常的計(jì)算機(jī),僅通過(guò)鍵盤快捷鍵修復(fù)了顏色設(shè)置。這確實(shí)是明智的勝利,但我懷疑她寧愿沒(méi)有發(fā)生這件事,也不情愿白白浪費(fèi)兩天的時(shí)間。
對(duì)于那些代碼量比較大或者是面向可信賴終端用戶的程序而言,這種自由散漫的開(kāi)發(fā)方式并不適用。為編寫出安全、有效、可靠的應(yīng)用程序,不能只坐下來(lái)敲敲鍵盤。你需要“軟件工程”。
本書主要介紹軟件工程。它將向我們闡釋軟件工程是什么以及如何借助它創(chuàng)建高效、靈活、健壯的應(yīng)用程序。
本書不能使你成為專家級(jí)的系統(tǒng)分析師、軟件架構(gòu)師、項(xiàng)目經(jīng)理或程序員,卻向我們闡釋了這些人做什么,以及對(duì)于高質(zhì)量的軟件開(kāi)發(fā)而言,他們?yōu)槭裁词遣豢苫蛉钡摹1緯榻B了一些入門級(jí)工具。你不用一個(gè)人去“戰(zhàn)斗”,或是帶領(lǐng)1000人給FAA開(kāi)發(fā)一個(gè)航空交通管制系統(tǒng),但它的確有助于在不同規(guī)模的開(kāi)發(fā)項(xiàng)目中高效工作(當(dāng)你的老板意味深長(zhǎng)地說(shuō)“是啊,我們主要使用的是深度結(jié)合了XP技術(shù)的敏捷開(kāi)發(fā)”時(shí),它也有助于你悟透這句話中的“玄機(jī)”)。
軟件工程的概念
軟件工程的比較正式的一個(gè)概念可能為:“設(shè)計(jì)、開(kāi)發(fā)、使用、維護(hù)軟件的結(jié)構(gòu)化分析方法!
更直觀地講,軟件工程是成功的軟件開(kāi)發(fā)所需要的一切,它包含將可能模糊不清、不成熟的想法轉(zhuǎn)變成為一個(gè)強(qiáng)大、直觀的應(yīng)用程序需要的所有步驟,從而能夠更好地滿足用戶未來(lái)日益變化的需求。
當(dāng)設(shè)計(jì)應(yīng)用程序時(shí),可能僅把軟件工程視為上述過(guò)程的開(kāi)始部分。畢竟,一個(gè)航空工程師只是設(shè)計(jì)飛機(jī)但不建造它們,或者是當(dāng)?shù)谝粋(gè)客艙滿員后再添加一個(gè)(盡管這里我設(shè)想的是使用背負(fù)在747這類飛機(jī)上的航天飛機(jī)來(lái)達(dá)到上述目的)。
軟件工程和航天工程(或者是其他類型的工程)一個(gè)很大的區(qū)別在于:軟件不是物理的。它只存在于計(jì)算機(jī)虛擬的世界里。這意味著很容易就能對(duì)程序的任何部分進(jìn)行修改,即使是在它徹底完成的情況下。相比之下,如果是等到一座橋梁建造完成后,才告訴結(jié)構(gòu)工程師你決定另外添加兩個(gè)車道。他肯定會(huì)喋喋不休地提供各種富有創(chuàng)意但脫離實(shí)際的建議。
軟件的虛擬特性所帶來(lái)的靈活性是一把雙刃劍。有利之處是:能夠在開(kāi)發(fā)的過(guò)程中精益求精,從而更好地滿足用戶的需求,如增加新特性、充分利用實(shí)現(xiàn)過(guò)程中所發(fā)現(xiàn)的一切有利之機(jī)、修改以適應(yīng)不斷變化的業(yè)務(wù)需求,甚至允許一些應(yīng)用程序讓用戶自己編寫腳本,執(zhí)行連開(kāi)發(fā)人員都意想不到的新任務(wù)。對(duì)于其他類型的工程而言,這種靈活性是不可能達(dá)到的。
遺憾的是:這種允許在軟件項(xiàng)目生命周期中進(jìn)行修改的靈活性,也能夠在開(kāi)發(fā)過(guò)程中的任何一點(diǎn)上把事情弄糟。增加一個(gè)新特性可能中斷現(xiàn)有的代碼,或者是把一個(gè)簡(jiǎn)潔、優(yōu)雅的設(shè)計(jì)變成一個(gè)無(wú)法收拾的亂攤子。在開(kāi)發(fā)過(guò)程中,不停地添加、刪除以及修改一些功能也使得系統(tǒng)的不同部分不能夠協(xié)調(diào)一致的工作。一些情況下,甚至不可能知道軟件的具體完成時(shí)間。
由于軟件具有很好的可拓展性,因此直到項(xiàng)目結(jié)束的任何一點(diǎn)上,都可以進(jìn)行設(shè)計(jì)決策。事實(shí)上,在最初的發(fā)行后,成功的應(yīng)用程序通常會(huì)繼續(xù)演化很長(zhǎng)時(shí)間。例如,微軟的Word已經(jīng)演化了近30年的時(shí)間(有時(shí)會(huì)變得很好,有時(shí)則很糟。還記得微軟辦公系統(tǒng)中的那個(gè)大眼回形針助手嗎?它是變得更好還是更糟呢?反正我是有一段時(shí)間沒(méi)看見(jiàn)它了)。
隨時(shí)都可以進(jìn)行修改的事實(shí),意味著需要把整個(gè)開(kāi)發(fā)過(guò)程視為單一、長(zhǎng)期的復(fù)雜任務(wù)。不能只“策劃”一個(gè)宏偉的設(shè)計(jì),讓程序員不辭辛苦地完成所有任務(wù)。最宏觀的那些設(shè)計(jì)決策可以提前制定,軟件開(kāi)發(fā)當(dāng)然要分階段,但是這些階段要相互銜接,要通盤考慮。
軟件工程之所以重要的原因
軟件開(kāi)發(fā)在概念上相對(duì)比較簡(jiǎn)單:有一個(gè)想法,然后將這個(gè)想法變成有用的程序。遺憾的是,對(duì)于具體的項(xiàng)目而言,一個(gè)簡(jiǎn)單概念有無(wú)數(shù)種出錯(cuò)的方式。程序員可能并不了解客戶的所想和所需,因此他們創(chuàng)建了錯(cuò)誤的應(yīng)用程序,其中充滿bug,使用起來(lái)令人沮喪,無(wú)法修改,也不能進(jìn)一步完善。這樣的程序可能十分高效,但讓人迷惑不解,以至于需要解謎的博士學(xué)位才能使用它。一個(gè)絕對(duì)完美的應(yīng)用程序甚至可能被內(nèi)部業(yè)務(wù)策略或市場(chǎng)規(guī)律所扼殺。
軟件工程包含了很多可以用來(lái)避免陷阱的技術(shù)。否則,這些陷阱可能在將來(lái)的某個(gè)時(shí)候葬送你的項(xiàng)目。它能夠確保你的應(yīng)用程序有效、可用、可維護(hù)。它有助于按照計(jì)劃完成整個(gè)項(xiàng)目各主要階段的任務(wù),并且確保在預(yù)算內(nèi)如期完成整個(gè)項(xiàng)目。也許最重要的是:軟件工程的這種靈活性,可以讓我們?cè)跊](méi)有完全變更計(jì)劃和預(yù)算的前提下,對(duì)軟件進(jìn)行修改,以滿足一些非預(yù)期的需求。
簡(jiǎn)言之,軟件工程有助于控制軟件開(kāi)發(fā)過(guò)程中所出現(xiàn)的一些意料不到的看似混亂不堪的局面。
本書讀者對(duì)象
參與軟件開(kāi)發(fā)工作的每個(gè)人都應(yīng)該對(duì)軟件工程有一個(gè)基本的了解,無(wú)論是確定軟件用途和功能的執(zhí)行客戶(executive customer),還是最后使用應(yīng)用程序產(chǎn)品(以及報(bào)告bug)的終端客戶、監(jiān)督其他開(kāi)發(fā)人員(不要玩太多《彩球連線》)的首席開(kāi)發(fā)者,或是為每周的會(huì)議準(zhǔn)備甜甜圈的伙計(jì)——你要知道如何整合所有的參與者。這些人中的任何失誤(特別是提供甜甜圈的人)都將影響其他人,因此每個(gè)人都知道項(xiàng)目正轉(zhuǎn)向?yàn)?zāi)難的警告標(biāo)志是至關(guān)重要的。
本書主要面向那些沒(méi)有太多經(jīng)驗(yàn)的軟件工程人員。它并不需要你具備軟件開(kāi)發(fā)、項(xiàng)目管理以及編程的任何經(jīng)驗(yàn)(我猜測(cè)大多數(shù)讀者都有一些制作甜甜圈的經(jīng)驗(yàn),但這并非必要)。
即便對(duì)這些主題有一定的認(rèn)識(shí),特別是編程方面,也可以獲益于本書。如果一直關(guān)注的只是所在項(xiàng)目的部分主題,為有助于引導(dǎo)該項(xiàng)目走向成功,仍需要了解這些部分之間如何相互影響。
例如,在我把開(kāi)發(fā)過(guò)程作為一個(gè)整體認(rèn)真看待之前,我已從事過(guò)數(shù)年的程序員工作,甚至參與了一些較大規(guī)模項(xiàng)目的開(kāi)發(fā)工作。我知道其他人在編寫用例和部署計(jì)劃,但我只關(guān)注我的那部分工作。直到后來(lái),我在項(xiàng)目中擔(dān)任了一個(gè)較高層的角色,才真正了解該項(xiàng)目的整個(gè)過(guò)程。
本書與如何編程無(wú)關(guān)。它主要闡釋一些可用的編程技巧,例如,如何編寫足夠靈活的代碼,以處理不可避免的軟件變更請(qǐng)求;如何讓代碼更易于調(diào)試(至少你的代碼將是如此);如何讓你的代碼能夠在以后更完善和易于維護(hù)(面向更多的軟件變更請(qǐng)求)。所有這些都是一些概要性內(nèi)容,并不需要你知道如何編程。
如果你從事的并非程序員工作,如終端用戶或項(xiàng)目經(jīng)理,即使不直接使用它,也將發(fā)現(xiàn)書中的內(nèi)容非常有趣。同時(shí),你將驚奇地發(fā)現(xiàn):一些技巧也適用于一些非編程問(wèn)題。例如,用于生成問(wèn)題解決方案的方法同樣適用于所有類型的問(wèn)題,并非只有編程決策(也可以這樣問(wèn)開(kāi)發(fā)人員:“你在單元測(cè)試前使用斷點(diǎn)和黑盒測(cè)試嗎?”看看他們是否理解你正在談?wù)摰脑掝});旧,你正在使用黑盒測(cè)試判斷這些開(kāi)發(fā)人員是否了解黑盒測(cè)試,詳見(jiàn)第8章“測(cè)試”。
方法
本書分為兩個(gè)部分。第Ⅰ部分主要介紹軟件開(kāi)發(fā)的一些基本任務(wù),如設(shè)計(jì)、編碼、測(cè)試。本書的第Ⅱ部分主要介紹一些常見(jiàn)的軟件開(kāi)發(fā)模型。
然而,在能夠開(kāi)始從事軟件開(kāi)發(fā)項(xiàng)目工作之前,還是需要準(zhǔn)備一下。為了能夠在整個(gè)項(xiàng)目中保持對(duì)進(jìn)度的跟蹤,你需要一些工具和技術(shù)。第1章“軟件工程概覽”主要介紹這些開(kāi)始前的準(zhǔn)備活動(dòng)。
完成這些前期的準(zhǔn)備后,可用來(lái)進(jìn)行軟件開(kāi)發(fā)的方法有很多。所有這些方法都有一個(gè)共同的目標(biāo)——開(kāi)發(fā)可用的軟件,因此它們必須處理近乎相同的任務(wù),如需求收集、制定計(jì)劃、編寫實(shí)際代碼。本書的第Ⅰ部分主要介紹這些任務(wù)。第1章主要對(duì)這些任務(wù)進(jìn)行概述;第2章~第11章將詳細(xì)介紹這些任務(wù),同時(shí)將探討如何有效完成這些任務(wù)。
本書第Ⅱ部分介紹了一些目前較流行的軟件開(kāi)發(fā)方法。所有這些模型都要解決本書前面章節(jié)所介紹的相同問(wèn)題,只不過(guò)方式不同。其中的一些模型側(cè)重于可預(yù)測(cè)性,以便能夠了解到底需要提供何種軟件功能以及何時(shí)提供;而其他一些模型關(guān)注的是盡快構(gòu)建大多數(shù)功能,即使這意味著與最初的設(shè)計(jì)相比有一些偏差。第12章~第14章主要介紹一些最常見(jiàn)的軟件開(kāi)發(fā)模型。
上述就是本書針對(duì)軟件工程的基本學(xué)習(xí)路線。首先,要了解完成軟件開(kāi)發(fā)的一些基本任務(wù);然后,了解處理這些任務(wù)的一些基本模型。
然而,很多人都難以適應(yīng)羅列式的枯燥學(xué)習(xí),為讓書中的內(nèi)容更易于掌握,本書也包含了其他一些元素。書中每一章的后面都附有練習(xí),它們可用來(lái)檢測(cè)對(duì)每章內(nèi)容的掌握程度。我并不喜歡那些只是讓人簡(jiǎn)單復(fù)述每章內(nèi)容的練習(xí)(快速問(wèn)答:軟件“縹緲不定”的性質(zhì)的一些優(yōu)勢(shì)和不足是什么?),大多數(shù)練習(xí)主要用來(lái)對(duì)每章的主要內(nèi)容進(jìn)行拓展。在學(xué)習(xí)每一章內(nèi)容之后,希望大家能夠去思考一些新的方法。
部分練習(xí)是作為某部分內(nèi)容的補(bǔ)充材料出現(xiàn)的,因此和測(cè)試題相比,附錄A中的那些問(wèn)題更像拓展內(nèi)容和思維實(shí)驗(yàn)。
強(qiáng)烈推薦至少瀏覽并思考一下這些問(wèn)題,然后琢磨一下自己是否理解。所有答案都包含在附錄A“習(xí)題答案”中。
本書主要內(nèi)容(以及非本書主要內(nèi)容)
本書主要介紹軟件工程,例如,完成一個(gè)成功的軟件項(xiàng)目必須執(zhí)行的任務(wù),以及用來(lái)實(shí)現(xiàn)我們目標(biāo)的一些最常見(jiàn)的開(kāi)發(fā)模型。雖然它并未涵蓋每一個(gè)細(xì)節(jié),但的確對(duì)整個(gè)軟件開(kāi)發(fā)過(guò)程進(jìn)行了詳細(xì)探討。
本書并未囊括每一個(gè)可能的軟件模型。事實(shí)上,目前軟件行業(yè)使用的開(kāi)發(fā)模型有數(shù)十種(可能數(shù)百種)。本書只是對(duì)其中最常見(jiàn)的一些開(kāi)發(fā)方法進(jìn)行了簡(jiǎn)要介紹。
如果打算深入了解某種特殊的軟件開(kāi)發(fā)方法,可以求助于很多與它有關(guān)的一些書籍和網(wǎng)站。很多開(kāi)發(fā)模型都有自己的推廣機(jī)構(gòu)(都有網(wǎng)站),例如www.extremeprogramming.org、agilemanifesto.org以及www.scrum.org。
本書并不是一本有關(guān)軟件開(kāi)發(fā)技巧和提示的百科全書。它僅介紹了和軟件開(kāi)發(fā)有關(guān)的一些常見(jiàn)思想和理念,旨在幫助我們輕松地開(kāi)發(fā)更高效、健壯的軟件產(chǎn)品。本書主要探討較高層次上的軟件工程問(wèn)題,所以并未囊括使程序更加完善的所有“竅門”。本書的內(nèi)容并非針對(duì)某種特定的編程語(yǔ)言,所以也不可能使用屬于某種特定編程語(yǔ)言的一些工具和技巧。
需要的一些工具
閱讀本書不需要任何工具,需要的是閱讀本書的能力(還有眼鏡,或者是文本-聲音轉(zhuǎn)換工具——如果有本書的電子版;或者是讓朋友讀給你聽(tīng);好吧,我猜你有好幾種選擇)。
為了能夠真正參與到某個(gè)項(xiàng)目的開(kāi)發(fā)中,可能需要很多工具。如果是開(kāi)發(fā)小型的個(gè)人項(xiàng)目,則可能只需要像Visual Studio、Eclipse、RAD Studio之類的編程環(huán)境。對(duì)于比較大型的團(tuán)隊(duì)開(kāi)發(fā)而言,還需要項(xiàng)目管理、文檔(文字處理)、修改跟蹤、軟件修訂跟蹤等其他工具。當(dāng)然,還需要其他開(kāi)發(fā)人員的幫助。本書將對(duì)這些工具一一介紹,但閱讀本書不需要這些工具。
本書約定
為有助于更好地閱讀本書,同時(shí)跟蹤軟件工程的一些最新技術(shù),本書使用了以下約定:
側(cè)邊欄
類似這樣的側(cè)邊欄包含有一些其他方面的信息和主題。
警告
這種類型的文本框中的內(nèi)容是和其周圍文本有直接關(guān)系的重要信息。一個(gè)軟件項(xiàng)目有多種失敗的可能,這些信息提醒你應(yīng)該避免的一些“最差實(shí)踐”。
注意
這些文本框用來(lái)表示和當(dāng)前內(nèi)容有關(guān)的說(shuō)明、提示、建議、技巧以及旁白。
至于文本中的樣式:
● 鍵盤敲擊的顯示方式是這樣的:Ctrl+A,這意味著在按下Ctrl(Control或CTL或你鍵盤上的其他標(biāo)記方式 )鍵的同時(shí)按下A鍵。
● 本書幾乎沒(méi)有實(shí)際的程序代碼,因?yàn)槲也⒉恢滥闼褂玫木幊陶Z(yǔ)言(若有的話)。如果是代碼,其顯示方式如下:
//如果a和b互質(zhì),則返回ture
private bool AreRelativelyrime(int a, int b)
{
// Only 1 and -1 are relatively prime to 0.
if (a = 0) return ((b == 1) || (b == -1));
if (b = 0) return ((a == 1) || (a == -1));
int gcd = GCD(a, b);
return ((gcd == 1)) || (gcd == -1));
}
(不必?fù)?dān)心不理解上述代碼,正文中有解釋)。
● 文件名稱、URL以及文本中出現(xiàn)的少量代碼的顯示方式是這樣的:www.csharphelper.com。
勘誤
我已竭盡全力避免書中的一些錯(cuò)誤。本書的文本已經(jīng)通過(guò)了一支小規(guī)模的編輯隊(duì)伍和技術(shù)審閱們的審核。然而,正向書中介紹的那樣,任何重大的項(xiàng)目無(wú)一例外都曾出現(xiàn)過(guò)錯(cuò)誤。我能期望的最好的結(jié)果是:剩下的都是小錯(cuò)誤,它們還不至于影響對(duì)本書文字的理解。
如果在閱讀本書的過(guò)程發(fā)現(xiàn)有錯(cuò)誤(像是拼寫錯(cuò)誤、代碼碎片或是不能理解的任何地方),那么我將非常感激你的反饋。我將通過(guò)本書的勘誤頁(yè)面登出你的反饋,這樣有利于其他讀者更好地理解本書,同時(shí)也能幫助我進(jìn)一步完善此書。
如欲查閱本書的勘誤頁(yè)面,請(qǐng)?jiān)L問(wèn)www.wrox.com/go/beginningsoftwareengineering,然后在本書詳細(xì)信息頁(yè)面上單擊Book Errata鏈接?梢栽谠擁(yè)面上查看已提交的和Wrox編輯們張貼的所有勘誤信息。你也可以訪問(wèn)www.wrox.com/misc‐pages/booklist.shtml,查看Wrox已出版的所有書籍列表(包含每本書的勘誤信息)。
如果沒(méi)有在Book Errata頁(yè)面發(fā)現(xiàn)你提交的錯(cuò)誤,請(qǐng)?jiān)L問(wèn)www.wrox.com/contact/ techsupport.shtml,并在此頁(yè)面上完成表格的填寫,提交所發(fā)現(xiàn)的錯(cuò)誤。經(jīng)過(guò)嚴(yán)格訓(xùn)練的編輯們將迅速檢查此信息(通過(guò)給我發(fā)送一封電子郵件)。如果必要,那么他們將馬上在本書的勘誤頁(yè)面上張貼勘誤信息,并在本書的后續(xù)版本中修訂相應(yīng)錯(cuò)誤。
p2p.wrox.com
通過(guò)P2P論壇p2p.wrox.com(P2P是指“Programmer to Programmer”,但因?yàn)楸緯⒎侵会槍?duì)程序員,因此這里我特意用“Person to Person”進(jìn)行表示)提交反饋、咨詢和本書有關(guān)的一些問(wèn)題也是不錯(cuò)的方法。
這些論壇都是基于Web的系統(tǒng),可以在上面張貼和Wrox書籍以及相關(guān)技術(shù)有關(guān)的一些信息,同其他讀者、技術(shù)用戶以及作者(像是我)互動(dòng)。這些論壇都提供有訂閱功能。每當(dāng)論壇有新帖提交時(shí),我們選擇的感興趣的話題,將通過(guò)電子郵件的形式發(fā)送給我們。這些論壇的活躍用戶包括Wrox的作者、編輯、其他行業(yè)專家以及讀者群體。
只需要完成以下步驟,就可以加入這些論壇:
(1) 訪問(wèn) p2p.wrox.com,單擊Register鏈接;
(2) 閱讀使用說(shuō)明,然后單擊Agree;
(3) 填寫一些必要信息以及你打算提供的可選信息,然后單擊 Submit;
(4) 你將收到一封有關(guān)如何驗(yàn)證賬戶以及完成加入過(guò)程的電子郵件。
快來(lái)加入論壇
不需要加入P2P,就可以閱讀論壇信息。但如果要發(fā)貼,那么就必須要加入。不用擔(dān)心Wrox給你的郵箱發(fā)送垃圾郵件(至少,他們過(guò)去從未如此)。他們這樣做的目的只是為了防止一些“網(wǎng)絡(luò)惡魔”不會(huì)冒充你的名字發(fā)帖。
加入后,就可以發(fā)帖,回復(fù)其他讀者的帖子,并且可以在任何時(shí)間閱讀網(wǎng)上的信息。如果打算接收某個(gè)特殊論壇的新郵件消息,則可以通過(guò)論壇列表里的論壇名稱,單擊Subscribe to this Forum圖標(biāo)。
請(qǐng)務(wù)必要閱讀P2P FAQ上的有關(guān)論壇軟件如何工作的問(wèn)答,以及針對(duì)P2P和Wrox書籍的一些問(wèn)答。閱讀這些FAQ,請(qǐng)單擊P2P頁(yè)面上的FAQ鏈接。
這些P2P論壇讓其他讀者能夠從你的問(wèn)題及其解答中受益。我也非常關(guān)注本書的論壇,只要能夠提供幫助,就一定會(huì)予以回應(yīng)。
一些重要的URL
下面列舉和本書有關(guān)的一些重要URL:
● www.wrox.com/go/beginningsoftwareengineering——本書的網(wǎng)頁(yè)。
● p2p.wrox.com——Wrox P2P論壇。
● www.wrox.com——Wrox的網(wǎng)站,包含有勘誤和其他信息?梢酝ㄟ^(guò)書名或ISBN檢索。
● RodStephens@CSharpHelper.com——我的電子郵件地址。讓我們保持聯(lián)系吧!
● www.CSharpHelper.com——我的C#站點(diǎn),包含有數(shù)以千計(jì)的針對(duì)C#開(kāi)發(fā)人員的提示、技巧以及示例。
● www.vb-helper.com——我的Visual Basic站點(diǎn),包含有數(shù)以千計(jì)的針對(duì)Visual Basic開(kāi)發(fā)人員的提示、技巧以及示例。
聯(lián)系作者
如果有任何問(wèn)題、意見(jiàn)或建議,都可以給我發(fā)送電子郵件(RodStephens@CSharpHelper.com)。我不敢保證能幫助你解決每一個(gè)問(wèn)題,但我承諾將盡力幫助你。
免責(zé)聲明
軟件工程并非總是最激動(dòng)人心的話題,所以為了能讓讀者保持頭腦清醒并且興趣盎然,書中所選擇的一些示例都極具幽默色彩。如果你將本書置于床頭,作為失眠治療的最后一劑良藥,那么我就失敗了。
那些極具才華的軟件工程師不必閱讀本書。我并沒(méi)有不尊重他們的意思,因?yàn)橐獮榭蛻糸_(kāi)發(fā)高質(zhì)量的應(yīng)用程序,他們要長(zhǎng)期工作(至于那些缺乏才干的軟件工程師,他們也不需要閱讀本書,因?yàn)樗麄兊氖」ぷ鹘?jīng)歷比我更有說(shuō)服力)。
我也無(wú)意對(duì)書中所介紹的一些開(kāi)發(fā)模型“大打折扣”。每一種開(kāi)發(fā)模型都來(lái)之不易,無(wú)論過(guò)去或現(xiàn)在,它們都將在軟件工程領(lǐng)域占有一席之地。
由于本書篇幅有限,一些軟件開(kāi)發(fā)方法和最佳編程實(shí)踐有所遺漏在所難免,即使是書中介紹的一些方法也未能覆蓋其全貌。
如果對(duì)書中的一些內(nèi)容有異議,或者打算提供某個(gè)主題更詳細(xì)的信息,抑或是介紹自己正在使用的一些軟件技術(shù)或變體,那么請(qǐng)加入Wrox P2P論壇,與大家一起分享。論壇上的“小伙伴們”都試圖提高自己的開(kāi)發(fā)技巧,所以我們拭目以待。事實(shí)上,學(xué)習(xí)和提高開(kāi)發(fā)技術(shù)是許多敏捷方法的規(guī)定要求,因此加入論壇是必需的。
所以,請(qǐng)戴好眼鏡,喝一杯含咖啡因的飲料,準(zhǔn)備步入軟件工程的殿堂吧!
Rod Stephens兒時(shí)夢(mèng)想成為數(shù)學(xué)家,但當(dāng)在麻省理工學(xué)院學(xué)習(xí)時(shí),他發(fā)現(xiàn)編程非常有趣,從此便開(kāi)始了專業(yè)的編程生涯。在其職業(yè)生涯中,他從事過(guò)很多不同領(lǐng)域的應(yīng)用程序開(kāi)發(fā),如電話交換、計(jì)費(fèi)、維修調(diào)度、稅務(wù)處理、污水處理、演唱會(huì)門票銷售、制圖以及專業(yè)足球運(yùn)動(dòng)員培訓(xùn)。
十多年來(lái),Rod 一直都是“微軟Visual Basic 有價(jià)值專家(MVP)”,曾教授過(guò)一些編程的入門課程。他撰寫過(guò)30 多本書,并且這些書籍還都被翻譯成不同的語(yǔ)言。他撰寫過(guò)250 多篇雜志文章,主要涉及Visual Basic、C#、Visual Basic for Applications、Delphi 以及Java。
Rod 廣受歡迎的VB Helper 站點(diǎn)(www.vb-helper.com)包含有數(shù)千個(gè)針對(duì)Visual Basic 程序開(kāi)發(fā)人員的提示、技巧以及示例程序頁(yè)面。他的C# Helper 站點(diǎn)(www.csharphelper.com)包含類似的一些C#開(kāi)發(fā)資源。
可以通過(guò)RodStephens@CSharpHelper.com 或RodStephens@vb-helper.com 和Rod 保持聯(lián)系。
第Ⅰ部分 進(jìn)階
第1章 軟件工程概覽 3
1.1 需求收集 3
1.2 概要設(shè)計(jì) 4
1.3 詳細(xì)設(shè)計(jì) 5
1.4 開(kāi)發(fā) 5
1.5 測(cè)試 6
1.6 部署 7
1.7 維護(hù) 8
1.8 總結(jié)和反思 8
1.9 一次性處理所有事項(xiàng) 8
1.10 本章小結(jié) 9
第2章 入手之前 13
2.1 文檔管理 13
2.2 歷史文檔 15
2.3 電子郵件 16
2.4 代碼 18
2.5 代碼文檔 18
2.6 應(yīng)用程序文檔 21
2.7 本章小結(jié) 21
第3章 項(xiàng)目管理 25
3.1 管理支持 26
3.2 項(xiàng)目管理 27
3.2.1 PERT圖 28
3.2.2 關(guān)鍵路徑方法 33
3.2.3 甘特圖 35
3.2.4 軟件日程安排 36
3.2.5 估算時(shí)間 36
3.3 風(fēng)險(xiǎn)管理 41
3.4 本章小結(jié) 42
第4章 需求收集 45
4.1 需求定義 46
4.1.1 清晰 46
4.1.2 沒(méi)有歧義 46
4.1.3 一致 47
4.1.4 優(yōu)先級(jí)排序 47
4.1.5 可驗(yàn)證 50
4.1.6 應(yīng)避免使用的詞 51
4.2 需求分類 51
4.2.1 受眾導(dǎo)向的需求 51
4.2.2 FURPS 54
4.2.3 FURPS+ 54
4.2.4 通用需求 56
4.3 收集需求 57
4.3.1 傾聽(tīng)客戶(和用戶)的需要 57
4.3.2 使用5W(和一個(gè)H) 57
4.3.3 研究用戶 59
4.4 細(xì)化需求 60
4.4.1 復(fù)制現(xiàn)有系統(tǒng) 60
4.4.2 未卜先知 61
4.4.3 頭腦風(fēng)暴 62
4.5 記錄需求 64
4.5.1 UML 64
4.5.2 用戶故事 65
4.5.3 用例 65
4.5.4 原型 66
4.5.5 需求說(shuō)明 67
4.6 確認(rèn)和驗(yàn)證 67
4.7 更改需求 67
4.8 本章小結(jié) 68
第5章 概要設(shè)計(jì) 71
5.1 縱覽全局 72
5.2 指定的事項(xiàng) 73
5.2.1 安全性 73
5.2.2 硬件 74
5.2.3 用戶接口 75
5.2.4 內(nèi)部接口 76
5.2.5 外部接口 76
5.2.6 架構(gòu) 77
5.2.7 報(bào)表 83
5.2.8 其他輸出 83
5.2.9 數(shù)據(jù)庫(kù) 84
5.2.10 配置數(shù)據(jù) 86
5.2.11 數(shù)據(jù)流及狀態(tài) 86
5.2.12 培訓(xùn) 87
5.3 UML 87
5.3.1 結(jié)構(gòu)圖 88
5.3.2 行為圖 90
5.3.3 交互圖 93
5.4 本章小結(jié) 95
第6章 詳細(xì)設(shè)計(jì) 97
6.1 面向?qū)ο笤O(shè)計(jì) 98
6.1.1 識(shí)別類 99
6.1.2 創(chuàng)建繼承體系 99
6.1.3 對(duì)象組合 103
6.2 數(shù)據(jù)庫(kù)設(shè)計(jì) 104
6.2.1 關(guān)系數(shù)據(jù)庫(kù) 104
6.2.2 第一范式 106
6.2.3 第二范式 109
6.2.4 第三范式 111
6.2.5 更高級(jí)的規(guī)范化 112
6.3 本章小結(jié) 113
第7章 開(kāi)發(fā) 117
7.1 使用正確的工具 118
7.1.1 硬件 118
7.1.2 網(wǎng)絡(luò) 119
7.1.3 開(kāi)發(fā)環(huán)境 119
7.1.4 源代碼控制 120
7.1.5 分析器 120
7.1.6 靜態(tài)分析工具 120
7.1.7 測(cè)試工具 121
7.1.8 源代碼格式器 121
7.1.9 重構(gòu)工具 121
7.1.10 培訓(xùn) 121
7.2 選擇算法 121
7.2.1 有效果 122
7.2.2 有效率 122
7.2.3 可預(yù)測(cè) 124
7.2.4 簡(jiǎn)潔 124
7.2.5 預(yù)包裝 125
7.3 自上而下的設(shè)計(jì) 125
7.4 編程提示和技巧 127
7.4.1 保持清醒 127
7.4.2 為人編寫代碼,并非計(jì)算機(jī) 127
7.4.3 注釋優(yōu)先 128
7.4.4 編寫自文檔化的代碼 130
7.4.5 保持小巧 131
7.4.6 保持專注 132
7.4.7 避免副作用 132
7.4.8 驗(yàn)證結(jié)果 133
7.4.9 實(shí)踐“進(jìn)攻式”編程 135
7.4.10 使用異常 136
7.4.11 首先編寫異常處理程序 136
7.4.12 切勿重復(fù)代碼 137
7.4.13 推遲優(yōu)化 137
7.5 本章小結(jié) 138
第8章 測(cè)試 141
8.1 測(cè)試的目的 142
8.2 永不消亡的bug 143
8.2.1 收益遞減 143
8.2.2 最后期限 143
8.2.3 影響 143
8.2.4 為時(shí)尚早 143
8.2.5 有用性 144
8.2.6 過(guò)時(shí) 144
8.2.7 這并非一個(gè)bug 144
8.2.8 沒(méi)有盡頭 145
8.2.9 有總比沒(méi)有好 145
8.2.10 修復(fù) bug很危險(xiǎn) 145
8.2.11 修復(fù)哪些bug 146
8.3 測(cè)試級(jí)別 146
8.3.1 單元測(cè)試 146
8.3.2 集成測(cè)試 148
8.3.3 自動(dòng)化測(cè)試 148
8.3.4 組件接口測(cè)試 149
8.3.5 系統(tǒng)測(cè)試 150
8.3.6 驗(yàn)收性測(cè)試 150
8.3.7 其他測(cè)試類型 151
8.4 測(cè)試技術(shù) 152
8.4.1 窮舉測(cè)試 152
8.4.2 黑盒測(cè)試 153
8.4.3 白盒測(cè)試 153
8.4.4 灰盒測(cè)試 153
8.5 測(cè)試習(xí)慣 154
8.5.1 清醒時(shí)再進(jìn)行測(cè)試和調(diào)試 154
8.5.2 測(cè)試自己的代碼 154
8.5.3 讓其他人測(cè)試你的代碼 155
8.5.4 修復(fù)自己的bug 156
8.5.5 修改前請(qǐng)“三思” 157
8.5.6 不要相信魔法 157
8.5.7 查看改變之處 157
8.5.8 修復(fù)bug,并非癥狀 158
8.5.9 對(duì)測(cè)試用例進(jìn)行測(cè)試 158
8.6 如何修復(fù)bug 158
8.7 估算bug的數(shù)量 159
8.7.1 跟蹤發(fā)現(xiàn)的bug 159
8.7.2 播種 160
8.7.3 林肯指數(shù) 161
8.8 本章小結(jié) 162
第9章 部署 165
9.1 范圍 166
9.2 計(jì)劃 166
9.3 切換 167
9.3.1 階段性部署 167
9.3.2 逐步切換 168
9.3.3 增量部署 169
9.3.4 并行測(cè)試 170
9.4 部署任務(wù) 170
9.5 部署錯(cuò)誤 171
9.6 本章小結(jié) 172
第10章 度量 175
10.1 慶祝會(huì) 176
10.2 缺陷分析 176
10.2.1 bug的種類 176
10.2.2 石川圖 178
10.3 軟件度量 181
10.3.1 好的屬性和度量指標(biāo)的一些特征 182
10.3.2 度量的用途 182
10.3.3 需要度量的對(duì)象 184
10.3.4 規(guī)模標(biāo)準(zhǔn)化 186
10.3.5 功能點(diǎn)標(biāo)準(zhǔn)化 188
10.4 本章小結(jié) 192
第11章 維護(hù) 195
11.1 維護(hù)成本 196
11.2 任務(wù)分類 197
11.2.1 完成性任務(wù) 197
11.2.2 適應(yīng)性任務(wù) 200
11.2.3 糾正性任務(wù) 201
11.2.4 預(yù)防性任務(wù) 203
11.2.5 個(gè)別bug 207
11.2.6 “非我發(fā)明” 207
11.3 任務(wù)執(zhí)行 208
11.4 本章小結(jié) 208
第Ⅱ部分 模型
第12章 預(yù)測(cè)模型 215
12.1 模型 215
12.2 預(yù)備知識(shí) 216
12.3 預(yù)測(cè)和自適應(yīng) 216
12.3.1 成功和失敗的標(biāo)志 217
12.3.2 利與弊 218
12.4 瀑布 219
12.5 帶有反饋的瀑布 220
12.6 生魚片 221
12.7 增量瀑布 222
12.8 V模型 224
12.9 系統(tǒng)開(kāi)發(fā)生命周期 224
12.10 本章小結(jié) 227
第13章 迭代模型 229
13.1 迭代與預(yù)測(cè) 230
13.2 迭代與增量 231
13.3 原型 232
13.3.1 原型的類型 233
13.3.2 優(yōu)缺點(diǎn) 234
13.4 螺旋模型 235
13.4.1 澄清 237
13.4.2 優(yōu)勢(shì)和不足 238
13.5 統(tǒng)一過(guò)程 239
13.5.1 優(yōu)勢(shì)和不足 240
13.5.2 RUP 241
13.6 潔凈室模型 241
13.7 本章小結(jié) 242
第14章 RAD 245
14.1 RAD的主要原則 246
14.2 James Martin RAD 249
14.3 敏捷開(kāi)發(fā) 249
14.3.1 自組織團(tuán)隊(duì) 252
14.3.2 敏捷方法 253
14.4 XP 256
14.4.1 XP的角色 257
14.4.2 XP的價(jià)值觀 257
14.4.3 XP實(shí)踐 258
14.5 Scrum 264
14.5.1 Scrum角色 264
14.5.2 Scrum沖刺 265
14.5.3 計(jì)劃撲克 266
14.5.4 燃盡圖 267
14.5.5 速率 268
14.6 精益軟件開(kāi)發(fā) 268
14.7 水晶方法 269
14.7.1 透明水晶 271
14.7.2 黃色水晶 272
14.7.3 橙色水晶 272
14.8 功能驅(qū)動(dòng)開(kāi)發(fā) 274
14.8.1 FDD角色 274
14.8.2 FDD階段 275
14.8.3 FDD迭代里程碑 277
14.9 敏捷統(tǒng)一過(guò)程 278
14.10 規(guī)范敏捷交付 280
14.10.1 DAD原則 280
14.10.2 DAD角色 280
14.10.3 DAD階段 281
14.11 動(dòng)態(tài)系統(tǒng)開(kāi)發(fā)方法 282
14.11.1 DSDM階段 282
14.11.2 DSDM原則 283
14.11.3 DSDM角色 284
14.12 看板軟件開(kāi)發(fā)方法 285
14.12.1 看板的一些原則 285
14.12.2 和看板有關(guān)的一些實(shí)踐 286
14.12.3 看板圖 286
14.13 本章小結(jié) 287
附錄A 習(xí)題答案 293
術(shù)語(yǔ)表 337