← 倒帶五天

第 5 章:第5章:壓力

第5章:壓力

星期四早上,林哲翰五點半就到了公司。

他不是最早到的。陳立偉已經在位子上了,戴著耳機,面無表情地看著螢幕。林哲翰走過去的時候,他抬眼看了一下,點個頭,然後繼續看螢幕。

林哲翰坐下來,打開電腦。今天是在原始時間線裡漏洞爆發的日子。不是JWT的漏洞——那個他已經修掉了。而是另一個他差點忘記的漏洞。

在原始時間線,今天早上自動化測試發現了一個嚴重的問題:在特定條件下,系統會把A租戶的資料回傳給B租戶。不是JWT的問題,而是database query的問題。有一個API在查詢資料的時候,沒有加上tenant_id的條件。

這個問題是方佑廷寫的。不是因為他粗心,而是因為他在趕工的時候複製了一段舊的code,那段舊的code是單租戶版本的,沒有tenant_id的過濾。

在原始時間線,這個問題在早上九點被發現。方佑廷花了整個上午修。但修好之後,他沒有跑完整的回歸測試,因為時程太趕。結果那個patch引入了另一個問題——一個在demo當天會被觸發的問題。

林哲翰需要確保這件事不再發生。

他打開方佑廷的repository,找到那個API的code。看了一眼。

果然。Query裡面沒有tenant_id的條件。

他站起來,走到方佑廷的位子。方佑廷還沒來。他在方佑廷的鍵盤上放了一張便利貼:「來了之後直接找我。不要先碰code。」

然後他回到位子上,等。

八點二十分,方佑廷來了。他看到便利貼,轉頭看林哲翰。

林哲翰走過去。「你今天會改哪個模組?」

「User service的API。湘芸說前端的資料顯示有問題,我去查一下。」

「先不要改。」

「為什麼?」

「讓我先看一遍。」

方佑廷有點困惑,但還是點頭了。

林哲翰走到他的位子旁邊,看著螢幕。他打開user service的repository,找到那個API。

「你看這裡,」他指著螢幕上的query,「這個query沒有tenant_id的條件。」

方佑廷湊過來看。「……對。我複製舊code的時候沒有改到。」

「改了之後,跑一次完整的回歸測試。不要只跑unit test。」

「但這樣至少要半天——」

「跑。」

方佑廷看著他,嘴巴張了一下,然後閉上。「好。」

林哲翰回到位子上。他知道方佑廷心裡在想什麼——時程這麼趕,為什麼要花半天跑回歸測試?

在原始時間線,方佑廷沒有跑回歸測試。他改了query,跑了unit test,通過了,就commit了。然後他繼續趕其他東西。

但那個patch改動了一個共享的函式,那個函式也被其他API使用。那些API的tenant_id條件是正確的,但方佑廷的改動把它們都覆蓋了。結果其他API也開始回傳錯誤租戶的資料。

這個問題在demo當天被發現。不是因為自動化測試——而是因為投資方在測試的時候,用兩個不同的租戶帳號登入,發現看到的資料是一樣的。

林哲翰不會讓這件事再發生。


上午十點,自動化測試發出alert。

林哲翰看到通知的時候,心跳加速了一秒。然後他點開看——是user service的整合測試失敗。Tenant isolation沒有通過。

在原始時間線,這個alert是在九點出現的。方佑廷看到之後,花了整個上午修。

但這次,林哲翰已經提早告訴方佑廷不要碰code。所以方佑廷看到alert之後,沒有自己修,而是轉頭看林哲翰。

「哲翰哥,」他走過來,「user service的測試失敗了。但我還沒改。」

「我知道。我看到了。」

「你要怎麼處理?」

「我來改。你去做其他事情。」

方佑廷愣了一下。「你來改?」

「對。」

「但這是我的code——」

「我知道。但這個bug很明顯,我五分鐘就能修好。你去做前端串接的東西。」

方佑廷看了他幾秒,然後點頭。「好。」

林哲翰走到方佑廷的位子,坐下來。他打開code,找到那個query,加上tenant_id的條件。然後他檢查了所有使用同一個函式的API,確認它們的tenant_id條件都是正確的。

花了十分鐘。

他跑了一次unit test。通過。然後他跑了一次整合測試。通過。然後他跑了一次完整的回歸測試。

回歸測試要跑一個小時。

他commit了code,在Slack上通知方佑廷:「user service的bug修好了。回歸測試在跑,一個小時之後看結果。」

方佑廷回了個「謝謝」。

林哲翰回到位子上。他打開自己的code,繼續看其他模組。

但他注意到一件事。趙品睿從早上就沒有跟他說過話。在原始時間線,趙品睿會在上午找他問一次進度。但今天沒有。

他打開Slack,看到趙品睿在工程群組裡問了方佑廷:「user service的bug怎麼回事?」

方佑廷回覆:「哲翰哥在處理。已經修好了,正在跑回歸測試。」

趙品睿沒有回覆。

林哲翰看著這個對話。趙品睿在問方佑廷,不是問他。這代表什麼?

代表趙品睿在繞過他。

在原始時間線,所有技術問題都是透過林哲翰上報給趙品睿的。趙品睿不會直接問工程師。但現在他直接問方佑廷了。

林哲翰閉上眼睛。

他改變了時間線。但時間線也在改變他。


中午,許湘芸走到他位子旁邊。

「吃飯?」

他們去了昨天的便當店。許湘芸今天點的是排骨飯。

「品睿今天早上問了我一些問題,」她說,一邊打開便當,「關於你的。」

「什麼問題?」

「問你最近是不是在跟團隊成員走太近。」

林哲翰的筷子停住了。

「他問我,你是不是在幫方佑廷做他的工作。」

「你怎麼回答?」

「我說你看起來只是在確保品質。但他看起來不太相信。」

林哲翰放下筷子。

「他覺得你在收買人心,」許湘芸說,「或者說,他覺得你在建立自己的派系。」

「我沒有。」

「我知道。但品睿不這樣想。」

他們沉默地吃了幾口飯。

「還有一件事,」許湘芸壓低聲音,「品睿昨天跟投資方通電話的時候,我聽到他說『我們的技術主管最近有些狀況,但我已經在處理了』。」

林哲翰看著她。

「在處理,」他重複了一次。

「對。我不知道他是什麼意思。但我覺得你應該知道。」

林哲翰靠在椅背上。

趙品睿在投資方面前說他「有些狀況」。這代表什麼?代表他已經在為之後的事情做準備。如果demo出了問題,他可以說「我早就注意到技術主管有狀況,我已經在處理了」。

如果demo沒有問題,他可以說「我及時處理了技術主管的狀況,確保了demo的成功」。

不管結果如何,趙品睿都已經把自己放在了一個「先知」的位置。

而林哲翰是那個「狀況」。

「你覺得他會對我做什麼?」林哲翰問。

許湘芸想了一下。「我不知道。但我覺得你應該要小心。」

「小心什麼?」

「小心他把你跟方佑廷綁在一起。」

林哲翰不懂。「什麼意思?」

「我的意思是,如果你一直在幫方佑廷做他的工作,那方佑廷出了問題,你也有責任。品睿不需要單獨處理方佑廷——他可以一次處理你們兩個。」

林哲翰沉默了。

他一直在想怎麼保護方佑廷。但他沒有想到,他的保護反而可能害了方佑廷。

因為在趙品睿的世界裡,林哲翰幫方佑廷,不是因為他好心,是因為他在建立自己的勢力範圍。而勢力範圍越大,威脅越大。

「你覺得我應該怎麼做?」林哲翰問。

「我不知道,」許湘芸說,「但我覺得你應該想清楚一件事。你是在幫方佑廷,還是在幫你自己?」


下午兩點,排練開始。

趙品睿站在會議室前面,模擬投資方的角色。許湘芸操作筆電,投影在螢幕上。林哲翰、方佑廷、陳立偉坐在旁邊看。

「我是一個新的客戶,」趙品睿說,用一種他不常用的語氣,「我想測試你們的系統。我先登入。」

許湘芸操作登入流程。系統正常運作。

「好,我登入了。現在我想查看我的對話紀錄。」

許湘芸點擊「對話紀錄」。系統載入。資料正確。

「現在我想查看另一個租戶的資料。」

會議室裡安靜了一秒。

「什麼意思?」許湘芸問。

「我是投資方。我想測試你們的租戶隔離。我用A租戶登入,但我嘗試存取B租戶的資料。系統應該要擋下來。」

許湘芸看了林哲翰一眼。林哲翰點個頭。

她操作了。系統正確地回傳了「權限不足」的錯誤。

趙品睿點個頭。「好。那如果我同時用兩個租戶登入呢?」

「我們的系統不支援同時登入,」林哲翰說,「一個瀏覽器只能有一個session。」

「那如果我用兩個瀏覽器呢?」

「可以。但session是獨立的。不會互相影響。」

「測試一下。」

許湘芸開了兩個瀏覽器,分別用A租戶和B租戶登入。然後在A租戶的瀏覽器裡,嘗試存取B租戶的資料。

系統正確地回傳了錯誤。

趙品睿看著螢幕,沉默了幾秒。

「好,」他說,「那壓力測試呢?如果同時有很多人操作?」

「我們跑過壓力測試,」林哲翰說,「五百並發,平均回應時間三百毫秒。Tenant isolation在高並發下也通過了。」

「你確定?」

「確定。」

趙品睿看著他。那個眼神跟之前不一樣——不是測試,是審視。

「好,」他說,「排練結束。大家做得不錯。」

他站起來,走出會議室。

其他人鬆了一口氣。方佑廷靠在椅背上,擦了擦額頭的汗。

「好緊張,」他說。

陳立偉沒有說話,但林哲翰注意到他的手也在微微發抖。

許湘芸關掉筆電。「我覺得還行。但投資方可能會問更多問題。」

「會,」林哲翰說,「他們會。」


晚上,林哲翰一個人留在辦公室。

他在想許湘芸說的話。「你是在幫方佑廷,還是在幫你自己?」

他不知道。

在原始時間線,他出賣方佑廷,是因為他需要自保。這次他試圖保護方佑廷,但他不確定這是因為他真的在乎方佑廷,還是因為他想要證明自己不是那種人。

或者兩者都有。

他想起方佑廷問他的問題:「你覺得這份工作有意義嗎?」

他想起陳立偉說的話:「不要當英雄,英雄沒有好下場。」

他想起趙品睿的眼神。

他想起母親。

窗外的台北市燈火通明。十一月的夜晚很涼。林哲翰坐在空蕩蕩的辦公室裡,記得所有的事情,不知道明天會怎樣。

他的手機震動了一下。是方佑廷傳來的訊息。

「哲翰哥,謝謝你今天幫我修bug。我知道你不用這樣做的。」

林哲翰看著這則訊息。

他打了幾個字,刪掉。再打幾個字,又刪掉。

最後他回了:「早點睡。明天是最後一天。」

方佑廷回了一個「好」和一個笑臉。

林哲翰把手機放在桌上,靠在椅背上。

明天是星期五。Demo的日子。

在原始時間線,這一天改變了所有人的命運。

這次呢?

他不知道。但他知道一件事。

他不能再按照原始時間線的劇本走了。不管結果如何,他需要做出自己的選擇。

即使他不知道那個選擇是不是對的。

4361 字 •