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