騰訊敏捷開發(fā)及快速迭代
從2006年開始,騰訊的研發(fā)規(guī)模開始膨脹,開發(fā)模式急需規(guī)范和標(biāo)準(zhǔn)化,到底走IPD(集成產(chǎn)品開發(fā))還是Agile(敏捷)的開發(fā)路線,公司管理層也在為拿不定主意而犯愁,之后研發(fā)管理部開始與ThoughtWorks公司接觸,逐漸將敏捷產(chǎn)品開發(fā)引入進(jìn)來,并正式命名為TAPD(Tencent Agile Product Development)。
接觸是從一次3天的培訓(xùn)開始的,ThoughtWorks派來了一個4人講師團(tuán)隊(duì),由此也誕生了騰訊日后推行敏捷的第一批種子。接著總結(jié)騰訊本身是怎么樣子的,有這樣一個框架之后就搞一些團(tuán)隊(duì)去實(shí)踐,通過實(shí)踐以后再不斷改進(jìn),本身也是一個不斷迭代的過程。
騰訊在推廣敏捷的過程中也面臨一些挑戰(zhàn),正是由于這些挑戰(zhàn),才孕育出了獨(dú)特的騰訊敏捷模式。
1、團(tuán)隊(duì)非常多,每個團(tuán)隊(duì)特點(diǎn)都不一樣,比如規(guī)模不一樣,應(yīng)用方法不一樣;
2、產(chǎn)品非常廣,互聯(lián)網(wǎng)上所有的產(chǎn)品騰訊幾乎都有,這種多元化的產(chǎn)品它本身產(chǎn)品的研發(fā)模式會有一些不一樣,那么敏捷、TAPD怎么樣去適應(yīng)這種多元化產(chǎn)品的研發(fā);
3、敏捷在騰訊也是存在一個過程改進(jìn),這樣就會存在一些不適應(yīng)性,針對這種不適應(yīng)性應(yīng)該怎么樣去做才能更好;
4、騰訊人員本身的素質(zhì)也是參差不齊,每年校園招聘大概會招聘1000多個畢業(yè)生,這些畢業(yè)生從畢業(yè)到能上手工作,他們對敏捷的了解,融入到團(tuán)隊(duì)中都需要一個過程;
5、一些長周期的項(xiàng)目,比如QQ客戶端,一個版本的發(fā)布可能要半年到1年的時間,像這樣一個產(chǎn)品怎樣去做敏捷開發(fā),也許它就不適合敏捷開發(fā)。
騰訊的TAPD是吸收了XP+SCRUM+FDD三者特點(diǎn)的并行迭代開發(fā)模式,涉及范疇包括敏捷項(xiàng)目管理和敏捷軟件開發(fā)。
1、產(chǎn)品
采用FDD,即產(chǎn)品特性開發(fā)驅(qū)動的一種模式,騰訊的產(chǎn)品會有一個明確的產(chǎn)品經(jīng)理這樣一個角色,他會負(fù)責(zé)整個產(chǎn)品,包括產(chǎn)品的驗(yàn)證、產(chǎn)品的方向、市場調(diào)研、用戶調(diào)研等。FDD 模式是一種非常適合產(chǎn)品經(jīng)理來對產(chǎn)品做一些滾動的要求,騰訊在產(chǎn)品設(shè)計(jì)上引入了類似FDD這樣的模式,但是也不完全是FDD,只是參考FDD,所有的開發(fā)團(tuán)隊(duì)都是由產(chǎn)品經(jīng)理所歸納出來的產(chǎn)品特性去驅(qū)動整個產(chǎn)品的研發(fā)。
FDD的核心是面向產(chǎn)品的功能點(diǎn),但這個功能點(diǎn)是從客戶角度出發(fā)的,并不是從系統(tǒng)角度出來的。功能點(diǎn)是用一個短句描述出一個業(yè)務(wù)需求,而這個業(yè)務(wù)需求的粒度是按開發(fā)時間來衡量的(一般不超過兩個星期)。特征與用例的相似之處是,兩者都可以用短句(動賓短語)來描述;兩者的不同之處在于,用例用UML的用例圖來表示,而特征是用四色原型(類圖)來表示。產(chǎn)品經(jīng)理這個角色有點(diǎn)Scrum的Product Owner的味道。但產(chǎn)品特性和backlog相差甚遠(yuǎn),因?yàn)楫a(chǎn)品特性只是一個動賓短語,而backlog卻是一個完整的故事(story)。
2、項(xiàng)目管理過程
騰訊采取了SCRUM,但也不完全是SCRUM ,騰訊根據(jù)自己的特點(diǎn)去總結(jié)的一些實(shí)踐,大概的項(xiàng)目管理過程同SCRUM的過程比較類似,包括每天的晨會、迭代、timebox、每個迭代完成的時候會有showcase、回顧總結(jié)等。
3、開發(fā)實(shí)踐
參考了很多XP的實(shí)踐,就XP完整的實(shí)踐來說會比較理想化,很多東西不一定在實(shí)際開發(fā)中能夠采納,所以騰訊也是采納其中的某些實(shí)踐,比如自動化測試和持續(xù)集成,通過這樣的實(shí)踐就能保證產(chǎn)品有一個快速發(fā)布的過程。
一個完整的迭代過程 包括概念、設(shè)計(jì)、開發(fā)、測試和發(fā)布五個過程。
1、概念階段
在概念階段會采用FDD里面提到的一些好的最佳實(shí)踐來支撐到我們怎么樣去敏捷的做需求開發(fā),會制定一些產(chǎn)品發(fā)布的計(jì)劃,比如產(chǎn)品在未來,某個迭代什么時候發(fā)布,要發(fā)布哪些產(chǎn)品特性,都是在這個階段做的。
在設(shè)計(jì)階段,會做產(chǎn)品原型上的設(shè)計(jì)。對于互聯(lián)網(wǎng)產(chǎn)品說更多的是通過快速原型法快速的讓產(chǎn)品在不同范圍內(nèi)去做一些體驗(yàn),比方產(chǎn)品在某個迭代的一個小迭代里面,可能會在一個團(tuán)隊(duì)里面先去體驗(yàn),可能就會采取發(fā)布到公司某一個部門去體驗(yàn),或者發(fā)布到整個公司范圍去體驗(yàn),它會是一個不斷放大的一個過程。
2、開發(fā)和測試階段
在開發(fā)和測試階段,更多的采取XP的一些實(shí)踐,包括編碼規(guī)范,代碼走讀,比如1周一次代碼走讀,構(gòu)建持續(xù)集成的環(huán)境,包括自動化構(gòu)建,自動化測試等,會有一些好的測試上的實(shí)踐,如全員測試,就是將測試看成不僅僅是測試人員的工作,更多的是整個團(tuán)隊(duì)的工作,當(dāng)然也包括這個產(chǎn)品的其他同事的工作,通過全員測試來激發(fā)大家對產(chǎn)品質(zhì)量負(fù)責(zé)。
3、發(fā)布階段
騰訊采用的是灰度發(fā)布,同傳統(tǒng)的軟件發(fā)布不一樣。項(xiàng)目中整個迭代過程就通過類似SCRUM模式去管理,如有每日晨會,如何建設(shè)團(tuán)隊(duì)氛圍,統(tǒng)一的管理平臺,每次迭代完成時的總結(jié)回顧等等,這屬于項(xiàng)目管理的工作。
其中分析、設(shè)計(jì)、開發(fā)、測試、發(fā)布這五個過程可以內(nèi)部再迭代,而且這五個過程不是分階段開展的,即不是分析完了之后才設(shè)計(jì),全部設(shè)計(jì)完了才開發(fā),開發(fā)結(jié)束了才測試,測試通過了才發(fā)布。而是邊分析邊設(shè)計(jì)——在業(yè)務(wù)不復(fù)雜的情況下,這是可行的——邊設(shè)計(jì)邊開發(fā),開發(fā)完一個功能就測試一個功能,同時開發(fā)下一個功能。
還有一些基礎(chǔ)的工作,如代碼管理,版本管理,文檔管理,異地開發(fā)管理,這些在騰訊的整個管理體系里面都包含的,還有會制定一些相關(guān)的規(guī)范,不過規(guī)范不是很強(qiáng)硬的要求每一個項(xiàng)目必須執(zhí)行,更多的由團(tuán)隊(duì)自己選擇,讓他們根據(jù)自己團(tuán)隊(duì)的特點(diǎn)、規(guī)模去選擇應(yīng)該采取哪些實(shí)踐。
1、故事墻
就是白板story wall,平時工作中很多團(tuán)隊(duì)都會使用,這些團(tuán)隊(duì)會把每天開發(fā)的一些產(chǎn)品特性采用story的方式每天都在白板里面展示出來,整個團(tuán)隊(duì)每天都會圍繞這個白板能夠清晰的看到整個產(chǎn)品或者整個項(xiàng)目的一個過程,包括整個產(chǎn)品特性的過程。寫在白板上比用Excel或者其它工具管理好,因?yàn)閷懺诎装迳献屓烁杏X更緊迫、更正式、更一目了然,有一種別人在監(jiān)督、在注視的感覺。
2、每日晨會
每個團(tuán)隊(duì)每天大概花15-30分鐘,回顧昨天做了什么、昨天有些什么問題、同時也會介紹每個人今天計(jì)劃做些什么工作。對Team而言這是檢查進(jìn)度、快速調(diào)整非常有效的形式。
最早是通過白板的方式去做,就是每天項(xiàng)目經(jīng)理組織團(tuán)隊(duì)成員對著白板,白板上體現(xiàn)項(xiàng)目的進(jìn)展情況,通過會議可以很明確的知道昨天大家做到什么樣子,今天大家計(jì)劃做什么,最早的時候每個成員都是口頭匯報的。
實(shí)踐一段時間就發(fā)現(xiàn)了一些問題:
對于一個20、30人的團(tuán)隊(duì),每天要怎樣做晨會,這是目前遇到的比較大的困惑;
晨會很容易形式化,究竟帶來什么樣的效率和效果,目前也在通過一些方式去研究,去探討。有一些形式上的呆板,剛開始做會覺得比較有意思,覺得這跟傳統(tǒng)做法不一樣,每天這樣做并且做多了就感覺很枯燥,這也是面臨一個挑戰(zhàn)。
后來騰訊也做了一些改進(jìn),比如為了讓成員的參與程度更強(qiáng)一些,包括形式上會更強(qiáng)一些,現(xiàn)在有些團(tuán)隊(duì)就會采取每個人輪流主持的方式,剛開始晨會的時候我們也會通過一些好玩的東西去刺激一下某些東西,但是現(xiàn)在看來的話,感覺改進(jìn)的還是不是很透。在騰訊內(nèi)部有一個交流通信的軟件,有些項(xiàng)目也開始不采用站起來開晨會的方式,覺得站起來效率也不高,就會通過即時通信軟件每天去交流,最后由一個人去統(tǒng)一輸出,這樣能解決一些分布式團(tuán)隊(duì)的合作。所謂分布式團(tuán)隊(duì)就是這個團(tuán)隊(duì)中有些同事在這個大樓,有些同事是在那個大樓,通過這種實(shí)時交流的方式可以解決一些問題。
3、規(guī)劃游戲
對敏捷的一種常見誤解是不要計(jì)劃,其實(shí)在敏捷的體系中不僅強(qiáng)調(diào)計(jì)劃,甚至區(qū)分Release計(jì)劃、Iteration計(jì)劃和Task計(jì)劃等多種不同粒度、不同時長的計(jì)劃。規(guī)劃游戲突出的是讓用戶代表參與,由用戶代表評估用戶故事/特性的優(yōu)先級,開發(fā)人員評估任務(wù)的開發(fā)時間,由用戶代表+項(xiàng)目經(jīng)理+核心 成員三方共同排序、組合,確定本次迭代計(jì)劃需要實(shí)現(xiàn)的特性列表。在騰訊用戶代表就是產(chǎn)品經(jīng)理。騰訊特別強(qiáng)調(diào)的是并行迭代,即多個版本并行,最大程度發(fā)揮資源的效率。Release(發(fā)布)可理解成當(dāng)實(shí)現(xiàn)的產(chǎn)品特性累積到一定用戶價值時的正式發(fā)布,它是比迭代更大的概念;迭代是在固定時間內(nèi)開發(fā)特性的過程,Release一般包括多次迭代。
4、時間盒
在騰訊的產(chǎn)品研發(fā)中,產(chǎn)品的每一個迭代都有一個明確的時間盒。在每一次迭代開始的時候會召開一次IPM會議,即本次迭代的計(jì)劃會議,會議中團(tuán)隊(duì)中的所有成員包括產(chǎn)品人員、開發(fā)人員、項(xiàng)目經(jīng)理、總監(jiān)、部門領(lǐng)導(dǎo),一起去敲定本次迭代要完成的任務(wù),一旦任務(wù)敲定下來,本次迭代就會嚴(yán)格按照這個去落實(shí)執(zhí)行。TimeBox反映了敏捷開發(fā)的節(jié)奏,即在固定時間內(nèi)實(shí)現(xiàn)不固定特性的周期,拋開需求定義階段,從設(shè)計(jì)-實(shí)現(xiàn)-測試到部署,在騰訊一般一至兩周時間居多。
5、產(chǎn)品演示
提交測試前由開發(fā)人員演示實(shí)現(xiàn)的功能,產(chǎn)品經(jīng)理到場Review是否符合當(dāng)初的設(shè)想,避免接近發(fā)布時才反饋。
6、迭代總結(jié)
在每一個產(chǎn)品發(fā)布的時候都會有一個總結(jié)。具體的做法是,把做得好的、不好的總結(jié)出來,做得好的在下一次迭代發(fā)揚(yáng)光大,做得不好的在下一次迭代就要注意改進(jìn)。這樣的總結(jié)是要求項(xiàng)目的所有成員都必須參加,包括項(xiàng)目的開發(fā)人員、測試人員、QA、項(xiàng)目經(jīng)理、產(chǎn)品經(jīng)理等,每個人都要去去總結(jié)他在上一個迭代中碰到了什么問題,通過便簽紙的方式貼出來,項(xiàng)目經(jīng)理實(shí)際上可以看成是Scrum Ma ster,包括站起來總結(jié)這樣一些東西,包括我們下一次迭代繼續(xù)發(fā)揚(yáng)什么,必須要注意什么東西,最后就會得出一個excel的文檔,包括上一個迭代中出的問題,具體的解決辦法都會有。
7、自運(yùn)轉(zhuǎn)團(tuán)隊(duì)
早期的項(xiàng)目,為了能提高效率,項(xiàng)目經(jīng)理希望每個角色都能全力以赴的提升自己的效率,于是自己承擔(dān)起來大量溝通和推進(jìn)的工作,那個時候的都在被PM推著走,一旦PM休假,項(xiàng)目基本沒有什么產(chǎn)出,當(dāng)時去了以后,發(fā)現(xiàn)問題很嚴(yán)重,團(tuán)隊(duì)的主動性必須被調(diào)動起來才行。
自運(yùn)轉(zhuǎn)團(tuán)隊(duì),是將需求開發(fā)過程詳細(xì)劃分成開發(fā)的各環(huán)節(jié),并明確每個環(huán)節(jié)的負(fù)責(zé)人,由該負(fù)責(zé)人來驅(qū)動上下游的負(fù)責(zé)人,而不再由項(xiàng)目經(jīng)理來連接各個環(huán)節(jié),再配合上高效的項(xiàng)目協(xié)助工具平臺,實(shí)現(xiàn)開發(fā)過程自運(yùn)轉(zhuǎn)。這時項(xiàng)目經(jīng)理則由指揮者變成服務(wù)者,觀察環(huán)節(jié)之間產(chǎn)生的瓶頸,并及時采取措施掃除障礙。
1、用戶研究
如何加強(qiáng)用戶的參與度,這是一種成本比較低的用戶研究方法。通過抓取一些用戶數(shù)據(jù)做分析,分析用戶在這個產(chǎn)品上整個體驗(yàn)的過程是怎樣的,通過后臺的數(shù)據(jù)可以看到整個活動的曲線,同時CE也可以通過一些科學(xué)的手段去保證,包括市場調(diào)研、用戶研究、數(shù)據(jù)挖掘、產(chǎn)品體會等,這就是通過一些對用戶反饋、用戶觀察的工具去配合去對用戶做研究。比如QQ拍拍的一個用戶的研究,我們可以到現(xiàn)場去做的一個調(diào)研,經(jīng)常會由產(chǎn)品經(jīng)理和用戶研究人員到用戶的實(shí)際辦公地點(diǎn)進(jìn)行調(diào)研,做一天的反饋,通過觀察用戶一天是如何使用你的產(chǎn)品,配合一些相關(guān)的工具去科學(xué)的分析。因?yàn)榛ヂ?lián)網(wǎng)是非常強(qiáng)調(diào)同用戶的這種反饋的,騰訊有自己內(nèi)部的一個CE反饋平臺,在這個平臺上可以收集到所有用戶的反饋,產(chǎn)品經(jīng)理可以每天都會看到他所負(fù)責(zé)的產(chǎn)品有哪些反饋,包括內(nèi)部的、外部的,然后他就可以根據(jù)這些反饋對產(chǎn)品進(jìn)行一些快速的調(diào)整,包括開發(fā)一些什么樣的產(chǎn)品特性,內(nèi)部同事也可以踴躍的在平臺上反饋,內(nèi)部同事本身就是QQ用戶。
2、故事卡片/故事墻/特征列表
StoryCard是XP中推薦的需求定義方法,要求符合Invest和Moscow原則;故事墻則用于跟蹤故事卡片的 變化狀態(tài),而特征列表是Tencent一直沿用的需求表達(dá)形式,在騰訊的TAPD工具中已經(jīng)實(shí)現(xiàn)了類似ThoughtWorks 的Mingle的故事卡片管理功能,對于需求跟蹤而言這是不錯的方法,一目了然。
3、結(jié)對編程
理論上結(jié)對編程可以提高代碼的質(zhì)量,而且并不會降低開發(fā)效率,但騰訊的業(yè)務(wù)繁忙,資源上不允許兩人結(jié)對。但是在一些團(tuán)隊(duì)里面還是一直在嘗試著做結(jié)對編程的工作。一個在編寫程序,旁邊還有一個人,同時記錄編寫過程、編寫思路、碰到的問題、自己的想法,編寫完以后一段時間他們會交換一下,就是互相交換著進(jìn)行編程,這是一個結(jié)對編程的一個過程。
4、測試驅(qū)動
“測試驅(qū)動開發(fā)”在騰訊執(zhí)行地并不太好,騰訊的產(chǎn)品以Web形式居多、業(yè)務(wù)邏輯相對簡單,C++下的單元測試有些力不從心。相反自動化測試在騰訊比較盛行,因?yàn)橛袦y試部門專門的自動化測試Team在推動,而且鏈接的是正式生產(chǎn)環(huán)境,可以即時反映產(chǎn)品當(dāng)前的狀態(tài)。
5、持續(xù)集成
持續(xù)集成可以降低發(fā)布前集成階段的難度與成本,騰訊的自動化構(gòu)建系統(tǒng)推行的比較早,覆蓋了大多數(shù)產(chǎn)品,而且正在朝自動化構(gòu)建-自動化測試-自動化發(fā)布三者協(xié)同的目標(biāo)邁進(jìn)。作為加快產(chǎn)品的發(fā)布的能力,持續(xù)集成在以下幾個方面作用明顯。
自動編譯輸出報告,維護(hù)代碼可運(yùn)行,及時暴露風(fēng)險,降低集成成本。
Dailybuild日構(gòu)建系統(tǒng),讓產(chǎn)品經(jīng)理、測試人員可以盡早進(jìn)行體驗(yàn)和測試。
作為一個自動化系統(tǒng),利用靜態(tài)代碼檢查、單元測試報告等手段為團(tuán)隊(duì)提供報告,促進(jìn)編碼質(zhì)量不斷得到重視,降低缺陷解決成本、縮短解決時間。
6、灰度發(fā)布
灰度發(fā)布是騰訊的又一創(chuàng)新,它將產(chǎn)品試用擴(kuò)大到海量用戶一端,在小范圍及時吸取用戶反饋,分析用戶行為和喜好,持續(xù)修正自己產(chǎn)品的功能體驗(yàn)。在互聯(lián)網(wǎng)行業(yè),灰度發(fā)布已經(jīng)成為最重要的發(fā)布控制手段。有時我們希望通過向小部分用戶開發(fā)新功能,讓他們先來體驗(yàn)新功能、新特性。通過用戶反饋、數(shù)據(jù)運(yùn)營的手段及早獲得反饋,及時改進(jìn)。以此方式,既可以降低發(fā)布風(fēng)險,也可以提升發(fā)布頻率,加快發(fā)布節(jié)奏。
簡單說就是,將一項(xiàng)業(yè)務(wù)不是一下發(fā)布給所有用戶,而是分批分期的發(fā)布,目的有兩個方面,一是減輕服務(wù)器壓力,二是期間可以在小范圍收集到用戶的反饋,如果業(yè)務(wù)出現(xiàn)問題,不會讓大范圍用戶受到影響。隨著經(jīng)驗(yàn)的累計(jì),我們有了許多種灰度策略和方法,灰度也有了更多的應(yīng)用,甚至引入到了測試環(huán)境,即選擇一些熱心用戶,將功能首先發(fā)布給他們,通過他們的使用,來幫助進(jìn)行一些現(xiàn)網(wǎng)測試,這使得一些難于模擬的測試場景變得簡單,測試人員的壓力大大降低;更重要的用戶是最好的測試人員,測試結(jié)果更加真實(shí);同時他們也享受到了優(yōu)先體驗(yàn)的特權(quán),可謂一舉三得。發(fā)布的時候也有策略,比如發(fā)布時如何放量,對用戶有些什么樣的實(shí)驗(yàn),技術(shù)上怎樣做一些后臺開關(guān),運(yùn)營上怎樣跟進(jìn),怎樣保證4小時人員的留守,發(fā)布完后怎樣收集用戶反饋等等都會有一些統(tǒng)一的規(guī)則。
7、發(fā)布汽車
過于頻繁的發(fā)布會打破團(tuán)隊(duì)節(jié)奏,有效的發(fā)布管理是必不可少的,根據(jù)業(yè)務(wù)特點(diǎn),我們通常會采用三種發(fā)布模式,我們管它叫“發(fā)布汽車”。
(1)班車模式
像班車一樣,固定周期進(jìn)行,比如每兩周發(fā)布一次,這周比較適合特性規(guī)劃比較好的產(chǎn)品,比如QQ客戶端基本每個月都會發(fā)布一個版本。
(2)的士模式
與QQ客戶端不同,QQServer作為一個平臺,它的需求來源非常多,因此它采用多線并行的方式,根據(jù)需求來源分成十多個子項(xiàng)目,根據(jù)每個子項(xiàng)目如果想要發(fā)布,就像打的一樣隨叫隨發(fā)布。他的好處是快,但是協(xié)調(diào)發(fā)布的成本是比較高的,比作班車花錢要多。
(3)警車模式
顧名思義可以不按法規(guī)來開車,因此對于一下特別緊急的需求或運(yùn)營事件,必須采用警車這種模式,緊急發(fā)布,但這樣做成本更高,會把交通秩序搞亂,開發(fā)節(jié)奏打破。
8、重構(gòu)
好的代碼不是設(shè)計(jì)出來的,而是重構(gòu)出來的。
當(dāng)然流程和開發(fā)方法確定了還遠(yuǎn)遠(yuǎn)不夠,更難的是如何將它推動落地。首先騰訊組織開發(fā)了承載敏捷思想的TAPD項(xiàng)目管理工具,它類似 ThoughtWorks的Mingle。然后推出了敏捷能力模型,類似CMM成熟度模型一樣對Team評級加以引導(dǎo);同時還推出了敏捷指數(shù)排行榜形成競爭,營造你追我趕的聲勢氛圍。
本文經(jīng)授權(quán)轉(zhuǎn)載自微信公眾號:
