敏捷開發(fā)的解決方案
記者:剛才提到你特別關(guān)注的除了工作規(guī)范和開發(fā)規(guī)范上的細(xì)節(jié),還有就是公布流程?
程顯峰:是這樣的,公布流程實(shí)際上就像互聯(lián)網(wǎng)團(tuán)隊(duì)的一個核心,就是有一個標(biāo)志,如果我拿到一個需求,最后到公布有多長時間,這是看整個團(tuán)隊(duì)效率的標(biāo)志性衡量,而且現(xiàn)在很多人都講敏捷,其實(shí)軟件度量是一門學(xué)問,究竟度量什么大家非常有爭議,我感覺我這邊沒有太多爭議,所有的度量尺度都用時間,因?yàn)闀r間是比較公正的,沒有差別的,比如你用代碼行數(shù),大家就會說了,代碼行數(shù)不是一個標(biāo)準(zhǔn)尺度啊,你用C寫的五百行和用Java寫的五百行到底能不能衡量?你說我用時間,我這里的一秒和美國的一秒是一樣的,沒有差別,所以所有的東西都應(yīng)該用時間來衡量,很多東西都可以轉(zhuǎn)化成時間,比如上線效率就可以轉(zhuǎn)化成時間,拿到一個需求到最后推上線就是一個標(biāo)準(zhǔn)的時間,你能在多短的時間之內(nèi)完成這個事情?這是你團(tuán)隊(duì)效率的一個提升。
還有一個非常重要的提升,就是當(dāng)你發(fā)現(xiàn)線上的東西有問題,多長時間能回退到上一個版本?我們可以在秒級之內(nèi)回去,就是一分鐘之內(nèi)退回去,這是整個團(tuán)隊(duì)開發(fā)效率的一個顯著治理 ,如果你做不到這一點(diǎn)的話,比如你已經(jīng)發(fā)現(xiàn)Bug了,第二天才能把這個更正,其中的時間全部都浪費(fèi)了,而且對于一個線上系統(tǒng)就是損失。我是講比較實(shí)在的東西,對于開發(fā)系統(tǒng)的把控必須要特別嚴(yán),怎么才能把控上線的這些東西呢?就是要把上線的過程和開發(fā)的過程、測試的過程全都緊密地聯(lián)系在一起,是一個整體,而不是把它們割裂。包括很多傳統(tǒng)企業(yè)這個方面做得也非常好,并不是敏捷獨(dú)有的,所有的東西我堅(jiān)信都不是敏捷獨(dú)有的,對于優(yōu)秀的工程實(shí)踐來講都是通用的,整個過程都是非常好、非常快的。
記者:在敏捷方法流程中具體 實(shí)踐的有極限編程(XP)和Scrum等等,Scrum目前團(tuán)隊(duì)用的是比較多的,對于極限編程不知道您有沒有了解,據(jù)我了解很多團(tuán)隊(duì)用過Scrum的都不喜歡極限編程的實(shí)踐方式,能說說您的觀點(diǎn)嗎?
程顯峰:Scum只是一個簡單的溝通框架,所以大家的接受程度會比較高,只是規(guī)定了你該在什么時候溝通,該在什么時候反思,早上起來應(yīng)該怎么跟大家交流,抽張撲克牌估算一下這個東西,Scum只是一個實(shí)施框架。極限編程是大量工程實(shí)踐的集合,比如極限編程里講TCB,它是具體讓你操作的,比如咱倆就在一塊,它是一種具體的工程實(shí)踐,就是這么做的,具體工程實(shí)踐大家反感就比較大了,因?yàn)楦郧暗淖龇ú灰粯樱覇栴}的關(guān)鍵在于實(shí)施這種東西最重要的是有一個人帶一個人去實(shí)施,兩個人都不會你就在那兒極限編程,這個太扯了,根本一點(diǎn)用都沒有,這種東西就是師傅帶徒弟。
比如結(jié)對編程,兩個人都沒結(jié)對過,你在那兒結(jié)對。比如本來是一個大鋸,你在這邊我在那邊,大家都沒使過這個鋸,咱倆就商量這個鋸到底怎么拿,所以時間長了以后沒有效果,大家馬上就對這個不看好,然后就失敗了,他們不能帶來效果,一般這種東西在成熟的公司里面,他們是極限編程。就像結(jié)對這種最簡單了,總共有兩種,一種是師傅帶徒弟,就是一個Mentor,一個是徒弟在這里學(xué),Mentor一開始會給你演示所有的編程,你就在后面看,Mentor可能會給你提問,等過了一陣你來,Mentor在后面觀察你、指導(dǎo)你,然后讓你干這些。這是帶新手非常有用的招,很快就能把新手培養(yǎng)出來。
另外一種就是兩個人的水平差不多,就是互相干活,一個人負(fù)責(zé)設(shè)計,另一個人負(fù)責(zé)實(shí)現(xiàn),這是真正的Pair工程模式,那個是教學(xué)模式,你就要求兩個人合作很長時間,比如我說的設(shè)計他不懂,這就玩完了,沒法在一起了。關(guān)于你說的極限編程,兩個人沒在一起合作過,或者兩個人都沒搭檔過,你還在電腦上干自己的,后面的人就特別沒意思,沒有互動沒有交流,這就完了,好多工程實(shí)踐都是這樣的,是跟你平時的編程方法不一樣導(dǎo)致的。這跟大家多數(shù)的東西都不沖突,只是原來要開會,現(xiàn)在也要開會,現(xiàn)在規(guī)定好了什么時間開什么會,只是輕度地改變了你的東西,所以實(shí)施起來非常容易,大家的認(rèn)可度也非常高,某種程度上見效又比較快,因?yàn)樗馨l(fā)現(xiàn)一些具體流程上的問題,比如溝通的障礙、理解需求有問題,或者節(jié)拍上有問題,有的部門太快了有的部門太慢了,他們能發(fā)現(xiàn)這些問題。
我是覺得這個數(shù)據(jù)比較難以衡量,因?yàn)楹饬坑幸饬x的必須是在某種固定的場景下,比如對于我這里來講,我可能會要求程序員開發(fā)一個標(biāo)準(zhǔn)模塊,或者是條形化的實(shí)踐,我會這樣去衡量,但是對于別人來講,這個他可能不太Care,就是從實(shí)施的角度來講,你可以看一下王曉明給華為和騰訊做的,你可以看看他的,我對怎么度量這個事情想的不是很多,我是比較相信主觀看法的,因?yàn)槲以趯?shí)施的過程中是跟他們在一起工作的,不需要用那些數(shù)據(jù)來告訴我他們已經(jīng)進(jìn)步了,他們做外部咨詢的就比較Care這個事情,因?yàn)樗麄冃枰o那些老板寫報告,我不太需要這個東西,我對其它的產(chǎn)品負(fù)責(zé)就可以了。
記者:當(dāng)一個敏捷團(tuán)隊(duì)工作時,有時透明化的流程會暴露出機(jī)構(gòu)中的問題,而這些問題又被稱為敏捷開發(fā)流程的過失。在整個行業(yè)中,您們開始遇到這種情況了嗎?敏捷開發(fā)會使行業(yè)的缺點(diǎn)逐步暴露,從而在各方面招致一些與敏捷開發(fā)對抗的反對意見嗎?
程顯峰:是這樣的,按照我的理解,我覺得暴露問題是個好事,暴露問題就說明這不是一套有效的方法。為什么豐田要做單件流的系統(tǒng)呢?因?yàn)槿魏我粋€環(huán)節(jié)出了問題,馬上就要停掉工作,他是可以以最快的速度發(fā)現(xiàn)問題、解決問題,為什么是一鍵而不是兩鍵呢?因?yàn)橐绘I可以發(fā)現(xiàn)的更及時,要求生產(chǎn)線上的所有環(huán)節(jié)都能嚴(yán)格匹配,有略微 不匹配的地方馬上就會跳出來,如果它是一種發(fā)現(xiàn)問題的話,我覺得這種很好,不發(fā)現(xiàn)才是問題,發(fā)現(xiàn)問題不好嗎?我覺得非常好。當(dāng)然,你肯定會遭到反對意見,這個我覺得是實(shí)施的人應(yīng)該想清楚的事情,實(shí)施什么會遭到反對意見,或者不實(shí)施什么會遭到反對意見。
記者:在實(shí)施當(dāng)中有沒有過這樣的情況?
程顯峰:肯定會有,這個可以來自于各個方面,但是你要實(shí)施的話就要清楚,比如老板什么時候會反對?不出效益的時候會反對,所以剛開始實(shí)施的時候不會去做那些影響步驟的問題,你要先見效,有很多方法可以先見效,但是很多人都不知道,你要實(shí)施那些先見效的,這對樹立信心、樹立威望都是非常有幫助的,你不能一開始就挽起袖子說要怎么干,沒有獲得之前這些事情是做不了的,我們團(tuán)隊(duì)剛開始還好,有些團(tuán)隊(duì)你要實(shí)施敏捷,或者實(shí)施某些具體工程實(shí)踐的話會有挑刺的,這就跟你實(shí)施人員的素養(yǎng)有關(guān)了,比如你能說服他就說服,要是說服不了他的話你也沒法實(shí)施。
比如講故事,有的人去實(shí)施版本操縱 ,他就說要用分步式的傳統(tǒng)模式,有些人就說為什么要用分步的?那么你做一個版本宏觀動作,我用這個做一個,我們比一下。因?yàn)榧夹g(shù)這個東西很好衡量,大家一看就都明白,它不比了,就實(shí)施吧。你要有手段和信心去實(shí)施這個東西,而且你要知道對手是什么,如果你操縱 不住這個局面的話,以后實(shí)施的時候會有各種各樣的東西,比如實(shí)施測試,測試的好處你有沒有給團(tuán)隊(duì)看到?你自己都不會測試,也帶來不了什么好處,你就說服不了團(tuán)隊(duì)去做這種事情。
比如這里是有框架層面的東西,我特別情愿 實(shí)施工程實(shí)踐,因?yàn)槲覍こ虒?shí)踐的把控力特別強(qiáng),你要是反對我這些東西,我有很多理由去說服你,而且非常容易見效,你要很快地贏得工程技術(shù)人員的信任,反而是你實(shí)施這個項(xiàng)目大家會很嘀咕,大家會覺得這個家伙到底寫沒寫過代碼?是不是只會這些?因?yàn)樗簧婕暗饺魏渭夹g(shù)細(xì)節(jié),工程實(shí)踐就不一樣了,你說代碼這么寫不合適,那你就得說出不合適的道理,你要那么設(shè)計的話就是一種技術(shù)的對抗。其實(shí)遭到反對意見不光是敏捷遇到,干什么事情沒有反對意見?沒有反對意見的事大家早就做了,也不需要其他人。
記者:其實(shí)我想了解你們開發(fā)的反對意見。
程顯峰:在我看來大部分的意見其實(shí)是一種固有思維的反應(yīng),就是他們固有模式的一種反應(yīng),以及固有的工作習(xí)慣不情愿 改變的反應(yīng)。問題是這樣的,他是沒有見到你要實(shí)施這種東西的好處的前提下會跳出來反對,你要做的事情是要證明這種東西會給他帶來利益,比如剛才說的那種,你用你的版本操縱 ,我用我的版本操縱 ,你自己本身有非常豐富的經(jīng)驗(yàn),你看到別人那么做就能很清楚地知道這樣做肯定是簡單或者容易,他才不比了,要是知道自己一定會贏的話肯定會比,肯定是他實(shí)施的新東西對他來講是有好處的,但是他又不情愿 付出改變的成本,又不情愿 讓大家明確地見到這種好處。因?yàn)閳F(tuán)隊(duì)的人要是都知道這種好處你就沒法演下去了,所以很多事情要把它透明化,就是不存在那種邊邊角角的東西。
當(dāng)然,阻力是各種各樣的,最好的方式就是把這些東西都透明化,這些程序員相對來說還是非常講道理的,因?yàn)楦鷻C(jī)器打交道多了,有一說一有二說二,思維方式還是比較客觀公正的,不會說這些東西明明是效率高的卻跟你說不行,一般不會有這種情形。
記者:目前國內(nèi)出現(xiàn)了很多敏捷教練的角色,敏捷的教練需要具備什么樣的素養(yǎng)?
程顯峰:我個人覺得不管你具備什么樣的素養(yǎng),你要能和開發(fā)團(tuán)隊(duì)打成一片,要能贏得開發(fā)團(tuán)隊(duì)的尊重才能做得下去,否則你天天講,人家不信你,其實(shí)你什么事都做不了,你可以不懂技術(shù),但是開發(fā)團(tuán)隊(duì)都很信你,這也OK,但是開發(fā)團(tuán)隊(duì)一般都有一種傾向,就是技術(shù)沙文主義,不懂技術(shù)的人是不能打交道的,你要是想真正在這個團(tuán)隊(duì)里混下去的話就得跟他們打交道。不同的團(tuán)隊(duì)當(dāng)然不一樣了,比如華為有敏捷實(shí)施的紅頭文件。
記者:這種規(guī)范開發(fā)人員的工作習(xí)慣,優(yōu)化他們的習(xí)慣,教他們一些工程方法,這跟CTO的職能有什么區(qū)別?技術(shù)部門的Leader職能跟它有什么區(qū)別?
程顯峰:比如丹峰就負(fù)責(zé)技術(shù)架構(gòu)設(shè)計運(yùn)營,我就負(fù)責(zé)培訓(xùn),發(fā)現(xiàn)團(tuán)隊(duì)的問題并整合這些看上去非?,嵥榈氖虑椋€有一些其它培訓(xùn)方面的事情,他們是思變,是想著怎么去打這個仗,我是像個教官一樣想著怎么提高他們的戰(zhàn)斗力,他們只想怎么用這些人,然后是打哪兒,這是他們要管的事情,我是教他們怎么使用武器,讓他們訓(xùn)練有素,學(xué)會配合這些常規(guī)性的事情。