吳 剛,薛錦云
(江西師范大學(xué)計算機信息工程學(xué)院,江西 南昌 330022)
我國軟件服務(wù)外包正在迅猛發(fā)展,根據(jù)TPI數(shù)據(jù)顯示,截至2010年底,我國承接軟件外包的合同金額和執(zhí)行金額分別達到274億美元和198億美元,分別實現(xiàn)了37%和43.1%的增長率[1]。但由于各種各樣的原因,軟件外包中依然存在著開發(fā)效率低和可靠性不高的問題。
在國內(nèi),一些比較知名的軟件外包企業(yè)如東軟集團、中軟國際,為了提高軟件開發(fā)效率,都在積極研發(fā)各自的業(yè)務(wù)基礎(chǔ)平臺,業(yè)務(wù)基礎(chǔ)平臺封裝了瑣碎的技術(shù)細節(jié),提供了預(yù)設(shè)好的行業(yè)套件及業(yè)務(wù)組件,如ERP、OA、電子政務(wù)等,通過對這些套件及組件的重用和組裝,可以在業(yè)務(wù)基礎(chǔ)平臺上快速靈活地搭建出復(fù)雜的應(yīng)用軟件系統(tǒng)[2-3]。業(yè)務(wù)基礎(chǔ)平臺有其局限性,只有所構(gòu)建的系統(tǒng)中包含行業(yè)套件或業(yè)務(wù)組件,才能提高軟件開發(fā)效率。軟件可靠性與所使用的套件或組件及平臺的可靠性有關(guān)。由美國卡內(nèi)基梅隆大學(xué)研制的Alice,可以自動生成程序,但是只能生成動畫電影或簡單的視頻游戲,目前只用于教學(xué)[4-5]。由ARTech公司開發(fā)的GeneXus,是一個智能化的、支持多平臺應(yīng)用的模型驅(qū)動開發(fā)工具。據(jù)介紹,GeneXus可以自動化地進行軟件設(shè)計、開發(fā)、維護,提高了軟件開發(fā)效率,降低開發(fā)、維護成本[6]。
許多計算機科學(xué)家為了提高軟件開發(fā)效率和可靠性,一直以來都致力于代碼自動生成方面的研究[7]。由薛錦云教授提出的PAR方法及其團隊研發(fā)的高可靠軟件開發(fā)平臺PAR平臺[8-9],利用代碼生成技術(shù)可以大大加速軟件的開發(fā)進度,提高軟件的質(zhì)量。本文選取典型軟件外包案例,將PAR方法和PAR平臺應(yīng)用到該案例開發(fā)過程中,主要用到需求分析、詳細設(shè)計、編碼和測試中,以提高軟件外包開發(fā)效率和可靠性。
PAR方法和PAR平臺二者合稱PAR,主要由4個部分組成:PAR方法的算法描述語言Radl[10];PAR方法的程序設(shè)計語言Apla[11];統(tǒng)一的算法設(shè)計和證明方法;系列自動程序轉(zhuǎn)換工具,即PAR平臺。PAR方法是通過對現(xiàn)存算法程序設(shè)計方法局限性和尋找問題求解序列遞推關(guān)系的深入研究,進而提出的一種統(tǒng)一的算法程序設(shè)計和證明方法。圖1是使用PAR進行軟件開發(fā)的過程。Radl語言是為實現(xiàn)算法程序形式化和半自動化開發(fā)的PAR方法而定義的一種基于遞推關(guān)系的算法設(shè)計語言,它是PAR方法的重要組成部分。它主要功能是描述問題的規(guī)約、規(guī)約變換規(guī)則和描述算法以及描述功能需求。Apla是為算法程序形式化開發(fā)的PAR方法而定義的一種抽象程序設(shè)計語言,充分體現(xiàn)功能抽象、數(shù)據(jù)抽象等現(xiàn)代程序設(shè)計思想,使之簡單實用,便于程序開發(fā),使得構(gòu)成的程序易于閱讀、理解和驗證,它可以用來描述軟件的詳細設(shè)計,且易于被轉(zhuǎn)換成各種可執(zhí)行的程序設(shè)計語言程序。在此基礎(chǔ)上研制了綜合性軟件開發(fā)環(huán)境,即PAR 平臺[12]。
圖1 PAR軟件開發(fā)流程
案例:公交運營調(diào)度系統(tǒng)。
該系統(tǒng)選自中軟國際實訓(xùn)系列叢書[13],該叢書都是按照軟件企業(yè)工作要求完成軟件開發(fā)和軟件測試的訓(xùn)練,培養(yǎng)符合企業(yè)要求的人才,提高就業(yè)競爭力。中軟國際是中國大型綜合性軟件與信息服務(wù)企業(yè),在軟件外包方面有著杰出的貢獻和成績。
該案例選取的意義在于將PAR平臺首次應(yīng)用到軟件外包活動中去,在需求分析、詳細設(shè)計、編碼及測試階段充分發(fā)揮PAR平臺的優(yōu)勢,來提高軟件外包的開發(fā)效率和可靠性,具有一定的現(xiàn)實意義。該系統(tǒng)的主要功能有實時監(jiān)控、動態(tài)調(diào)度以及乘車查詢。實時監(jiān)控功能是對運行中的各條線路的公交車輛進行實時的監(jiān)控,監(jiān)控的范圍包括車速、客流以及故障和事故;動態(tài)調(diào)度則利用實時監(jiān)控的結(jié)果,在發(fā)現(xiàn)道路擁堵、客流量過大或者車輛出現(xiàn)故障事故時,提示公交調(diào)度管理員及時調(diào)度車輛,保證公交運力的及時調(diào)整;乘車查詢主要幫助乘客選擇乘車線路。
在軟件外包活動中,項目立項之后就開始進入需求分析階段,在做功能需求分析的時候,最常用的就是用圖表方式如:UML活動圖和狀態(tài)圖等。這種圖表方式有一定的優(yōu)點,如簡單、直觀以及很容易理解,但也有明顯不足,就是不能保證完全正確。然而用數(shù)學(xué)規(guī)約的方式就可以彌補這個缺點,這種方法是建立在數(shù)學(xué)概念基礎(chǔ)上的,例如謂詞邏輯、狀態(tài)機以及集合等,用這種形式化規(guī)約來描述需求是很精確清晰的。
用PAR平臺來做需求分析就是使用數(shù)學(xué)規(guī)約的方式,使用的規(guī)約語言是Radl語言。
首先要先深入了解Radl語言,用Radl語言主要是描述功能需求,其格式如下:
共分為5個部分:USER是指這個功能的使用者是誰,這個使用者可以是某個人,也可以是某物,甚至是一個系統(tǒng)或一段程序;第二行就要說明所用到的標(biāo)識符,主要說明FQ和FR中出現(xiàn)的變量和函數(shù)的屬性及類型,其中屬性有3種:(1)輸入變量,用關(guān)鍵字in標(biāo)識;(2)輸出變量,用關(guān)鍵字out標(biāo)識;(3)輔助變量,用關(guān)鍵字aux標(biāo)識,類型可以是Radl語言中的標(biāo)準(zhǔn)數(shù)據(jù)類型(integer,real,boolean,char,string)、自定義簡單類型(記錄類型、數(shù)組類型、枚舉類型、子界類型和結(jié)果集類型)、預(yù)定義ADT類型(集合類型、序列類型、樹類型、圖類型、數(shù)據(jù)庫表類型)和自定義ADT類型;第三行FQ,可以解釋為此功能點的前置斷言,用于表示使用者輸入?yún)?shù)必須滿足的條件;第四行FR是此功能點的后置斷言,用于表示使用者所要獲得的功能目標(biāo);最后一行就是對整個功能點做文字性的說明,更有利于對此功能點進行檢查和維護。以乘車查詢?yōu)槔?
說明:對公交線路的查詢,輸入起始站點和終止站點,可以查詢可以到達的線路,當(dāng)brt1.bus_road=brt2.bus_road 時,是可以直達的;當(dāng) brt1.bus_road≠brt2.bus_road時,需要換乘才可以到達終點。
在外包軟件活動中,詳細設(shè)計和編碼都是很重要的步驟,詳細設(shè)計的好壞會直接影響到后續(xù)的編碼工作,因為一般來講編碼工作是以詳細設(shè)計為參考依據(jù),其正確性和可靠性勢必會影響到整個軟件的質(zhì)量。詳細設(shè)計就是對概要設(shè)計的一個細化,就是詳細地設(shè)計每個模塊實現(xiàn)算法,所需的局部結(jié)構(gòu)。其主要任務(wù)是設(shè)計每個模塊的實現(xiàn)算法、所需的局部數(shù)據(jù)結(jié)構(gòu)。詳細設(shè)計的目標(biāo)有2個:實現(xiàn)模塊功能的算法要邏輯上正確和算法描述要簡明易懂。詳細設(shè)計的表示工具有圖形工具和語言工具。圖形工具有業(yè)務(wù)流圖、程序流程圖、PAD(Problem Analysis Diagram)圖、NS(由Nassi和Shneidermen開發(fā),簡稱NS)圖。語言工具有偽碼和PDL(Program Design Language)等。
在PAR平臺下是使用Apla語言進行詳細的設(shè)計,Apla語言的主要特色是充分體現(xiàn)功能抽象,數(shù)據(jù)抽象等現(xiàn)代程序設(shè)計思想,使之簡單實用,便于程序開發(fā),使得構(gòu)成的程序易于閱讀理解和驗證,且易于被轉(zhuǎn)換成各種可執(zhí)行的程序設(shè)計語言程序。用它可以描述每個模塊詳細的算法設(shè)計,也可以描述每個模塊內(nèi)的數(shù)據(jù)結(jié)構(gòu),還可以用于數(shù)據(jù)庫設(shè)計等,這些都是詳細設(shè)計的基本任務(wù),Apla語言可以勝任這些任務(wù)。并且還可以驗證其正確性,這一點對程序的可靠性非常重要。下面概述使用Apla語言是怎樣描述詳細設(shè)計的。
首先介紹總體結(jié)構(gòu),包括3部分:設(shè)計名稱、數(shù)據(jù)結(jié)構(gòu)設(shè)計(含數(shù)據(jù)庫設(shè)計)以及算法和其它功能設(shè)計如下:
Apla語言中除包含標(biāo)準(zhǔn)數(shù)據(jù)類型外,還有自定義簡單類型如記錄類型、數(shù)組類型等,還有預(yù)定義的抽象數(shù)據(jù)類型如集合、表、樹、圖等,并且還可以自定義抽象數(shù)據(jù)類型,可以很好地用于數(shù)據(jù)結(jié)構(gòu)設(shè)計;PAR方法中內(nèi)置關(guān)系數(shù)據(jù)庫機制,使用關(guān)系代數(shù)符號描述數(shù)據(jù)庫操作,用記錄類型來存儲數(shù)據(jù)庫表設(shè)計;算法的設(shè)計是PAR方法的強項,不但可以形式化推導(dǎo)出高效算法還可以對算法進行正確性證明[7]。以乘車查詢?yōu)槔?,算法和其它功能設(shè)計如下:
這里只給出了乘客乘車查詢的功能設(shè)計,并詳細給出了從哪個數(shù)據(jù)庫表中取數(shù)據(jù),取出數(shù)據(jù)后怎樣操作才能滿足乘客的要求。
一般來講編碼階段就是程序員依照詳細設(shè)計的具體手工實現(xiàn),是模塊化的實現(xiàn),所以也稱實現(xiàn)階段。而在PAR平臺中對詳細設(shè)計的實現(xiàn)是完全自動的,即用Apla語言描述的詳細設(shè)計可以在PAR平臺中自動轉(zhuǎn)換為可運行的具體語言程序,如C++、Java等,所依托的是PAR平臺中的一系列程序自動生成工具。圖2是使用C++生成工具[14],將乘車查詢的Apla描述自動生成C++代碼,圖左側(cè)是用Apla語言描述乘車查詢詳細設(shè)計,圖右側(cè)是自動生成的C++程序代碼。
圖2 乘車查詢C++代碼自動生成
PAR平臺中進行詳細設(shè)計時,Apla語言中含有豐富的抽象數(shù)據(jù)類型,如樹、圖、鏈表和集合等,對數(shù)據(jù)結(jié)構(gòu)的設(shè)計有很大的幫助。另外,在對數(shù)據(jù)庫功能設(shè)計時,直接使用關(guān)系代數(shù)符號描述操作過程,例如在案例中要實現(xiàn)2個表的連接,并且從連接后的結(jié)果中篩選出想要的字段,用關(guān)系代數(shù)表達式是這樣實現(xiàn)的:
用標(biāo)準(zhǔn)SQL語句實現(xiàn):
比較以上兩者的實現(xiàn),可以很直觀地看出,用關(guān)系代數(shù)實現(xiàn)簡單、易寫、不容易出錯,而SQL語句顯得冗長,且易出錯。目前國內(nèi)沒有哪個平臺可以做到這一點,大多數(shù)還是使用嵌入式SQL語句的形式,稍微簡化一點的就是把數(shù)據(jù)庫的連接封裝成一個接口,把某一類查詢問題也封裝成一個接口來使用,但是還是避免不了編寫復(fù)雜的SQL語句。PAR平臺中這樣做的優(yōu)勢非常明顯,在平臺中可以直接使用關(guān)系代數(shù)符號來進行數(shù)據(jù)庫的操作,實現(xiàn)了標(biāo)準(zhǔn)SQL語句功能,并且可以轉(zhuǎn)換為嵌入的SQL語句,關(guān)系代數(shù)的優(yōu)勢是編寫簡單,容易糾錯,因此可以提高開發(fā)效率。
一般來講編碼階段就是程序員依照詳細設(shè)計的具體手工實現(xiàn),是模塊化的實現(xiàn),所以也稱實現(xiàn)階段。而在PAR平臺中對詳細設(shè)計的實現(xiàn)是完全自動的,即用Apla語言描述的詳細設(shè)計可以在PAR平臺中自動轉(zhuǎn)換為可運行的具體語言程序,如C++、Java等。這所依托的是PAR平臺中的一系列程序自動轉(zhuǎn)換工具。PAR平臺中編碼的方式由手工變成了機械地轉(zhuǎn)換,從而節(jié)省了編碼的強度和編碼的時間,如果將PAR平臺應(yīng)用與軟件外包活動中,會大大提高軟件的開發(fā)效率,節(jié)約開發(fā)成本。這將會對軟件服務(wù)外包在技術(shù)上和經(jīng)濟上帶來深遠的影響。
用Radl語言描述功能點的設(shè)計,將形式化方法應(yīng)用于需求建模,而不追求完全形式化,以達到輕量化的目標(biāo),同時保證了系統(tǒng)的清晰性、正確性和可靠性,并降低了系統(tǒng)的開發(fā)成本。依照Radl描述,用Apla語言做詳細設(shè)計可以很容易快速地實現(xiàn)。在Radl描述中給出了要達到這一功能所需要的標(biāo)識符、要具備的條件以及所要達到的目標(biāo),這些為詳細設(shè)計做了很好的鋪墊,并且可以作為標(biāo)準(zhǔn)來驗證詳細設(shè)計是否符合用戶需求。
本文將PAR方法和PAR平臺應(yīng)用到軟件外包開發(fā)過程中,在需求分析階段應(yīng)用過程中,用Radl語言描述功能點的設(shè)計,將形式化方法應(yīng)用于需求建模,而不追求完全形式化,以達到輕量化的目標(biāo),同時保證了系統(tǒng)的清晰性、正確性和可靠性,并降低了系統(tǒng)的開發(fā)成本。Dianel Jackson說過,比起傳統(tǒng)的形式化方法,部分形式化方法在表達能力和應(yīng)用領(lǐng)域上都還有差距,但其使用效率更高,效果更顯著。在詳細設(shè)計應(yīng)用的過程中,用Apla語言來描述詳細設(shè)計,Apla語言中包含除簡單數(shù)據(jù)類型外,還包含了許多復(fù)雜的抽象數(shù)據(jù)類型,并能自定義數(shù)據(jù)結(jié)構(gòu),因此能夠勝任模塊中數(shù)據(jù)結(jié)構(gòu)的設(shè)計;算法設(shè)計和其它設(shè)計的任務(wù),利用PAR方法可以設(shè)計出高效高可靠的算法,在PAR平臺中利用簡便的關(guān)系代數(shù)符號進行數(shù)據(jù)庫操作,在數(shù)據(jù)庫處理方面有非常大的優(yōu)勢;在PAR平臺中基本能完成數(shù)據(jù)庫表的設(shè)計,用來進行模塊中數(shù)據(jù)庫操作功能的設(shè)計。在編碼方面用的過程中,PAR平臺可以將Apla語言描述的詳細設(shè)計自動轉(zhuǎn)換為可運行的語言程序,如C++、Java等。PAR平臺自動轉(zhuǎn)換的特性會大大增加軟件的開發(fā)效率。
[1]中國服務(wù)外包網(wǎng).中國服務(wù)外包網(wǎng)主頁[EB/OL].http://chinasourcing.mofcom.gov.cn/,2013-06-17.
[2]Neusoft.東軟集團軟件產(chǎn)品與平臺[EB/OL].http://www.neusoft.com/cn/products&platform/index.html,2013-06-17.
[3]中軟集團.中軟集團外包服務(wù)[EB/OL].http://www.chinasofti.com/superWebCMS/pages/sites/MainSite/html/zh/outsourcing-services/index.shtml,2013-06-17.
[4]Alice.Alice主頁[EB/OL].http://www.alice.org/,2013-06-17.
[5]Charles W Herbert.An Introduction to Programming Using Alice 2.2(2nd Ed)[M].Cengage Learning,2010.
[6]GeneXus.GeneXus官方網(wǎng)站[EB/OL].http://www.genexus.com/,2013-06-17.
[7]徐家福,陳道蓄,呂建,等.軟件自動化[M].清華大學(xué)出版社,1994.
[8]Xue Jinyun.A unified approach for developing efficient algorithmic programs[J].Journal of Computer Science and Technologies,1997,12(4):314-329.
[9]薛錦云.新型軟件開發(fā)方法PAR及其支撐平臺[R].江西師范大學(xué)省高性能計算技術(shù)重點實驗室技術(shù)報告,2005.
[10]薛錦云.算法設(shè)計語言Radl報告[R].江西師范大學(xué)計算機軟件研究所技術(shù)報告,2001.
[11]薛錦云.抽象程序設(shè)計語言Apla報告[R].江西師范大學(xué)計算機軟件研究所技術(shù)報告,2001.
[12]石海鶴,薛錦云.基于PAR的算法形式化開發(fā)[J].計算機學(xué)報,2009,32(5):982-991.
[13][美]Andy Yue,駱力明,徐建民.軟件開發(fā)技能實訓(xùn)教程[M].北京:科學(xué)出版社,2010.
[14]賴勇.Apla一C++自動程序轉(zhuǎn)換系統(tǒng)的研制[D].南昌:江西師范大學(xué),2002.