1. 程式人生 > >開發思想-流的本質

開發思想-流的本質

引言

如何在流程中獲得良好的“流(flow)”?近日,我在瑞典斯德哥爾摩參加了一場“精益咖啡”會議。在會上,有個人描述了他們的情況,一個有四名開發人員的團隊需要服務於四名不同的產品經理的需求。她說這種情況太分散。這引發了我對於這種我認為非常常見的情況以及精益和敏捷如何幫助解決這個問題的思考。

一個有瓶頸的流程

這是一張通用的流程描述圖片。它可以描述任何型別的流程,請求從流程的一端進入,交付物從另一端輸出。流程中有多個增加價值的步驟。如果流程沒有增加價值,那麼就沒有存在的理由。所有流程都存在瓶頸/約束形式的限制[1]。

“最窄”的瓶頸決定了流或者整個流程的生產能力。精益的一個關鍵概念是kaizen

,它的意思是應該對流程進行持續改進。當一個瓶頸消除了,另一個就變成了“最窄”的,因此,你需要繼續kaizen工作,永不結束。流程是一個公司所擁有的最有價值的東西,比其產品和服務(會隨時間變來變去)更有價值。希望流程改進可以一直持續下去!

遺憾的是,我從軟體開發行業中得到的經驗表明,我們更關注我們做什麼(產品和服務有一定的不穩定性),然後是如何做(長遠來看,流程將最終決定公司的成功)。希望在軟體行業中,我們可以改為更關注後者。要獲得流,就需要專注。

過度分散是一種常見情況

我認為,這是一種在許多軟體公司中都非常常見的情況。注意力分散“各處”——公司提供的多種產品和服務。我們常常做點這個,做點那個,以免錯過可能成為“下一個大事件”的東西。由於我們一次做許多事情,所以工作變得太“稀疏”,所有任務間的上下文切換[2]使我們產出的實際價值越來越少。由於無法預見事情什麼時候可以完成,所以我們不得不提早開始,這進一步增加了在製品數量。在製品

是指你同時進行的所有工作。最終,你進入了一個惡性迴圈。在軟體開發中,沒有天然的在製品限制(所有的工作都發生在我們的頭腦中或者伺服器上)。在工廠中,有物理上的限制,比如有限的地面空間。

事實上,缺乏專注更可能使我們不成功。在史蒂夫喬布斯的自傳[3]中,有一個章節講述了一次所有蘋果高管都參與的異地會議。如果我記得沒錯,高管們大概有100個不同的想法,他們認為那些想法會成為“下一個大事件”,並希望公司支援和資助。通過在幾天的會議中比較和討論各個想法,他們最終將它們歸結為三個。現在的好處是,整個公司都支援那三個想法,他們可以非常非常專注。

我們希望使流程更加合理,增加生產能力

下面是我們希望實現的目標:

  • 簡化我們的業務,同一時間專注於更少的事情(比如,減少在製品),以此增加生產能力,並縮短提前期
  • Kaizen,持續改進流程,消除瓶頸,獲得流
  • 縮小交付增量,更快地、持續不斷地為客戶帶來價值

一個良好的流的例子——接力棒

我是個體育迷,包括田徑運動。在世界錦標賽或奧林匹克運動會中,4x100接力賽通常是一項非常有趣且激動人心的賽事。

當前的世界記錄為(男子):

  • 400米:43.18秒,由邁克爾·約翰遜於1999年8月26日在塞維利亞創造
  • 4x100米接力賽:36.84秒,由牙買加於2012年8月11日在倫敦創造

雖然邁克爾·約翰遜是有史以來最好的運動員之一,但來自牙買加的團隊創造的接力賽記錄比他的400米記錄快了15%。為什麼會這樣?有兩個原因:

  1. 在來自牙買加的團隊中,每個人都可以以最大能力跑(400米雖然不長,但要以跑100米的速度來跑是不可能的)
  2. 在接力棒交接時沒有速度損失

因此,在這種情況下,1+1+1+1不等於4,而是大於4!我們如何將這種情況轉化為一種與我們的環境相匹配的描述?

“一體式(One piece)”連續流

精益的真正目標“Nirvana”是一個一體式連續流。這裡的一體式是指在工作流程中增加價值的步驟之間沒有任何等待時間或庫存。就像接力棒!我們開始時可以從上述哪個原因入手?當然你可以(並且應該)僱用最熟練的人,並讓他們盡力而為,但最有意思的是運動員之間的交接棒。事實上,一個國家,即使它的運動員不是最好的,只要他們將交接棒的過程練習到完美的程度,那麼也可以在奧林匹克運動會或世界錦標賽中取得好成績。在決賽中,經常出現那樣的情況,其中一個可能奪冠的國家因為交接棒犯規而被取消資格。

在你的組織中,你們會練習在流程的不同步驟之間交接嗎?或者你們只關注流程步驟?

我們姑且將我們的“運動員”描述為:分析師、開發人員、QA&部署人員。分析師和開發人員之間的任務(需求)交接是如何進行的?開發人員在接到需求之前就已經“提起速度”了嗎?

為了確保交接過程沒有遺漏,分析師同開發人員“一起跑”了嗎?我猜,在大多數情況下,任務都在排隊(比如在一個跟蹤系統中)。

學習接力棒的例子

我們能從這個例子中學到什麼呢?首先,我們需要練習交接,使交接過程儘可能順利。在競爭模式(比如:做日常工作,交付給客戶)下,這是不可能做到的。我們需要後退一步,反思我們的行為,然後做出改變,獲得持續改善。其次是專注和資訊共享(如果你願意)。所有的“運動員”都完全清楚要做什麼以及何時做。他們有所有需要的資訊,所以能夠俯瞰“整個比賽”。

如何實現流

在軟體企業中,如何實現良好的流?對於許多組織而言,思想的轉變是必須的。現在,我們往往專注於高資源效率(人們一直很忙)。相對於高資源效率,我們還有高流效率(工作在流程中快速移動)。我們必須做的是,暫時停止關注高資源效率,留有冗餘(資源變得可用),那樣,流被優先考慮,然後改善流程(kaizen),資源因此更高效。通常,總提前期中只有1-5%的時間增加價值,20%增加價值是個很高的數值了[4]。

我們希望建立的是覆蓋整個價值流、包含所有所需職能/能力的團隊。這樣做,我們就可以確保交接工作儘可能地順利,因為它們發生在彼此瞭解而又向著共同目標努力的同事之間。有三件事可以成就一個偉大的團隊:自主性掌控性目的性[5]。

例子:如何獲得流

下面是一些有關如何在流程中實現流的例子[6]:

  • 限制在製品——通過限制流程中的在製品,可以確保工作在流程中更快地移動。團隊成員應該總是想著“停止開始新工作,開始完成已開始的工作”,而不只是在完成當前工作時開始一項新任務。這可能意味著幫助另一個團隊成員進行測試,以完成那項任務。
  • 縮短等待時間——研究為什麼任務在等待,並努力縮短等待時間。提出如下問題:
    • 任務為什麼排起了隊?也許是時候解決已知的瓶頸了。
    • 如何促成所需的決策?召開所有涉眾都參與的會議,推動工作繼續進行下去。
    • 有什麼方法可以臨時消除外部依賴嗎?也許可以編寫一個外部系統的模擬器。這樣做可以實現流,但也多出了可能需要後續“償還”的“技術債務”(當外部系統可用,但並不能100%按你在模擬器中的預期執行時)。
  • 跨職能團隊—— 正如在前面的小節中所描述的那樣,我們希望建立一個團隊,它擁有滿足整個價值流所需的所有能力,我們將這樣的團隊稱為跨職能團隊。團隊有“所需的一切”,我們實現了外部依賴的最小化,儘可能地消除了同其它團隊交接所導致的延遲和對流的妨害。

小結

在這篇文章中,我已經討論過,所有的流程都受瓶頸限制。在軟體開發公司中,一個常見的場景是同時有太多的工作在進行,導致工作太分散太稀疏。4x100米接力賽中的接力棒是流的一個很好的例子。在文章最後,我描述了思想轉變,從專注於資源效率到專注於流效率,然後給出了一些獲得流的例子。