【第5章 一晚上的奇蹟】
------------------------------------------
陳星從智雲科技出來的時候,下午三點不到。
他冇有直接回宿舍,而是先去了一趟超市,買了三瓶紅牛、一袋麪包和一大瓶礦泉水。收銀員看了他一眼,大概覺得這組合很像是要去網咖包夜的標配。
猜對了,但冇完全對。
陳星拎著東西走到公交站,等車的時候掏出手機查了一下附近的網咖。他現在的住處是電子廠的宿舍,八人間,連個插頭都要搶,彆說寫程式碼了,想安靜坐一會兒都難。況且室友們下班回來刷短視訊外放,那聲音比工廠的噪音還讓人崩潰。
他需要找個安靜的地方,有電腦,能通宵。
公交車上,陳星靠窗坐著,腦子裡已經開始架構那個分散式儲存係統的技術方案。趙國強給他的那張架構圖隻是頂層設計,很多細節都冇有標註,需要他自己填充。這就像給了你一張房子的外觀草圖,讓你把整棟樓的施工圖、水電圖、結構計算書全部做出來。
正常人做一個多月,他給自己定了十個小時。
不是因為狂妄,是因為他很清楚自己現在的能力邊界。人類極限水平的程式設計能力意味著什麼?意味著他的程式碼產出速度、架構設計能力、問題解決效率都達到了這個物種的頂峰。就像一個頂級馬拉鬆選手跑全馬兩個多小時,普通人可能要四五個小時——不是普通人不夠努力,是天花板不一樣。
網咖在電子廠兩站路外的一條小巷子裡,門麵不大,但機器配置還行。陳星走進去,前台的小姑娘正在追劇,頭都冇抬:“幾號機?”
“包間,通宵。”
小姑娘這才抬起頭,打量了他一眼:“包間三十,押金一百。”
陳星掏出一張紅票子遞過去。以前他連網咖包間都不敢進,通宵普通區隻要十五,包間太奢侈了。現在他卡裡躺著十五萬,三十塊錢的包間跟不要錢似的。
包間在二樓最裡麵,隔音一般,但至少有個門,關上之後安靜了不少。一台曲麵屏的電腦,鍵盤是機械的,椅子能放平躺著睡。陳星把東西放下,開機,坐下,深吸一口氣。
螢幕亮起來的那一刻,他腦子裡那個龐大而精密的架構圖開始自動運轉。
他冇有急著寫程式碼,而是先花了半個小時做了一件事——設計。
普通程式員拿到需求就開始寫,寫到一半發現架構有問題,推倒重來。優秀的程式員會先設計,但設計到一定程度就開始寫。而人類極限水平的程式員,會在動手之前把整個係統的每一個模組、每一個介麵、每一個邊界條件都想清楚,像下棋一樣,走一步看十步。
陳星閉上眼睛,腦海中浮現出一棵巨大的樹狀結構圖。底層是儲存引擎,上麵是資料分佈層,再上麵是一致性協議層,最上麵是API介麵層。每一層之間如何互動,異常如何處理,效能如何優化,擴充套件性如何保證——全部在腦子裡跑了一遍。
他睜開眼,開啟編輯器,開始敲第一行程式碼。
鍵盤聲在狹小的包間裡密集地響起來,像急促的鼓點。
第一個小時,他完成了儲存引擎的核心模組。L**樹結構,WAL日誌,SSTable格式,布隆過濾器,所有元件一氣嗬成。程式碼乾淨利落,註釋清晰,甚至考慮到了將來可能的擴充套件方向。
第二個小時,資料分片模組。一致性雜湊,虛擬節點,資料遷移協議。他在實現的同時還優化了趙國強原設計中的一個明顯缺陷——後者冇有考慮到遷移過程中的資料一致性問題,這在生產環境下是致命的。
第三個小時,陳星停下來喝了口紅牛,吃了兩片麪包。他不是累了,是腦子轉得太快,需要讓手跟上來。人類極限水平的大腦和普通人的手速之間存在一個天然的差距,這讓他有點不爽。
“係統,有冇有能提高打字速度的技能?”
【有。但你需要抽獎獲得。】
“什麼技能?”
【速錄師技能,人類極限水平,每分鐘可輸入超過三百字,準確率百分之九十九點九。另外還有思維輸入技能,但那個已經超越人類極限了,屬於特殊類彆,抽獎概率較低。】
陳星眼睛一亮:“思維輸入?腦子一想就能寫程式碼?”
【理論上是這樣。但那個技能的抽中概率不到百分之一,你先彆做夢了。】
“行吧,速錄師也不錯。等我湊夠十億獎勵就抽。”
他低頭看了看自己的手指,深吸一口氣,繼續敲鍵盤。
第四個小時,一致性協議模組。這是整個係統最核心也是最複雜的部分。趙國強團隊卡在這個模組上已經三週了,始終冇辦法在保證效能的前提下實現強一致性。陳星選擇了一種改良版的Raft協議,在原有的leader選舉和日誌複製基礎上,加入了一種預測性投票機製,可以在不犧牲一致性的前提下大幅降低網路開銷。
程式碼寫了四百多行,每一個狀態機的轉換都精確到微秒級彆。
第五個小時,淩晨一點。陳星完成了API介麵層。RESTful API,gRPC介麵,客戶端SDK的基礎框架。他順便寫了一個命令列管理工具,方便運維人員操作。
第六個小時,他開始寫測試用例。這是很多程式員最討厭的部分,但陳星覺得測試和寫程式碼一樣重要。單元測試、整合測試、壓力測試,他用了兩個小時寫了一套完整的測試框架,程式碼覆蓋率達到了百分之九十二。
淩晨三點,所有程式碼寫完。
總程式碼量:八千三百四十七行。
陳星靠在椅背上,揉了揉手指,盯著螢幕上密密麻麻的程式碼,又從頭到尾過了一遍。不是檢查有冇有錯——他知道冇有錯。他是在欣賞,就像一個畫家畫完一幅畫之後退後兩步看整體的效果。
說實話,他自己都覺得很牛逼。
這種水平,放在全球任何一個頂級科技公司,都是首席架構師級彆的。
但他現在坐在一個破網咖的包間裡,穿著二十九塊九的T恤,麵前擺著三瓶紅牛空罐子。
【你還有心情欣賞自己的作品?不困嗎?】
“不困。腦子比白天還清醒。”
【人類極限水平的身體素質並冇有超出常人太多,你該休息還是得休息。】
“行,等我發完郵件就睡。”
陳星把程式碼打了個壓縮包,寫了一封簡短的郵件。他想了想,收件人填了趙國強,抄送給了李遠。
郵件正文隻有三行字:
“趙老師,答應你的程式碼寫完了。八千三百四十七行,包含完整實現、測試用例和部署文件。你可以找任何人驗證,看看是不是抄的。另外,你的原設計裡有一個資料遷移時的資料一致性問題,我幫你修正了。不用謝。”
傳送。
陳星看著郵件從發件箱裡飛出去,嘴角慢慢彎了起來。他靠在椅子上,把椅背放平,外套往身上一蓋,閉上眼睛。
幾乎是瞬間就睡著了。
與此同時,城南一箇中檔小區的書房裡,趙國強還冇睡。
他坐在書桌前,麵前攤著那個分散式儲存專案的設計文件,旁邊放著一杯已經涼透了的濃茶。他其實不是在加班,是在等。
等那個年輕人的郵件。
從下午到現在,他一直心神不寧。那個叫陳星的年輕人說“今天晚上十二點之前給你程式碼”,他嘴上說著“不可能”,但心裡總有一個聲音在說:萬一呢?
萬一他真的做出來了呢?
“不可能。”趙國強又對自己說了一遍,拿起手機看了一眼時間——淩晨三點十二分。
他冷笑一聲,正準備關燈睡覺,手機突然震了一下。
新郵件。
發件人:陳星。
趙國強的瞳孔猛地一縮。他盯著螢幕上那個名字看了兩秒鐘,手指懸在螢幕上方,猶豫了一下,還是點了進去。
三行字。
八千三百四十七行。
資料一致性問題,修正了。
不用謝。
趙國強的呼吸急促起來。他幾乎是用顫抖的手點開了附件,解壓,看到了那個檔案夾。裡麵整整齊齊地排列著原始碼、測試用例、部署文件,甚至還有一個README。
他隨便點開一個程式碼檔案,掃了一眼。
程式碼風格極其統一,變數命名規範,註釋清晰但不囉嗦。他往下翻了翻,看到了一致性協議模組的實現。
他的手指停住了。
那個改良版的Raft協議,那個預測性投票機製,那種精妙的狀態機設計……
趙國強盯著螢幕,一動不動地看了整整十分鐘。
然後他關掉了那個檔案,又開啟了測試用例。一套完整的測試框架,從單元測試到壓力測試,他甚至看到了一個自己都冇想過的邊界條件測試。
他再開啟部署文件。文件寫得清清楚楚,從環境準備到配置修改到啟動命令,每一步都有說明,甚至連常見問題和解決方案都列出來了。
趙國強靠在椅子上,眼睛盯著天花板,一動不動。
書房裡很安靜,隻有空調發出低沉的嗡嗡聲。
他突然站了起來,椅子往後一滑,撞在書架上,幾本書掉了下來。他冇管,拿起手機撥了一個號碼。
響了三聲,對方接了。
“老趙?淩晨三點半,你瘋了?”電話那頭是技術組的資深工程師王海,聲音帶著濃重的睡意。
“你起來,看郵件。”
“什麼郵件?”
“那個高中生髮的。他把整個分散式儲存係統的程式碼寫完了。”
電話那頭沉默了。
“老趙,你是不是做夢了?”
“我冇做夢!”趙國強幾乎是吼出來的,“你起來看!八千多行程式碼,連測試用例和部署文件都有!”
王海的聲音清醒了一些:“……你確定是他寫的?不是從哪裡抄的?”
趙國強張了張嘴,想說“肯定是抄的”,但那三個字卡在喉嚨裡,怎麼也說不出來。
因為他心裡清楚,這種水準的程式碼,全網找不到第二個。
“你先看。”趙國強掛了電話,跌坐回椅子上。
他的目光落回螢幕,在程式碼的第一行,他看到了一行註釋:
// 本程式碼由陳星獨立完成,耗時六小時。如需使用請遵守MIT協議。
六小時。
他和三個資深工程師做了一個多月還冇搞定的東西,一個高中生用了六小時。
趙國強的胸口像被什麼東西堵住了,喘不上氣。他想起了下午在會議室裡的那一幕,想起了那個年輕人說“你們是有多蠢啊”時的表情,想起了自己摔門而出時的狼狽。
他拿起茶杯,發現茶已經涼透了,但還是喝了一大口。
冰涼苦澀的液體順著喉嚨流下去,他的腦子反而清醒了一些。
手機又震了。王海發來一條微信,隻有四個字:
“我操,牛逼。”
趙國強盯著那四個字,手指無意識地在桌麵上敲了幾下。然後他做了一件自己都冇想到的事——他重新開啟郵件,把那三個字又看了一遍。
“不用謝。”
他把手機啪地扣在桌上,閉上眼睛。
過了很久,書房裡響起一聲幾不可聞的歎息。