明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

小軟件項(xiàng)目開(kāi)發(fā)的管理

[摘要]作者:mighill   一個(gè)企業(yè)的管理,大公司有大公司的方式,小公司也有小公司的方式,如果把別人的經(jīng)驗(yàn)生搬硬套到自己身上,可能會(huì)適得其反。同樣,管理一個(gè)軟件項(xiàng)目也一樣,大項(xiàng)目和小項(xiàng)目的方式不...
作者:mighill

  一個(gè)企業(yè)的管理,大公司有大公司的方式,小公司也有小公司的方式,如果把別人的經(jīng)驗(yàn)生搬硬套到自己身上,可能會(huì)適得其反。同樣,管理一個(gè)軟件項(xiàng)目也一樣,大項(xiàng)目和小項(xiàng)目的方式不完全一樣。但從另一個(gè)角度來(lái)看,項(xiàng)目的大與小并沒(méi)有本質(zhì)的區(qū)別,很多方法是共通的。本文的目的是從作者的經(jīng)驗(yàn)來(lái)談?wù)勑№?xiàng)目開(kāi)發(fā)的管理。

一、小項(xiàng)目的特點(diǎn)

  大家知道,"軟件危機(jī)"的出現(xiàn)起源于一些大型項(xiàng)目的不斷延遲甚至失敗。小項(xiàng)目相比之下,具有以下特點(diǎn):
  1.項(xiàng)目功能相對(duì)較少
  2.開(kāi)發(fā)人員較少
  3.開(kāi)發(fā)周期較短
  另外,在現(xiàn)實(shí)中,有很多小項(xiàng)目是由一些中小公司進(jìn)行開(kāi)發(fā)的,這些公司往往人員流動(dòng)性較大,這也是不容忽視的一個(gè)現(xiàn)實(shí).


二、小項(xiàng)目開(kāi)發(fā)中常犯的錯(cuò)誤

  小項(xiàng)目看起來(lái)比較簡(jiǎn)單,比較容易成功,因而人們往往忽視了小項(xiàng)目的管理,其實(shí)這是一種誤解,從本人的經(jīng)驗(yàn)看來(lái),小項(xiàng)目開(kāi)發(fā)中容易犯以下的一些錯(cuò)誤:
  
1、開(kāi)發(fā)之前沒(méi)有認(rèn)真地進(jìn)行項(xiàng)目可行性和工作量的估計(jì)。
  往往由于項(xiàng)目較小,便很草率地制定一個(gè)開(kāi)發(fā)日程表,沒(méi)有認(rèn)真地估計(jì)項(xiàng)目難度,結(jié)果實(shí)際完成時(shí)間與估計(jì)完成時(shí)間往往有較大差別。
  
2、沒(méi)有真正的設(shè)計(jì)過(guò)程
  開(kāi)發(fā)人員少,意味著不同人員的程序之間交互、接口相對(duì)少一些。開(kāi)發(fā)周期短意味著往往是同樣的幾個(gè)人從頭到尾負(fù)責(zé)一個(gè)項(xiàng)目。這兩者都讓人容易犯些錯(cuò)誤。往往是幾個(gè)人碰一下頭,討論一下最基本的數(shù)據(jù)結(jié)構(gòu)、函數(shù)接口便分頭去做自己的工作了,沒(méi)有一份較正式的文檔。
  這種做法潛在的危險(xiǎn)之一是有的人可能會(huì)對(duì)討論出的接口、結(jié)構(gòu)理解有偏差(應(yīng)該承認(rèn)人是會(huì)犯錯(cuò)誤的)。一個(gè)誤解可能造成以后的返工。
  另一個(gè)潛在的危險(xiǎn)是由于討論時(shí)忽略了某些情況,等大家都按當(dāng)時(shí)的分工完成屬于自己的工作后,才發(fā)現(xiàn)各個(gè)模塊組合起來(lái)卻形不成一個(gè)完整的系統(tǒng)。其根源在于沒(méi)有一個(gè)負(fù)責(zé)協(xié)調(diào)的人員不斷監(jiān)控整個(gè)開(kāi)發(fā)過(guò)程。
  第三個(gè)潛在的危險(xiǎn)是一旦有人中途退出開(kāi)發(fā)隊(duì)伍,其他人加入時(shí),新來(lái)的人難以理解以前別人做好的代碼,索性自己從頭來(lái)。另外,沒(méi)有文檔的程序,日后維護(hù)和版本升級(jí)都比較困難。
  
3.不經(jīng)過(guò)單元測(cè)試而直接進(jìn)入系統(tǒng)測(cè)試
  造成這一現(xiàn)象的原因是每個(gè)模塊相對(duì)比較簡(jiǎn)單,但是為了測(cè)試一個(gè)模塊需要建立一些測(cè)試環(huán)境。例如,為了測(cè)試一個(gè)函數(shù)是否正確,應(yīng)該用一些測(cè)試數(shù)據(jù)去調(diào)用該函數(shù),需要編寫(xiě)一些測(cè)試數(shù)據(jù)。但很多開(kāi)發(fā)人員嫌麻煩,覺(jué)得反正其他模塊也很快出來(lái)了,直接用真正的數(shù)據(jù)來(lái)運(yùn)行幾次就行了。
  殊不知,一旦直接進(jìn)入系統(tǒng)測(cè)試,發(fā)現(xiàn)運(yùn)行結(jié)果不正確后需要一步步查找。由于模塊間的調(diào)用關(guān)系,可能查了很久才發(fā)現(xiàn)是某個(gè)模塊的問(wèn)題。這種方法一來(lái)效率比較低,大量的時(shí)間用在了將一個(gè)錯(cuò)誤定位在模塊上了。另外由于這種測(cè)試不完全,真正運(yùn)行系統(tǒng),當(dāng)調(diào)用某模塊時(shí),可能大部分時(shí)候都是正常數(shù)據(jù),極少出現(xiàn)邊界情況,可能某些邊界情況容易被忽視,很久之后才被發(fā)現(xiàn)。但是如果對(duì)每個(gè)模塊進(jìn)行單元測(cè)試時(shí)都進(jìn)行一下邊界測(cè)試,就會(huì)很容易消除一些隱患。真可謂欲速則不達(dá)也。


三.合理的開(kāi)發(fā)流程

  合理的開(kāi)發(fā)模式,一句話形容就是"麻雀雖小,五臟俱全",即使是小型項(xiàng)目的開(kāi)發(fā),仍然應(yīng)該遵循軟件開(kāi)發(fā)的一般規(guī)律,必須的步驟不能省略。但是小項(xiàng)目有它自身的一些特點(diǎn),實(shí)行起來(lái)可以相對(duì)靈活些。
  以下我從幾個(gè)方面描述一下我認(rèn)為比較合理的模式.
  
1.需求獲取
  在進(jìn)入正式開(kāi)發(fā)之前,必須先從用戶處獲取準(zhǔn)確的需求。在這上面花費(fèi)相當(dāng)時(shí)間是很必要的。
  軟件項(xiàng)目可以大致分為專用軟件和通用軟件兩大類(lèi)。
  對(duì)于專用軟件,例如給某單位開(kāi)發(fā)一套該單位專用的系統(tǒng),一般用戶對(duì)于軟件要完成哪些功能已經(jīng)有了一個(gè)比較清楚的輪廓,而且往往在開(kāi)發(fā)合同中已經(jīng)大致地規(guī)定了。
  但是,開(kāi)發(fā)合同上規(guī)定的只是一個(gè)大概的框架,在進(jìn)入開(kāi)發(fā)之前必須與用戶進(jìn)行比較具體的交流和討論,了解清楚用戶心目中的產(chǎn)品究竟是什么樣子。這個(gè)步驟如果沒(méi)有好好做,往往到了開(kāi)發(fā)工作的后期才發(fā)現(xiàn)開(kāi)發(fā)人員的理解和用戶的要求有一些誤解,那么必然造成時(shí)間上的浪費(fèi)。
  對(duì)于通用軟件,在開(kāi)發(fā)之前應(yīng)該做一定的市場(chǎng)調(diào)查工作,一方面是從經(jīng)濟(jì)效益考慮,調(diào)查產(chǎn)品的潛在市場(chǎng)有多大,另一方面是從技術(shù)的角度,必須了解清楚潛在用戶對(duì)軟件的各種技術(shù)上的要求,例如,用戶現(xiàn)有硬件配置如何,軟件配置如何,使用什么網(wǎng)絡(luò),使用什么數(shù)據(jù)庫(kù)等等,根據(jù)調(diào)查的統(tǒng)計(jì)結(jié)果決定即將開(kāi)發(fā)的軟件的一些技術(shù)指標(biāo)。
  為了比較好地與用戶進(jìn)行交流,使用一些工具是很有好處的。
  為了討論用戶界面,可以用VB, delphi等做一個(gè)原型,根據(jù)原型有針對(duì)性地與用戶討論需求。(原型開(kāi)發(fā)不僅僅可以用于準(zhǔn)確獲取用戶的需求,開(kāi)發(fā)出來(lái)的原型本身可以作為下一步開(kāi)發(fā)的基礎(chǔ),增量式地完成開(kāi)發(fā))
  為了討論軟件運(yùn)行的流程,可以采用UML的Use Case圖。

2.需求分析
  在了解用戶的需求之后,將需求用一種模型來(lái)表示,就是需求分析,目前比較流行的分析方法是面向?qū)ο蟮姆椒,通過(guò)分析用戶需求,用類(lèi)、類(lèi)之間的各種關(guān)系來(lái)表示整個(gè)系統(tǒng)。
  這部分涉及到具體的方法,在此不詳細(xì)討論,但是原則上是提取類(lèi)->類(lèi)之間關(guān)系,可能需要不斷修改而形成一份分析文檔。
  我想強(qiáng)調(diào)幾個(gè)問(wèn)題。
  一是要分清問(wèn)題域與系統(tǒng)責(zé)任。系統(tǒng)責(zé)任是指所要開(kāi)發(fā)的軟件應(yīng)該完成的功能,而問(wèn)題域是包含所有相關(guān)的部分。例如你要開(kāi)發(fā)一個(gè)程控機(jī)計(jì)費(fèi)程序,程控機(jī)已經(jīng)是現(xiàn)成,輸出的數(shù)據(jù)格式也已經(jīng)是固定的,你的程序僅僅需要從程控機(jī)中讀取相應(yīng)的信息,那么,"程控機(jī)"在你的系統(tǒng)里只是一個(gè)外部的東西,把它作為一個(gè)類(lèi)也許就是不必要的,僅僅需要一個(gè)類(lèi)來(lái)完成讀數(shù)據(jù)的操作。又如,你需要在一個(gè)已經(jīng)存在的數(shù)據(jù)庫(kù)上開(kāi)發(fā)一些應(yīng)用,數(shù)據(jù)庫(kù)的格式已經(jīng)固定,并且已經(jīng)有一個(gè)后臺(tái)程序在運(yùn)行,你需要開(kāi)發(fā)一個(gè)新的前臺(tái)程序,這時(shí),服務(wù)器程序?qū)δ銇?lái)說(shuō)就是一個(gè)外部的東西。但是,象這種外部的內(nèi)容必須在分析文檔中有一些說(shuō)明,作為系統(tǒng)的外在約束。
  二是需求獲取與需求分析的關(guān)系。
  用什么方法來(lái)完成需求的獲取,在很大程度上影響了需求分析的做法。
  例如當(dāng)初采用Use Case來(lái)表示用戶需求,那么從各種序列圖中選出相互交互的各個(gè)實(shí)體,就是一個(gè)個(gè)類(lèi)。
  三是分析與設(shè)計(jì)過(guò)程的銜接。
  分析過(guò)程的內(nèi)容是用類(lèi)的結(jié)構(gòu)來(lái)表示目標(biāo)系統(tǒng),并不設(shè)計(jì)具體實(shí)現(xiàn),如采用什么編程語(yǔ)言,在什么操作系統(tǒng)平臺(tái)上運(yùn)行等等。這些具體實(shí)現(xiàn)是在設(shè)計(jì)階段來(lái)完成的。面向?qū)ο蠓椒ǖ膬?yōu)點(diǎn)是分析、設(shè)計(jì)、編碼過(guò)程表示法統(tǒng)一,能比較好的銜接。但是,是把分析和設(shè)計(jì)階段分開(kāi),采用瀑布式開(kāi)發(fā),還是采用其他方式,要看具體的情況。
  對(duì)于需求潛在變化不大的項(xiàng)目,可以采用瀑布模型,有一個(gè)很明顯的設(shè)計(jì)階段,這樣做的好處是有一份比較完整的分析文檔,這樣以后如果需要采用不同的編程語(yǔ)言、或者采用其他的平臺(tái)時(shí),便可以以這份分析文檔作為開(kāi)發(fā)的基礎(chǔ)。
  對(duì)于需求變化頻繁的項(xiàng)目,可能采用少量分析->少量設(shè)計(jì)->少量編碼->測(cè)試的方式更合適,而且隨時(shí)可能要返回到前面某個(gè)一階段去進(jìn)行修改。但是這意味著可能沒(méi)有一份完整的分析文檔。
  現(xiàn)在很多CASE工具并不區(qū)分分析和設(shè)計(jì)的階段。但是,這并不意味著開(kāi)發(fā)就可以對(duì)分析和設(shè)計(jì)不加區(qū)分,CASE工具如同一支筆,如何用好還得還人。
  
3.設(shè)計(jì)過(guò)程
  設(shè)計(jì)階段的工作包括:
  對(duì)分析模型必要的修改?赡苄枰獙(duì)某些類(lèi)結(jié)構(gòu)進(jìn)行一些修改,這些修改的原因可能是編程環(huán)境的要求,或者為了重用以前的某些工作。
  定義界面部分、數(shù)據(jù)訪問(wèn)(數(shù)據(jù)庫(kù))部分。
  由于目前很多編程語(yǔ)言都可以可視化地設(shè)計(jì)界面,所以界面部分工作往往留到了編碼階段來(lái)完成。于是設(shè)計(jì)階段的工作量并不大。
  
4.編碼
  進(jìn)入編碼工作之后,可能會(huì)發(fā)現(xiàn)前面分析或設(shè)計(jì)階段的某些錯(cuò)誤,這時(shí)應(yīng)返回到前面的階段進(jìn)行必要的修改。
  
5.測(cè)試
  如前所述,即使是小項(xiàng)目,也應(yīng)該嚴(yán)格地進(jìn)行測(cè)試。


四、人員的安排

  比較小的項(xiàng)目,往往是幾個(gè)人來(lái)完成,這幾個(gè)人基本上從頭到尾參加開(kāi)發(fā)。在這幾個(gè)人中,有一位項(xiàng)目負(fù)責(zé)人,負(fù)責(zé)分析、設(shè)計(jì)和協(xié)調(diào)的工作。由于項(xiàng)目小,項(xiàng)目負(fù)責(zé)人也要參加編程,那么這人必須把時(shí)間合理運(yùn)用,
  經(jīng)驗(yàn)告訴我?guī)讞l原則:

1.協(xié)調(diào)幾個(gè)人的工作比自己完成一段編碼更重要.
  由于協(xié)調(diào)上出了漏洞,可能導(dǎo)致很大的問(wèn)題,所以項(xiàng)目負(fù)責(zé)人必須隨時(shí)監(jiān)控各開(kāi)發(fā)人員的工作,包括內(nèi)容是否與要求發(fā)生偏差,進(jìn)度是否滯后等等。
  只有在完成這些工作之后,項(xiàng)目負(fù)責(zé)人剩下的時(shí)間才能用于編程。
  
2.給每個(gè)開(kāi)發(fā)人員明確的任務(wù)書(shū).
  不管是用面向?qū)ο蠡蛘咂渌椒ㄩ_(kāi)發(fā),分析、設(shè)計(jì)模型只是從功能的角度來(lái)描述系統(tǒng)。但是,具體開(kāi)發(fā)時(shí)每個(gè)開(kāi)發(fā)人員必須非常明確自己的任務(wù),這些任務(wù)應(yīng)該采用明確的文檔來(lái)表示。
  
3.讓大家都大致熟悉設(shè)計(jì)模型.
  讓每個(gè)開(kāi)發(fā)人員都清楚自己所做的工作在整個(gè)系統(tǒng)中處于什么地位,有時(shí)侯可能會(huì)發(fā)現(xiàn)設(shè)計(jì)模型中的漏洞,避免了各人的代碼編寫(xiě)完畢之后又要修改的后果。