第9章 技術青年集結令

投票推薦 加入書籤 小說報錯

  陳明的電話是早上九點打來的。

  林浩正在吃早飯,一碗白粥,一碟鹹菜。電話鈴聲尖銳地響起來,母親在廚房喊:「浩子,接電話!」

  他放下筷子,走到客廳。老式電話機是紅色的,聽筒很重。他拿起:「餵?」

  「林浩嗎?我是搜狐的陳明。」

  「陳編輯,您好。」

  「哎,別這麼客氣。」陳明的聲音聽起來心情不錯,「你那個遊戲,數據太好了。上線一周,日均點擊破五萬,用戶平均停留時間超過八分鐘。這在Flash遊戲裡是現象級的。」

  「謝謝。」林浩說,語氣平靜。

  「我們領導看了數據,說想跟你長期合作。你手頭還有新項目嗎?」

  「在做一個消除類的,物理引擎的。」

  「物理引擎?」陳明頓了頓,「Flash還能做物理引擎?」

  「簡化版的,剛體碰撞,重力模擬。」

  「行,你做出來咱們再談。」陳明說,「另外,有件事……方便透露你的聯繫方式嗎?有幾個圈內人,看了你的遊戲,想認識你。」

  林浩沉默了兩秒:「暫時不方便。有什麼事可以通過您轉達。」

  「理解,理解。」陳明笑了,「搞技術的都這樣,喜歡低調。那我給你個郵箱,你有新作品或者想合作,隨時聯繫。」

  掛了電話,林浩回到飯桌。粥已經涼了,他幾口喝完,收拾碗筷。

  母親從廚房出來,擦著手:「誰呀?」

  「搜狐的編輯,說遊戲數據不錯。」

  「哦……」母親似懂非懂地點點頭,「那你繼續做,媽支持你。」

  回到房間,林浩打開電腦。先登錄閃客帝國,後台消息99+。私信、評論、好友申請,大部分是夸遊戲的,小部分是求合作的,還有幾個是質疑他抄襲的——說他肯定不是新人,是哪個大佬的馬甲。

  他一條條看,但不回復。他現在不需要這些虛名,他需要人。

  真正能做事的人。

  《細胞吞噬》的火爆證明了他的設計能力,但一個人的力量是有限的。他需要團隊,需要能寫代碼、能做美術、能搞運營的人。而2002年,這樣的人大多散落在全國各地,有些還在上大學,有些在網吧打工,有些可能還沒發現自己有這方面的天賦。

  他需要一個方法,找到他們。

  林浩打開論壇,進入「技術交流」板塊。這裡比作品區冷清得多,帖子不多,回復也少。大部分是初學者問基礎問題,偶爾有幾個技術討論帖,但深度有限。

  他新建一個帖子。標題:「懸賞題:用50行代碼實現粒子流體模擬」。

  正文:

  「語言:ActionScript 2.0。

  工具:Flash MX。

  要求:在550x400的舞台上,實現至少100個粒子的流體模擬效果。粒子之間要有簡單的相互作用(排斥/吸引),與邊界碰撞。代碼不超過50行(不包括空行和注釋)。

  獎勵:最佳實現者,可獲得Horizon工作室的實習邀請,及1000元獎金。

  截止時間:三天。

  提交方式:在本帖回覆中貼出核心代碼及效果截圖。

  注意:只接受原創代碼,謝絕抄襲。」

  他點了發布。

  這個題目的難度,在2002年的Flash圈,是頂尖的。粒子系統本身就不簡單,還要模擬流體,還要在50行內實現——這是故意設置的極限挑戰。能解出來的,要麼是天才,要麼是經驗豐富的老手。

  而他真正的目的,不是看誰能解出來,而是看解題的思路、代碼的風格、對問題的理解深度。

  帖子發了十分鐘,第一個回復出現了:

  「沙發!大佬又出現了!」

  「50行?開玩笑吧?」

  「粒子流體是什麼?新人求科普。」

  「Horizon工作室?沒聽過,新成立的嗎?」

  「1000元獎金!真的假的?」

  質疑的居多。2002年,一千元獎金對普通網友來說很有吸引力,但更多人懷疑是騙局。


  林浩不解釋。他關掉頁面,開始做自己的事。第二個遊戲《方塊大崩塌》已經完成了80%,他需要完善物理引擎,調整碰撞檢測的精度。

  工作到中午,他刷新了一下帖子。回複數:47。大部分是灌水,只有三個貼了代碼。

  第一個,ID「Flash小王子」,貼了八十多行代碼,實現的是簡單的粒子隨機運動,沒有相互作用,沒有流體效果。下面有人回覆:「這跟流體有關係?」

  第二個,ID「代碼詩人」,貼了六十行,實現了一個漂亮的粒子拖尾效果,但依然不是流體模擬。代碼寫得挺優雅,但跑題了。

  第三個,ID「半夏」,只貼了三十行代碼。林浩仔細看了一遍,眼睛微微眯起。

  這三十行代碼,實現了一個簡化版的SPH(光滑粒子流體動力學)算法。雖然極度簡化——只考慮了密度和壓力,忽略了粘性、表面張力——但在2002年的Flash平台上,能用三十行代碼寫出這個,已經非常驚人。

  更重要的是,代碼風格極其乾淨。變量命名規範,邏輯清晰,注釋精準。沒有多餘的語句,沒有炫技的寫法,就是最純粹、最高效的實現。

  林浩點進「半夏」的主頁。註冊時間:2002年3月。發帖數:3。都是技術提問帖,問得很深,但沒人回答。最後登錄時間:昨天。

  沒有作品,沒有簡介,沒有個人信息。像個幽靈。

  林浩記下了這個ID。他繼續往下翻,後面又出現了幾個嘗試,但都不如「半夏」的驚艷。

  下午,他接到了陳明的第二個電話。

  「林浩,你那個懸賞題,在圈裡炸了。」陳明的聲音有些興奮,「好多人問我Horizon工作室是什麼來頭,是不是國外的工作室。還有人猜你是暴雪的人,或者EA的。」

  「他們怎麼說題目的難度?」

  「都說難。有幾個認識的圈內高手試了,說50行內幾乎不可能,除非用極端的取巧方法。不過有個人做到了,ID叫『半夏』,你看到了嗎?」

  「看到了。」

  「那個人……有點意思。我打聽了一下,好像是中科大的學生,數學系的,今年大二。平時獨來獨往,不混圈子,就喜歡研究算法。」

  中科大,數學系。林浩心裡有數了。這種背景,能寫出那樣的代碼不奇怪。

  「能聯繫上嗎?」

  「我試試,但不保證。那人據說很孤僻,連宿舍同學都不怎麼說話。」陳明頓了頓,「你真要招人?工作室成立了?」

  「在籌備。」

  「需要投資嗎?我認識幾個投資人,對遊戲行業有興趣。」

  「暫時不用,謝謝。」

  掛了電話,林浩繼續工作。但心裡已經記下了「半夏」。數學天才,算法能力強,性格孤僻——這種人是技術核心的最佳人選,但管理起來有難度。

  晚上,帖子回複數破百了。又出現了幾個有價值的嘗試,其中一個ID「楚飛」的引起了林浩的注意。

  這個人沒貼完整代碼,只貼了核心算法思路:

  「不用SPH,用格子法。把舞台分成20x20的網格,每個格子記錄密度和速度。粒子只與同格子和相鄰格子的粒子交互。複雜度從O(n²)降到O(n)。50行內可以實現,但效果會粗糙。」

  下面有人回覆:「格子法不是做流體模擬的主流吧?」

  楚飛回覆:「在Flash上,性能是第一位。SPH好看但慢,格子法糙但快。如果要我選,我選格子法,然後加視覺後處理彌補粗糙度。」

  很務實。不追求理論完美,追求工程可行。這是優秀的工程思維。

  林浩點進楚飛的主頁。註冊時間:2001年8月。發帖數:87。大部分是遊戲修改、外掛製作、逆向工程相關的帖子。語氣桀驁,經常懟人,但技術確實紮實。最新一個帖子是三天前,問:「有人一起做《傳奇》私服嗎?我負責技術。」

  私服。灰色地帶。但技術能力應該不差。

  林浩記下了。楚飛,有工程能力,有實戰經驗,但走的是偏門。需要引導。

  第三個引起他注意的ID是「陸明」。這個人沒直接解題,而是回了一篇長文,分析題目本身的合理性:

  「樓主出這道題,表面是考技術,其實是考思維。50行限制是故意設置的,逼我們做取捨:要效果,還是要簡潔?要物理正確,還是要視覺近似?我的選擇是:放棄完整的流體模擬,改用元胞自動機思路。每個粒子只有幾個狀態,根據周圍粒子狀態更新。雖然不像流體,但會有類似流體的『湧現』行為。代碼35行,附圖。」


  他貼了代碼和截圖。效果確實不像傳統流體,但有一種奇異的、動態的圖案變化,很美,很魔性。

  下面有人回覆:「這不算流體模擬吧?」

  陸明回覆:「樓主沒定義什麼是『流體模擬』。我認為,能表現出流體某些特性(連續、可變形、有內聚力)的模擬,都算。我的實現可能不物理,但有趣。」

  有創意,不拘泥,懂得重新定義問題。這是產品思維。

  林浩看陸明的主頁。註冊時間:2002年1月。發帖數:42。大多是設計、藝術、心理學相關的討論,偶爾有技術帖。最新一個帖子是分享自己做的「自動生成水墨畫」的算法,用Flash實現,效果驚艷。

  藝術+技術。稀缺的組合。

  三天後,懸賞帖的回覆數定格在203。林浩從頭到尾看了一遍,最終選了五個人:半夏、楚飛、陸明,還有兩個候補。

  他給這五個人發了私信,內容一樣:

  「恭喜通過初選。請於6月25日下午兩點,登錄QQ,加群:1234567。進行第二輪面試。如通過,可獲得實習機會及獎金。Horizon。」

  然後他申請了一個新的QQ號,建了一個群。群名:「Horizon技術測試」。

  做完這些,他靠在椅背上,長長地舒了口氣。

  第一步走完了。接下來,是真正的考驗。

  6月25日,下午一點五十。

  林浩坐在電腦前,QQ已經登錄。群是空的,只有他一個人。窗外下著小雨,六月的雨很細很密,打在窗戶上沙沙響。

  一點五十五,第一個人加群。ID:半夏。頭像是一片空白。

  通過。

  半夏進群後沒說話,靜靜地待著。

  一點五十七,第二個人:楚飛。頭像是《傳奇》里的武士,手裡拿把屠龍刀。

  通過。

  楚飛進群後發了個表情:/抽菸。

  一點五十九,第三個人:陸明。頭像是自己畫的水墨畫,一隻鶴。

  通過。

  陸明:「大家下午好。」

  兩點整,另外兩個候補也進來了。五個人到齊。

  林浩在群里發言:「大家好,我是Horizon。感謝各位參加第二輪測試。本輪測試是實時編程,我會出三道題,大家在兩小時內完成。工具自備,語言不限,但需要能運行出結果。完成後將代碼發到群文件。現在開始第一題。」

  他複製粘貼了第一題:

  「題一:在文本中查找所有郵箱地址。輸入:一段包含文字、數字、符號、郵箱的文本。輸出:所有郵箱地址的列表。要求:自己寫正則表達式,不能用庫函數。時間:20分鐘。」

  這題考基本功。正則表達式是文本處理的必備技能,能看出一個人的代碼嚴謹性和邊界情況處理能力。

  群里安靜下來。林浩看著屏幕右下角的時間,一分一秒地走。

  十五分鐘後,第一個提交:半夏。代碼很簡潔,正則寫得完美,考慮了各種邊界情況。測試用例全過。

  十八分鐘,楚飛提交。正則有點瑕疵,但整體能用。附了一句話:「這題沒意思,考記憶力的。」

  二十分鐘,陸明提交。正則正確,但代碼里加了個小功能:把找到的郵箱按域名分類統計。超出了題目要求,但很實用。

  另外兩個候補,一個超時,一個正則寫錯了。

  「題二。」林浩發了第二題,「實現一個簡單的HTTP伺服器,能響應GET請求,返回請求的文件。要求:支持多線程,有基本的錯誤處理。時間:40分鐘。」

  這題難度上來了。2002年,很多人還沒接觸過網絡編程。而且「多線程」在Flash里不好實現,需要用到一些技巧。

  群里沉默了很久。二十五分鐘後,半夏提交。代碼用的是Java,實現了一個完整的、可運行的HTTP伺服器,支持多線程,錯誤處理完善。還附了一個測試腳本。

  三十二分鐘,楚飛提交。代碼是C++,也實現了,但用了些奇技淫巧,繞過了多線程,用異步IO模擬。附言:「Flash做不了多線程,我換語言了,不算違規吧?」

  林浩回覆:「不算。看結果。」


  三十八分鐘,陸明提交。代碼是Python——2002年Python還不流行,但他用了。實現很簡單,但巧妙地用單線程+事件循環模擬了並發。附言:「輕量級方案,適合資源有限的環境。」

  另外兩個候選人,一個沒提交,一個提交的代碼跑不起來。

  「題三。」林浩發了最後一題,也是最難的一題,「設計一個遊戲存檔系統。要求:1.存檔可加密,防修改。2.支持增量存檔,節省空間。3.存檔損壞可部分恢復。4.有版本兼容性設計(新版遊戲能讀舊版存檔)。不需要實現,寫設計文檔,包括架構圖、核心算法、關鍵數據結構。時間:60分鐘。」

  這題考系統設計能力。不只是寫代碼,而是思考一個完整系統的方方面面。

  群里徹底安靜了。只有雨聲,從窗外傳來。

  林浩起身倒了杯水,站在窗邊看雨。雨中的縣城灰濛濛的,遠處的山隱在雨霧裡。他想起2028年,華為的架構設計評審會,會議室里坐滿了頂尖的工程師,為了一個設計方案爭得面紅耳赤。

  而現在,他一個人在2002年,用QQ群面試幾個可能成為夥伴的年輕人。

  命運真是奇妙。

  五十分鐘,半夏提交。文檔極其專業,用LaTeX寫的,有完整的架構圖、流程圖、狀態機。加密方案用了非對稱加密+簽名,增量存檔用差異算法,版本兼容用適配器模式。每個設計都有理論依據和實現考量。

  五十五分鐘,楚飛提交。文檔是純文本,但思路清晰。加密方案用了簡單的異或+校驗和——他備註:「複雜加密在客戶端沒用,反正能被破解,不如做防篡改檢測。」增量存檔用簡單的二進位差異,版本兼容方案很粗暴:每個版本留一個轉換器。附言:「工程方案,追求簡單有效。」

  五十八分鐘,陸明提交。文檔圖文並茂,手繪了架構圖,雖然不專業但生動。他提出了一個有趣的想法:存檔不上傳伺服器,而是在本地用算法生成「種子」,伺服器只存種子。這樣節省帶寬,也保護隱私。版本兼容方案是「向後兼容,向前不兼容」——舊版不能讀新版存檔,但新版永遠能讀舊版。

  時間到。

  林浩回到電腦前,看著三份文檔。三個完全不同的風格,三個完全不同的思路。

  半夏是學者,追求理論正確和體系完整。

  楚飛是黑客,追求實用和效率,不拘泥於規範。

  陸明是創造者,總想跳出框架,找新路徑。

  都是人才。但Horizon需要什麼樣的人?

  他需要學者來建立技術體系,需要黑客來攻堅克難,需要創造者來打開局面。

  他都要。

  林浩在群里發言:「測試結束。感謝各位的參與。請半夏、楚飛、陸明三位留下,其他兩位可以退群了,感謝你們的時間,稍後會有一百元參與獎金打到你們提供的帳戶。」

  那兩個候補退了群。群里剩下四個人。

  「現在進入面試環節。」林浩打字,「我會問幾個問題,請誠實地回答。第一個問題:你們為什麼學編程?」

  片刻,楚飛先回答:「因為爽。能控制機器,能做別人做不到的事。最早是改遊戲,後來是寫外掛,現在是覺得……能做點更大的。」

  陸明:「因為美。代碼有一種結構之美,邏輯之美。我學畫畫,學音樂,但最後發現編程是最自由的創作方式。你能創造一個世界,哪怕只是虛擬的。」

  半夏過了半分鐘才回答:「因為問題在那裡。數學問題,物理問題,現實問題……編程是解決問題的工具。我喜歡工具,喜歡用工具解決問題的過程。」

  很真實的回答。

  「第二個問題:你們對未來五年的中國網際網路,有什麼判斷?」

  楚飛:「會火。遊戲、社交、電商,都會火。但泡沫也會有,死掉的公司會比活下來的多。我要做活下來的那個。」

  陸明:「會連接一切。現在電腦是電腦,手機是手機,以後都會連在一起。內容的形式會變,但人需要故事,需要美,需要連接。我要做創造連接的那個人。」

  半夏:「技術會進步,但瓶頸在基礎設施。網速、硬體、人才。誰能解決瓶頸,誰就能贏。我要做解決瓶頸的事。」

  林浩看著這些回答,心裡有數了。

  「第三個問題:如果加入Horizon,你們想要什麼?錢?名?成長?還是別的?」


  楚飛:「錢要,但不能只給錢。得讓我做有意思的事,有挑戰的事。如果天天寫業務代碼,給再多錢我也不干。」

  陸明:「想和厲害的人一起,做有影響力的作品。錢夠生活就行,但作品必須是我驕傲的。」

  半夏:「想接觸前沿問題,有資源做研究。如果有論文產出,希望能署名。錢……按市場價就行。」

  都很純粹。這是好事。

  林浩最後問:「如果我說,Horizon現在只有我一個人,沒有辦公室,沒有投資,只有一台電腦和一個想法。你們還願意加入嗎?」

  沉默。

  然後楚飛:「你一個人做出了《細胞吞噬》?」

  林浩:「是。」

  楚飛:「那我加入。一個人能做出那種東西,比有團隊但做垃圾的強。」

  陸明:「我也加入。一個人反而自由,沒有條條框框。」

  半夏:「只要問題有趣,資源可以慢慢解決。」

  林浩笑了。這是他在這個時空,第一次真正地笑。

  「好。」他打字,「那麼,歡迎加入Horizon。接下來我說一下安排。」

  「第一,我們是遠程協作。你們在哪裡都可以,按時完成任務就行。」

  「第二,前期沒有工資,但項目有收益後,按貢獻分成。分成比例後續詳談。」

  「第三,第一個項目:網吧遊戲自動更新系統。我負責架構和核心代碼,半夏負責算法和性能優化,楚飛負責客戶端和逆向兼容,陸明負責UI和用戶體驗。」

  「第四,一周後,我會發詳細的需求文檔和技術方案。這周,你們各自熟悉相關技術,準備好開發環境。」

  「有問題嗎?」

  楚飛:「分成比例現在不能說?」

  林浩:「可以私下聊。但原則是:公平,透明,多勞多得。」

  陸明:「網吧更新系統……聽起來不像遊戲?」

  林浩:「不是遊戲。是工具,是入口。我們要先活下來,才能做想做的事。」

  半夏:「技術棧?」

  林浩:「服務端用Java,客戶端用C++,管理端用Delphi。資料庫用MySQL。有困難嗎?」

  半夏:「沒有。」

  楚飛:「Delphi……老古董了。不過也行。」

  陸明:「我學得快。」

  「好。」林浩說,「那麼,今天就到這裡。三位加我好友,我們單獨聊細節。解散。」

  群解散了。三個人分別發來好友申請。林浩一一通過,然後分別私聊,談具體的分工、時間、收益分成。

  等全部聊完,已經是晚上七點。窗外的雨停了,天邊有晚霞,金紅色的光從雲縫裡透出來。

  林浩靠在椅背上,長長地舒了一口氣。

  團隊有了雛形。雖然只有三個人,雖然還沒見過面,雖然前路艱難。

  但至少,他不再是獨自一人了。

  他打開抽屜,拿出那台黑色手機。電量:1.8%。又掉了。

  「小藝。」他低聲說。

  屏幕亮起。

  「我在。」

  「記錄:2002年6月25日,Horizon初步團隊組建完成。核心成員:半夏(算法)、楚飛(工程)、陸明(設計)。第一個項目:網吧遊戲更新系統,正式啟動。」

  「已記錄。恭喜。但電量已降至危險水平,建議在下次充電前,不再進行大規模查詢。」

  「我知道。」林浩說,「休眠吧。等需要的時候,我會叫你。」

  屏幕暗了。

  房間裡安靜下來。只有電腦風扇的嗡嗡聲,和遠處街道上偶爾傳來的車聲。

  林浩坐在黑暗裡,看著窗外的晚霞。

  第一步,邁出去了。雖然很小,雖然很慢。

  但方向對了。

  他起身,打開燈,坐回電腦前。開始寫第一個項目的需求文檔。

  鍵盤聲響起。嗒。嗒嗒。嗒。

  沉穩,堅定,像心跳。

  這一次,不再是獨奏。

  是合奏的開始。

章節目錄