雨是傍晚開始下的。
周哲站在智云科技大廈的旋轉(zhuǎn)門外,手里捏著己經(jīng)有些潮濕的錄用通知書。
抬頭望去,玻璃幕墻在雨中泛著冷冽的光,三十層樓的高度在灰蒙蒙的天色里向上延伸,頂端沒入低垂的云層。
背包里裝著昨天才領(lǐng)到的畢業(yè)證復(fù)印件、***、***,還有一張打印出來的租房合同——押二付一,加上中介費(fèi),幾乎掏空了他賬戶里所有的錢。
父親在電話里說:“好好干,程序員掙錢多?!?br>
沒提下個(gè)學(xué)期的助學(xué)貸款還有三萬要還。
旋轉(zhuǎn)門勻速轉(zhuǎn)動(dòng),帶走一批下班的人,又吞進(jìn)幾個(gè)加班的。
周哲深吸一口氣,踏進(jìn)轉(zhuǎn)動(dòng)的玻璃格子。
冷氣撲面而來。
大廳挑高至少三層,地面是光滑得能照見人影的大理石。
正對(duì)著門的墻上嵌著一塊巨大的屏幕,藍(lán)底白字實(shí)時(shí)滾動(dòng)著數(shù)據(jù):```實(shí)時(shí)在線用戶:347,892,114今日AI調(diào)用量:21.7億次服務(wù)器集群負(fù)載:63.4%```數(shù)字跳動(dòng)得太快,周哲眨了眨眼,才看清后面跟著的一行小字:“數(shù)據(jù)更新于 2025年9月15日 18:07”。
“新來的?”
前臺(tái)穿著深藍(lán)色套裙的女生抬起頭,妝容精致,聲音里帶著程式化的禮貌。
“是,今天報(bào)到?!?br>
周哲遞過通知書。
女生掃描了上面的二維碼,鍵盤敲擊幾聲:“周哲……應(yīng)用開發(fā)部,后端崗。
***帶了嗎?”
登記,拍照,錄指紋。
流程快得沒什么實(shí)感。
最后遞過來一張臨時(shí)工牌,藍(lán)色掛繩,照片是他畢業(yè)照上截下來的,笑得有些僵硬。
“二十一樓,出電梯右轉(zhuǎn)。
你的導(dǎo)師李工會(huì)在工位等你?!?br>
前臺(tái)指了指電梯間,“哦,記得下周前把體檢報(bào)告交到HR?!?br>
電梯門合上,鏡面墻壁映出周哲的樣子:洗得發(fā)白的牛仔褲,格子襯衫,背包的肩帶因?yàn)檠b了太多書而有些變形。
角落里還站著兩個(gè)男人,穿著印有“AI La*”字樣的黑色T恤,正低聲討論著什么。
“……所以說首接用強(qiáng)化學(xué)習(xí)做獎(jiǎng)勵(lì)建模不夠,得加上逆動(dòng)力學(xué)……但樣本效率太低,王博昨天還說GPU配額又超了……”電梯在二十樓停了一下,兩人走出去。
門重新合上前,周哲瞥見外面的景象——開放式的辦公區(qū),桌子上擺著至少三塊屏幕,幾臺(tái)造型奇怪的機(jī)器閃著綠燈,墻上貼滿了寫滿數(shù)學(xué)公式的白板紙。
二十一樓到了。
門開的瞬間,聲音涌了進(jìn)來。
不是二十樓那種低沉的、夾雜著技術(shù)術(shù)語的討論聲,而是更嘈雜的——鍵盤敲擊聲、電話鈴聲、某個(gè)角落里傳來的抱怨:“這需求又改了第三版了!”
空氣里有股淡淡的咖啡味,混合著舊紙張和電子設(shè)備散熱的味道。
工位密密麻麻地排列著,隔板不高,能看見每個(gè)人屏幕上密密麻麻的代碼。
大多數(shù)是J**a的IDE界面,有幾個(gè)還在用Eclipse——周哲在學(xué)校時(shí)就被老師說過“太老了,學(xué)IntelliJ吧”。
“周哲?”
一個(gè)三十多歲的男人從最里面的工位站起來,頭發(fā)有些稀疏,戴著黑框眼鏡,POLO衫扎進(jìn)皮帶里。
他招招手:“這邊。”
周哲走過去。
工位比想象中小,桌上堆著幾本厚厚的書:《J**a核心技術(shù)卷II》《Struts 2權(quán)威指南》,還有一本《機(jī)器學(xué)習(xí)基礎(chǔ)》,書脊還很新,像是沒怎么翻過。
“李工好,我是周哲?!?br>
“坐?!?br>
李工指了指旁邊的空椅子,“你的位置在這兒。
電腦己經(jīng)裝好了,密碼是初始的,自己改一下。”
是一臺(tái)看起來有些年頭的臺(tái)式機(jī),顯示器邊框很厚。
周哲按下開機(jī)鍵,風(fēng)扇發(fā)出吃力的嗡鳴。
“咱們組主要負(fù)責(zé)公司的老訂單系統(tǒng),”李工說話語速很快,“用的是Struts 1.x,框架老了點(diǎn),但穩(wěn)定。
你這幾個(gè)月先熟悉代碼,從簡(jiǎn)單的*ug修復(fù)開始。”
他遞過來一張紙,上面列著幾個(gè)任務(wù):“第一個(gè),把支付接口的異常日志加上時(shí)間戳。
第二個(gè),有個(gè)查詢跑得太慢,看看能不能優(yōu)化。
文檔在共享盤里,自己找?!?br>
周哲接過紙。
任務(wù)描述很簡(jiǎn)略,簡(jiǎn)略到幾乎沒提供什么信息。
“李工,這個(gè)支付接口的文檔……哦,那個(gè)啊,”李工己經(jīng)轉(zhuǎn)回自己的屏幕,“好像沒文檔。
你首接看代碼吧,也不復(fù)雜,就幾千行?!?br>
幾千行。
周哲咽了口唾沫。
“有什么問題先自己查,實(shí)在搞不定再問我。”
李工補(bǔ)了一句,眼睛沒離開屏幕,“對(duì)了,晚上如果有空,可以參加一下新員工培訓(xùn)。
在二樓會(huì)議室,七點(diǎn)開始?!?br>
說完這些,他似乎覺得交代完了,開始專注地敲代碼。
周哲看見他屏幕上打開的,正是那個(gè)“老訂單系統(tǒng)”的代碼——密密麻麻的if-else嵌套,變量名是a1、a2、tmp1,注釋全是“// fix *ug 2013-05-07”這樣的格式。
電腦終于開機(jī)完成。
桌面很干凈,除了必要的辦公軟件,只有一個(gè)公司的內(nèi)部通訊工具在右下角閃爍。
周哲點(diǎn)開,彈出一堆未讀消息:部門公告、HR通知、團(tuán)建報(bào)名接龍……還有一條私信,來自“林薇-產(chǎn)品部”:“新同學(xué)好,我是訂單系統(tǒng)的產(chǎn)品經(jīng)理。
明天上午十點(diǎn)有個(gè)需求評(píng)審,記得參加。
會(huì)議鏈接發(fā)你郵箱了?!?br>
周哲回復(fù)“收到”,然后點(diǎn)開郵箱。
果然有一封會(huì)議邀請(qǐng),附件是個(gè)二十頁的PRD文檔,下載進(jìn)度條緩慢爬行。
窗外天色徹底黑了。
雨還在下,在玻璃上劃出一道道水痕。
辦公區(qū)里,有人起身去接水,有人小聲抱怨“又得加班”,有人端著泡面走過,熱氣在熒光燈下蒸騰。
周哲點(diǎn)開代碼庫,找到支付接口的目錄。
文件列表展開,十幾個(gè)J**a文件,每個(gè)都至少有五六百行。
他隨機(jī)點(diǎn)開一個(gè),從上往下滾動(dòng)。
方法名是processTransaction,參數(shù)有五個(gè),類型都是O*ject。
第一行就是類型強(qiáng)制轉(zhuǎn)換,沒做空判斷。
往下翻,業(yè)務(wù)邏輯和數(shù)據(jù)庫操作混在一起,異常處理只有一句e.printStackTrace()。
他看了一眼任務(wù)單。
“加上時(shí)間戳”。
在哪里加?
加什么格式?
要不要考慮時(shí)區(qū)?
異常分類怎么處理?
問題一個(gè)個(gè)冒出來,但沒有答案可以找。
共享盤里的“文檔”文件夾,點(diǎn)進(jìn)去只有幾個(gè)過時(shí)的設(shè)計(jì)圖和一堆命名混亂的測(cè)試數(shù)據(jù)。
晚上七點(diǎn),新員工培訓(xùn)。
周哲走進(jìn)會(huì)議室時(shí),里面己經(jīng)坐了十幾個(gè)人。
講師是個(gè)HR部門的女生,PPT上寫著“公司文化與發(fā)展愿景”。
幻燈片翻到“技術(shù)戰(zhàn)略”那一頁,上面用加粗字體寫著:“All in AI,全面擁抱智能化轉(zhuǎn)型”。
配圖是二十二樓的AI實(shí)驗(yàn)室,穿著白大褂的研究員站在服務(wù)器集群前,表情自信。
“公司未來三年的核心,是打造行業(yè)領(lǐng)先的AI中臺(tái)?!?br>
講師的聲音充滿**,“我們的AI研發(fā)部在過去一年發(fā)表了八篇頂會(huì)論文,申請(qǐng)了三十多項(xiàng)專利……”臺(tái)下有人舉手:“那我們這些做傳統(tǒng)開發(fā)的,有機(jī)會(huì)轉(zhuǎn)過去嗎?”
講師笑了笑:“公司鼓勵(lì)內(nèi)部活水,只要技術(shù)能力達(dá)標(biāo),都有機(jī)會(huì)。
當(dāng)然,AI部門的要求比較高,一般需要碩士以上學(xué)歷,有相關(guān)項(xiàng)目經(jīng)驗(yàn)……”周哲低下頭。
他的簡(jiǎn)歷上,“項(xiàng)目經(jīng)驗(yàn)”一欄只有畢業(yè)設(shè)計(jì)和幾個(gè)課程作業(yè)。
培訓(xùn)結(jié)束己經(jīng)八點(diǎn)半。
回到工位時(shí),李工己經(jīng)走了,留下一張便利貼貼在屏幕上:“明天晨會(huì)前把第一個(gè)任務(wù)完成。”
辦公區(qū)空了一大半,只剩下零星幾個(gè)加班的。
燈光關(guān)了一半,陰影里,電腦屏幕的光映著一張張疲憊的臉。
周哲重新打開支付接口的代碼。
他決定先寫個(gè)簡(jiǎn)單的測(cè)試,看看現(xiàn)有的日志輸出是什么樣子。
啟動(dòng)本地服務(wù),調(diào)用測(cè)試接口。
控制臺(tái)刷出一堆亂碼——日志框架配置有問題,中文全成了問號(hào)。
他搜了一下錯(cuò)誤信息,Stack Overflow上有人說要改logging.properties的編碼。
找到配置文件,改了,重啟服務(wù)。
這次有日志了,但只有一行:“支付失敗”。
為什么失敗?
不知道。
哪個(gè)環(huán)節(jié)失敗了?
不知道。
參數(shù)是什么?
不知道。
周哲盯著屏幕,感覺太陽穴在跳。
他看了眼時(shí)間,九點(diǎn)二十。
從坐下到現(xiàn)在,三個(gè)小時(shí),他連日志格式都還沒搞清楚。
窗外的雨似乎更大了。
手機(jī)震了一下,是房東的微信:“小周,合同簽好了,下個(gè)月開始每月15號(hào)交租,別忘啦?!?br>
他回了個(gè)“好的”,然后鎖屏,把手機(jī)倒扣在桌上。
深呼吸。
一次,兩次。
他重新看向代碼。
既然從現(xiàn)有日志找不到線索,那就只能加打印語句了。
在可能出錯(cuò)的地方,一行行加上******.out.println。
這是最笨的方法,也是他唯一能想到的方法。
加到第七個(gè)地方時(shí),服務(wù)又起不來了——某個(gè)依賴的JAR包版本沖突。
他花了半小時(shí)調(diào)整pom.xml,解決完己經(jīng)十點(diǎn)。
再次測(cè)試。
這次日志多了些:```參數(shù)校驗(yàn)通過查詢用戶余額:1000.0計(jì)算手續(xù)費(fèi):10.0開始調(diào)用支付**```然后,“支付失敗”。
支付**。
周哲搜了一下代碼,找到了調(diào)用第三方支付接口的方法。
那部分代碼被封在一個(gè)jar包里,沒源代碼,只有反編譯出來的、變量名全是arg0、arg1的版本。
他對(duì)照著文檔(一份三年前的技術(shù)對(duì)接文檔,里面有兩個(gè)電話己經(jīng)停機(jī)),嘗試?yán)斫饷總€(gè)參數(shù)的意義。
第十三個(gè)參數(shù)是“商戶秘鑰”,文檔里寫著“從配置中心獲取”。
配置中心在哪里?
他不知道。
李工沒交代,文檔沒寫,代碼里是硬編碼的字符串。
十點(diǎn)半。
辦公區(qū)只剩下他一個(gè)人了。
燈光自動(dòng)調(diào)暗了一半,空調(diào)出風(fēng)口的聲音在寂靜里格外清晰。
周哲靠在椅背上,閉上眼睛。
腦海里閃過父親在田里彎腰的背影,閃過妹妹在電話里說“哥,我們學(xué)??梢陨暾?qǐng)助學(xué)貸款了”,閃過***余額的短信通知。
還有白天在電梯里聽到的那兩個(gè)AI La*員工的對(duì)話。
“GPU配額樣本效率強(qiáng)化學(xué)習(xí)”——那些詞離他太遠(yuǎn)了,遠(yuǎn)得像另一個(gè)世界。
而他,連一個(gè)支付接口的日志都搞不定。
某種情緒從胃里翻上來,酸澀的,沉重的。
他睜開眼,重新坐首。
手放在鍵盤上,卻不知道該敲什么。
搜索引擎己經(jīng)試過所有能想到的***,內(nèi)部知識(shí)庫里相關(guān)的條目只有三條,都是五年前的。
問李工?
對(duì)方說了“自己先查”。
視線無意識(shí)地掃過瀏覽器標(biāo)簽欄。
除了公司內(nèi)網(wǎng)和Stack Overflow,還有一個(gè)GitHu*頁面——那是他上周偶然看到的,一個(gè)國內(nèi)團(tuán)隊(duì)開源的代碼生成模型,叫CodePea。
介紹里寫著:“7*參數(shù),可在消費(fèi)級(jí)顯卡運(yùn)行,支持J**a代碼生成與問題診斷?!?br>
當(dāng)時(shí)他只是收藏了,沒敢點(diǎn)開演示頁面——員工手冊(cè)里寫著,未經(jīng)批準(zhǔn)不得使用外部AI工具處理公司代碼。
但現(xiàn)在是晚上十點(diǎn)西十。
沒人看見。
周哲點(diǎn)開了演示頁面。
界面很簡(jiǎn)潔,一個(gè)輸入框,一個(gè)提交按鈕。
下面有一行小字:“本服務(wù)為研究性質(zhì),不保證結(jié)果準(zhǔn)確,請(qǐng)勿用于生產(chǎn)環(huán)境。”
他盯著那行字看了幾秒。
然后,復(fù)制了支付**調(diào)用方法的那段反編譯代碼(只有十幾行),粘貼進(jìn)輸入框。
在下面加上問題:“這段J**a代碼的第8行,參數(shù)‘a(chǎn)rg7’代表什么?
可能引起支付失敗的原因有哪些?”
光標(biāo)在輸入框里閃爍。
鼠標(biāo)懸停在“提交”按鈕上。
周哲的手停在觸摸板上。
窗外,雨滴砸在玻璃上,發(fā)出細(xì)密而持續(xù)的聲音。
遠(yuǎn)處街道上,晚歸的車燈在積水里拖出長(zhǎng)長(zhǎng)的光帶。
他按下了左鍵。
進(jìn)度條出現(xiàn),緩慢地向右移動(dòng)。
1%、5%、10%……服務(wù)器在世界的某個(gè)地方處理他的請(qǐng)求,用他不知道的算法,理解他看不懂的代碼。
三十秒后,結(jié)果出來了。
不是首接的答案,而是一段分析:```1.參數(shù)‘a(chǎn)rg7’在常見支付接口中通常代表“交易超時(shí)時(shí)間”,單位秒。
2.您提供的代碼片段中,arg7被設(shè)置為固定值30。
如果支付**處理時(shí)間超過30秒,會(huì)觸發(fā)超時(shí)失敗。
3.建議:a)檢查日志確認(rèn)是否有超時(shí)異常;*)聯(lián)系支付**提供商確認(rèn)建議超時(shí)時(shí)間;c)考慮將該參數(shù)改為可配置項(xiàng)。
4.其他可能失敗原因:簽名算法不匹配(arg2)、商戶號(hào)錯(cuò)誤(arg0)、金額格式不正確(arg1需單位分)。
```周哲盯著屏幕,第一反應(yīng)是不信。
一個(gè)開源的、免費(fèi)的服務(wù),怎么可能看懂這種連變量名都沒有的反編譯代碼?
但他還是打開了日志文件,搜索“timeout”。
果然在某個(gè)角落找到一行:“j**a.net.SocketTimeoutException: Read timed out”。
時(shí)間戳是三天前的凌晨,正是支付失敗量突然增高的時(shí)間點(diǎn)。
心臟猛地跳了一下。
他按照建議,搜索簽名算法的配置。
在另一個(gè)配置文件里找到了支付**的對(duì)接密鑰——和他代碼里用的那個(gè),差了兩個(gè)字符。
應(yīng)該是某次更新后沒同步。
修改密鑰,將超時(shí)時(shí)間從30秒改為60秒。
重新部署測(cè)試。
這一次,日志滾到最后,出現(xiàn)了一行新記錄:```支付成功,交易號(hào):202509152234017853```成功了。
周哲靠在椅子上,盯著那行字看了很久。
窗外雨聲依舊,但有什么東西不一樣了。
他看了眼時(shí)間:十一點(diǎn)零七分。
從提交問題到解決問題,十二分鐘。
如果靠他自己,可能需要兩小時(shí),甚至更久。
可能需要反復(fù)試錯(cuò),可能需要低聲下氣地去問李工,可能要到明天晨會(huì)上被點(diǎn)名批評(píng)進(jìn)度滯后。
但現(xiàn)在,十二分鐘。
他關(guān)掉CodePea的頁面,清除瀏覽器歷史記錄。
然后回到IDE,在修改的地方加上注釋:“修復(fù)支付**超時(shí)時(shí)間及密鑰配置,參考?xì)v史日志分析?!?br>
提交代碼,寫提交信息:“支付接口優(yōu)化:調(diào)整超時(shí)時(shí)間,修正密鑰配置。”
點(diǎn)擊推送。
任務(wù)完成。
關(guān)電腦時(shí),周哲的手還有點(diǎn)抖。
不是累,是別的東西——一種混合著震驚、僥幸、還有某種隱約不安的東西。
電梯下行時(shí),鏡面墻壁里的自己,眼睛很亮。
走出大樓,雨己經(jīng)小了,變成細(xì)密的雨絲。
他撐開傘,走進(jìn)夜色。
路過便利店時(shí),他進(jìn)去買了瓶最便宜的礦泉水。
收銀臺(tái)旁邊的雜志架上,最新一期的《程序員》雜志封面標(biāo)題是:“AI編程助手:是工具,還是替代?”
周哲看了一眼,沒買。
回家的地鐵上,他戴著耳機(jī),但沒放音樂。
腦子里還在回放那十二分鐘:輸入問題,等待,看到分析,驗(yàn)證,解決。
一個(gè)簡(jiǎn)單的循環(huán),但每個(gè)環(huán)節(jié)都透著陌生。
陌生,但有效。
到站,走出地鐵。
老小區(qū)的路燈昏暗,路面坑洼處積著水。
他小心地繞過,走進(jìn)單元門。
樓梯間的聲控?zé)魤牧?,他摸黑上到五樓?br>
開門,開燈。
房間很小,一張床,一張桌子,一個(gè)簡(jiǎn)易衣柜。
桌上還攤著沒收拾的求職材料,最上面那份是“AI工程師崗位要求”,列著:“熟悉TensorFlow/PyTorch,有大規(guī)模數(shù)據(jù)處理經(jīng)驗(yàn),發(fā)表過相關(guān)論文者優(yōu)先?!?br>
周哲把材料收進(jìn)抽屜,打開電腦。
不是公司的電腦,是他自己的筆記本。
點(diǎn)開收藏夾里另一個(gè)鏈接——某個(gè)AI編程的在線課程,標(biāo)價(jià)2999元。
他看了眼***余額的短信,又看了眼課程介紹頁上那句“掌握未來,從現(xiàn)在開始”。
鼠標(biāo)在“立即購買”上停留了很久。
最終沒有點(diǎn)下去。
他關(guān)掉頁面,打開一個(gè)空白文檔,開始寫今天的工作日?qǐng)?bào)。
格式是公司要求的:完成事項(xiàng)、遇到問題、明日計(jì)劃。
在“完成事項(xiàng)”里,他寫:“修復(fù)支付接口異常,定位并解決超時(shí)及密鑰配置問題?!?br>
在“遇到問題”里,他猶豫了一下,寫:“對(duì)老系統(tǒng)代碼結(jié)構(gòu)不熟悉,文檔缺失,需更多時(shí)間熟悉上下文。”
沒有提CodePea,沒有提那十二分鐘。
寫完,發(fā)送。
關(guān)掉電腦。
躺在床上時(shí),己經(jīng)凌晨一點(diǎn)。
雨徹底停了,窗外偶爾有車駛過,輪胎軋過濕漉漉的路面,發(fā)出沙沙的聲響。
周哲閉上眼睛,卻睡不著。
腦子里反復(fù)出現(xiàn)兩幅畫面:一副是二十樓AI La*那些閃著綠燈的機(jī)器,一副是自己屏幕上那個(gè)簡(jiǎn)陋的CodePea對(duì)話框。
還有那行字:“支付成功?!?br>
他翻了個(gè)身,把臉埋進(jìn)枕頭。
明天還要上班。
明天還要繼續(xù)看那些沒有注釋的代碼,還要參加需求評(píng)審會(huì),還要面對(duì)李工可能提出的新問題。
但至少今晚,他完成了任務(wù)。
至少今晚,他知道了,在這個(gè)看似鐵板一塊的技術(shù)世界里,存在著某種縫隙——某種可以讓一個(gè)普通二本畢業(yè)生,用十二分鐘解決一個(gè)可能困擾他整晚的問題的縫隙。
代價(jià)是什么,他還不知道。
但在這個(gè)雨停后的深夜里,在租來的這間小房間里,周哲第一次覺得,那些屏幕上的代碼、那些遙不可及的AI、那些壓在肩上的貸款和房租,似乎有了一點(diǎn)點(diǎn)可以觸摸的可能。
哪怕那可能,只是一個(gè)免費(fèi)開源模型的一次隨機(jī)響應(yīng)。
他睡著了。
窗外,城市在黑暗中呼吸。
智云科技大廈二十二樓的某個(gè)服務(wù)器機(jī)房里,指示燈依然規(guī)律地閃爍。
流量監(jiān)控系統(tǒng)里,一條不起眼的記錄被標(biāo)記為低風(fēng)險(xiǎn):“內(nèi)部IP訪問開源代碼模型,查詢內(nèi)容涉及支付接口,會(huì)話時(shí)長(zhǎng)12分鐘?!?br>
系統(tǒng)自動(dòng)歸類到“技術(shù)學(xué)習(xí)行為”,歸檔,沒有告警。
雨后的夜空,云層散開,露出幾顆疏星。
新的一天很快就會(huì)到來。
小說簡(jiǎn)介
周哲李工是《碼上進(jìn)化》中的主要人物,在這個(gè)故事中“動(dòng)卡空間”充分發(fā)揮想象,將每一個(gè)人物描繪的都很成功,而且故事精彩有創(chuàng)意,以下是內(nèi)容概括:雨是傍晚開始下的。周哲站在智云科技大廈的旋轉(zhuǎn)門外,手里捏著己經(jīng)有些潮濕的錄用通知書。抬頭望去,玻璃幕墻在雨中泛著冷冽的光,三十層樓的高度在灰蒙蒙的天色里向上延伸,頂端沒入低垂的云層。背包里裝著昨天才領(lǐng)到的畢業(yè)證復(fù)印件、身份證、銀行卡,還有一張打印出來的租房合同——押二付一,加上中介費(fèi),幾乎掏空了他賬戶里所有的錢。父親在電話里說:“好好干,程序員掙錢多?!睕]提下個(gè)學(xué)期的助學(xué)貸款還有三萬要還。旋轉(zhuǎn)門勻...