注:本文轉載自《程式設計師》
瓦沙奇山下那段著名的敏捷宣言,至今已近十年。似乎在不經意之間,敏捷已經被視為 CMM 之後又一次軟體開發領域的浪潮,不論業界報導或者坊間傳聞,都不約而同地將敏捷視為一個時代的開始,與之同存的是那些未嘗或淺嘗敏捷者的各種質疑和爭論。
當敏捷在介於自發與非自發中間演變成為一種近乎“革命”的運動,圍繞在它身邊的躁動就不曾停歇,對於細節的爭執,對於方法的固執,讓我們更多地為敏捷的未來憂心忡忡。我們擔心的是,如果敏捷只被認為是實踐和方法集合,那麼必然有一天在它某次失效或者迫於壓力無法延續的情況下,便會被開發團隊自然而然地拋棄,他們要做的也只是耐心等待下一次所謂的“革命”。
這時往往被忽略的是第一個要問的問題——為何敏捷。作為從汽車產業精益製造理念衍生出來的敏捷,到底為何產生?敏捷的萌芽和發展與精益理念的傳播過程有何共同之處?敏捷將如何發展?當敏捷風潮過後留下什麼?只有當這些問題一一被深刻解答和理解,才能讓敏捷實踐忘記敏捷,真正的敏捷基因才會被持久留存。
精益啟示
在這個充滿隱喻的軟體世界中,各種軟體開發方法的思潮都來自於其他某個成熟行業成功經驗的對映。理解敏捷的核心,應該從精益製造的靈魂開始。精益的萌芽發展變化在某種程度上契合並預測著敏捷的今生來世。
敏捷之前工業製造世界的基礎都建立在“遵循計劃”的模型上——在執行之前,需要完成的是計劃,這個被設計的計劃中規定了資源分配、詳細工序、時間線、技能要求等,被認為如果按照計劃嚴格地執行,便可達到預期的成功。那麼,當計劃在一個可預期的成功之上被設計時,理所當然遵循計劃的結果便是這個可預期的成功。
基於這個模型,在 1908~1927 年的 19 年間,福特製造了T型車的神話——在福特設計的流水線上,生產計劃被嚴格地執行,所有的產出物都達到“可預期的成功”。在這 19 年裡,福特認為“無論你需要什麼顏色的汽車,福特只有黑色”—— 拒絕任何改變,並堅持把計劃中可預期的成功作為經營成功的唯一標準。因為市場需求的單一,以及價格的低廉,計劃的成功執行與市場經營成功在某種意義上,畫上了等號。
而福特T型車的迅速衰落正是在於,當市場需求最終佔據了主動時、當企業生產和銷售的天平慢慢傾向於銷售一方時,計劃中“可預期的成功”瞬間變得次要。原因很簡單,企業的價值不以生產計劃的完成為基礎,取而代之的是銷售計劃的完成。換句話說,如果最終目標是“在一定時間線上用合理的成本生產出產品”,作為企業來說,這樣的目標不足以成為企業價值的衡量基準,而真正體現企業價值的是“在一定時間內用合理的成本生產出產品,並讓這些產品成功地被使用者使用”。
當成功地讓使用者使用產品變得越來越有風險(使用者的需求越來越趨於多樣性和變化),使得傳統制造工業的從業者無以適從——完成預測的生產計劃可以通過內部的管理手段實現,但當生產計劃無法完美契合使用者需要時,傳統生產方式的低效和浪費便暴露無遺。也許關張的不一定都是那些沒有在“在一定時間內用合理的成本生產出產品”的企業,但那些沒有“讓這些產品成功地被使用者使用”的企業一定關張。
這樣的危機感使得更擁抱變化的精益製造理論得到了迅速發展——如果那些沒有被使用者使用的產品就是不產生價值的東西,那麼更應該關注的不是生產計劃的完成,而是生產線那頭的東西是不是可以被市場買單。
精益的產生和發展完全契合著汽車消費市場的變革——越來越趨向於關注使用者多變和多元的需求。換句話說,一個消費需求變化風險越大的消費市場,必然產生一種對“降低消費需求變化風險”越依賴的生產模式,這個生產模式就是精益。
敏捷非革命
相對汽車行業近 135 年的歷史,軟體產業僅僅經歷了不到 50 年的時間。在軟體產業初端將近一半的時間裡,就像福特T型車流行的 20 世紀 20 年代,軟體並沒有足夠龐大且多元化的消費市場,世界對於軟體的應用多限於工業控制、資料分析、科學研究等領域,以及那些服務於並沒有形成足夠成熟消費市場的配套軟體。“遵循計劃”的瀑布式生產模式在很長一段時間裡成為軟體工程的準則——“在規定的時間和規定的資金投入內,完成規定軟體規格的應用”。
接下來,隨著個人電腦以及各種消費類電子和通訊產品的普及,人類對於資訊的需求上升到前所未有的高度。軟體終究是連線使用者和資訊的介面,當對於資訊的需求不僅限於大型製造商、軍方、科研人員,而突然趨向於成為普通消費者日常生活的必需品,對軟體的需求必然呈現級數增長。於是,軟體行業在過去 20 年裡的發展趨勢是“讓更多的人享受到資訊服務”,而曾經的高階專業軟體市場正在慢慢被資訊消費類軟體所擠壓。
可以這樣理解,當一個市場的消費門檻越來越低時,這個市場越有可能變成買方市場,這個市場的消費者層次就越來越豐富,這個市場可能出現的需求變化就越來越頻繁,預測這個市場需求變化的難度就越來越高。
這便可以解釋為什麼越來越多的軟體從業者,開始體會到如同汽車普及化運動對汽車行業的影響類似的困惑——單單“在規定的時間和規定的資金投入內,完成規定軟體規格的應用”已經不夠,必須在後面加上一個“並讓這些產品成功地被使用者使用”。這種市場需求帶來的內部驅動使得人們開始思考一種更加適應市場需求變化的生產模式,像大野耐一的天才創新一樣,軟體行業也開始像汽車行業一樣開始向追逐最終消費者使用價值的方向發展,敏捷方法的誕生正是基於此。
一個行業的成熟,必然經歷一個消費市場劇烈分化膨脹的階段——隨著工藝和技術的提高,以及生產成本的降低帶來了消費門檻的降低和更多多元化需求,這必然使得涉足其中企業的核心競爭力完成從“按時按量按質生產”到“按時按量按質適應市場生產”的轉變。在這個轉變的背景之下,必然出現一種生產模式的轉變,保證“按時按量按質生產”之外還能保證“這些產品成功地被使用者使用”。
汽車消費市場變革發生在汽車行業發展 75 年後的 20 世紀中葉,豐田的精益製造模式成為適應汽車消費市場劇烈變革的主角——快速推向市場,迅速對市場變化作出調整,豐富汽車品種滿足多元化需要的豐田在一段時間內成為汽車行業發展的標杆。
同樣,在軟體行業的發展經歷 50 年之後,也開始迎來一次軟體消費市場瘋狂膨脹劇烈變化的階段,這個行業的參與者,不得不到殫精竭慮於生產的產品是否能夠真正適應市場的需求,把成功交付的標準改變成“在規定的時間和規定的資金投入內,完成規定軟體規格的應用,並讓這些產品成功地被使用者使用”。
而傳統的軟體開發方法已經無法支援對快速變化的市場變化作出快速反應,換言之,傳統的“計劃+執行”的模式在當前的市場特質中行不通,在這樣存在“巨大需求變化風險”的市場中,不可避免地需要一種能夠降低這個風險的生產模式,這個生產模式,就是快速響應變化的敏捷開發方法(見圖1)。
圖1 汽車消費市場的變革產生了精益製造;軟體消費市場的變革產生了敏捷開發
從這個意義上來說,敏捷本身並不是“革命”,真正發生巨大變革的是市場,敏捷只是被市場選中。實踐敏捷是軟體消費市場變革的結果,驅動敏捷背後的力量是市場。如果敏捷是市場變革背景一次必然的風潮,那麼在風潮過後,如果這個市場依然充滿變化且專注每一位消費者的價值,那麼能夠被市場所留存的必是這個充滿變革的市場在一開始最需要的東西。
風潮過後
對敏捷的經典誤讀之一:從“敏捷”的字面出發,認為敏捷是一種快速和高效的開發方式,通過各種實踐達到交付能力提升,使交付速度變快。事實上,“敏捷”真正的含義裡,“靈活”遠大於“高速”,或者說敏捷絕不是提升效率的方法,敏捷是降低變化風險的藝術,即是“擁抱變化”的藝術。換言之,敏捷的精髓在於“擁抱變化”,而正因為這個特質,才使得敏捷越來越被這個越來越充滿變化風險的軟體消費市場所需要。那麼,應該如何理解敏捷的精髓?
靈活應對變化風險的實質在於當需求發生變化時,應對變化的成本最小,而這個成本的組成包括捨棄在這個需求上的已投成本、修改其他關聯需求的修改成本和額外投入的新成本。我們不難看出,額外投入的新成本基本由需求本身決定,為固定成本,而捨棄的已投成本和關聯的修改成本是可以通過某些手段降低的可變成本。這便是敏捷“擁抱變化”的兩個核心之所在(見圖2)。
1. 在需求發生變化前,不在或者儘可能少地在這些發生變化的需求上投入任何工作量;
2. 當需要發生變化時,不在或者儘可能少地在可能影響的其他功能上產生任何工作量;
而敏捷幾乎所有實踐活動的實質都圍繞在這兩個核心上。讓我們從敏捷中幾個經典實踐出發看它們是如何體現這兩個核心的,它們是:使用者故事、迭代交付、重構和持續整合。
1. 使用者故事:將客戶的需求拆分成不同的使用者故事,每一個使用者故事代表一個獨立的業務價值,對於未來不確定的潛在特性(變化風險最大),用使用者故事的方式佔位(Placeholder),當需求發生變化時,儘量隻影響其中的一個使用者故事(最好的情況是之前預估過風險還未進入開發),而不影響其他使用者故事的業務價值;
2. 迭代交付:將需求放在不同迭代進行交付,每個迭代都給予客戶對下個迭代需求進行變化的機會,當需求變化真正產生變化時,還沒有實質的開發工作量產生;
3. 重構:鼓勵持續地對系統架構進行優化和重構,降低系統的耦合程度,讓一個需求的變化不會或儘可能少的對現有的其他功能產生額外的工作量;
4. 持續整合:大量使用自動化測試和構建持續基礎環境,讓可能產生於每次提交的缺陷(對現有功能的影響)及時暴露,越早發現,越減少可能產生在被影響的其他功能上返工工作量。
市場的變革是敏捷方法風潮背後的推手,如果市場真正需要的是一種適應消費需求充滿變化的生產模式,那麼很有可能,敏捷作為一種方法論,有天也會被某種更新的理念替代。但是能夠肯定的是,軟體消費市場將會在更長的時間內趨向於滿足日益多元化的消費群體充滿變化的需求,因為敏捷“擁抱變化”的基因,這場市場的變革選擇了敏捷,如同汽車消費市場選擇了精益,那麼當風潮有天退去時,“擁抱變化”的基因必然被留存,無論冠以敏捷之名或是其他。
同時應該指出的是,軟體消費市場仍然存有部分消費需求變動較小的市場,包括穩定的工業自動控制、資料分析和科研研究等領域。在這一市場裡,對於市場變化的風險控制成本較小,以敏捷所包含的“擁抱變化”的基因,並沒有足夠優勢完全替代傳統“計劃+執行”的開發方式。因此,在可預見的未來,敏捷或任何一種可能出現的“擁抱變化”的開發方法會在一定時期內與傳統開發方法共存。
不可否認,敏捷正在風行,絕大部分敏捷實踐者的關注點自然都在敏捷本身,而我們往往陷於的誤區是——因為它是敏捷的東西,所以我們要實踐。那麼,當敏捷風潮退去或者對敏捷的效果產生疑問,我們的反應往往會變成——敏捷已經不流行或者敏捷已經證明不適合我們,那麼我們沒有理由繼續實踐敏捷的東西。如果僅僅把敏捷當成一種風潮之下的流行物,最有可能發生的事情在於,現在如火如荼實踐的敏捷方法的任何一種,都有可能突然在某天被團隊所拋棄而不能延續。
當我們深刻理解敏捷背後,“擁抱變化”被這個充滿變化的市場所需要的基因,明白我們做的每一件事都是讓我們在面對變化時從容不迫,讓我們製造的產品能夠滿足更多消費者的需求,創造更加多元化的需求。而不是因為,某個深不可測的大師或是高屋建瓴的諮詢師不遺餘力地鼓吹敏捷的神奇。只有這樣,我們的實踐才能夠真正為我們的交付產生實效性的價值,並能在更長的時間內堅持,哪怕有天沒有人談起敏捷,那個藏在敏捷最裡面的基因一直可以留存。實踐敏捷,請忘記敏捷(見圖3)。