傍晚六點半,咖啡廳裡人不多。
阿偉一進門就直奔我這桌,臉上帶著一種混雜著興奮和疲憊的表情。
「欸,上次那招真的有用欸。」他坐下來,語氣裡難得有點輕鬆,「小P收到我的email之後,真的很認真在看那兩個方案。最後他選了B方案,那個用WebSocket做即時推播的。」
「他還跟我說『阿偉,你這樣分析得很清楚,我覺得我們確實應該做得扎實一點』。」阿偉學著小P的語氣,有點得意,「我終於感覺我們是在一起想辦法,而不是在互相猜心了。」
我點點頭,為他感到高興。
但阿偉的笑容只維持了大概十秒。
「可是...」他的表情又垮下來,「我開始估算那個B方案的時程時,發現有個很大的問題。」
他嘆了口氣,「不是功能本身複雜,而是我們底層那個會員服務的API,實在是太爛了。」
「有多爛?」我問。
「就...」阿偉用手比劃著,「那個API是三年前留下來的,當時寫的人早就離職了。整個Service混成一團,什麼都綁在一起。我光是要接一個簡單的即時推播,就得花兩天去處理那堆屎山。」
他越說越激動,「你知道嗎,我原本估五天可以做完,結果光是處理那個破API就要兩天。如果不處理,以後每個要用到這個Service的功能,都會被拖慢。而且隨時可能爆炸。」
「那你跟老楊說了嗎?」
「說了啊!」阿偉有點無奈,「我跟他說這個service違反了一堆物件導向原則,耦合度高到爆炸,根本是顆不定時炸彈。」
我大概猜到接下來會發生什麼事了。
「老楊怎麼說?」
阿偉學著老楊的語氣,壓低聲音:「『阿偉,我知道技術品質很重要。但現在老闆只在乎進度,你能不能先把功能做出來,重構的事情,等這季忙完再說?』」
「然後呢?」
「然後就沒有然後了啊。」阿偉攤手,「對老楊來說,重構就是『花三週,卻做不出任何看得見的新功能』。我講什麼SOLID、耦合度,他根本聽不懂,就算聽懂了也不在乎。」
他用手指戳著桌面,「我看得到那個技術債會炸掉,但我說不出來為什麼非修不可。這感覺就像...就像我在用外星語跟他溝通一樣。」
咖啡廳裡傳來咖啡機的蒸氣聲,阿偉靠在椅背上,看起來很挫敗。
「還記得幾個月前我們寫考績表的時候怎麼做的嗎?」我問。
「嗯...你是說把技術工作給翻譯成,老楊聽得懂的語言嗎?」
「對。」我拿出筆記本,「現在我們要做類似的事,但這次是翻譯『技術債』。」
阿偉皺著眉頭,等我繼續。
「你跟老楊說『違反SOLID原則』、『耦合度太高』,這對他來說根本就是技術黑話。」我在紙上畫了三個圈,「但如果我們換個方式說呢?」
我開始在紙上寫:
時間成本:
- 如果我們現在不花三週重構,那未來六個月內,每個要用到這個Service的新功能,開發時間都會多30%以上。
- 本來兩週能做完的功能,會變成三週。本來一週能做完的,會變成十天。這樣累積下來,我們跟競爭對手的速度差距會越拉越大。
阿偉眼睛亮了一下,「對啊,而且老楊最在意的就是時程...」
「對,所以我們要用他在意的語言跟他溝通。」我繼續寫第二點。
穩定成本:
- 這個service在高峰期崩潰的機率很高。一旦系統掛掉,每小時的營收損失有多少?客服會接到多少抱怨電話?
「我們上次系統出問題,客服那邊是不是整個爆炸?」
「對欸...」阿偉回想起來,「那次老楊被罵到臭頭,他整個週末都在處理善後。」
「所以這不只單純是技術問題而已,這如果沒有處理好,會是一種營運風險。」我點點頭,「老楊或許不在乎什麼耦合度怎麼樣,但他一定會怕半夜被老闆罵醒。」
「最後一個,」我寫下第三點,「因為這個service太爛,你和老黃每個禮拜要花多少時間在救火?」
阿偉想了想,「至少五、六個小時吧...光是上禮拜就修了三個相關的 bugs。」
「那這五、六個小時,如果拿去做新功能,能創造多少價值?」
「呃...」阿偉停下來算了算,「如果是是那種急需上線的功能,應該能創造不少業績吧。」
「你看,」我把筆記本轉向他:
人力成本:
- 每週花五小時在救火 = 每個月20小時 = 一年240小時
- 這相當於每年浪費6週的工程師時間,這些時間本來可以用來開發創造價值的功能
- 如果按照工程師月薪計算,這筆隱藏成本高達數十萬
「同樣是技術債,但現在我們是在告訴老楊:『你現在不處理,公司未來幾個月都會一直流血。』」
阿偉看著那三個圈,慢慢點頭。
「還有一件事很重要。」我喝了口咖啡,「記得上次你給小P兩個方案嗎?」
「記得,我給了他快但陽春的 A方案,還有比較慢卻扎實的B方案。」
「對。所以現在面對技術債,我們也不能只給老楊一個『你就是要讓我重構』的選項。」
阿偉歪著頭,「那要怎麼給?」
「給他兩個明確的選擇,讓他自己決定要付什麼代價。」
我在新的一頁寫下:
方案A:現在重構
- 需投入三週的時間成本,短期內降低、甚至暫停新功能產出
- 小P要的那個即時推播,上線日可能會推遲
- 但未來一年,相關功能的開發時程可以至少減少30%
- 系統穩定性提升,重大bug發生機率減半
- 團隊每週都可以增加五小時的額外產能
---
方案B:維持現狀
- 不需花時間重構,可以繼續開發新功能
- 小P要的那個即時推播,可以趕在這一版上線
- 但必須接受:
- 每個月至少出現一次重大bug的機率大於50%
- 未來相關功能的時程將難以無法承諾與估計
- 小P要的那個即時推播,可能會有資料延遲或遺失的風險
- 團隊每週持續花五小時救火
「你看,」我指著紙上的內容,「現在老楊的決策就不單純是『要不要重構』了,而是『我願不願意讓公司持續出血,來換取短暫的進度?』」
阿偉盯著那兩個方案,若有所思。
「所以我不是在要求他,而是在向他提示潛在的風險嗎?」
「是啊。」我說,「只有當他看到『不作為的代價』時,他才會重視。不然在他眼裡,技術債就永遠是『可以晚點再處理的小事』了。」
「對了,」他突然抬頭,「如果老楊還是選B方案、決定不要改,怎麼辦?」
「這時…我們就尊重他吧?」我露出神秘的微笑,「假使他看完後,還是選擇維持現狀的話,那也是他經過取捨後的選擇嘛。」
「也是。至少我已經盡力表達、在這件事上對得起自己了。」
阿偉拿出筆電,開始打字。
「我明白了。」他說,「以前我總是單純從技術的角度來爭取重構,難怪沒人理我。」
他邊打字邊說,「原來我需要把那些技術語言,給全部翻譯成對方關心的事情。如果是老楊的話,那就是時程、穩定、成本… 然後給他兩個方案,讓他自己選。」
我看著他專注打字的樣子,點點頭。
十五分鐘後,他把筆電轉向我。螢幕上是一封寫給老楊的email,條理分明地列出技術債的商業影響,還有兩個方案的對比。
「你覺得怎麼樣?」
「很好。」我說,「你已經不是那個只會寫 code的工程師啦。」
阿偉笑了,按下送出。
然後他看著我,「你知道嗎,我以前覺得這些溝通、翻譯、表達,都是在浪費時間。現在我才發現,如果我不會說人話,我的技術再好也沒用。」
咖啡廳外開始下起細雨,窗戶上慢慢凝結出水珠。
「下次聊,」他揮揮手。