阿偉頂著一對熊貓眼推門進來,一副剛打完一場敗仗的樣子。
他一屁股坐下來就開始抱怨:「老楊批准了我的重構提案!本來應該很開心的對吧?結果我昨天晚上失眠到三點半。」
「怎麼了?」我點了兩杯咖啡,看他這樣子顯然需要雙份咖啡因。
「老楊決定給我們三週時間處理那個爛到爆的核心會員服務。」阿偉揉著太陽穴,「聽起來很棒對吧?問題是...他把我跟老黃分到一組。」
我想起上次他跟老黃的事情,立刻明白了。他們是團隊裡技術最強的兩人,理應是黃金組合才對,但現在看起來更像是要互相折磨三週。
「不是說之前老黃幫你看 code 還蠻不錯的嗎?」
「對啊,那次確實幫了我很多。」阿偉苦笑,「但那次是我主動去請教,然後他幫我理清思路。可是現在不一樣,我們是要一起合作完成一個有時程壓力的專案,而老黃...他對品質的要求真的很高。」
「所以現在你們要一起合作三個禮拜啊?」
「對啊...唉,老實講,我覺得三個禮拜實在是有點短…但是老楊為難地說,他給我們的這三週,已經是商業的極限了。」
阿偉拿出手機,「所以我前兩天很認真地做了重構設計,想說先求一個最小可行重構,確保三週內能交付一個穩定的版本。」
他滑了滑手機,找到老黃的回覆:「結果老黃看了我的設計後說...」
阿偉學著老黃的語氣,壓低聲音:「『你這個設計依然是耦合度過高,與架構設計初衷不符。建議重新考慮整個服務的DDD劃分。』」
「就這樣?」
「就這樣!」阿偉差點把手機摔到桌上,「我知道他技術上是對的,但老楊給我們的時程就是三週啊!你知道嗎,本來老楊只打算給兩週而已,要拜託他才勉強擠出三週的耶。現在如果真的按照老黃他那種完美主義來做,別說三週了,三個月都做不完!」
咖啡送上來了,阿偉狠狠喝了一大口,被燙到舌頭還是不停。
「你覺得老黃為什麼要這樣啊?」我問。
「因為他是技術潔癖魔人啊。」阿偉翻了個白眼,「他只看到code要優雅,都看不到時間的壓力耶。」
「嗯...不過你想想看,如果你是老黃,看到一個『暫時性』的解決方案,你會怎麼想?」
阿偉愣了一下。
「你會不會擔心,這個『暫時』的解決方案最後會變成永久的?然後未來每次要修改,都要在這個爛架構上面打補丁?」
「...會。」阿偉小聲承認,「我自己也遇過這種事。本來說是暫時的workaround,結果一用就用了兩年。」
「那你現在還會覺得,老黃的問題,單純只是因為他不信任你的妥協程度嗎?」
「呃...我好像知道你想說什麼了...你是想告訴我,其實他是在擔心我所謂的最小可行重構,以後又變成另一個無法重構的技術債嗎?」
「沒錯。」
阿偉沉默了一會,「那我要怎麼辦?說服他放棄完美主義嗎?」
「不,不必說服他放棄任何東西,」我眨眨眼,「我們可以反過來,邀請他來一起定義界線。」
我拿出筆記本,在上面畫了一條直線。
「阿偉你看,現在我們遇到的問題是什麼?是老黃覺得你要犧牲品質,但你覺得老黃不顧時程,對吧?可是其實你們的目標卻是一樣的,那就是你們都想要『做出一個不會爆炸、且未來好維護的系統』。」
我在直線的兩端分別寫上:
快速交付 <——————————————————> 架構完美
「所以我們現在不應該把力氣拿來說服老黃妥協『你的方案』,反而是要把他拉進來一起參與定義:在這條線上,我們可以接受的底線在哪個位置上。」
阿偉趕緊也拿出紙本,急切地問:「怎麼做?」
我開始在紙上寫…
「首先我們不能只跟老黃討論 code 要怎麼寫。我們得先告訴他這件事情的『任務達成條件』是什麼?像是這樣…」
- 必須在三週內交付,這是老楊能給的最大時間極限
- 如果我們無法在期限內交付,老楊會收回這次重構的機會,下一季我們就得在原有的爛架構上寫code了
- 在這三週內,要做到以下兩點
- 能顯著降低崩潰風險
- 不會再拖延即時推播功能
我說,「像這樣,讓老黃知道這次重構的機會,其實是伴隨條件限制的。讓他意識到,如果我們沒辦法在時間內交出一版的話,那做得再漂亮也沒辦法用。」
阿偉很疑惑:「可是這樣不就是在說服老黃,得要閹割他心目中的藍圖嗎?」
「你想啊,老楊現在頂住上面的壓力,好不容易爭取來三週的時間給你們,他期望能夠看到什麼?」
「嗯… 應該是希望可以馬上就能看到一些效果吧?」
「是啊。」我喝了口咖啡,「如果我們讓老楊在下次跟高層報告時,可以拿得出成果來證明初步重構有效的話,那規劃下季時程的時候,我們是不是就又有機會能完善這一版的重構了?」
我拿出筆,又補上一點:
- 如果在時間內順利交付重構,並達成以上效果,老楊則可藉此爭取下次重構的機會
「原來是這樣啊!」阿偉恍然大悟,「這樣的話,老黃心中的理想就還是有機會實現了!」
「沒錯~ 還有,萬一老楊之後不幸沒能爭取到下次的重構,那至少你們也已經在這次,把最嚴重的問題給修補好了,對之後的開發工作還是幫助很大,對吧?」
阿偉用力點頭。
「所以如果我們能讓老黃也理解到這一點,那他應該就能明白,這次的重構是階段性的、而不是一次到位的完美解決方案了。」我補充道,「而且我們也需要他的專業視角,來確保我們在有限的資源下,可以盡量一起做出最好的成果。」
「接著,我們可以請老黃幫我們一起規劃實現路徑。我們可以問他…」
老黃,既然這次時間有限,你覺得這個完整的設計我們可以怎麼拆分,讓我們在這三個禮拜可以實現我們想要的初步效果、又能方便我們之後迭代呢?
阿偉思考著,「你是說… 找他來一起來思考這個拆分的決策嗎?」
「對!我們還可以跟他請教…」
以你的專業判斷,哪些部分是這個階段就必須處理的核心問題?哪些是可以留到下階段再做完善的呢?
「這樣的話,老黃就會覺得整個規劃是他參與制定的囉?」
「沒錯,而且當他自己劃分了優先級,就會對這次的範圍有了更貼近現實的認知。他會更加明白我們不是在閹割他心中理想的設計,只是在把技術邏輯分步實現而已。」我喝了口咖啡,「而且第一階段的成功,也會為下階段爭取到更多資源和時間,何樂而不為呢。」
「這是最後一步,也是跟像是老黃這樣的技術大神合作最需要注意的。」我在紙上畫了一條線,「我們要請老黃幫忙定義這次版本的品質底線。我們可以跟他討論…」
既然我們要在三週內完成,你覺得我們有哪些核心原則是絕對不能違反的?哪些部分雖然看起來很髒,但因為時間因素,這次可以暫時留著,下次再完善也OK的?
我指著這段文字,「像這樣,在開發工作開始前,就先跟他說好妥協的邊界在哪裡,這樣才不會花太多時間在討論coding style、怎樣才算完美… 之類的細節。」
阿偉高興地說,「對耶,這樣應該可以減少很多跟老黃來回討論細節的時間了!」
「沒錯啦。而且當老黃參與制定規則時,他的角色也同時從一個『評審』,變成了跟你在一艘船上的『隊友』了。這樣一來,他就不會想要再一直去評論問題、而是會跟你一起想辦法解決問題啦。」
阿偉聽完後,原本疲憊的神情逐漸被決心取代。
「我懂了...」阿偉想了想,「以前我總是想證明我的做法才是對的,但其實...我應該要邀請他一起來守護這個專案才對。對吧?」
「沒錯。」我點點頭,「說穿了,你們只是都想把事情做好啊,現在只是需要互相取得共識而已。」
他拿出手機,開始打字:「那我現在就發個會議邀請給老黃好了,主題就叫『關於核心服務重構的協作規劃』吧。」
咖啡廳裡的音樂換成了一首比較輕快的歌,阿偉臉上的熊貓眼看起來好像也沒那麼嚴重了。
「會議我約在明天下午兩點。」他邊打字邊說,「這次,我要讓他知道我們是站在同一邊的,不再是互相拖累的負擔了。」
他放下手機,喝了一口已經涼掉的咖啡。
「唉...不知道能不能成功耶。」他嘆了口氣。
「放心吧,我相信你。」我說,「而且如果你們真的能建立起這種合作模式,以後遇到類似的情境就可以順利多啦。」
阿偉愣了一下,「是嗎?」
「是啊。而且我覺得,說不定老黃也一直在等一個,能夠像你一樣願意理解他技術理念的合作夥伴喔。」
他靦腆地笑了,眼神裡好像閃爍著不確定的光。
「我突然覺得...跟老黃合作可能也...不算壞事了耶。」