幾年之前我還是個(gè)野生程序員的時(shí)候客年,對(duì)“敏捷”這個(gè)詞是有些抗拒的霞幅。那時(shí)候,要么是沒(méi)有想法量瓜、懶得去理會(huì)司恳,要么就是主觀上拒絕:
肯定又是些無(wú)所事事的人弄出來(lái)的無(wú)聊概念,幫他們自己刷存在感的東西榔至!
敏捷抵赢,就是那些咨詢公司弄出來(lái)給別人洗腦的嘛欺劳,那些理念太空唧取,根本無(wú)法落地!
那些一大堆概念都是些什么鬼划提?條條框框太多了枫弟,運(yùn)作起來(lái)太麻煩了!
不用敏捷鹏往,我們現(xiàn)在不也挺好的嗎淡诗?敏捷跟我有什么關(guān)系?
但后來(lái)我卻選擇加入了 ThoughtWorks伊履,這個(gè)傳說(shuō)中的敏捷大本營(yíng)韩容,一方面因?yàn)楹芏喑雒臅?shū)都是 ThoughtWorks 的人出的,另一方面也想親入虎穴一探究竟唐瀑。而如今群凶,歷經(jīng)敏捷項(xiàng)目的洗禮,我已經(jīng)成為專職的一線咨詢師哄辣,為眾多大型企業(yè)提供敏捷轉(zhuǎn)型過(guò)程中的技術(shù)指導(dǎo)请梢。
他們
在一些朋友看來(lái)赠尾,我自從換了工作,就開(kāi)始在群里轉(zhuǎn)發(fā)一些敏捷相關(guān)的文章毅弧,發(fā)表一些感言气嫁。在轉(zhuǎn)發(fā)這些內(nèi)容的時(shí)候,我經(jīng)常用到的敘事口吻是“他們”够坐。
他們的代碼真的寫(xiě)了好多測(cè)試寸宵。
有時(shí)候要開(kāi)一整天的會(huì),我真不知道他們是怎么撐下來(lái)的元咙!
感覺(jué)跟著他們一起做測(cè)試驅(qū)動(dòng)開(kāi)發(fā)好像沒(méi)那么難邓馒。
這段時(shí)間里,我讓自己成為一個(gè)“警惕的觀察者”蛾坯。不管是主觀上的警覺(jué)光酣,還是故意在外人面前將自己打造成這樣的一個(gè)形象。深怕在我還沒(méi)有覺(jué)察到的時(shí)候就已經(jīng)被敏捷洗腦了脉课;同時(shí)也希望在曾經(jīng)的好友面前以盡量理性救军、中立和客觀(理中客)的形象示人:不過(guò),這不妨礙在他們看來(lái)倘零,我已經(jīng)被洗腦了唱遭。
后來(lái)我了解到,這如同學(xué)習(xí)新知識(shí)過(guò)程“守破離”中“守”的階段呈驶】皆螅“守”的過(guò)程既是獲取新認(rèn)知的過(guò)程,也是與過(guò)去的認(rèn)知做比較和更新的過(guò)程袖瞻。觀察現(xiàn)象——對(duì)比質(zhì)疑——私下學(xué)習(xí)——撥開(kāi)疑云司致,大體就是這樣的不段重復(fù),在不斷了解新實(shí)踐的過(guò)程中聋迎,也同步去認(rèn)識(shí)它脂矫、理解它。
漸漸地霉晕,一系列疑問(wèn)得以解答庭再,使得最終我接納了敏捷開(kāi)發(fā)思想,并認(rèn)為它是適用于現(xiàn)代開(kāi)發(fā)團(tuán)隊(duì)中的工作方法牺堰。
疑問(wèn)
在過(guò)去我呆過(guò)的團(tuán)隊(duì)中拄轻,一直有兩個(gè)無(wú)法解答的問(wèn)題。那時(shí)作為技術(shù)經(jīng)理伟葫,我經(jīng)常被別人問(wèn)到的問(wèn)題恨搓,也是我自己無(wú)法用經(jīng)驗(yàn)回答的問(wèn)題。
- 做完這個(gè)功能扒俯,你估計(jì)需要多少時(shí)間奶卓?
- 為什么大家在辦公室顯得很安靜一疯、氣氛有點(diǎn)壓抑?
在成功學(xué)的洗腦課程中夺姑,有一句被強(qiáng)調(diào)最多的話:“失敗一定有原因墩邀,而成功一定有方法!”那么盏浙,我們過(guò)去回答不了的上面這些問(wèn)題眉睹,以及由它們導(dǎo)致的管理上的難題,其根本原因又是什么呢废膘?獲得管理上成功的方法又是什么呢竹海?我?guī)е@兩個(gè)問(wèn)題離開(kāi)了之前深度參與的創(chuàng)業(yè)項(xiàng)目。與朋友分享了要探索新征程的想法之后丐黄,他真誠(chéng)地邀請(qǐng)我加入他的創(chuàng)意斋配,并希望由我來(lái)帶領(lǐng)團(tuán)隊(duì)一起續(xù)寫(xiě)新的故事。我猛然間發(fā)現(xiàn)灌闺,其實(shí)雖然之前在團(tuán)隊(duì)里擔(dān)任所謂技術(shù)經(jīng)理的職位艰争,但我真正給團(tuán)隊(duì)帶來(lái)的幫助似乎更多的只是一個(gè)有經(jīng)驗(yàn)的工程師給新手的指導(dǎo)。那時(shí)候桂对,第三個(gè)疑問(wèn)產(chǎn)生了:
- 如何去做好一個(gè)團(tuán)隊(duì)帶頭人甩卓?應(yīng)該安排團(tuán)隊(duì)成員每天做什么?
這些疑問(wèn)不得到解答蕉斜,我就如同掉下井底的青蛙逾柿,雖然能聽(tīng)見(jiàn)外面世界的聲音,卻只能看到井口大小的世界宅此。
答疑
加入新團(tuán)隊(duì)后不久机错,這些疑問(wèn)就完全得到了解答。第一個(gè)要實(shí)現(xiàn)的需求就是一個(gè)“明星”功能诽凌,集成第三方系統(tǒng)的調(diào)查問(wèn)卷毡熏。團(tuán)隊(duì)很快組織了需求計(jì)劃會(huì)議坦敌,并細(xì)致地過(guò)了一遍第一期要完成的目標(biāo)侣诵,實(shí)現(xiàn)這個(gè)目標(biāo)要包含的業(yè)務(wù)范圍,而具體又包含哪些步驟(用戶故事)狱窘。
目標(biāo):發(fā)出問(wèn)卷鏈接杜顺,并將數(shù)據(jù)收回來(lái)。
范圍:選取模板蘸炸、發(fā)送鏈接躬络、收回?cái)?shù)據(jù)、發(fā)送提醒郵件
-
步驟:
1. 管理員在外部系統(tǒng)中創(chuàng)建好模板(不需要開(kāi)發(fā))
- 用戶可在 XX 頁(yè)面中使用選項(xiàng)來(lái)選擇問(wèn)卷模板(系統(tǒng)自動(dòng)將外部系統(tǒng)中的模板名字同步到本地系統(tǒng))
- 用戶可在 YY 頁(yè)面中使用鏈接發(fā)送調(diào)查表單搭儒,客戶收到包含鏈接的郵件
- 系統(tǒng)自動(dòng)將外部系統(tǒng)中收到的數(shù)據(jù)同步到本地系統(tǒng)中以供使用
- 如果沒(méi)收到提交數(shù)據(jù)穷当,系統(tǒng)自動(dòng)在7天后自動(dòng)發(fā)出提醒郵件提茁,客戶再收到一封包含鏈接的郵件
接著開(kāi)發(fā)人員和測(cè)試人員對(duì)還不夠詳盡的細(xì)節(jié)提出問(wèn)題,討論獲得一致馁菜,一起對(duì)各個(gè)步驟大致估計(jì)所需時(shí)間茴扁。每個(gè)用戶故事并不確定由誰(shuí)來(lái)做,而是大家一起就其中的細(xì)節(jié)進(jìn)行討論汪疮,并就所需時(shí)間形成一致:有的人說(shuō)需要 3 天峭火,有的人覺(jué)得 2 天就夠了。他們會(huì)敘述自己的想法智嚷,并最終達(dá)成共識(shí)卖丸。
這項(xiàng)活動(dòng),以及之后的迭代過(guò)程中盏道,基于這個(gè)會(huì)議的開(kāi)發(fā)過(guò)程解答了我第一個(gè)疑問(wèn)稍浆。
他們有一個(gè)角色叫 BA,會(huì)寫(xiě)一個(gè)個(gè)的用戶故事來(lái)描述需求猜嘱,一兩天就可以完成一個(gè)故事粹湃。明確的前提條件和驗(yàn)收標(biāo)準(zhǔn)(從哪里開(kāi)始做,做到哪里為止)泉坐,讓開(kāi)發(fā)工作變得有節(jié)奏感为鳄,需求不清楚的時(shí)候隨時(shí)就這個(gè)需求的范圍進(jìn)行討論。
相比于拿別的產(chǎn)品做個(gè)演示腕让,甩一句“就照這個(gè)做”孤钦,然后就天天催進(jìn)度、做出來(lái)之后又說(shuō)不對(duì)勁的產(chǎn)品經(jīng)理纯丸,有一個(gè)專門(mén)負(fù)責(zé)業(yè)務(wù)偏形、隨時(shí)可以叫過(guò)來(lái)討論的 BA 讓開(kāi)發(fā)人員感到倍感輕松。
江湖上傳言說(shuō)敏捷不需要文檔觉鼻,原來(lái)是謬誤俊扭。敏捷并沒(méi)有說(shuō)不需要文檔,只是說(shuō)認(rèn)為團(tuán)隊(duì)成員之間的溝通協(xié)作比詳盡的文檔更重要坠陈。所以萨惑,用戶故事仍然是會(huì)包含必要的描述內(nèi)容的。要寫(xiě)清楚為什么要做這項(xiàng)功能仇矾,以及驗(yàn)收標(biāo)準(zhǔn)等庸蔼。
團(tuán)隊(duì)一起估計(jì)時(shí)間的過(guò)程,不光可以消除特定人估計(jì)時(shí)的無(wú)助感贮匕,更重要的是它讓所有人都了解用戶故事的細(xì)節(jié)姐仅,在后續(xù)開(kāi)發(fā)中誰(shuí)都可以參與開(kāi)發(fā)。
相對(duì)較小的用戶故事,估計(jì)起來(lái)要比一整個(gè)功能(比如對(duì)整個(gè)調(diào)查問(wèn)卷功能進(jìn)行估計(jì))估計(jì)起來(lái)靠譜得多掏膏。即使有特定的用戶故事估計(jì)不準(zhǔn)確劳翰,其影響范圍也是可控的。
把所有故事的估計(jì)時(shí)間相加馒疹,即為整個(gè)功能所需要花費(fèi)的時(shí)間磕道。
估計(jì)只是幫助做計(jì)劃的一種方法,在后續(xù)開(kāi)發(fā)過(guò)程中行冰,如果發(fā)現(xiàn)比當(dāng)初估計(jì)的要復(fù)雜溺蕉,或者簡(jiǎn)單,需要與 BA悼做、PM 等角色一起更新這個(gè)估計(jì)值疯特,從而幫助團(tuán)隊(duì)及時(shí)完善一開(kāi)始制定的迭代計(jì)劃(如果必要,可以加入一些肛走,或者減去一些漓雅,或者修改一些)。
這樣朽色,我發(fā)現(xiàn)開(kāi)發(fā)團(tuán)隊(duì)的時(shí)間原來(lái)是需要管理的邻吞,而管理時(shí)間這件事其實(shí)也需要花些心思才能做好。這時(shí)候葫男,如果你問(wèn)我某項(xiàng)功能需要多久做好抱冷?我會(huì)告訴你,讓我來(lái)拆分一下功能梢褐,粗略估計(jì)就成為了可能旺遮。
而后面的其他疑問(wèn)也很快得到了解答。關(guān)于團(tuán)隊(duì)氣氛盈咳,如果一個(gè)團(tuán)隊(duì)里每個(gè)成員都在悶頭做自己的工作耿眉,獨(dú)自面對(duì)自己的交付壓力和技術(shù)挑戰(zhàn),成員之間互相幫不上忙鱼响,他們的氣氛一定不會(huì)太好鸣剪。而如果所有人通力配合工作在相同的功能上,一起理解消化業(yè)務(wù)丈积,一起解決技術(shù)問(wèn)題筐骇,共同做技術(shù)決策,并分擔(dān)解決缺陷(BUG)的責(zé)任和壓力桶癣,那么團(tuán)隊(duì)的氣氛怎么會(huì)不好呢拥褂?
最后一個(gè)問(wèn)題,關(guān)于團(tuán)隊(duì)牙寞。
團(tuán)隊(duì)里大家的角色是如何分配的,規(guī)模又應(yīng)該多大?團(tuán)隊(duì)之間應(yīng)該如何配合间雀?這就不難回答了悔详。典型的業(yè)務(wù)功能團(tuán)隊(duì),以及后來(lái)出現(xiàn)的微服務(wù)團(tuán)隊(duì)惹挟,都很好的詮釋了團(tuán)隊(duì)結(jié)構(gòu)和規(guī)模問(wèn)題茄螃。有一個(gè)論述產(chǎn)品設(shè)計(jì)和組織結(jié)構(gòu)關(guān)系的康威定律,值得我們深入思考连锯。團(tuán)隊(duì)帶頭人归苍?我突然反應(yīng)過(guò)來(lái),一定要有這個(gè)角色么运怖?如果大家都能很好地運(yùn)作了拼弃,那其實(shí)這個(gè)所謂帶頭人的作用是很淡化的,這也就是所謂的自組織團(tuán)隊(duì)了摇展。如果一定要一個(gè)帶頭人吻氧,那他的職責(zé)一定是確保這樣一種自組織的機(jī)制在團(tuán)隊(duì)中持續(xù)地運(yùn)作下去。
所以咏连,我被洗腦了嗎盯孙?
也許你可以這樣認(rèn)為。
作者我現(xiàn)在是接受了敏捷思想的祟滴,其中還有一些工具和方法振惰,我還在持續(xù)學(xué)習(xí)過(guò)程中。不過(guò)垄懂,“洗腦”這個(gè)詞本身其實(shí)具有一定的預(yù)設(shè)立場(chǎng)报账,它是那些質(zhì)疑者的說(shuō)法。
那么埠偿,重新回到問(wèn)題本身透罢。敏捷是什么呢?它會(huì)將人們洗腦嗎冠蒋?
敏捷不是什么宗教羽圃,它只是一種生產(chǎn)軟件的思路,一種倡議抖剿。它倡議朽寞,通過(guò)加強(qiáng)團(tuán)隊(duì)成員間的交流協(xié)作,盡快交付高質(zhì)量斩郎、有價(jià)值的軟件脑融,讓團(tuán)隊(duì)以良好的響應(yīng)性來(lái)?yè)肀к浖淖兓?/strong>為了符合這種思路,它一般又會(huì)有一些典型的實(shí)踐方式缩宜。我們可以說(shuō)哪些實(shí)踐是由敏捷方法所推薦的肘迎,因此是“敏捷的”甥温;而哪些實(shí)踐是不推薦的,因此是“不夠敏捷的”妓布。但不會(huì)說(shuō)哪種是好的姻蚓,哪種是不好的。
比如匣沼,敏捷的:
- 自主提交代碼狰挡,盡早集成
- 自動(dòng)化一切,包括環(huán)境初始化
- 代碼由團(tuán)隊(duì)共享释涛,隨時(shí)重構(gòu)和優(yōu)化
不敏捷的:
- 逐次代碼提交都需要他人審查并批準(zhǔn)的管控
- 手動(dòng)部署生產(chǎn)環(huán)境
- 不讓他人修改自己編寫(xiě)的代碼
但這些“不敏捷”的條目加叁,基于團(tuán)隊(duì)具體情況,可能實(shí)際操作起來(lái)更可行唇撬,就可以根據(jù)目前的階段去施行它匕,并向著更敏捷的方向去持續(xù)改進(jìn)。類(lèi)似地還有局荚,敏捷不會(huì)說(shuō)團(tuán)隊(duì)一定要開(kāi)站會(huì)超凳,站會(huì)一定要在早上開(kāi)等等……相反,如果要求團(tuán)隊(duì)一定要做某件事耀态,其實(shí)它與敏捷思想是背道而弛的轮傍。我們應(yīng)該遵循敏捷理念去對(duì)實(shí)踐進(jìn)行改良,以適應(yīng)團(tuán)隊(duì)實(shí)際情況首装。
事實(shí)上创夜,“敏捷”一詞來(lái)源于英語(yǔ) Agile,這一英文詞匯也類(lèi)似于中文中的形容詞“敏捷”一詞仙逻,其適應(yīng)性相當(dāng)廣泛驰吓。人們往往用它來(lái)形容業(yè)務(wù)的靈活性,思路的開(kāi)放性等系奉。因此對(duì)于敏捷來(lái)說(shuō)檬贰,并不存在什么洗腦不洗腦的說(shuō)法。它只是一種風(fēng)格缺亮,一種態(tài)度翁涤。只要你運(yùn)用這種思路和風(fēng)格去讓團(tuán)隊(duì)協(xié)作越來(lái)越好,開(kāi)發(fā)出來(lái)的軟件的質(zhì)量越來(lái)越好萌踱,那就是敏捷的葵礼。敏捷中典型的具體實(shí)踐方法有 Scrum、XP 和 Lean 等并鸵。此外鸳粉,近年被廣為談?wù)摰?DevOps,也已經(jīng)成為了敏捷軟件方法的典型實(shí)踐园担。
文/ThoughtWorks 陳計(jì)節(jié)