週一上午,孵化部的小會議室裏坐了十來個人。
海量資料的王浩站在講台前,笑容依舊親和。但這次他的聽眾不一樣——不是技術部那些熟悉資料庫運維的老兵,而是孵化部這些從零開始的新團隊。
“各位早上好。”王浩開場,“上次在三樓分享的是通用架構,今天咱們聚焦一點:初創專案如何設計一個既靈活又可靠的資料層。”
投影上出現一張對比圖:左邊是傳統的MySQL主從架構,右邊是海量資料的分散式架構。
“很多團隊從第一天就陷入一個誤區:先上單機MySQL,等扛不住了再加從庫、再分庫分表。結果就是技術債務越堆越高,最後重構代價巨大。”王浩切換PPT,“我們的建議是:從一開始就選擇分散式架構,按業務域自然分片,以後隻需要水平加機器,不需要改程式碼。”
楊帆坐在第一排,手裏轉著筆,臉上沒什麽表情。老陳和小雨聽得頻頻點頭。林夕坐在後排,筆記本攤開,但他沒記技術細節,而是記王浩的措辭和邏輯。
分享進行了四十分鍾。王浩講得很務實,重點回答了孵化部關心的幾個問題:如何快速上手、遷移成本、社羣支援、故障排查工具。
“最後一個問題,”楊帆終於開口,“你們的資料一致性模型,和傳統資料庫的最大區別是什麽?”
王浩精神一振——顯然,這個問題他準備過。
“最大的區別是,我們實現了分散式強一致性,而不是最終一致性。”他調出技術架構圖,“通過Raft共識演演算法,所有寫入在多數節點確認後才返回成功,保證讀到的永遠是最新資料。”
“效能損耗呢?”
“比非同步複製高,但比傳統的主從同步複製低。我們在協議層做了大量優化,平均延遲控製在5毫秒以內。”
“有benchmark資料嗎?”
“有。”王浩展示測試報告,“在標準的TPC-C測試中,三節點集群的吞吐量是MySQL一主兩從架構的2.1倍,平均延遲降低30%。”
資料很漂亮。會議室裏有人小聲議論。
楊帆點點頭,沒再追問。
分享結束後,王浩被幾個人圍著繼續問問題。林夕收拾東西準備離開,周凱走了進來。
“怎麽樣,聽了有收獲嗎?”周凱笑著問大家。
“收獲很大。”老陳第一個回應,“我們正在設計‘星課堂’的資料層,海量資料的方案確實有吸引力。”
“那就好。”周凱看向楊帆,“楊老師覺得呢?”
“技術上不錯。”楊帆說得很謹慎,“但新技術的引入需要完整的評估流程,不是一次分享會能決定的。”
“那是當然。”周凱點頭,“我已經和產品、架構委員會打過招呼,‘星課堂’可以作為試點專案。如果效果好,再推廣到其他業務。”
這話說得很自然,但林夕聽出了潛台詞:周凱已經在推動這件事,而且得到了更高層的支援。
“試點需要明確目標、時間、驗收標準。”楊帆說,“不能隻說‘效果好’,要量化。”
“這個自然。”周凱拿出一份列印好的檔案,“這是初步的試點方案,各位看看。”
檔案傳閱。林夕拿到一份,快速瀏覽。方案寫得很完整:試點週期三個月,目標是將“星課堂”的使用者資料遷移到海量資料庫,並完成效能、穩定性、成本三方麵的評估。驗收標準包括:P99延遲不超過20毫秒,可用性99.99%,同等負載下成本不高於原方案15%。
看起來合情合理。
“如果大家沒意見,我們就按這個方案推進。”周凱說,“楊老師,您來負責技術評估?”
楊帆沉默了幾秒:“可以。但我要加一條:試點期間,必須有完整的回滾方案。一旦出問題,24小時內能切回MySQL。”
“沒問題。”周凱答應得很爽快。
會議散了。王浩被周凱請去喝茶。楊帆留下來,對老陳說:“組織一個小團隊,專門負責這個試點。林夕,你也加入。”
林夕一愣:“我?”
“你在技術部做過積分係統,對資料庫問題有經驗。”楊帆說,“這次試點,你負責效能測試和故障模擬部分。”
“好的。”
“記住,”楊帆看著他,“你的任務不是證明海量資料有多好,而是找出它所有可能的問題。越是漂亮的新技術,隱藏的風險越深。”
林夕明白了。楊帆不信任這個方案,至少不完全信任。他要林夕去當那個“挑刺”的人。
下午,試點小組成立:老陳任組長,林夕負責測試,還有兩個後端開發負責遷移和監控。小雨作為產品代表加入,負責評估使用者體驗影響。
第一次小組會,老陳分配任務:“這周我們先搭測試環境,做功能驗證。下週開始效能壓測。林夕,你出一個詳細的測試計劃。”
林夕點頭。他開啟筆記本,開始構思測試方案。不僅要測效能,還要測那些“邊界情況”:網路分割槽時資料一致性如何?節點宕機後恢複時間多長?批量匯入匯出資料的完整性?版本升級的平滑性?
他寫得很快,手指在鍵盤上飛舞。但心裏總有一絲不安——這不僅僅是一個技術測試任務。
陳啟明的警告在耳邊回響:“初創公司為了拿訂單,什麽承諾都敢做。大公司為了出成績,什麽風險都敢冒。”
張維的提醒:“你有權利知道自己在什麽樣的棋局裏。”
而現在,他被楊帆推到了這個棋局的前線。
晚上七點,測試計劃初稿完成。林夕發到小組群裏,抄送楊帆。
十分鍾後,楊帆回複:“計劃可以,加一條:模擬真實生產環境的‘髒資料’和‘異常操作’。很多資料庫在標準測試下表現完美,但遇到現實世界的混亂就崩潰。”
林夕回複:“收到,明天補充。”
他關掉電腦,準備下班。手機震動,是李工打來的。
“林夕,方便說話嗎?”
“方便,李工你說。”
“海量資料的事兒,聽說了?”
“嗯,我今天參加了分享會,還進了試點小組。”
電話那頭沉默了一下:“小心點。周凱對這個事很上心,上週專門去了趟投資部,跟張維談了一個小時。”
“談什麽?”
“不清楚。但出來的時候,兩人表情都挺嚴肅。”李工壓低聲音,“還有,積分重構專案組正式成立了,預算批下來了,三百萬。周凱從外麵招了個架構師當副組長,據說年薪八十萬。”
林夕心裏一沉。三百萬預算,外聘高薪架構師——周凱這次是動真格的。而且,這不是為了“修複問題”,而是為了“做出成績”。
“那個架構師,你瞭解嗎?”
“瞭解一點,以前在二線大廠做過技術總監,履曆很漂亮。”李工頓了頓,“但有人說,他去年帶的專案出過生產事故,賠了不少錢,所以才跳槽。”
“周凱知道嗎?”
“肯定知道。但他還是選了這個人。”李工說,“你懂我的意思吧?他要的是能快速出成果的人,不是小心翼翼的人。”
林夕懂了。陳啟明那種“發現問題就要徹底解決”的人,不符合周凱現在的需求。他需要的是能幫他完成漂亮專案、順利晉升的人,至於專案背後的風險——可以事後再說。
“謝謝你李工。”
“不客氣。我就是覺得……你挺像當年的陳啟明。有技術熱情,有原則。但有時候,光有這些不夠。”李工歎了口氣,“好了,不說了。你自己多注意。”
電話結束通話。
林夕站在公司樓下,看著夜色中的車流。城市的燈光在潮濕的空氣裏暈開,像一幅被水浸過的畫。
他想起祖父教他下棋時說的話:“小夕,下棋最重要的是什麽?”
“算路?大局觀?”
“是選擇。”祖父說,“每一步都有無數種走法,但你隻能選一種。選對了未必贏,選錯了未必輸,但你必須為自己的選擇負責。”
現在,擺在他麵前的是一盤複雜的棋:周凱在推進海量資料的試點,楊帆讓他去挑刺,張維在暗中觀察,陳啟明在遠方警示。
而他,這個才入職兩個月的新人,要在這個棋局裏走下一步。
怎麽走?
他開啟手機,翻到陳啟明的郵箱地址。手指懸在螢幕上,想寫點什麽,但又不知道怎麽寫。
最後,他退出了郵箱,開啟備忘錄,新建一條:
“海量資料試點:三個月週期,我負責測試。周凱積極推進,楊帆謹慎,張維態度不明。積分重構專案啟動,外聘架構師,預算三百萬。”
寫完,他鎖屏,走向地鐵站。
地鐵上很擠,他靠在門邊,閉上眼睛。腦海裏不是技術方案,不是測試計劃,而是一張棋盤。
棋盤上,周凱的“車”已經過了河,直逼中宮。楊帆的“馬”在側翼徘徊,伺機而動。張維的“炮”在後方,隨時可以支援或打擊。而他,是一枚“卒”,剛剛過河,在敵陣中艱難前行。
但棋局真正的關鍵,可能不在這些明麵的棋子上。
而在那些還沒動的“士”“象”,在那些看似被動的防守裏。
回到出租屋,他開啟電腦,重新看那份測試計劃。按照楊帆的要求,他加上了“髒資料測試”和“異常操作模擬”部分。
髒資料測試包括:插入非法字元、超長欄位、負數值、時間戳穿越。這些在正常開發中都會避免,但生產環境總有意外。
異常操作模擬更刁鑽:在事務進行中殺掉連線、在批量寫入時重啟節點、在資料遷移時斷網、在高峰時段執行DDL操作。
他寫得越細,越覺得這個測試任務不簡單——這不隻是評估一個資料庫產品,這是在為一個重大的技術決策提供依據。
而這個決策,可能影響整個孵化部的專案進度,甚至影響公司未來的技術選型。
責任重大。
寫到淩晨一點,他完成了第二版測試計劃。發出去後,他疲憊地靠在椅子上。
手機又震動了一下。以為是楊帆的回複,但一看,是周凱。
“小林,睡了沒?”
林夕猶豫了幾秒,回複:“還沒,在改測試計劃。”
“辛苦了。試點的事,你多費心。這是個好機會,做好了,對你未來發展很有幫助。”
典型的領導鼓勵。但林夕讀出了另一層意思:這是在提醒他,要“好好做”,要做出“好結果”。
他沒回。
周凱又發來一條:“楊帆老師要求高,但他是為你好。有什麽困難隨時跟我說,我給你協調資源。”
“謝謝凱哥,我會努力的。”
對話結束。
林夕放下手機,走到窗邊。夜已經很深了,遠處還有零星幾盞燈亮著,像不肯睡去的眼睛。
他想起今天會議上,王浩展示的那些漂亮資料,周凱從容的笑容,楊帆謹慎的提問,老陳和小雨興奮的表情。
每個人都在自己的位置上,做出自己的選擇。
而他呢?
他現在要做的選擇是:在測試中,是嚴格執行楊帆的要求,找出所有潛在問題,哪怕會拖慢試點進度,甚至可能導致試點失敗?還是適當“放水”,讓試點順利推進,符合周凱的預期?
前者是技術人的本分,但可能得罪周凱,影響自己在公司的處境。
後者是職場人的“聰明”,但違背原則,也辜負了楊帆的信任。
《孫子兵法·虛實篇》裏說:“故形兵之極,至於無形。”
用兵的最高境界,是讓人看不出形態。
那麽,有沒有一種方式,既能完成楊帆的任務,又能不讓周凱太難堪?
也許有。
比如,把測試做得極其嚴謹、全麵,把所有問題都找出來,但報告呈現時,把問題分類:致命問題、嚴重問題、一般問題、建議優化。
然後,讓楊帆和周凱去決定:哪些問題必須解決,哪些可以接受。
這樣,他盡到了技術人的責任,又把決策權交還給應該做決策的人。
他回到電腦前,在測試計劃最後加了一章:
“第九章:問題分類與風險評估
1. 致命問題:會導致資料丟失、不一致、服務不可用,必須修複。
2. 嚴重問題:影響效能或可用性,建議修複。
3. 一般問題:不影響核心功能,建議優化。
4. 建議優化:提升體驗或可維護性,可選。”
寫完,他儲存檔案。
窗外的天空開始泛白,新的一天要來了。
他知道,從今天起,他要開始走一條很細的鋼絲。
一邊是技術原則,一邊是職場現實。
而鋼絲下麵,是深不見底的博弈。
但他必須走。
因為卒子過了河,就隻能向前。
而前方的路,無論多難,都是自己選的。
他關掉燈,躺到床上。
在睡意襲來前,最後一個念頭是:
明天,測試環境就要開始搭建了。
而沙盤上的推演,即將變成真實的攻防。
他準備好了嗎?
他不知道。
但他知道,這場仗,他必須打。
而且,要打得漂亮。