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