小軟體專案開發的管理

myattitude發表於2008-07-24
一個企業的管理,大公司有大公司的方式,小公司也有小公司的方式,如果把別人的經驗生搬硬套到自己身上,可能會適得其反。同樣,管理一個軟體專案也一樣,大專案和小專案的方式不完全一樣。但從另一個角度來看,專案的大與小並沒有本質的區別,很多方法是共通的。
一、小專案的特點
  大家知道,"軟體危機"的出現起源於一些大型專案的不斷延遲甚至失敗。小專案相比之下,具有以下特點:

  1.專案功能相對較少

  2.開發人員較少

  3.開發週期較短

  另外,在現實中,有很多小專案是由一些中小公司進行開發的,這些公司往往人員流動性較大,這也是不容忽視的一個現實.

二、小專案開發中常犯的錯誤

  小專案看起來比較簡單,比較容易成功,因而人們往往忽視了小專案的管理,其實這是一種誤解,從本人的經驗看來,小專案開發中容易犯以下的一些錯誤:

1、開發之前沒有認真地進行專案可行性和工作量的估計。

  往往由於專案較小,便很草率地制定一個開發日程表,沒有認真地估計專案難度,結果實際完成時間與估計完成時間往往有較大差別。

2、沒有真正的設計過程

  開發人員少,意味著不同人員的程式之間互動、介面相對少一些。開發週期短意味著往往是同樣的幾個人從頭到尾負責一個專案。這兩者都讓人容易犯些錯誤。往往是幾個人碰一下頭,討論一下最基本的資料結構、函式介面便分頭去做自己的工作了,沒有一份較正式的文件。這種做法潛在的危險之一是有的人可能會對討論出的介面、結構理解有偏差(應該承認人是會犯錯誤的)。一個誤解可能造成以後的返工。

  另一個潛在的危險是由於討論時忽略了某些情況,等大家都按當時的分工完成屬於自己的工作後,才發現各個模組組合起來卻形不成一個完整的系統。其根源在於沒有一個負責協調的人員不斷監控整個開發過程。

  第三個潛在的危險是一旦有人中途退出開發隊伍,其他人加入時,新來的人難以理解以前別人做好的程式碼,索性自己從頭來。另外,沒有文件的程式,日後維護和版本升級都比較困難。

3.不經過單元測試而直接進入系統測試

  造成這一現象的原因是每個模組相對比較簡單,但是為了測試一個模組需要建立一些軟體測試環境。例如,為了測試一個函式是否正確,應該用一些測試資料去呼叫該函式,需要編寫一些測試資料。但很多開發人員嫌麻煩,覺得反正其他模組也很快出來了,直接用真正的資料來執行幾次就行了。

  殊不知,一旦直接進入系統測試,發現執行結果不正確後需要一步步查詢。由於模組間的呼叫關係,可能查了很久才發現是某個模組的問題。這種方法一來效率比較低,大量的時間用在了將一個錯誤定位在模組上了。另外由於這種測試不完全,真正執行系統,當呼叫某模組時,可能大部分時候都是正常資料,極少出現邊界情況,可能某些邊界情況容易被忽視,很久之後才被發現。但是如果對每個模組進行單元測試時都進行一下邊界測試,就會很容易消除一些隱患。真可謂欲速則不達也。

三.合理的開發流程

  合理的開發模式,一句話形容就是"麻雀雖小,五臟俱全",即使是小型專案的開發,仍然應該遵循軟體開發的一般規律,必須的步驟不能省略。但是小專案有它自身的一些特點,實行起來可以相對靈活些。

  以下我從幾個方面描述一下我認為比較合理的模式:

1.需求獲取
  在進入正式開發之前,必須先從使用者處獲取準確的需求。在這上面花費相當時間是很必要的。

  軟體專案可以大致分為專用軟體和通用軟體兩大類。

  對於專用軟體,例如給某單位開發一套該單位專用的系統,一般使用者對於軟體要完成哪些功能已經有了一個比較清楚的輪廓,而且往往在開發合同中已經大致地規定了。

  但是,開發合同上規定的只是一個大概的框架,在進入開發之前必須與使用者進行比較具體的交流和討論,瞭解清楚使用者心目中的產品究竟是什麼樣子。這個步驟如果沒有好好做,往往到了開發工作的後期才發現開發人員的理解和使用者的要求有一些誤解,那麼必然造成時間上的浪費。

  對於通用軟體,在開發之前應該做一定的市場調查工作,一方面是從經濟效益考慮,調查產品的潛在市場有多大,另一方面是從技術的角度,必須瞭解清楚潛在使用者對軟體的各種技術上的要求,例如,使用者現有硬體配置如何,軟體配置如何,使用什麼網路,使用什麼資料庫等等,根據調查的統計結果決定即將開發的軟體的一些技術指標。

  為了比較好地與使用者進行交流,使用一些工具是很有好處的。專案管理者聯盟文章,深入探討。

  為了討論使用者介面,可以用VB, delphi等做一個原型,根據原型有針對性地與使用者討論需求。(原型開發不僅僅可以用於準確獲取使用者的需求,開發出來的原型本身可以作為下一步開發的基礎,增量式地完成開發)

  為了討論軟體執行的流程,可以採用UML的Use Case圖。

2.需求分析

  在瞭解使用者的需求之後,將需求用一種模型來表示,就是需求分析,目前比較流行的分析方法是物件導向的方法,通過分析使用者需求,用類、類之間的各種關係來表示整個系統。

這部分涉及到具體的方法,在此不詳細討論,但是原則上是提取類->類之間關係,可能需要不斷修改而形成一份分析文件。

  我想強調幾個問題。

  一是要分清問題域與系統責任。系統責任是指所要開發的軟體應該完成的功能,而問題域是包含所有相關的部分。例如你要開發一個程控機計費程式,程控機已經是現成,輸出的資料格式也已經是固定的,你的程式僅僅需要從程控機中讀取相應的資訊,那麼,"程控機"在你的系統裡只是一個外部的東西,把它作為一個類也許就是不必要的,僅僅需要一個類來完成讀資料的操作。又如,你需要在一個已經存在的資料庫上開發一些應用,資料庫的格式已經固定,並且已經有一個後臺程式在執行,你需要開發一個新的前臺程式,這時,伺服器程式對你來說就是一個外部的東西。但是,象這種外部的內容必須在分析文件中有一些說明,作為系統的外在約束。

  二是需求獲取與需求分析的關係。

  用什麼方法來完成需求的獲取,在很大程度上影響了需求分析的做法。

  例如當初採用Use Case來表示使用者需求,那麼從各種序列圖中選出相互互動的各個實體,就是一個個類。

  三是分析與設計過程的銜接。
  分析過程的內容是用類的結構來表示目標系統,並不設計具體實現,如採用什麼程式語言,在什麼作業系統平臺上執行等等。這些具體實現是在設計階段來完成的。物件導向方法的優點是分析、設計、編碼過程表示法統一,能比較好的銜接。但是,是把分析和設計階段分開,採用瀑布式開發,還是採用其他方式,要看具體的情況。
  對於需求潛在變化不大的專案,可以採用瀑布模型,有一個很明顯的設計階段,這樣做的好處是有一份比較完整的分析文件,這樣以後如果需要採用不同的程式語言、或者採用其他的平臺時,便可以以這份分析文件作為開發的基礎。

  對於需求變化頻繁的專案,可能採用少量分析->少量設計->少量編碼->測試的方式更合適,而且隨時可能要返回到前面某個一階段去進行修改。但是這意味著可能沒有一份完整的分析文件。

  現在很多CASE工具並不區分分析和設計的階段。但是,這並不意味著開發就可以對分析和設計不加區分,CASE工具如同一支筆,如何用好還得還人。

3.設計過程

  設計階段的工作包括:

  對分析模型必要的修改。可能需要對某些類結構進行一些修改,這些修改的原因可能是程式設計環境的要求,或者為了重用以前的某些工作。

  定義介面部分、資料訪問(資料庫)部分。

  由於目前很多程式語言都可以視覺化地設計介面,所以介面部分工作往往留到了編碼階段來完成。於是設計階段的工作量並不大。

4.編碼

  進入編碼工作之後,可能會發現前面分析或設計階段的某些錯誤,這時應返回到前面的階段進行必要的修改。

5.軟體測試

  如前所述,即使是小專案,也應該嚴格地進行軟體測試

四、人員的安排

  比較小的專案,往往是幾個人來完成,這幾個人基本上從頭到尾參加開發。在這幾個人中,有一位專案負責人,負責分析、設計和協調的工作。由於專案小,專案負責人也要參加程式設計,那麼這人必須把時間合理運用,

  經驗告訴我幾條原則:

1.協調幾個人的工作比自己完成一段編碼更重要.

  由於協調上出了漏洞,可能導致很大的問題,所以專案負責人必須隨時監控各開發人員的工作,包括內容是否與要求發生偏差,進度是否滯後等等。只有在完成這些工作之後,專案負責人剩下的時間才能用於程式設計。

2.給每個開發人員明確的任務書.

  不管是用物件導向或者其他方法開發,分析、設計模型只是從功能的角度來描述系統。但是,具體開發時每個開發人員必須非常明確自己的任務,這些任務應該採用明確的文件來表示。

3.讓大家都大致熟悉設計模型.

  讓每個開發人員都清楚自己所做的工作在整個系統中處於什麼地位,有時侯可能會發現設計模型中的漏洞,避免了各人的程式碼編寫完畢之後又要修改的後果。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14780914/viewspace-408777/,如需轉載,請註明出處,否則將追究法律責任。

相關文章