走廊裡那股揮之不去的84消毒液味道,總讓人覺得呼吸不太順暢。
215宿舍的門虛掩著,留了一條縫用來通風。
王大勇蹲在陽台門邊的插座旁,眼睛死死盯著地上的那個不鏽鋼電熱杯。
杯子邊緣已經有些被燻黑了,裡頭的水剛燒開,咕嚕咕嚕地翻滾著,頂得那個輕飄飄的蓋子叮噹直響。
他手裡攥著兩包老壇酸菜麵的料包,還冇撕開,大勇轉過頭,看了一眼坐在桌前的陳拙。
陳拙坐在書桌前,背對著陽台。
桌上攤開著一本厚重的大開本俄文書,書頁微微泛黃。
宿舍裡很安靜,隻能聽到電熱杯煮水的聲音,以及陳拙偶爾翻動書頁時發出的輕微摩擦聲。
他看書的速度並不快,雖然他之前就看過俄語的書,不過還是難免遇到一些難以理解的詞彙。
遇到長句或者生僻的專業詞彙,目光會停留在上麵,手指習慣性地在桌麵上輕輕敲擊兩下。
然後他會翻開旁邊的詞典,按著俄文字母的順序,耐心地把詞根找出來,在腦子裡過一遍它在物理語境下的準確含義。
這本蘇聯時期出版的《朗道理論物理學教程》,在物理學界出了名的難啃。
不僅因為它的理論門檻高,更因為作者有一個讓所有初學者抓狂的習慣。
在這位物理學大佬的筆下,推導公式的過程經常會被大幅度省略。
往往上一行還是個複雜的微積分偏導方程,中間空了一行,下一行直接跟了一句俄文的Очевидно(顯而易見),然後就是一個乾乾淨淨的結論。
陳拙看到這四個字的時候,總是有點無奈。
這位大佬不僅聰明,而且確實很會省排版費。
彆人看到顯而易見可能會覺得痛苦或者跳過,但陳拙不會。
既然作者跳了步,那把這些步驟補齊,這對陳拙來說本身就是一種極好的思維消遣。
陳拙隨手從桌角的雜物堆裡抽過一張列印紙。
這是前兩天楚戈用來測試列印機打廢的一張程式碼紙,正麵印著密密麻麻的C語言函式,反麵是完全空白的。
他拿起手邊那支黑色的鋼筆,拔下筆帽,在空白的那一麵開始推導。
冇有任何停頓,也不需要打草稿。
那些複雜的流形邊界條件被他一層層剝開,代數矩陣在紙麵上以一種極具對稱美感的方式鋪展,咬合。
就像是在完成一個挺有意思的拚圖遊戲。
大概寫了小半頁紙,推完最後一步的一個對映,得出的代數式剛好和書上的那個結論嚴絲合縫。
陳拙停下筆,看著紙麵上的算式,心裡湧起一陣成就感。
他把鋼筆蓋上,放在一邊,伸手拿過旁邊那個水杯,喝了一口水。
水有些涼了,但他並不在意。
就在這個時候,對門216宿舍的門被人猛地一把拉開了。
緊接著,走廊裡傳來拖鞋踩在地板上急促的踩踏聲,直衝著215過來。
215的門被一把推開大半。
楚戈頂著一頭抓得像鳥窩一樣的亂髮,走了進來。
他眼眶下一圈烏青,臉色灰白,身上的T恤皺巴巴的,整個人透著一股剛從網咖熬了三天三夜出來的頹廢感和焦躁感。
隨著門被推開,216宿舍裡的聲音也清晰地傳了進來。
那是兩台老舊的組裝電腦主機,機箱風扇因為滿負荷運轉,發出猶如拖拉機上坡一般的巨大轟鳴聲。
在這片轟鳴聲中,還能聽到陸嘉在對麵歎氣的聲音。
“拙哥。”
楚戈一屁股坐在陳拙旁邊的空椅子上,身體往後一靠,仰著頭看著天花板,長長地歎了一口氣。
陳拙把手裡的水杯放下,轉過頭看著他。
“卡住了?”
陳拙問得很理所當然,每次楚戈來找自己八成都是因為這事。
王大勇蹲在陽台邊,也轉過頭,舉著手裡一直冇撕開的調料包問。
“楚老闆,這水都快燒乾了,麵到底下不下?剛纔去你們宿舍看,陸嘉連話都不跟我說,我都冇敢問他晚上要吃幾包。”
楚戈伸手用力搓了一把臉,聲音有氣無力。
“大勇,先把電拔了。彆燒了。”楚戈苦笑了一聲,“這麵今天晚上能不能吃得上,還是個問題。”
王大勇愣了一下,趕緊伸手把牆上的插頭拔了下來。
電熱杯裡翻滾的水麵失去了熱源,漸漸恢複了平靜,隻剩下一絲白色的熱氣往上冒。
“又出什麼事了?”
陳拙轉過身,麵向楚戈,他順手把桌上的朗道合上,往旁邊推了推,騰出了一點交流的空間。
楚戈指了指對門216的方向,眉頭擰成了一個死結。
“死迴圈了,徹底卡死了。”
楚戈歎了口氣。
“市裡那個搞醫藥批發的老闆,這陣子不是賺翻了嗎?各大醫院、鄉鎮衛生院還有連鎖藥房,天天找他要84消毒液,口罩和板藍根,他以前那個單機版的Access進銷存庫直接崩了,找咱們用SQL Server重新寫一套。”
楚戈越說越煩躁,從口袋裡摸出一根菸,想點,看了看陳拙,又煩躁地塞了回去。
“本來就是個簡單的進出庫,寫個前端連個庫就行,但是老闆非要加一個變態的調配邏輯。”
楚戈比劃著手勢。
“貨源緊缺,市級醫院的單子要絕對優先,然後是連鎖大藥房,最後纔是下麵縣城的小診所,而且不能把小診所全斷了,得留個百分之十的底倉給他們按比例分。”
陳拙安靜地聽完,冇有插話。
“陸嘉寫統籌演演算法的時候,用的是巢狀迴圈。”
楚戈揉了揉太陽穴,有點頭疼。
“如果來的是醫院訂單,走路線A,查庫存,扣減,如果是藥房,走路線B,查庫存,按比例扣減,邏輯上冇毛病。”
楚戈頓了頓,臉色變得很難看。
“但是今天晚上交工,我跟陸嘉倒了三萬條模擬資料進去做壓力測試,三萬個訂單帶著不同的優先順序標簽同時擠進來,那些If和Else的條件判斷套了五六層。伺服器要在後台把這幾萬個訂單反覆遍曆,比對,排序。”
“然後呢?”陳拙問。
“然後CPU占用率直接飆到百分之百,記憶體吃滿,機箱風扇轉得快冒煙了,係統宕機。”
楚戈靠在椅背上。
“這演演算法的時間複雜度太高了,我和陸嘉在對麵調了一下午的引數,怎麼改最後都是死迴圈,老闆說今晚必須看到跑通,要是扛不住這三萬條併發,萬把塊錢的尾款就冇了。”
楚戈說完,眼巴巴地看著陳拙。
“拙哥,你腦子好使,數學底子厚,你幫著捋捋,這底層邏輯到底是哪出毛病了?”
陳拙坐在椅子上,目光落在桌麵的那本《朗道》上,靜靜地思考了幾秒鐘。
他聽懂了。
楚戈和陸嘉遇到的問題,在於他們試圖用最直接,最笨重的窮舉法去走迷宮。
在資料量小的時候,挨個判斷身份,排隊,分配,計算機算得過來。
但資料量一旦呈指數級爆發,巢狀迴圈就會變成一個計算黑洞。
這和他之前看普林斯頓團隊那篇論文時遇到的死結,在純邏輯上是同構的。
德裡安的團隊試圖用連續的時空微積分去跨越奇點,結果遇到了發散,楚戈他們試圖用線性的條件判斷去處理龐大的交叉訂單,結果遇到了記憶體溢位。
陳拙點了點頭。
“思路從一開始就偏了。”
陳拙語氣平穩。
楚戈愣住了,半張著嘴。
“偏了?按條件判斷分配,這不是程式設計書上教的最穩妥的統籌方法嗎?”
陳拙冇急著解釋。
他伸手把剛纔那張寫滿了物理推導公式的草稿紙拿了過來。
他看了一眼紙麵上密密麻麻的算式,那是剛剛補全的朗道理論,陳拙很自然地把紙翻了個麵,露出印著廢棄C語言程式碼的那一麵。
這上麵的程式碼行距很寬,中間有很多留白的區域。
在空白處,用鋼筆輕輕點了一個黑色的墨點。
“你們把這些訂單當成了排隊買票的人。”
陳拙一邊畫,一邊說。
“隊伍太長,你們就在檢票口設了三個不同的通道,每過來一個人,你們都要問一遍:你是哪裡的?然後再決定讓他走哪個通道,人一多,檢票口就徹底堵死了。”
楚戈湊近了點,盯著陳拙筆尖下那個黑點。
“那不排隊怎麼分?”楚戈問。
陳拙在那個黑點旁邊,又畫了幾個相隔很遠的黑點,然後用直線把它們連線起來。
“當成一個個獨立的狀態節點。”
陳拙手腕微轉,在紙上畫出了一個二分圖的結構,而不是楚戈說的樹狀分支。
“放棄線性遍曆的思維,把醫院、藥房、診所,直接抽象成帶有不同權重的代數點,把現有的庫存物資,也抽象成一個集合。”
陳拙在紙上的空白處,快速寫下幾個離散數學裡的基礎變數,然後套用了一個極簡的矩陣對映公式。
“在這個離散矩陣裡,不需要去問如果,訂單進來,自帶權重值,醫院是3,藥房是2,診所是1,直接讓訂單矩陣和庫存矩陣做乘法對映,權重高的,自然優先匹配到庫存節點。”
陳拙在公式末尾補了一筆。
“如果庫存節點歸零,它在矩陣裡就失效了,後續的對映自動跳過,所有的判斷都在一步矩陣運算裡完成,而不是去跑幾萬次的巢狀迴圈。”
寫完最後一行,陳拙把草稿紙推到楚戈麵前。
楚戈低頭盯著紙上那個清晰的矩陣結構,他的大腦在迅速把這些數學符號翻譯成自己熟悉的資料庫語言。
楚戈雖然數學底子冇有陳拙他們那麼好,但畢竟還是能混進科大少年班這種地方待著,邏輯理解能力還勉強算是一流的。
看了大概半分鐘。
“我靠......”
楚戈猛地抬起頭,眼睛裡剛纔那種頹廢感一掃而空,取而代之的是一種豁然開朗的亮光。
“雜湊表對映加權重排序......”楚戈看著陳拙。
“把所有的條件判斷提前轉化為鍵值權重,然後直接做集合對映,這樣一來,伺服器根本不需要去逐條比對,它隻做一次整體的代數運算!”
“嗯。”
陳拙把鋼筆放下。
“運算量起碼能降幾個數量級,再多的模擬資料衝進來,也就是矩陣的維度變大了一點,CPU不會滿載。”
楚戈一把抓起桌上那張草稿紙,就像抓著一張救命的支票。
他連看都冇看紙的背麵寫著什麼,直接站起身。
“大勇,水溫著,彆倒!”楚戈衝著角落喊了一嗓子,聲音都劈叉了,“咱們今晚有救了!”
說完,楚戈拿著那張雙麵草稿紙,頭也不回地衝出了215宿舍。
風風火火地跑向對麵,緊接著是216的門被一腳踢開的聲音。
“陸嘉!彆死磕你那個巢狀迴圈了!快來看看拙哥畫的這個離散矩陣!把邏輯重構一下!”
楚戈的大嗓門在對麵宿舍裡迴盪。
215宿舍裡重新安靜了下來。
王大勇麻溜地把電熱杯的插頭重新插上牆上的插座,剛纔還冇涼透的水,冇過一會兒又開始冒出細密的氣泡,蓋子再次發出叮噹的響聲。
陳拙坐在椅子上,伸手輕輕揉了揉自己的後脖頸。
剛纔看書看久了,一直低著頭,肩膀確實有些發酸。
“拙哥。”
大勇蹲在地上,抬頭看了他一眼,笑得有些憨厚。
“還是你厲害,楚老闆剛纔進來的時候,臉都是灰的,出去的時候臉都紅了。”
陳拙笑了笑,冇有接話。
他轉過身,把那本厚重的俄文《朗道》重新翻開,視線平穩地落回到剛纔夾著書簽的那一頁上。
走廊對麵的216宿舍裡,傳來陸嘉有些壓抑但語速極快的聲音。
隨後,就是一陣比之前更加猛烈,更加密集的敲擊鍵盤聲。
劈裡啪啦,像是急促的雨點砸在鍵盤上,冇有了之前的停頓和煩躁,隻有順暢到底的執行。
陳拙冇有去管對麵的動靜,連頭都冇有回一下。
他知道隻要底層邏輯的死結解開了,剩下的程式碼實現工作對於楚戈來說,就隻是純粹的體力活,完全不需要他操心。
他低下頭,繼續看著俄文書上關於熱力學的一大段理論闡述。
遇到稍微有些拗口的句子,便再次翻開手邊的《俄漢詞典》,按著字母順序快速查閱,沉浸在朗道的思維世界裡。
窗外的天色漸漸暗了下來。
徽州四月的傍晚,老樹新長出的葉子在晚風中微微搖晃。
校園裡的大喇叭準時響了起來,播放著新聞播音員字正腔圓的聲音,播報著全國各地每天新增的疑似和確診病例數字,提醒同學們注意開窗通風,勤洗手。
封校的日子,每天的軌跡都是這樣單調且讓人覺得有些壓抑。
大門緊鎖,食堂的菜色翻來覆去就那麼幾樣,每個人都被困在這個幾平方公裡的校園裡。
但宿舍裡的這點菸火氣和打字聲,把這種沉悶沖淡了不少。
電熱杯裡的水徹底沸騰了,大勇撕開兩包老壇酸菜麵的包裝袋,把乾硬的麪餅掰成兩半,扔進翻滾的開水裡。
陳拙抽了抽鼻子。
看了一下午的理論物理,腦子轉得飛快,這會兒聞到泡麪的味道,肚子確實很誠實地發出了抗議的咕嚕聲。
“大勇。”
陳拙目光還停在書頁上,隨口問了一句。
“晚上咱們到底下幾包麵?”
大勇拿了雙乾淨的一次性筷子,在鍋裡攪和著泡麪。
“不知道啊,楚老闆還冇發話。”
大勇吞了口口水,盯著鍋裡的麪條。
“不過看剛纔那架勢,這活兒應該是能成,要是尾款結了,咱們也不差這一包兩包的吧,大不了我把我那份分點出來。”
就在大勇話音剛落的時候。
對門216宿舍裡突然爆發出一聲壓抑的低吼。
“跑通了!”
是陸嘉的聲音,平時的那個悶葫蘆,這一嗓子喊得極其破音,帶著一種如釋重負的解脫感。
緊接著,是楚戈放肆的大笑聲,笑得有些癲狂。
“哈哈哈!三萬條資料併發,伺服器連警報都冇響一下!記憶體占用穩在百分之十五!這曲線平穩得跟心電圖似的!”
楚戈在那邊大喊大叫。
“陸嘉,儲存錄影!馬上給老闆的郵箱發過去!今晚這錢穩了!”
聽著對麵走廊傳來的狂歡動靜,陳拙拿著鋼筆的手停在半空。
他嘴角微微上揚,把鋼筆蓋上,合上了那本俄文版的《朗道》。
走廊裡又是一陣拖鞋的狂奔聲。
楚戈衝進215宿舍,臉上的烏青好像都散了不少,整個人散發著一種熬夜乾完大專案,死裡逃生後的亢奮感。
他手裡還攥著陳拙剛纔給他的那張正反兩麵都寫滿公式的草稿紙。
“拙哥!”
楚戈雙手撐在陳拙的桌子上,大口喘著粗氣。
“拙哥牛逼!你那個離散矩陣一加上去,係統跑得比德芙還絲滑,尾款保住了!”
“保住了就好。”
陳拙點了點頭,語氣中帶著一點輕鬆。
對他來說,這隻是一件順理成章的事情,數學邏輯對了,結果自然就對了。
這和他剛纔在紙的背麵驗證一個那位大佬的推導過程,冇有任何本質上的區彆。
楚戈轉頭看著蹲在陽台邊的大勇,又看了看翻滾的電熱杯裡已經煮軟的麪條。
“大勇,麵煮得怎麼樣了?”
楚戈大手一揮,豪氣乾雲。
“今天晚上咱們算是搞定了,等老闆驗收完打了尾款,明天去校內超市給你們弄點好吃的加餐,全算我的!我買單!”