斯琴巴圖
(1.內(nèi)蒙古師范大學(xué)科學(xué)技術(shù)史研究院,呼和浩特010022;2.內(nèi)蒙古婦女干部學(xué)校,呼和浩特010051)
軟件的質(zhì)量對(duì)于航空航天、軍工、醫(yī)療衛(wèi)生、自動(dòng)駕駛等大型系統(tǒng)和實(shí)時(shí)系統(tǒng)可謂極其重要。例如1978年哈特福德體育館倒塌,1996 年阿利亞納五號(hào)火箭發(fā)射失敗,2000 年Therac-25 醫(yī)療放射治療裝置讓患者暴露在過(guò)量輻射中的事故,2018 年10 月印尼獅航和2019 年3 月埃塞俄比亞航空公司的兩起波音737MAX飛機(jī)導(dǎo)致的空難都與軟件缺陷有關(guān)。運(yùn)用今天的軟件工程技術(shù)能否生產(chǎn)出高質(zhì)量的軟件,能否具有高可靠性?答案是肯定的!而且這種技術(shù)早在上世紀(jì)80 年代已經(jīng)被開(kāi)發(fā)出來(lái),但由于對(duì)軟件開(kāi)發(fā)人員技術(shù)門檻的要求過(guò)高,經(jīng)濟(jì)方面投入較大,以及軟件產(chǎn)業(yè)界普遍的共識(shí)——軟件通過(guò)維護(hù)升級(jí)可以不斷完善,沒(méi)必要第一次就生產(chǎn)出完美無(wú)缺的軟件的理念等因素限制了這種技術(shù)的推廣普及。這種技術(shù)被稱為形式化方法,凈室軟件工程(Cleanroom Software Engineering)便是形式化方法的一種變種,其可操作性比純形式化方法更強(qiáng)。凈室技術(shù)通過(guò)在IBM、愛(ài)立信、美國(guó)國(guó)家航空航天局(NASA)、美國(guó)國(guó)防部(DoD)及大量其他機(jī)構(gòu)的成功實(shí)踐證明了其自身的強(qiáng)大。1996 年DoD 軟件數(shù)據(jù)與分析中心在其所作的軟件方法比較分析中,報(bào)告凈室具有真實(shí)的價(jià)值和質(zhì)量?jī)?yōu)勢(shì)[1]。
美國(guó)計(jì)算機(jī)科學(xué)家、數(shù)學(xué)家、IBM 院士米爾斯(Harlan D. Mills)博士在IBM 聯(lián)邦系統(tǒng)部工作期間創(chuàng)立了凈室軟件工程,一種基于數(shù)學(xué)理論的以經(jīng)濟(jì)的方式生產(chǎn)高可靠性軟件的工程技術(shù)。這種技術(shù)從萌芽到成熟經(jīng)歷了近20 年的時(shí)間,米爾斯在其形成的過(guò)程中做了大量的工作,從而被稱為凈室軟件工程創(chuàng)始人。本文將通過(guò)展示米爾斯在凈室軟件工程方面的具體工作,討論其貢獻(xiàn),同時(shí)梳理凈室作為一種成熟方法的形成歷史過(guò)程。
米爾斯(1919-1996)是凈室軟件工程創(chuàng)始人,首席程序員團(tuán)隊(duì)方法的創(chuàng)始人,軟件工程思想領(lǐng)袖。他是IBM Fellow(IBM 院士),IBM 聯(lián)邦系統(tǒng)部門的軟件工程和技術(shù)主管和IBM 公司技術(shù)委員會(huì)的成員。他是1975 年召開(kāi)的第一屆軟件工程全國(guó)(美國(guó))大會(huì)的主席。1975 年到1981 年,他擔(dān)任IEEE 軟件工程學(xué)報(bào)的編輯;從1980 年到1983 年,他擔(dān)任IEEE 計(jì)算機(jī)學(xué)會(huì)的主管;1981 年,他是IEEE Fall CompCon 的主席。1985 年,他獲得了DPMA 杰出信息科學(xué)獎(jiǎng),1987 年獲得了J. D. Warnier 獎(jiǎng)。在米爾斯去世之后,為了紀(jì)念他,在1999 年,IEEE 計(jì)算機(jī)學(xué)會(huì)設(shè)立了Harlan D.Mills獎(jiǎng),主要獎(jiǎng)勵(lì)在軟件工程理論與實(shí)踐領(lǐng)域做出貢獻(xiàn)的學(xué)者。
米爾斯于1952 年在愛(ài)荷華州立大學(xué)獲得數(shù)學(xué)博士學(xué)位。從1954 年到1957 年,他在通用電氣的管理咨詢服務(wù)公司工作,1958 年創(chuàng)立了公司Mathematica,后來(lái)由Martin Marietta 收購(gòu)。1964 年至1987 年,米爾斯在IBM 公司聯(lián)邦系統(tǒng)部工作。于1996 年去世時(shí),米爾斯博士是佛羅里達(dá)理工學(xué)院(Florida Institute of Technology)的計(jì)算機(jī)科學(xué)教授,也是軟件工程技術(shù)公司(Vero Beach,F(xiàn)L and Knoxville,TN)的創(chuàng)始人,圖1 為米爾斯博士。
圖1 米爾斯(Harlan D.Mills)
凈室軟件工程是一種應(yīng)用數(shù)學(xué)和統(tǒng)計(jì)學(xué)理論以經(jīng)濟(jì)的方式生產(chǎn)高質(zhì)量軟件的工程技術(shù)?!皟羰摇币辉~來(lái)源于半導(dǎo)體工業(yè)的生產(chǎn)硬件的凈室[1]。半導(dǎo)體工業(yè)的凈室在生產(chǎn)產(chǎn)品的過(guò)程中,將預(yù)防缺陷產(chǎn)生作為最重要的事情,而不是之后排除故障。使用“凈室”命名,顯示了凈室軟件工程也將缺陷預(yù)防放在絕對(duì)重要的首位,其目標(biāo)是開(kāi)發(fā)零缺陷的軟件產(chǎn)品。凈室具有堅(jiān)實(shí)的理論基礎(chǔ),并由①統(tǒng)計(jì)質(zhì)量控制下的增量開(kāi)發(fā)技術(shù);②基于函數(shù)的規(guī)格、設(shè)計(jì)和驗(yàn)證技術(shù)(盒式結(jié)構(gòu)方法);③統(tǒng)計(jì)測(cè)試和軟件認(rèn)證技術(shù)等三大關(guān)鍵技術(shù)有機(jī)整合而成。它以凈室小組作為工作基本單元采用多人共同工作的方式生產(chǎn)、測(cè)試軟件產(chǎn)品。所以,它的工作成果都?xì)w集體(凈室小組),當(dāng)然出現(xiàn)問(wèn)題時(shí),也由集體承擔(dān)責(zé)任。
米爾斯在凈室方面最重要的一篇文章是1987 年9份發(fā)表在《IEEE Software》上的“凈室軟件工程”。該文章中首次提出“凈室軟件工程”的概念,并介紹了采用凈室軟件工程方法開(kāi)發(fā)的三個(gè)成功案例,統(tǒng)計(jì)式質(zhì)量控制在管理方面的好處,軟件統(tǒng)計(jì)屬性從何而來(lái),如何衡量一個(gè)軟件的質(zhì)量,功能驗(yàn)證的優(yōu)點(diǎn)和代替排錯(cuò)的原因、統(tǒng)計(jì)測(cè)試、增量開(kāi)發(fā)、軟件認(rèn)證等。該文中未提及盒式結(jié)構(gòu)方法,但提到了精確的規(guī)格說(shuō)明書,而盒式結(jié)構(gòu)中的黑盒正是精確描述軟件需求規(guī)格的工具。從米爾斯在1990 年發(fā)表的文章“統(tǒng)計(jì)質(zhì)量控制下的工程軟件”中可以探知盒式結(jié)構(gòu)方法已被納入凈室[2]。
1968 年10 月,NATO(北大西洋公約組織)在當(dāng)時(shí)的聯(lián)邦德國(guó)召開(kāi)了“軟件工程”國(guó)際學(xué)術(shù)會(huì)議。會(huì)議正式提出了“軟件危機(jī)”和“軟件工程”,并說(shuō)明通過(guò)“軟件工程”解決當(dāng)時(shí)的“軟件危機(jī)”。會(huì)議的發(fā)起人慕尼黑工業(yè)大學(xué)的計(jì)算機(jī)科學(xué)家Fritz Bauer 教授認(rèn)為,軟件工程是建立和使用一套合理的工程原則,以便經(jīng)濟(jì)地獲得可靠的、可以在實(shí)際機(jī)器上高效運(yùn)行的軟件[3]。其中,“工程原則”的意思包含了軟件工程除了要有方法、工具等技術(shù)措施以外,還應(yīng)該有必要的組織管理措施。會(huì)議上還提出了要建立軟件開(kāi)發(fā)和生產(chǎn)的數(shù)學(xué)基礎(chǔ)。之后在1969 年的軟件工程會(huì)議上,將軟件的正確性問(wèn)題和概念作為主題之一進(jìn)行了討論。這促使軟件的數(shù)學(xué)基礎(chǔ)和軟件正確性問(wèn)題成為軟件工程基礎(chǔ)的重要組成部分[4]。這種背景也是凈室基于數(shù)學(xué)理論,重視組織管理,并且將正確性證明作為重要方法的主要原因。
凈室軟件工程的理論基礎(chǔ)來(lái)自于數(shù)學(xué),具體為其軟件開(kāi)發(fā)方法基于數(shù)學(xué)的函數(shù)理論,其測(cè)試方法基于統(tǒng)計(jì)學(xué)。米爾斯意識(shí)到一個(gè)特定的程序像函數(shù)一樣有定義域到值域的映射,從而將程序看作是一個(gè)數(shù)學(xué)函數(shù)規(guī)則,致使函數(shù)理論和應(yīng)用成為軟件開(kāi)發(fā)和驗(yàn)證的基礎(chǔ)[5]。也正是基于該理論,后續(xù)才有了基于函數(shù)理論的程序正確性驗(yàn)證技術(shù)、增量開(kāi)發(fā)技術(shù)和盒式結(jié)構(gòu)方法。米爾斯的“大型系統(tǒng)中的自頂向下編程”(1970 年發(fā)表)、“結(jié)構(gòu)化程序設(shè)計(jì)的數(shù)學(xué)基礎(chǔ)”(1972 年發(fā)表)、“計(jì)算機(jī)程序設(shè)計(jì)新數(shù)學(xué)”(1975 年發(fā)表)和“如何正確編寫和認(rèn)識(shí)程序”(1975 年發(fā)表)等文章奠定了凈室方法的函數(shù)理論基礎(chǔ)。米爾斯與林格(R. C. Linger)、維特(B.I.Witt)三人合著的《結(jié)構(gòu)化編程:理論與實(shí)踐》是上世紀(jì)70、80 年代最有影響力的結(jié)構(gòu)化編程方面的著作之一,書中還提出了后來(lái)凈室方法中采用的一項(xiàng)重要技術(shù)——基于函數(shù)理論的程序正確性驗(yàn)證技術(shù)(功能驗(yàn)證)。
米爾斯的另一個(gè)觀點(diǎn)——軟件測(cè)試只是從無(wú)限的可能的軟件使用情況中抽取的樣本,奠定了凈室統(tǒng)計(jì)測(cè)試方法和質(zhì)量認(rèn)證的基礎(chǔ)。他于1970 年發(fā)表的論文“關(guān)于計(jì)算機(jī)程序的統(tǒng)計(jì)驗(yàn)證”將統(tǒng)計(jì)推斷技術(shù)引入到程序正確性問(wèn)題中[6],從而將統(tǒng)計(jì)學(xué)應(yīng)用于軟件認(rèn)證。此外,他在1970 年提出了飽受爭(zhēng)議的“首席程序員團(tuán)隊(duì)”技術(shù),雖然飽受爭(zhēng)議,但首席程序員團(tuán)隊(duì)技術(shù)為軟件團(tuán)隊(duì)成員之間的溝通渠道問(wèn)題提供了原創(chuàng)解決方案[7],而且早在1971 年中期,由IBM 交付《紐約時(shí)報(bào)》使用的在線存儲(chǔ)和檢索系統(tǒng)項(xiàng)目中成功運(yùn)用了該技術(shù)[8]。凈室小組工作法可以說(shuō)是在某種程度上繼承了首席程序員團(tuán)隊(duì)技術(shù)。
一種成熟的理論基礎(chǔ)對(duì)于工程方法(技術(shù))極其重要,它起到的指引作用是其他任何事物無(wú)法代替的。米爾斯對(duì)軟件數(shù)學(xué)理論基礎(chǔ)的解釋——“程序是一個(gè)數(shù)學(xué)函數(shù)規(guī)則”對(duì)計(jì)算機(jī)科學(xué)產(chǎn)生了重要影響,使得大量數(shù)學(xué)函數(shù)的理論和應(yīng)用成為軟件開(kāi)發(fā)和驗(yàn)證的基礎(chǔ)。也正是因?yàn)橛辛藞?jiān)實(shí)的數(shù)學(xué)理論基礎(chǔ),才會(huì)有后來(lái)的基于函數(shù)理論的程序正確性驗(yàn)證技術(shù)、增量開(kāi)發(fā)技術(shù)和盒式結(jié)構(gòu)方法。由于凈室方法將統(tǒng)計(jì)學(xué)作為測(cè)試的理論基礎(chǔ),其統(tǒng)計(jì)抽樣測(cè)試技術(shù)才得以穩(wěn)固的發(fā)展。
增量開(kāi)發(fā)的思想是先開(kāi)發(fā)出一個(gè)能夠運(yùn)行,只有基本架構(gòu)的增量(軟件),這個(gè)增量也許只有界面,沒(méi)有實(shí)現(xiàn)其他任何功能。之后,逐步添加功能,生成第二個(gè)、第三個(gè)、……、第N 個(gè)增量,最終得到完整功能的軟件。統(tǒng)計(jì)質(zhì)量控制之下的增量開(kāi)發(fā)技術(shù)實(shí)際上是將制造業(yè)中的統(tǒng)計(jì)質(zhì)量控制引入到軟件開(kāi)發(fā)過(guò)程中,預(yù)防和控制軟件開(kāi)發(fā)過(guò)程中的每一項(xiàng)任務(wù)的質(zhì)量,從而生產(chǎn)出高質(zhì)量的軟件。
該技術(shù)早在1970 年已經(jīng)有了初步方案。米爾斯在其著名文章“大型系統(tǒng)中的自頂向下編程”中,通過(guò)“中間系統(tǒng)序列”和“骨架程序”等概念,首次展示了增量開(kāi)發(fā)的思想。這種思想的產(chǎn)生有三個(gè)前提,即①米爾斯將程序看作是數(shù)學(xué)函數(shù);②結(jié)構(gòu)化編程;③程序正確性證明。將程序看作一個(gè)數(shù)學(xué)函數(shù)后,可以通過(guò)不斷將函數(shù)逐步推導(dǎo)擴(kuò)展成多個(gè)更簡(jiǎn)單的函數(shù)和連接詞,直至可以使用程序語(yǔ)句表示為止。在1968 年和1969 年,荷蘭計(jì)算機(jī)科學(xué)家迪杰斯特拉(E.W.Dijkstra)發(fā)表了多篇有影響力的結(jié)構(gòu)化編程的文章,提倡去除程序里的GOTO 語(yǔ)句,使用順序、選擇和循環(huán)三種結(jié)構(gòu)編寫程序。結(jié)構(gòu)化編程的出現(xiàn),讓自頂向下編程成為可能,改變了之前在紙上先做設(shè)計(jì),然后自底向上的編程習(xí)慣。程序正確性證明技術(shù)也在1969 年前后發(fā)展了起來(lái),它的發(fā)展為函數(shù)推導(dǎo)過(guò)程的正確性證明提供了理論依據(jù)和技術(shù)手段。也是1970 年,第一個(gè)軟件生命周期模型——瀑布模型出現(xiàn),之后軟件產(chǎn)業(yè)界迅速接受了該模型。但由于意識(shí)到瀑布模型的線性開(kāi)發(fā)的缺點(diǎn),米爾斯繼續(xù)發(fā)展了增量開(kāi)發(fā)技術(shù)(增量開(kāi)發(fā)模型)。直至上世紀(jì)80 年代,米爾斯將統(tǒng)計(jì)質(zhì)量控制技術(shù)引入軟件開(kāi)發(fā),與增量開(kāi)發(fā)技術(shù)結(jié)合后形成了統(tǒng)計(jì)質(zhì)量控制下的增量開(kāi)發(fā)技術(shù)。
凈室的基于函數(shù)的規(guī)格、設(shè)計(jì)和驗(yàn)證技術(shù)也被稱為盒式結(jié)構(gòu)方法。盒式結(jié)構(gòu)(box structures)方法用于描述軟件規(guī)格,并通過(guò)逐步求精的擴(kuò)展方法實(shí)現(xiàn)軟件規(guī)格。盒式結(jié)構(gòu)包括黑盒、狀態(tài)盒和明盒等三類盒子。黑盒描述用戶的外部行為,狀態(tài)盒是黑盒的擴(kuò)展,明盒是狀態(tài)盒的擴(kuò)展,明盒基本上是一段偽代碼算法或是程序。1986 年,米爾斯和林格、赫夫納(A. R.Hevner)合著的《信息系統(tǒng)分析與設(shè)計(jì)原理》(Principles of Information Systems Analysis and Design)提出了一種簡(jiǎn)化分析和設(shè)計(jì)的數(shù)學(xué)方法——盒式結(jié)構(gòu)方法。開(kāi)發(fā)該方法的原因是由于當(dāng)時(shí)系統(tǒng)分析使用的數(shù)據(jù)流圖工具在描繪復(fù)雜的商業(yè)業(yè)務(wù)時(shí)線條顯得紛亂復(fù)雜,不僅不利于分析,且容易使人犯錯(cuò)。而盒式結(jié)構(gòu)里的黑盒可以很好的解決該問(wèn)題,簡(jiǎn)化系統(tǒng)分析工作。系統(tǒng)設(shè)計(jì)工作是在不斷的將黑盒擴(kuò)展為狀態(tài)盒,將狀態(tài)盒擴(kuò)展為明盒的過(guò)程中實(shí)現(xiàn)的,且在每一步擴(kuò)展過(guò)程中都會(huì)有嚴(yán)格的正確性驗(yàn)證,確保最終軟件產(chǎn)品滿足用戶當(dāng)初的所有需求。
凈室的統(tǒng)計(jì)測(cè)試技術(shù)理論依據(jù)來(lái)自統(tǒng)計(jì)學(xué)的抽樣理論。凈室測(cè)試與傳統(tǒng)測(cè)試方法不同,在傳統(tǒng)測(cè)試方法中,測(cè)試人員一開(kāi)始就假定軟件中肯定存在錯(cuò)誤,在這種心理前提下盡可能找出設(shè)計(jì)和編碼的錯(cuò)誤,且錯(cuò)誤越多越好,而且如果找到并修復(fù)了足夠多的錯(cuò)誤,則認(rèn)為軟件質(zhì)量會(huì)提高。凈室軟件測(cè)試(認(rèn)證)是為了認(rèn)證軟件的可靠性,而不是傳統(tǒng)意義上的測(cè)試軟件,即不是為了找出錯(cuò)誤。在凈室測(cè)試中,測(cè)試人員和開(kāi)發(fā)人員不是敵對(duì)的關(guān)系,這一點(diǎn)也與傳統(tǒng)測(cè)試不同。
早在1970 年,米爾斯就注意到了可以將統(tǒng)計(jì)學(xué)中的概念引入到軟件編程。1983 年,米爾斯與戴爾(M.Dyer)開(kāi)發(fā)了凈室的統(tǒng)計(jì)測(cè)試與軟件認(rèn)證技術(shù)。在當(dāng)時(shí),傳統(tǒng)的測(cè)試方法是程序員只使用有代表性的用戶操作軟件的手法和輸入測(cè)試軟件。這種測(cè)試方法只能保證軟件在測(cè)試用例上是正確的,但不能保證其他情況下也是正確的。米爾斯在其1987 年發(fā)表的論文“凈室軟件工程”中曾解釋軟件本身并沒(méi)有統(tǒng)計(jì)屬性,但是用戶使用(操作)軟件情況是可以被統(tǒng)計(jì)的,所以軟件的統(tǒng)計(jì)屬性來(lái)自于用戶對(duì)軟件的可能使用情況。根據(jù)用戶的使用情況分布概率,隨機(jī)生成測(cè)試用例,之后通過(guò)測(cè)試用例測(cè)試軟件的正確性。
凈室的三大關(guān)鍵技術(shù)可以合起來(lái)使用,也可以獨(dú)立分開(kāi)使用。當(dāng)合起來(lái)作為凈室技術(shù)使用時(shí),其效果已經(jīng)在多個(gè)大型項(xiàng)目中得以展示,并被包括NASA 和DoD 等對(duì)軟件要求極高的多家機(jī)構(gòu)所認(rèn)同。凈室的增量開(kāi)發(fā)技術(shù)通過(guò)智力控制解決軟件復(fù)雜性問(wèn)題方面給出了一種解決方案。這是因?yàn)榭梢宰岄_(kāi)發(fā)者在某一時(shí)間段將精力集中在某一個(gè)增量上,而不用時(shí)刻考慮更多的問(wèn)題。增量技術(shù)通過(guò)快速交付增量,得到用戶反饋,改進(jìn)需求和生產(chǎn)過(guò)程,再交付增量,……的循環(huán)過(guò)程方式,為軟件生產(chǎn)方和用戶方的積極溝通提供了方案,避免了最終軟件產(chǎn)品并非用戶所需的嚴(yán)重問(wèn)題。盒式結(jié)構(gòu)方法為人們提供了一種簡(jiǎn)化了的系統(tǒng)分析和設(shè)計(jì)的數(shù)學(xué)方法。這種方法不僅可以用于結(jié)構(gòu)化分析和設(shè)計(jì),還可以用于面向?qū)ο蠓治龊驮O(shè)計(jì)。它解決了系統(tǒng)分析時(shí)使用數(shù)據(jù)流圖工具在描述復(fù)雜系統(tǒng)業(yè)務(wù)時(shí)的線條混亂的問(wèn)題,為系統(tǒng)分析和設(shè)計(jì)提供了一種獨(dú)特的工具。統(tǒng)計(jì)測(cè)試和軟件認(rèn)證技術(shù)在人員關(guān)系層面解決了開(kāi)發(fā)人員和測(cè)試人員的敵對(duì)關(guān)系,將其關(guān)系從對(duì)立轉(zhuǎn)為合作。它在技術(shù)層面通過(guò)抽樣測(cè)試用例推進(jìn)了測(cè)試技術(shù)的發(fā)展,將當(dāng)時(shí)只用幾種典型用例測(cè)試軟件的方式往前推進(jìn)了一大步。
米爾斯博士是凈室軟件工程創(chuàng)始人。1970 年至1990 年的20 年間,他奠定了凈室的理論基礎(chǔ)與IBM同事一起開(kāi)發(fā)并實(shí)踐了三大關(guān)鍵技術(shù),讓凈室從一粒種子長(zhǎng)成一棵參天大樹(shù)。米爾斯的成就除了其自身的天分和知識(shí)儲(chǔ)備以外,也與當(dāng)時(shí)軟件工程的提出,各種軟件技術(shù)被開(kāi)發(fā)應(yīng)用的大環(huán)境有關(guān),還與當(dāng)時(shí)美國(guó)政府重視軟件工程的發(fā)展,米爾斯所在的IBM 聯(lián)邦系統(tǒng)部能夠承接美國(guó)政府和軍方的大型項(xiàng)目,從而有機(jī)會(huì)研究和實(shí)踐高可靠性軟件理論和技術(shù)有關(guān)。當(dāng)然,也與米爾斯一同開(kāi)發(fā)實(shí)踐凈室的團(tuán)隊(duì)成員有很大關(guān)系。
由于經(jīng)濟(jì)成本較高,對(duì)開(kāi)發(fā)人員的技術(shù)門檻和用戶代表的信息素養(yǎng)要求較高,適合于開(kāi)發(fā)大型高可靠性軟件項(xiàng)目等因素,凈室在我國(guó)并沒(méi)有得到足夠的重視和發(fā)展。但隨著不斷的有大型軟件項(xiàng)目的啟動(dòng),對(duì)軟件高可靠性的強(qiáng)烈要求,凈室軟件工程必定在我國(guó)會(huì)得到更多的關(guān)注。