《敏 捷 教 練:如何打造優(yōu)秀的敏捷團(tuán)隊(duì)》—11.2 集體代碼所有權(quán)
11.2? 集體代碼所有權(quán)
和團(tuán)隊(duì)談?wù)劊瑖L試一下集體代碼所有權(quán),即任何團(tuán)隊(duì)成員可以編輯任意代碼。這樣一來(lái),任何一名開發(fā)人員都可以開始下一個(gè)故事的工作,不必等原來(lái)編寫代碼的人空出來(lái)。團(tuán)隊(duì)協(xié)作是發(fā)揮集體代碼所有權(quán)的重要組成部分。協(xié)作程度若不到位,開發(fā)人員可能會(huì)各自背道而馳還不自知。留意團(tuán)隊(duì)開發(fā)人員之間的交談深度(the level of conversation)。如果他們相互間不說(shuō)話,這個(gè)苗頭說(shuō)明他們的工作可能沒有關(guān)聯(lián)。沒有硝煙的戰(zhàn)斗可能正在代碼中上演:每個(gè)開發(fā)人員都按照自己的品位重寫代碼,結(jié)果就是東拼西湊而成的破棉被。你的挑戰(zhàn)在于如何讓“團(tuán)隊(duì)”聯(lián)手,像一個(gè)真正的團(tuán)隊(duì)那樣工作,而不是敢怒不敢言。
編碼風(fēng)格
團(tuán)隊(duì)若能遵循一致的設(shè)計(jì)和編碼風(fēng)格,集體代碼所有權(quán)就比較容易實(shí)現(xiàn)。我們并不是說(shuō)他們需要?jiǎng)?chuàng)建一份正式的編碼標(biāo)準(zhǔn)文檔。建立一個(gè)所有人均認(rèn)同會(huì)遵守的“排字規(guī)格”(house style)[1]即可。
帶領(lǐng)整個(gè)團(tuán)隊(duì)一起明確編碼風(fēng)格。這可是一個(gè)很艱巨的辯論。至于哪種風(fēng)格最好,并沒有標(biāo)準(zhǔn)答案,開發(fā)人員往往對(duì)代碼布局有強(qiáng)烈的個(gè)人偏好,這取決于他們是如何學(xué)習(xí)編程的。不過,這個(gè)值得推動(dòng),因?yàn)橹灰獔F(tuán)隊(duì)能保持一致的風(fēng)格,他們的代碼就會(huì)更具可讀性,了個(gè)人口味而重塑代碼格式所浪費(fèi)的時(shí)間也會(huì)少很多。可以使用同意梯度(參見2.4節(jié))來(lái)確定你們是否已有足夠共識(shí),可以遵循提出的所有指導(dǎo)原則。或者更簡(jiǎn)單一點(diǎn),就像我們這個(gè)故事里的團(tuán)隊(duì)那樣,來(lái)一次拇指投票。
團(tuán)隊(duì)同意一些編碼準(zhǔn)則
團(tuán)隊(duì)聚集在他們的新白板周圍。Joe站起來(lái),清了清嗓子:“好吧,我召集這次會(huì)議,是想我們能夠開始清理我們的代碼。”
他走到白板前,拿起一支記號(hào)筆。“讓我們先從一些大家都同意遵守的風(fēng)格準(zhǔn)則開始吧。”
Damian翻了翻白眼:“我們就這么沒事干,還要討論花括號(hào)放在哪里這種事?”Joe提醒團(tuán)隊(duì):“上次回顧會(huì)議上,我們談到了要清理代碼。我們必須立刻統(tǒng)一采取行動(dòng),否則新代碼會(huì)變得跟PLib一樣糟糕。”
Joe滿懷期待地環(huán)顧團(tuán)隊(duì)一周:“誰(shuí)手頭有你認(rèn)為值得我們所有人遵循的一份準(zhǔn)則?”
Larry凝視著窗外,眼神陰郁。Joe點(diǎn)名問他:“Larry,你在想什么呢?”Larry慢慢回過神。“當(dāng)然,我希望我們能定下來(lái)如何命名測(cè)試。一些人用Test開頭,其他人以Test結(jié)尾,我覺得這樣太過隨意。雖然我個(gè)人沒有偏好,但是如果我們能選定一個(gè)堅(jiān)持下去,做測(cè)試會(huì)更容易一些。”
Damian看似有些詫異:“對(duì)!這對(duì)我來(lái)說(shuō)很重要。”
“有其他反對(duì)意見嗎?”Joe一邊問一邊在板上寫下“從今以后,我們應(yīng)該用Test×××命名我們的測(cè)試類,不是×××Test。“好的,讓我們來(lái)一個(gè)拇指投票。”Damian說(shuō),“這個(gè)非常容易!”接著就豎起了他的大拇指。
Larry和Joe也舉起大拇指。Damian看著Rebecca:“那樣你可以接受嗎?”她點(diǎn)點(diǎn)頭,舉起她的大拇指。然后,她脫口而出:“所有函數(shù)都要做到盡可能短,這個(gè)準(zhǔn)則如何?這將有助于我們確保每個(gè)函數(shù)只做一件事情。你知道,就像Bob大叔在他的《代碼整潔之道》[2]一書中說(shuō)的一樣。”
Damian向后靠坐在椅子上,嘴里咬起筆來(lái):“這聽起來(lái)不錯(cuò),但我會(huì)投平放大拇指,除非我知道你說(shuō)‘短’是什么意思。”
Rebecca沉思片刻,然后說(shuō):“大學(xué)時(shí)我們學(xué)過,一個(gè)函數(shù)長(zhǎng)度不能超過屏幕的可視范圍。但我們現(xiàn)在有了更大的顯示器。因此我認(rèn)為我們需要制定比現(xiàn)在的屏幕更少一些的代碼行規(guī)則,以便每個(gè)函數(shù)只做一件事情。”
Joe再次拿起記號(hào)筆:“那我們決定代碼不超過多少行呢?”
Rebecca撓了撓下巴,然后建議說(shuō):“我們所有的函數(shù)都不應(yīng)該超過10行,怎么樣?”
Damian皺了皺眉頭:“我不是很肯定。記住,有些老PLib代碼中,有些行相當(dāng)長(zhǎng)。”
Larry點(diǎn)點(diǎn)頭。“有些函數(shù)超過200行,不打印出來(lái)真的很難知道它們做了什么,因?yàn)橐黄溜@示不全。”
“我給你一個(gè)建議,”Joe一邊說(shuō)一邊在白板上寫上:“任何新的函數(shù)都應(yīng)該少于10行”。“這聽起來(lái)怎么樣?”每個(gè)人都舉起了自己的大拇指。
Damian往前靠了靠:“我們還可以使用我們的靜態(tài)分析工具包進(jìn)行度量。這樣我們就能看到這些編碼規(guī)范是否有差別。如果我們遵循這些規(guī)范,那么長(zhǎng)函數(shù)的數(shù)量應(yīng)該每周都會(huì)減少,并且我們可以圖的方式化顯示出來(lái)。”
“你會(huì)開始著手于此事?”Joe問。
Damian拿出一張索引卡,寫了一個(gè)任務(wù)放到團(tuán)隊(duì)板上。“當(dāng)然!我一直在做這些調(diào)研工作,想看看有什么是我們可以使用的。也許我們還可以把它掛接到我們的CI構(gòu)建里面去。”
“在你把CI構(gòu)建弄好之前,我愿意去打印這些統(tǒng)計(jì),再放到我們團(tuán)隊(duì)的白板上。”Rebecca補(bǔ)充說(shuō)。
一旦團(tuán)隊(duì)有了新的編碼準(zhǔn)則,就鼓勵(lì)他們討論這個(gè)問題:“基于選擇的基準(zhǔn)來(lái)度量進(jìn)展情況,這樣做是否重要?”
在我們的例子中,團(tuán)隊(duì)計(jì)劃要運(yùn)行一個(gè)靜態(tài)分析工具來(lái)統(tǒng)計(jì)有多少函數(shù)超過10行代碼。注意,產(chǎn)生太多數(shù)據(jù),除了制造噪音之外,不會(huì)有任何幫助。幫助團(tuán)隊(duì)想清楚如何處理這些新信息。他們可以把結(jié)果繪制成圖表釘?shù)綀F(tuán)隊(duì)板上,或是用一個(gè)構(gòu)建顯示器屏幕進(jìn)行動(dòng)態(tài)顯示。
保持結(jié)果的可視化能提醒大家不忘記約定,還能展示他們的遵守情況。幾個(gè)星期或者幾個(gè)月以后,團(tuán)隊(duì)?wèi)?yīng)該會(huì)發(fā)現(xiàn)他們已經(jīng)有所提高,不再需要繪制有關(guān)長(zhǎng)函數(shù)數(shù)量的圖表了。但如果形勢(shì)的變化不如預(yù)期,團(tuán)隊(duì)就需要了解原因。團(tuán)隊(duì)回顧會(huì)議就是討論此問題的良機(jī)。
與專家共事
雖說(shuō)讓團(tuán)隊(duì)商定一致編碼風(fēng)格聽起來(lái)讓人覺得就是采用集體代碼所有權(quán)最難的部分,但是實(shí)際上,讓團(tuán)隊(duì)開發(fā)人員停下來(lái)不再專攻他們心中的代碼“自留地”,更是難上加難。交給曾做過某個(gè)模塊的人來(lái)修復(fù)它的任何缺陷或是增加更多相關(guān)特性都會(huì)更快一些,但這樣做會(huì)造成安排上的瓶頸。
術(shù)業(yè)專攻還會(huì)導(dǎo)致團(tuán)隊(duì)互相討論設(shè)計(jì)的必要性降低,只有受阻時(shí)才會(huì)尋求幫助。你會(huì)看到,如果他們選擇了這種專攻方式,開發(fā)人員彼此之間就會(huì)不愿意再多說(shuō)一句話。結(jié)對(duì)編程可以預(yù)防這種情況的發(fā)生。我們合作過的一些團(tuán)隊(duì)遵循的是一個(gè)簡(jiǎn)單的規(guī)則,每天必須更換結(jié)對(duì)中的一個(gè)人。這樣能督促團(tuán)隊(duì)所有人多輪崗幾個(gè)用戶故事,而不是釘牢一個(gè)就不動(dòng)了。
修復(fù)破窗
還需要密切關(guān)注,別讓集體代碼所有權(quán)降級(jí)為開發(fā)人員放棄自己對(duì)代碼的職責(zé)。在《程序員修煉之道》一書中,安迪·亨特(Andy Hunt)和戴夫·托馬斯(Dave Thomas)談到“破窗”理論。不關(guān)注代碼的微妙跡象可能會(huì)導(dǎo)致更大的過錯(cuò)。
嘗試運(yùn)用我們提過的PrOpER教導(dǎo)循環(huán)(參見1.4節(jié)“如何開始教導(dǎo)”)。跟開發(fā)人員談?wù)劊痛a相關(guān)的哪些事情最讓他們感到困擾。可能需要單獨(dú)和他們聊,了解他們內(nèi)心深處的顧慮。可能是因?yàn)槟骋欢未a特別糟糕,或者是團(tuán)隊(duì)在某個(gè)設(shè)計(jì)問題上有沖突。或者,該團(tuán)隊(duì)接手了一個(gè)老舊雜亂無(wú)章的代碼基,被清理任務(wù)壓得喘不過氣來(lái)。協(xié)助他們針對(duì)清理代碼制定一個(gè)行動(dòng)計(jì)劃。只要能認(rèn)識(shí)到問題并把它分解成一小塊一小塊,就可以使情況大為改觀,有助于已放棄的開發(fā)人員重新投入進(jìn)去。
敏捷開發(fā) 華為云會(huì)議 Meeting
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。