8月24日,周日。
早上八點,林遠到工作室的時候,趙強和李哲已經坐在工位上了。
桌上攤著三罐紅牛、一袋麵包、兩台跑著Consumer的測試機。
"周末還來?"林遠放下包。
趙強頭也不抬:"內存泄漏不修完,我睡不著。"
李哲抬頭看了一眼,又低下去盯屏幕。面前攤著四頁手寫筆記,全是代碼邏輯推演。
林遠沒再多說,拉了把椅子坐下,把昨晚的計劃拆成具體步驟。
"分三步。第一步,李哲的TempFileGuard輔助類——構造函數創建臨時文件,析構函數刪除。第二步,掃描引擎里七處調用臨時文件的地方,全部改成TempFileGuard模式。第三步,逐處review,跑壓力測試驗證。"
"開始吧。"
李哲昨晚已經把TempFileGuard寫出來了。
三行核心代碼,乾淨利落。構造函數裡創建臨時文件,析構函數裡刪除——昨天講的RAII思路,今天凌晨就變成了可編譯的代碼。
趙強看了十分鐘。
"異常路徑考慮了沒有?析構函數裡如果刪除失敗——"
"加了雙重保險。"李哲調出代碼,"析構函數裡先檢查文件是否存在,再執行刪除。刪除失敗的話,寫日誌標記,不拋異常。"
趙強又看了幾秒,微微點頭:"乾淨。"
然後開始適配。掃描引擎里七處調用臨時文件的地方,全部改成TempFileGuard模式。趙強改一處,李哲review一處。兩個人配合默契——一個改完,另一個三秒內就能看出問題。
第三處有個邊界條件,臨時文件路徑包含中文字符,析構函數裡的編碼轉換出了問題。李哲看了一眼,改了一行。
"繼續。"
林遠坐在旁邊看代碼,隨時準備驗證。
十點半,七處全部改完。
"跑測試。"林遠說。
壓力測試啟動。掃描引擎持續高負載運行,內存監控程序每秒記錄一次數據。
第一輪,四十分鐘。
內存曲線穩步上升,然後——穩住了。不再漲。
趙強盯著屏幕:"穩定在38MB,沒有持續增長。"
"泄漏點拔掉了。"林遠說,"繼續跑,換更大的並發量。"
第二輪,一小時二十分鐘。內存曲線平穩得像一條直線——峰值39MB,波動不超過2MB。
第三輪,一個半小時。內存峰值41MB,然後完全平穩。零泄漏。
趙強靠在椅背上,長長地吐了一口氣:"李哲,這個方案——紮實。"
李哲難得笑了一下。
林遠在旁邊看完了全程:"過了。接下來把改動匯總,測試報告寫出來,打包更新Consumer測試版本。"
中午十二點半。
孟薇薇端著一兜包子進來。
"你們不吃早飯也不吃午飯?"
趙強接過包子咬了一口:"修完了。"
"內存泄漏?"
"李哲的RAII方案,我適配的調用層。跑了三輪壓力測試,零泄漏。"
張浩然和王晨也湊了過來。林遠看了一眼兩人:"下午把內測反饋的測試報告整理一下,放進項目文檔。Consumer的每一次質量改進都要留記錄。"
孟薇薇把反饋表攤在桌上:"內測用戶那邊,我又收了八份新反饋。加上之前的二十六份,一共三十四份。"
"新的反饋說什麼?"
"兩個好消息。"孟薇薇翻到第二頁,"第一,有三個海外用戶主動幫我們把Consumer翻譯成了日語和德語——他們覺得好用,想推薦給本國朋友。"
"自發翻譯?"林遠挑了一下眉。
"對。日本用戶還建了一個非官方的日語使用說明頁面,已經有二十多個人收藏了。"
"第二呢?"
"一個德國用戶在反饋里寫了整整兩頁的bug分析,連復現步驟、截圖和網絡抓包數據都附上了。"
"德國人做事確實嚴謹。"林遠笑了一下。
"還不止。"孟薇薇翻到第三頁,"這個德國用戶的分析不是普通反饋——他定位了更新模塊的超時問題,懷疑是DNS解析在部分歐洲ISP上的延遲導致的。附了一張網絡包分析截圖,標註了三個延遲節點。"
林遠拿過來仔細看了兩分鐘。
德國用戶不僅描述了現象,還抓了包,標註了DNS解析路徑上三個節點的響應時間——從美國CDN節點到德國ISP,中間經過法國中轉,每一跳的延遲都標得清清楚楚。
"這個分析水平不低。"林遠說,"趙強,你看看——這就是你說的CDN節點覆蓋不足的第三方佐證。"
趙強接過去掃了一眼,眼神亮了:"他抓的包跟我的判斷完全一致。三個延遲節點,兩個在歐洲境內。如果我們在荷蘭或法蘭克福部署CDN備用節點,這個延遲可以直接砍掉八成。"
"那就加。"林遠說。
"還有一個數據。"孟薇薇翻到最後一頁,"上周SourceForge下載量我統計了——從上周日到今天,新增了二百一十次。"
"二百一十?"蘇明遠從外面走進來,剛好聽到這個數字。
"對。上周是一百三十,這周直接漲了百分之六十二。"
蘇明遠放下手裡的東西:"我查一下後台排名。"
他打開SourceForge項目管理頁面,找到Consumer的頁面。
頁面頂部多了一個標籤——"Rising Star"。
"新星標籤。"蘇明遠念出來,"SourceForge自動給增速最快的新項目打的。再漲一周——"
"就能上'本周熱門新項目'榜。"林遠說,"按目前的增速,下周日之前必然上榜。"
"上之後呢?"
"上之後才是真正的流量入口。"林遠說,"SourceForge熱門榜是全球開發者找工具的第一站。Nessus、Wireshark、FileZilla,所有知名開源工具都是從那個榜單被發現的。進前十,下載量至少翻三倍。"
蘇明遠眼睛亮了:"三倍?"
"前提是產品質量扛得住。"林遠看向趙強,"熱門榜帶來的是全球流量。流量來了,bug也會被放大。所以這周——所有已知bug必須全部清掉。"
趙強點頭:"右鍵菜單下午搞定。CDN備用節點的配置文檔我下午也寫出來,域名和DNS配置的部分讓明遠處理。"
"五個bug,內存泄漏修了,右鍵菜單下午修,進度條呢?"
張浩然舉手:"進度條的問題是掃描完成後狀態回調的時序bug,已經定位到了,下午修。"
"好。"林遠說,"進度條和右鍵菜單今天必須搞定。多語言缺失優先級最低,放後面。"
傍晚。
林遠回到楠書房,打開郵箱。
SourceForge的工作郵箱裡,多了一封David的回覆。
"林,感謝詳細回復。確認如下:第一,同意作為用戶案例展示,可隱去公司名稱,保留行業描述和CTO職位。第二,同意加入長期內測計劃,NexaWeb願意持續提供malware樣本和用戶反饋。第三,企業版請在開發進度中優先考慮。我們下個財年有安全專項撥款,如果屆時可用,我有很大興趣推動採購評估。"
最後一行:"Keep up the great work."
林遠看完,靠在椅背上。
三條核心信息:用戶案例授權、長期內測參與、企業版採購意向。
五百人公司CTO,親筆寫"同意做用戶案例"。Consumer的產品頁面上,即將出現一條來自矽谷的重量級推薦語。
"小艾,幫我擬一封回信。"
幾秒鐘後,回信草稿出現在腦海里。
林遠掃了一遍,微調了一處措辭——把"感謝你的信任"改成"感謝你和Jack的反饋,正是像你們這樣的用戶讓產品變得更好"。
工程師之間說話,真誠比客套有力。
"發送。"
窗外,夕陽把楠書房的院子染成金色。
今天一天,內存泄漏修了,RAII驗證通過,SourceForge新增210次下載,David三連確認。
明天周一,新一周。
每一步都在加速。