項(xiàng)目管理之老系統(tǒng)維護(hù)
今天收到了老板給的一篇關(guān)于老系統(tǒng)維護(hù)的文章,本人讀后有了,了解了很多,也清理了本人諸多的模糊想法,現(xiàn)將此文章分享給各位,原文如下:
我之所以把這個(gè)主題放在過程管理篇的***部分,就是因?yàn)楹芏喑绦騿T每天干的工作,不是在開發(fā)新系統(tǒng),而是在維護(hù)老系統(tǒng)。這個(gè)理兒大家都清楚,世界上哪有那么多新項(xiàng)目新產(chǎn)品開發(fā)啊。一個(gè)公司,也就是那么2~3個(gè)產(chǎn)品,也不可能老有新的產(chǎn)品出現(xiàn)。那么多程序員,只能做維護(hù)的事情了,不斷讓軟件升級(jí),而這個(gè)軟件是誰(shuí)寫的***版代碼,都無(wú)從查起了。一翻開源代碼,會(huì)看見各個(gè)時(shí)期各種風(fēng)格的源代碼,甚至很多源代碼都沒有注釋,根本不知道某些代碼干嘛要那樣寫,到底是為了什么目的。
一天早上,有個(gè)網(wǎng)友給我發(fā)了一條消息:他是一個(gè)老產(chǎn)品版本維護(hù)開發(fā)人員。他應(yīng)聘到這家公司的時(shí)候,這個(gè)產(chǎn)品已經(jīng)賣了4年了。最初的開發(fā)者已經(jīng)都在這4年中不斷流失走掉了。他來了,任務(wù)就是維護(hù)這套軟件,而且就他一個(gè)人維護(hù)這套臺(tái)面,有BUG改BUG,有需求改需求。
雖說這套軟件賣了4年,但真不知道是怎么堅(jiān)持了4年。他接手的時(shí)候仍然是BUG百出。代碼沒有文檔,沒有注釋,連表結(jié)構(gòu)說明都沒有。代碼莫名其妙,經(jīng)常橫插一句代碼。顯然是客戶報(bào)告了某個(gè)錯(cuò)誤,為了臨時(shí)決定這個(gè)錯(cuò)誤而做的針對(duì)性處理,但到底是為了修補(bǔ)什么錯(cuò)誤,代碼也沒有說明。所以他不敢亂動(dòng),但還要需求,只能硬著頭皮來。他也不知道自己修改的代碼是否還會(huì)引起其他的問題,只能憑空企求千萬(wàn)不要出問題。老板還在到處吹產(chǎn)品很成熟,而他每天都在心驚膽戰(zhàn),害怕這套代碼不知道哪天突然崩潰,出了錯(cuò)誤自己都收拾不了,那只能自己被K掉。他能想象得出老板發(fā)怒的情景:這么穩(wěn)定的產(chǎn)品你都搞不定?!
他希望我能幫他出出點(diǎn)子。
我想了想,能有機(jī)會(huì)開發(fā)新產(chǎn)品或新項(xiàng)目的程序員是很幸運(yùn)的,因?yàn)闆]有歷史包袱,白紙畫畫。而現(xiàn)在大部分的軟件公司都是拿一套已經(jīng)有了型的代碼到處修改,客戶化為新項(xiàng)目。真正做一個(gè)新項(xiàng)目,從頭編寫這個(gè)項(xiàng)目的***行代碼,這樣的機(jī)會(huì)比較少。
對(duì)于修改現(xiàn)有代理適應(yīng)新客戶新項(xiàng)目,這種情況非常多,也是大部分沒有文檔,修改定制沒有注釋。客戶打電話說一個(gè)需求,技術(shù)能達(dá)到就答應(yīng)下來修改,修改完就給客戶覆蓋,根本沒有需求管理、版本管理。而這樣的代碼,還不是一個(gè)特定客戶一套特定定制化代碼,是要給其他客戶也更新的。很可能這個(gè)客戶好使,那個(gè)客戶使用其他功能的時(shí)候就出錯(cuò)。按下葫蘆起了瓢,是很常見的現(xiàn)象。
我問他:“現(xiàn)在你改的代碼有注釋嗎?”
他回答:“沒有,自己修改的自己都記得,即使忘了,看看自己寫的代碼也能回憶起來,所以也沒有寫。”
我問他:“那以后你走了,其他人怎么辦?”
他回答:“反正也是一個(gè)爛產(chǎn)品,其他人怎么辦,他就管不了了,就應(yīng)該讓這套爛代碼盡快死亡,省的禍害別人。”
我問他:“那你找我?guī)椭哪康氖鞘裁矗?rdquo;
他回答:“在我工作的這段期間內(nèi),它不要崩潰就可以了。”
我無(wú)語(yǔ)了。
關(guān)于老系統(tǒng)維護(hù)這個(gè)話題,我喝許多開發(fā)人員都有過深入的交流探討。
許多從事開發(fā)的網(wǎng)友認(rèn)為,一個(gè)老系統(tǒng)要維護(hù)好,必須具備以下關(guān)鍵因素:有責(zé)任心,有文檔,設(shè)計(jì)前做好詳細(xì)的需求分析,要有需求管理,要OO編程,要有專門的測(cè)試人員。如果沒有這些,干脆推到重來,如果不讓推到重來,那就趕快跑路,否則就容易當(dāng)了冤枉替死鬼。
但現(xiàn)實(shí)中,往往維護(hù)老系統(tǒng)的就一個(gè)人。這是很矛盾的事情。一個(gè)軟件的開發(fā),往往1~2個(gè)月就完成,而它的銷售、實(shí)施、升級(jí)周期卻長(zhǎng)達(dá)4~8年。但每個(gè)老板好像都認(rèn)為軟件已經(jīng)開發(fā)完畢,修補(bǔ)修補(bǔ)都是小功能,所以一個(gè)老系統(tǒng)維護(hù)人員就OK了。殊不知白紙好畫畫,而要在別人的畫兒上再能點(diǎn)睛成龍就是難上加難了。
我在管理運(yùn)營(yíng)企業(yè)的時(shí)候,發(fā)現(xiàn)遇到的難題也和維護(hù)老系統(tǒng)面臨的很類似。都是缺這缺那,部門之間利益沖突,人的素質(zhì)怎么也提不上來,員工和老板互相做貓和老鼠的游戲,不斷博弈薪水和付出勞動(dòng)力平衡??傆行┕镜臍v史---留下的人留下的勢(shì)力格局留下的客戶印象留下的做事方法不能改變,也無(wú)法推翻重來,但公司還要發(fā)展還要提高,就必須已目標(biāo)為中心,不斷像駱駝一樣挺著風(fēng)沙干渴饑餓領(lǐng)隊(duì)前進(jìn),有各種困難阻礙都要不斷清除,無(wú)法根除就想辦法平衡與緩解,時(shí)而讓步時(shí)而迂回時(shí)而強(qiáng)勢(shì)時(shí)而突然決策突然執(zhí)行,公司就這樣不斷持續(xù)經(jīng)營(yíng)下去。
所以,維護(hù)老系統(tǒng),也要想經(jīng)營(yíng)企業(yè)一樣,不斷繼承包袱,不斷細(xì)心剖析問題,剝繭抽絲理清思路,不斷改進(jìn),不斷漸漸從惡性循環(huán)走向良性循環(huán),才能把一套爛代碼扭轉(zhuǎn)成可持續(xù)維護(hù)的代碼。
寫代碼的8項(xiàng)建議
1、 重點(diǎn)把控輸入數(shù)據(jù)的校驗(yàn)。 你看見很多橫插進(jìn)來的代碼,就是由輸入的漏洞進(jìn)入,***引起后續(xù)數(shù)據(jù)處理出錯(cuò),所以以前的程序員不截源頭,在***爆發(fā)的地方堵漏洞?,F(xiàn)在Windows程序都是消息事件觸發(fā)式的,還說不準(zhǔn)這個(gè)流程會(huì)走到哪里,他堵的了這個(gè)口,其余他根本想不到的觸發(fā),能堵住嗎?所以,把控輸入數(shù)據(jù)的校驗(yàn),在保存按鈕***步代碼中寫好集中的詳細(xì)校驗(yàn)。而且,這塊代碼要寫成函數(shù),不要大流水,省得代碼復(fù)雜性會(huì)讓程序加速崩潰。
2、 以后的需求再往上加,都寫成函數(shù)。 遇到比較大的IF..else判斷,就從其中的代碼段再分出一個(gè)函數(shù)。
3、 以后再加功能,盡量不要做成聯(lián)動(dòng)觸發(fā)的。 也就是說,保存,***是單表保存。即使是主從結(jié)構(gòu)的單據(jù),如果客戶不強(qiáng)烈反對(duì),也先保存主表后再讓錄入明細(xì)表。而且錄入明細(xì)表要單獨(dú)的窗口,這樣功能和代碼都簡(jiǎn)化了。如查詢一張單據(jù),也不要上邊是主摘要,下面就是明細(xì)聯(lián)動(dòng)。這樣會(huì)影響性能。更因?yàn)樗俣瓤赡苈脩魰?huì)連續(xù)點(diǎn)擊多次,觸發(fā)事件就會(huì)亂,莫名其妙錯(cuò)誤就都產(chǎn)生了。***是雙擊主摘要,彈出獨(dú)立的窗口顯示明細(xì)。
4、 以后寫代碼,分離特殊處理業(yè)務(wù)和正常處理業(yè)務(wù)的功能代碼。 就好像你走路,老有人給你下絆子,你就感覺不爽。
5、 對(duì)不常用的功能做一些隱藏處理,將其放到一個(gè)不起眼的位置。 使用的人就會(huì)越來越少。到時(shí)候就適機(jī)真正隱藏掉,不讓它觸發(fā)了。
6、 寫代碼時(shí),避免全局變量和大流水代碼。 其實(shí)很多時(shí)候,你覺得程序很爛,索性破罐子破摔,是由于以前程序員的代碼排版可能和你不一樣。你喜歡兩個(gè)空格,人家喜歡三個(gè)空格,你就覺得不爽。人家喜歡把{放在***,你喜歡新開一行。你可以使用代碼格式轉(zhuǎn)化工具重新排一次版。我看到很多老代碼維護(hù)人員,抱怨變量都是M、N、S、Button1之類,但其實(shí)你閱讀理解代碼,這些并不會(huì)使你理解有歧義或不懂,只不過你不爽而已。理解了這個(gè)不爽,你就會(huì)心平氣和一些,修改代碼會(huì)更加順利一些,你越和舊代碼生氣,你的工作越亂??吹竭@里,相信很多程序員都會(huì)會(huì)心一笑。真正的根源在此,老系統(tǒng)無(wú)法維護(hù)只是借口而已,可能是希望老板認(rèn)為自己的工作很辛苦很復(fù)雜而加薪!真正危害大的是全局變量和大流水代碼。所以寫代碼,要嚴(yán)格避免這兩個(gè)壞因素。
7、 修改需求或BUG的時(shí)候,要按照模塊來源集中修改,而不要挑好改的先改了,不好改的就***改。 按照模塊來集中修改,你會(huì)通盤考慮所有這些需求和BUG,而不是糊窗戶式的補(bǔ)漏洞。
8、 多寫視圖,多寫存儲(chǔ)過程。 我曾今和很多做維護(hù)的開發(fā)人員都做過交流。他們都覺得一個(gè)軟件沒有文檔,沒有注釋,簡(jiǎn)直就沒法維護(hù)。但確實(shí)是很多軟件沒有任何設(shè)計(jì)文檔,連幫助說明都沒有,代碼也沒有注釋。而這些軟件又出自他們自己之手。也就是說,他們一邊抱怨沒有文檔沒有注釋,一邊自己也不做文檔不寫代碼注釋,不知道在等誰(shuí)來專門做。我問他們到底需要什么文檔才可以將一個(gè)軟件維護(hù)得越來越好,從一套爛代碼扭轉(zhuǎn)到一套良好漸進(jìn)的代碼?他們說要表結(jié)構(gòu)說明,要詳細(xì)功能設(shè)計(jì)書。表結(jié)構(gòu)還好說,可以整理出來,詳細(xì)設(shè)計(jì)說明書就不容易出了。
我曾今也維護(hù)過別人的代碼,也是什么文檔都沒有,連操作使用幫助都沒有,更別提詳細(xì)設(shè)計(jì)說明書和表結(jié)構(gòu),代碼當(dāng)然沒有什么注釋。我并沒有去整理表結(jié)構(gòu)說明。幸虧這個(gè)人喜歡在數(shù)據(jù)庫(kù)上倒弄,寫了大量的視圖和存儲(chǔ)過程。視圖中有各個(gè)表之間的關(guān)系連接,也有各個(gè)表中重要字段的中文含義。這樣我就不需要表結(jié)構(gòu)說明了。因?yàn)楸斫Y(jié)構(gòu)說明不僅需要描述每個(gè)表中字段的中文含義,也得描述表之間的關(guān)系,這和視圖能表達(dá)的效果是一樣的。所以,我現(xiàn)在也建議開發(fā)人員寫代碼,多寫視圖,多寫存儲(chǔ)過程。有的老代碼,SQL語(yǔ)句都在代碼中執(zhí)行,沒有視圖。對(duì)于這樣的老系統(tǒng)維護(hù),就是把這些SQL COPY 出來,做成視圖,這樣就好維護(hù)了。
至于詳細(xì)功能設(shè)計(jì)書,其實(shí)對(duì)于程序員來說,其目的是想弄清楚業(yè)務(wù)流程的來龍去脈細(xì)節(jié)。光直接看代碼很難弄明白意思的,又沒有什么其他文檔可以參考,所以只能猜測(cè)代碼的意思。尤其很多維護(hù)人員,很多功能細(xì)節(jié)都是為了處理某些特殊需求和異常業(yè)務(wù)的,都是以前程序員寫的,但是以前的程序員已經(jīng)走了,現(xiàn)有的維護(hù)人員連軟件中具體的細(xì)節(jié)功能是怎么回事,程序員都發(fā)蒙,嗯,還有這個(gè)功能?我也不知道呀。
要解決這個(gè)問題,我曾今做過的事情就是組織實(shí)施人員寫功能操作說明幫助。因?yàn)閷?shí)施人員要給客戶去培訓(xùn)講解,沒有幫助說明,只能一張嘴“叭叭叭”地干說,實(shí)施人員是最需要功能操作說明幫助的。但是實(shí)施人員認(rèn)為這個(gè)幫助是軟件的一部分,而且是開發(fā)部開發(fā)的軟件,開發(fā)部最了解功能,所以幫助文檔應(yīng)該開發(fā)部寫。而開發(fā)部認(rèn)為開發(fā)部的職責(zé)就是編寫代碼,你自己培訓(xùn)連個(gè)操縱說明都沒有,你怎么培訓(xùn),所以幫助文檔應(yīng)該實(shí)施部門自己編寫。于是幫助文檔誰(shuí)也不寫。
歸根到底,幫助說明是終究要寫的,主要是誰(shuí)寫的問題。誰(shuí)最有動(dòng)力寫呢?實(shí)施人員最有動(dòng)力,因?yàn)檫@和他們的工作息息相關(guān),而程序員明顯沒有動(dòng)力理由。而且實(shí)施人員熟悉***線客戶的素質(zhì),理解客戶的具體操作思路和理解思路,寫出來的幫助客戶都能理解,幫助文件才能真正為客戶服務(wù)。很多幫助文檔的寫作都是由從來沒有見過客戶沒有實(shí)施培訓(xùn)過沒有給客戶支持服務(wù)過,連軟件測(cè)試都沒有做過的純粹文檔人員編寫的,可想而知幫助文檔到底能對(duì)客戶有多大的幫助性。
在寫幫助說明的時(shí)候,我要求實(shí)施人員把每個(gè)按鈕都要點(diǎn)到,每個(gè)GRID中的每一個(gè)字段數(shù)據(jù)來源和數(shù)據(jù)含義,每一張報(bào)表中的字段的數(shù)據(jù)來源和數(shù)據(jù)含義,每一個(gè)明細(xì)錄入中的字段數(shù)據(jù)來源、數(shù)據(jù)錄入要求和數(shù)據(jù)含義都要說明到。這一寫不要緊,發(fā)現(xiàn)了很多隱藏的特殊處理功能。很多功能很多人不了解,因?yàn)楹芏嗉?xì)節(jié)功能,都是為摸個(gè)客戶定制的,只有負(fù)責(zé)實(shí)施改客戶的實(shí)施人員才知道。于是,實(shí)施人員之間互相通氣,才算補(bǔ)足了不少功能細(xì)節(jié)的幫助說明。實(shí)在有寫功能,都不知道是哪家客戶提出來的需求,也不知道為什么要這樣處理,就留下空白,轉(zhuǎn)給開發(fā)人員,讓開發(fā)人員看看代碼是怎么處理的。就這樣,一份詳細(xì)的幫助說明在壓力艱難中終于出來了。從此,開發(fā)人員理解需求快了許多,當(dāng)然也就明白了那些在過去自認(rèn)為亂七八糟的代碼的含義,心情好了很多,修改代碼也輕松了許多。
原來,一切都是自己跟自己跟自己作怪。不盼望軟件工程,不抱怨一窮二白,不幻想加人手,從現(xiàn)實(shí)入手解決自己的問題,發(fā)現(xiàn)很多解決方案既簡(jiǎn)單又有效,根本無(wú)需動(dòng)輒就是團(tuán)隊(duì)就是UML就是OO。
另外,需求也是維護(hù)人員很頭疼的事情。我的手下也經(jīng)常問我:客戶必須讓咱們接他們的需求改,您看怎么辦?
客戶需求!客戶需求!
客戶需求,這個(gè)讓開發(fā)部最頭疼的字眼!每當(dāng)想起客戶需求,就想起了一下這些話:
1、 程序員說:這是你們家個(gè)性的需求,太邪門,我們不做??蛻粽f:不做我們找你們老板去,我們是花錢買了你們的產(chǎn)品的。
2、 客戶說:我們不會(huì)用鼠標(biāo),你給我做一個(gè)語(yǔ)音輸入吧。我們還想要一個(gè)類似QQ的東西供我們內(nèi)部溝通,你們給我們做一個(gè)吧。程序員:我暈!
3、 程序員說:等你們內(nèi)部斗爭(zhēng)完,你們協(xié)調(diào)完了,我再調(diào)研需求。
似乎,我們?cè)谛枨笊蠠o(wú)能為力,我們永遠(yuǎn)在追趕客戶的需求,滿足他們的現(xiàn)狀,把N多家的客戶需求都加進(jìn)軟件中,只要能實(shí)現(xiàn)的,我們盡量咬牙實(shí)現(xiàn)了。
***,我們發(fā)現(xiàn),我們的軟件無(wú)比復(fù)雜,誰(shuí)也不會(huì)用了,連開發(fā)部門都不會(huì)用了,誰(shuí)也不知道這個(gè)需求當(dāng)時(shí)為什么要這樣做。因?yàn)闊o(wú)比復(fù)雜,所以實(shí)施、培訓(xùn)、技術(shù)支持都成了問題,穩(wěn)定性更成了問題。代碼互相交叉,根本無(wú)法理清有多少交叉影響點(diǎn)。維護(hù)的程序員都快崩潰了,天天在祈求,千萬(wàn)別接到客戶電話,千萬(wàn)別接到客戶電話!
一個(gè)業(yè)務(wù)處理,可以這樣處理,也可以那樣處理。你的軟件采用了你的處理方法,客戶采用了客戶自己的處理方法。兩種方法平分秋色,沒有優(yōu)劣。但客戶用慣了自己的方法,所以必須讓軟件改成客戶自己的方法。
不改吧,沒有理由,因?yàn)閮煞N方案都差不多,單客戶就是客戶,客戶占上風(fēng),否則就不驗(yàn)收不給尾款。改吧,又有什么意義?這家客戶習(xí)慣了這種方法,下一家客戶又不適應(yīng)這家客戶的方法怎么辦?未必到一家改一家?
我們也曾經(jīng)動(dòng)用了這樣的技巧:
1、 客戶業(yè)務(wù)部門不能隨便提需求,必須集中匯總到客戶IT部門,由客戶IT部門匯總過濾完,再集中報(bào)給軟件公司。
2、 客戶IT部門的需求,必須由客戶方負(fù)責(zé)IT項(xiàng)目的老板簽字才能生效,才能報(bào)給軟件公司。
3、 不能隨時(shí)報(bào),每3個(gè)月集中報(bào)一次。
4、 不能口頭報(bào)(即使在現(xiàn)場(chǎng)實(shí)施支持也不行),不能電話報(bào),只能EMAIL或傳真來報(bào)。
5、 必須按我們規(guī)定的格式報(bào),要嚴(yán)格寫清楚需要實(shí)現(xiàn)的功能的界面,輸入數(shù)據(jù)或輸出數(shù)據(jù),輸入輸出數(shù)據(jù)的格式要求,誰(shuí)操作,多長(zhǎng)時(shí)間操作一次。
6、 軟件上線后只能免費(fèi)修改3次。以后再有需求,就必須另簽合同另收費(fèi),否則不予修改。
經(jīng)過這么幾招,客戶也疲了。需求是不提了,開發(fā)部歡呼雀躍。但我們真的做好了么?難道客戶真的滿意了么?并沒有。我們只是限制 了客戶的需求!本來,是因?yàn)榭蛻粲行枨?,才找我們來開發(fā)軟件。我們現(xiàn)在拿了人家的錢后,又嫌人家的需求多。
需求,有很多方面。有關(guān)于功能的(尤其是每家客戶特殊的業(yè)務(wù)需求),有關(guān)于異常錯(cuò)誤的,有關(guān)于性能的,有關(guān)于兼容性的,有關(guān)于易用性的,有關(guān)于特殊權(quán)限的,有關(guān)于美觀性的。
而有需求的來源也是多方面的,有的是客戶計(jì)算機(jī)室直接打電話,有的是客戶業(yè)務(wù)部門直接打電話,有的是實(shí)施人員,有的是支持人員,有的是市場(chǎng)人員,有的是銷售人員,有的是老板和客戶打單或開會(huì)突然想到談到就直接給開發(fā)人員打電話。
而需求的優(yōu)先級(jí)也不一樣。有的客戶態(tài)度強(qiáng)硬,你必須盡快滿足他,否則他就給你老板打電話。
而正是這來自四面八方的各種層次各種看法的人的各個(gè)方面的需求電話,把程序員煩的要命,還要去開發(fā)。而且很多時(shí)候客戶都是以為一個(gè)電話程序員就能開發(fā)了。但往往程序員開發(fā)完后,客戶一看不是自己最想要的,于是再修改。很多人抱怨說需求老變來變?nèi)ァF鋵?shí),不是客戶需求在變,而是你對(duì)客戶的需求理解在不斷加深。
所以,需求多,其實(shí)是一個(gè)幻覺。那該怎么辦呢?我給出了這么幾個(gè)注、主意。
1、 把需求分類,做個(gè)EXCEL表格,量化解決。 這個(gè)需求管理表格會(huì)有下列這些項(xiàng):客戶名稱,需求提出人,提出日期,需求關(guān)閉時(shí)間,功能模塊命名,客戶現(xiàn)在版本號(hào),需求描述,需求分類(需求,BUG)。我在最初沒有需求管理系統(tǒng)的時(shí)候就使用過這種方法。過去沒有使用的時(shí)候,我得手下老叫忙死了。我就讓他把現(xiàn)在手頭的事情整理一下給我報(bào)個(gè)郵件。但一整理,肯定不超過10件事。有些事情是等待客戶給資料,有些事情是調(diào)試跟蹤不出來錯(cuò)誤,有些事情是需求模棱兩可。我給他一分析,他現(xiàn)在正在進(jìn)行的事情就兩件,而且都是他自己能獨(dú)立做的,根本不需要?jiǎng)e人配合參與。他忙嗎?他瞎忙,或者故意說 忙。沒有工作效果就是這樣。帳不算不清,話不說不明,就是這個(gè)道理。
有了這個(gè)表格,要定期(可能是一周,可能是一月)給老板一份。這表明你的工作量,讓他看看你確實(shí)一直很辛苦的在工作,而且干了這么多活。而且,這也能看出你工作的仔細(xì)負(fù)責(zé)態(tài)度。
曾經(jīng)有個(gè)客戶,光想占便宜,但不想每年掏維護(hù)費(fèi),軟件也不驗(yàn)收,每次去催驗(yàn)收,總給我們提出一大堆需求,說你們這個(gè)系統(tǒng)爛得不得了,還想讓我們驗(yàn)收?你們必須把我們的這些需求滿足了,咱們?cè)倏茨懿荒茯?yàn)收。我們?nèi)塘?,拿著需求低調(diào)修改,但如此反復(fù)了好幾回仍然沒有驗(yàn)收的意思,我們到了他們現(xiàn)場(chǎng),發(fā)現(xiàn)那些他們聲稱不滿意的功能他們還在繼續(xù)用,這就奇怪了,難道他們故意裝做不滿意是為了不想給錢?我們就把過去所提的需求都翻了出來讓他們看:什么時(shí)候提的,誰(shuí)提的,提了多少條,我們是怎么滿足的,你們又是怎么把需求變更的,我們又是怎么安排修改的。整個(gè)過程一清二楚,我們的工作量都擺在這里了??蛻暨€在狡辯說我們從沒提過這些啊,我們都不知道,我們?cè)趺磿?huì)提這么多呢?我們說這些需求都有你們的人名和時(shí)間的具體記錄,那還有假。***,客戶也臉上掛不住了,好歹做了驗(yàn)收。
有些程序員不做這個(gè)表格,也不給老板報(bào)告。很多時(shí)候是程序員并沒有干那么多活,能推則推,能混則混,能拖就拖。怕自己有一天混不下去,所以心理壓力很大,每天不干活卻總覺得很累。這種累就是自找的。想必一些程序員看到此會(huì)想起自己。
2、需求描述不清晰。需求描述不清晰是反復(fù)修改的罪魁禍?zhǔn)?。?duì)于BUG,要有錯(cuò)誤報(bào)錯(cuò)整個(gè)的屏幕截圖,千萬(wàn)不要就截那個(gè)錯(cuò)誤消息框那么一小塊。對(duì)于需求,是報(bào)表需求,要給出表格格式,還有每一項(xiàng)數(shù)據(jù)的來源,有公式關(guān)系的要給出明確的計(jì)算公式。對(duì)于輸入單據(jù)需求,要給出單據(jù)格式,每一個(gè)輸入項(xiàng)的要求:可選值、默認(rèn)值、不可為空、唯一性、約束輸入,數(shù)字要有小數(shù)點(diǎn)后精確度、日期要分辨精度是到日期還是時(shí)還是到分。
還有網(wǎng)友跟我求救,他跟我說了一種情況,說現(xiàn)在的需求壓力,不僅僅是來源于客戶,就連我們的實(shí)施部門也給我們提需求。老板說我們一天到晚坐在家里編程序,根本不了解客戶需求。最了解客戶的是每天和客戶待在一起的實(shí)施人員,所以要讓實(shí)施人員來給我們的軟件提需求加功能。但是,實(shí)施人員那叫什么需求啊,比如說XXX功能不好用,比如說建議更易用一些。老板不相信我們,怕我們把實(shí)施人員改得需求給屏蔽了,專門派了一個(gè)人每天收集各個(gè)渠道來的需求,每天還要上報(bào)給老板,而且還每天想老板要報(bào)告,今天修改了多少需求,還有多少需求沒有改,沒有改得需求什么時(shí)候能改完,都要我們開發(fā)部給答復(fù)。而且,隔幾個(gè)月,老板就把全公司人員都召集在一起,為軟件提需求。一群人坐在一個(gè)會(huì)議室,每個(gè)人都可以提,一個(gè)模塊一個(gè)模塊的提。當(dāng)場(chǎng)打開軟件功能,演示,說明,闡述軟件應(yīng)該做成什么樣。我們開發(fā)人員就跟開批斗會(huì)一樣,這個(gè)標(biāo)題不要這樣叫,那個(gè)對(duì)齊不對(duì),這里不夠明顯應(yīng)該加粗體字或給一段紅色的提示。唉,活的真窩囊,天天修改這些亂七八糟的所謂需求,還要被人追著趕著問進(jìn)度,還要忍受被所有人都罵開發(fā)的什么爛軟件。老板也覺得我們水平不行,需求也怠工不修改,兩天才改修改了3個(gè)需求。而且越修改需求越多,軟件越不穩(wěn)定。我們哪還敢提漲工資啊。
我說:你的這種情況很普遍?,F(xiàn)在很多軟件公司都是老板開店,三五個(gè)人十來?xiàng)l槍,他有客戶關(guān)系,賣個(gè)軟件做個(gè)實(shí)施賺點(diǎn)錢。公司也不大,如果軟件做不好,實(shí)施做不好,多年積累的客戶關(guān)系就壞掉,以后不好再銷售了,這就等于把老板的命根斷了。所以老板肯定會(huì)盯死軟件開發(fā)和實(shí)施??蛻羰褂眯Ч貌拍芤院笥懈嗟膯巫幼?。而且你們作為開發(fā)人員,又不接觸客戶,怎么能理解某個(gè)需求真正意圖呢?當(dāng)然老板的思維邏輯對(duì),你們這樣,怎么能理解客戶需求呢?當(dāng)然實(shí)施人員最了解,提的需求最有權(quán)威。換你做老板都會(huì)這么想。
我也經(jīng)歷過這段日子。人和人的信任,都是在做事中不斷看人試人品人,才能取得信任,才能放權(quán)。我的老板也如此。
如何比實(shí)施人員更了解客戶需求?如何讓老板相信我比實(shí)施人員更了解客戶需求?這也是擺在我面前的一個(gè)問題。
我是把產(chǎn)品放在一個(gè)產(chǎn)業(yè)中看??锤?jìng)爭(zhēng)對(duì)手,看業(yè)界標(biāo)桿,看業(yè)內(nèi)管理專家,所以我對(duì)產(chǎn)品的升級(jí)完善,是基于產(chǎn)品戰(zhàn)略的,是基于盈利模式和競(jìng)爭(zhēng)力構(gòu)建的。如何引出更多的盈利增值產(chǎn)品,如何保證產(chǎn)品更有競(jìng)爭(zhēng)力,是我思考的重點(diǎn)。
而實(shí)施人員提的需求,都和他實(shí)施的客戶具體業(yè)務(wù)流程有關(guān)??蛻艟褪沁@樣,咱們的軟件不能滿足客戶這樣做,就要改。不改,客戶就不滿意,實(shí)施就推進(jìn)不下去,實(shí)施項(xiàng)目就延期,自己的實(shí)施就不力。所以,實(shí)施人員為了保護(hù)自己的利益,也要開發(fā)部必須改。而且一開口就是你從來沒有去過現(xiàn)場(chǎng),你根本不了解客戶。
老板信誰(shuí)?
我不是業(yè)界知識(shí)管理專家,我也不是業(yè)界明星CTO。老板怎么能信我對(duì)業(yè)界產(chǎn)品競(jìng)爭(zhēng)的判斷呢?
而實(shí)施人員,天天真實(shí)地和客戶待在一起,他們反映的肯定是真實(shí)地。
***回合,一開發(fā)部門老老實(shí)實(shí)修改需求為結(jié)束。
后來,老板又親自主導(dǎo)了幾次實(shí)施人員需求會(huì)議,什么都可以提,都記下來,讓開發(fā)人員改,讓實(shí)施人員監(jiān)督開發(fā)人員修改,確認(rèn)修改的符合實(shí)施人員的要求,并且實(shí)施人員負(fù)責(zé)測(cè)試,每次大約都能記個(gè)上百條,從要求簡(jiǎn)化SQLSERVER數(shù)據(jù)庫(kù)安裝(因?yàn)閷?shí)施顧問都非技術(shù)出身,沒接觸過SQLSERVER之類的產(chǎn)品,用的最多的是EXCEL和WORD,因此用報(bào)表設(shè)計(jì)器給報(bào)表格式挪挪位置大部分人都不會(huì))到把界面都換成綠色背景(說符合公司形象)。這種局面直到我在各個(gè)部門各個(gè)環(huán)節(jié)各個(gè)層次應(yīng)用了多種策略才改變。
過了一段時(shí)間,老板看著實(shí)施人員都沒事情可干,很奇怪,就問為什么不測(cè)試軟件?實(shí)施人員回答說:開發(fā)人員沒有改多少需求,我們正在等待他們開發(fā)呢。
然后老板就找我:“為什么不修改?”
我說:“程序員一直在修改,但另一方面,我們已經(jīng)修改了多次,滿足需求300多條,但是我們的產(chǎn)品競(jìng)爭(zhēng)力增強(qiáng)了么?我們的特點(diǎn)在哪里?我們的亮點(diǎn)在哪里?我們的競(jìng)爭(zhēng)力在哪里?”
老板說:“不管怎么說,這是客戶的需求,客戶買了我們的產(chǎn)品,我們就有義務(wù)為他們滿足需求。”
我說:“看這條需求,客戶要求在我們的管理軟件中做一套視頻會(huì)議。”
老板說:“那你找找網(wǎng)上有沒有免費(fèi)開源的”
我不再爭(zhēng)辯。因?yàn)槲抑?,在他心中,做什么產(chǎn)品,叫什么企業(yè)管理軟件都無(wú)所謂,客戶需要在ERP中加入游戲,如果理由充分也是可以的,重要的是客戶不能得罪。客戶關(guān)系是他的生存之本,而非產(chǎn)品。
我開始在網(wǎng)上寫對(duì)行業(yè)的觀點(diǎn),因此也有幸結(jié)交了許多知名的行業(yè)內(nèi)管理專家。他們稱贊我的觀點(diǎn)獨(dú)到,思考有遠(yuǎn)見。文章也受到不少網(wǎng)友的追捧。
我會(huì)把我寫的一些文章的鏈接適機(jī)轉(zhuǎn)給老板,轉(zhuǎn)給喜歡思考提升的實(shí)施顧問。我也會(huì)經(jīng)常把和我思想觀點(diǎn)相似的文章鏈接轉(zhuǎn)發(fā)給老板。
老板繼續(xù)組織全體人員需求討論大會(huì),但這次他有了改變。雖然仍然是讓人統(tǒng)計(jì)未完成需求數(shù),老追問什么時(shí)候才能完成,但顯然他不像過去那樣主導(dǎo)與控制整個(gè)過程了。他說:你也要跑跑客戶,不能老待在家里。
于是,我跟著實(shí)施顧問也跑了一些客戶,有時(shí)候,還帶上主力開發(fā)一起走訪。
過去,開發(fā)和實(shí)施沖突很大。開發(fā)覺得沒必要修改,實(shí)施覺得必須改,***實(shí)在不行就拿出老板來壓。而且,客戶有自己特殊的業(yè)務(wù)需求,有能人者還自己想解決方法。而實(shí)施人員呢,在現(xiàn)場(chǎng)實(shí)施,陷于此境此客戶,也覺得客戶的解決方法有道理。于是非要開發(fā)人員按照那樣的方法修改。但開發(fā)人員知道,按照那樣的修改軟件,那軟件就死住了,這個(gè)功能只能給這家客戶用了,其他客戶沒法用。于是開發(fā)人員罵實(shí)施人員胳膊肘往外拐,站在客戶那方對(duì)付自己公司的同事。
但是一走訪,開發(fā)人員也才認(rèn)識(shí)到客戶原來面臨這樣的問題,客戶那樣提需求其實(shí)是為了解決這樣的問題。但很可惜,客戶的想法太局限,只為自己這個(gè)問題想解決方法。如果開發(fā)人員當(dāng)時(shí)在現(xiàn)場(chǎng),就能明白客戶面臨的問題根源,只看表面問題現(xiàn)象,還自以為是提***解決方法,還讓開發(fā)部實(shí)現(xiàn)。應(yīng)該是,你提出你的需求問題,怎么解決是我們開發(fā)部自己的事,我們會(huì)綜合考慮平衡。
我走訪客戶,主要目的有三:
1、 改善一下老板和實(shí)施人員對(duì)開發(fā)部的認(rèn)知。 他們都認(rèn)為開發(fā)部只是一群不懂客戶需求,整天坐在電腦面前不用出差,說話神叨胡子拉碴的敲代碼者,“你們不懂需求”,讓這個(gè)理由一邊兒去。
2、 改善一下開發(fā)人員和實(shí)施人員的沖突。 讓開發(fā)人員也理解客戶的現(xiàn)狀。有些事情是不可改變的,有些事情是人為故意的,我們做為開發(fā)人員,不應(yīng)該把軟件假設(shè)在一個(gè)理想的工作環(huán)境下,那樣的軟件是不適合現(xiàn)實(shí)使用的。改委曲求全還得委曲求全,罵客戶管理水平太次、罵客戶都是白癡 。我在開發(fā)團(tuán)隊(duì)內(nèi)部老是說:人家是白癡嗎? 人家買你的軟件也是白癡。那豈不是反過來說你的軟件誰(shuí)買誰(shuí)就是白癡?那豈不是說明你的軟件很爛毫無(wú)價(jià)值么?咱們每個(gè)月的工資從哪里來?是老板發(fā)給咱們的嗎?老板又不是白癡,發(fā)錢給咱們?老板的錢也是從客戶口袋里掏來的。
3、 了解客戶現(xiàn)狀,想方法如何去引導(dǎo)與影響客戶。 客戶面臨最需要解決的問題是什么?客戶對(duì)軟件的認(rèn)知程度如何?客戶怎么看軟件價(jià)值?客戶認(rèn)為這套軟件應(yīng)該是干什么的?(有的客戶認(rèn)為我們的軟件應(yīng)該帶上QQ)。實(shí)施人員是怎么給客戶講解軟件中得管理思想的?實(shí)施人員是如何培訓(xùn)客戶的?
走訪回來之后,我做了兩件事情:
1、 發(fā)表了一篇我的走訪感受。發(fā)到網(wǎng)上,也發(fā)給老板,發(fā)給實(shí)施人員。老板看了以后說了一句話:“看來走訪走訪很有必要,以后要多做。”老板、實(shí)施、開發(fā),三者之間的關(guān)系改善了許多。
2、 把走訪過程中確實(shí)應(yīng)該改進(jìn)的需求安排給開發(fā)人員。由于開發(fā)人員也是有切身體會(huì),很快就改了出來。實(shí)施人員說這個(gè)功能做得不錯(cuò),很實(shí)用。
第二回合,開發(fā)VS實(shí)施,平手。
然后,我又把業(yè)界知名專家的一篇文章中提到的評(píng)價(jià)模型內(nèi)嵌到軟件中。過去,我們雖然在產(chǎn)品PPT中老是宣稱自己的管理思想先進(jìn),但在軟件中卻很難看到落實(shí)。所以,實(shí)施人員在實(shí)施過程中只能講操作。而操作,客戶覺得還不如一個(gè)EXCEL表好輸入好修改好查詢好統(tǒng)計(jì),所以客戶希望軟件修改成這樣修改成那樣。反正,客戶現(xiàn)有系統(tǒng)解決不了的問題就都提出來。而現(xiàn)在,終于有了一個(gè)可以講可以量化的管理模型。這套評(píng)價(jià)模型成了這個(gè)軟件的核心亮點(diǎn)。 客戶為了應(yīng)用這套評(píng)價(jià)模型,也樂意錄入數(shù)據(jù),維護(hù)數(shù)據(jù)。
第三回合,開發(fā)勝出。
然后我提出了需求管理系統(tǒng),WEB型。不管誰(shuí)在外面實(shí)施,或者是老板突然提出,或者是銷售提出,都錄入到需求管理系統(tǒng)中。把需求分類,分優(yōu)先級(jí),量化安排開發(fā)計(jì)劃,有的放矢吸收需求,改進(jìn)軟件。
我還提出,每年召開用戶需求會(huì)議。邀請(qǐng)有思路有積極改進(jìn)想法的客戶參會(huì)。大家面對(duì)面交流共同的問題。共同的需求,共同探討未來行業(yè)機(jī)遇挑戰(zhàn),共同尋找解決方法。引導(dǎo)客戶,***老板和實(shí)施人員提高對(duì)產(chǎn)品,對(duì)業(yè)界,對(duì)未來,對(duì)競(jìng)爭(zhēng)的認(rèn)知。
現(xiàn)在在我得影響下,公司的IT咨詢業(yè)務(wù)、IT教育業(yè)務(wù)、IT服務(wù)業(yè)務(wù)、IT整合業(yè)務(wù)、IT產(chǎn)品發(fā)展戰(zhàn)略。集成合作伙伴,都逐漸專業(yè)發(fā)展起來,給公司提供了越來越多的盈利模式與收入渠道。
對(duì)于這位網(wǎng)友的現(xiàn)狀,我還建議他開始版本管理。
CVS、VSS之類就不必了。因?yàn)檫@是一個(gè)人的戰(zhàn)斗。連版本都沒有概念,一上來就是特正規(guī)的工具,大半感覺太麻煩,又退回到最初原始狀態(tài),還對(duì)版本管理產(chǎn)生了不好的印象,覺得繁瑣還沒什么用。所以我們有一句話:一管就死,一放就亂。其原因就是缺乏一個(gè) 中間過渡解決方法。
所以,我建議先把版本意識(shí)提上來,按照版本管理的方法走,走順了就自然接受了正規(guī)的版本管理工具。版本管理工具可以分支,也可以合并,可以針對(duì)Bug進(jìn)行補(bǔ)丁發(fā)布,而不發(fā)布還未完成的新功能,可以發(fā)布為某個(gè)客戶專門定制的版本,也可以回溯歷史版本,對(duì)比歷史差異,源代碼安全性也高。
有幾個(gè)過渡性建議特別實(shí)用:
1、有大的修改或沒有把握的修改之前,先把代碼備份到其他的機(jī)器上。備份目錄要跟上日期。
2、在大的修改前,先定一個(gè)穩(wěn)定的版本發(fā)布出去。很多程序員沒有版本這一概念,每天都在持續(xù)修改。結(jié)果,給客戶的,每個(gè)都是半成品,有半拉子沒有修改完,還自己沒有做屏蔽處理??蛻舨恍⌒挠昧耍a(chǎn)生了錯(cuò)誤,再告知千萬(wàn)不能用這個(gè)功能,還沒有完善。但晚了,錯(cuò)誤數(shù)據(jù)進(jìn)入了,以后報(bào)表平帳就是問題了,又得特殊數(shù)據(jù)特殊處理了。自己的孽障自己還得解決。
3、即使是瑣碎的修改,也要每天或隔天備份一份源代碼,別怕代碼多,現(xiàn)在的硬盤大的很,而且備份復(fù)制一下也就是5分鐘的事情。別怕每天備份太煩。我們經(jīng)常會(huì)遇到這個(gè)客戶讓改了,另外客戶不讓改。一個(gè)功能改了又改回去,但過去的源代碼沒存?zhèn)浞?,忘了怎么寫了,這時(shí)候你就想起代碼備份的好處了。尤其現(xiàn)在有不少免費(fèi)的文件同步或文件自動(dòng)備份的軟件,都能定時(shí)做。功能還強(qiáng)大,有些還有些差異備份的功能
4、現(xiàn)在有不少文本對(duì)比軟件,如WinMerge之類??梢詫?duì)比兩個(gè)文件的差異,這個(gè)功能和版本管理工具中的源代碼差異對(duì)比一樣的效果。
5、如果每次發(fā)布新版本,就把從上一版本發(fā)布之日之后的關(guān)閉的需求列表都單獨(dú)摘成一個(gè)文件,附帶到這次新發(fā)布的版本之后。這樣即使沒有人寫更新說明文檔,根據(jù)追溯也能明白這次版本解決了哪些問題和需求。很多程序員沒有需求管理表格,版本發(fā)布要求寫更新說明文檔,這才從腦海記憶中想,想的就有些遺漏,甚至錯(cuò)誤。好多程序員有過這些的情景:我記得改了呀。真正一翻代碼,一點(diǎn)沒動(dòng)。大叫:我的代碼怎么沒了,我記得我改了呀。
我這些建議,從需求描述、工作量管理、遺留系統(tǒng)代碼重構(gòu)技巧、備份管理、版本管理、更新說明文檔一整套說明了一個(gè)人如何維護(hù)老系統(tǒng)的工作方法,但希望能分享給大家,給大家以幫助。
有方法,你就不是一個(gè)人在戰(zhàn)斗
一切皆有可能。
原文鏈接:http://www.cnblogs.com/wisdomsoft/archive/2011/08/16/2140148.html【編輯推薦】