工作中是這樣,老闆也好,上級也好,甚至我們自己,總是會期待對一件未來的是「估算一下」。大概還要三天、大概需要十個人力,大概會花三百萬…我們的生活中到處充滿估算。
問題呢,在於我們畢竟也是人也不是神,對吧?我們的估算也不一定會準。這時很多人會試著去謀求估算得更準的方法。事實上對我來說,我會認為與其追求如何估算的更準不如好好想想在估算不準的時候,我要怎麼減少我的損失。
前面故事當中的主角 Yincheng,他有一個非常高的自信,叫做「所有未來的事情我都考慮過了」。當然,如果這件事情你真的做得到的話,自然是非常好,為什麼?因為後面的人只要依照你原本規劃的架構下去走下去做,就絕對不會出什麼亂子,因為你都考慮到了嘛!
然而,在現代的軟體業裡,下個月會發生什麼事情,明天、下一個小時會發生什麼事情,你都不一定知道。事實上現在的軟體工作已經很難很難把未來所有事情都考慮到了,如果你花了很多心思在建築一個牢不可破又完美無缺的架構那首先當你遇到這個架構不再合用的時候 你付出的成本會非常的高,其次你很快就會遇到你的架構不好用的時候。因為:時代已經不一樣了。
我舉個例子,伊隆馬斯克把 Twitter 改名為 X 花了多久時間,你有估算到嗎?
筆者記得有一次聽過 Kent Beck 的一場直播。他說他有一次去外面給演講時,在他演講一大串完了之後有個與會者舉手問了他一個問題。他問說:「欸,那為什麼我要做這麼多改變?為什麼這麼多這麼頻繁的改變然後還要去驗證還要去整合?為什麼我不一開始就掌握所有的事情、做好所有個規劃就好了呢?」
這位與會者很顯然的剛剛的演講完全沒有在聽,但是 Kent Beck 不愧是大師他也沒有生氣,他的回應是:「如果可以提早知道未來能發生的事當然很好;如果你有一個很明確的目標,而這個目標也不會變當然很好,但是可惜的是世界已經向我們證明了,這兩件事情都不會發生。」
我們都知道,這個世界上如果所有事情都不會改變的話,其實不只工作,這整個世界就會變得很容易許多,為什麼?因為所有事情都能掌握了!
各位有寫過 Leet Code 嗎?有寫過 Leet Code 的人也許有印象,有一題叫我們用 DP(Dynamic Programming)算出股票的最佳購買點。當時筆者在寫的時候就覺得,欸,既然都我能用 DP 算出最佳的股票購買點,那為什麼股市中還有這麼多人虧錢呢?後來我才發現不對啊!那一個題目他輸入的測試資料有包含未來的資料,但現實的股市是沒有的啊!
你知道股票明天會跌你就會去脫手,你知道房價明年會大漲你現在就會買,如果世界上所有事情都能夠預測得很準的話,世上就沒有不幸的人(吧)。然而這個世界根本就不是怎麼運作的。現實世界的變動太快,快到你花太多時間去預設太遠的未來是沒有意義的事情。
我的意思也不是說你不可以有一個目標。不是的。就像 Kent Beck 的 TDD 也沒有要你完全不規劃。我的意思是,在你往你的目標邁進的路上,如果有太多不可預期的事情,你就應該要專注在你現在可以預期的事情上,每天每天都專注的把可預期的事情做好,到時候不可預期的事情就會慢慢變少,然後再專注在下一件事情然後再專注在下一件事情,直到有一天你真的達到你的目標為止。萬一事情變得更糟, 就退回到上一步,再找另外一個解法來解決這個問題。
總之,在現在這個快速變動的時代,其實你的目標也每天都會變動,因此追尋一個固定的目標固定的手法跟固定的架構,一件成本很高,C/P 值很低的事情。
這其實也是現代的軟體工程可以幫上忙的地方。在這個快速變動的時代,用穩健的步調,在安全的場域裡面,安心的去回應所有眼前正在發生的變化。
有發現嗎?我沒有說快喔,我說的是穩健的步調。
Kent Beck 的 Extreme Programming 這本書的副標就叫做「擁抱改變」,然而很多人在「擁抱改變」的過程當中手段卻有一點誤解。
例如今天在 Scrum 的 Planning Meeting 中,你估算能做五個 Item,結果在每天的開發過程當中,你發現一開始的估算遺漏掉了一些東西,這時跑去跟老闆回報。老闆卻說:「不對,你要擁抱改變,所以這些改變你都應該要接受,因此不管是交期還是 Scope 都不可以改。」事實上這就是對「擁抱改變」這個概念的一個非常常見的錯誤理解。
其實 Kent Beck 想說的事情是,你必須得接受未來是不可預測的,未來會有很多你從來沒有想過事情發生。既然改變不可避免,這時你要做的事情其實是透過一些手段或手法,把可掌握的事情掌握度做到最高,把自己該做的事情做到最好。如此一來當不可避免的改變發生時,你就有能力去處理。就算沒能力處理,因為你已經把步調變小,每次要做的決策變少,因此萬一發現你做的決策是錯誤的,在你要改變方向時,犧牲掉的內容也會被你壓到最小。
這才叫擁抱改變。
上面講的擁抱改變,執行起來有一個很重要很重要的因素:延遲決策:
我們說一個人對一件事情的熟悉度,肯定是接觸越久越熟悉。假設這是成立的,那麼在一個專案或是一個產品的剛開始第一天就把所有事情全部都決定好,那麼你等於是在一個你對整件事情完全還不熟悉的情況下做出了這些決定。 如同前面所說的,未來什麼時候會發生什麼事情:誰知道?如果你所有事情都先決定好了,並且都做到一半了,這時萬一出現了不如你預期的發展,你的改變成本就會非常的高。
想反地,如果你能夠在必須做出決定的時候再決定,這時,你對於整個情況的掌握度,肯定要比第一天來得高吧?同時,你也已經知道情況有了什麼變化。在所有外在與內在條件都被你掌握住的情況下,比起第一天,你就更能做出高品質的決策。
因此,延遲決策對於擁抱改變來說非常的重要。
雖說延遲決策大家都能做,但做起來也有高低程度之分。
以生活為例,在現代的社會中生活什麼樣的人最有能力延遲決策?
有錢人
舉例來說,今天鴻海創辦人郭台銘想到法國去吃蝸牛,他今天晚上想吃他今天早上再決定就可以了,因為他唯一克服不了的就是當代飛機的速度與天氣,其它的事情他幾乎都能克服。
回到軟體開發,在軟體開發的世界什麼能力才能有助我們延遲決策?
軟體的實力。
今天假設你架構設計的能力很好,你寫程式的速度很快,你演算法很強,或是你測試與持續整合跟持續交付都做得很好,每次測試都會花很少的時間給你最大的保護, 並且花最少的時間安全的更換版本,這時候你就是軟體界的郭台銘。
郭台銘沒有說,圖片取自財訊網
當你每次技術決策想要轉彎時,砍掉的東西都很少的話,你就可以在很晚的時間,等證據很明顯的出現的時候,才去決定新的架構要長什麼樣子;相反地假設你今天軟體實力很差,你做任何的調整都要花很多的時間,那你就沒辦法延遲決策。
當你沒有辦法延遲決策,為了達成任務,你就只好在最一開始的時候提前去預判所有未來可能發生的事情,並且給出一個最完整最能夠滿足所有情況的,嚴謹又完整的架構。也就是,因為你在未來發生改變的時候沒有能力去快速的應變那個改變,所以你只好現在就把所有可能發生的事情全部都考慮進去,那這樣子的人就不擁有延遲決策的能力也就自然 沒有辦法擁抱改變了。
謎之聲:「有錢真好!」