高效軟件開發(fā)團(tuán)隊(duì)的 4 個(gè)好習(xí)慣
我經(jīng)常需要費(fèi)力地跟人解釋,作為高效軟件團(tuán)隊(duì)的一員到底意味著什么。當(dāng)然,關(guān)于這一點(diǎn)已經(jīng)有大量的資料,比如 LinkedIn 就有整套思想領(lǐng)導(dǎo)力理論介紹了各種幫助團(tuán)隊(duì)有效運(yùn)作的指導(dǎo)方針和啟發(fā)性思考,但根據(jù)我的經(jīng)驗(yàn),如果你從來都不知道什么樣才算好,就很難內(nèi)化這些想法并遵循別人的模式。
我非常幸運(yùn),到目前為止,我在職業(yè)生涯中已經(jīng)直接與幾十個(gè)(甚至是幾百個(gè))開發(fā)人員合作過。我曾在一些不健康的團(tuán)隊(duì)工作過:在那些團(tuán)隊(duì)里,人們會(huì)感到害怕,出于對職位的擔(dān)憂,他們會(huì)把自己的底牌捂得很緊,不讓其他人知道自己的計(jì)劃或意圖;我也在功能失調(diào)的團(tuán)隊(duì)工作過,那些團(tuán)隊(duì)由于工作優(yōu)先級不明確而搖擺不定,或者協(xié)調(diào)成本太高而沒有人愿意干活,許多天甚至數(shù)周的開發(fā)時(shí)間被浪費(fèi)掉,團(tuán)隊(duì)成了一個(gè)個(gè)體的集合,而不再是一個(gè)工作單元。
但幸運(yùn)的是,我也曾在一些非常優(yōu)秀的團(tuán)隊(duì)工作過。當(dāng)我身處這些優(yōu)秀團(tuán)隊(duì)的時(shí)候,我每天去上班時(shí)都很興奮,對于那些比我年長的人,我也不怕公開提出反對意見,因?yàn)槲艺J(rèn)為自己的聲音和工作很有影響力。
在這篇文章中,我將試著記錄下,我所共事過的表現(xiàn)最好的團(tuán)隊(duì)所具有的特質(zhì)和習(xí)慣。
1. 高度的心理安全感
心理安全這個(gè)概念被提出來已經(jīng)有一段時(shí)間了,所以我不打算花太多時(shí)間來解釋它。如果你以前沒有看過這個(gè)概念,請先閱讀這篇文章。
https://rework.withgoogle.com/guides/understanding-team-effectiveness/steps/foster-psychological-safety/
軟件團(tuán)隊(duì)由真實(shí)的人組成,他們在無形的社會(huì)和政治結(jié)構(gòu)中生活和工作,他們從出生起就被社會(huì)化,變得更加自信,更加謙恭,更加直言不諱,更加禮貌,更加好爭論,更善于安撫,等等。顯然,這都是陳詞濫調(diào)了,我說這些是為了證明,心理安全不僅指的是招聘一些顧問來開展員工培訓(xùn)、告訴大家這個(gè)概念意味著什么:建立真正的心理安全感需要領(lǐng)導(dǎo)者和管理者評估人與人之間交往的所有無形的社會(huì)規(guī)則,并理解這些規(guī)則如何影響一個(gè)人參與團(tuán)隊(duì)討論、貢獻(xiàn)團(tuán)隊(duì)動(dòng)力的能力。簡而言之:社交特權(quán)很重要。否則,當(dāng)一些微不足道的小事情開始侵蝕團(tuán)隊(duì)凝聚力的時(shí)候,不要感到驚訝:攻擊性的言語或小動(dòng)作、刻板印象威脅、將幸存者偏差變成成就高效團(tuán)隊(duì)成員的信條。
根據(jù)我的觀察,具有高度心理安全感的軟件團(tuán)隊(duì)會(huì)有以下某些行為:
- 定期回顧,在“什么進(jìn)展不順利?”這一欄里列出適當(dāng)數(shù)量的事項(xiàng)。那里不應(yīng)該總是陽光和彩虹。那會(huì)讓我懷疑回顧中是不是沒有提出并討論什么難題。健康的團(tuán)隊(duì)?wèi)?yīng)該能夠公開地反省并自我批評,因?yàn)槊總€(gè)人都明白,建設(shè)性的反饋是為了不斷改進(jìn)。
- 個(gè)人不會(huì)在一個(gè)問題上花很多時(shí)間。他們會(huì)有一個(gè)或明或暗的“奮斗時(shí)間窗”,在這個(gè)時(shí)間之后,他們會(huì)向同伴尋求幫助,他們知道,自己不會(huì)因此而得到負(fù)面評價(jià)。
- 個(gè)人從看得見的輸出中分離出他們對團(tuán)隊(duì)的價(jià)值。我見過這樣的情況,人們對自己的代碼后來被刪除或重構(gòu)感到沮喪。但在健康的團(tuán)隊(duì)中,大家接受這樣一個(gè)事實(shí):改進(jìn)是增量的、漸進(jìn)的,貢獻(xiàn)是對團(tuán)隊(duì)整體結(jié)果的貢獻(xiàn),而不是對特定輸出(如代碼行數(shù))的貢獻(xiàn),表現(xiàn)出來就是“這是我們交付的”,而不是“這是我交付的”。此外,具有高度心理安全感的團(tuán)隊(duì)可以討論價(jià)值的含義,以及價(jià)值為什么不僅僅是幾行代碼。
- 帶薪休假時(shí)間和病假時(shí)間往往會(huì)更長,這很有趣。我認(rèn)為,這是他們的信念的一種體現(xiàn),即團(tuán)隊(duì)的其他成員可以在他們不在的情況下繼續(xù)做出正確的決策,因?yàn)樗麄冎g已經(jīng)進(jìn)行了足夠多的對話,這使得整個(gè)團(tuán)隊(duì)都認(rèn)為,他們在產(chǎn)品和技術(shù)決策上非常一致。但我不太確定這其中的因果關(guān)系。因?yàn)槿藗內(nèi)绻l(fā)高燒,也會(huì)申請更多的帶薪休假。
當(dāng)一個(gè)團(tuán)隊(duì)有高度的心理安全感時(shí),你可以嘗試一些很酷的試驗(yàn)。我相信,這些試驗(yàn)會(huì)產(chǎn)生一種自我強(qiáng)化的積極反饋循環(huán),創(chuàng)造出更高層次的信任和安全感。在我的第一個(gè)高績效團(tuán)隊(duì)里,在一次回顧中,每個(gè)人都覺得一年兩次的績效評估周期不夠頻繁,也不夠細(xì)致,無法促進(jìn)職業(yè)發(fā)展,尤其是在我們團(tuán)隊(duì)的優(yōu)先事項(xiàng)發(fā)展得如此之快的情況下。所以,我提出了一項(xiàng)試驗(yàn):反饋周。
2. 反饋周
這是一個(gè)為期一周的過程,每個(gè)人(包括團(tuán)隊(duì)負(fù)責(zé)人和項(xiàng)目經(jīng)理)都被隨機(jī)分配去收集對另一個(gè)人的反饋。這個(gè)過程進(jìn)行得如此順利,以至于在我的隊(duì)友加入新的團(tuán)隊(duì)后,也帶去了這個(gè)試驗(yàn)。最終,辦公室里的其他團(tuán)隊(duì)開始模仿我們!我在這篇博文中更詳細(xì)地介紹了這個(gè)試驗(yàn)。我還在 2019 年的多倫多 DevOpsDays 大會(huì)上就此做了一場演講。
https://deniseyu.io/2018/03/03/better-team-feedback.html
https://www.youtube.com/watch?v=6VARlKoEAPI
能夠開展類似這樣的反饋周,就說明你的團(tuán)隊(duì)處于高度的心理安全狀態(tài)。如果你足夠幸運(yùn)參與其中,我的建議是:不要只站著不動(dòng)。這是一個(gè)大膽試驗(yàn)?zāi)愕倪^程和實(shí)踐的機(jī)會(huì),嘗試像反饋周這樣的事情,可以幫助你挖掘隱藏的積極反饋循環(huán)。如果你確實(shí)想出了一些很酷的東西,請告訴我!
3. 良好的開發(fā)規(guī)范
隨著系統(tǒng)復(fù)雜性的增加,系統(tǒng)中任何單個(gè)行為主體的自有模型的準(zhǔn)確性都會(huì)迅速降低。— Woods Theorem
我就直說了吧,我永遠(yuǎn)不會(huì)有一個(gè)完整的 GitHub 心智模型。它太龐大了,有太多的邏輯路徑,坦率地說,花費(fèi)過多的時(shí)間學(xué)習(xí)代碼的所有部分,并不能使我的工作做得更好。而且,它可能明天就又變了。
因此,當(dāng)我必須收集足夠的上下文信息以實(shí)現(xiàn)下一個(gè)特性或 Bug 修復(fù)時(shí),我會(huì)依賴于代碼中已有構(gòu)件的準(zhǔn)確性,這些構(gòu)件是在我之前從事這些工作的人留下的。
我花了很多時(shí)間來研究代碼:運(yùn)行 git blame,查看過去的提交、 有關(guān)問題,以及任何有助于我理解為什么某行代碼這樣寫的信息。如果我看到一個(gè)難以理解的改動(dòng),提交信息是“WIP”,這就會(huì)變成效率殺手。
良好的軟件開發(fā)規(guī)范意味著需要額外花一些時(shí)間來記錄當(dāng)前的上下文信息,這可能表現(xiàn)在:
- 描述性的提交信息。至少,做到每個(gè)提交信息都包含一個(gè)動(dòng)詞。有些團(tuán)隊(duì)甚至更進(jìn)一步,要求每次提交都可以跟蹤到問題編號。務(wù)必選擇適合你的團(tuán)隊(duì)認(rèn)知投資水平的方法;
- 遵循語言和框架約定、可以表明意圖的類名和方法名;
- 單元測試帶有有用的描述信息,使用符合實(shí)際的變量名和數(shù)據(jù),而不是“foo”和“bar”這樣的變量;
- 在問題跟蹤系統(tǒng)中就相關(guān)特性反復(fù)溝通,而不是在 Slack DM 和其他地方。今后,入職不滿 6 個(gè)月的團(tuán)隊(duì)新成員將無法訪問這些地方。
最后,良好的開發(fā)規(guī)范事關(guān)同理心。工件越整潔,團(tuán)隊(duì)成員就可以越快地了解上下文,花在上下文切換和探查上的認(rèn)知精力也就越少。此外,這其實(shí)對未來的你自己也是有好處的。道德哲學(xué)的一個(gè)分支認(rèn)為,未來的你是一個(gè)有道德權(quán)利主張的不同實(shí)體,我想說:推廣這些開發(fā)規(guī)范后續(xù)一定會(huì)得到回報(bào),特別是在凌晨 3 點(diǎn)有人因?yàn)槟銓懙囊恍写a給你打電話時(shí)!
4. 主動(dòng)重新分配“經(jīng)驗(yàn)點(diǎn)”
我喜歡角色扮演游戲,尤其是《火焰徽章》和《口袋妖怪》系列,我最近還慢慢地喜歡上了《最終幻想》。
提這個(gè)是因?yàn)槲艺J(rèn)為,在《火焰徽章》中組建軍隊(duì)的方式和組建均衡的軟件開發(fā)團(tuán)隊(duì)之間有很多相似之處。在 RPG 游戲中,我擁有自己的核心團(tuán)隊(duì),我非常喜歡將所有角色都均衡升級。如果我獲得了一個(gè)等級較低的新角色,但他有一套技能或親和力可以給隊(duì)伍做補(bǔ)充,我就會(huì)對他進(jìn)行投資,給他升一點(diǎn)級,這樣他就可以在地圖上到處移動(dòng)而不用擔(dān)心敵人的攻擊。如果我的角色一開始就有一個(gè)很高的等級,我就會(huì)避免讓他們與較弱的敵人戰(zhàn)斗,因?yàn)檫@只會(huì)占用經(jīng)驗(yàn)點(diǎn),而這些經(jīng)驗(yàn)點(diǎn)會(huì)讓我的低等級角色受益更多。
我傾向于認(rèn)為,軟件團(tuán)隊(duì)中也存在類似的原則,但這些經(jīng)驗(yàn)點(diǎn)不是為了增加力量、防御、魔法和抗性,每一項(xiàng)新工作都是一個(gè)“敵人”,一旦交付,就會(huì)擴(kuò)大團(tuán)隊(duì)的領(lǐng)域上下文和信心。通常,團(tuán)隊(duì)中是沒有核心“謀士”這樣一個(gè)角色的,至此,這個(gè)類比就開始變得不恰當(dāng)了(主管和項(xiàng)目經(jīng)理不算,他們通常沒有足夠的視野或最新的上下文信息,無論如何,把如此復(fù)雜而又動(dòng)態(tài)變化的事情都集中在一個(gè)人那里是個(gè)壞主意)。如果你的團(tuán)隊(duì)里已經(jīng)有很多優(yōu)秀的騎士和圣騎士——呃,我的意思是,高級開發(fā)人員——那么作為一個(gè)團(tuán)隊(duì),你應(yīng)該注意,不要總是只安排他們?nèi)ヌ幚砝щy的工作。在健康的團(tuán)隊(duì)中,上下文再分配也是他們工作的一部分,這樣一來,一個(gè)缺乏經(jīng)驗(yàn)的戰(zhàn)士——我的意思是,工程師——也可以獲得一些有價(jià)值的經(jīng)驗(yàn)點(diǎn)。如果每個(gè)人都覺得自己至少在某種程度上具備了應(yīng)對任何挑戰(zhàn)的能力,那么這將提高整個(gè)團(tuán)隊(duì)的生產(chǎn)力和士氣。如果沒有,他們知道自己可以增加一個(gè)獵鷹騎士作為副官——換句話說,向更有經(jīng)驗(yàn)的人尋求幫助。
5. 慷慨大方地交流
關(guān)于最后一點(diǎn),我想了很多。在對我的想法的所有描述中,我認(rèn)為最好的是 Nat Friedman 在最近一次全體會(huì)議中所做的介紹。他說過類似這樣的話:“我們彼此之間的交流應(yīng)該遵循穩(wěn)健性原則:發(fā)送時(shí)要保守,接收時(shí)要開放。”他還鼓勵(lì)我們堅(jiān)持寬容性原則,尤其是在非常困難的情況下與對方溝通的時(shí)候。但是我認(rèn)為,高績效團(tuán)隊(duì)會(huì)百分之百遵循這個(gè)原則。
我非常喜歡這種框架化,因?yàn)樗屛蚁肫鹆硕嗄昵拔以?codebar 做志愿者時(shí)所經(jīng)歷的導(dǎo)師培訓(xùn)。“假設(shè)你接觸到的每個(gè)學(xué)生都知識有限,但智慧無限。”這樣一來,指導(dǎo)者就有責(zé)任確保他們的解釋容易理解——考慮到老師和學(xué)生之間固有的權(quán)力不平衡,這是傳達(dá)附加的情緒勞務(wù)的一種很好的方式。
同事之間慷慨大方地交流意味著,我們假設(shè)任何時(shí)候任何人問問題時(shí):
- 已經(jīng)做了基本的研究,如已經(jīng)用谷歌進(jìn)行了搜索;
- 他們是因?yàn)樵谌魏蔚胤蕉紵o法找到答案才找人問。因?yàn)檫@個(gè)地方很難找,或者根本不存在。
換句話說:假設(shè)你的同伴是一個(gè)有能力、聰明、通情達(dá)理的人,他們問問題是因?yàn)樗麄儾涣私馍舷挛?,雖然他們已經(jīng)設(shè)法了解過。
當(dāng)你開始尋求幫助時(shí),你的上下文信息和工作經(jīng)驗(yàn)被不斷地“四舍五入”,我都不知道該怎么表達(dá)這是多么令人沮喪。是的,這里面有性別因素,但這超出了我們現(xiàn)在的討論范圍。以前,我曾發(fā)過多條推特,表達(dá)了當(dāng)別人認(rèn)為你實(shí)際上遠(yuǎn)沒有那么經(jīng)驗(yàn)豐富和知識淵博時(shí)的沮喪。當(dāng)然,別人是不可能真正知道的,無所不知是不可能的!但是,這里有一個(gè)折中方案,也是一個(gè)合理的要求:慷慨。
像下面這樣就不夠慷慨:
我:嗨,這里為什么有一個(gè)負(fù)載均衡器?
X:負(fù)載均衡器用于將請求分發(fā)到多個(gè)服務(wù)上,這樣我們就不會(huì)遭受 DDoS 攻擊了!這里有一些文章介紹負(fù)載均衡器的基礎(chǔ)知識,以及從理論上講我們?yōu)槭裁匆褂盟鼈儯?/p>
我:好的,但我問的不是這個(gè)。我知道負(fù)載均衡器是什么。我只是想了解下,在架構(gòu)決策時(shí),為什么要把 HAproxy 放在這個(gè)特定的服務(wù)前面。
X:奧!好吧,你應(yīng)該直接這樣問!
相反,下面這樣就是慷慨的:
我:嗨,這里為什么有一個(gè)負(fù)載均衡器?
X:我猜你是在問我們?yōu)槭裁催x擇 HAproxy,以及為什么選擇這些服務(wù)。如果不是的話,現(xiàn)在就告訴我。
我:對,就是那樣!謝謝你先確認(rèn)我的問題。
X:不用客氣。是這樣的,18 個(gè)月前,當(dāng)我們構(gòu)建這個(gè)系統(tǒng)時(shí)……
上面兩種互動(dòng)方式的關(guān)鍵區(qū)別在于,在慷慨的互動(dòng)中,在給出答案之前,回答者會(huì)確認(rèn)他們對問題的假設(shè),進(jìn)而核實(shí)提問者的上下文層級和意圖。采用慷慨的交流方式有非常積極的影響:首先,注意到交流時(shí)所使用的詞匯減少了嗎?他們實(shí)際上可以更快地得到答案。其次,沒有產(chǎn)生不必要的摩擦。兩個(gè)人團(tuán)結(jié)一致消除了不確定性,而不是糾結(jié)于每個(gè)人知道多少,如果是后者,也許最終他們也可以得出答案,但同時(shí)也失去了一些信任和善意。