junhong

          2006年11月24日 #

          軟件項目管理

          軟件項目管理

          ????? 軟件項目管理是為了使軟件項目能夠按照預(yù)定的成本、進度、質(zhì)量順利完成,而對人員(People)、產(chǎn)品(Product)、過程(Process)和項目(Project)進行分析和管理的活動。

          ????? 軟件項目管理的根本目的是為了讓軟件項目尤其是大型項目的整個軟件生命周期(從分析、設(shè)計、編碼到測試、維護全過程)都能在管理者的控制之下,以預(yù)定成本按期,按質(zhì)的完成軟件交付用戶使用。而研究軟件項目管理為了從已有的成功或失敗的案例中總結(jié)出能夠指導(dǎo)今后開發(fā)的通用原則,方法,同時避免前人的失誤。

          ????? 軟件項目管理的提出是在20世紀70年代中期的美國,當時美國國防部專門研究了軟件開發(fā)不能按時提交,預(yù)算超支和質(zhì)量達不到用戶要求的原因,結(jié)果發(fā)現(xiàn)70%的項目是因為管理不善引起的,而非技術(shù)原因。于是軟件開發(fā)者開始逐漸重視起軟件開發(fā)中的各項管理。到了20世紀90年代中期,軟件研發(fā)項目管理不善的問題仍然存在。據(jù)美國軟件工程實施現(xiàn)狀的調(diào)查,軟件研發(fā)的情況仍然很難預(yù)測,大約只有10%的項目能夠在預(yù)定的費用和進度下交付。

          ????? 1995年,據(jù)統(tǒng)計,美國共取消了810億美元的商業(yè)軟件項目,其中31%的項目未做完就被取消,53%的軟件項目進度通常要延長50%的時間,只有9%的軟件項目能夠及時交付并且費用也控制在預(yù)算之內(nèi)。

          ????? 軟件項目管理和其他的項目管理相比有相當?shù)奶厥庑?。首先,軟件是純知識產(chǎn)品,其開發(fā)進度和質(zhì)量很難估計和度量,生產(chǎn)效率也難以預(yù)測和保證。其次,軟件系統(tǒng)的復(fù)雜性也導(dǎo)致了開發(fā)過程中各種風(fēng)險的難以預(yù)見和控制。Windows這樣的操作系統(tǒng)有1500萬行以上的代碼,同時有數(shù)千個程序員在進行開發(fā),項目經(jīng)理都有上百個。這樣龐大的系統(tǒng)如果沒有很好的管理,其軟件質(zhì)量是難以想象的。

          ????? 軟件項目管理的內(nèi)容主要包括如下幾個方面:人員的組織與管理,軟件度量,軟件項目計劃,風(fēng)險管理,軟件質(zhì)量保證軟件過程能力評估,軟件配置管理等。

          ????? 這幾個方面都是貫穿、交織于整個軟件開發(fā)過程中的,其中人員的組織與管理把注意力集中在項目組人員的構(gòu)成、優(yōu)化;軟件度量把關(guān)注用量化的方法評測軟件開發(fā) 中的費用、生產(chǎn)率、進度和產(chǎn)品質(zhì)量等要素是否符合期望值,包括過程度量和產(chǎn)品度量兩個方面;軟件項目計劃主要包括工作量、成本、開發(fā)時間的估計,并根據(jù)估 計值制定和調(diào)整項目組的工作;風(fēng)險管理預(yù)測未來可能出現(xiàn)的各種危害到軟件產(chǎn)品質(zhì)量的潛在因素并由此采取措施進行預(yù)防;質(zhì)量保證是保證產(chǎn)品和服務(wù)充分滿足消 費者要求的質(zhì)量而進行的有計劃,有組織的活動;軟件過程能力評估是對軟件開發(fā)能力的高低進行衡量;軟件配置管理針對開發(fā)過程中人員、工具的配置、使用提出管理策略。因為大家對人力資源管理和軟件過程能力比較有興趣,下面就詳細的對這兩方面展開討論。

          一.軟件項目的計劃

          ????? 軟件項目計劃是一個軟件項目進入系統(tǒng)實施的啟動階段,主要進行的工作包括:確定詳細的項目實施范圍、定義遞交的工作成果、評估實施過程中主要的風(fēng)險、制定項目實施的時間計劃、成本和預(yù)算計劃、人力資源計劃等。

          ????? 軟件項目管理過程從項目計劃活動開始,而第一項計劃活動就是估算:需要多長時間、需要多少工作量、以及需要多少人員。此外,我們還必須估算所需要的資源(硬件及軟件)和可能涉及到的風(fēng)險。

          ????? 為了估算軟件項目的工作量和完成期限,首先需要預(yù)測軟件規(guī)模。度量軟件規(guī)模的常用方法有直接的方法——LOC(代碼行),間接的方法——FP(功能點)。這兩種方法各有優(yōu)缺點,應(yīng)該根據(jù)軟件項目的特點選擇適用的軟件規(guī)模度量方法。

          ????? 根據(jù)項目的規(guī)模可以估算出完成項目所需的工作量,我們可以使用一種或多種技術(shù)進行估算,這些技術(shù)主要分為兩大:分解和經(jīng)驗建模。分解技術(shù)需要劃分出主要的軟件功能,接著估算實現(xiàn)每一個功能所需的程序規(guī)?;蛉嗽聰?shù)。經(jīng)驗技術(shù)的使用是根據(jù)經(jīng)驗導(dǎo)出的公式來預(yù)測工作量和時間??梢允褂米詣庸ぞ邅韺崿F(xiàn)某一特定的經(jīng)驗?zāi)P汀?/font>

          ????? 精確的項目估算一般至少會用到上述技術(shù)中的兩種。通過比較和協(xié)調(diào)使用不同技術(shù)導(dǎo)出的估算值,我們可能得到更精確的估算。軟件項目估算永遠不會是一門精確的科學(xué),但將良好的歷史數(shù)據(jù)與系統(tǒng)化的技術(shù)結(jié)合起來能夠提高估算的精確度。

          ????? 當對軟件項目給予較高期望時,一般都會進行風(fēng)險分析。在標識、分析和管理風(fēng)險上花費的時間和人力可以從多個方面得到回報:更加平穩(wěn)的項目進展過程;更高的跟蹤和控制項目的能力;由于在問題發(fā)生之前已經(jīng)做了周密計劃而產(chǎn)生的信心。

          ????? 對于一個項目管理者,他的目標是定義所有的項目任務(wù),識別出關(guān)鍵任務(wù),跟蹤關(guān)鍵任務(wù)的進展情況,以保證能夠及時發(fā)現(xiàn)拖延進度的情況。為此,項目管理者必須制定一個足夠詳細的進度表,以便監(jiān)督項目進度并控制整個項目。

          ????? 常用的制定進度計劃的工具主要有Gantt圖和工程網(wǎng)絡(luò)兩種。Gantt圖具有悠久歷史、直觀簡明、容易學(xué)習(xí)、容易繪制等優(yōu)點,但是,它不能明顯地表示各 項任務(wù)彼此間的依賴關(guān)系,也不能明顯地表示關(guān)鍵路徑和關(guān)鍵任務(wù),進度計劃中的關(guān)鍵部分不明確。因此,在管理大型軟件項目時,僅用Gantt圖是不夠的,不 僅難于做出既節(jié)省資源又保證進度的計劃,而且還容易發(fā)生差錯。

          ????? 工程網(wǎng)絡(luò)不僅能描繪任務(wù)分解情況及每項作業(yè)的開始時間和結(jié)束時間,而且還能清楚地表示各個作業(yè)彼此間的依賴關(guān)系。從工程網(wǎng)絡(luò)圖中容易識別出關(guān)鍵路徑和關(guān)鍵 任務(wù)。因此,工程網(wǎng)絡(luò)圖是制定進度計劃的強有力的工具。通常,聯(lián)合使用Gantt圖和工程網(wǎng)絡(luò)這兩種工具來制定和管理進度計劃,使它們互相補充、取長補 短。

          ????? 進度安排是軟件項目計劃的首要任務(wù),而項目計劃則是軟件項目管理的首要組成部分。與估算方法和風(fēng)險分析相結(jié)合,進度安排將為項目管理者建立起一張計劃圖。

          二.軟件項目的控制

          ????? 對于軟件開發(fā)項目而言,控制是十分重要的管理活動。下面介紹軟件工程控制活動中的質(zhì)量保證和配置管理。其實上面所提到的風(fēng)險分析也可以算是軟件工程控制活動的一類。而進度跟蹤則起到連接軟件項目計劃和控制的作用。

          ????? 軟件質(zhì)量保證(SQA,Software Quality Insurance)是在軟件過程中的每一步都進行的“保護性活動”。SQA主要有基于非執(zhí)行的測試(也稱為評審)、基于執(zhí)行的測試(即通常所說的測試)和程序正確性證明。

          ????? 軟件評審是最為重要的SQA活動之一。它的作用是,在發(fā)現(xiàn)及改正錯誤的成本相對較小時就及時發(fā)現(xiàn)并排除錯誤。審查和走查是進行正式技術(shù)評審的兩類具體方 法。審查過程不僅步數(shù)比走審多,而且每個步驟都是正規(guī)的。由于在開發(fā)大型軟件過程中所犯的錯誤絕大數(shù)是規(guī)格說明錯誤或設(shè)計錯誤,而正式的技術(shù)評審發(fā)現(xiàn)這兩 類錯誤的有效性高達75%,因此是非常有效的軟件質(zhì)量保證方法。

          ????? 軟件配置管理(SCM,Software configuration management)是應(yīng)用于整個軟件過程中的保護性活動,它是在軟件整個生命周期內(nèi)管理變化的一組活動。

          ????? 軟件配置由一組相互關(guān)聯(lián)的對象組成,這些對象也稱為軟件配置項,它們是作為某些軟件工程活動的結(jié)果而產(chǎn)生的。除了文檔、程序和數(shù)據(jù)這些軟件配置項之外,用于開發(fā)軟件的開發(fā)環(huán)境也可置于配置控制之下。

          ????? 一旦一個配置對象已被開發(fā)出來并且通過了評審,它就變成了基線。對基線對象的修改導(dǎo)致建立該對象的版本。版本控制是用于管理這些對象而使用的一組規(guī)程和工具。

          ????? 變更控制是一種規(guī)程活動,它能夠在對配置對象進行修改時保證質(zhì)量和一致性。配置審計是一項軟件質(zhì)量保證活動,它有助于確保在進行修改時仍然保持質(zhì)量。狀態(tài)報告向需要知道關(guān)于變化的信息的人,提供有關(guān)每項變化的信息。

          三、軟件項目管理的組織模式

          ????? 軟件項目可以是一個單獨的開發(fā)項目,也可以與產(chǎn)品項目組成一個完整的軟件產(chǎn)品項目。如果是訂單開發(fā),則成立軟件項目組即可;如果是產(chǎn)品開發(fā),需成立軟件項 目組和產(chǎn)品項目(負責(zé)市場調(diào)研和銷售),組成軟件產(chǎn)品項目組。公司實行項目管理時,首先要成立項目管理委員會,項目管理委員會下設(shè)項目管理小組、項目評審 小組和軟件產(chǎn)品項目組。

          ????? 3.1、項目管理委員會項目管理委員會是公司項目管理的最高決策機構(gòu),一般由公司總經(jīng)理、副總經(jīng)理組成。主要職責(zé)如下:
          (1)依照項目管理相關(guān)制度管理項目;
          (2)監(jiān)督項目管理相關(guān)制度的執(zhí)行;
          (3)對項目立項、項目撤消進行決策;
          (4)任命項目管理小組組長、項目評審委員會主任、項目組組長.

          ????? 3.2、項目管理小組項目管理小組對項目管理委員會負責(zé),一般由公司管理人員組成。主要職責(zé)如下:
          (1)草擬項目管理的各項制度;
          (2)組織項目階段評審;
          (3)保存項目過程中的相關(guān)文件和數(shù)據(jù);
          (4)為優(yōu)化項目管理提出建議。

          ????? 3.3、項目評審小組項目評審小組對項目管理委員會負責(zé),可下設(shè)開發(fā)評審小組和產(chǎn)品評審小組,一般由公司技術(shù)專家和市場專家組成。主要職責(zé)如下:
          (1)對項目可行性報告進行評審;
          (2)對市場計劃和階段報告進行評審;
          (3)對開發(fā)計劃和階段報告進行評審;
          (4)項目結(jié)束時,對項目總結(jié)報告進行評審。

          ????? 3.4、軟件產(chǎn)品項目組軟件產(chǎn)品項目組對項目管理委員會負責(zé),可下設(shè)軟件項目組和產(chǎn)品項目組。軟件項目組和產(chǎn)品項目組分別設(shè)開發(fā)經(jīng)理和產(chǎn)品經(jīng)理。成員一般 由公司技術(shù)人員和市場人員構(gòu)成。主要職責(zé)是:根據(jù)項目管理委員會的安排具體負責(zé)項目的軟件開發(fā)和市場調(diào)研及銷售工作。

          四、軟件項目管理的內(nèi)容

          ????? 從軟件工程的角度講,軟件開發(fā)主要分為六個階段:需求分析階段、概要設(shè)計階段、詳細設(shè)計階段、編碼階段、測試階段、安裝及維護階段。不論是作坊式開發(fā),還是團隊協(xié)作開發(fā),這六個階段都是不可缺少的。根據(jù)公司實際情況,公司在進行軟件項目管理時,重點將軟件配置管理、項目跟蹤和控制管理、軟件風(fēng)險管理及項目策劃活動管理四方面內(nèi)容導(dǎo)入軟件開發(fā)的整個階段。在20世紀80年代初,著名軟件工程專家B.W.Boehm總結(jié)出了軟件開發(fā)時需遵循的七條基本原則,同樣,在進行軟件項目管理時,也應(yīng)該遵循這七條原則。它們是:
          (1)用分階段的生命周期計劃嚴格管理;
          (2)堅持進行階段評審;
          (3)實行嚴格的產(chǎn)品控制;
          (4)采用現(xiàn)代程序設(shè)計技術(shù);
          (5)結(jié)果應(yīng)能夠清楚地審查;
          (6)開發(fā)小組地人員應(yīng)該少而精;
          (7)承認不斷改進軟件工程實踐的必要性。

          五、編寫《軟件項目計劃書》

          ????? 項目組成立的第一件事是編寫《軟件項目計劃書》,在計劃書中描述開發(fā)日程安排、資源需求、項目管理等各項情況的大體內(nèi)容。計劃書主要向公司各相關(guān)人員發(fā)放,使他們大體了解該軟件項目的情況。對于計劃書的每個內(nèi)容,都應(yīng)有相應(yīng)具體實施手冊,這些手冊是供項目組相關(guān)成員使用的。

          六、軟件配置管理

          ????? 是否進行配置管理與軟件的規(guī)模有關(guān),軟件的規(guī)模越大,配置管理就顯得越重要。軟件配置管理簡稱SCM(Software Configuration Management的縮寫),是在團隊開發(fā)中,標識、控制和管理軟件變更的一種管理。配置管理的使用取決于項目規(guī)模和復(fù)雜性以及風(fēng)險水平。

          ????? 6.1、目前軟件開發(fā)中面臨的問題:在有限的時間、資金內(nèi),要滿足不斷增長的軟件產(chǎn)品質(zhì)量要求;開發(fā)的環(huán)境日益復(fù)雜,代碼共享日益困難,需跨越的平臺增多;程序的規(guī)模越來越大;軟件的重用性需要提高;軟件的維護越來越困難。

          ????? 6.2、軟件配置管理應(yīng)提供的功能:
          ????? 在ISO9000.3中,對配置管理系統(tǒng)的功能作了如下描述:唯一地標識每個軟件項的版本;標識共同構(gòu)成一完整產(chǎn)品的特定版本的每一軟件項的版本;控制由 兩個或多個獨立工作的人員同時對一給定軟件項的更新;控制由兩個或多個獨立工作的人員同時對一給定軟件項的更新;按要求在一個或多個位置對復(fù)雜產(chǎn)品的更新 進行協(xié)調(diào);標識并跟蹤所有的措施和更改;這些措施和更改是在從開始直到放行期間,由于更改請求或問題引起的。

          ????? 6.3、版本管理軟件配置管理分為版本管理、問題跟蹤和建立管理三個部分,其中版本管理是基礎(chǔ)。版本管理應(yīng)完成以下主要任務(wù):
          ?
          ????? 建立項目;
          ????? 重構(gòu)任何修訂版的某一項或某一文件;
          ????? 利用加鎖技術(shù)防止覆蓋; ?當增加一個修訂版時要求輸入變更描述;
          ????? 提供比較任意兩個修訂版的使用工具;
          ????? 采用增量存儲方式;
          ????? 提供對修訂版歷史和鎖定狀態(tài)的報告功能;
          ????? 提供歸并功能;
          ????? 允許在任何時候重構(gòu)任何版本;
          ????? 權(quán)限的設(shè)置;
          ????? 晉升模型的建立;
          ????? 提供各種報告。

          七. 人員組織與管理

          ????? 軟件開發(fā)中的開發(fā)人員是最大的資源。對人員的配置、調(diào)度安排貫穿整個軟件過程,人員的組織管理是否得當,是影響對軟件項目質(zhì)量的決定性因素。

          ????? 首先在軟件開發(fā)的一開始,要合理的配置人員,根據(jù)項目的工作量、所需要的專業(yè)技能,再參考各個人員的能力、性格、經(jīng)驗,組織一個高效、和諧的開發(fā)小組。一 般來說,一個開發(fā)小組人數(shù)在5到10人之間最為合適,如果項目規(guī)模很大,可以采取層級式結(jié)構(gòu),配置若干個這樣的開發(fā)小組。

          ????? 在選擇人員的問題上,要結(jié)合實際情況來決定是否選入一個開發(fā)組員。并不是一群高水平的程序員在一起就一定可以組成一個成功的小組。作為考察標準,技術(shù)水 平、與本項目相關(guān)的技能和開發(fā)經(jīng)驗、以及團隊工作能力都是很重要的因素。一個一天能寫一萬行代碼但卻不能與同事溝通融洽的程序員,未必適合一個對組員之間 通訊要求很高的項目。還應(yīng)該考慮分工的需要,合理配置各個專項的人員比例。例如一個網(wǎng)站開發(fā)項目,小組中有頁面美工、后臺服務(wù)程序、數(shù)據(jù)庫幾個部分,應(yīng)該合理的組織各項工作的人員配比。對于一個中型農(nóng)技110網(wǎng)站,對數(shù)據(jù)采集量要求較高,一個人員配比方案可以是2個美工、2個后臺服務(wù)程序編寫、3個數(shù)據(jù)采集整理人員。

          ???? 可以用如下公式來對候選人員能力進行評分,達到一定分數(shù)的則可以考慮進入開發(fā)組,但這個公式不包含對人員數(shù)量配比的考慮。
          ???? Score=∑WiCi(i=1to8)
          ????? Ci是對項目組人員各項能力的評估。其值含義如下

          ????? 在決定一個開發(fā)組的開發(fā)人員數(shù)量時,除了考慮候選人素質(zhì)以外,還要綜合考慮項目規(guī)模、工期、預(yù)算、開發(fā)環(huán)境等因素的影響,下面是一個基于規(guī)模、工期和開發(fā)環(huán)境的人員數(shù)量計算公式:
          ????? L=Ck*K1/3*td4/3
          ????? L:開發(fā)規(guī)模,以代碼行LOC為度量td:開發(fā)時間K:人員數(shù)
          ????? Ck:技術(shù)常數(shù)表示開發(fā)環(huán)境的優(yōu)劣
          ????? 取值2000:表示開發(fā)環(huán)境差,沒有系統(tǒng)的開發(fā)方法,缺乏文檔規(guī)范化設(shè)計;
          ????? 取值8000:表示開發(fā)環(huán)境較好;
          ????? 取值11000:表示開發(fā)環(huán)境優(yōu)。

          ????? 在組建開發(fā)組時,還應(yīng)充分估計到開發(fā)過程中的人員風(fēng)險。由于工作環(huán)境、待遇、工作強度、公司的整體工作安排和其他無法預(yù)知的因素,一個項目尤其是開發(fā)周期 較長的項目幾乎無可避免的要面臨人員的流入流出。如果不在項目初期對可能出現(xiàn)的人員風(fēng)險進行充分的估計,作必要的準備,一旦風(fēng)險轉(zhuǎn)化為現(xiàn)實,將有可能給整 個項目開發(fā)造成巨大的損失。以較低的代價進行及早的預(yù)防是降低這種人員風(fēng)險的基本策略。具體來說可以從以下幾個方面對人員風(fēng)險進行控制:

          ????? a.保證開發(fā)組中全職人員的比例,且項目核心部分的工作應(yīng)該盡量由全職人員來擔任, 以減少兼職人員對項目組人員不穩(wěn)定性的影響。
          ????? b.建立良好的文檔管理機制,包擴項目組進度文檔、個人進度文檔、版本控制文檔、整體技術(shù)文檔、個人技術(shù)文檔、源代碼管理等。一旦出現(xiàn)人員的變動,比如某個組員因病退出,替補的組員能夠根據(jù)完整的文檔盡早接手工作。
          ????? c.加強項目組內(nèi)技術(shù)交流,比如定期開技術(shù)交流會,或根據(jù)組內(nèi)分工建立項目組內(nèi)部的開發(fā)小組,是開發(fā)小組內(nèi)的成員能夠相互熟悉對方的工作和進度,能夠在必要的時候替對方工作。
          ????? d.對于項目經(jīng)理,可以從一開始就指派一個副經(jīng)理在項目中協(xié)同項目經(jīng)理管理項目開發(fā)工作,如果項目經(jīng)理退出開發(fā)組,副經(jīng)理可以很快接手。但是只建議在項目經(jīng)理這樣的高度重要的崗位采用這種冗余復(fù)制的策略來預(yù)防人員風(fēng)險,否則將大大增加項目成本。
          ????? e.為項目開發(fā)提供盡可能好的開發(fā)環(huán)境,包括工作環(huán)境、待遇、工作進度安排等等,同 時一個優(yōu)秀的項目經(jīng)理應(yīng)該能夠在項目組內(nèi)營造一種良好的人際關(guān)系和工作氛圍。良好的開發(fā)環(huán)境對于穩(wěn)定項目組人員以及提高生產(chǎn)效率都有不可忽視的作用。

          八.軟件過程能力評估

          ????? 軟件過程能力描述了一個開發(fā)組織開發(fā)軟件開發(fā)高質(zhì)量軟件產(chǎn)品的能力?,F(xiàn)行的國際標準主要有兩個:ISO9000.3和CMM

          ????? ISO9000.3是ISO9000質(zhì)量體系認證中關(guān)于計算機軟件質(zhì) 量管理和質(zhì)量保證標準部分。它從管理職責(zé)、質(zhì)量體系、合同評審、設(shè)計控制、文件和資料控制、采購、顧客提供產(chǎn)品的控制、產(chǎn)品標識和可追溯性、過程控制、檢 驗和試驗、檢驗/測量和試驗設(shè)備的控制、檢驗和試驗狀態(tài)、不合格品的控制、糾正和預(yù)防措施、搬運/貯存/包裝/防護和交付、質(zhì)量記錄的控制、內(nèi)部質(zhì)量審 核、培訓(xùn)、服務(wù)、統(tǒng)計系統(tǒng)等二十個方面對軟件質(zhì)量進行了要求。

          ????? CMM(能力成熟度模型)是美國卡納基梅隆大學(xué)軟件工程研究所(CMU/SEI)于1987年提出的評估和指導(dǎo)軟件研發(fā)項目管理的一系列方法,用5個不斷進化的層次來描述軟件過程能力。現(xiàn)在CMM是2.0版本。

          ????? ISO9000和CMM的共同點是二者都強調(diào)了軟件產(chǎn)品的質(zhì)量。所不同的是,ISO9000強調(diào)的是衡量的準則,但沒有告訴軟件開發(fā)人員如何達到好的目 標,如何避免差錯。CMM則提供了一整套完善的軟件研發(fā)項目管理的方法。它可告訴軟件開發(fā)組織,如果要在原有的水平上提高一個等級,應(yīng)該關(guān)注哪些問題,而 這正是改進軟件過程的工作。

          ????? CMM描述了五個級別的軟件過程成熟度(初始級,可重復(fù)級,已定義級,已定量管理級,優(yōu)化級),成熟度反映了軟件過程能力的大小。

          ????? 初始級特點是軟件機構(gòu)缺乏對軟件過程的有效管理,軟件過程是無序的,有時甚至是混亂的,對過程幾乎沒有定義,其軟件項目的成功來源于偶爾的個人英雄主義而 非群體行為,因此它不是可重復(fù)的;可重復(fù)級的特點是軟件機構(gòu)的項目計劃和跟蹤穩(wěn)定,項目過程可控,項目的成功是可重復(fù)的;已定義級的特點在于軟件過程已被 提升成標準化過程,從而更加具有穩(wěn)定性、可重復(fù)性和可控性;已定量管理級的軟件機構(gòu)中軟件過程和軟件產(chǎn)品都有定量的目標,并被定量地管理,因而其軟件過程 能力是可預(yù)測的,其生產(chǎn)的軟件產(chǎn)品是高質(zhì)量的;優(yōu)化級的特點是過程的量化反饋和先進的新思想、新技術(shù)促進過程不斷改進,技術(shù)和過程的改進改進被作為常規(guī)的 業(yè)務(wù)活動加以計劃和管理。

          ????? CMM是科學(xué)評價一個軟件企業(yè)開發(fā)能力的標準,但要達到較高的級別也非常困難,根據(jù)1995年美國所做的軟件產(chǎn)業(yè)成熟度的調(diào)查,在美國的軟件產(chǎn)業(yè)中, CMM成熟度等級為初始級的竟占70%,為可重復(fù)級的占15%,為定義級的所占比例小于10%,為管理級的所占比例小于5%,為優(yōu)化級的所占比例小于l %。而國內(nèi)企業(yè)的水平就更加堪優(yōu),到目前為止,只有東軟一家達到優(yōu)化級,少數(shù)幾家能夠達到可定義級。盡快改變這種局面,科學(xué)化、規(guī)范化、高效的進行軟件開 發(fā)活動,從整體提高我國軟件行業(yè)的水平,是國內(nèi)軟件企業(yè)的當務(wù)之急,也是專業(yè)人員應(yīng)該為自己制定的目標。如果有一天也能指揮一個數(shù)千人的龐大開發(fā)隊伍,操 作Windows這樣巨型規(guī)模的軟件項目,并生產(chǎn)出高質(zhì)量的產(chǎn)品,才有理由宣稱自己的軟件項目管理能力達到了一個“自主自足”的水平。

          九. 為什么要有項目管理?

          ????? 沒有項目管理,項目也有可能成功。但沒有管理的項目,很難保證項目的利潤空間,對公司來說,虧損的風(fēng)險就大。所以我們要有項目管理,以保證公司在總體上是盈利的,注意不是每一個項目都要盈利。

          ????? 另外,有了項目管理,就有了管理改進的基礎(chǔ),無論剛開始的項目管理多么糟糕,只要有管理,就有了改進的可能性,至于能不能得到改進,以及改進的快慢,則取 決于兩個因素:一個是人,特別是各級管理者;另一個是利益。關(guān)鍵是"利益",準確的說是"利益的分配",在權(quán)責(zé)利明確的前提下,人才能充分的發(fā)揮作用。還 需要指出的是"利益"是多元的,這里的多元不僅指利益的具體形式,而且指利益的受眾是多元的,包括客戶方相關(guān)人員個人的利益。


          十. 為什么要有專職的項目經(jīng)理?

          ????? 專業(yè)化是一個趨勢,因為在專業(yè)化的條件下,可以有效降低成本,提高利潤率。項目經(jīng)理的工作內(nèi)容歸根到底只有一項:識別并管理風(fēng)險。這項工作的目的是控制項目成本。

          ????? 由于項目的風(fēng)險是多方面的,而且風(fēng)險的表現(xiàn)形式也是多種多樣的。從風(fēng)險范圍上來說,既有公司內(nèi)部風(fēng)險,也有和客戶交流、合作的風(fēng)險;從風(fēng)險的類型上來說,既有管理風(fēng)險,也有技術(shù)風(fēng)險;從風(fēng)險產(chǎn)生的階段來說,包括了從業(yè)務(wù)分析到上線后維護的項目周期各個階段。

          ????? 我認為一個項目經(jīng)理是否優(yōu)秀,主要是看他/她能在多大程度上提前識別并消除風(fēng)險,而不是彌補和解決了多少問題(風(fēng)險未被及時識別或妥善處理,就會轉(zhuǎn)換成問題)。當然能彌補和解決問題的項目經(jīng)理也是相當合格的,但還不夠優(yōu)秀。

          十一. 項目組的范圍界限在哪里?

          ????? 項目組的范圍界限可以有三種劃分:

          ????? 1、包括客戶方所有參與該項目的立項、調(diào)研、審批、測試和使用人員,包括開發(fā)商市場開發(fā)、管理審批、商務(wù)談判、后勤保障和具體負責(zé)該項目開發(fā)的人員;

          ????? 2、包括客戶方項目經(jīng)理、業(yè)務(wù)需求提出人和測試人,包括開發(fā)商具體負責(zé)該項目開發(fā)的人員;

          ????? 3、僅包括開發(fā)商具體負責(zé)該項目開發(fā)的人員。

          ????? 大部分人在思想上可以接受范圍1,而在實務(wù)中接受的是范圍3。而我個人認為項目經(jīng)理,特別是開發(fā)商方面的項目經(jīng)理應(yīng)該采用的是范圍2。

          ????? 對項目組范圍理解不同,將影響項目經(jīng)理對工作的處理方式,范圍1實際上是很虛的,在項目管理實務(wù)操作中沒有太大的意義;而范圍3實質(zhì)是把客戶方和該項目有 密切關(guān)系的人與開發(fā)商具體負責(zé)該項目開發(fā)的人對立起來,也就是所謂的甲方、乙方。在這種對立的前提下處理項目的分歧和矛盾,效果肯定要打折扣。

          ????? 而按范圍2來理解,在項目管理實務(wù)中項目經(jīng)理就必須要讓客戶方和該項目有密切關(guān)系的人也接受這一觀點,從而拆除雙方之間的"障礙",達到相互信任、相互尊 重、共同協(xié)商解決問題的良性氛圍,以達到降低項目外部風(fēng)險的目的。當然,這樣就增大了項目經(jīng)理工作的難度,但對項目的成功則是很重要的。

          十二. 怎樣才能算是一個成功的項目?

          ????? 對"成功項目"的標準解釋為:項目范圍、項目成本、項目開發(fā)時間、客戶滿意度四點達到要求。我認為其實只有一點--利益。項目范圍、客戶滿意度主要代表客 戶的利益,項目成本主要代表開發(fā)商的利益,項目開發(fā)時間同時影響雙方的利益。但每一個人關(guān)心的"利益"是不同的。

          十三. 軟件項目管理的成功原則

          ????? 1平衡原則

             在我們討論軟件項目為什么會失敗時可以列出了很多的原因,答案有很多,如管理問題、技術(shù)問題、人員問題等等,但是有一個根本的思想問題是最容易忽視的, 也是軟件系統(tǒng)的用戶、軟件開發(fā)商、銷售代理商最不想正視的,那就是:需求、資源、工期、質(zhì)量四個要素之間的平衡關(guān)系問題。

            需求定義 了"做什么",定義了系統(tǒng)的范圍與規(guī)模,資源決定了項目的投入(人、財、物),工期定義了項目的交付日期,質(zhì)量定義了做出的系統(tǒng)好到什么程度,這四個要素 之間是有制約平衡關(guān)系的。如果需求范圍很大,要在較少的資源投入下,很短的工期內(nèi),很高的質(zhì)量要求來完成某個項目,那是不現(xiàn)實的,要么需要增加投資,要么 工程延期;如果需求界定清楚了,資源固定了,對系統(tǒng)的質(zhì)量要求很高,則可能需求延長工期。

            對于上述四個要素之間的平衡關(guān)系最容易犯的一個錯誤,就是鼓吹"多快好省"四個字,"多快好省",多么理想的境界?。啃枨笤蕉嘣胶?,工期越短越好,質(zhì)量越高越好,投入越少越好,這是用戶最常用的口號。

          多:需求越多越好嗎?

             軟件系統(tǒng)實施的基本原則是"全局規(guī)劃,分步實施,步步見效",需求可以多,但是需求一定要分優(yōu)先級,要分清企業(yè)內(nèi)的主要矛盾與次要矛盾,根據(jù) PARETO的80-20原則,企業(yè)中的80%的問題可以用20%的投資來解決,如果你要大而全,對不起,你那20%的次要問題是需要你花費80%的投資 的!而這一點恰恰是很多軟件用戶所不能忍受的。

          快:真能快起來嗎?

            "快"是用戶、軟件開發(fā)商都希望的。傳統(tǒng)企業(yè)里 強調(diào)資金的周轉(zhuǎn)情況,軟件企業(yè)里強調(diào)的是人員的周轉(zhuǎn)情況,開發(fā)人員應(yīng)盡快做完一個項目再做另外一個項目,通過快速的啟動項目、結(jié)束項目來承擔更多的項目, 來獲利。但是"快"不是主觀的拍腦袋定工期就可以完成的,工期的定義一定要基于資源的狀況、需求的多少與質(zhì)量的需求來進行推算的。軟件畢竟需要一行代碼一 行代碼的寫出來,他的工作量是客觀的,并非?quot;人有多大膽,地有多大產(chǎn)"式的精神鼓動就可以短期完成的。

          ?。菏〉绞裁闯潭??

            "一分錢一分貨",這是中國的俗話,他是符合價值規(guī)律的。甲方希望少投入,乙方希望降低自己的生產(chǎn)成本,省到乙方僅能保本的時候,再省,乙方就虧損了。

            正視這四個要素之間的平衡關(guān)系是軟件用戶、開發(fā)商、代理商成熟理智的表現(xiàn),否則系統(tǒng)的成功就失去了一塊最堅實的理念基礎(chǔ)。

            企業(yè)實施IT系統(tǒng)的首要目標是要成功,而不是失敗,企業(yè)可以容忍小的成功,但不一定容忍小的失敗,所以需要真正理解上述四個要素的平衡關(guān)系,確保項目的成功。

          ????? 2高效原則

             在需求、資源、工期、質(zhì)量四個要素中,很多的項目決策者是將進度放在首位的,現(xiàn)在市場的競爭越來越激烈,"產(chǎn)品早上市一天,就早掙一天錢,掙的就比花的 多,所以一定要多掙",基于這樣一個理念,軟件開發(fā)越來越追求開發(fā)效率,大家從技術(shù)、工具、管理上尋求更多更好的解決之道。

            基于高效的原則,對項目的管理需要從幾個方面來考慮:
            要選擇精英成員
            目標要明確,范圍要清楚
            溝通要及時、充分
            要在激勵成員上下工夫

          ????? 3分解原則

            "化繁為簡,各個擊破"是自古以來解決復(fù)雜問題的不二法門,對于軟件項目來講,可以將將大的項目劃分成幾個小項目來做,將周期長的項目化分成幾個明確的階段。

             項目越大對項目組的管理人員、開發(fā)人員的要求越高,參與的人員越多,需要協(xié)調(diào)溝通的渠道越多,周期越長,開發(fā)人員也容易疲勞,將大項目拆分成幾個小項 目,可以降低對項目管理人員的要求,減少項目的管理風(fēng)險,而且能夠充分地將項目管理的權(quán)力下放,充分調(diào)動人員的積極性,目標會比較具體明確,易于取得階段 性的成果,使開發(fā)人員有成就感。

            作者主管過的一個產(chǎn)品開發(fā)項目代號為SB,該項目前期投入了5人做需求,時間達3個多月,進入開發(fā) 階段后,投入了15人,時間達10個月之久,陸續(xù)進行了3次封閉開發(fā),在此過程中經(jīng)歷了需求的裁剪、開發(fā)人員的變更、技術(shù)路線的調(diào)整,項目組成員的壓力極 大,大家疲憊不堪,產(chǎn)品上市時間拖期達4個月。項目完工后總結(jié)下來的很致命的一個教訓(xùn)就是應(yīng)該將該項目拆成3個小的項目來做,進行階段性版本化發(fā)布,以緩 解市場上的壓力,減少項目組成員的挫折感,提高大家的士氣。

          ????? 4實時控制原則

            在一家大型的軟件公司中, 有一位很有個性的項目經(jīng)理,該項目經(jīng)理很少談起什么管理理論,也未見其有什么明顯的管理措施,但是他連續(xù)做成多個規(guī)模很大的軟件項目,而且應(yīng)用效果很好。 作者一直很奇怪他為什么能做的如此成功,經(jīng)過仔細觀察,終于發(fā)現(xiàn)他的管理可以用"緊盯"2字來概括,即每天他都要仔細檢查項目組每個成員的工作,從軟件演 示到內(nèi)部的處理邏輯、數(shù)據(jù)結(jié)構(gòu)等,一絲不茍,如果有問題,改不完是不能去休息的。正是在他這種簡單的措施下,支撐他完成了很多大的項目,當然他也是相當?shù)? 辛苦,通常都是在凌晨才去休息。我們并非要推崇這種做法,這種措施也有他的問題,但是,這種實踐卻說明了一個很樸實的道理:如果你沒有更好的辦法,就要辛 苦一點,實時控制項目的進展,要將項目的進展情況完全的實時的置于你的控制之下。

            上述的方法中對項目經(jīng)理的個人能力、犧牲精神要求 是很高,我們需要有一種進行實時控制項目進度的機制,依靠一套規(guī)范的過程來保證實時監(jiān)控項目的進度。如在微軟的管理策略中強?quot;每日構(gòu)建",這確 實是是一種不錯的方法,即每天要進行一次系統(tǒng)的編譯鏈接,通過編譯鏈接來檢查進度、檢查接口、發(fā)現(xiàn)進展中的問題、大家互相鼓勵互相監(jiān)督。

            實時控制確保項目經(jīng)理能夠及時發(fā)現(xiàn)問題、解決問題,保證項目具有很高的可見度,保證項目的正常進展。

          ????? 5分類管理原則

             對于不同的軟件項目其項目目標差別很大,項目規(guī)模也是不同的,應(yīng)用領(lǐng)域是不同的,采用的技術(shù)路線差別也很大,因而,針對每個項目的不同特點,其管理的方 法、管理的側(cè)重點應(yīng)該是不同的。就像古人講的,"因材施教","對癥下藥"。對于小項目你肯定不能象管理大項目那樣去做,對于產(chǎn)品開發(fā)類的項目,你也不可 能象管理系統(tǒng)集成類的項目那樣去做,項目經(jīng)理需要根據(jù)項目的特點,制訂不同的項目管理的方針政策。如,下表是作者為一家應(yīng)用軟件公司制訂的項目管理的方 針:

            在該案例中,將項目分成了訂單類項目與非訂單類項目,非訂單類項目是指由公司根據(jù)市場的需求開發(fā)一個標準產(chǎn)品的項目,而訂單類 是指針對某個具體的客戶定制軟件的項目,訂單類的項目根據(jù)需要協(xié)調(diào)的資源的范圍有劃分成了公司級、部門級、個人級三類,非訂單類根據(jù)估算的工作量的大小也 分成了A、B、C三類,估算的工作量超過720人天的為A類,超過360人天的為B類,360人天以下的為C類。不同類的項目管理的側(cè)重點是不同的,從立 項手續(xù)的完備性、計劃的嚴格層度、周報的完備層度、規(guī)范的嚴格層度、跟蹤的實時性、是否進行階段總結(jié)、是否核算項目成本、是否嚴格進行階段評審等多個方面 來考慮,以確保管理的可行性。

          ????? 6簡單有效原則

            項目經(jīng)理在進行項目管理的過程中,往往會得到開發(fā)人員這 樣的抱怨"太麻煩了,浪費時間,沒有用處",這是很普遍的一種現(xiàn)象。當然這樣的抱怨要從2個方面來分析,一方面從開發(fā)人員本身可能存在不理解,或者逆反心 理的情況,另一方面,項目經(jīng)理也要反思:我所采取的管理措施是否簡單有效?搞管理不是搞學(xué)術(shù)研究,沒有完美的管理,只有有效的管理,而項目經(jīng)理往往試圖堵 住所有的漏洞,解決所有的問題,恰恰是這種理想,會使項目的管理陷入一個誤區(qū),作繭自縛,最后無法實施有效的管理,導(dǎo)致項目的失敗。

          ????? 7規(guī)??刂圃瓌t

            該原則是和上面提到的其他原則相配合使用的,即要控制項目組的規(guī)模,不要人數(shù)太多,人數(shù)多了,進行溝通的渠道就多了,管理的復(fù)雜度就高了,對項目經(jīng)理的要求也就高了。在微軟的?
          十四. 軟件項目管理在管理思維中的空白

            空白1:為效益而實施項目管理
            
             為什么我們要實施項目管理,是為了提高項目的效益。這里所指的項目的效益是一個綜合性的指標,包括低風(fēng)險、高產(chǎn)出等。為此我們不難得出我們在實施項目管 理應(yīng)該掌握的度。即:引入項目管理后所產(chǎn)生的效益減去項目管理的成本后必須大于未引入項目管理時的效益。由于引入項目管理后所產(chǎn)生的效益與項目管理的復(fù)雜 度(項目管理的成本)并非線性相關(guān)的,因此項目管理的復(fù)雜度必然存在一個最優(yōu)值,這就是我們應(yīng)該把握的度。也許上面的說法比較抽象。一個實際行之可效的判 斷項目管理的度規(guī)則就是:大家認可并且能夠準確地理解和實施。拿美國項目管理專家James P Lewis的話說就是KISS原則(Keep it simple and stupid),拿物理學(xué)家愛因斯坦的話說就是:Keep it simple but not too simple.

            空白2:考慮所處環(huán)境
            
             任何系統(tǒng)都是建立在一個具體的系統(tǒng)環(huán)境中的,一般情況下受上一級系統(tǒng)影響最為顯著,這是系統(tǒng)論的觀點。項目管理是企業(yè)管理的下屬層次,因此在很大程度上 項目管理的成功與否常常受企業(yè)管理的制度制約(比如說設(shè)備采購的批復(fù)等待會延誤工期),這就是為什么常常會出現(xiàn)計劃不如變化來的快的原因。因為我們在制定 計劃時根本就沒有考慮自身和客戶雙方的企業(yè)管理的環(huán)境,所以我們的計劃在實施過程中會受到企業(yè)管理環(huán)境因素的影響。我敢跟你打賭:在沒有人事激勵機制常常 拖欠或故意克扣員工工資但獲得CMM5認證的公司開發(fā)效率不會比一個沒有實施項目管理的開發(fā)團隊的效率高多少。因為惡劣的公司人事制度扼殺了開發(fā)人員的天 才和積極性。因此,作為一個項目管理者,審視自身的項目所處的企業(yè)環(huán)境并做出準確的判斷是非常有必要的。缺少良好的項目環(huán)境,項目管理者的心血常常白費。 這往往是我們中的一些項目經(jīng)理在不同的公司里項目管理表現(xiàn)大相徑庭的原因。
            
            此外,正是基于企業(yè)環(huán)境這樣一個觀點,目前美國 PMI,日本ENAA等提出了項目管理成熟度模型(OPM3和P2M),改變了傳統(tǒng)PMBOK的缺陷(忽略外部因素和自身的靈活性)。有興趣的項目管理者 可以參看有關(guān)項目管理成熟度和企業(yè)管理方面(建議參看職業(yè)經(jīng)理人方面)的資料。

            空白3:合理評判軟件項目管理
            
            我們總是把過多的項目失敗歸罪到項目經(jīng)理的名頭上。他們的角色常常是替罪羊而不是領(lǐng)導(dǎo)者,他們擁有的更多的是責(zé)任而絕非職權(quán)。實際上項目失敗并非完全決定于項目管理,比如說
          信息系統(tǒng)過 低的報價。一個項目按時在預(yù)算范圍內(nèi)完成了而另外一個則沒有按時完成,這不意味著第一個項目管理得比較好。因為前者可能是項目時間和成本寬松的項目而后者 根本就是不可能完成的項目。前者項目管理的意義在于獲得較高的項目效益而后者的意義在于避免更大的項目損失。很可惜,充滿了浮躁的軟件企業(yè)沒有諸如此類的 意識,一些項目在未開始前注定就是失敗的,項目經(jīng)理們一上手便被扣以一責(zé)任人的鐐銬。因此,項目管理有無具體效果,需要合理地進行評判,單純以出效益為上 的觀點未必有失偏頗。

            空白4:心理學(xué)的必要性
            
            沒有一個領(lǐng)域像軟件項目管理中人的因素更為重要,在軟件領(lǐng)域沒有 實現(xiàn)自動化之前,一切試圖取代人的主要作用的機制都是收效甚微的。人的行為是心智活動的表現(xiàn)。開發(fā)人員的心理活動決定了其在開發(fā)的表現(xiàn)。合適的壓力能夠勾 起開發(fā)人員的成功欲望但是過大的壓力卻直接影響著項目參與者的身心健康。特別是后者一直以來都未能引起軟件開發(fā)界的重視。很多人曾經(jīng)有過不明不白的辭職經(jīng) 歷,在沒有學(xué)習(xí)《管理心理學(xué)》之前,筆者對這些人的"過激"行為有時想想都覺得奇怪。作為一個軟件項目管理者,不了解和掌握管理心理學(xué),很難針對復(fù)雜多變 的人的因素采取合理的應(yīng)對措施,同時自身的心理健康也未必能夠得到保證。為此筆者建議有條件的軟件企業(yè),可以通過聘用心理顧問來處理員工的心理問題,以此 緩和由于工作壓力而導(dǎo)致的員工之間矛盾沖突和項目坍塌。

            空白5:尊重常識,系統(tǒng)性考慮問題
            
            這個觀點筆者在《軟 件項目管理原則談》已經(jīng)重申過。就像不要指望人一秒鐘跑二十米一樣指望項目中有過多的奇跡出現(xiàn)??上覀冎械拇蠖囗椖抗芾碚咴谶M行項目管理時依然實施"大 躍進"。我們的管理者都知道自然規(guī)律不可違抗性,但是卻很少有人意識到一些社會規(guī)律的不可違抗性。他們總以為唯物的主觀能動性能夠替代實際,產(chǎn)生奇跡。加 班被認為是解決資源匱乏的唯一途徑,通過開發(fā)人員"無上"的生產(chǎn)力來達成項目的成功。很少有人會意識到加班造成的疲勞會再次使工作效率降低這一事實。這是 一種缺乏常識和系統(tǒng)性思考問題的表現(xiàn)。諸如此類的表現(xiàn)還有"唯工具論"和"唯方法論"。
            
            實際上,項目管理涉及各個方方面面,一味提高某一方面作用而忽略該方面對其它方面的影響,并不能提高項目管理的層次和最終產(chǎn)出,這是制止我們的項目管理者走偏激(極端)立場的一劑良藥,希望項目管理者們能有所意識。

            空白6:學(xué)會思考
            
             項目管理不是拿來主義,需要項目管理者進行認真的思考。這就是為什么我們項目管理者中不乏PMP和IPMP但是項目卻未能如愿以償?shù)脑颉@碚摵蛯嵺`的 差距極大地挫傷項目管理者的積極性。"證書無用論"所持的觀點其依據(jù)也在于此。理論是一種完美的抽象,而現(xiàn)實是各種條件的集合。我們的項目管理者在實踐上 往往生搬硬套而忽略其依存條件,這就是招聘項目經(jīng)理"唯經(jīng)驗論"的來源。一位項目管理者跟我交流的時候提到無法使用掙值(Earned Value)的概念,原因是公司人事部和財務(wù)部不愿意出示員工的收入清單。我建議他將掙值換為掙時(Earned Time),以時間替代成本。從項目進度的意義上來看這兩者其實是一致的,問題馬上得到了解決。可惜的是我們的項目管理者往往未學(xué)會思考具體概念的真正含 義之前并匆匆上驢,提著長槍去和風(fēng)車做斗爭去了(注:唐吉訶德)。

            空白7:學(xué)會計劃
            
            現(xiàn)實中我們往往用補救措施代替計劃,其效果便如軟件缺陷的 放大效應(yīng)。在項目經(jīng)理的招聘中,你聽到的只是幾個項目管理白癡問你項目出了什么問題應(yīng)該怎樣解決的提問,這些項目管理白癡在不斷地做各種問題假設(shè),而你必 須根據(jù)假設(shè)采取各種符合這些項目管理白癡口味的回答。但是,作為項目管理的來說,項目管理的真正意義在于事先預(yù)防各種偏離項目目標的問題出現(xiàn)而不是在于解 決問題。古話說得好"磨刀不誤砍柴工"。你不能期望癌癥有100%的治愈率,但是你可以通過合理的生活習(xí)慣和鍛煉來防止癌癥的出現(xiàn)。我們在進行項目管理 時,首先應(yīng)該考慮如何防止問題的出現(xiàn),雖然它不能保證所有的問題(風(fēng)險)都可以避免,但是通過計劃,你將擁有更多問題(風(fēng)險)應(yīng)對儲備,能夠在問題出現(xiàn)時 有備無患。一個只會在問題出現(xiàn)時考慮應(yīng)對措施的項目經(jīng)理只是一個失敗的項目經(jīng)理。其項目結(jié)果無異是把健康交給醫(yī)生而不是自己。作為項目管理的定位來說,項 目管理應(yīng)該是"管理會計"的角色而不是"成本會計"的角色。
            
            最后,以某電影的臺詞來結(jié)束本文;人為什么犯?。亢唵蔚臇|西想復(fù)雜 了,復(fù)雜的東西想簡單了,人就會犯病"。拿這句臺詞來形容我們目前的項目管理狀況一點也不為過。軟件項目管理是一個從"自發(fā)"走向"自覺"的過程,也是一 個從經(jīng)驗主義走向理性主義的過程。軟件項目管理是一個主動的管理,而這一切,需要廣大項目管理者的項目管理思維和積極實踐。

          ?

          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1231828

          posted @ 2007-03-19 22:12 junhong 閱讀(342) | 評論 (0)編輯 收藏

          WSDL Info

          A WSDL document defines services as collections of network endpoints, or ports. In WSDL, the abstract definition of endpoints and messages is separated from their concrete network deployment or data format bindings. This allows the reuse of abstract definitions: messages, which are abstract descriptions of the data being exchanged, and port types which are abstract collections of operations. The concrete protocol and data format specifications for a particular port type constitutes a reusable binding. A port is defined by associating a network address with a reusable binding, and a collection of ports define a service. Hence, a WSDL document uses the following elements in the definition of network services:

          Services are defined using six major elements:

          • types, which provides data type definitions used to describe the messages exchanged.
          • message, which represents an abstract definition of the data being transmitted. A message consists of logical parts, each of which is associated with a definition within some type system.
          • portType, which is a set of abstract operations. Each operation refers to an input message and output messages.
          • binding, which specifies concrete protocol and data format specifications for the operations and messages defined by a particular portType.
          • port, which specifies an address for a binding, thus defining a single communication endpoint.
          • service, which is used to aggregate a set of related ports.


          If the values being passed are part1=1, part2=2, part3=3, the request format would be as follows for each port:

          port1: GET, URL="http://example.com/o1/A1B2/3"
          port2: GET, URL="http://example.com/o1?p1=1&p2=2&p3=3
          port3: POST, URL="http://example.com/o1", PAYLOAD="p1=1&p2=2&p3=3"

          For each port, the response is either a GIF or a JPEG image.

          Example 6. GET and FORM POST returning GIF or JPG

          <definitions .... >
          <message name="m1">
          <part name="part1" type="xsd:string"/>
          <part name="part2" type="xsd:int"/>
          <part name="part3" type="xsd:string"/>
          </message>

          <message name="m2">
          <part name="image" type="xsd:binary"/>
          </message>

          <portType name="pt1">
          <operation name="o1">
          <input message="tns:m1"/>
          <output message="tns:m2"/>
          </operation>
          </portType>

          <service name="service1">
          <port name="port1" binding="tns:b1">
          <http:address location="http://example.com/"/>
          </port>
          <port name="port2" binding="tns:b2">
          <http:address location="http://example.com/"/>
          </port>
          <port name="port3" binding="tns:b3">
          <http:address location="http://example.com/"/>
          </port>
          </service>

          <binding name="b1" type="pt1">
          <http:binding verb="GET"/>
          <operation name="o1">
          <http:operation location="o1/A(part1)B(part2)/(part3)"/>
          <input>
          <http:urlReplacement/>
          </input>
          <output>
          <mime:content type="image/gif"/>
          <mime:content type="image/jpeg"/>
          </output>
          </operation>
          </binding>

          <binding name="b2" type="pt1">
          <http:binding verb="GET"/>
          <operation name="o1">
          <http:operation location="o1"/>
          <input>
          <http:urlEncoded/>
          </input>
          <output>
          <mime:content type="image/gif"/>
          <mime:content type="image/jpeg"/>
          </output>
          </operation>
          </binding>

          <binding name="b3" type="pt1">
          <http:binding verb="POST"/>
          <operation name="o1">
          <http:operation location="o1"/>
          <input>
          <mime:content type="application/x-www-form-urlencoded"/>
          </input>
          <output>
          <mime:content type="image/gif"/>
          <mime:content type="image/jpeg"/>
          </output>
          </operation>
          </binding>
          </definitions>

          4.2 How the HTTP GET/POST Binding Extends WSDL

          The HTTP GET/POST Binding extends WSDL with the following extension elements:

          <definitions .... >
          <binding .... >
          <http:binding verb="nmtoken"/>
          <operation .... >
          <http:operation location="uri"/>
          <input .... >
          <-- mime elements -->
          </input>
          <output .... >
          <-- mime elements -->
          </output>
          </operation>
          </binding>

          <port .... >
          <http:address location="uri"/>
          </port>
          </definitions>

          These elements are covered in the subsequent sections.

          4.3 http:address

          The location attribute specifies the base URI for the port. The value of the attribute is combined with the values of the location attribute of the http:operation binding element. See section 4.5 for more details.

          4.4 http:binding

          The http:binding element indicates that this binding uses the HTTP protocol.

          <definitions .... >
          <binding .... >
          <http:binding verb="nmtoken"/>
          </binding>
          </definitions>

          The value of the required verb attribute indicates the HTTP verb. Common values are GET or POST, but others may be used. Note that HTTP verbs are case sensitive.

          posted @ 2007-01-28 16:24 junhong 閱讀(346) | 評論 (0)編輯 收藏

          SAX2.0

          /*
          自從XML真正形成以來(我認為是Org.W3C組織發(fā)布XML標準時開始),XML得到了很快的發(fā)展,
          ?很多廠商都有推出了自己的XML解析器,Apachexalan,IBMxerces,sunJDOM,不過這些都是在
          ?基于JAXP(java API for XML processing),JDK 1.4.0開始的后續(xù)j2sdk里都附加了JAXP,這給開發(fā)人員
          ?帶來了很大的方便,這使得我們在處理一般的XML功能上的問題時不再需要去用第三方的XML處理器了.
          ?隨著XML的迅速發(fā)展,SAX也從1.0到了現(xiàn)在的2.0(還是能夠和1.0兼容),結(jié)構(gòu)上有了一些較大的變化.

          ?DOM(document object model)每次讀取XML節(jié)點時都要把它load內(nèi)存里 來,在文檔很大時,就顯得很慢了,SAX(simple API for XML),是一個XML解析器的接口,它比DOM更低級一些,它是一種基于事件和回調(diào)模式的XML處理方式,?因此在解析速度上DOM是沒法比 的(當要解析的XML文檔很大的時更是如此).那么在SAX中事件響應(yīng)(event)是什么呢 ??我個人認為這一點和Swing,AWT中的事件義有點相似的,都有是指在觸發(fā)某些特定的行為時所做的處理,:mouse click事件等到.?這里則是指碰到特定的XML節(jié)點的所做的處理,如文檔開始(startDocument),文檔結(jié)束 (endDocument),元素開始(startElement)等很多,大家看一下SAXAPI中的方法名字就知道有哪些事件了,基本上可以做到見 文知義的.在只想分析XML內(nèi)容(只讀),要求高性能,靈活性?能夠定位錯誤信息(SAX能夠定位錯誤的行列位置),最好用SAX來做.?一般情況下SAX是按下面的原理去使用的:
          ? <1>設(shè)置事件處理器(SAX 1.0是使用一個通過繼承HandlerBase類的實例來設(shè)置的,SAX 2.0則是繼承DefaultHandler,還有用XMLReader方式的,在原理上沒有很大的區(qū)別)
          ? <2>載入要解析的內(nèi)容
          ? <3>在需要解析的事件方法里(具體參見SAX API文檔)加入自己的控制邏輯.
          ? <4>重復(fù)<3>直到解析完為止.??????? ?????????
          ?
          ?在這里我自己寫了一個描述電影海報信息的XML文件(file.xml),SAX2.0寫了一個很簡單的XML內(nèi)容閱讀器來解析它,?和大家交流一下自己的心得.程序在我的機器上經(jīng)過了測試的(OS: win2k Advanced Server(English version),
          ?Intel pentium CPU, 256M RAM)
          */

          import org.w3c.dom.*;
          import org.xml.sax.*;
          import org.xml.sax.helpers.*;
          import javax.xml.parsers.*;

          class MyXMLReader extends DefaultHandler
          {??
          ?//Fields
          ?private int index;
          ?private Locator locator;

          ?//Constructor
          ?public MyXMLReader(){
          ??super(); //it must be done !
          ?}

          ?//nain method
          ?public static void main(String[] args){
          ??try{???
          ????? SAXParserFactory sf? = SAXParserFactory.newInstance();
          ????? SAXParser sp = sf.newSAXParser();
          ????? MyXMLReader reader = new MyXMLReader();
          ????? sp.parse(new InputSource("film.xml"),reader);
          ??}
          ??catch(Exception e){
          ???e.printStackTrace();
          ??}
          ?}?

          ?//Response the startDocument event
          ?public void startDocument() {
          ??System.out.println("\n********************************* (:?元旦電影海報 :)?***********************************\n");
          ?}??

          //Response the startElement event
          ?public void startElement(String uri, String localName, String qName, Attributes attrs){??
          ??if( qName.equalsIgnoreCase("film") ){???
          ???index ++;???
          ???int attrCount = attrs.getLength();
          ???for( int i = 0; i < attrCount; i ++ ){
          ????String attrName = attrs.getQName(i);
          ????if( attrName.equalsIgnoreCase("name") ){
          ?????System.out.println("\t" + index + ",片名:<<" +? attrs.getValue(i) + ">>");
          ????}
          ????if( attrName.equalsIgnoreCase("price") ){
          ?????System.out.println("\t票價:" + attrs.getValue(i) );?????
          ????}
          ????if( attrName.equalsIgnoreCase("station") ){
          ?????System.out.println("\t放映地點:" + attrs.getValue(i) );?????
          ????}
          ????if( attrName.equalsIgnoreCase("time") ){
          ?????System.out.println("\t放映時間:" + attrs.getValue(i) );
          ????}
          ????if( attrName.equalsIgnoreCase("describtion") ){
          ?????System.out.println("\t影片簡介:" + attrs.getValue(i) );
          ????}
          ????System.out.println();
          ??}
          ?}

          ?//Response the endDocument event
          ?public void endDocument(){
          ??System.out.println("\t\t\t\t\t\t\t------?共有" + index + "場電影要放映");??
          ?}

          ?//Response the endElement event
          ?public void endElement(String uri, String localName, String qName){
          ??? ?//add your codes if neccessary ...
          ?}

          ?//Print the fata error information
          ?public void fatalError(SAXParseException e){
          ??System.out.println("\nFatal error information -->");
          ??System.out.println("\t" + e.getMessage());
          ??System.out.println("\tAt line " + locator.getLineNumber() +
          ????????????????? ",column " + locator.getColumnNumber());
          ?}
          ?
          ?//Print the usual error information
          ?public void error(SAXParseException e){
          ??System.out.println("\nUsual error information -->");??
          ??System.out.println("\t" + e.getMessage());
          ??System.out.println("\tAt line " + locator.getLineNumber() +
          ????????????????? ",column " + locator.getColumnNumber());
          ?}
          ?
          ?//Print the warning information
          ?public void warning(SAXParseException e){
          ??System.out.println("\nWarning information -->");????
          ??System.out.println("\t" + e.getMessage());??
          ??System.out.println("\tAt line " + locator.getLineNumber() +
          ????????????????? ",column " + locator.getColumnNumber());
          ?}

          ?//Store the error locator object
          ?public void setDocumentLocator(Locator lct){
          ??locator = lct;
          ?}

          }//End class MyXMLReader

          : film.xml完全的內(nèi)容:

          <?xml version="1.0" encoding="GB2312"?>
          ?? <!-- 2003年元月1號長沙市各大影院落放映列表 -->
          ?? <common city="ChangSha China" date="01/01/2003">
          ???? <film name="英雄" price="30" station="田漢大劇場" time="19:00"
          ??????? describtion="國產(chǎn)最新大片,張藝謀導(dǎo)演,梁朝偉,張曼玉,李連杰等眾多大明星主演">
          ??</film>
          ??<film name="無間道" price="20" station="長沙市演藝中心" time="15:00"
          ??????? describtion="韓國大片">
          ??</film>
          ??<film name="武士" price="20" station="湖南省電影院" time="17:00"
          ??????? describtion="韓國大片,有點像英雄">
          ??</film>??
          ??<film name="長排山之戰(zhàn)" price="15" station="長沙市電影超市A1" time="19:00"
          ??????? describtion="反映對越自衛(wèi)反擊戰(zhàn)時期中國軍人的故事片">
          ? ??? </film>
          ??<film name="高山下的花環(huán)" price="15" station="長沙市電影超市A2" time="19:00"
          ??????? describtion="反映對越自衛(wèi)反擊戰(zhàn)時期中國軍人的故事片">
          ??</film>??
          ??? <film name="這里的黎明靜悄悄" price="15" station="長沙市電影超市A3" time="19:00"
          ??????? describtion="反映對越自衛(wèi)反擊戰(zhàn)時期中國軍人的故事片">
          ??</film>
          ??<film name="子夜" price="15" station="長沙市電影超市B1" time="19:00"
          ??????? describtion="反映對越自衛(wèi)反擊戰(zhàn)時期中國軍人的故事片">
          ??</film>
          ? </common>

          ?

          posted @ 2006-11-24 10:21 junhong 閱讀(651) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 社旗县| 溆浦县| 奉新县| 福鼎市| 江城| 会泽县| 上饶市| 通州区| 新泰市| 湘潭市| 綦江县| 沁源县| 万年县| 磐石市| 江都市| 水富县| 怀宁县| 靖宇县| 疏附县| 晋宁县| 武冈市| 南通市| 五河县| 曲周县| 阿合奇县| 富平县| 乐陵市| 罗平县| 清河县| 金乡县| 剑川县| 铜陵市| 莱芜市| 什邡市| 黑水县| 连南| 霍林郭勒市| 峡江县| 梧州市| 凤冈县| 蒲城县|