敏捷應(yīng)用生命周期管理
Agile ALM使用敏捷的價(jià)值觀和策略來(lái)充實(shí)了ALM,ALM的敏捷做法提升了產(chǎn)品的質(zhì)量,縮短了上市時(shí)間,且有利于開(kāi)發(fā)者以一種更加愉悅的心情來(lái)工作。我對(duì)Agile ALM的定義可歸結(jié)為,一些靈活的、對(duì)改變持開(kāi)發(fā)態(tài)度的、高質(zhì)量的過(guò)程和工具鏈。這是其中的一
敏捷應(yīng)用生命周期管理(Agile Application Lifecycle Management,Agile ALM)正得到越來(lái)越大的推動(dòng),記得我在撰寫(xiě)“Agile ALM”一書(shū)的書(shū)稿時(shí),幾乎沒(méi)有人會(huì)想到使用敏捷來(lái)豐富ALM的做法,或是找出一種有實(shí)效的ALM做法,越來(lái)越多的工具廠商發(fā)現(xiàn),他們的工具在貼上敏捷工具甚至是敏捷ALM工具的標(biāo)簽之后好賣(mài)多了。
但,敏捷ALM(Agile ALM)指的是什么呢?我的看法是,ALM把一些技術(shù)性的和功能性的元素綜合在一起,為常見(jiàn)的項(xiàng)目活動(dòng)和階段提供了一種全面的做法,解決了構(gòu)建、配置、部署、發(fā)布、測(cè)試、質(zhì)量、集成和需求管理等方面的問(wèn)題,參見(jiàn)圖1。憑借其跨學(xué)科的做法,Agile ALM整合了項(xiàng)目的角色、項(xiàng)目的階段和各種工件。Agile ALM使用敏捷的價(jià)值觀和策略來(lái)充實(shí)了ALM,ALM的敏捷做法提升了產(chǎn)品的質(zhì)量,縮短了上市時(shí)間,且有利于開(kāi)發(fā)者以一種更加愉悅的心情來(lái)工作。我對(duì)Agile ALM的定義可歸結(jié)為,一些靈活的、對(duì)改變持開(kāi)發(fā)態(tài)度的、高質(zhì)量的過(guò)程和工具鏈。這是其中的一種ALM可借助來(lái)提供敏捷結(jié)構(gòu)的方式。
圖1. ALM處理不同學(xué)科和不同開(kāi)發(fā)階段的問(wèn)題
Agile ALM的一些基礎(chǔ)方面并非是全新的,您應(yīng)該要尊重過(guò)去幾十年來(lái)的所有不同努力,認(rèn)真研究所有結(jié)果,從中找出一個(gè)目前最適用的解決方案。在我看來(lái),ALM是從軟件配置管理(software configuration management,SCM)演變過(guò)來(lái)的,其相應(yīng)地也要扎根于基本版本控制。在選擇最適于給定任務(wù)的工具之前,您應(yīng)該先定義自己的過(guò)程和需求。
個(gè)體和交互勝過(guò)過(guò)程和工具
最重要的是,敏捷ALM是一門(mén)學(xué)科和一種精神態(tài)度。使用敏捷ALM首先應(yīng)從價(jià)值觀和人,以及其背后的概念入手,敏捷ALM工具就是催生出敏捷過(guò)程的ALM工具。
Agile ALM工具必須能夠增加系統(tǒng)的價(jià)值,促進(jìn)相關(guān)利益者的合作。在我看來(lái),Agile ALM工具鏈必須要實(shí)現(xiàn) Agile ALM的一些構(gòu)建塊,比如說(shuō)持續(xù)集成(包括了持續(xù)檢查和持續(xù)部署)、功能/技術(shù)發(fā)布、利益相關(guān)者的關(guān)注(和協(xié)作開(kāi)發(fā))以及基于任務(wù)的開(kāi)發(fā)等。許多項(xiàng)目非常適用于某些個(gè)單方面有著最佳優(yōu)勢(shì)的工具的一個(gè)編排,把輕量級(jí)的、可配置的工具整合成靈活的工具鏈,這種做法最終會(huì)得到恰好提供了解決給定任務(wù)所需功能的一個(gè)工具混搭。
Agile ALM工具應(yīng)該具備一種開(kāi)放式的架構(gòu),其支持進(jìn)一步加入一些工具或是功能。對(duì)輕量級(jí)工具鏈的依托可大大提高靈活性,因?yàn)槟梢暂p易地替換掉整體基礎(chǔ)設(shè)施的一些小單元,但又不會(huì)給基礎(chǔ)設(shè)施的其他方面帶來(lái)問(wèn)題。現(xiàn)在我們來(lái)討論敏捷ALM的一些重要的構(gòu)建塊,我們從基于任務(wù)的開(kāi)發(fā)開(kāi)始。
基于任務(wù)的開(kāi)發(fā)
在使用基于任務(wù)的做法時(shí),任務(wù)是交互的單元和工作的基礎(chǔ)?;谌蝿?wù)的開(kāi)發(fā)是這樣的一種技術(shù),其以一種可跟蹤的方式來(lái)把工作項(xiàng)目鏈接到一組特定的以完成工作項(xiàng)目為目標(biāo)的變更上,一個(gè)例子用例可能會(huì)是這樣:您正在努力完成一項(xiàng)任務(wù),該項(xiàng)任務(wù)列在您的簽派系統(tǒng)(ticket system)中,其有著唯一的標(biāo)示符AGILEALM-9。您的IDE(例如安裝了Mylyn插件的Eclipse)與簽派系統(tǒng)(比如說(shuō)JIRA)集成在一起,CI(Continuous Integration)服務(wù)器Jenkins與JIRA集成在一起,使用版本控制系統(tǒng)(VCS)和組件儲(chǔ)存庫(kù)(比如說(shuō)Artifactory)來(lái)透明化工作的進(jìn)展,以及工件和工作項(xiàng)目之間的依賴(lài),您可以驅(qū)動(dòng)階段構(gòu)建來(lái)把發(fā)布版本部署到一些更高階段的環(huán)境中,而又無(wú)需重構(gòu)建發(fā)布版本(“一次構(gòu)建,隨處運(yùn)行”)。圖2展示了Jenkins與其他工具的整合方式,Jenkins的一個(gè)構(gòu)建結(jié)果頁(yè)面的放大顯示,該頁(yè)面很容易導(dǎo)航至VCS(查看底層的變更),導(dǎo)航至簽派系統(tǒng)(處理任務(wù)方面的事務(wù)),以及導(dǎo)航至組件儲(chǔ)存庫(kù)(處理二進(jìn)制文件方面的事務(wù))。
圖2. 整合了VCS、簽派系統(tǒng)和組件儲(chǔ)存庫(kù)的CI服務(wù)器Jenkins
協(xié)作開(kāi)發(fā)
軟件開(kāi)發(fā)就是實(shí)現(xiàn)需求,需求是軟件發(fā)布的核心單元和驅(qū)動(dòng)器。單元測(cè)試(驗(yàn)證正確的事物是以正確方式開(kāi)發(fā)出來(lái)的)和驗(yàn)收測(cè)試(驗(yàn)證正確的事物已被開(kāi)發(fā)出來(lái))一類(lèi)的方法是早就存在了的。但在以前,這些方法往往是以一種孤立或是單純的方式加以管理。而實(shí)際上,一種全面、務(wù)實(shí)的解決方案才是更加應(yīng)該考慮的,這種解決方案把重點(diǎn)投放在需求本身之上,時(shí)刻為所有利益相關(guān)者打算。您可以使用一些專(zhuān)用的、輕量級(jí)的工具來(lái)編寫(xiě)驗(yàn)收代碼,比如說(shuō)Fit這個(gè)工具;或者使用一些特定的語(yǔ)言。Scala和Groovy這兩種語(yǔ)言都提供了一些很有意思的功能,這些功能設(shè)置了一個(gè)多語(yǔ)言生態(tài)系統(tǒng),通過(guò)提供涉及特殊用途語(yǔ)言的解決方案來(lái)利用現(xiàn)有的平臺(tái)。您可以使用Scala和Groovy編寫(xiě)測(cè)試,這有助于跨越一些壁壘:
1. 項(xiàng)目階段和項(xiàng)目活動(dòng)之間的壁壘(因?yàn)榫幋a和測(cè)試之間的合作更為密切)
2. 各種類(lèi)型的工件之間的壁壘(因?yàn)榇a和執(zhí)行規(guī)范都是在同一個(gè)統(tǒng)一的基礎(chǔ)設(shè)施上編寫(xiě)的)
3. 項(xiàng)目角色之間的壁壘(因?yàn)闇y(cè)試是以協(xié)作方式來(lái)編寫(xiě)的,其機(jī)制使用的術(shù)語(yǔ)與問(wèn)題域的相近)
4. 工具之間的壁壘(因?yàn)槭褂昧讼嗤墓ぞ邅?lái)進(jìn)行編程和測(cè)試)
下面這個(gè)簡(jiǎn)單的例子展示了如何使用Scala和specs2庫(kù)來(lái)編寫(xiě)驗(yàn)收測(cè)試,以便你對(duì)這一做法有一個(gè)初步印象。
- package alm
- import org.specs2._
- class AccSpec extends Specification { def is =
- "This is a specification to check the 'Agile ALM' string"
- "The 'Agile ALM' string should"
- "The 'Agile ALM' string should"
- "end with 'ALM'"
- def e1 = "Agile" must startWith("Agile")
- def e2 = "Agile ALM" must endWith("ALM")
- }
代碼定義的是方法列表的一些規(guī)格段(specification fragment),內(nèi)容是簡(jiǎn)單的文本、例子或是格式段(p的作用是增加一個(gè)空行并開(kāi)始一個(gè)新代碼塊),段由^字符來(lái)隔開(kāi)和鏈接,欲了解更多關(guān)于specs2的內(nèi)容,請(qǐng)參閱specs2.org。
#p#
發(fā)布管理
發(fā)布管理包括了根據(jù)定義的過(guò)程來(lái)生成軟件工件并發(fā)布這些工件,發(fā)布管理可細(xì)分成一個(gè)功能性的部分和一個(gè)技術(shù)性的部分。若要成功交付軟件,這兩個(gè)組成部分都要受到重視,而且應(yīng)該彼此整合在一起。自動(dòng)化和持續(xù)集成是軟件發(fā)布和交付過(guò)程的至關(guān)重要的兩個(gè)方面。
功能發(fā)布管理
功能發(fā)布管理包括了高質(zhì)量地分揀客戶(hù)的需求、指定發(fā)布的需求和向客戶(hù)交付功能。敏捷實(shí)踐往往會(huì)被用來(lái)支持這一過(guò)程,許多項(xiàng)目通過(guò)使用管理模板Scrum達(dá)成了很好的效果。雖然只是定了一小組規(guī)則,但Scrum促進(jìn)了原則的遵守并可視化了(軟件和過(guò)程中的)缺陷。可惜Scrum過(guò)于抽象,只限于“紙上談兵”。您必須要實(shí)現(xiàn)Scrum,再把它用到軟件工程中。例如,在某個(gè)微觀層面上,在某個(gè)Scrum版本內(nèi)部,一些實(shí)現(xiàn)做法可能會(huì)包括了一些特殊開(kāi)發(fā)階段之間的區(qū)別:在發(fā)布階段,您可能會(huì)考慮使用一個(gè)凍結(jié)區(qū)來(lái)關(guān)閉開(kāi)發(fā)階段,凍結(jié)區(qū)只允許開(kāi)發(fā)者進(jìn)行錯(cuò)誤修正方面的工作,不考慮新功能的實(shí)現(xiàn)。另一種有效做法是使用代碼凍結(jié)時(shí)間間隔來(lái)完成和發(fā)行最終的版本。
技術(shù)發(fā)布管理
技術(shù)發(fā)布包括了構(gòu)建軟件和向用戶(hù)提供最終的產(chǎn)品,構(gòu)建管理(包括了編譯腳本、打包和分發(fā)組件)是Agile ALM必不可少的組成部分。技術(shù)發(fā)布管理描述了這樣的一些活動(dòng):識(shí)別配置項(xiàng)、記錄和審計(jì)需求和配置項(xiàng)的變更,以及整合和交付實(shí)現(xiàn)。在軟件工程中,變更會(huì)經(jīng)常發(fā)生而非偶然出現(xiàn)。因?yàn)樾枨髸?huì)發(fā)生變化,故保持需求及其實(shí)現(xiàn)之間的同步是非常重要的。功能和技術(shù)發(fā)布之間可能會(huì)存在的差距應(yīng)該被彌合,VCS鉤子一類(lèi)的策略有助于嫁接起發(fā)布管理的這兩個(gè)組成部分。
持續(xù)集成(包括持續(xù)檢查和持續(xù)部署)
自動(dòng)化手工步驟意指以一種客觀的并且是可再現(xiàn)的方式來(lái)交付結(jié)果。
自動(dòng)化最容易出錯(cuò)、最經(jīng)常重復(fù)的和最耗時(shí)的活動(dòng)是絕對(duì)必要的,持續(xù)集成(CI,Continuous Integration)就是構(gòu)建、測(cè)試和發(fā)布過(guò)程的自動(dòng)化,其目標(biāo)是整合同事的活動(dòng)和其他人產(chǎn)出的工作項(xiàng)目。這可催生出一個(gè)構(gòu)建的生態(tài)環(huán)境,在這一環(huán)境中,新代碼的提交會(huì)直接觸發(fā)一個(gè)包括了編譯、技術(shù)測(cè)試、審計(jì)、打包、功能測(cè)試和部署在內(nèi)的持續(xù)構(gòu)建。所有不同的工件類(lèi)型、平臺(tái)和語(yǔ)言,比如說(shuō)Java(Groovy、Scala……)、.NET、PHP和Cobol等,都應(yīng)該使用一個(gè)統(tǒng)一的基礎(chǔ)設(shè)施來(lái)進(jìn)行整合,參見(jiàn)圖3。若各種語(yǔ)言/平臺(tái)沒(méi)有各自相應(yīng)的本地化構(gòu)建系統(tǒng)存在,則可使用CI場(chǎng)中非本地化的構(gòu)建技術(shù)來(lái)這些工件包含進(jìn)來(lái)。
圖3. 一個(gè)在統(tǒng)一基礎(chǔ)設(shè)施上整合了不同工件類(lèi)型的完善的CI生態(tài)系統(tǒng)
在一個(gè)持續(xù)集成過(guò)程中,構(gòu)建報(bào)告和通知方法是要有的,信息要被共享和匯總。匯總信息意味著集成工具鏈橫跨了整個(gè)異構(gòu)的生態(tài)系統(tǒng),這使得利益相關(guān)者可以聚焦“放大”需要了解的地方,獲得更多的信息,從這些信息中得出一些結(jié)論。
這方面的一些例子是:給定一次具體的構(gòu)建,您可以追溯出VCS中的底層變化,或者:收集組件儲(chǔ)存庫(kù)中所有語(yǔ)義上屬于同一類(lèi)的二進(jìn)制產(chǎn)出,目的是把它們作為一個(gè)集合來(lái)在上面執(zhí)行某些操作。
結(jié)束語(yǔ)
Agile ALM跨越了軟件工程中的多個(gè)學(xué)科,Agile ALM關(guān)乎人和策略,以及使用輕量級(jí)的工具鏈來(lái)實(shí)現(xiàn)這些策略。Agile ALM有助有提供敏捷結(jié)構(gòu),有助于以一種堅(jiān)定、務(wù)實(shí)的方式來(lái)逐步實(shí)現(xiàn)ALM。使用一種敏捷的ALM做法,您將贏來(lái)更快的勝利和更好的結(jié)果??梢哉劶暗膬?nèi)容還有很多,但我希望本文能夠給您建立起這樣一個(gè)初始印象,即什么是Agile ALM,以及哪些是我所著的“Agile ALM”一書(shū)會(huì)更加深入探討的內(nèi)容。
原文鏈接:http://www.linuxeden.com/html/develop/20120620/126049.html
【編輯推薦】