建設全功能團隊——實踐篇

1 評論 7974 瀏覽 23 收藏 17 分鐘

上篇文章中我們一起回顧了分工歷史,對于技術團隊影響以及建設全功能團隊的必要性 ,在實踐篇中我將詳細分享一些實踐以及我們團隊的經驗數據。

吃自己的狗糧

當開發人員坐在測試工作站前,你將會詫異于多少開發人員因為繁瑣的步驟而不會安裝/升級自己參與制作的軟件,多少人認為自己設計的復雜配置是荒唐的。在很多情況下,這都不是安裝、配置的問題,而是設計問題,將開發和測試過程分離把痛苦轉嫁給了另一個團體(測試、用服、用戶),開發人員喪失了親身使用軟件的機會,從而無法發現問題的存在。暴露并修正這些問題,是將開發人員和測試人員進行輪換的主要價值之一。從我們的經驗數據看,開發人員可以在一周內掌握大多數的測試技巧,個人的建議是從經驗豐富的開發人員開始輪換,一方面他們更能認識到測試的必要性,便于交流,也便于形成表率。另一方面豐富的經驗更容易幫助他們察覺到問題的存在。其它的一些要點是:

  • 一對一的充分交流,讓開發人員認識到進行測試工作的價值和目的。
  • 引導開發對痛點進行思考、改進。改變測試簡單、重復的工作面貌,要對開發人員形成挑戰。
  • 一周輪換2天持續數周或連續輪換2星期為宜。

睜開眼睛看大象

開發人員習慣于正確性驅動,然而正確的返回結果卻不一定是必須的,有時甚至是一種浪費。我們項目所需要處理形如1001的期貨時間戳,10代表2010年,01代表一月份。開發人員自然想到了如何區分1910年、2010年、2110年的問題。于是復雜的內部表達被設計出來,用于推斷正確年份。這是必須的么?如果我們能了解到客戶最大的壓力在于半年后項目能否成功上線替換掉現有無人能夠維護的應用,而不是100年后才可能出現的問題,我們是否能在類似的技術決策中,做出更聰明的選擇呢?幫助開發/測試角色獲取更多的信息,讓他們了解到制定需求的上下文,而不僅僅是需求是什么;讓他們更高的層面認清各個故事之間的關聯,能夠分辨可以給客戶帶來最大價值的任務,這是將開發角色/測試角色與分析角色對換的主要價值。一些要點是:

  • 在進行分析工作前,開發人員需要完成多個模塊的開發,而測試人員最好完成開發輪崗,否則收效甚微。
  • 分析工作可以兼職進行,我們認為比較有效的方法是每天下午花40分鐘讓開發/測試人員在教練的帶領有重點的分析一、兩個故事。
  • 重點放在提供一套思考框架幫助新手梳理分析思路,我們發現一個有效的方法是結對工作、獨立思考、演講并點評。(參見結對工作,不止與結對一節)

根據我們的經驗,兩周全程跟蹤式的結對分析足夠幫助新手初步掌握分析思路,教練可以考慮逐漸減少在新手思考過程中的侵入,再經過大概2個月的練習,新手基本可以獨立工作。

和客戶對話

在進行過分析角色的輪換后,可以進一步利用需求管理作為主線讓團隊成員參與到客戶交流中,慢慢削弱項目經理的客戶聯系人角色,其主要價值在于:

  • 提升交流質量,一線人員常常比項目經理更了解產品。
  • 展示開發人員的能力,增強客戶信心。
  • 弱化項目經理在客戶眼中的重要性,為未來平滑的取代項目管理者,減少開銷作準備。
  • 幫助技術人員掌握交流技巧、提升團隊能力。

個人建議是:

  • 從例行的功能展示會(showcase)開始,讓每個成員練習從客戶的角度進行思考(客戶想看什么?),鍛煉語言能力,消除與客戶交流的恐懼感,并且讓客戶熟悉開發團隊的每個成員,習慣開發團隊的交流方式。
  • 由多人分別準備客戶進行電話會議中需要討論的議題,每人深入思考的一、兩個問題,通過充分思考彌補經驗、技巧上的不足。
  • 結對完成發給客戶的郵件,讓另一雙眼睛檢查有沒有把該說的問題點到,表達方式、方法是否得當。
  • 提供一套與客戶交流的思考框架,并在與客戶的交流中不斷強化它。我們采用的框架是“客戶,交付,流程,員工”,團隊成員在思考問題時,首先從這四個點出發再逐層展開。

這項練習需要貫穿項目始終,對于團隊成員無差別的進行,我們的經驗數據是經過5個月左右的練習,項目經理就不需要出現在與客戶的例行電話交流中了。

寫程序,我行么?

測試人員普遍編程技術能力欠缺,同時又常常對編程這一未知的經驗產生恐懼。從經驗看,如果測試人員不能編寫、維護自動化測試,測試工作將很快成為交付瓶頸。通過編程,讓測試人員掌握技術,避免瓶頸的出現是測試到開發角色轉換的主要價值。我們所采取的步驟是:

  • 與測試人員結對完成簡單的編碼任務,不斷樹立信心。在這個團隊中,我們從設計與實現自動測試框架開始,親手設計的框架讓測試人員更有能力來編寫、維護測試,同時增強了編程的信心。
  • 在測試人員消除了編程恐懼、具備編程基礎后,安排測試人員與開發人員結對進行功能開發。

在這個過程中,必須首先要幫助測試人員正視編寫程序的必要性以及消除恐懼,同時針對每天的工作內容留一些家庭作業效果也非常好。必須承認的事實是即便在完成輪換后,測試人員較開發人員還有一定距離,然而我們得到了一個意外的收獲:進行過輪換后,再討論需求時,測試人員越來越熟練的使用開發術語與團隊交流,越來越多得參與討論,甚至主導討論,她開始直接引用核心組件的設計思想來推導測試用例,不斷質疑和挑戰開發人員,極大的提升了交流的效率和功能實現的質量。從經驗數據看,大致需要3個月的時間測試人員可以達到在輔導下完成功能的程度。

訂最后一顆紐扣

前端開發有其獨特的知識領域,但這并不意味著任何界面工作都要由前端開發工程師來完成。前后端的分離增加了開發過程中的瓶頸以及人員認知領域中”Unknown Unknown”的區域,降低了找到更優解決方案的可能性。前端開發能力的培養特別適合在全團隊中無差別的展開:讓后端開發人員進行前端開發可以減少瓶頸,積累知識,構造“T”型知識區。測試人員需要測試界面,所以了解界面是如何工作,可以幫助她們設計出更高質量的用例,對于需求分析人員來說,高保真原型可以用作高效的交流工具。一個有效的方法是全面鋪開,引入專家,重點培養,我們所采取的步驟是:

  • 要求全團隊在業余時間完成一組界面練習,在全團隊普及Html, Css和Javascript知識。
  • 引入界面開發專家重點培養一名有興趣進行界面開發的團隊成員,對系統的界面結對進行改進,優化。
  • 在界面開發專家的帶領下,全員重新完成之前的界面練習,專家每天用一個小時講解對應的前端技術并點評作業。

從全面普及知識到引入界面專家再到培養出新人,總共花費3周時間。值得一提的是,在整個過程中,由于之前團隊建設的鋪墊,其它成員有能力完全分擔工作,團隊重點培養的開發人員可以不受任何干擾,全職投入到前端開發中,最大程度的利用了界面開發專家的價值,提升了學習效果。

上同一艘船

項目經理是和技術領袖是作為現場管理者存在的,他們必須能夠理解現場,能夠通過現場的痕跡找到團隊的不足和改進方向。那么,沒有什么比卷起袖子參與到一線的工作中更能幫助這些角色理解現場。形成對產品質量和進度的親身體驗。理解現場,有效的管理現場而不是管理數據,是這些角色輪換到開發,測試或者分析工作的主要價值所在?,F場管理人員常常有太多的職責,既要對內負責也得對外負責,一個自然而然的問題是:”沒有時間投入一線工作“。我認為現場管理人員的工作主要是兩個部分:首先是職位責所賦予的管理性事務,譬如狀態的匯報,客戶的管理等;其次是能力所賦予的工作,作為團隊中最有經驗的成員,他們需要參與到需求分析、架構設計、決策的制定、培訓等活動中?;鶎庸芾碚邞斢幸庾R的主動的卸下身上的工作職責,完成到一線角色的轉換,從另一個角度看,這個過程就是整個團隊能力提升的過程,個人經驗是:

  • 對職位責所賦予的工作,首先做到對團隊的狀態、開發的進度等盡量的做到自動化、透明化、可視化,讓所有人都能獲得這些信息,其次通過知識傳遞,把不涉及敏感內容的工作下放,重點培養一、兩名團隊成員參與管理。
  • 對能力所賦予的工作,一是針對團隊急需提升的能力組織培訓,二是通過結對工作(參見結對工作,不止于結對)傳遞知識,提升能力,讓團隊習慣于自行決策,有意識的逐步弱化自己在團隊中的重要程度。

我們的的經驗數據是大約需要4個星期,新人可以在指導下正確的進行管理實踐(正確的做事),這已經可以保證基層管理角色一定的參與一線工作的時間;而讓新人具備辨別團隊目前需要什么幫助(作正確的事),進一步將原有的管理角色基本弱化為開發角色,則需要6個月左右的引導和練習。

結對工作,不止于結對

我完全認可結對工作在知識傳遞、提升工作正確性方面的作用。我們幾乎結對作所有的事情,某種程度上結對工作成為一種文化,成為了思維慣性和一種必然。長期的結對工作讓我發現目前的結對方式對于培養新人還不夠友好,這里,新人所指代的是廣義的新人概念,不僅僅指畢業生,剛剛從事測試工作的開發達人也算是測試新人。目前結對方式的的缺點在于:

  • 培養了思維惰性,心理上依賴于別人的帶領。
  • 無法從失敗中學習。有經驗的人常常會跳過很多陷阱,新人的工作經歷全是各種成功,一旦獨立工作就被這些陷阱打的措不及防。
  • 只見樹木不見森林。譬如在TDD的過程中,新手可以看到一個個的方法是如何被設計的,如何從測試中被驅動出來,但很難從他的搭檔那里學會如何想到要設計這些方法?從下向上驅動還是從上向下,各有什么分別?為什么這個方法要被放在這個類,而不是那個?

我認為結對工作其中一個被忽略的要點在于讓新人在可控的狀態下經歷失敗,獲取經驗,并且在工作中學會思考問題的方式(如何發現問題?從何處著手?怎么在不同的方案中取舍?從哪里開從哪里開始分析?),而不僅僅是思考問題本身(寫什么測試?如何讓測試通過?)。從我的觀察看,培養新人比較有效的途徑是從全程結對工作開始,通過對細節的指導讓新人了解工作的主要方式和職責,進行必要的知識貯備,學會如何正確的做事。接下來應當讓新人逐漸學會什么是正確的事情。我們的做法是:

  1. 新人接到任務后,自行思考。
  2. 在白板上寫下完成任務的主要步驟
  3. 向教練講解主要思路和考慮點,教練通過提問引導他(輸入特殊字符會怎樣?)
  4. 自行完善方案
  5. 和教練一起確認方案
  6. 教練對整個思考過程進行點評,告訴新人這類問題的思考要點

整個過程大致耗時半個小時,這種方式的優點是新人對方案非常了解,執行起來不容易跑偏;有機會在可控范圍內犯錯,成長更快; 新人可以通過不斷的練習有能力通過多個任務逐漸總結出一套思維方式。教練利用這種方法可以通過代碼檢視和有選擇的結對(譬如針對任務中的難度部分結對)同時幫助多人,更有效率。

結局

在咨詢的過程中,我見過太多的團隊把目標放在交付上,冀希望于工具,外部力量能夠快速的解決問題,往往對小步前進不夠耐心,不關心團隊的成員。在我們這個 90%以上成員沒有.Net經驗,50%是畢業生的團隊中,那些微不足道的改進,一點點的提升,最終造就了這個9個月中沒有一天加班,幾乎沒有缺陷,提前交付的項目,客戶甚至愿意為他們的滿意額外支付3萬美金作為獎勵。我把全篇總結為一句話:把項目目標放在人員能力提升,讓項目成功成為能力提升的副產物。

相關閱讀

如何建設全功能團隊

 

作者:,ThoughtWorks中國區總經理

本文由 @胡凱 原創發布于人人都是產品經理。未經許可,禁止轉載。

題圖來自 Unsplash,基于 CC0 協議

更多精彩內容,請關注人人都是產品經理微信公眾號或下載App
評論
評論請登錄
  1. 目前還沒評論,等你發揮!