軟件開(kāi)發(fā):敏捷開(kāi)發(fā)模式,無(wú)論是產(chǎn)品還是運(yùn)營(yíng)都要懂
本文筆者將從軟件工程的角度來(lái)聊一聊敏捷開(kāi)發(fā)模式,會(huì)涉及瀑布,V字、RUP、迭代、螺旋等開(kāi)發(fā)模型,同時(shí)重點(diǎn)分享下敏捷模式的核心思想。
文章分兩部分:
- 通過(guò)舉例和對(duì)標(biāo)其他行業(yè),聊聊軟件開(kāi)發(fā)模型的發(fā)展演進(jìn)。
- 聊聊敏捷的核心思想。
敏捷開(kāi)發(fā)是互聯(lián)網(wǎng)界比較流行的軟件開(kāi)發(fā)模式,產(chǎn)品、技術(shù)、項(xiàng)目管理、運(yùn)營(yíng)、美術(shù)和測(cè)試等各崗位對(duì)其理解后都大有益處,運(yùn)用得當(dāng)可以事半功倍?,F(xiàn)在信息爆炸、良莠不齊,網(wǎng)上很多講敏捷的文章,Scrum詞意沒(méi)理解到位。去年看了敏捷革命的原版《Scrum:The Art of Doing Twice the Work in Half the Time》,結(jié)合大學(xué)所學(xué)的軟件工程聊一聊這個(gè)話(huà)題,here we go~
第一部分
瀑布模型
先上定義:瀑布模型是將軟件生存周期的各項(xiàng)活動(dòng)規(guī)定,為按固定順序而連接的若干階段工作軟件概念,主要分為:需求分析、架構(gòu)設(shè)計(jì)、詳細(xì)設(shè)計(jì)、實(shí)現(xiàn)、單元測(cè)試、集成部署、系統(tǒng)測(cè)試、運(yùn)營(yíng)維護(hù)。
瀑布模型要求每一個(gè)階段都有明確的文檔產(chǎn)出,對(duì)于嚴(yán)格的瀑布模型每一個(gè)階段都不應(yīng)該重疊。
為什么會(huì)有瀑布模型?
如果一個(gè)人接項(xiàng)目,他也許不需要這么麻煩,但規(guī)模稍微大一些,就需要多人協(xié)作,這時(shí)候就需要有標(biāo)準(zhǔn)有規(guī)范。
最開(kāi)始的時(shí)候,大家用了建筑工程領(lǐng)域的模型來(lái)對(duì)標(biāo)軟件工程。是蓋住宅還是蓋工廠(chǎng),或是商廈或是辦公樓或是博物館,都需要有嚴(yán)謹(jǐn)?shù)慕ㄖO(shè)計(jì)圖,水電管道布線(xiàn)甚至裝修方案,才可以開(kāi)始施工。
瀑布模型就是這個(gè)思維,所以瀑布模型對(duì)軟件架構(gòu)師的要求很高。在瀑布模型下,如果把開(kāi)發(fā)軟件作為蓋棟建筑的話(huà),coder只需要“搬磚”就可以了(在敏捷開(kāi)發(fā)過(guò)程中,對(duì)研發(fā)團(tuán)隊(duì)人員的要求會(huì)較高。瀑布重視流程、文檔,敏捷強(qiáng)調(diào)團(tuán)隊(duì)內(nèi)人員能力,特別是cross-functional,要有跨領(lǐng)域的能力)。
也有人把瀑布模型折疊起來(lái),變成了V字型,目的是每個(gè)階段都有要去驗(yàn)證的東西,看起來(lái)是有跡可循的,前后階段是對(duì)應(yīng)的。
個(gè)人覺(jué)得瀑布模型最重要的是給大家樹(shù)立了軟件工程的基本觀(guān)念:
- 前期做足功課很重要;
- 編碼只是軟件工程中的一部分。
V字模型
瀑布模型有什么問(wèn)題?
慢慢大家發(fā)現(xiàn):瀑布模型有很多限制和問(wèn)題,最主要的是不能擁抱變化。
蓋大樓畢竟跟開(kāi)發(fā)軟件不一樣,軟件的需求往往是不斷變化的,瀑布模型往往會(huì)導(dǎo)致?tīng)恳话l(fā)而動(dòng)全身,這就導(dǎo)致絕大多數(shù)瀑布模型是延期的,而且出來(lái)的東西也不是用戶(hù)最初想要的——客戶(hù)想要一把瑞士軍刀,最終只出來(lái)一把螺絲刀,甚至只是一根小木棍兒。
于是,人們逐漸想辦法克服了這個(gè)問(wèn)題——這就是統(tǒng)一軟件開(kāi)發(fā)過(guò)程(RUP:Rational Unified Process)
統(tǒng)一軟件開(kāi)發(fā)過(guò)程:
RUP是瀑布模型的改進(jìn),可以這樣理解,這個(gè)模型把軟件開(kāi)發(fā)過(guò)程的類(lèi)比從建筑行業(yè)改到了汽車(chē)行業(yè)。
主要認(rèn)清了兩點(diǎn):
- 軟件是不斷迭代的;
- 軟件應(yīng)該是面向?qū)ο蟮摹?/li>
當(dāng)然,還有很多其他方面的改進(jìn)細(xì)節(jié),就不展開(kāi)了。
一個(gè)車(chē)型可以是系列的,舒適版、技術(shù)版、豪華版,不同年份還不一樣,是不斷迭代更新的。要想造一輛車(chē),團(tuán)隊(duì)可以分頭行動(dòng)。
簡(jiǎn)化一下,比如:要做一個(gè)四只腳的木凳,甲可以先去做凳子面,乙去做凳子腿。前提是兩個(gè)人定義好怎樣連接(接口),用什么樣的螺絲,多大的孔,在什么位置連接,凳子腿多高等等,也可以有個(gè)專(zhuān)門(mén)的丙(項(xiàng)目經(jīng)理)去協(xié)調(diào)這些事情。這樣凳子腿可以在這個(gè)基礎(chǔ)上自由地涂些花紋,加個(gè)皮套,做些鏤空等等。
改進(jìn)后的瀑布模型
這個(gè)模型已經(jīng)具備了高內(nèi)聚低耦合的思想。但還是有個(gè)問(wèn)題,客戶(hù)或領(lǐng)導(dǎo)通常想看到一些進(jìn)展,也許一輛車(chē)從設(shè)計(jì)到出廠(chǎng)需要兩年,但每幾個(gè)月大家可以看到一些實(shí)實(shí)在在的東西。
以上面做凳子為例:我們是可以看到凳子腿和凳子面的,也可以想象它們連接起來(lái)的樣子。而軟件不一樣,只要各個(gè)模塊還沒(méi)有效的連接起來(lái),那基本上啥都沒(méi)有,特別是對(duì)于大多數(shù)沒(méi)有計(jì)算機(jī)知識(shí)的人,基本上是一個(gè)“黑盒”過(guò)程。這個(gè)模型同樣面臨著延期超預(yù)算的風(fēng)險(xiǎn),同時(shí)做出來(lái)的也不一定是客戶(hù)想要的。
隨著互聯(lián)網(wǎng)的發(fā)展,對(duì)軟件的變化需求越來(lái)越高,就產(chǎn)生了大家最熟悉的迭代模型——inception,elaboration,construction,transition,四個(gè)階段形成閉環(huán),不斷循環(huán)往復(fù),其核心理念是軟件是增量開(kāi)發(fā)的,每次迭代都能看到些進(jìn)展。敏捷開(kāi)發(fā)就是在這個(gè)生命周期模型下演變而來(lái)。
迭代模型
螺旋模型
接著,就有了螺旋模型,螺旋模型并不是推翻了瀑布和RUP,是一種改進(jìn)。從某種角度來(lái)說(shuō),螺旋也是遵循瀑布模型的——每一次螺旋迭代都要有清晰的目標(biāo),明確的需求,規(guī)劃實(shí)現(xiàn),交付條件等,這個(gè)循環(huán)也是迭代模型的迭代周期演變。
比如說(shuō)要做一輛汽車(chē),我們可以先做一個(gè)自行車(chē),再逐漸地在自行車(chē)上加個(gè)鈴鐺,加上發(fā)動(dòng)機(jī),變成4個(gè)輪子,加個(gè)篷,車(chē)把變成方向盤(pán)……在各方面持續(xù)地螺旋迭代下去,最終會(huì)出來(lái)一個(gè)跟汽車(chē)差不多的東西。
這個(gè)例子有一些原型法的味道,螺旋模型往往是較大較復(fù)雜的系統(tǒng)使用,目的是減小風(fēng)險(xiǎn),每一次投入能看到一些東西的產(chǎn)出,希望把整個(gè)過(guò)程“白盒化”。
螺旋模型
總結(jié)
以上是關(guān)于軟件工程的三個(gè)主要生命周期模型,逐漸地又出現(xiàn)了極限編程、原型開(kāi)發(fā)、敏捷開(kāi)發(fā)等模型。
嚴(yán)格來(lái)講,瀑布模型、迭代模型是生命周期層面的模型(當(dāng)然,通常也包含了一系列開(kāi)發(fā)層面的工具集),敏捷開(kāi)發(fā)是基于迭代模型發(fā)展起來(lái)的一整套軟件開(kāi)發(fā)指導(dǎo)原則。個(gè)人觀(guān)點(diǎn)是在實(shí)際操作中應(yīng)重視指導(dǎo)原則,弱化方法論。
迭代模型在學(xué)術(shù)上很早就有人提出,敏捷開(kāi)發(fā)的作者之所以能從不同的視角去看待軟件開(kāi)發(fā),并有獨(dú)特的思維和管理方法,這跟他的個(gè)人經(jīng)歷有很大關(guān)系,因?yàn)樗皇亲鲇?jì)算機(jī)出身,為了理解他的思想,我特意購(gòu)買(mǎi)了《敏捷革命》的英文原版《Scrum,The Art of Doing Twice the work in Half the Time》來(lái)閱讀,下面部分分享其核心觀(guān)點(diǎn)。
第二部分
我們可以看看《Scrum》的作者杰夫·薩瑟蘭的經(jīng)歷,他之所以能以全新的視角來(lái)認(rèn)識(shí)和理解軟件工程這件事情,很重要的原因在于他不是做這個(gè)行業(yè)出身。
作者的經(jīng)歷
杰夫·薩瑟蘭畢業(yè)于著名的西點(diǎn)軍校,他以戰(zhàn)斗機(jī)飛行員的身份去參加越南戰(zhàn)爭(zhēng),在他的隊(duì)伍里50%的飛行員會(huì)被擊落,一些會(huì)被營(yíng)救,一些再也回不來(lái)。在這個(gè)環(huán)境里他構(gòu)建了自己的行動(dòng)模型——即OODA(Observe,Orient,Decide,Act)執(zhí)行任務(wù)的每時(shí)每刻都在重復(fù)著這個(gè)循環(huán),猶豫就會(huì)死。這個(gè)行為模式在他的著作里能感受到已經(jīng)深入骨髓。
參加完越南戰(zhàn)爭(zhēng)后,他去斯坦福進(jìn)修了統(tǒng)計(jì)學(xué)碩士學(xué)位。后來(lái)邊在空軍學(xué)院做數(shù)學(xué)教授,邊讀了一個(gè)生物統(tǒng)計(jì)學(xué)博士,研究細(xì)胞、癌癥相關(guān)的一些東西,學(xué)習(xí)了系統(tǒng)論方面的東西。
在研究細(xì)胞的時(shí)候,他會(huì)不斷考慮一個(gè)問(wèn)題:whether the new state is better than the old one——現(xiàn)在這個(gè)狀態(tài)是不是比上一個(gè)好。《敏捷革命》原文中多次提到state這個(gè)詞,這也是作者非常重要的一種思考方式。
其離開(kāi)大學(xué)的第一份工作是做美國(guó)的ATM,這個(gè)時(shí)候他把自己在戰(zhàn)爭(zhēng)和研究細(xì)胞中的方法應(yīng)用于IT領(lǐng)域,后通過(guò)大量實(shí)踐(其中有為FBI構(gòu)建犯罪嫌疑人數(shù)據(jù)庫(kù),著作中的重要案例)逐步總結(jié)發(fā)展出了敏捷模型理論。
另外,Scrum不是作者的首創(chuàng),作者是根據(jù)日本兩個(gè)教授的理論發(fā)展總結(jié)而來(lái)。在學(xué)術(shù)界,日本的兩個(gè)教授質(zhì)疑瀑布,他們認(rèn)為:最好的團(tuán)隊(duì)?wèi)?yīng)該像打橄欖球一樣,球在隊(duì)伍中間穿梭,隊(duì)伍整體快速向目標(biāo)移動(dòng)(這才是Scrum想要表達(dá)的意思),日本的大企業(yè)最開(kāi)始用這種指導(dǎo)思想(細(xì)算一下正是日本IT大發(fā)展的時(shí)代)。
理論早就有了,但很少有美國(guó)人這樣去實(shí)踐,作者為了理解日本人的Scrum思想,練習(xí)了多年合氣道,并用合氣道來(lái)類(lèi)比Scrum,并再次用到了“state”思維方式來(lái)解釋。
說(shuō)到Scrum,我們來(lái)聊聊cross-functional。
橄欖球大家可能不熟,我們來(lái)聊聊籃球:
球隊(duì)里最吃香的是哪種人,當(dāng)然是那種什么位置都能打且都打得好的,俗稱(chēng)萬(wàn)金油。勒布朗·詹姆斯號(hào)稱(chēng)可以從1號(hào)位打到5號(hào)位,這種人可以體會(huì)到在各個(gè)位置的人的“不容易”,從而更有利于團(tuán)隊(duì)發(fā)展。奧尼爾給人籃下巨無(wú)霸的印象,但其實(shí)他有靈活的運(yùn)球技巧和出色的娛樂(lè)表演天賦,這些綜合到一起才成為球迷心中大鯊魚(yú)的人設(shè)。
NBA里那些最受人崇拜的頂級(jí)后衛(wèi),基本都會(huì)多種絕學(xué),喬丹科比韋德等人,控球、得分、突破、搶板、分球等各項(xiàng)技能均能登堂入室,有些方面甚至前無(wú)古人。有一項(xiàng)技能特別突出基本就可以獨(dú)步武林,但想成為頂級(jí)選手,一定是cross-functional的。
而作為球隊(duì)老板,希望在有限的資源下,盡可能多地把這種選手招致麾下,才有可能對(duì)拉里·奧布萊恩杯發(fā)起沖擊。勇士的“死亡五小”更是將這種理念發(fā)揮到了極致,場(chǎng)上隊(duì)員幾乎都能快攻、投籃和搶板。
回頭來(lái)看,軟件開(kāi)發(fā)也是,cross-functional是對(duì)團(tuán)隊(duì)人員素質(zhì)要求的提高,正所謂不會(huì)寫(xiě)代碼的產(chǎn)品不是好美術(shù)。軟件開(kāi)發(fā)也是個(gè)跨兵種共同協(xié)作的同時(shí)不斷面臨變化的事情,從這個(gè)角度來(lái)看,跟打籃球和橄欖球是相同的,還記得NBA賽場(chǎng)上暫停時(shí)大家是怎么解決問(wèn)題的么?
結(jié)合上面說(shuō)的場(chǎng)景“球在隊(duì)伍中間穿梭,隊(duì)伍整體快速向目標(biāo)移動(dòng)”,這是Scrum中非常重要的理念。
敏捷作者的一些核心觀(guān)點(diǎn)(為保原汁原味,摘抄部分原文):
傳統(tǒng)的瀑布模型其實(shí)是由一大堆圖表構(gòu)成,作者表達(dá)了對(duì)圖表的一些觀(guān)點(diǎn):
“Planning is useful.Blindly following Plans is stupid.”——計(jì)劃是有用的,但盲目的按計(jì)劃走是愚蠢的。這跟作者的從軍經(jīng)歷有關(guān),其執(zhí)行任務(wù)的時(shí)候都是隨機(jī)應(yīng)變,也應(yīng)了中國(guó)的那句老話(huà)“計(jì)劃沒(méi)有變化快”。
“Every project involves discovery of problems and bursts of inspiration,scrum embraces ?uncertainty and creativity.”——任何一個(gè)項(xiàng)目都包含了未發(fā)現(xiàn)的問(wèn)題以及隨著項(xiàng)目進(jìn)行的靈感爆發(fā),圖表會(huì)限制這些,Scrum“擁抱”這些不確定性和創(chuàng)造性。
“Stop doing what you’re doing,review what you’ve done.”——放下手中的事情,想一想我們?cè)诟缮丁?/p>
作者對(duì)“敏捷”的一些觀(guān)點(diǎn):
MVP:“Minimum viable products to get immediate feed back from consumers,rather waiting until a project is finished.”——最小化可行產(chǎn)品Minimum viable products,也簡(jiǎn)稱(chēng)MVP(搜索這個(gè)短語(yǔ)會(huì)有大量方法論)。用最小化的可行產(chǎn)品來(lái)從用戶(hù)那里快速獲得回饋,而不是一直等項(xiàng)目完成,就是我們通常說(shuō)的“小步快跑”。
InspectandAdapt cycle:上面說(shuō)的OODA行動(dòng)模型的抽象,“觀(guān)察—適應(yīng)”,這兩個(gè)過(guò)程不斷循環(huán)。
這里面作者提到了一個(gè)常用的方法5W2H,在每一個(gè)階段(state)都問(wèn)自己:
What:我們要做的是什么,有什么意義,現(xiàn)在是什么狀態(tài);
Why:我們?yōu)槭裁匆鲞@個(gè),可不可不做,有替代方案么;
When:什么時(shí)候做,deadline是什么;
Where:在哪做,哪里要用;
Who:誰(shuí)來(lái)做,誰(shuí)對(duì)此負(fù)責(zé);
How:怎么來(lái)做,如何配合;
Howmuch:多少、程度,多大開(kāi)銷(xiāo),做到什么程度;
敏捷革命可以應(yīng)用在各行各業(yè),作者已經(jīng)在汽車(chē)制造、開(kāi)洗衣店、學(xué)生培訓(xùn)、制造宇宙飛創(chuàng)、婚禮策劃等領(lǐng)域展開(kāi)實(shí)踐。所以說(shuō),Scrum模型不只是一套軟件開(kāi)發(fā)工具集,是具有普世性的價(jià)值觀(guān):
“Agile Manifesto,It declared the following values:people over process;products that actually work over documenting what that product is suposed to do;collaborating with customers over negotiating with them;and responding to change over following a plan,Scrum is the framework I built to put those values into practice.There is no methodology.”
這就是敏捷宣言的所有原文,后來(lái)被各種媒體放大和解讀,其實(shí)它非常簡(jiǎn)潔——敏捷宣言,它強(qiáng)調(diào)了以下價(jià)值觀(guān):
- 人重于過(guò)程;
- 產(chǎn)品真正好用重于文檔里的設(shè)計(jì);
- 跟用戶(hù)合作重于跟他們談判;
- 對(duì)變化做回應(yīng)重于按計(jì)劃去做;
- 我建立Scrum模型就是為了把以上價(jià)值觀(guān)揉進(jìn)一套工具集以方便更好地實(shí)踐,敏捷模型沒(méi)有方法論(沒(méi)有方法論,沒(méi)有方法論,沒(méi)有方法論,這是作者的原話(huà)啊,啪啪啪打臉有木有)。
總結(jié)
Scrum原著以案例來(lái)表達(dá)了他對(duì)圖表、文檔、對(duì)計(jì)劃、對(duì)團(tuán)隊(duì)、對(duì)過(guò)程管理的一些觀(guān)點(diǎn),而Scrum正是這一系列價(jià)值觀(guān)的合集,這才是Scrum的精髓所在。
為了快速實(shí)踐和方便理解這些價(jià)值觀(guān),作者提供了一些方法,比如:每日立會(huì)、sprint、backlog等。
具體方法不贅述了,網(wǎng)上有很多介紹。這些方法都是為了落實(shí)上面的觀(guān)點(diǎn):我們處在什么狀態(tài),我們有什么,如何做下個(gè)狀態(tài)會(huì)比現(xiàn)在的好……
相比于拿過(guò)來(lái)方法直接使用,理解好上面的觀(guān)點(diǎn)再根據(jù)實(shí)際情況選擇方法是更有效的思路。
作者:齊齊獸,公眾號(hào):齊齊獸,從技術(shù)轉(zhuǎn)型到產(chǎn)品經(jīng)理,北郵MBA,千萬(wàn)DAU平臺(tái)型產(chǎn)品負(fù)責(zé)人,擅長(zhǎng)社交和棋牌。
本文由@齊齊獸 原創(chuàng)發(fā)布與人人都是產(chǎn)品經(jīng)理,未經(jīng)允許,禁止轉(zhuǎn)載。
題圖來(lái)自Unsplash, 基于CC0協(xié)議
寫(xiě)的不錯(cuò),對(duì)scrum核心點(diǎn)總結(jié)的很到位,也便于理解。
對(duì)于軟件開(kāi)發(fā),敏捷開(kāi)發(fā)是個(gè)花巧的技術(shù),華而不實(shí)。適用于技術(shù)研發(fā)要求不高的項(xiàng)目,對(duì)于技術(shù)研發(fā)很密集的項(xiàng)目,比如:操作系統(tǒng),不適用,很容易陷入不斷迭代的過(guò)程里。敏捷開(kāi)發(fā)如同武功里的招式,招式學(xué)得再好,遇到真正的高手必?cái)o(wú)疑。
1、瀑布模型現(xiàn)在并沒(méi)有被完全淘汰,大型嚴(yán)謹(jǐn)?shù)捻?xiàng)目依然使用。
2、各種開(kāi)發(fā)模式只是工具,人可以根據(jù)具體情況選擇工具,就像轎車(chē)和卡車(chē)。
3、當(dāng)聊轎車(chē)的時(shí)候,說(shuō)其不能拉貨。你是認(rèn)為大家都不會(huì)開(kāi)卡車(chē),還是為了證明自己會(huì)開(kāi)卡車(chē)。
我是針對(duì)現(xiàn)在的浮夸之風(fēng)說(shuō)的,其實(shí)你說(shuō)的跟我說(shuō)的一樣,方法都有個(gè)適用范圍。不過(guò),我說(shuō)的更進(jìn)一步,阿里的yunos搞了有10年了吧,到最后還不是山寨android。那些開(kāi)發(fā)人員還不是個(gè)個(gè)自詡高手。我也見(jiàn)過(guò)有個(gè)自詡專(zhuān)家的,論文發(fā)表了好多篇,又到騰訊講學(xué),我看他研究什么,無(wú)非就是敏捷開(kāi)發(fā)、結(jié)對(duì)編程和團(tuán)隊(duì)建設(shè)與管理,這些都是招式。當(dāng)你要搞想操作系統(tǒng)這類(lèi)技術(shù)非常密集的項(xiàng)目時(shí),就不得不要直面軟件工程的原理,原理理解不深不透徹不能融會(huì)貫通是不行的;因?yàn)槌杀臼堑谝恢萍s因素,稍有不慎它會(huì)大到連阿里都承受不起。所謂假傳萬(wàn)卷書(shū),真?zhèn)饕痪湓?huà),你以為真功夫這么容易就能學(xué)到,絕大多數(shù)開(kāi)發(fā)人員都沒(méi)有。
yunos的研發(fā)過(guò)程必定曾發(fā)生某個(gè)版本開(kāi)發(fā)不下去了必須推倒重來(lái)的狀況。開(kāi)發(fā)瀏覽器內(nèi)核、操作系統(tǒng)這類(lèi)難度很高的項(xiàng)目,你就會(huì)發(fā)現(xiàn),什么瀑布、敏捷開(kāi)發(fā)、結(jié)對(duì)編程都行不通??孔V的方式只有兩種:要么靠開(kāi)源和社區(qū),依托互聯(lián)網(wǎng)進(jìn)行群策群力,要么由1、2個(gè)真正的高手帶領(lǐng)團(tuán)隊(duì)。