提到敏捷這個(gè)詞,相信大多數(shù)人已經(jīng)不再陌生。
最初我們所說的敏捷即為敏捷開發(fā),盡管在行業(yè)競(jìng)爭(zhēng)日趨激烈的今天,敏捷一詞已不再局限于軟件開發(fā)行業(yè)。
敏捷開發(fā),是一種從1990年代開始逐漸引起廣泛關(guān)注的一些新型軟件開發(fā)方法,是一種應(yīng)對(duì)快速變化的需求的一種軟件開發(fā)能力。它們的具體名稱、理念、過程、術(shù)語(yǔ)都不盡相同,相對(duì)于“非敏捷”,更強(qiáng)調(diào)程序員團(tuán)隊(duì)與業(yè)務(wù)專家之間的緊密協(xié)作、面對(duì)面的溝通(認(rèn)為比書面的文檔更有效)、頻繁交付新的軟件版本、緊湊而自我組織型的團(tuán)隊(duì)、能夠很好地適應(yīng)需求變化的代碼編寫和團(tuán)隊(duì)組織方法,也更注重軟件開發(fā)過程中人的作用。
“敏捷”(Agile或agile)一詞由“敏捷軟件開發(fā)宣言”中開始推廣,“敏捷軟件開發(fā)宣言”定義了相關(guān)的價(jià)值和原則。
對(duì)于實(shí)踐過敏捷開發(fā)的開發(fā)人員或團(tuán)隊(duì)來說,我想大多數(shù)人是認(rèn)同的,當(dāng)然不同人對(duì)敏捷開發(fā)的理解自然不盡相同,這里僅針對(duì)敏捷開發(fā)宣言談?wù)勛约旱睦斫狻?/p>

敏捷宣言于2001年由十七名軟件開發(fā)人員在猶他州的雪鳥度假村討論共同起草。
這里將分別就每一條談?wù)勛约旱谋∫姟?/p>
個(gè)體和互動(dòng) 高于 流程和工具
先從右項(xiàng)說起
在整個(gè)項(xiàng)目的歷程中可能需要一些工具來支持我們更好地完成工作,例如在項(xiàng)目前期可能需要原型工具,開發(fā)階段我們會(huì)用 Jira 或 Trello 等來做卡墻,使用版本管理工具來管理我們的代碼,QA 需要依賴一些工具進(jìn)行測(cè)試,Dev 們同樣需要 IDE 支持日常開發(fā)工作,這一切都是工具的支持。
同樣我們可能也會(huì)有一些工作上的流程,例如一張 story 卡從“Ready for Dev” 到“Done”都需要經(jīng)歷些什么,我們?cè)诤涂蛻暨M(jìn)行日常交流溝通的時(shí)候也可能需要遵循一定流程。
這些工具和流程合理運(yùn)用的話固然能夠幫助我們更好地完成交付,但是如果沒有運(yùn)用好的話很有可能會(huì)反向促進(jìn)。
合適的工具能很好的幫助開發(fā),但當(dāng)在開發(fā)人員面前出現(xiàn)大量龐大笨重甚至不好用的工具和開發(fā)環(huán)境時(shí),就會(huì)像缺少工具一樣,這樣是違背了我們的初衷的?;蛘哒f在開發(fā)過程中,出現(xiàn)夸大了工具的作用,當(dāng)開發(fā)工具對(duì)開發(fā)起起決定性的影響時(shí),可能就需要反思是不是一開始的做法是不是有問題呢?
流程和工具是定的,但人卻是活的,強(qiáng)大的方法和工具如果離開了人員和團(tuán)隊(duì)的支持,也終將只是擺設(shè)。
敏捷開發(fā)中鼓勵(lì)團(tuán)隊(duì)成員更多地交流和互動(dòng),在敏捷項(xiàng)目中我們會(huì)擁有各種不同職能的成員,每個(gè)成員都需要關(guān)注如何實(shí)現(xiàn)高價(jià)值的交付,定時(shí)和團(tuán)隊(duì)的其他成員一起查看團(tuán)隊(duì)的整體進(jìn)度,計(jì)劃下一步工作,并且對(duì)于遇到的問題討論解決方案。同時(shí)團(tuán)隊(duì)的及時(shí)交流互動(dòng)能夠及時(shí)拉通項(xiàng)目成員間的信息,避免在某些事情上存在歧義,團(tuán)隊(duì)的及時(shí)有效溝通能夠也幫助提高效率。
在日常工作中,我們可能遇到不同的“突發(fā)狀況”,例如某關(guān)鍵成員請(qǐng)假,這時(shí)日常的溝通就使得團(tuán)隊(duì)能快速找到 backup,使得項(xiàng)目上下文不至于中斷或者被 block,這些情況是既定的流程和強(qiáng)大的工具無(wú)法解決的。
工作的軟件 高于 詳盡的文檔
在傳統(tǒng)的瀑布式開發(fā)方式中,文檔作為各階段傳遞信息的載體。需求文檔中定義詳細(xì)的用例和細(xì)節(jié),原型圖中定義每個(gè)組件的形式、放置位置等,數(shù)據(jù)庫(kù)設(shè)計(jì)圖、測(cè)試用例文檔等,如果沒有文檔,開發(fā)的工作將不能順利展開。
編寫一份詳盡的文檔固然可以使我們的工作更好的開展,但這些是基于需求既定的情況,如果需求在開發(fā)過程中隨時(shí)可變,這種不確定性就會(huì)使得維護(hù)文檔變得異常艱難。但是在大多數(shù)項(xiàng)目中,除非這個(gè)項(xiàng)目已經(jīng)花了充足的時(shí)間去思考需求,否則不可能一開始就清楚所有細(xì)節(jié)。而更多的是,團(tuán)隊(duì)在開發(fā)過程中客戶才越來越清楚自己想要的是什么。對(duì)于這種情況,維護(hù)文檔的工作是很痛苦的,文檔的維護(hù)需要投入大量的時(shí)間和精力,如果考慮和代碼的同步時(shí),工作量更是急速上升。有失必有得,如果一味追求文檔必然會(huì)在代碼質(zhì)量上有所下降。
但是我們是否想過,我們提供的這些詳盡的文檔對(duì)客戶來說是否真的有價(jià)值呢?客戶需要的可能是一個(gè)可以正常運(yùn)作的軟件來實(shí)質(zhì)性地解決某些問題。對(duì)于開發(fā)團(tuán)隊(duì)來說更是如此,我想沒有人愿意話費(fèi)大量時(shí)間來編寫這些繁雜且瑣碎的文檔。通過頻繁地提供可以工作的軟件也可以使客戶看到團(tuán)隊(duì)的價(jià)值對(duì)于客戶關(guān)系的提升也有一定的促進(jìn)作用。同時(shí),對(duì)于開發(fā)團(tuán)隊(duì)來講,小步迭代也能夠在日常的工作中加深對(duì)業(yè)務(wù)的理解。
客戶合作 高于 合同談判
項(xiàng)目的開發(fā)當(dāng)然都是基于合同,在組建開發(fā)團(tuán)隊(duì)之前,項(xiàng)目經(jīng)理就會(huì)和客戶方溝通,確定一些法律條文以及交付產(chǎn)品包含的功能等。在進(jìn)行開發(fā)了之后,如果需要修改合同,則需要經(jīng)過一些列復(fù)雜的流程。所以在開發(fā)過程中,客戶可能就是簡(jiǎn)單詢問一下進(jìn)度,如果沒有大的問題就不會(huì)存在合同的修改,等到最終交付的時(shí)候如果出現(xiàn)了和最初合同談判階段不一致的功能或問題時(shí)才會(huì)通過談判進(jìn)行解決。所以說,如果僅僅依靠合同談判來進(jìn)行開發(fā)的話,開發(fā)過程中就無(wú)法及時(shí)獲得客戶的反饋從而及時(shí)修改,等到最終交付的時(shí)候才發(fā)現(xiàn)問題就會(huì)大大降低效率。
我們?cè)谡勴?xiàng)目的時(shí)候應(yīng)該是盡可能地尋求客戶合作的價(jià)值而不是一味追求合同談判。軟件開發(fā)的最終目標(biāo)是提供給客戶可工作的有價(jià)值的軟件,而只有客戶才知道自己真正想要的是什么。敏捷團(tuán)隊(duì)中提倡開發(fā)團(tuán)隊(duì)和客戶緊密協(xié)作,在每一個(gè)迭代中經(jīng)常提供反饋,盡早地和客戶溝通才能更早暴露問題,將問題的影響降到最低,不致于到最終交付的時(shí)候手忙腳亂。
響應(yīng)變化 高于 遵循計(jì)劃
當(dāng)拿到合同后,項(xiàng)目經(jīng)理就會(huì)開始組建團(tuán)隊(duì)進(jìn)行開發(fā),然后作出一系列的計(jì)劃,包括需求、測(cè)試、開發(fā)、部署等一系列詳細(xì)的步驟,開發(fā)過程中就得遵守這些步驟。
但是值得注意的是,計(jì)劃永遠(yuǎn)趕不上變化,我們無(wú)法預(yù)見在開發(fā)過程中會(huì)遇到什么變數(shù),尤其是在敏捷項(xiàng)目中,存在太多的不確定性,這個(gè)時(shí)候如果我們一味遵循最初的計(jì)劃肯定是行不通的。所以在敏捷項(xiàng)目中,我們一般不會(huì)定太長(zhǎng)的計(jì)劃,常見的是設(shè)立較短周期的迭代,在每一個(gè)迭代開始之前,我們會(huì)開迭代會(huì)議,確定本迭代需要完成的交付任務(wù)以及每一個(gè)故事卡的優(yōu)先級(jí)等。即使如此在每一迭代中也有著不確定性,例如臨時(shí)出現(xiàn)更高優(yōu)先級(jí)的卡或者當(dāng)前迭代工作量不夠時(shí)就會(huì)相應(yīng)作出調(diào)整。通過不斷的響應(yīng)變化來消除過程中的不確定性。
盡管右項(xiàng)有其價(jià)值,我們更重視左項(xiàng)的價(jià)值
這一條常常會(huì)被大家所忽略,但恰恰這條才是最重要的。
我們?cè)谔岢箜?xiàng)的時(shí)候并不是說要否定右項(xiàng),只是說在某些具體情況下左項(xiàng)更重要一些。
例如,我們說個(gè)體和互動(dòng)高于流程和工具,并不是意味著流程和工具就不重要,相反,正是有了這些才能夠更好地支持我們的工作;我們?cè)陂_發(fā)過程中仍然需要文檔的支持,在和客戶交流的時(shí)候以及一些交接工作等;為了雙方的利益我們依然需要合同談判;敏捷不是不需要計(jì)劃,相反我們可能需要更多的規(guī)劃,在規(guī)劃、執(zhí)行、調(diào)整中不斷消除或減少不確定性。
重新讀了敏捷宣言,感覺理解更深刻了一些,同時(shí)也因?yàn)橛辛艘恍?shí)踐對(duì)理解也有一定的幫助,以上僅僅總結(jié)一些個(gè)人的理解。