我為什么勸你放棄個(gè)人代碼所有權(quán)?
編碼是一種藝術(shù)形式,藝術(shù)家們非常重視他們的作品。這種發(fā)自內(nèi)心的依戀讓程序員們充滿激情。這可能是件好事,但也可能導(dǎo)致問(wèn)題。
除非整個(gè)開(kāi)發(fā)組織只有一兩個(gè)開(kāi)發(fā)人員,否則在意個(gè)人的代碼所有權(quán)是一種病態(tài)的行為。我不推薦,也不鼓勵(lì)。原因如下:
1. 對(duì)代碼的情感依戀傷害了集體智慧
與代碼相關(guān)聯(lián)的程序員會(huì)認(rèn)為代碼是自己的一部分。這種情緒導(dǎo)致代碼變成他人不可觸及的,而這種教條主義思維會(huì)發(fā)展成權(quán)屬之爭(zhēng)。當(dāng)涉及情緒時(shí),代碼審查是困難的。除非代碼的所有者批準(zhǔn)更改,否則無(wú)法進(jìn)行改進(jìn)。
我觀察了一些團(tuán)隊(duì)的軟件開(kāi)發(fā)過(guò)程,認(rèn)為團(tuán)隊(duì)理念應(yīng)該被擴(kuò)展到開(kāi)發(fā)的所有權(quán)、目標(biāo)、過(guò)程,衡量成功的方式以及如何慶祝等工作的所有方面。就如同在一個(gè)球隊(duì)中不能說(shuō)球員自己的勝利,而是團(tuán)隊(duì)的勝利。每個(gè)成員都是一個(gè)有機(jī)體,是能完成工作的重要組成部分。贏得比賽的是球隊(duì),而不是某個(gè)球員。同樣地,開(kāi)發(fā)人員不應(yīng)該感到自己擁有代碼。相反,他們應(yīng)該覺(jué)得自己是構(gòu)建代碼的必要組成部分,是為組織工作而不是自己打游戲。
作為工程文化的組成部分,正確地培養(yǎng)對(duì)代碼的感覺(jué)需要公司頂層的支持,最好是在一項(xiàng)新工程開(kāi)始時(shí)就著手準(zhǔn)備。如果鼓勵(lì)恰當(dāng),這種文化就會(huì)在團(tuán)隊(duì)中形成,成為現(xiàn)實(shí)。
2.個(gè)人代碼所有類似流水線上的單點(diǎn)故障
開(kāi)發(fā)者本身會(huì)有生病、辭職、升職、轉(zhuǎn)行、出國(guó)、死亡等任何你能想到的不測(cè)。把一個(gè)公司的知識(shí)產(chǎn)權(quán)的重要部分與一個(gè)人聯(lián)系在一起,是一條通往災(zāi)難的單行道。個(gè)人代碼所有權(quán)會(huì)將公司的健康狀況與代碼所有者個(gè)人的健康狀況,或與所有者/公司之間關(guān)系的健康狀況聯(lián)系起來(lái)。
如果一個(gè)開(kāi)發(fā)人員擁有代碼權(quán),那么開(kāi)發(fā)人員就成了一個(gè)單點(diǎn)故障。如果他或她發(fā)生了什么事,公司就會(huì)承擔(dān)后果。代碼越復(fù)雜,公司需要承受的損害就越大,回到正軌的時(shí)間也就越長(zhǎng)。
3.團(tuán)隊(duì)比個(gè)體之和更強(qiáng)大
一個(gè)有才華的開(kāi)發(fā)者可以創(chuàng)造出驚人的價(jià)值,但是一個(gè)由N個(gè)開(kāi)發(fā)者組成的團(tuán)隊(duì)創(chuàng)造的價(jià)值超過(guò)N個(gè)開(kāi)發(fā)者開(kāi)發(fā)價(jià)值之和。頭腦風(fēng)暴、協(xié)作和反饋可以提高任何開(kāi)發(fā)人員的質(zhì)量和產(chǎn)出,不管他或她多么有才華。當(dāng)一個(gè)人擁有代碼時(shí),頭腦風(fēng)暴和協(xié)作就要讓位于所有權(quán),而結(jié)果會(huì)影響產(chǎn)品的質(zhì)量。
也許你會(huì)認(rèn)為幾個(gè)開(kāi)發(fā)人員獨(dú)自工作比一個(gè)小團(tuán)隊(duì)一起工作要好得多。一個(gè)開(kāi)發(fā)人員單獨(dú)工作可能會(huì)更快地產(chǎn)生一些實(shí)際的結(jié)果,這對(duì)于解決一個(gè)問(wèn)題來(lái)說(shuō)是很好的,但是其整體結(jié)果的質(zhì)量和壽命是有限的,這對(duì)企業(yè)來(lái)說(shuō)不是很理想的。
4. 代碼是一種產(chǎn)品,屬于團(tuán)隊(duì)擁
有沒(méi)有人會(huì)這么想問(wèn)題,到底房子屬于建造它的木匠,還是屬于購(gòu)買它的房主?這是因?yàn)榉孔邮且粋€(gè)物理實(shí)體,它具有我們所認(rèn)為的買方擁有的實(shí)體品質(zhì)。當(dāng)你在商店里買食物時(shí),那就是你的食物。如果你買了一輛車,那就是你的車。再明顯不過(guò)!
當(dāng)一個(gè)產(chǎn)品是概念性的,事情就不那么明顯了。例如,小說(shuō)的作者擁有故事版權(quán),而買書(shū)的人只擁有紙質(zhì)書(shū)。軟件更接近一個(gè)概念而不是一個(gè)物理對(duì)象,而開(kāi)發(fā)人員,特別是小公司的開(kāi)發(fā)人員,覺(jué)得自己擁有它。他們有這樣的感覺(jué),因?yàn)樗麄兪俏ㄒ涣私饧?xì)節(jié)的人。這是一種自然傾向,但同時(shí)也是一種謬論,組織和開(kāi)發(fā)者應(yīng)該遠(yuǎn)離。
軟件由公司所有,而不是由開(kāi)發(fā)人員擁有。從法律上來(lái)說(shuō),這是軟件開(kāi)發(fā)人員和他們的雇主之間的雇傭合同中所規(guī)定的事實(shí),但人們每天的感覺(jué)可能都不一樣。雖然工程團(tuán)隊(duì)?wèi)?yīng)該對(duì)工作有責(zé)任感,但開(kāi)發(fā)人員不應(yīng)該產(chǎn)生個(gè)人所有制的感覺(jué)。
5. 創(chuàng)新需要一個(gè)組織
如果一個(gè)開(kāi)發(fā)人員單獨(dú)擁有代碼,那么開(kāi)發(fā)人員將完成所有的創(chuàng)新。聽(tīng)起來(lái)不是很荒謬嗎?作為一個(gè)獨(dú)自工作的工程師,確實(shí)可以做到快速創(chuàng)新,但很快就達(dá)到能力的極限了。另一方面,一個(gè)團(tuán)隊(duì)可以繼續(xù)通過(guò)集體智慧,頭腦風(fēng)暴,從不同角度看待問(wèn)題,將一個(gè)人無(wú)法擁有的豐富經(jīng)驗(yàn)搬上臺(tái)面,進(jìn)行創(chuàng)新。
如果團(tuán)隊(duì)隨時(shí)做出改變,引進(jìn)不同經(jīng)驗(yàn)的新成員,其創(chuàng)新的質(zhì)量就會(huì)增長(zhǎng),新概念的火花也會(huì)被重新點(diǎn)燃。辯論和善意的摩擦刺激創(chuàng)新,那些秘密的和受到謹(jǐn)慎保護(hù)的部門的知識(shí)領(lǐng)域則不容易創(chuàng)新。
6.個(gè)人代碼所有權(quán)會(huì)導(dǎo)致停滯
缺乏創(chuàng)新會(huì)導(dǎo)致工程停滯不前。長(zhǎng)期處于孤立狀態(tài)下的程序員往往會(huì)被他們已習(xí)慣的觀念所影響。他們會(huì)不同程度地拒絕接受工作上的任何改變,因?yàn)楣袒挠^念已經(jīng)給他們帶來(lái)了復(fù)雜的意義。如果與自己的觀念不一致,任何外部來(lái)源的想法最終會(huì)被過(guò)濾掉。如果是在創(chuàng)業(yè)初期,這樣做可能是件好事。然而,時(shí)間一久,這種開(kāi)發(fā)軟件的方式就很難擴(kuò)展了,繼而將不再有創(chuàng)新。
7.個(gè)人代碼所有權(quán)會(huì)阻礙個(gè)人進(jìn)步
那些整天獨(dú)自在同一個(gè)代碼庫(kù)工作的開(kāi)發(fā)人員變成了籠子里的鴿子。這意味著他們?cè)谌魏尾皇撬麄儗iL(zhǎng)領(lǐng)域的地方都變得遲鈍,裹足不前。
我曾經(jīng)看到過(guò)來(lái)自大企業(yè)的開(kāi)發(fā)人員,他們?cè)谕粋€(gè)應(yīng)用程序的同一個(gè)對(duì)話框上工作了多年(微軟的一些部門曾經(jīng)因此而臭名昭著)。這種專業(yè)化是極端個(gè)人代碼所有權(quán)所導(dǎo)致的結(jié)果,造成了個(gè)人成長(zhǎng)的損失。
8.個(gè)人代碼所有權(quán)阻礙了職業(yè)發(fā)展
如果一個(gè)開(kāi)發(fā)人員把自己和他們的代碼捆綁在一起,那么他們不僅是上面所提到的單點(diǎn)故障,還很難晉升到更高的職位,因?yàn)闆](méi)有簡(jiǎn)單的方法來(lái)替代他們所負(fù)責(zé)的工作。
我之前在一篇題為《Work yourself out of your job》的文章中談到了這一點(diǎn):“要得到晉升,你必須放棄你寶貴的財(cái)產(chǎn),把自己從目前的工作中擺脫出來(lái),這樣你就可以開(kāi)始一個(gè)更高級(jí)別頭銜的新工作。”個(gè)人代碼所有權(quán)限制了這種可能性。開(kāi)發(fā)人員若想提升,要做的第一件事就是確保他們不是某部分代碼庫(kù)的所有者。
個(gè)人代碼所有權(quán)通常是自己造成的,因此也很容易被自己撤銷。為了做到這一點(diǎn),開(kāi)發(fā)人員需要友善地鼓勵(lì)其他工程師接觸自己編寫的代碼,并協(xié)助他們熟悉它。一開(kāi)始,讓所有權(quán)消失會(huì)有風(fēng)險(xiǎn)。這會(huì)讓你覺(jué)得你把自己從工作中趕了出來(lái),但這是正確的做法,去做不同的更好的事情會(huì)更有益。
9.個(gè)人代碼所有權(quán)是工程師們的監(jiān)獄
“擁有”部分代碼,感到不可缺少,這可能會(huì)給人一種職業(yè)安全感的錯(cuò)誤印象。然而,工作安全看起來(lái)更像把自己關(guān)進(jìn)監(jiān)獄,而不是待在一個(gè)舒服的地方。不學(xué)習(xí)新技能,沒(méi)有職業(yè)發(fā)展,一個(gè)軟件工程師就像被關(guān)在一個(gè)自制的監(jiān)獄里,并且這個(gè)監(jiān)獄空間還會(huì)變得越來(lái)越小。
幾年前,我讀了一篇優(yōu)秀的文章,標(biāo)題為《Give Away Your Legos, and Other Commandments for Scaling Startups》。它談到了創(chuàng)業(yè)公司的可擴(kuò)展性,同樣的概念也適用于個(gè)人的可擴(kuò)展性和職業(yè)發(fā)展。如果一個(gè)開(kāi)發(fā)人員整日把自己的“樂(lè)高積木”放在身邊,小心翼翼地保護(hù)著,就等同于用樂(lè)高磚給自己建造了一座樂(lè)高監(jiān)獄。放棄你的樂(lè)高積木吧,重塑自我,繼續(xù)前進(jìn)。
10.開(kāi)發(fā)人員堅(jiān)持他們的代碼所有權(quán),易與領(lǐng)導(dǎo)沖突
在技術(shù)世界里,市場(chǎng)總是在不斷變化,產(chǎn)品也是如此。有時(shí)產(chǎn)品變更必須是激進(jìn)的,開(kāi)發(fā)人員需要適應(yīng)和支持領(lǐng)導(dǎo)要求的變更。當(dāng)個(gè)人代碼所有權(quán)的感覺(jué)過(guò)于強(qiáng)烈時(shí),開(kāi)發(fā)人員往往會(huì)與領(lǐng)導(dǎo)產(chǎn)生分歧并抵制變更。這種行為可能會(huì)導(dǎo)致沖突,要么減緩進(jìn)度,要么被解雇。
如果在一些大型機(jī)構(gòu),整個(gè)團(tuán)隊(duì)都會(huì)因?yàn)橐粋€(gè)項(xiàng)目取消而被解雇。試想,為什么一個(gè)公司會(huì)因?yàn)橐粋€(gè)項(xiàng)目被取消而解雇一個(gè)有才華的工程師團(tuán)隊(duì)呢?如果工程師能毫無(wú)問(wèn)題地進(jìn)行新項(xiàng)目,公司會(huì)解雇他們嗎?現(xiàn)實(shí)情況是,有時(shí)候,團(tuán)隊(duì)是圍繞項(xiàng)目形成的。個(gè)人過(guò)分專注于一個(gè)項(xiàng)目,擁有它并小心地保護(hù)它,失去了適應(yīng)新項(xiàng)目的能力,拒絕改變,拒絕放手,得到的不僅是一所監(jiān)獄,還可能是專業(yè)的棺材。
11.個(gè)人代碼所有權(quán)導(dǎo)致不信任
一些認(rèn)為有必要擁有和捍衛(wèi)代碼權(quán)的開(kāi)發(fā)人員正在傳播一種不良印象:都給我躲開(kāi)!我才是唯一能理解或接觸這段代碼的人。
這種印象可能不會(huì)被明確表達(dá)出來(lái),但整個(gè)工程團(tuán)隊(duì)都會(huì)有感覺(jué),有意或無(wú)意地認(rèn)為這是不信任的信號(hào)。當(dāng)同一團(tuán)隊(duì)的成員互相不信任并明確表示時(shí),團(tuán)隊(duì)就會(huì)遭受損失,并失去快速行動(dòng)的能力。不信任會(huì)導(dǎo)致不良摩擦,這會(huì)消耗寶貴的能量,卻不會(huì)產(chǎn)生任何積極的結(jié)果。
當(dāng)開(kāi)發(fā)人員開(kāi)始放棄他們的個(gè)人代碼所有權(quán)意識(shí)時(shí),事情就會(huì)改變。信任成為工作方式的一部分,團(tuán)隊(duì)合作成為驅(qū)動(dòng)力。團(tuán)隊(duì)在一個(gè)充滿信任的環(huán)境中運(yùn)行,會(huì)產(chǎn)生更好的結(jié)果,并變得更有彈性。
12.拒絕分享對(duì)組織的發(fā)展沒(méi)有好處
感覺(jué)自己?jiǎn)为?dú)擁有代碼的開(kāi)發(fā)人員常常覺(jué)得他們不需要任何流程來(lái)指導(dǎo)他們。Agile方法中如Scrum或其他形式的組織結(jié)構(gòu)對(duì)這些開(kāi)發(fā)人員來(lái)說(shuō)似乎是外來(lái)的和不必要的。這點(diǎn)和一個(gè)拒絕在任何壓力、結(jié)構(gòu)或約束下工作的藝術(shù)家來(lái)說(shuō)是不一樣的。
這種軟件開(kāi)發(fā)的觀點(diǎn)根植于早期的黑客時(shí)代,是那時(shí)很典型的年輕開(kāi)發(fā)者的生活。單飛、學(xué)習(xí)、成長(zhǎng),長(zhǎng)時(shí)間占據(jù)一個(gè)程序員的生活,他們和流程中其他人沒(méi)有任何關(guān)聯(lián)。這種工作方式是缺少?gòu)椥缘摹.?dāng)一個(gè)或兩個(gè)以上的人參與一個(gè)項(xiàng)目時(shí),輝煌的黑客時(shí)代使用的方法便不再有利于工作。
在開(kāi)發(fā)人員作為團(tuán)隊(duì)的一部分進(jìn)行工作時(shí),流程成為一個(gè)重要的工具。它有助于同步工作并確保高效、可預(yù)測(cè)和有組織地交付結(jié)果。黑客和開(kāi)發(fā)軟件之間存在著巨大的差異。前者可能很有趣,后者則是工程組織如何規(guī)模化。