第5章 筆試
第二天早上七點二十,林深提前十分鐘出現在飛訊辦公室。
他像個獵手,精準的等待獵物。
七點二十五,老吳出現在辦公室,他先是給自己沖泡了杯速溶咖啡,然後對著電腦屏幕皺眉,屏幕上大概又是哪個改不完的bug列表。
林深起身,用指節不輕不重地敲了敲門。
「進。」老吳頭也沒抬。
林深推門進去,站在那張堆滿文件的辦公桌前。老吳這才抬眼看他,眉頭立刻習慣性地皺起來:「有事?晨會馬上開始了。」
「吳經理,」林深的聲音平靜得有點不像他這個年紀該有的樣子,「昨天部署的那個監控工具,在夜間低負載環境下運行數據我分析過了,基本平穩。
但我懷疑它在早高峰並發場景下可能有隱藏問題——比如緩衝區競爭或者鎖粒度不合適。我需要去機房做實地壓力觀測,最好能抓到底層的包交互原始數據。」
老吳放下咖啡杯,盯著他看了好幾秒:「現在?馬上要開晨會了,今天還有三十多個bug要分。」
「問題可能只在特定時間窗口出現。」林深語調依然平穩,「現在不去抓數據,等到明天早高峰萬一真出問題,又得全組熬夜。當然,如果您覺得等出了問題再救火更符合團隊節奏,那我現在就回去參加晨會。」
他說完,靜靜等著。
老吳的手指在桌面上敲了敲,發出「嗒、嗒、嗒」的悶響。他看看林深,又看看電腦屏幕上那片紅色的bug列表,最後煩躁地揮了揮手:「行行行,去吧去吧。記住,只讀權限,別碰任何生產配置!」
「明白。」
林深走回自己工位,從抽屜里拿出了書包,裡面裝了他的個人筆記本電腦、充電器和一瓶水,他又在工位上抓起白紙和筆,慢條斯理地拉好拉鏈,然後在一片鍵盤敲擊聲中穿過辦公區,走向樓梯間。
機房的金屬門在身後「咔嗒」一聲合上。
世界瞬間換了種聲音。
幾十台伺服器風扇低沉持續的嗡鳴像某種巨型生物的呼吸,密集的指示燈明滅閃爍,空氣里是微弱的臭氧味和金屬散熱片特有的氣息。
這裡的溫度比外面高至少五度。
但林深沒的選,他在角落找到一個運維用的臨時工位,打開機房電腦,又打開了自己的筆記本電腦。
【當前位置:飛訊科技-伺服器機房】
【環境係數:0.4】
和辦公區一模一樣。
林深看著那個數字,扯了扯嘴角。系統果然冷酷——就算待在離公司「心臟」最近的地方,只要做的事本質還是重複性維護,係數就不會變。
他看了眼時間:七點四十。
距離上午十點的筆試還有兩小時二十分鐘。
系統界面另一行顯示:
【摸魚幣餘額:0.3】
他需要湊夠1幣,才能用【子彈時間·初級】,也就是說,還需要0.7幣,105有效摸魚時間。
夠用!
林深在終端里輸入幾條監控命令,讓伺服器日誌和數據流在屏幕上開始滾動,然後他把身體往後一靠,轉椅發出「吱呀」一聲呻吟,他把雙腳抬起來,直接架在旁邊一台閒置的伺服器機箱上,鞋底蹭著機箱表面冰涼的金屬。
姿勢放鬆得像在自家沙發上。
【檢測到有效摸魚時間:0.1小時……】
摸魚時間開始累計,林深在腦海中複習著昨天【快速歸檔】整理過的那些知識點。
9點半,機房門被老吳第二次推開。
老吳走了進來。
他先是習慣性地抬頭看了看牆上的監控大屏——上面滾動著各伺服器CPU、內存、網絡流量的實時曲線。確認所有指標都在綠色區間後,他才把目光移向機房深處。
然後他的腳步頓住了,這小子在偷懶?不對……
只見角落那台掉漆的鐵桌子前,林深正以一種極其怪異的姿勢癱在轉椅上:頭向後仰著,脖子彎成幾乎九十度的角度,喉結突兀地凸出來;眼睛半睜半閉,目光渙散地盯著天花板上某塊污漬;嘴唇在輕微翕動,念念有詞卻聽不清內容;兩隻手垂在身體兩側,手指卻像彈鋼琴似的在空氣里一下下敲著,仿佛面前有架看不見的鍵盤。
更讓老吳心裡發毛的是林深臉上的表情。
嘴角向上翹著,是個笑的模樣,但眼睛裡沒有一點笑意,反而空洞得嚇人。整張臉在螢光燈下泛著一種不健康的青白,配上那渙散的眼神和神經質的手指動作,活像個……沉浸在自己世界裡出不來的瘋子。
「林深?」老吳試探著叫了一聲,聲音在空曠的機房裡顯得有些虛。
沒反應。
老吳皺著眉走近幾步,提高音量:「林深!」
林深猛地轉過頭。
動作快得像個彈簧,脖子發出「咔」的一聲輕響。他的眼睛瞬間聚焦,瞳孔收縮,直直盯在老吳臉上。那眼神亮得反常,像燒著兩簇幽暗的火,看得老吳下意識往後退了半步。
「吳經理。」林深開口,聲音有點沙啞,卻透著一股壓不住的興奮,「您來得正好,我發現了一件特別有意思的事。」
老吳被他看得心裡發毛:「什、什麼事?」
「您看這台伺服器,」林深指著旁邊一台正在低鳴的戴爾機架伺服器,手指幾乎戳到機箱外殼上,「我監控了它半個小時的風扇轉速曲線和TCP重傳率波動,您猜怎麼著?」
老吳盯著那台黑乎乎的機箱,完全不知道該怎麼猜。
「存在一種奇妙的相位差!」林深自己揭曉答案,聲音因為興奮而微微發顫,「風扇每加速一次——嗡!三百毫秒後,網絡棧的緩衝區就會有一次微小的溢出傾向。您看這個圖。」
他迅速在鍵盤上敲了幾下,屏幕跳出一張紅綠交織的波形圖。
「這兩個波形的峰值,永遠差三百毫秒。嚴絲合縫,分秒不差!」林深轉過身,眼睛亮得嚇人,「吳經理,您說這是不是某種共振效應?機械振動傳導到主板,影響了網卡晶片的電氣穩定性?還是說……這棟樓的地磁場有什麼異常?」
老吳盯著屏幕上那些起伏的曲線,完全看不懂。他只能看見林深那張因為激動而泛紅的臉,那雙亮得不正常的眼睛,還有那揮舞著手臂、語速越來越快的樣子。
「更妙的是,」林深突然壓低聲音,身體前傾,像要分享什麼驚天秘密,「吳經理,您知道嗎?這就像人生!」
老吳徹底懵了:「……什麼像人生?」
「丟包啊!」林深雙手一攤,像個在街頭布道的狂熱信徒,「一個數據包發出去了,沒收到ACK。它可能是真丟了,永遠到不了對端;也可能只是延遲了,正在某個路由器的隊列里排隊,過一會兒就能到——就像你付出的努力,不一定馬上有回報,可能只是時機未到。」
他站起來,在狹窄的過道里踱步,手指在空中劃著名看不見的軌跡:「但如果你不停地重傳,發一個包,等兩百毫秒,沒回應,再發,再等……系統就會擁塞,帶寬就會被占滿,真正重要的數據反而過不去。人生也是這樣啊,如果你對一件事執念太深,不停地『重傳』,不停地強求,生活就會陷入死循環,其他重要的可能性反而被堵死了……」
他說得手舞足蹈,眼神飄忽,臉上泛起一種病態的紅暈。
老吳張著嘴,完全接不上話。
他看著眼前這個實習生:袖子卷到肩膀,頭髮因為激動而有些凌亂,眼睛亮得像要燒起來,嘴裡說著他完全聽不懂的「技術哲學」,他心裡此時只有一個念頭:
這小子……是不是連續加班加瘋了?
不對啊,這兩天他都是正常下班……
「所以有時候,」林深突然停下來,轉過身,直直盯著老吳,「得學會放手。讓該丟的包丟掉,讓該走的人走掉。系統會自己調整擁塞窗口,人生……也會自己找到出路。您說對不對,吳經理?」
老吳喉結動了動,乾巴巴地說:「你……你先把該乾的活兒幹完。這些……這些玄乎的東西,少想點。」
「幹活?對,幹活。」林深咧嘴笑起來,那笑容燦爛得有些過頭,「我一定『好好』幹活。畢竟工作是為了生活嘛。但是吳經理——」
他往前湊了湊,壓低聲音,像在說什麼了不得的秘密:
「您有沒有想過,如果生活本身就成了工作,起床是上班,吃飯是加油,睡覺是關機維護……那我們到底在為什麼而活呢?就為了明天繼續起床『上班』嗎?」
老吳被他問得頭皮發麻。
他覺得林深今天格外不對勁,但又說不出具體哪裡不對——人家確實在「工作」,屏幕上是監控數據,嘴裡說的也好像跟技術有關,就是那狀態……那眼神……那笑容……
瘮得慌。
「……你繼續吧。」老吳最終選擇了撤退。他轉身,腳步比來時快了不少,幾乎是逃也似的走向機房門口。
走到門邊時,他還是忍不住回頭看了一眼。
林深已經重新癱回了轉椅上。頭仰著,脖子彎成那個怪異的角度,眼睛盯著天花板,手指又在空氣里一下下敲著。嘴裡念念有詞,臉上掛著那種似笑非笑的表情。
像個沉浸在自我世界裡、完全與外界隔絕的瘋子。
老吳心裡嘀咕著推門離開,決定今天下班前不再來機房了,眼不見為淨。
機房門「咔嗒」一聲合上。
林深臉上的「瘋癲」表情瞬間收斂。
他坐直身體,揉了揉後頸——剛才那個姿勢保持久了,脖子確實有點酸。然後他看了一眼系統界面:
【檢測到有效摸魚時間:0.8小時】
【摸魚幣+0.32】
【累計摸魚幣:1.02】
剛才和老吳扯淡也被算在了摸魚里,完美!
要不是怕老吳在他筆試時進來,他還真不演這一出,夠癲的!
九點五十五分,筆記本連上手機網絡。
九點五十八分,打開瀏覽器,輸入騰訊筆試系統的網址。
九點五十九分,登錄——帳號密碼他早就背熟了。
十點整,筆試頁面準時刷新。
第一部分,計算機基礎,30道選擇題。
林深掃了一眼題目,嘴角扯了扯。大部分都是死記硬背的東西:OSI七層模型每層的功能、進程和線程的區別、死鎖的四個必要條件……對他來說,這些知識點就像呼吸一樣自然。
二十二分鐘後,第一部分完成。
系統自動跳轉到第二部分:邏輯推理,20題。
圖形推理、數字序列、語言邏輯……林深遇到第三題時卡住了——那是一道複雜的立方體展開圖旋轉題。他盯著屏幕看了半分鐘,直接點了「標記,稍後回答」。
跳過去。
他做得很從容,甚至有點……享受。每解出一道題,他就在心裡對自己說:看,這就是不用加班、不用改「按鈕向左移2像素」的bug、不用聽老吳吼叫的生活。純粹的邏輯,乾淨的思維,多好。
四十五分鐘時,前兩部分全部完成。
系統跳轉到編程題環節。
第一道:給定一個字符串,找出其中最長的回文子串。
經典題。林深幾乎不用思考,手指就在鍵盤上飛起來。他寫了一個中心擴展算法,時間複雜度O(n²),空間O(1)。寫完後,他想了想,又在注釋里加了一段:
「如果字符串長度超過10^6,建議使用Manacher算法,時間複雜度可降至O(n)。但考慮到本題明確說明輸入規模較小,且Manacher算法實現較複雜、可讀性差,故採用更易於理解和維護的中心擴展法。」
這既展示了知識面,又體現了工程權衡。
第二道:兩數之和的變種,找出數組中所有不重複的和為目標值的元素對。
又是昨晚重點複習過的題型。林深先排序,再用雙指針,同時小心處理重複元素。代碼寫完,他特意測試了幾個邊界用例:空數組、所有元素相同、目標值比所有元素都小……
十一點零五分,兩道編程題提交。
系統最後一次跳轉。
最後一道題:系統設計。
題目描述簡潔得讓人心悸:「設計一個簡易的即時通訊系統,支持一對一文本消息發送。請從客戶端、伺服器、協議、存儲等角度簡要闡述你的設計思路,並重點說明如何保證消息的可靠投遞。」
林深盯著這行字,沉默了很久。
機房的嗡鳴聲在耳邊持續。
他有答案。他太有答案了——前世在微信團隊七年,參與過消息系統從簡單到複雜、從單機到分布式的整個演進過程。他知道每一個坑在哪裡,每一種權衡背後的代價,每一次架構升級的痛苦。
但他不能寫。
現在是2010年。iPhone 4剛剛發布,Android 2.2還叫Froyo,行動網路主要是2G和初生的3G,智慧型手機普及率還很低。他不能把2018年的微信架構直接搬過來。
他需要寫一個「2010年的聰明人會想出來的方案」。
一個符合當時技術現實、卻又隱約透出一點前瞻性的方案。
一個既紮實、又有點「小聰明」的方案。
林深開始敲字。
他寫得很快,但很克制:
客戶端:基於TCP長連接,心跳保活(30秒一次),斷線自動重連(指數退避)。
伺服器:簡單的連接管理(用字典存userId->socket映射),消息路由(查字典轉發),消息先存內存隊列,再異步刷到磁碟文件。
協議:自定義二進位協議,包頭包含消息類型、長度、序列號、發送者、接收者、時間戳。
可靠投遞:發送方等待伺服器ACK,伺服器存儲成功後回ACK,接收方收到後回送達回執。每個環節都有超時重傳,最多三次。
寫到這裡,他停下來。
他看著屏幕上自己寫的東西,眉頭慢慢皺起來。
太普通了。
這就像一份教科書式的標準答案,每個學過網絡編程的大學生都能寫出來。挑不出錯,但也絕不會讓人記住。
他需要一點……不一樣的東西。
林深看了眼時間:十一點二十分。還剩四十分鐘。
他看了眼系統界面:
【摸魚幣餘額:1.02】
【可用技能:子彈時間·初級(1幣/次)】
用。
【是否使用子彈時間·初級?消耗1摸魚幣,持續5分鐘。】
【是】
一瞬間,世界變了。
不是時間停止,而是……思維的速度被強行拔高了一個維度。
耳邊伺服器群的嗡鳴聲陡然退遠,變得像隔著厚厚的水層,模糊而緩慢。眼前屏幕上的文字卻異常清晰,每一個像素都銳利得刺眼,光標每秒一次的閃爍慢得像在呼吸。
但他的思維在狂奔。
前世那些記憶碎片——技術討論會的爭吵、架構文檔的版本變遷、線上事故的復盤報告——此刻不再是零散的畫面,而是被某種無形之力串聯、編織,形成一張立體的知識網。
他想到了幾個關鍵點:
移動特性。現在是2010年,智慧型手機正在崛起。設計不能只考慮穩定的Wi-Fi環境,還要考慮蜂窩網絡的不穩定、高延遲、頻繁切換。可以在協議頭裡加一個「網絡類型標記」(Wi-Fi/3G/2G),客戶端根據這個標記決定一些行為——比如在2G下,不發大的圖片預覽;在電量低於20%時,主動告訴伺服器「進入節電模式」,讓伺服器延遲非緊急消息的推送。
狀態同步的簡化。當時的IM系統,比如手機QQ,喜歡搞複雜的用戶狀態:在線、離開、忙碌、隱身、Q我吧……其實大部分都沒用。他可以提出一個極簡理念:只區分兩種狀態——「可送達」和「不可送達」。在線、離開但可接收消息?都是「可送達」。離線、隱身?都是「不可送達」。乾淨,省資源,減少同步開銷。
存儲的演進路徑。不要一上來就設計一個複雜的、能支撐億級用戶的存儲架構。那太假,面試官反而會覺得你不踏實。他應該寫一個「演進式設計」:初期用戶少,直接用文件存儲+內存緩存;用戶上十萬了,遷移到MySQL單表;上百萬了,MySQL分庫分表;上千萬了,引入NoSQL做冷熱數據分離,熱數據存Redis,冷數據存HBase。這叫務實的前瞻性——我知道未來會怎麼樣,但我從最簡單、最靠譜的開始做。
一個小創新點。可以在消息頭裡加一個「內容特徵標記」——比如這條消息是純文本、是圖片、是語音、是文件。客戶端根據當前網絡狀況和電量,決定是否預載非文本內容。比如在Wi-Fi下,自動預載小圖預覽;在3G下,只載文本,圖片要用戶點開才下載。這在2010年還是個很新的概念。
思路如潰堤的洪水,洶湧而出。
林深的手指在鍵盤上瘋狂敲擊。不是寫代碼,而是寫設計思路。他摒棄了冗長的段落描述,採用清晰的條目式結構。
他寫得飛快,手指幾乎在鍵盤上留下殘影。
五分鐘,三百秒。
在思維加速150%的狀態下,這相當於七分半鐘的高質量輸出時間。
當【子彈時間】效果結束的提示浮現時,林深已經寫滿了整整兩屏的答題區。
他停下手,快速滾動瀏覽自己寫的內容。
邏輯清晰,層次分明。基礎部分紮實得無懈可擊,創新部分又恰到好處地亮眼——既不過分超前到脫離2010年的技術現實,又隱約指向了移動網際網路未來的發展方向。
完美。
他長長呼出一口氣,感覺太陽穴在突突地跳。高強度思維加速的後遺症開始顯現,有點暈,有點反胃。
但他沒時間休息。
十一點二十五分,還剩三十五分鐘。
他重新回到試卷開頭,從第一道選擇題開始,一道一道檢查。修正了兩處粗心導致的選項錯誤,優化了一道編程題的邊界條件注釋。
十一點五十五分,距離截止還有五分鐘。
他最後一次滾動頁面,確認沒有遺漏。
然後,光標移到頁面最下方的「提交」按鈕。
點擊。
頁面跳轉,出現一行簡潔的藍字:
「筆試已完成,感謝參與。結果將在3-5個工作日內通過郵件通知。」
林深靠在椅背上,閉上眼。
【摸魚幣餘額:0.76】
哈?
考試也被算在了摸魚里?
林深幾乎在此時擁有了雙倍的快樂。
只是,【子彈時間】的後遺症還在,但那種在子彈時間裡思維清晰、靈感迸發、仿佛能看見知識脈絡在眼前流動的感覺——真的,會讓人上癮。
他在椅子上坐了很久,直到心跳慢慢平復,直到暈眩感退去,才開始慢條斯理地收拾東西。
「吳經理,工具包部署好了!」
他像個獵手,精準的等待獵物。
七點二十五,老吳出現在辦公室,他先是給自己沖泡了杯速溶咖啡,然後對著電腦屏幕皺眉,屏幕上大概又是哪個改不完的bug列表。
林深起身,用指節不輕不重地敲了敲門。
「進。」老吳頭也沒抬。
林深推門進去,站在那張堆滿文件的辦公桌前。老吳這才抬眼看他,眉頭立刻習慣性地皺起來:「有事?晨會馬上開始了。」
「吳經理,」林深的聲音平靜得有點不像他這個年紀該有的樣子,「昨天部署的那個監控工具,在夜間低負載環境下運行數據我分析過了,基本平穩。
但我懷疑它在早高峰並發場景下可能有隱藏問題——比如緩衝區競爭或者鎖粒度不合適。我需要去機房做實地壓力觀測,最好能抓到底層的包交互原始數據。」
老吳放下咖啡杯,盯著他看了好幾秒:「現在?馬上要開晨會了,今天還有三十多個bug要分。」
「問題可能只在特定時間窗口出現。」林深語調依然平穩,「現在不去抓數據,等到明天早高峰萬一真出問題,又得全組熬夜。當然,如果您覺得等出了問題再救火更符合團隊節奏,那我現在就回去參加晨會。」
他說完,靜靜等著。
老吳的手指在桌面上敲了敲,發出「嗒、嗒、嗒」的悶響。他看看林深,又看看電腦屏幕上那片紅色的bug列表,最後煩躁地揮了揮手:「行行行,去吧去吧。記住,只讀權限,別碰任何生產配置!」
「明白。」
林深走回自己工位,從抽屜里拿出了書包,裡面裝了他的個人筆記本電腦、充電器和一瓶水,他又在工位上抓起白紙和筆,慢條斯理地拉好拉鏈,然後在一片鍵盤敲擊聲中穿過辦公區,走向樓梯間。
機房的金屬門在身後「咔嗒」一聲合上。
世界瞬間換了種聲音。
幾十台伺服器風扇低沉持續的嗡鳴像某種巨型生物的呼吸,密集的指示燈明滅閃爍,空氣里是微弱的臭氧味和金屬散熱片特有的氣息。
這裡的溫度比外面高至少五度。
但林深沒的選,他在角落找到一個運維用的臨時工位,打開機房電腦,又打開了自己的筆記本電腦。
【當前位置:飛訊科技-伺服器機房】
【環境係數:0.4】
和辦公區一模一樣。
林深看著那個數字,扯了扯嘴角。系統果然冷酷——就算待在離公司「心臟」最近的地方,只要做的事本質還是重複性維護,係數就不會變。
他看了眼時間:七點四十。
距離上午十點的筆試還有兩小時二十分鐘。
系統界面另一行顯示:
【摸魚幣餘額:0.3】
他需要湊夠1幣,才能用【子彈時間·初級】,也就是說,還需要0.7幣,105有效摸魚時間。
夠用!
林深在終端里輸入幾條監控命令,讓伺服器日誌和數據流在屏幕上開始滾動,然後他把身體往後一靠,轉椅發出「吱呀」一聲呻吟,他把雙腳抬起來,直接架在旁邊一台閒置的伺服器機箱上,鞋底蹭著機箱表面冰涼的金屬。
姿勢放鬆得像在自家沙發上。
【檢測到有效摸魚時間:0.1小時……】
摸魚時間開始累計,林深在腦海中複習著昨天【快速歸檔】整理過的那些知識點。
9點半,機房門被老吳第二次推開。
老吳走了進來。
他先是習慣性地抬頭看了看牆上的監控大屏——上面滾動著各伺服器CPU、內存、網絡流量的實時曲線。確認所有指標都在綠色區間後,他才把目光移向機房深處。
然後他的腳步頓住了,這小子在偷懶?不對……
只見角落那台掉漆的鐵桌子前,林深正以一種極其怪異的姿勢癱在轉椅上:頭向後仰著,脖子彎成幾乎九十度的角度,喉結突兀地凸出來;眼睛半睜半閉,目光渙散地盯著天花板上某塊污漬;嘴唇在輕微翕動,念念有詞卻聽不清內容;兩隻手垂在身體兩側,手指卻像彈鋼琴似的在空氣里一下下敲著,仿佛面前有架看不見的鍵盤。
更讓老吳心裡發毛的是林深臉上的表情。
嘴角向上翹著,是個笑的模樣,但眼睛裡沒有一點笑意,反而空洞得嚇人。整張臉在螢光燈下泛著一種不健康的青白,配上那渙散的眼神和神經質的手指動作,活像個……沉浸在自己世界裡出不來的瘋子。
「林深?」老吳試探著叫了一聲,聲音在空曠的機房裡顯得有些虛。
沒反應。
老吳皺著眉走近幾步,提高音量:「林深!」
林深猛地轉過頭。
動作快得像個彈簧,脖子發出「咔」的一聲輕響。他的眼睛瞬間聚焦,瞳孔收縮,直直盯在老吳臉上。那眼神亮得反常,像燒著兩簇幽暗的火,看得老吳下意識往後退了半步。
「吳經理。」林深開口,聲音有點沙啞,卻透著一股壓不住的興奮,「您來得正好,我發現了一件特別有意思的事。」
老吳被他看得心裡發毛:「什、什麼事?」
「您看這台伺服器,」林深指著旁邊一台正在低鳴的戴爾機架伺服器,手指幾乎戳到機箱外殼上,「我監控了它半個小時的風扇轉速曲線和TCP重傳率波動,您猜怎麼著?」
老吳盯著那台黑乎乎的機箱,完全不知道該怎麼猜。
「存在一種奇妙的相位差!」林深自己揭曉答案,聲音因為興奮而微微發顫,「風扇每加速一次——嗡!三百毫秒後,網絡棧的緩衝區就會有一次微小的溢出傾向。您看這個圖。」
他迅速在鍵盤上敲了幾下,屏幕跳出一張紅綠交織的波形圖。
「這兩個波形的峰值,永遠差三百毫秒。嚴絲合縫,分秒不差!」林深轉過身,眼睛亮得嚇人,「吳經理,您說這是不是某種共振效應?機械振動傳導到主板,影響了網卡晶片的電氣穩定性?還是說……這棟樓的地磁場有什麼異常?」
老吳盯著屏幕上那些起伏的曲線,完全看不懂。他只能看見林深那張因為激動而泛紅的臉,那雙亮得不正常的眼睛,還有那揮舞著手臂、語速越來越快的樣子。
「更妙的是,」林深突然壓低聲音,身體前傾,像要分享什麼驚天秘密,「吳經理,您知道嗎?這就像人生!」
老吳徹底懵了:「……什麼像人生?」
「丟包啊!」林深雙手一攤,像個在街頭布道的狂熱信徒,「一個數據包發出去了,沒收到ACK。它可能是真丟了,永遠到不了對端;也可能只是延遲了,正在某個路由器的隊列里排隊,過一會兒就能到——就像你付出的努力,不一定馬上有回報,可能只是時機未到。」
他站起來,在狹窄的過道里踱步,手指在空中劃著名看不見的軌跡:「但如果你不停地重傳,發一個包,等兩百毫秒,沒回應,再發,再等……系統就會擁塞,帶寬就會被占滿,真正重要的數據反而過不去。人生也是這樣啊,如果你對一件事執念太深,不停地『重傳』,不停地強求,生活就會陷入死循環,其他重要的可能性反而被堵死了……」
他說得手舞足蹈,眼神飄忽,臉上泛起一種病態的紅暈。
老吳張著嘴,完全接不上話。
他看著眼前這個實習生:袖子卷到肩膀,頭髮因為激動而有些凌亂,眼睛亮得像要燒起來,嘴裡說著他完全聽不懂的「技術哲學」,他心裡此時只有一個念頭:
這小子……是不是連續加班加瘋了?
不對啊,這兩天他都是正常下班……
「所以有時候,」林深突然停下來,轉過身,直直盯著老吳,「得學會放手。讓該丟的包丟掉,讓該走的人走掉。系統會自己調整擁塞窗口,人生……也會自己找到出路。您說對不對,吳經理?」
老吳喉結動了動,乾巴巴地說:「你……你先把該乾的活兒幹完。這些……這些玄乎的東西,少想點。」
「幹活?對,幹活。」林深咧嘴笑起來,那笑容燦爛得有些過頭,「我一定『好好』幹活。畢竟工作是為了生活嘛。但是吳經理——」
他往前湊了湊,壓低聲音,像在說什麼了不得的秘密:
「您有沒有想過,如果生活本身就成了工作,起床是上班,吃飯是加油,睡覺是關機維護……那我們到底在為什麼而活呢?就為了明天繼續起床『上班』嗎?」
老吳被他問得頭皮發麻。
他覺得林深今天格外不對勁,但又說不出具體哪裡不對——人家確實在「工作」,屏幕上是監控數據,嘴裡說的也好像跟技術有關,就是那狀態……那眼神……那笑容……
瘮得慌。
「……你繼續吧。」老吳最終選擇了撤退。他轉身,腳步比來時快了不少,幾乎是逃也似的走向機房門口。
走到門邊時,他還是忍不住回頭看了一眼。
林深已經重新癱回了轉椅上。頭仰著,脖子彎成那個怪異的角度,眼睛盯著天花板,手指又在空氣里一下下敲著。嘴裡念念有詞,臉上掛著那種似笑非笑的表情。
像個沉浸在自我世界裡、完全與外界隔絕的瘋子。
老吳心裡嘀咕著推門離開,決定今天下班前不再來機房了,眼不見為淨。
機房門「咔嗒」一聲合上。
林深臉上的「瘋癲」表情瞬間收斂。
他坐直身體,揉了揉後頸——剛才那個姿勢保持久了,脖子確實有點酸。然後他看了一眼系統界面:
【檢測到有效摸魚時間:0.8小時】
【摸魚幣+0.32】
【累計摸魚幣:1.02】
剛才和老吳扯淡也被算在了摸魚里,完美!
要不是怕老吳在他筆試時進來,他還真不演這一出,夠癲的!
九點五十五分,筆記本連上手機網絡。
九點五十八分,打開瀏覽器,輸入騰訊筆試系統的網址。
九點五十九分,登錄——帳號密碼他早就背熟了。
十點整,筆試頁面準時刷新。
第一部分,計算機基礎,30道選擇題。
林深掃了一眼題目,嘴角扯了扯。大部分都是死記硬背的東西:OSI七層模型每層的功能、進程和線程的區別、死鎖的四個必要條件……對他來說,這些知識點就像呼吸一樣自然。
二十二分鐘後,第一部分完成。
系統自動跳轉到第二部分:邏輯推理,20題。
圖形推理、數字序列、語言邏輯……林深遇到第三題時卡住了——那是一道複雜的立方體展開圖旋轉題。他盯著屏幕看了半分鐘,直接點了「標記,稍後回答」。
跳過去。
他做得很從容,甚至有點……享受。每解出一道題,他就在心裡對自己說:看,這就是不用加班、不用改「按鈕向左移2像素」的bug、不用聽老吳吼叫的生活。純粹的邏輯,乾淨的思維,多好。
四十五分鐘時,前兩部分全部完成。
系統跳轉到編程題環節。
第一道:給定一個字符串,找出其中最長的回文子串。
經典題。林深幾乎不用思考,手指就在鍵盤上飛起來。他寫了一個中心擴展算法,時間複雜度O(n²),空間O(1)。寫完後,他想了想,又在注釋里加了一段:
「如果字符串長度超過10^6,建議使用Manacher算法,時間複雜度可降至O(n)。但考慮到本題明確說明輸入規模較小,且Manacher算法實現較複雜、可讀性差,故採用更易於理解和維護的中心擴展法。」
這既展示了知識面,又體現了工程權衡。
第二道:兩數之和的變種,找出數組中所有不重複的和為目標值的元素對。
又是昨晚重點複習過的題型。林深先排序,再用雙指針,同時小心處理重複元素。代碼寫完,他特意測試了幾個邊界用例:空數組、所有元素相同、目標值比所有元素都小……
十一點零五分,兩道編程題提交。
系統最後一次跳轉。
最後一道題:系統設計。
題目描述簡潔得讓人心悸:「設計一個簡易的即時通訊系統,支持一對一文本消息發送。請從客戶端、伺服器、協議、存儲等角度簡要闡述你的設計思路,並重點說明如何保證消息的可靠投遞。」
林深盯著這行字,沉默了很久。
機房的嗡鳴聲在耳邊持續。
他有答案。他太有答案了——前世在微信團隊七年,參與過消息系統從簡單到複雜、從單機到分布式的整個演進過程。他知道每一個坑在哪裡,每一種權衡背後的代價,每一次架構升級的痛苦。
但他不能寫。
現在是2010年。iPhone 4剛剛發布,Android 2.2還叫Froyo,行動網路主要是2G和初生的3G,智慧型手機普及率還很低。他不能把2018年的微信架構直接搬過來。
他需要寫一個「2010年的聰明人會想出來的方案」。
一個符合當時技術現實、卻又隱約透出一點前瞻性的方案。
一個既紮實、又有點「小聰明」的方案。
林深開始敲字。
他寫得很快,但很克制:
客戶端:基於TCP長連接,心跳保活(30秒一次),斷線自動重連(指數退避)。
伺服器:簡單的連接管理(用字典存userId->socket映射),消息路由(查字典轉發),消息先存內存隊列,再異步刷到磁碟文件。
協議:自定義二進位協議,包頭包含消息類型、長度、序列號、發送者、接收者、時間戳。
可靠投遞:發送方等待伺服器ACK,伺服器存儲成功後回ACK,接收方收到後回送達回執。每個環節都有超時重傳,最多三次。
寫到這裡,他停下來。
他看著屏幕上自己寫的東西,眉頭慢慢皺起來。
太普通了。
這就像一份教科書式的標準答案,每個學過網絡編程的大學生都能寫出來。挑不出錯,但也絕不會讓人記住。
他需要一點……不一樣的東西。
林深看了眼時間:十一點二十分。還剩四十分鐘。
他看了眼系統界面:
【摸魚幣餘額:1.02】
【可用技能:子彈時間·初級(1幣/次)】
用。
【是否使用子彈時間·初級?消耗1摸魚幣,持續5分鐘。】
【是】
一瞬間,世界變了。
不是時間停止,而是……思維的速度被強行拔高了一個維度。
耳邊伺服器群的嗡鳴聲陡然退遠,變得像隔著厚厚的水層,模糊而緩慢。眼前屏幕上的文字卻異常清晰,每一個像素都銳利得刺眼,光標每秒一次的閃爍慢得像在呼吸。
但他的思維在狂奔。
前世那些記憶碎片——技術討論會的爭吵、架構文檔的版本變遷、線上事故的復盤報告——此刻不再是零散的畫面,而是被某種無形之力串聯、編織,形成一張立體的知識網。
他想到了幾個關鍵點:
移動特性。現在是2010年,智慧型手機正在崛起。設計不能只考慮穩定的Wi-Fi環境,還要考慮蜂窩網絡的不穩定、高延遲、頻繁切換。可以在協議頭裡加一個「網絡類型標記」(Wi-Fi/3G/2G),客戶端根據這個標記決定一些行為——比如在2G下,不發大的圖片預覽;在電量低於20%時,主動告訴伺服器「進入節電模式」,讓伺服器延遲非緊急消息的推送。
狀態同步的簡化。當時的IM系統,比如手機QQ,喜歡搞複雜的用戶狀態:在線、離開、忙碌、隱身、Q我吧……其實大部分都沒用。他可以提出一個極簡理念:只區分兩種狀態——「可送達」和「不可送達」。在線、離開但可接收消息?都是「可送達」。離線、隱身?都是「不可送達」。乾淨,省資源,減少同步開銷。
存儲的演進路徑。不要一上來就設計一個複雜的、能支撐億級用戶的存儲架構。那太假,面試官反而會覺得你不踏實。他應該寫一個「演進式設計」:初期用戶少,直接用文件存儲+內存緩存;用戶上十萬了,遷移到MySQL單表;上百萬了,MySQL分庫分表;上千萬了,引入NoSQL做冷熱數據分離,熱數據存Redis,冷數據存HBase。這叫務實的前瞻性——我知道未來會怎麼樣,但我從最簡單、最靠譜的開始做。
一個小創新點。可以在消息頭裡加一個「內容特徵標記」——比如這條消息是純文本、是圖片、是語音、是文件。客戶端根據當前網絡狀況和電量,決定是否預載非文本內容。比如在Wi-Fi下,自動預載小圖預覽;在3G下,只載文本,圖片要用戶點開才下載。這在2010年還是個很新的概念。
思路如潰堤的洪水,洶湧而出。
林深的手指在鍵盤上瘋狂敲擊。不是寫代碼,而是寫設計思路。他摒棄了冗長的段落描述,採用清晰的條目式結構。
他寫得飛快,手指幾乎在鍵盤上留下殘影。
五分鐘,三百秒。
在思維加速150%的狀態下,這相當於七分半鐘的高質量輸出時間。
當【子彈時間】效果結束的提示浮現時,林深已經寫滿了整整兩屏的答題區。
他停下手,快速滾動瀏覽自己寫的內容。
邏輯清晰,層次分明。基礎部分紮實得無懈可擊,創新部分又恰到好處地亮眼——既不過分超前到脫離2010年的技術現實,又隱約指向了移動網際網路未來的發展方向。
完美。
他長長呼出一口氣,感覺太陽穴在突突地跳。高強度思維加速的後遺症開始顯現,有點暈,有點反胃。
但他沒時間休息。
十一點二十五分,還剩三十五分鐘。
他重新回到試卷開頭,從第一道選擇題開始,一道一道檢查。修正了兩處粗心導致的選項錯誤,優化了一道編程題的邊界條件注釋。
十一點五十五分,距離截止還有五分鐘。
他最後一次滾動頁面,確認沒有遺漏。
然後,光標移到頁面最下方的「提交」按鈕。
點擊。
頁面跳轉,出現一行簡潔的藍字:
「筆試已完成,感謝參與。結果將在3-5個工作日內通過郵件通知。」
林深靠在椅背上,閉上眼。
【摸魚幣餘額:0.76】
哈?
考試也被算在了摸魚里?
林深幾乎在此時擁有了雙倍的快樂。
只是,【子彈時間】的後遺症還在,但那種在子彈時間裡思維清晰、靈感迸發、仿佛能看見知識脈絡在眼前流動的感覺——真的,會讓人上癮。
他在椅子上坐了很久,直到心跳慢慢平復,直到暈眩感退去,才開始慢條斯理地收拾東西。
「吳經理,工具包部署好了!」