第 1 章:第1章:醒來
第1章:醒來
林哲翰是被冷氣聲吵醒的。
不是鬧鐘,不是手機震動,是老舊窗型冷氣壓縮機發出的那種金屬摩擦聲。他花了三秒才認出這個聲音——他搬進這間租屋處兩年,每天睡前都聽著它入睡,但今天早上聽起來特別清晰,像是有人把音量調大了。
他睜開眼。天花板有一道裂紋,從左上角延伸到正中央,像一條乾涸的河。他盯著那道裂紋看了很久。
手機在床頭櫃上,螢幕朝下。他翻過來,指紋解鎖。
2025年11月17日,星期一。上午6:42。
他盯著那個日期。
然後他坐起來,動作太快,脊椎發出一聲響。他低頭看自己的手——沒有疤。右手虎口那個被紙箱割傷的疤,不見了。那是上個月的事。或者說,是「未來」上個月的事。
他站起來,走到浴室。鏡子裡的臉很陌生。不是長相變了,是氣色。黑眼圈還在,但沒那麼深。眼神不一樣。他看起來比較不累。
他記得所有事情。
方佑廷被開除那天是星期四。趙品睿在會議上說「這是嚴重的人為疏失」,方佑廷坐在會議室最遠的位子,臉很白。林哲翰記得自己說的話:「這個模組是佑廷負責的,我當時有提醒過他要double check。」
他說了「提醒過」。不是「我批准的」。不是「時程是我壓的」。
方佑廷看他那一眼,他一輩子忘不了。
後來方佑廷在LinkedIn上寫了一段話。不長,大概兩百字。沒有指名道姓,但林哲翰知道是在說他。最後一句是:「我以為職場上至少會有信任,但我錯了。」
那篇文章被分享了四百多次。
然後是公司倒閉。A輪募資失敗,投資方撤資,三個月後智核科技裁了一半的人。林哲翰沒有被裁——他升了主管,趙品睿說他是「危機中展現領導力的人」。
他升了。方佑廷走了。公司死了。他升了。
他低頭看著自己的手。虎口光滑。
2025年11月17日,星期一。
他記得今天會發生什麼。
他比平常早了四十分鐘到公司。
內湖的早晨很安靜,七點多的陽光斜斜地照進商辦大樓的大廳。警衛老張看了他一眼,點個頭。林哲翰刷了門禁卡,搭電梯到十四樓。
智核科技的門是暗的。他是第一個到的。
他打開燈。日光燈管閃了兩下才亮,嗡嗡聲填滿了整個空間。開放式辦公室在眼前展開——左側的工程團隊座位,右側的產品和設計,中間一條走道,盡頭是會議室。
他走到自己的位子。第二排靠窗,在方佑廷旁邊。
方佑廷的桌上有一個馬克杯,上面印著「Hello World」。那是他面試時帶進來的,說是要提醒自己「永遠從第一行開始」。林哲翰當時覺得這人很蠢。現在他看著那個馬克杯,喉嚨有點緊。
他坐下來,打開電腦。螢幕亮起,他看著桌面上的資料夾結構——跟記憶中一樣。專案資料夾、技術文件、會議記錄。他點開會議記錄,找到上週五的週會摘要。
趙品睿寫:「Demo時程確認,12/1交付投資方。」
12月1日。但在原始時間線,這個時程會在今天被提前到11月21日。五天後。
林哲翰關掉檔案,靠在椅背上。
他記得接下來會發生什麼。八點半,趙品睿會到公司,第一件事就是把他叫進會議室。然後趙品睿會說,投資方希望提前看demo,所以時程要壓縮兩週。然後他會看著林哲翰,等他點頭。
在原始時間線,林哲翰點了頭。
他為什麼點頭?因為他覺得團隊可以做到。因為他不想在趙品睿面前示弱。因為他需要這次募資成功——他的股票選擇權只有在公司拿到A輪之後才有價值。
他需要那筆錢。母親的膝蓋越來越差,醫生說要換人工關節,自費要二十幾萬。他算過,如果A輪拿到,他的選擇權變現,剛好夠。
所以他點了頭。然後方佑廷的code在壓力下出了問題。然後他把問題推給方佑廷。然後方佑廷走了。
林哲翰閉上眼睛。
辦公室的日光燈嗡嗡響。冷氣出風口在頭頂,吹得他後腦勺發涼。他聽到電梯門打開的聲音,有人走進來了。
「哲翰哥?你今天怎麼這麼早?」
他睜開眼。方佑廷站在走道上,背著一個灰色的後背包,手裡拿著一杯超商咖啡。他戴著眼鏡,臉很圓,笑起來有酒窩。
「睡不著。」林哲翰說。
「我也是,」方佑廷走到位子坐下,把背包掛在椅背上,「昨天那個API的unit test一直跑不過,搞到三點才睡。」
「哪個API?」
「JWT驗證那個。我覺得token過期邏輯有問題,但跑測試的時候又正常,很奇怪。」
林哲翰的手指停在鍵盤上。
JWT驗證。就是這個。
「你覺得有問題,為什麼測試跑得過?」他問。
方佑廷聳聳肩。「我也不知道。可能是測試覆蓋率不夠?我打算今天再仔細看一下。」
在原始時間線,方佑廷今天確實再看了。但他沒有找到真正的問題——因為真正的問題不是token過期邏輯,而是race condition。兩個請求同時進來,token驗證的狀態會被覆蓋,導致第二個請求可以用過期的token通過驗證。
這個問題在自動化測試裡測不出來,因為測試是單線程的。它只會在高並發的環境下出現。
而demo那天,投資方會同時發送多個請求。
「你等一下給我看一下。」林哲翰說。
方佑廷有點驚訝。「真的?你今天不是要準備週會?」
「給我看一下。」
方佑廷推推眼鏡,笑了一下。「好。」
林哲翰轉回螢幕。他的心臟跳得很快,但他讓自己的手保持穩定。
他記得所有事情。他知道漏洞在哪裡。他知道demo那天會發生什麼。他知道方佑廷會舉手說「這是我寫的code」,他知道趙品睿會看著他等他說話,他知道他會說「我提醒過他」。
但現在是星期一。漏洞還沒爆。方佑廷還在。
他還有五天。
八點半,趙品睿來了。
他穿著一件藍色襯衫,袖子捲到手肘,手裡拿著一杯星巴克。他走進辦公室的時候先掃了一圈,看到林哲翰,微微點個頭。
「哲翰,等一下來會議室。」
「好。」
林哲翰站起來的時候,感覺到方佑廷的目光。他沒有回頭。
會議室很小,六個人坐滿就顯得擠。趙品睿坐主位,林哲翰坐對面。中間是一張會議桌,上面有幾道咖啡杯的圓形水漬。
「投資方那邊有消息,」趙品睿開門見山,「他們希望提前看demo。」
「提前多久?」
「兩週。11月21號。」
林哲翰記得這句話。一個字都不差。
在原始時間線,他問了「這樣時程夠嗎」,趙品睿說「你們工程團隊應該可以處理」,然後他點了頭。
這次他沒有馬上回答。
趙品睿看著他,等他說話。
「兩週,」林哲翰重複了一次,「也就是五天後。」
「對。」
「現在的完成度大概七成。API層還有問題,前端也還沒串完。」
「我知道。但投資方那邊在跟另一家談,如果我們不能早點demo,可能會失去這輪。」
林哲翰知道這不是真的。投資方沒有在跟另一家談。趙品睿只是想要搶時程。但就算他現在說出來,趙品睿也不會承認。
「我需要跟團隊確認一下。」林哲翰說。
趙品睿的表情變了一下。很細微,但林哲翰看到了——在原始時間線他錯過了。
「你覺得做不到?」趙品睿問。他的語氣很平,但那個「你」字的重音不一樣。
「我需要確認。」林哲翰說。
沉默了大概五秒。
「好,」趙品睿說,「今天下班前給我答案。」
他站起來,拿起星巴克,走出會議室。
林哲翰一個人坐在會議室裡。他看著桌上那些咖啡漬,想起一件事。
在原始時間線,他點頭了。然後他告訴團隊時程提前,方佑廷問「這樣測試來得及嗎」,他說「我們沒有選擇」。然後方佑廷加班了三天,在壓力下寫了一個patch,那個patch沒有完整測試就上線了。
那個patch就是漏洞的根源。
林哲翰站起來,走回辦公室。
方佑廷正在看code,螢幕上開著一個terminal。許湘芸坐在右側,戴著耳機,正在跟誰通話。陳立偉在喝水,目光掃過林哲翰的臉,沒有說話。
林哲翰坐下來。他打開Slack,看著團隊群組的對話。在原始時間線,他會在十分鐘內發一則訊息告訴大家時程提前。
他沒有發。
他打開方佑廷的code repository,找到JWT驗證的模組。他開始讀。
方佑廷的code寫得不算差,但有一個問題——token驗證的狀態是存在記憶體裡的,沒有用lock保護。在低流量的時候不會有問題,但如果同時有多個請求進來,狀態會被覆蓋。
這個問題不難修。加一個lock就好了。但加了lock之後,效能會受影響,需要重新跑效能測試。而效能測試需要至少一天。
五天。
林哲翰靠在椅背上。
他可以做幾件事。第一,現在就把漏洞修掉,然後重新跑測試。但這需要至少一天,而demo是五天後。第二,告訴趙品睿時程不能提前。但趙品睿不會聽。第三,什麼都不做,讓事情按照原始時間線走,但這次他知道會發生什麼。
或者第四,他可以告訴方佑廷。
他轉頭看向方佑廷。這個24歲的年輕人正在皺眉看code,手指在鍵盤上敲幾下,停一下,再敲幾下。他的馬克杯放在右手邊,裡面的咖啡已經涼了。
林哲翰想起方佑廷在LinkedIn上寫的那段話。
他想起方佑廷看他那一眼。
他想起自己說的話:「我提醒過他。」
「佑廷。」
「嗯?」方佑廷轉頭。
「JWT那個問題,你今天能修嗎?」
「應該可以。我已經找到幾個可能的原因了。」
「找到之後直接跟我說,不要自己commit。」
方佑廷愣了一下。「為什麼?」
「我要review。」
「你平常不是都讓我自己處理嗎?」
林哲翰沒有回答。他轉回螢幕,假裝在看自己的code。
方佑廷看了他幾秒,然後轉回去,繼續敲鍵盤。
林哲翰看著螢幕上的code,但他一個字都沒有讀進去。
他還有五天。他不知道這五天夠不夠。他甚至不知道他想要什麼結果。
改變方佑廷的命運?還是改變自己的?
或者他只是想要再選一次,看看這次會不會不一樣。
辦公室的日光燈嗡嗡響。窗外的台北市正在醒來。林哲翰坐在自己的位子上,記得所有的事情,什麼都不能說。