作坊離工廠究竟有多遠(yuǎn)

字號:

第一節(jié)
    1. 作坊與工廠
    所謂作坊式的開發(fā)方法是指完全的依賴于開發(fā)者的經(jīng)驗(yàn)和喜好進(jìn)行的軟件開發(fā)。在一個(gè)組織里,一個(gè)軟件和另外一個(gè)軟件的開發(fā)過程可能完全不同,這種不同并不是建立在對具體項(xiàng)目仔細(xì)分析的基礎(chǔ)上,而是建立在管理者或開發(fā)者的個(gè)人興趣上,軟件過程完全沒有計(jì)劃,沒有階段性目標(biāo),沒有進(jìn)程表,沒有風(fēng)險(xiǎn)評測預(yù)警機(jī)制,沒有…,也許有,但形同虛設(shè),做到哪里算哪里。每個(gè)項(xiàng)目完成后,得到的只是一個(gè)軟件產(chǎn)品,沒有其他,沒有總結(jié),沒有過程改進(jìn),沒有源碼管理,沒有……。這種天馬行空式的開發(fā)方式最容易實(shí)施,但什么時(shí)候完成,能否達(dá)到目標(biāo),質(zhì)量能不能保證是完全無法預(yù)測和控制的。遺憾的是,中國的軟件公司大多如此開發(fā)軟件,即使有個(gè)別實(shí)行了軟件工程管理,還通過了鑒定,但大多是得其形而未得其神。 理想的工廠式(工程式的)是指開發(fā)過程是有計(jì)劃有章法的進(jìn)行,整個(gè)開發(fā)過程是圍繞一個(gè)基本目標(biāo)—需求產(chǎn)開。一般分為幾個(gè)大的phases,首先是需求獲取和分析過程,然后是目標(biāo),資源以及其他約束條件的綜合分析計(jì)劃過程,包括選取合適的軟件工程方法,設(shè)計(jì)合理的軟件過程,然后是實(shí)施,最后是用戶評價(jià)與驗(yàn)收或發(fā)布。每個(gè)phase內(nèi)應(yīng)用若干方法手段以提高效率。每個(gè)項(xiàng)目做完之后進(jìn)行仔細(xì)的總結(jié),吸取成功和失敗的經(jīng)驗(yàn),對項(xiàng)目中采用的軟件過程、以及具體的分析、設(shè)計(jì)、編碼、管理、文檔等過程中使用過的方法手段進(jìn)行改進(jìn),以方便其他類似項(xiàng)目提高效率。同時(shí),對源碼,尤其對可重用的源碼也進(jìn)行有效的管理。這是一個(gè)不斷重復(fù)的過程,隨著組織的日積月累,(就像微軟的發(fā)展歷程),軟件過程知識的不斷改進(jìn)和積累,以及源碼的不斷積累,這將是一筆最寶貴的財(cái)富,在這樣的“財(cái)富”基礎(chǔ)上開發(fā),軟件開發(fā)也就會(huì)變得越來越快,是之謂“軟件自生長過程”。實(shí)施這種開發(fā)方式的難點(diǎn)在于人才,必須各個(gè)關(guān)鍵崗位人員合格,在其位而不能謀其事,該位置設(shè)和沒設(shè)沒有區(qū)別,甚至?xí)鸱醋饔茫@些崗位包括管理職位?!坝萌说闷湮弧蔽蚁嘈胚@也是管理以人為本的本意。這種開發(fā)方式除了帶來上述的長期利益外,在具體項(xiàng)目上,也可使開發(fā)過程變得可以控制,管理者可以預(yù)期項(xiàng)目的周期,質(zhì)量和風(fēng)險(xiǎn)。這種生產(chǎn)方式也并不阻礙個(gè)人天才的發(fā)揮。另外由于軟件過程是針對具體項(xiàng)目而設(shè)計(jì),所以這種開發(fā)方式也并不一定會(huì)造成開發(fā)周期的加長。 從上述粗略的描述可以看出,作坊與工廠的距離主要由人才的多少來決定,有什么樣的人才,決定了一個(gè)組織中的軟件工程能實(shí)施到什么地步,其中必須具備的是必須有一個(gè)軟件工程專家,因?yàn)楹芏鄬?shí)施操作中的瑣事咨詢公司并不能全部都作。
    2. “用人得其位”與“用人用其力”
    “用人得其位”是實(shí)施工廠式管理的先決條件。如果你沒有合適的需求分析人員,那就不要試圖使用需求工程里比較復(fù)雜的東東,因?yàn)槟菢又粫?huì)給他增加負(fù)擔(dān),使他撿了芝麻丟了西瓜。如果你沒有合格的分析設(shè)計(jì)人員,就不要試圖使用UML和設(shè)計(jì)模式,使用的結(jié)果很可能是既浪費(fèi)了時(shí)間,又過度設(shè)計(jì)。最后全體人員把主要的精力都用來學(xué)了UML,等到編碼時(shí)才發(fā)現(xiàn),每天的文檔畫圖造句評審已耗盡了大家對項(xiàng)目的熱情。如果你的軟件工程專家是一個(gè)教條主義者,那完了,你小心使用他,否則你的項(xiàng)目一定會(huì)被“過度工程”。因此,實(shí)施工廠化開發(fā)的要點(diǎn)在于立足實(shí)際進(jìn)行規(guī)劃,有什么樣的人才,有什么樣的實(shí)力,這里的實(shí)力不單指編程實(shí)力,就設(shè)計(jì)什么樣的軟件過程,實(shí)行什么程度的工程化管理。
    我們說,“用人得其位”是軟件工程的基礎(chǔ),而“用人用其力”則是軟件工程的目標(biāo)(之一)。什么是“用人用其力”呢?就是使用每個(gè)人最專長的能力。每個(gè)人都有其與他人的比較成本,如果同一個(gè)組有另外一個(gè)人做需求和你一樣牛,但他編程比你差很多,那么你一定是編程的命,而每天飛來飛去和用戶聊天的一定是你的同事,這就是比較成本(但這一點(diǎn)實(shí)際執(zhí)行有很多困難,實(shí)際執(zhí)行時(shí)無法達(dá)到化配置)。軟件工程的主要目標(biāo)是使項(xiàng)目按時(shí)按質(zhì)按預(yù)算完成,但怎么樣才能達(dá)到呢?“曲成萬物而不遺”,你需要先使每個(gè)人都能用其所長。
    軟件工程的選擇也與公司的文化有關(guān),如果公司(包括項(xiàng)目組內(nèi))是一個(gè)對立沖突的文化氛圍,那么評審你就要小心一些了,不要公開評審,而改為一對一的私下討論。
    3. 持續(xù)的過程改進(jìn)
    軟件工程一方面的目標(biāo)是生產(chǎn)合格的軟件產(chǎn)品,另外一個(gè)目標(biāo)則是生產(chǎn)軟件工程產(chǎn)品。軟件工程也是一種產(chǎn)品,他的形式便是“過程模式”、文檔模型、和重用代碼庫。后面兩個(gè)容易理解,關(guān)鍵是過程模式,什么是過程模式呢?每一種軟件過程都有其適用的范圍和條件,而且也和不同公司的特殊性相關(guān),可以由每個(gè)公司在實(shí)踐過程中不斷優(yōu)化改進(jìn),形成公司的知識資產(chǎn),這也是CMM能夠?qū)嵭械幕A(chǔ)。每次開發(fā)新項(xiàng)目,首先要做的就是對目標(biāo)和約束進(jìn)行綜合分析,然后從過程模式庫中選取適合不同階段的模式,進(jìn)行一些修改,組成適合本項(xiàng)目的軟件過程,選擇的時(shí)候也不用考慮這個(gè)子過程或者這個(gè)想法是不是屬于這種過程模型,只要好用,拿來就用,你要考慮的只是怎么和其他選擇配合起來使用。大的方面,你是用增量還是演進(jìn),用XP還是凈室(當(dāng)然,如果你沒有足夠的足夠牛的人和時(shí)間就不要使用它,呵呵)。小的方面來說你要不要完整的風(fēng)險(xiǎn)預(yù)警機(jī)制,要不要設(shè)計(jì)評審,等等。每個(gè)項(xiàng)目作完后進(jìn)行總結(jié),總結(jié)結(jié)果包括對模式的驗(yàn)證確認(rèn)和改進(jìn)建議,形成文檔入庫。這是一個(gè)不斷重復(fù)積累的過程。當(dāng)然,如果你的公司只是小公司而且也非常滿足作一個(gè)小公司,那么我建議不用這么麻煩,就選定一種開發(fā)模式把它用熟用精用出豐富的不能再豐富的經(jīng)驗(yàn)來,每個(gè)項(xiàng)目都用他就行了。反正小公司大多是專業(yè)公司,只做一類產(chǎn)品,人員也比較少,一般也都會(huì)有一兩個(gè)牛人,比如XP我看就可以,又快又能控制風(fēng)險(xiǎn),用戶也滿意,因?yàn)槟闶峭该鞯模海?,改造一下用到你們公司去,用完再改進(jìn)一下,再用,再改進(jìn)。這樣也可以形成公司的資產(chǎn)。
    作坊與工廠距離多遠(yuǎn),你只要設(shè)想一下你公司最理想的工廠式開發(fā)是什么樣子,然后看看到那時(shí)需要哪些人才,什么樣的公司文化,多大規(guī)模的軟件工程庫,再看看你現(xiàn)在的情況,你就知道有多遠(yuǎn)了。
    4. 過度工程的危害
    那么什么是過度工程呢?如果你的項(xiàng)目從現(xiàn)在開始編碼一個(gè)星期內(nèi)就可以完成,那么需不需要風(fēng)險(xiǎn)預(yù)警呢?一般是不需要的,因?yàn)轫?xiàng)目周期越短,建立風(fēng)險(xiǎn)預(yù)警制度的代價(jià)就越高,這里的代價(jià)是指該項(xiàng)活動(dòng)在這個(gè)項(xiàng)目周期中所占的時(shí)間比例。當(dāng)警報(bào)出現(xiàn)時(shí),已經(jīng)半個(gè)星期過去了,但對于很多教條主義者來說,風(fēng)險(xiǎn)預(yù)警是必須的。而對于我來說,這就是過度過程,在一個(gè)項(xiàng)目中,做了這個(gè)項(xiàng)目完全不需要的工作。 再比如,使用RUP,每當(dāng)我看到有人誠惶誠恐地按照RUP的步驟一個(gè)圖一個(gè)圖地畫下來,我總覺得很可笑,他可能不知道,當(dāng)他剛畫完實(shí)體圖的時(shí)候,其他工程師已經(jīng)完全領(lǐng)會(huì)他的設(shè)計(jì)了,我不知道如果我用漢語表達(dá)完我的意思后,是否還需要再用英語表達(dá)一遍,對于很多經(jīng)驗(yàn)豐富的程序員來說,有了實(shí)體圖,最多再加一個(gè)狀態(tài)轉(zhuǎn)換圖已經(jīng)足夠開始編程了。而且,使用圖形和文檔表達(dá)出的類的接口設(shè)計(jì)和關(guān)系是否比直接用程序表達(dá)出的更容易讀,我看未必。XP的說:為什么要寫文檔呢?代碼就是的文檔。從一定程度上,我非常贊同這樣的觀點(diǎn)?,F(xiàn)代軟件工程發(fā)展的趨勢之一,便是越來越承認(rèn)現(xiàn)實(shí),承認(rèn)人類的有限理性。
    項(xiàng)目的主要目標(biāo)是什么,是按時(shí)按質(zhì)按預(yù)算地完成軟件產(chǎn)品,所有的活動(dòng)都應(yīng)該圍繞這個(gè)目標(biāo)進(jìn)行。所以,如果你以前已經(jīng)做過很多類似的項(xiàng)目,你知道在這樣的時(shí)間、資源約束下,要想完成目標(biāo)必須采用什么樣的開發(fā)過程,那么你是不是還需要引經(jīng)據(jù)典地寫報(bào)告證明你的想法,等待另一個(gè)并不比你經(jīng)驗(yàn)更豐富的人花上一個(gè)星期來為你做評審,本來一個(gè)小時(shí)就可以做出的決定因?yàn)榱鞒探虠l主義者的約束,連寫報(bào)告你需要花上兩個(gè)星期。還有評審活動(dòng),做評審的往往是一些不在你項(xiàng)目組織中的所謂技術(shù)權(quán)威,他們也許在技術(shù)上是權(quán)威,但對你的項(xiàng)目卻一無所知,如何評審?走過場而已,但卻為以后的責(zé)任推諉留下后門。一個(gè)活動(dòng)是否應(yīng)該保留或應(yīng)該如何進(jìn)行,要完全以是否有利于項(xiàng)目目標(biāo)為準(zhǔn)則。但遺憾的是,別看國內(nèi)項(xiàng)目大多整體缺乏工程規(guī)劃,但這種局部活動(dòng)的過度工程卻比比皆是。 那么過度工程有害嗎?有害!軟件工程書上講了很多如何控制風(fēng)險(xiǎn)的工程化方法,卻沒有講如何保持程序員的創(chuàng)造熱情和工作激情。軟件開發(fā)講千講萬,離不開程序員的創(chuàng)造性活動(dòng),你可聽說過哪個(gè)優(yōu)秀的軟件不是靠一些程序員主動(dòng)加班加點(diǎn)的超常勞動(dòng)作出來的?一個(gè)團(tuán)隊(duì)中,最重要的永遠(yuǎn)都是程序員的熱情,這也是一切工程化方法需要注意的,也是所有項(xiàng)目管理藝術(shù)的主題之一。 因此,軟件工程的實(shí)踐程度對于項(xiàng)目來說夠用即可。那么多少算夠用呢?這要考慮項(xiàng)目可以承受多大的失敗風(fēng)險(xiǎn)。也就是說對風(fēng)險(xiǎn)的控制做到什么樣的程度。對于你的項(xiàng)目,你是準(zhǔn)備跑還是走?如果跑,打算跑得多快?我認(rèn)為,所有的軟件開發(fā),所有的項(xiàng)目管理,與其謹(jǐn)小慎微戰(zhàn)戰(zhàn)兢兢地向前挪動(dòng),遠(yuǎn)不如在可控的奔跑中把握平衡,那樣會(huì)更容易一些。 大多數(shù)的軟件工程方法,都是為了提前知道哪些以前擔(dān)心發(fā)生的事情真的發(fā)生了,但天下沒有免費(fèi)的午餐,任何東西都有代價(jià),為了這個(gè)“提前知道”,我們需要付出的是可能的過度工程以及其帶來的副作用。因此風(fēng)險(xiǎn)控制也不能無限制,需要權(quán)衡。
    還有很多工程方法,比如說文檔是為了交流,但是如果一個(gè)項(xiàng)目組中只有你和測試工程師,還需要使用“BUG報(bào)告->修改意見->評審->反測報(bào)告”的方法確認(rèn)嗎?遺憾的是,這樣的例子在國內(nèi)的一些軟件公司,甚至是外企,在真實(shí)地發(fā)生著。
    而很多程序員認(rèn)為軟件工程太虛也恰恰是因?yàn)檫@個(gè)。軟件工程書上講了很多方法,但沒有讓你每個(gè)環(huán)節(jié)不分重點(diǎn)地執(zhí)行??!你可以把它當(dāng)做教科書,可以把它當(dāng)做技術(shù)詞典,但就是不能把它當(dāng)做操作手冊!現(xiàn)在的RUP應(yīng)用就有這種趨勢,為RUP而RUP,為“規(guī)范”而“規(guī)范”。什么都全了,沒有的卻是目標(biāo)。