九月下旬,江城大學(xué)。
秋意漸濃,空氣里飄著(zhù)若有似無(wú)的桂花香。
開(kāi)學(xué)那股喧囂勁兒總算過(guò)去了,校園里,穿著(zhù)各色服裝的年輕身影穿梭在教學(xué)樓、食堂、圖書(shū)館之間,一派按部就班的大學(xué)景象。
黎陽(yáng),就是這人潮中的一員,毫不起眼。
《C語(yǔ)言程序設計》、《高等數學(xué)》、《大學(xué)英語(yǔ)》……這些在他眼里基礎到近乎無(wú)聊的課程,他卻堂堂正正地坐在教室里,認真聽(tīng)講,偶爾還記記筆記。
像個(gè)真正的、努力適應大學(xué)生活的大一新生。
尤其是在C語(yǔ)言課上,老師講到指針這個(gè)公認的難點(diǎn)時(shí),他甚至會(huì )“恰到好處”地眉頭緊鎖,然后舉手,問(wèn)一個(gè)蠢得恰到好處的問(wèn)題:
“老師,那個(gè)星號(*)……它到底是代表地址本身,還是地址里的內容???我有點(diǎn)搞不懂,感覺(jué)好繞……”
問(wèn)題一出,周?chē)D時(shí)響起一片低低的、善意的笑聲。
下了課,他和室友們一起涌向食堂。
聽(tīng)李哲唾沫橫飛地吹噓自己學(xué)生會(huì )面試時(shí)如何“舌戰群儒”,或者跟趙磊一起吐槽某個(gè)窗口的菜“咸得齁死人”。
順便,他還會(huì )婉拒趙磊晚上一起看新番的邀請——“不了不了,晚上還得預習一下高數,有點(diǎn)跟不上?!?/p>
他也會(huì )去圖書(shū)館,借一堆“符合身份”的書(shū)。
《C語(yǔ)言從入門(mén)到精通》、《數據結構(C語(yǔ)言版)》這類(lèi)基礎教材占了大頭,偶爾夾雜一本《Effective Java》裝點(diǎn)門(mén)面,顯示自己“有點(diǎn)追求”。
碰到同樣泡在圖書(shū)館的學(xué)霸王浩,兩人還會(huì )交流幾句學(xué)習心得。
王浩的目標是保研清北,意氣風(fēng)發(fā)。
黎陽(yáng)則一臉“謙遜”:“先不考慮那么遠,先把基礎打牢再說(shuō)?!?/p>
白天,他就是這樣一個(gè)略顯內向、資質(zhì)尚可、正在努力融入大學(xué)的新生。
平平無(wú)奇,泯然眾人。
然而——
當夜幕低垂,當宿舍樓在十一點(diǎn)準時(shí)陷入黑暗,當室友們均勻的呼吸聲和陳東偶爾的夢(mèng)話(huà)(“肉山!快打盾??!”)在寂靜中響起時(shí)……
另一個(gè)黎陽(yáng),才算真正“活”了過(guò)來(lái)!
303宿舍,一片死寂。
唯有靠窗書(shū)桌上,一盞小小的充電臺燈,倔強地亮著(zhù)。
昏黃的光暈,堪堪照亮一方小天地。
黎陽(yáng)坐在椅子上,死死地盯著(zhù)面前那臺老舊筆記本電腦的屏幕。
屏幕微弱的光芒映在他年輕的臉上,那雙眼睛里,閃爍著(zhù)與這個(gè)年紀格格不入的專(zhuān)注、深邃,以及一絲隱藏極深的……野心!
鍵盤(pán)敲擊聲被他刻意壓到最低,輕柔、細密,卻連綿不絕,如同春蠶食葉。
他在構建一個(gè)秘密。
一個(gè)名為“靈犀”的AI聊天App的雛形。
一個(gè)承載著(zhù)他所有不甘、所有希望、以及對這個(gè)時(shí)代發(fā)起挑戰的武器!
沒(méi)有系統,沒(méi)有金手指,沒(méi)有神光天降直接灌頂代碼。
此刻的黎陽(yáng),更像一個(gè)身經(jīng)百戰的老兵,在塵封的武器庫里,重新拾起了那把跟隨他征戰多年的、或許有些生銹,但絕對致命的武器。
前世,他在互聯(lián)網(wǎng)大廠(chǎng)摸爬???打近十年,積累的編程經(jīng)驗、項目直覺(jué),就是他最大的底牌!
現在,這場(chǎng)一個(gè)人的戰爭,開(kāi)始了!
第一步,App基礎框架。
只見(jiàn)他手指在鍵盤(pán)上翻飛,快得幾乎出現殘影。
腦子里仿佛有一整套成熟的架構圖,根本無(wú)需過(guò)多思考。
Activity、Fragment、Service……
這些對真正的大一新生來(lái)說(shuō)如同天書(shū)的概念,在他手中,卻像是小孩子擺弄樂(lè )高積木一樣,被行云流水般地搭建組合起來(lái)。
布局文件?直接擼XML。
拖拽控件?那是新手才干的事!
代碼結構清晰,命名規范得如同教科書(shū),甚至連注釋都帶著(zhù)前世大廠(chǎng)培養出的、近乎強迫癥的良好習慣。
“唔,BottomNavigationView……這玩意兒在2015年應該還沒(méi)普及吧?”
黎陽(yáng)手指一頓,一邊回憶,一邊飛快地在后臺運行的“藍鯨AI”控制臺里敲下指令:
> 藍鯨, 2015年底安卓App主流底部導航實(shí)現方式有哪些?
屏幕光標閃爍了幾下,AI冰冷的聲音(通過(guò)文本)響起:
> 常見(jiàn)方案包括:頂部Tab(配合ViewPager)、側滑菜單(NavigationDrawer)、底部RadioGroup或LinearLayout模擬Tab。MVP架構在此階段開(kāi)始被用于改善代碼結構。
“嗯,果然?!?黎陽(yáng)嘴角微翹,“跟記憶里差不多。那就用RadioGroup模擬,簡(jiǎn)單粗暴,效率優(yōu)先?!?/p>
搞定。繼續。
下一個(gè)目標:核心聊天界面UI。
黎陽(yáng)太清楚了,一個(gè)App能不能吸引人,尤其是社交App,聊天界面是重中之重。
流暢!美觀(guān)!這是基本要求。
但在2015年這個(gè)時(shí)間點(diǎn),安卓生態(tài)還遠未成熟,低端機性能更是參差不齊。
想要實(shí)現類(lèi)似幾年后微信那種絲滑的聊天氣泡效果,還要保證在各種破爛手機上不卡頓?
難!非常難!
用系統標準控件?又丑又卡,蠢得要死。
黎陽(yáng)壓根沒(méi)去網(wǎng)上搜什么“解決方案”。
浪費時(shí)間!
因為最優(yōu)解,早就在他腦子里了!
他拿起旁邊的草稿本,筆尖在紙上“唰唰”飛舞。
幾分鐘,一張清晰的UI結構草圖就勾勒出來(lái):左邊接收氣泡,右邊發(fā)送氣泡,圓角,帶箭頭,還要能根據文字內容自動(dòng)拉伸……
“哼,標準控件是指望不上了。必須自定義View. 性能、效果,全都掌握在自己手里?!?/p>
方案敲定。
接下來(lái)的幾個(gè)夜晚,黎陽(yáng)幾乎是和自定義View“焊”在了一起。
onMeasure——測量尺寸,得精準。
onDraw——繪制氣泡背景、文字,處理?yè)Q行,計算拉伸……全是精細活兒,差一點(diǎn)都不行。
他全神貫注,時(shí)而眉頭緊鎖,對著(zhù)模擬器上扭曲的氣泡抓狂;時(shí)而手指快得像抽風(fēng),瘋狂優(yōu)化代碼,榨干每一絲性能,比如嚴格控制內存抖動(dòng),減少不必要的對象創(chuàng )建。
一次,一個(gè)關(guān)于氣泡寬度邊界計算的Bug,硬生生卡了他半個(gè)多小時(shí)。
模擬器運行一次慢得像老牛拉車(chē),簡(jiǎn)直讓人崩潰。
“草!”
黎陽(yáng)煩躁地抓了抓頭發(fā),差點(diǎn)想把這破電腦砸了。
他強忍著(zhù)怒氣,嘗試著(zhù)把那段核心的onDraw代碼復制粘貼到藍鯨AI的控制臺,心中暗罵:
> 這段onDraw代碼在處理長(cháng)文本換行時(shí),偶爾出現氣泡寬度計算錯誤,可能是什么原因?
筆記本風(fēng)扇開(kāi)始狂轉,發(fā)出“嗡嗡”的抗議聲。
過(guò)了十幾秒,AI才慢吞吞地給出幾條建議:
> 可能性分析:1. 文本測量(StaticLayout/BoringLayout)寬度設置與View實(shí)際可用寬度不一致。
2. onMeasure 確定的尺寸與 onDraw 中使用的尺寸計算邏輯存在偏差。
3. 浮點(diǎn)數精度問(wèn)題導致邊界判斷錯誤。建議:檢查文本測量寬度參數,并在onDraw前打印關(guān)鍵尺寸變量進(jìn)行核對。避免在onDraw內執行復雜計算。
“嗯?測量寬度沒(méi)處理好?”
黎陽(yáng)眼睛猛地一亮。
雖然AI這貨給不出標準答案,但這幾個(gè)排查方向,瞬間點(diǎn)醒了他。
思路一下就清晰了。
他立刻回去檢查代碼,果然!獲取可用寬度的方法用得不對,存在一個(gè)極其隱蔽的錯誤。
“媽的,1.5B參數的智障模型,也就這點(diǎn)用了……” 黎陽(yáng)低聲吐槽了一句,隨即又自嘲地笑了笑,“不過(guò)……有時(shí)候確實(shí)能省點(diǎn)調試時(shí)間?!?/p>
這也讓他更加深刻地認識到兩件事:
第一,AI確實(shí)是個(gè)好用的輔助工具。
第二,這破電腦的算力,以及這個(gè)初級AI的智能,都有待提升。
編譯、運行模擬器、打包APK、安裝到他那臺同樣老掉牙的安卓手機上測試……每一個(gè)環(huán)節都伴隨著(zhù)漫長(cháng)的、令人抓狂的等待。
改個(gè)小Bug,驗證效果,十幾分鐘就沒(méi)了!
“這破電腦!等老子賺到錢(qián),第一個(gè)就換了你!”
黎陽(yáng)咬牙切齒地低吼。
但,即使條件如此艱苦,他卻甘之如飴。
這種從零開(kāi)始,親手創(chuàng )造一個(gè)“生命”的感覺(jué),實(shí)在太美妙了!
這讓他找回了前世最初接觸編程時(shí),那種純粹的熱愛(ài)和激情。
更重要的是,他走的每一步,敲下的每一行代碼,都是在為自己的未來(lái),為改變那該死的命運,添磚加瓦!
就在他剛剛修復那個(gè)氣泡Bug,準備松一口氣的時(shí)候——
嗡嗡……
桌角的手機突然震動(dòng)起來(lái)。
屏幕亮起,來(lái)電顯示——“媽”。
黎陽(yáng)深吸一口氣,迅速抹平臉上的疲憊和銳氣,換上溫和的表情,按下了接聽(tīng)鍵,聲音放得盡量輕松自然:
“喂,媽?!?/p>
“陽(yáng)陽(yáng)啊,還沒(méi)睡呢?”電話(huà)那頭,傳來(lái)母親熟悉的聲音,溫和中帶著(zhù)一絲難以掩飾的疲憊。
“沒(méi)呢,剛看了會(huì )兒書(shū)?!?黎陽(yáng)臉不紅心不跳地撒著(zhù)謊,“您怎么也還沒(méi)睡?”
“我這不是……尋思著(zhù)你剛開(kāi)學(xué),又是頭一回出遠門(mén),怕你不習慣嘛?!蹦赣H開(kāi)始絮絮叨叨,“大學(xué)生活咋樣???課難不難,跟得上不?錢(qián)夠不夠花?跟宿舍同學(xué)處得好不好???”
一連串的問(wèn)題,充滿(mǎn)了擔憂(yōu)。
“都挺好的,媽?zhuān)头判陌?!?黎陽(yáng)努力讓自己的聲音聽(tīng)起來(lái)充滿(mǎn)陽(yáng)光,盡管母親看不到他此刻眼中的復雜,“課不難,老師講得也清楚。錢(qián)夠用,您給的生活費我省著(zhù)花呢。室友們人都特好,我們處得跟親兄弟似的!”
“那就好,那就好……” 母親的聲音里透出明顯的欣慰,“你爸……唉,你爸要是能看到你順順利利考上這么好的大學(xué),該多高興啊……”
提到父親,電話(huà)兩頭瞬間沉默。
空氣仿佛都凝重了幾分。
母親很快強打起精神,換了個(gè)輕松的語(yǔ)氣:“那筆賠償金……還夠用一陣子。媽身體沒(méi)事,就是以前落下那個(gè)老毛病,天氣一變就偶爾不舒服,不礙事的,老毛病了。你啊,就在學(xué)校安安心心讀書(shū),別操心家里,聽(tīng)見(jiàn)沒(méi)?把自己照顧好就行!別學(xué)你爸年輕時(shí)候,就知道瞎拼命……”
“賠償金”……“老毛病”……
這幾個(gè)字眼,像一根根燒紅的鋼針,狠狠扎在黎陽(yáng)的心臟上。
痛!
鉆心的痛!
他知道母親說(shuō)得輕描淡寫(xiě),但他更清楚這背后意味著(zhù)什么。
那是父親用命換來(lái)的錢(qián)!
是母親日益沉重的身體負擔和對未來(lái)的焦慮!
他的手,下意識地攥緊了鼠標,指節因為用力而微微發(fā)白。
“知道了媽?zhuān)視?huì )照顧好自己的?!?黎陽(yáng)的聲音有些干澀,但依舊努力保持平靜,“您也別太累了,記得按時(shí)吃藥,多休息?!?/p>
又強撐著(zhù)和母親聊了幾句家常,叮囑她早點(diǎn)睡覺(jué),黎陽(yáng)才掛斷了電話(huà)。
宿舍里,再次恢復了絕對的寂靜。
只有筆記本風(fēng)扇還在不知疲倦地“嗡嗡”作響。
黎陽(yáng)怔怔地看著(zhù)屏幕上那些未完成的代碼,胸腔里,卻有一股狂暴的情緒在劇烈翻騰。
父親用生命換來(lái)的賠償金,母親日益惡化的病情,還有自己上一世那狗屎一樣失敗的人生!
這一切的一切,都像一條無(wú)形的鞭子,狠狠抽打在他的靈魂上。
讓他不能停!不敢停!不能懈??!一秒鐘都不能!
賺錢(qián)!
必須盡快賺到錢(qián)!賺到足夠多的錢(qián)!
不僅是為了讓母親得到最好的治療,延續她的生命。
更是為了徹底扭轉自己那可悲的命運!告慰父親的在天之靈!
去他媽的按部就班!
去他媽的平平無(wú)奇!
老子重生回來(lái),不是為了再窩囊一次的!
“呼——”
黎陽(yáng)猛地甩了甩頭,將所有的負面情緒、所有的雜念,統統甩出腦海。
再次抬眼,他的目光重新聚焦在代碼上,眼神變得比之前更加銳利,更加堅定。
仿佛有火焰在燃燒。
熬夜的疲憊?不存在了。
取而代之的,是無(wú)窮無(wú)盡的、近乎瘋狂的動(dòng)力。
接下來(lái)的幾天,黎陽(yáng)的開(kāi)發(fā)進(jìn)度,簡(jiǎn)直可以用“飆升”來(lái)形容。
他不僅僅是在實(shí)現功能,更是在進(jìn)行超越這個(gè)時(shí)代的產(chǎn)品設計。
“光能聊天,還不夠!太平庸了. 必須要有差異化. 要有核心競爭力.”
黎陽(yáng)一邊敲代碼,大腦一邊飛速運轉。
“2015年的大學(xué)生,最高頻的需求是什么?課程表!考試安排!社團活動(dòng)!還有……吃喝玩樂(lè )!”
“如果……如果能讓‘靈犀’聽(tīng)懂人話(huà),幫用戶(hù)處理這些日?,嵤履??”
一個(gè)大膽的、足以在2015年引爆市場(chǎng)的想法,在他腦海中逐漸成型。
利用AI的文本理解能力(當然,他清楚現在這個(gè)1.5B的“智障”AI能力有限,初期肯定要靠大量規則和“偽智能”來(lái)湊),實(shí)現一系列校園實(shí)用小功能!
想象一下:
用戶(hù)可以直接問(wèn):“靈犀,我明天上午有高數課嗎?” App解析問(wèn)題,查詢(xún)(未來(lái)需要導入或爬取的)課程表數據,然后像真人一樣回答:“有的,明天上午8:00-9:40,在三教201有高等數學(xué)課,別遲到了哦?!?/p>
或者說(shuō):“靈犀,提醒我周五晚上12點(diǎn)前交C語(yǔ)言大作業(yè)!” App自動(dòng)提取關(guān)鍵信息,設置一個(gè)系統鬧鐘或日歷提醒。
甚至更進(jìn)一步:“靈犀,學(xué)校南門(mén)附近有啥好吃的蓋澆飯推薦?” App結合未來(lái)需要接入的外賣(mài)平臺信息和點(diǎn)評數據,給出幾個(gè)備選項。
這些功能!在2015年!
簡(jiǎn)直就是降維打擊!
只要能實(shí)現,哪怕初期只是部分實(shí)現,做得粗糙一點(diǎn),“靈犀”就絕不僅僅是一個(gè)無(wú)聊的聊天玩具。
而是一個(gè)真正有用的、能夠改變用戶(hù)習慣的智能助手。
當然,黎陽(yáng)也清楚,以他現在這臺破電腦的算力(約等于零)和那個(gè)1.5B模型的可憐能力,想完美實(shí)現這些功能,難如登天。
甚至需要堆砌大量的“if-else”規則,來(lái)假裝智能。
但,方向對了!路就沒(méi)錯。
先做出初級版本,把核心聊天功能打磨好,然后快速迭代,把這些“黑科技”功能一點(diǎn)點(diǎn)加上去。
黎陽(yáng)看著(zhù)屏幕上那個(gè)雖然還很簡(jiǎn)陋,但已經(jīng)可以進(jìn)行基本對話(huà)、擁有獨特聊天氣泡的界面,一股強烈的成就感涌上心頭。
有一次深夜,他起身去洗手間,沒(méi)鎖電腦屏幕,上面正顯示著(zhù)一段復雜的自定義View繪制函數代碼。
等他輕手輕腳回來(lái)時(shí),眼角的余光敏銳地捕捉到——
上鋪的陳東,似乎翻了個(gè)身,腦袋朝著(zhù)他這邊,眼睛好像……睜開(kāi)看了一眼?
但很快,陳東又閉上了眼睛,發(fā)出了輕微的鼾聲。
是錯覺(jué)?還是看到了裝沒(méi)看見(jiàn)?
黎陽(yáng)不動(dòng)聲色地坐下,繼續敲代碼,心里卻開(kāi)始快速盤(pán)算。
“靈犀”的藍圖已經(jīng)越來(lái)越清晰,越來(lái)越龐大。
代碼復雜度也在指數級增長(cháng)。
UI設計需要審美,他一個(gè)糙漢程序員搞不定。 客戶(hù)端性能優(yōu)化是個(gè)無(wú)底洞,需要大量精細打磨。 后續的服務(wù)器端開(kāi)發(fā)、數據處理、模型部署(雖然現在只是個(gè)玩具模型),更是需要投入海量時(shí)間和精力……
一個(gè)人,搞不定!
至少,效率太低!
他需要幫手!
一個(gè)技術(shù)足夠硬!并且絕對值得信任的伙伴。
黎陽(yáng)的目光,再次不自覺(jué)地,緩緩投向上鋪。
陳東那輕微的、有節奏的鼾聲,在寂靜的夜里,顯得格外清晰。
這位未來(lái)的技術(shù)大牛,現在還只是個(gè)沉迷Dota、偶爾看看代碼的普通大一新生。
是時(shí)候了……
得找個(gè)機會(huì ),稍微“泄露”一點(diǎn)自己的“冰山一角”。
讓這位未來(lái)的伙伴,見(jiàn)識一下,什么叫做來(lái)自未來(lái)的“技術(shù)碾壓”。
夜色,更濃了。
黎陽(yáng)的眼中,卻仿佛有星辰在閃耀,比窗外的夜空,更加明亮。
他的時(shí)代,即將開(kāi)始!