← Lock

第 8 章:第八章:星期一(事件爆發後第一天)——霸凌的定義

志明不知道自己是怎麼從辦公室回到家裡的。

他記得的是:坐在位子上、看著 log、斯拉一下椅子、站起來。經過副總辦公室的時候,門是關著的。他沒有停。搭電梯、走出大樓、走了一段路——他不確定走了多久,可能是十分鐘,也可能是半小時。等他回過神來的時候,他已經站在自己家的門前,鑰匙插在鎖孔裡,轉了兩圈。

門開的時候,客廳的燈是暗的。雅婷在臥室裡,門關著。他看了一眼時間——凌晨一點四十分。

他沒有去臥室。他坐在玄關,鞋子沒有脫,就那樣坐了大概十分鐘。然後他站起來,走到客廳,打開筆電。

不是要看 code。是要看 Slack。

大衛在晚上十一點傳了:「Zhi哥,不是我跟副總說的。」

志明當時沒有回。現在他看著這則訊息,看了一遍,又一遍。

他打了一行字:「我知道。」

游標停在發送鍵上。

他想到大衛星期五經過他身邊時的樣子——低著頭,走得很快,像是在逃離什麼。那時候志明不知道大衛在逃離什麼。現在他知道了。大衛在逃離「是不是我害了 Zhi哥」這個問題的答案。

但大衛說「不是我跟副總說的」。

那是誰說的?

志明把那行字發出去。

然後他打開筆電,看著 Slack 上的訊息。從星期六下午三點到凌晨一點,未讀訊息累積到了七十幾條。大部分是 @channel 的通知,幾條是私訊。他一條一條點開,讀完,關掉。

副總在下午四點的時候在 #project-payment-gateway 上面發了一則訊息:

> 各位辛苦了。目前退款預計今天內會全部處理完成。後續的技術檢討我們下週再安排。

技術檢討。

志明看著這四個字。技術檢討。不是「復盤」,不是「事後分析」,是「技術檢討」。這四個字的潛台詞是:這是一個技術問題。技術人員的問題。

他關上筆電,去浴室刷牙。鏡子裡的自己看起來像另外一個人——頭髮塌了,眼睛下面有青黑的影子,下巴上有沒刮乾淨的鬍渣。他洗了臉,換了睡衣,走到臥室門口,猶豫了一下,最後還是推開了門。

雅婷躺在床上,側著身子,呼吸很輕。他輕手輕腳地上床,躺下來。

「回來了。」雅婷的聲音從黑暗中傳來。不是問句。

「嗯。」

「吃了嗎?」

「……吃了。」

他沒有吃。便當只吃了幾口雞腿,米飯幾乎沒動。但他說了「吃了」,因為他知道如果說「沒吃」,雅婷會起來幫他弄東西吃,而他不值得她這樣。

雅婷沒有再說什麼。

志明閉上眼睛。黑暗中,他看到的是 log。OrderConfirmationEmailSentOrderConfirmationEmailSentOrderConfirmationEmailSent。偶爾一行不應該出現的重複。像一首走調的歌,你知道哪裡不對,但你沒辦法讓它停下來。


星期日他睡到中午。

醒來的時候雅婷不在家。手機上有一則她的訊息:「我帶女兒去超市,電鍋裡有飯。」

他坐在餐桌前面吃了飯。白飯配肉鬆。他把飯吃完,把碗洗了,然後回到客廳,打開筆電。

他不確定自己為什麼要打開筆電。系統已經修了。退款已經在處理了。他應該休息。但他坐在沙發上,手指不自覺地打開了瀏覽器,搜尋自家的公司名稱。

第一個結果是那個科技部落格的報導。第二個結果是 PTT 的一篇文,標題是:「XX電商重複扣款,有人也被扣了嗎?」下面有六十幾則回覆,有人貼了銀行明細,有人說已經拿到退款,有人說客服态度很差。

他一篇一篇看。每一則留言都是一個人。一個真實的人,用信用卡買了一個東西,然後發現自己被扣了兩次錢,然後打電話給客服,等了二十分鐘,然後被告知「系統會自動退款,請等待三到五個工作天」。

三到五個工作天。

志明把瀏覽器關上。

他打開 GitHub,看著自己提交的那個 hotfix branch。hotfix/race-condition-lock。一個 commit,三個檔案變更——PaymentWebhookController.php 加上了 DB::transaction()lockForUpdate()PaymentService.php 加上了 idempotency key 的檢查,還有一個新的 migration 在 payment_logs 上加了一個 processed 的 boolean flag。

他花了四十秒 deploy 的 fix。但他知道,如果他在上週一加那個 lock,整個星期六都不會發生。

四十秒的改動。一個星期的災難。

他關上筆電。

雅婷回來了。女兒看到爸爸,跑過來抱住他的大腿。「爸爸!」

志明蹲下來,把她抱起來。她的臉軟軟的,有奶味。他把臉埋在她的頭髮裡,閉上眼睛。

「爸爸你怎麼了?」女兒問。

「沒事。」志明說,「爸爸沒事。」


星期一早上,志明八點半到公司。

他比平常早。不是因為他想早,是因為他睡不著。凌晨四點他就醒了,躺在床上聽雅婷的呼吸,聽窗外的車聲,聽自己的心跳。五點他放棄了,起來坐在客廳,打開筆電,把 production log 從頭到尾看了一遍。

沒有新的重複扣款。Fix 有效。

他到公司的時候,辦公室裡還沒有多少人。他走到自己的位子,打開電腦,開始處理上週累積的信件。

九點十五分,他的手機震了一下。

一則來自公司內部系統的通知:

> 您有一個會議邀請:面談(人資)

> 時間:今日 10:00

> 地點:7樓 人資辦公室

> 邀請者:黃經理

志明盯著這則通知看了大概十秒。

面談。人資。黃經理。

他站起來,走到茶水間,倒了一杯水。他站在飲水機前面,手握著紙杯,水滿了也沒有移開。水溢出來,流到他的手上。

他想到上週在會議室裡,黃經理坐在副總旁邊,在副總說「這個技術選型是志明全權決定的」的時候,她在紙上寫了什麼。

他不知道她寫了什麼。

但他知道「面談」這兩個字的意思。


七樓的人資辦公室在走廊的盡頭。志明上次來這裡是入職的時候,三年前。那時候他坐在同一張椅子上,填了一堆表格,黃經理站在旁邊,用一種很平穩的語氣說:「歡迎加入。」

現在他坐在同一張椅子上。黃經理坐在桌子對面,面前放著一台筆電和一杯茶。

「志明,謝謝你來。」黃經理的語氣跟三年前一樣平穩。不是冷漠,是一種訓練過的平穩——一種「我不會讓我的情緒影響這次對話」的平穩。

「嗯。」

「今天找你來,是因為上週的專案出了狀況,公司希望了解一下整個過程。」她翻開筆電,看了一眼螢幕。「我先說明一下,這次面談的目的是了解狀況,不是要追究責任。你不需要有壓力。」

志明沒有說話。

「我想先問一個問題,」黃經理說,「你在專案期間,有沒有收到團隊成員對技術選型的疑慮或反對意見?」

志明想了一下。

「有。」他說。「大衛在會議上提過,那個 Package 的 GitHub Issue 有 Race Condition 的報告。老張在……私下的時候也提過。」

「那你是怎麼處理這些疑慮的?」

「我……」志明停了一下。「我當時判斷前端加入 debounce 可以緩解這個問題,所以沒有在後端加入 lock。」

「所以你的意思是,你收到了疑慮,但你沒有採納。」

「不是沒有採納,是——」

他停了。

不是沒有採納。那是什麼?「覺得問題不嚴重」?「覺得時程來不及」?「覺得自己可以控制風險」?

每一個說法都是「沒有採納」的另一種講法。

「我當時判斷風險可控。」志明說。

黃經理在筆電上打了一些字。

「好。第二個問題。」她抬頭看他。「有同仁反應,你在專案期間要求團隊加班,製造了很大的壓力。你有什麼想說的?」

志明愣住。

「要求加班?」

「有同仁反應,你在專案接近尾聲的時候,要求團隊留下來加班,即使有人提出時程上的疑慮。」

志明回想。

他要求加班了嗎?

上週四晚上,他在 Slack 上說:「今天需要把 migration 跑完,大家辛苦了。」這是要求加班嗎?還是只是「告知進度」?

上週三晚上,大衛留下來修 migration 的 index,志明留下來陪他。他沒有叫大衛留下來。但大衛看到志明沒有走,他也沒有走。這算不算「要求」?

上週二晚上,小琪在 Slack 上說她前端遇到問題,志明說「沒關係,我們明天再處理」。但小琪還是留下來弄到十一點。志明知道,但他沒有說「你先回去」。這算不算「要求」?

「我……」志明說,「我沒有要求任何人加班。但我知道大家有留下來。我沒有阻止。」

「沒有阻止。」黃經理重複了這四個字,然後在筆電上打了一些字。

志明看著她的手在鍵盤上打字。劈劈啪啪。每一個字都像是被記錄下來的證據。

「黃經理,」志明說,「我可以問一個問題嗎?」

「你說。」

「反應的人是誰?」

「這個我不能告訴你。」

「那副總呢?」

黃經理的手停在鍵盤上。

「什麼?」

「副總把責任推給我,這算什麼?」志明的聲音比他自己預期的要平。不是因為他不生氣,是因為他太累了,累到連生氣都需要花力氣。「他在會議上說『這個技術選型是志明全權決定的』。但當初是他說『這件事你看著辦,我相信你的判斷』。這算什麼?」

黃經理沉默了一下。那個沉默大概只有三秒,但志明感覺得出來,那三秒裡面有很多東西在跑。

「林副總有他的管理考量。」她說。

志明聽著這句話。

林副總有他的管理考量。

這句話跟副總說的「我充分信任他」是同一種結構——一種把責任放在一個安全距離之外的結構。副總有他的管理考量。副總充分信任他。副總沒有錯。副總只是信任了一個做錯決定的人。

那個人是他。

「我了解了。」志明說。

黃經理繼續問了幾個問題。關於專案的時程、關於團隊的溝通、關於測試報告。志明一一回答。他的聲音很平,像在念一段他寫好的稿。

面談結束的時候,黃經理說:「謝謝你今天的配合。公司很重視職場霸凌的防治,如果屬實,我們需要進行調查。但目前只是了解狀況的階段,你不需要擔心。」

職場霸凌。

志明站在人資辦公室門口,聽著這四個字在他腦海裡回響。

職場霸凌。

他想起年初的性平教育訓練,黃經理站在會議室前面放投影片,用一種很平穩的語氣念:「職場霸凌的定義包括但不限於:持續性的冒犯、威脅、冷落、孤立、或過度要求,導致同仁在身心上受到損害。」

過度要求。

他過度要求了嗎?

他要求大衛留下來修 migration 了嗎?沒有。但大衛留下來了。

他要求小琪趕前端進度了嗎?沒有。但小琪趕了。

他要求老張配合嗎?老張從頭到尾都沒有配合。他也沒有對老張怎麼樣。

那他霸凌了誰?

還是說,他霸凌的方式不是「要求」,而是「沒有阻止」?沒有阻止大衛留下來。沒有阻止小琪趕工。沒有阻止整個團隊在一個有風險的時程裡面往前衝。

「沒有阻止」算不算霸凌?

他不知道。

他只知道,當黃經理說「有同仁反應你否決他們的疑慮、要求加班、製造壓力」的時候,他沒有辦法說「我沒有」。

因為他確實否決了大衛的疑慮。不是用「不行,你錯了」這種方式,而是用「先用了,有問題再說」這種方式。這兩種方式,結果是一樣的。大衛的疑慮被放在一邊了。

他確實沒有阻止加班。不是用「你留下來」這種方式,而是用「我也留下來」這種方式。這兩種方式,結果是一樣的。團隊留下來了。

他確實製造了壓力。不是用「你做不到就滾」這種方式,而是用「我相信你做得到」這種方式。這兩種方式,結果是一樣的。團隊感受到了壓力。

志明走在走廊上,經過一間一間的辦公室。門有的開著,有的關著。他看到裡面的人坐在位子上,面對螢幕,打字,打電話,開會。每一個人都看起來很忙。每一個人都看起來很正常。

他不知道是誰去跟人資說的。


他在樓梯間遇到大衛。

大衛從樓上來,手裡拿著一杯便利商店的咖啡。他看到志明,腳步頓了一下。

「Zhi哥。」

「嗯。」

他們面對面站在樓梯間。日光燈在頭頂嗡嗡地響。

「Zhi哥,不是我說的。」大衛說。他的聲音比平常小,眼睛沒有看志明,而是看志明肩膀後面的某個地方。「人資沒有跟我面談過。我不知道是誰說的。但我沒有去反應。」

志明看著他。

大衛二十八歲,年資兩年。他剛進公司的時候,是志明帶他的。教他 Laravel 的 Service Container、教他怎麼寫 migration、教他怎麼在 Git 上面開 branch。那時候大衛叫他「Zhi哥」,眼睛裡面有一種很亮的東西——不是崇拜,是一種「我想變成你這樣的人」的東西。

現在那個東西沒有了。

現在大衛的眼睛裡面是一種很複雜的東西——自責、恐懼、還有一點點憤怒。不是對志明的憤怒,是對整件事情的憤怒。一種「為什麼會變成這樣」的憤怒。

「我知道。」志明說。

「你知道?」

「嗯。」

大衛看著他。他的嘴唇動了一下,像是想說什麼,但最後只是點了一下頭。

「Zhi哥,」大衛說,「那個測試報告——」

「我知道。」志明打斷他。「不是你的錯。」

大衛低下頭。他的手指在便利商店的咖啡杯上收緊,杯壁微微變形。

「我應該在會議上說得更大聲一點。」大衛說。

志明沒有回答。

因為他知道,就算大衛說得更大聲,他可能還是不會聽。不是因為他覺得大衛是錯的,而是因為他當時已經決定了。他決定用那個 Package。他決定不延期。他決定「先用了,有問題再說」。

大衛說得再大聲,也改變不了一個已經決定的人的決定。

除非那個人自己改變。

「大衛,」志明說,「你覺得我有沒有霸凌你?」

大衛抬起頭。他的表情不是驚訝,是一種更複雜的東西——像是這個問題他已經想過很多次了,但從來沒有想過會從志明嘴裡問出來。

「什麼?」

「霸凌,」志明說,「你覺得我的管理方式,有沒有對你造成壓力?」

大衛沉默了大概五秒。

「我不知道。」他說。「有時候我覺得壓力很大。但我不確定那個壓力是你給的,還是……整個環境給的。」

整個環境。

志明聽著這四個字。

整個環境。時程是整個環境給的。技術選型的壓力是整個環境給的。加班的文化是整個環境給的。副總的「我相信你」是整個環境給的。

那他呢?他是這個環境的一部分,還是這個環境的受害者?

還是兩者都是?

「我知道了。」志明說。

他轉身走下樓梯。

「Zhi哥。」大衛在後面叫他。

志明停下來,沒有回頭。

「我相信你當初的判斷是有原因的。」大衛說。

志明站在樓梯上,背對著大衛。

他不知道該怎麼回應這句話。

大衛說「我相信你」。副總也說「我相信你」。但這兩個「我相信你」聽起來完全不同。副總的「我相信你」是在出事之後說的,是一個免責聲明。大衛的「我相信你」是在出事之後說的,是一個……

一個什麼?

志明不知道。

他繼續走下樓梯。


他回到位子的時候,看到桌上放了一張便利貼。

不是小琪的字。是副總的字——那種一筆一劃、很工整的字:

> 志明,下午兩點來我辦公室一趟。 林副總

志明把便利貼撕下來,看了兩秒,打開抽屜放進去。

他打開 Slack,看著 #project-payment-gateway 的訊息。最後一則訊息是副總在昨天發的:「技術檢討我們下週再安排。」

下週。

他打開 GitHub,看著那個 hotfix branch。hotfix/race-condition-lock。他忽然想到一件事:這個 branch 還沒有被 merge 到 main。他上週六 deploy 的時候是直接從這個 branch deploy 的,但後來沒有做 merge。

他打開 GitHub,點下 merge 按鈕。

綠色的 check mark。Merge 完成。

一個四十秒的改動。一個星期的災難。一個 merge button。

他關上 GitHub,打開 production log。

[2024-06-17 09:45:12] production.INFO: OrderConfirmationEmailSent {"order_id":18234}
[2024-06-17 09:45:13] production.INFO: OrderConfirmationEmailSent {"order_id":18235}
[2024-06-17 09:45:13] production.INFO: OrderConfirmationEmailSent {"order_id":18236}

正常。沒有重複。

他靠回椅背上,閉上眼睛。

他想到黃經理說的話:「有同仁反應你否決他們的疑慮、要求加班、製造壓力。」

他想到大衛說的話:「我不確定那個壓力是你給的,還是整個環境給的。」

他想到副總說的話:「這個技術選型是志明全權決定的。我當時充分信任他。」

三句話。三個角度。三種「真相」。

黃經理的「真相」是:志明否決了疑慮、要求了加班、製造了壓力。

大衛的「真相」是:壓力很大,但不知道是誰給的。

副總的「真相」是:志明全權決定,副總只是信任他。

哪一個是真的?

也許都是。也許都不是。

志明睜開眼睛,看著天花板。日光燈管上面沒有飛蛾的屍體——那是上週六在辦公室看到的。這裡是辦公室,不是會議室。這裡的日光燈管是乾淨的。

他拿出手機,打開 Slack,看著大衛在十分鐘前傳的訊息:

> Zhi哥,不是我說的。

他回了:「我知道。」

然後他打了一行字:「但不管是誰說的,那些事情確實存在。」

他看著這行字,游標在發送鍵上停留了很久。

最後他刪掉了。

他把手機放下,打開筆電,開始寫信。不是給副總,不是給黃經理,不是給團隊。是給自己。

他打了一行字:

> 我不知道我是不是霸凌者。

然後他停下來,看著這行字,看了很久。

他想到黃經理說的「職場霸凌的定義」。持續性的冒犯、威脅、冷落、孤立、或過度要求。

他有沒有一直這樣做?還是只有在專案期間?

他「沒有阻止」大衛加班,是「冷落」嗎?

他「沒有採納」大衛的疑慮,是「冒犯」嗎?

他「沒有拒絕」副總的時程要求,是「過度要求」嗎?

還是說,這些都只是「管理」?只是「在壓力下做決定」?只是一個夾在上級和下屬之間的主管,在有限的資訊和時間裡面,做了他認為最好的選擇?

他不知道。

他只知道,當黃經理說「有同仁反應你否決他們的疑慮」的時候,他沒有辦法說「我沒有」。

他確實否決了。

不是用「不行」這種方式,而是用「先用了,有問題再說」這種方式。

而「先用了,有問題再說」這八個字,從他嘴裡說出來的時候,聽起來像是判斷。但現在回想起來,聽起來更像是——逃避。

逃避「如果要求延期,副總怎麼看我」這個問題。

逃避「如果承認有風險,我就不夠果決」這個恐懼。

逃避「如果停下來,所有人都會看到我在猶豫」這個想像。

他逃避了。然後他讓整個團隊跟著他一起逃避。

這算不算霸凌?

志明不知道。

他只知道,當副總說「我充分信任他」的時候,他感覺到的不是被信任,是被丟棄。而當黃經理說「有同仁反應你製造壓力」的時候,他感覺到的不是被指責,是困惑。

因為他從來沒有想過,自己的決定會影響到別人。

不是「知道但忽略」。是「從來沒有想過」。

他以為他在扛責任。但他只是在扛自己。

他以為他在保護團隊。但他只是在保護自己「看起來像一個好主管」的想像。

他以為「先用了,有問題再說」是務實。但現在看起來,那只是把問題留給別人。留給大衛、留給小琪、留給那 203 個被重複扣款的客戶。

志明把筆電蓋上。

他看了一眼時間。十一點四十分。距離下午兩點和副總的面談,還有兩個小時二十分鐘。

他站起來,走到茶水間。老張在那裡。

老張正在倒茶。他看到志明進來,沒有說話。

他們站在茶水間裡面,一個在倒茶,一個在倒水。飲水機的壓縮機在牆角嗡嗡地響。

「老張,」志明說。

老張沒有看他。

「上禮拜你說的那些,是對的。」

老張把保溫杯蓋上,轉過身,看了志明一眼。

那個眼神不是「我早就說了」。也不是「你現在才知道」。

那個眼神是一種很安靜的東西。像是一個已經把所有話都說完了的人,在等對方自己聽懂。

老張拿著保溫杯,走了。

志明站在茶水間,手握著紙杯,水已經涼了。

他低頭喝了一口。

水是溫的,不冰也不熱。

他站在那裡,聽著飲水機的壓縮機聲,聽著辦公室隱約的鍵盤聲,聽著自己的心跳。

然後他走回位子,坐下來,打開筆電。

下午兩點,他要去見副總。

他不知道副總要說什麼。但他知道,不管副總說什麼,他都會坐在那裡,聽完,點頭,然後走出來。

就像他這輩子做過的大部分事情一樣。

聽完。點頭。走出來。

然後繼續。

他打開 Slack,看著那個專案的群組。最後一則訊息是副總的:「技術檢討我們下週再安排。」

他打了一行字:

> 大家,對不起。

游標停在發送鍵上。

他看了五秒。

然後他刪掉了。

不是因為他不想說。是因為他不知道「對不起」之後要接什麼。

對不起,我做了錯誤的決定?

對不起,我沒有聽你們的?

對不起,我把你們拖下水了?

每一句都對。每一句都不夠。

他把 Slack 關上,靠在椅背上,閉上眼睛。

日光燈的光穿過眼皮,在他的視線裡形成一片模糊的橙紅色。

他想起雅婷上週說的話:「你在公司扛的那些東西,是真的必須扛的,還是你自己覺得必須扛的?」

他當時沒有回答。

現在他還是不知道怎麼回答。

但他開始想這個問題了。

這算不算一種改變?

他不知道。

他只知道,下午兩點,他要去見副總。而副總會說什麼,他已經知道了。

副總永遠有他的管理考量。


(第八章 完)

8507 字 •