溝通問題是一個項(xiàng)目成功最重要的因素之一。一個項(xiàng)目可能并沒有什么正式的軟件過程,,但是只要團(tuán)隊(duì)成員能夠進(jìn)行有效的溝通,,項(xiàng)目成功的可能性就很大,但是如果項(xiàng)目中缺乏有效的溝通渠道,,再優(yōu)秀,,再嚴(yán)謹(jǐn)?shù)能浖^程也沒有用。優(yōu)秀的軟件方法學(xué),,總是會在溝通渠道的建立,,推動有效溝通上花費(fèi)大量的精力。我們分析RUP,、XP等方法學(xué),,都會看到很多這樣的實(shí)踐。溝通對一個項(xiàng)目而言是重要的,,對一個軟件組織而言就更重要了,。從長期來看,內(nèi)部能夠進(jìn)行有效溝通的組織能夠得到很好的發(fā)展,,但是反過來,,內(nèi)部溝通不暢的組織將會出現(xiàn)很多的問題。 在軟件開發(fā)過程存在的一個很大的問題就是溝通不暢的問題,。事實(shí)上,這個問題并不僅僅在一個開發(fā)過程中存在,,在整個軟件組織內(nèi)都將長期的存在,并成為阻礙軟件組織發(fā)展的一大障礙,。這樣的說法可能過于理論化,,但是我們只要想想,,如果現(xiàn)在的項(xiàng)目中,,一個主力程序員離開的話,是否會給項(xiàng)目,,甚至組織帶來重大的影響,,就能夠理解這段話的含義了。造成這種現(xiàn)象的主要問題是程序是分散在各個程序員手中的,。各個代碼塊就像是程序員們的私有財(cái)產(chǎn)一樣,神圣不可侵犯,。 更為糟糕的是,任何一個程序員都不愿意閱讀他人的代碼,,比起理解別人的代碼,,程序員們寧可自己重新編寫代碼,,這導(dǎo)致另一個嚴(yán)重的問題――軟件組織中大部分的工作都是重復(fù)的,,以至于程序員天天忙于開發(fā)代碼,,卻難以把精力放在更有價值的地方(關(guān)于什么是更有價值的地方,,我們在下文會詳細(xì)的描述),。 在一些項(xiàng)目中,,我們經(jīng)??吹竭@樣一種開發(fā)環(huán)境:每個程序員都擁有個人的隔離空間,,彼此之間不進(jìn)行交流,甚至有時候他們整天不說一句話,。在和項(xiàng)目中的一位主力程序員進(jìn)行溝通之后,,我們發(fā)現(xiàn)了他們的真實(shí)想法: 項(xiàng)目非常緊張,,團(tuán)隊(duì)成員之間的關(guān)系非常的微妙,,主力程序員必須要保持自己的主力地位,,對他們來說,,必須努力寫出優(yōu)秀的代碼,,同時,,你還需要承擔(dān)項(xiàng)目進(jìn)度的壓力,,并提防著其它的程序員,。將程序掌握在手中是自己安全感的來源,。壓力如此之大,,他們不得不每天工作12個小時以上。程序開發(fā)就如同噩夢一樣,。 雖然未必所有的團(tuán)隊(duì)都如此不良的開發(fā)人文環(huán)境,但是或多或少都存在一些不好的環(huán)境因素,。可以肯定的說,,沒有多少人愿意在這樣一個開發(fā)環(huán)境中工作,。這些環(huán)境因素都影響了溝通問題的形成。 XP的四大價值觀中的一項(xiàng)就是溝通,。XP中的溝通范圍很廣,有開發(fā)人員和客戶之間的溝通(我們在需求和故事一章中也提到了溝通問題),,有程序員和設(shè)計(jì)師之間的溝通,,有程序員和測試人員之間的溝通。但是本文的重點(diǎn)集中在開發(fā)團(tuán)隊(duì)內(nèi)部,,即,,如何改進(jìn)開發(fā)團(tuán)隊(duì)內(nèi)部的溝通質(zhì)量。 XP方法論非常強(qiáng)調(diào)營造一種輕松的開發(fā)氛圍,重視人的價值勝于重視過程,。溝通是XP的一大價值觀,。XP中大量的實(shí)踐是圍繞溝通這個價值觀設(shè)計(jì)的,。例如,用戶故事,,現(xiàn)場客戶,,代碼集體所有權(quán)等等,,但是我們這里要強(qiáng)調(diào)的,是結(jié)對編程這一實(shí)踐,。本文中不對結(jié)對編程做介紹,,這方面的資料有很多,沒有必要在這里浪費(fèi)筆墨,。本文要討論的,,是我們?nèi)绾卧陧?xiàng)目的角度上考慮結(jié)對編程,。 結(jié)對編程是一種非常有效的改善溝通的方法,。一對編程人員是協(xié)作過程中最基本的溝通單元。在經(jīng)典的XP方法中,,結(jié)對編程指的是兩個程序員在同一時間,、同一機(jī)器前,,主動的共同的解決統(tǒng)一問題,。也許經(jīng)理們聽到這句話的第一個反應(yīng)就是:"這不可能,我花了兩倍的錢,,卻只做一個人的事情!"事實(shí)上,,結(jié)對編程運(yùn)用得當(dāng)?shù)脑挘悄軌蛱岣吖ぷ餍实?,不但體現(xiàn)在進(jìn)度上,還體現(xiàn)在代碼質(zhì)量,、以及項(xiàng)目風(fēng)險上,。 個人編程往往會遇到各種各樣的問題,。在軟件開發(fā)中,,編寫代碼往往只占構(gòu)建過程中很小一部分的時間,,很多的時間花在調(diào)試代碼,、改進(jìn)代碼結(jié)構(gòu),,以及針對需求或是設(shè)計(jì)的變更修改代碼。想必很多人都有這樣的經(jīng)歷,,在一些關(guān)鍵的技術(shù)問題上卡殼,,而單人進(jìn)行研究不但費(fèi)時費(fèi)力,而且很容易導(dǎo)致士氣的低落,。 在另一些時候,程序員往往需要在不同的設(shè)計(jì)選擇之間進(jìn)行權(quán)衡,,而一個人做出技術(shù)決策往往造成內(nèi)心的不安,,這時候就希望能夠有另一個同伴支持你做出決定。 說代碼是最嚴(yán)謹(jǐn)?shù)墓ぜ且稽c(diǎn)錯也沒有,,任何一個微小的錯誤,例如缺少分號,,都會造成程序運(yùn)行的錯誤,。雖然編譯器能夠檢查大部分的錯誤,可是仍然會有一些深藏其中的,,時不時出來搗亂的小錯誤,。一個人的眼睛往往容易錯過一些錯誤,但是兩個人同時進(jìn)行編碼,,這種出錯的概率將會大幅度的下降,。 為了修正代碼缺陷而進(jìn)行的調(diào)試工作往往會占用大量的人月,如果代碼缺陷到了測試團(tuán)隊(duì)的手中才被發(fā)現(xiàn),,修改缺陷的代價會很高,,而如果代碼缺陷一直持續(xù)到客戶手中才被發(fā)現(xiàn),這個代價更是驚人,。而通過對開發(fā)人員配對,,可以減少缺陷的數(shù)量。根據(jù)一些數(shù)據(jù)顯示,,結(jié)對編程可以讓缺陷的數(shù)量減少15%,。相對于在軟件過程后期改正缺陷所付出的高昂代價,采用結(jié)對編程還是值得的,。 以上討論的是個人編程中遇到的一些問題,,這些是很小的問題,,但是都會對開發(fā)人員的情緒、進(jìn)度產(chǎn)生影響,。而在一個團(tuán)隊(duì)環(huán)境中,,這些問題還會擴(kuò)大,升級為團(tuán)隊(duì)問題,。 雖然軟件組織規(guī)定了軟件編碼規(guī)范,,但是編碼規(guī)范不可能約定的過細(xì),過細(xì)的編碼規(guī)范不具備可操作性,。因此不同人寫出的代碼仍然相差很大,,優(yōu)秀的代碼和拙劣的代碼同時存在,每個人都熟悉各自的代碼,,但卻不愿意碰別人的代碼,。各種各樣風(fēng)格的代碼逐漸產(chǎn)生的代碼的混亂。這會產(chǎn)生很多問題,。首先,,軟件組織內(nèi)部復(fù)用的目標(biāo)難以實(shí)現(xiàn),如果人人都不愿意看別人的代碼,,你又如何建立一個內(nèi)部復(fù)用的框架呢,?現(xiàn)存的代碼無法進(jìn)行控制,舊項(xiàng)目的維護(hù)成本不斷上升,,團(tuán)隊(duì)積累也成為一句空話,, 其次,代碼復(fù)審的難度加大,。代碼復(fù)審是非常重要的工作,,但是代碼的混亂將會加大代碼復(fù)審的難度,因?yàn)閺?fù)審小組的成員不得不花費(fèi)時間來了解代碼的風(fēng)格,,并做出指導(dǎo)。更糟糕的是,,代碼復(fù)審小組的成員往往都是軟件組織中的重要成員,,他們的時間都代表了高昂的成本。也許沒有人仔細(xì)計(jì)算過這樣的成本,,但是這些成本累積起來,,也會是一個令人吃驚的數(shù)字。 再次,,項(xiàng)目風(fēng)險和組織風(fēng)險都隨之增大,。這種在以項(xiàng)目開發(fā)為結(jié)算單位的軟件開發(fā)組織中尤為明顯,因項(xiàng)目開發(fā)人員離開而導(dǎo)致項(xiàng)目源代碼難以維護(hù)的情況非常的普遍,。對于已經(jīng)完工的項(xiàng)目而言,,這使得項(xiàng)目維護(hù)成本上升,,對于尚未完工的項(xiàng)目而言,這會打亂現(xiàn)有的項(xiàng)目進(jìn)度,,導(dǎo)致項(xiàng)目進(jìn)度的延后,。 最后,也是致命的一個問題,,內(nèi)部溝通難以有效的進(jìn)行,。軟件開發(fā)不是一個單獨(dú)的活動。優(yōu)秀的程序員組成的團(tuán)隊(duì)未必就是一個優(yōu)秀的團(tuán)隊(duì),。究其原因,,大部分都是因?yàn)闇贤ú簧圃斐傻脑颉=M織內(nèi)部的知識很難形成流動,,開發(fā)人員之間難以共享知識,,而新成員也無法從經(jīng)驗(yàn)豐富的老員工那里學(xué)習(xí)。 溝通不暢最終會積累形成組織軟件設(shè)計(jì)平均水平無法提高的問題,。軟件設(shè)計(jì)屬于腦力勞動,,但是個人的知識覆蓋程度和思考能力都有限,個人的設(shè)計(jì)往往都是有缺陷的,,而雇傭大師級的開發(fā)人員的成本是相當(dāng)高昂的,,并不是所有的軟件組織都能夠像IBM或是微軟那樣雇傭大量的優(yōu)秀人才。因此面對有限的人力資源(數(shù)量和質(zhì)量兩方面),,關(guān)鍵的問題就在于如何讓有限的資源發(fā)揮最大的作用,。 在參與一家軟件組織的代碼復(fù)審之后,我加入了這一小節(jié)的內(nèi)容,。既然是工藝,,當(dāng)然是一些很細(xì)微的環(huán)節(jié),例如瀏覽集合的寫法,、類和方法的命令,、注釋的規(guī)則等等。這些都屬于程序員自身修養(yǎng)的部分,,但是很多組織恰恰是在這個環(huán)節(jié)上存在問題,。編碼的隨意性導(dǎo)致了代碼可理解性的下降,為團(tuán)隊(duì)共享代碼設(shè)置了障礙,,沒有人會主動的去看別人的代碼,。在前面我們說代碼的混亂會導(dǎo)致復(fù)審的困難,而代碼混亂同時產(chǎn)生的另一個影響,,就是軟件組織的平均軟件工藝水平無法提高,。雖然每個程序員都希望能夠編寫優(yōu)美的代碼,但編寫優(yōu)美代碼需要一定的毅力和時間,,尤其是在項(xiàng)目時間壓力大的時候,,代碼的優(yōu)美性常常是被忽略的,。但是,強(qiáng)制要求代碼優(yōu)美性并不容易實(shí)現(xiàn),,需要監(jiān)督的成本,,效果也難以令人滿意。 結(jié)對編程可以從組織結(jié)構(gòu)上緩解這個問題,。程序員大多是驕傲的,,如果有一個同伴在身邊,那程序員可拉不下臉來編寫難看的代碼,。這是很有意思的現(xiàn)象,,但是挺有效的。程序員通過這種方式,,可以相互促進(jìn),,提高編程工藝水平。雖然軟件工藝解決的都是一些微小的問題,,但是正是這些問題,,最終影響到了軟件的質(zhì)量。從代碼管理的角度上來說,,管理的基本任務(wù)都是這些"小問題",。 結(jié)對編程可以在有效的解決這些問題的同時保證成本最小,這是結(jié)對編程之所以成為結(jié)對編程而不是三人編程的原因,。在硬件設(shè)備的運(yùn)行過程中,,單點(diǎn)故障的最好解決方法是雙機(jī)備份。這一思想運(yùn)用到團(tuán)隊(duì)和過程上就形成了結(jié)對編程的基礎(chǔ),。我們見過一個軟件組織實(shí)施結(jié)對編程的初衷是為了保證產(chǎn)品的安全性,,在產(chǎn)品的各個重要部件上都至少配備了兩位負(fù)責(zé)人。一開始他們沒有意識到他們朝著結(jié)對編程邁出了第一步,,后來他們發(fā)現(xiàn)這種方法非常的有效,,并針對這種方法進(jìn)行擴(kuò)展,形成了完整的結(jié)對編程體系,。 在傳統(tǒng)的軟件開發(fā)中,,一般都會在軟件過程中建立幾個檢查點(diǎn)(Check Point),在這個點(diǎn)上,,軟件的各個部分都需要進(jìn)行檢查,設(shè)計(jì)是否符合規(guī)范,,是否滿足需求,,程序中是否存在缺陷。但是在每個Check Point上花費(fèi)的時間往往是非??膳碌?。每個CP上花費(fèi)的工作包括: a. 熟悉他人的設(shè)計(jì)思路和代碼風(fēng)格 b. 將不同的系統(tǒng)整合起來 c. 對缺陷進(jìn)行改進(jìn) 而結(jié)對編程的實(shí)踐實(shí)際上就是將這部分的成本分?jǐn)偟矫恳粋€人天中去,。通過兩兩互配,讓組織中所有的人都能能夠熟悉軟件的各個部分,。這個成本在剛開始時確實(shí)會比較高,,但是隨著對結(jié)對編程理解的深入,這個成本會慢慢的降低,。根據(jù)資料顯示,,結(jié)對編程并不是像大多數(shù)人想象的那樣,會增加100%成本,,這個數(shù)字取決于具體的實(shí)現(xiàn)形式,,但絕對不會到100%。 林星,,辰訊軟件工作室項(xiàng)目管理組資深項(xiàng)目經(jīng)理,,有多年項(xiàng)目實(shí)施經(jīng)驗(yàn)。辰訊軟件工作室致力于先進(jìn)軟件思想,、軟件技術(shù)的應(yīng)用,,主要的研究方向在于軟件過程思想、Linux集群技術(shù),、OO技術(shù)和軟件工廠模式,。您可以通過電子郵件 [email protected]和他聯(lián)系。 |
|