林夕奮鬥多年,依然是個普通的程式設計師,一天晚上,已經淩晨3點了,因為要上線,林夕依然戰鬥在電腦前,突然感覺眼前一黑,就什麽都不知道了,醒來時候回到了大學畢業去新公司報到的那個夏天,林夕腦海中殘留著爺爺小時候的教導和熟讀的《孫子兵法》,林夕心裏默唸,這一世我要不一樣的活法。
七月盛夏,梧桐樹上的蟬鳴聲幾乎要穿透寫字樓的玻璃幕牆。
林夕站在“星雲科技”大廈樓下,抬頭望著這座二十八層的建築。陽光在藍色玻璃上反射出刺眼的光斑,他眯了眯眼,將肩上的黑色雙肩包往上提了提。包裏除了膝上型電腦和入職材料,還有一本邊角磨損的《孫子兵法》——祖父去年過世前留給他的唯一物件。
“你就是新來的管培生?”前台姑娘掃了一眼他簡單的T恤牛仔褲,語氣裏帶著程式化的熱情,“周經理交代了,你直接去三樓技術部找他。”
電梯裏擠滿了上班族,空氣裏混雜著咖啡和早餐的味道。林夕站在角落,透過電梯鏡麵看著自己——普通的長相,普通的穿著,和周圍那些衣著考究、戴著AirPods討論KPI的精英們格格不入。他深吸一口氣,想起祖父的話:“第一次上班就和上戰場一樣,要多看,多聽,少說。”
技術部的玻璃門自動滑開,開放式辦公區裏鍵盤聲此起彼伏。巨大的顯示屏上跳動著程式碼和圖表,空氣中飄著紅牛和熬夜的味道。
“林夕?這邊!”
聲音來自最靠窗的工位區。一個三十出頭、穿著熨帖的淺藍襯衫、戴金絲邊眼鏡的男人站起身,臉上掛著恰到好處的笑容。
“周凱師兄。”林夕快步走過去,盡量讓自己的聲音聽起來自然些。他們是高中校友,周凱比林夕高一級,他們在高中的學校隻見過幾麵——周凱作為傑出校友回校講座時,林夕坐在最後一排提問過。
“別這麽見外,以後就叫凱哥。”周凱拍拍他的肩,力度不輕不重,“張總特意交代,讓我好好帶你。咱們學校出來的,得互相照應。”
這話說得漂亮,周圍幾個程式設計師都抬頭看了一眼。
周凱領著林夕在辦公區轉了一圈,介紹了幾個組長,最後停在一個角落的工位前。這個位置背對窗戶,下午西曬,而且緊鄰茶水間和印表機——人來人往,很難安靜。
“你先坐這兒。雖然偏了點,但方便你熟悉環境。”周凱笑著說,然後彎腰壓低聲音,“管培生輪崗,每個部門三個月。技術部是起點,也是最重要的鍛煉機會。你得做出成績,後麵纔好安排。”
林夕點頭:“謝謝凱哥,我會努力。”
“這就對了。”周凱扶了扶眼鏡,“對了,你現在手頭沒什麽緊急任務,先熟悉一下公司的程式碼庫。咱們有個曆史專案,‘會員積分係統’,程式碼在SVN的legacy分支裏。你可以看看,學習一下前輩們的架構思路。”
他說這話時語氣輕鬆自然,彷彿真的在給新人安排學習任務。
等周凱離開後,林夕開啟電腦,登入公司內網,找到那個傳說中的legacy目錄。當SVN同步完成,他點開專案結構時,手指在觸控板上停住了。
這根本不是“學習資料”。
這是一個典型的、教科書級的“屎山”程式碼庫——七年前開始開發,經過至少四代程式設計師之手,沒有任何完整的檔案。目錄結構混亂,檔名隨意,一個Java類檔案長達三千行,裏麵塞滿了已經被注釋掉但不敢刪除的程式碼。資料庫連線字串硬編碼在五個不同的配置檔案裏,而每個檔案的密碼還不一樣。
林夕花了半小時,才勉強理清這個係統有哪幾個主要功能模組。他又嚐試在本地環境啟動專案——這花了他一個半小時,因為需要安裝三個已經停止維護的舊版框架,還要手動修改本地資料庫的設定。
當專案終於跑起來時,控製台裏刷出了四十七條警告和三個錯誤。係統功能倒是能用,但慢得像90年代的撥號上網。
“新來的?”隔壁工位探過來一個腦袋,是個頭發淩亂、眼圈發黑的年輕程式設計師,工牌上寫著“趙磊”,“在看那個積分係統?”
“嗯。凱哥讓我學習一下。”
趙磊露出一個“你懂得”的表情,壓低聲音:“學習?那是咱們部門的‘鬼見愁’。上週王哥想改個功能,折騰兩天差點把自己搞崩潰,最後說‘寧可重寫也不再碰了’。這玩意兒誰敢動?一動就崩,一崩就查不出原因。”
“這麽嚴重?”
“不止。”趙磊湊得更近些,“這裏頭埋著至少三個線上出過事故的坑,但沒人敢去填。去年‘雙十一’,積分兌換功能崩了兩小時,就是因為它。後來緊急打了個補丁,勉強撐過去,但根源問題還在。”
林夕盯著螢幕上那些層層巢狀的if-else語句,忽然有點明白了周凱的用意。
這不是照顧,這是考驗——或者說,這是一個精心挑選的泥潭。做得好,那是他分內之事;做不好,就是能力不足。而且這種陳年舊賬,做好了功勞不大,做壞了責任不小。
《孫子兵法·形篇》裏的話浮現在腦海:“昔之善戰者,先為不可勝,以待敵之不可勝。”
在形勢不明、敵我未分的時候,首先要確保自己立於不敗之地。
林夕開啟筆記本,翻到空白頁,拿起筆開始梳理:
一、目標分析:
1. 短期:存活下來,不被這個專案拖垮。
2. 中期:摸清係統全貌,建立完整的檔案和問題清單。
3. 長期:尋找安全、漸進的重構機會。
二、資源評估:
1. 時間:三個月輪崗期,不能全部耗在這裏。
2. 許可權:隻有讀取許可權,沒有直接修改生產環境程式碼的資格。
3. 知識:需要補完係統涉及的所有老舊技術棧。
三、風險評估:
1. 貿然修改可能引發線上事故。
2. 投入過多時間可能影響其他輪崗任務。
3. 過早暴露能力可能成為焦點,失去觀察環境的機會。
他停下筆,又想到《作戰篇》的一句話:“不盡知用兵之害者,則不能盡知用兵之利也。”
不瞭解這件事的全部危害,就不可能真正把握其中的機會。
這個爛攤子,是陷阱,但也可能是他在技術部的第一塊踏腳石,是一個機會。
下午四點,周凱端著咖啡杯踱步過來:“怎麽樣,看得明白嗎?有什麽問題可以問我。”
林夕抬起頭,臉上是恰到好處的、略帶困惑的誠懇:“凱哥,這係統確實挺複雜的。我大概理了理模組,但有些業務邏輯看不太懂。比如這個積分過期規則,好像分散在四個地方處理?”
周凱眼裏閃過一絲驚訝——半天時間能理清模組並發現規則分散的問題,這已經超過了很多老員工的水平。但他很快恢複笑容:“曆史遺留問題嘛。你有空可以整理個檔案,記錄下來也是學習。”
“好的凱哥。”林夕點頭,然後像是忽然想起什麽,“對了,我下午試著在本地跑了一下係統,發現控製台有幾處錯誤。我看日誌好像是資料庫連線池配置的問題,會不會影響線上?”
這個問題問得很有分寸——既展示了工作進展(實際執行了係統),又表達了對生產環境的擔憂(責任心),還把問題限定在技術細節上(不涉及對專案質量的直接批評)。
周凱的咖啡杯在空中停了半秒:“哦,那個啊……應該沒事,線上環境配置不一樣。你繼續看,有不懂的隨時問。”
他轉身離開時,腳步比來時快了些。
下班時已經晚上八點。林夕關掉電腦,走到窗邊。城市的燈火次第亮起,樓下街道的車流匯成光河。
手機震動,是母親發來的微信:“新工作第一天怎麽樣?別太累,記得吃飯。”
他回複:“挺好的,同事很照顧。剛下班,這就去吃。”
走出大廈時,他回頭望了一眼。二十八層樓的燈光在夜色中格外醒目,其中三樓的某個視窗還亮著——那是周凱的獨立辦公室。
林夕想起祖父教他下象棋時說的話:“你看這棋盤,車馬炮擺在明處,但真正決定勝負的,往往是那些還沒過河的卒子。”
他把揹包往上提了提,那本《孫子兵法》在包裏沉甸甸的。
第一步已經邁出,雖然踩進的是泥潭。
但泥潭裏,也能找到站穩腳跟的石頭。
就在他走向地鐵站時,手機郵箱提示音響起。他點開一看,是一封係統自動傳送的SVN變更通知——有人剛剛向“會員積分係統”的程式碼庫裏,提交了一個小小的、看似無關緊要的配置檔案修改。
提交人:Kai.Zhou。
修改備注:修複測試環境資料庫連線超時引數。
林夕的腳步慢了下來。他記得很清楚,那個配置檔案裏根本沒有什麽連線超時引數。周凱在這個時候修改那個專案的程式碼,是想測試他會不會監控倉庫變動,還是另有深意?
夜色漸深,地鐵口的風帶著白日未散的暑氣。
他站在人流中,第一次真切地感受到,這片寫字樓玻璃幕牆圍起來的戰場,規則遠比程式碼世界複雜得多。
而戰爭,在他還沒完全準備好時,就已經悄然開始了。