作者|廖雪青
【資料圖】
文章以真實項目實踐總結(jié)為基礎(chǔ),選取了結(jié)對編程中的典型場景,敘述了在敏捷交付項目中,開發(fā)者在實踐結(jié)對編程時經(jīng)常遇到的挑戰(zhàn)。場景中會找到你或你身邊同事的影子嗎?
結(jié)對編程的十個場景角色假設(shè)A:Senior DEV,結(jié)對編程實踐者
B:Junior DEV,剛接觸結(jié)對編程
場景一:結(jié)對前的約定A:好,那任務(wù)列表(check list)我們梳理清楚達(dá)成一致了,現(xiàn)在要開始編碼工作了。你們之前是怎么結(jié)對編程的?
B:嗯~怎么結(jié)對編程具體指什么?
A:好吧,那不然我們一個人寫45分鐘,然后休息10分鐘,再交換?
B:好啊,可以的。
開始結(jié)對之前,做一些約定是較好的開始。協(xié)商結(jié)對編程過程中如何交換角色,多久休息一次等。例一:A寫 45分鐘,休息15分鐘,然后B寫45分鐘,休息15分鐘;例二:TDD A寫測試,B寫實現(xiàn),A重構(gòu),B寫測試,A寫實現(xiàn),編碼40分鐘左右休息10分鐘。
場景二:知識傳遞A:休息時間結(jié)束,那我們開始?
B:好,該我編碼了。那我們接下來要構(gòu)造接口的返回值了
A:對的,我們可以新建一個文件,導(dǎo)出一個方法,在該方法中構(gòu)建接口返回值
B:嗯,那我們現(xiàn)在去找一個地方放新建的文件
A:可以在 XX 目錄下建這個文件...B找到對應(yīng)的目錄并打開...
B:嗯。咦,這個目錄已經(jīng)有很多文件了,我看一下其他文件都是干什么的。
A:嗯,其實這個庫有自己的模式,不然我們?nèi)タ匆幌聨斓奈募Y(jié)構(gòu)說明文檔?
B:好呀,那說明文檔在哪呢?
A:README文件中有入口,可以從那里點進(jìn)去。
B:哦。...查看結(jié)構(gòu)說明文檔...
B:所以我們在給上游發(fā)請求前如果要構(gòu)建請求參數(shù)的話,可以在文件夾下面建立XXRequestParams.js文件用來構(gòu)建參數(shù),從上游接口拿到返回值后,如果要對值做一些轉(zhuǎn)換的話,可以在文件夾下面建XXTransformer.js文件構(gòu)建接口返回值。是嗎?
A:對的,這樣的話可以做到把部分功能放到單獨的文件中,避免文件過大。還有一個好處是更好寫測試。
及時發(fā)現(xiàn)結(jié)對編程的伙伴(peer)某方面上下文的欠缺并耐心傳達(dá),幫助新人快速獲得項目知識。當(dāng)發(fā)現(xiàn)peer某方面的不足時,我們要意識到發(fā)展他人的機會來了。在上下文傳遞或知識點講解的過程中,我們可能也會有新的發(fā)現(xiàn)。
場景三:Senior直接上手解決問題A:我們需要給 state 中增加一個 XX字段
B:對,我們現(xiàn)在要去state文件。這個文件,好像不是加到這個state文件呀!這個文件呢?不對不對,好像也不是。
A:我們要構(gòu)建的頁面屬于XX模塊,得把state字段加在XX目錄下的state文件中。
B:嗯嗯,有道理。那這個文件,嗯~好像也不對!
A:不然我來寫吧。
...A拿過鍵盤,啃哧啃哧的編碼...
B:要遍歷數(shù)組了,用 for each 方法吧!
A:嗯~有其他遍歷數(shù)組的方法嗎?
B:還有 for…of、map 等方法,那我改成 map 吧!
A:其實這塊用 reducer 方法可能更合適
B:reducer 方法!reducer方法該怎么寫呀?
A:那我來寫吧。
...A拿過鍵盤,啃哧啃哧的編碼...
要給Junior足夠的實踐機會和成長時間。任何成長都是需要時間和實踐的,每個人學(xué)通一個技術(shù)或領(lǐng)域知識所需花費的時間也不盡相同,我們要關(guān)注peer取得的進(jìn)步,而不是聚焦于peer還沒有掌握的部分,也不要因為peer的速度較慢就自己上手,剝奪他人實踐和學(xué)習(xí)的機會。
敢于暴露自己的弱點。敢于承認(rèn)自己在某方面的能力比較欠缺,尋找機會有針對性地進(jìn)行提升,不要害怕暴露缺點而不敢發(fā)言。展示弱點并不會讓我們矮于他人,相反還會讓大家覺得你比較容易接近。
團(tuán)隊要創(chuàng)建一個安全包容的環(huán)境。團(tuán)隊有好的氛圍,成員才不會擔(dān)心說錯,有更大的信心自由地發(fā)表自己的觀點。
場景四:一個人的獨角戲A:任務(wù)列表的這一項太大了,不然我們把它拆小一些?
B:......
A:這塊邏輯很復(fù)雜,還不好寫測試,不然我們抽一個純函數(shù)去處理這段邏輯吧?
B:......
A:這塊代碼這樣寫好像不太符合項目的模式,我們?nèi)フ覀€已有例子參考一下?
B:......
全程無回應(yīng)(我是誰?我在哪?我在做什么?)。
是peer沒聽到嗎?是我聲音太小了嗎?是peer太專注沒心思搭理我嗎?
及時回應(yīng)。溝通需要至少兩個人的參與才能正常進(jìn)行,就像討論需要有來有往才是有效的。如果A講了話卻沒收到來自B的反饋,有三種可能情況:1. B沒聽到。2.B聽到了但是沒有回答。3.B聽到并回答了,但是回答的方式?jīng)]有被A理解到。對A來說,若不確定B究竟聽到?jīng)],可以加大音量重復(fù)所講的內(nèi)容。如果還是沒有回答的話,可以問A是否有聽到。為了讓結(jié)對編程更順暢,建議我們聽到他人說話后,及時給出回應(yīng),以示意我們聽到了。這個回應(yīng)可以是語言、動作甚至眼神,所以如果我們正在思考,不能被打斷或不方便給出回應(yīng)時,可以選擇動作等非語言的形式給出示意。
及時反饋。如果我們講話后沒收到對方的回應(yīng),要及時反饋。如果該現(xiàn)象發(fā)生了多次,我們可以建立一次反饋會議,跟peer針對該問題進(jìn)行正式的溝通,分析原因,明確及時回應(yīng)的必要,商討對應(yīng)的解決方法。
場景五:你怎么都不會A:我們用 reducer 方法來對數(shù)組進(jìn)行處理吧!
B:這數(shù)組遍歷的 reducer 該怎么寫呀?
A:你這都不會!
...A講解 reducer 的使用方法...balabala… 一頓解釋...
B:測試要mock外部依賴了
...B開始編碼,嘗試了兩種mock方法,都沒有達(dá)到預(yù)期效果...
A:這塊結(jié)合實際情況,要這樣mock
...A講解該處mock外部依賴的方法...balabala…
B:對的,這樣寫測試結(jié)果符合預(yù)期。
A:你怎么這也不會!這很簡單呀。
注意溝通技巧、用詞和語氣。我們在溝通的過程中,一定要以平和的心態(tài),不帶偏見的、盡可能客觀地表達(dá)我們的意見。有些用詞對你來說可能不帶任何含義,但是在他人來說就不一定了,所以斟酌用詞也是必要的,盡量使用常見的中性詞。當(dāng)然我們也沒必要對每一個用詞語氣都反復(fù)斟酌,否則會過猶不及影響正常的溝通,畢竟都是項目的成員,說話的人和聽話的人的感受都值得被關(guān)注、被考慮。重要的是在發(fā)生不愉快的時候,我們都要有去解決的意識,能及時溝通講清前因后果及雙方的理解,解除不愉快。
正確處理peer的能力低于預(yù)期的情況。peer 的打字速度好慢呀,都不用快捷鍵,方法定位也不會,這么菜嗎?針對這些情況,要明確:聞道有先后,術(shù)業(yè)有專攻。如果 peer 某方面表現(xiàn)很不好的時候,不要隨意批判輕視對方,要知道 peer 在這方面比較 junior,但是在其他方面,我們也可能會是初學(xué)者,所以我們要換位考慮對方的感受,同時還要意識到發(fā)展他人的機會來了。針對具體問題也要具體分析,通過溝通等手段尋找問題根因。是因為 peer 剛接觸該技術(shù)棧呢?還是 peer 最近壓力比較大,沒休息好,所以有時會反應(yīng)比較慢呢?亦或是文件搜索這塊正好是 peer 的短板呢?不管是客觀原因還是主觀原因,都要結(jié)合實際情況,多方溝通探討可行的解決方法并進(jìn)行追蹤。
場景六:建議被忽略針對一個問題
A:...balabala…(講完自己的思路)
B:...balabala…(提出一種新思路)
A:...coding…(按自己的思路開始編碼)
B:...%#@$%&
...…B很懵,貌似自己的方案更合適吧?怎么就開始編碼了呢?...
關(guān)注并重視自己和peer的感受。結(jié)對編程實踐下,一天的大部分時間我們都在和peer進(jìn)行協(xié)作,如果心有隔閡,那么結(jié)對工作很難順利進(jìn)行下去,所以在內(nèi)心感到不適的時候,我們要重視自己的感受,及時反饋給對方并進(jìn)行溝通,針對具體情況協(xié)商解決。
針對不同解決方案要溝通達(dá)成一致再編碼。如果結(jié)對的兩個人針對同一個問題分別提出了幾個方案,這時要針對這些方案進(jìn)行溝通,確保雙方都理解了這些方案,并對方案的優(yōu)缺點、工作量等有一定的理解,雙方都贊同采用某方案后,再開始編碼,避免實現(xiàn)到一半再出現(xiàn)分歧。這個過程中,可以對每個方案都從頭到尾梳理一下,能提前識別一些存在問題的方案并過濾掉。如果針對要采用的方案無法達(dá)成一致,可以考慮暫時擱置爭論,尋找支持論點的證據(jù)后,再開始新一輪的相互說服,也可以考慮引入第三方,TL或在該領(lǐng)域經(jīng)驗豐富的組員都是較好的選擇。
及時反饋。反饋文化是我們所提倡的,可以建立多維度的反饋會議,比如peer的某種行為讓我感到不適,如果不想打斷工作進(jìn)度且可以接受暫時不適時,可以選擇一天工作快結(jié)束的時候再進(jìn)行反饋交流,總結(jié)一天的工作,識別一些做得好或值得深挖、保持的地方。
場景七:按自己的節(jié)奏走...A啃哧啃哧編碼...無講解思路...
B:你在不同的文件之間跳來跳去的,是在干嘛?
A:我們要修改測試環(huán)境的配置。
...A繼續(xù)啃哧啃哧的編碼...無講解思路...
B:這又是在干嘛?我們不是要先去查看一下XX方法,然后看看能不能拿到我們想要的結(jié)果嗎?
A:嗯,對。
...A繼續(xù)啃哧啃哧的編碼...無思路講解......
B很懵,不知道A的思路是什么,也不知道A是按怎樣的順序處理問題...
共同貢獻(xiàn),團(tuán)隊擁有。結(jié)對編程實踐下,開發(fā)軟件功能是兩個人的事情,Senior 不要大包大攬獨自完成,只按照自己的節(jié)奏,而在沒有講解思路的情況下忽略了peer是否能跟上。Junior 也要為卡負(fù)責(zé),不懂就問,進(jìn)度太快就提出來,不要獨自承受壓力。
高頻率的溝通。結(jié)對編程實踐下,做卡是兩個人的事情,這需要高頻率的溝通以確保結(jié)對的兩個人都清楚理解該卡的上下文、解決思路以及當(dāng)前正在做的事情是什么。在講解實現(xiàn)思路的時候,要細(xì)致到每一步(參考美食主播講解菜譜的過程),畢竟peer的思路可能完全不同。
場景八:表現(xiàn)出被針對項目組每周交換一次結(jié)對伙伴,剛交換結(jié)對伙伴后,A新加入該功能的開發(fā)。
...B給A同步正在實現(xiàn)的功能的上下文...
A:停,打斷一下,這個方法為什么要先過濾再遍歷數(shù)組呢?
B:因為...
...B反應(yīng)激烈,聲音拔高...
...A感覺peer豎起了盾牌...
當(dāng)有新成員加入卡時,同步卡的上下文。需要同步卡的范圍(scope),當(dāng)前進(jìn)度,是否有阻塞(blocker)等。在同步的過程中,講解者能再次梳理卡的內(nèi)容,有可能發(fā)掘之前忽略的小細(xì)節(jié),接聽者通過提問等也有可能提出不合理的地方,為卡的質(zhì)量增磚添瓦。
結(jié)對編程時,大家的建議和爭議都是對事不對人的。在結(jié)對編程的過程中,意見并不總是一致的。當(dāng)發(fā)生爭議時,作為被挑戰(zhàn)的一方,應(yīng)該客觀地傾聽別人的意見。如果之前沒有充分考慮,要勇于承認(rèn)并接受別人的意見,而不是認(rèn)為別人在攻擊自己,急于辯解并不斷反駁。即使別人提出的建議很有道理,也不要因維護(hù)自己的虛榮心而拒絕采納。可能團(tuán)隊成員缺乏足夠的上下文信息,而挑戰(zhàn)只是發(fā)出需要同步上下文的信號。要相信別人提出建議是為了讓我們的代碼更加可靠或者需要更多的上下文信息來理解我們正在做的事情。作為挑戰(zhàn)的一方,我們需要注意用詞和語氣。我們的目的是提出想法,保證代碼質(zhì)量,而不是通過發(fā)表建議來展示自己的能力和不凡。我們應(yīng)該保持客觀的態(tài)度,使用平和的語氣。如果感到對方比較排斥,要及時澄清情況。
場景九:因為私人事情離開...A正在思考著解決方案,邊思考邊講述著自己的思路...
...B突然離開...
...A猜測B是因為私人事情離開,感受很不好...
團(tuán)隊信任很重要。首先,我們不能主觀評價peer離開的原因,也不能評價事件的重要性。其次,我們需要具備基本的職業(yè)素養(yǎng),盡可能專注于結(jié)對編程,不在未溝通的情況下無故離開,除非情況緊急。
在每天開始結(jié)對編程前,要檢查當(dāng)天的日程并同步可結(jié)對的時間段。提前同步可結(jié)對時間可以幫助規(guī)劃卡的工作,例如在兩個人都能結(jié)對的時候確定解決方案,或先實現(xiàn)一些復(fù)雜邏輯。這樣,在一個人離開后,另一個人可以無障礙地繼續(xù)編碼,避免遺留下來的人無法確定解決方案或無從下手處理復(fù)雜邏輯。
如果需要在結(jié)對編程過程中離開,盡量使事情透明。結(jié)對編程需要兩個人頻繁互動,因此考慮到peer的感受可以建立良好的關(guān)系,有利于結(jié)對編程的順利進(jìn)行。如果我們正在專注于結(jié)對編程,因為突發(fā)情況需要離開,盡量告知peer,方便的話講清離開的原因及預(yù)計返回時間,這是對他人的一種尊重。
相信 peer 是專注于結(jié)對編程的。在專注于結(jié)對編程的同時,我們也要相信 peer 也是專注于結(jié)對編程的。如果peer在沒有通知的情況下離開,我們應(yīng)該相信是因為情況緊急而沒有來得及通知,而不是因為工作態(tài)度有問題。
離開的人回來后,留下的人應(yīng)該主動同步這期間的代碼改動等。代碼改動等同步可以讓peer了解卡的最新狀態(tài),方便在下一步的編碼中提出有效的建議。如果留下的人沒有主動同步,離開的人也要主動詢問改動內(nèi)容,以便及時將注意力集中到當(dāng)前的任務(wù)上。
場景十:peer 分心做其他事...A在講解一個解決方案的思路,講著講著發(fā)現(xiàn)B在看手機...瞬間沒有講解的欲望了,那自己繼續(xù)編碼吧...
...過了一會…
B:你剛才說什么?
...A偷偷嘆了一口氣,把剛才講的內(nèi)容重復(fù)了一遍...
A:我們這是不是應(yīng)該提取個方法呢?...
等了20s左右無回應(yīng),轉(zhuǎn)頭一看,B在瀏覽網(wǎng)頁...
...過了一會…
B:現(xiàn)在到哪了?
A:......
在進(jìn)行結(jié)對編程時,應(yīng)盡量避免分心。不要進(jìn)行類似閱讀郵件或使用手機等的活動,要專注于結(jié)對編程。如果出現(xiàn)特殊情況需要隨時查看郵件來確認(rèn)某件事情,就應(yīng)提前溝通,讓這個事情透明化,而不是等到出現(xiàn)矛盾時才采取事后措施。
在規(guī)劃結(jié)對編程時間時,要預(yù)留一些時間。確保每個人都有足夠的時間閱讀自己的電子郵件。
總結(jié)展望結(jié)對編程是一項需要團(tuán)隊合作的實踐,也是一項復(fù)合技能,應(yīng)用場景十分廣泛,不能一一列舉。我們應(yīng)該在結(jié)對編程中不斷磨練這項技能,提高結(jié)對編程的體驗和價值。同時,在遇到困難時,也要敢于迎難而上,尋找解決方案。
最重要的是,我們應(yīng)該認(rèn)識到結(jié)對編程是一項團(tuán)隊實踐,遇到的任何問題都可以從團(tuán)隊中尋求幫助。

- 逆差和順差是什么意思?貿(mào)易順差好還是逆差好?這是經(jīng)濟(jì)用語,一般指貿(mào)易順差和逆差,就是出口大于進(jìn)口就叫...
- 開曼群島屬于哪個洲?開曼群島是一個國家嗎?開曼群島屬于北美洲。開曼群島是英國在美洲西加勒比群島的一...
- 狼的精神是什么?《狼道》金句有哪些?狼的精神經(jīng)典十六字是如下:一、發(fā)憤圖強:狼不會為了莊嚴(yán),...
- 世界上最大的內(nèi)陸國?世界上最小的內(nèi)陸國?所謂的內(nèi)陸國,又稱陸鎖國,指的是沒有海岸線的國家,亦即被...
- 大貝爾橋是哪個國家的?布魯塞爾是哪個國家的城市?1、大貝爾特橋位于丹麥;2、大貝爾特橋是一座連接丹麥西蘭島和...
- 放量跌停預(yù)示著什么?放量跌停洗盤特征?
2023-04-20 16:07:16
- 崩盤是什么意思?崩盤是錢沒了的意思嗎?
2023-04-20 15:08:33
- atr是什么意思?ATR指標(biāo)在股票里怎么用?
2023-04-17 17:00:07
- 信托產(chǎn)品收益率是多少?信托為什么收益那么高?
2023-04-13 14:35:27
- 什么是股票發(fā)行市場?發(fā)行市場和交易市場的區(qū)別?
2023-04-10 14:53:09