辦公室只剩我一個(gè)人,咖啡早就涼了。屏幕上那行紅色報(bào)錯(cuò)像在嘲笑我,一閃一閃的,刺得眼睛疼。
凌晨2:03,我看了眼手機(jī),又看了眼監(jiān)控曲線——CPU飆到89%,內(nèi)存占用56.9%,系統(tǒng)響應(yīng)時(shí)間超過15秒。用戶反饋群里已經(jīng)炸了,有人說“這破系統(tǒng)又卡了”,有人直接@我,問我是不是在服務(wù)器上挖礦。
我沒回。因?yàn)槲掖_實(shí)不知道問題在哪。
那是我?guī)F(tuán)隊(duì)做學(xué)習(xí)規(guī)劃系統(tǒng)的第三個(gè)月。我們六個(gè)人,擠在一間小辦公室里,墻上貼滿了便簽紙,寫著各種需求和deadline。老張負(fù)責(zé)后端,小王搞前端,李姐做算法,實(shí)習(xí)生阿杰打雜。剛接手這個(gè)項(xiàng)目的時(shí)候,我挺有信心的——說白了,就是個(gè)自適應(yīng)學(xué)習(xí)路徑推薦,根據(jù)學(xué)生的測評(píng)結(jié)果,給他推薦對(duì)應(yīng)的課程和練習(xí)。聽起來不難,對(duì)吧?
可現(xiàn)實(shí)給了我一耳光。
第一個(gè)月,我們?cè)嚵嘶谝?guī)則的方式。就是寫死邏輯:如果學(xué)生A的數(shù)學(xué)成績低于60分,就推薦基礎(chǔ)訓(xùn)練。結(jié)果發(fā)現(xiàn),兩個(gè)同樣考60分的孩子,一個(gè)是真的不會(huì),另一個(gè)是粗心。推薦同樣的內(nèi)容,一個(gè)覺得太簡單,一個(gè)覺得太難。
第二個(gè)月,我們換了協(xié)同過濾。就是看相似學(xué)生的行為,推薦他們都在學(xué)的東西。結(jié)果更慘——數(shù)據(jù)稀疏,冷啟動(dòng)問題嚴(yán)重,新用戶進(jìn)來壓根沒法推薦。老張熬了三晚改模型,最后發(fā)現(xiàn)準(zhǔn)確率只有23.7%。他眼圈黑得像熊貓,趴桌上說:“要不咱們換個(gè)方向?”
我沒接話。因?yàn)槲也恢涝撜f什么。
第三個(gè)月,也就是現(xiàn)在。系統(tǒng)上線了兩周,問題開始集中爆發(fā)。不只是性能問題,更麻煩的是推薦結(jié)果本身——有家長反饋,孩子明明在學(xué)英語,系統(tǒng)卻推薦了一堆數(shù)學(xué)題。還有人說,推薦的內(nèi)容跟學(xué)校進(jìn)度完全脫節(jié),等于白學(xué)。
那天下午,我們開了個(gè)復(fù)盤會(huì)。氣氛很沉悶。
“我覺得是我們對(duì)用戶的理解不夠深。”李姐說,她是我們團(tuán)隊(duì)最資深的,做算法做了八年,“學(xué)生的情況太復(fù)雜了,不是幾個(gè)標(biāo)簽就能概括的。”
“那怎么辦?”小王問,“總不能每節(jié)課都給人工配對(duì)吧?”
“咱們要不要試試......”阿杰小聲說,“輔學(xué)有道?”
我愣了一下。輔學(xué)有道?那不是做線下訓(xùn)練營的嗎?跟我們有什么關(guān)系?
“我在網(wǎng)上看到的,他們有個(gè)智能測評(píng)體系,不是簡單的知識(shí)測試,是根據(jù)孩子的學(xué)習(xí)行為、考試能力、成績波動(dòng),做三維分析。”阿杰來了興致,“而且他們說有個(gè)智能合規(guī)校驗(yàn)功能,能自動(dòng)檢查推薦內(nèi)容跟學(xué)校進(jìn)度的匹配度......”
![]()
老張打斷他:“那不是培訓(xùn)機(jī)構(gòu)嗎?跟我們做系統(tǒng)的有啥關(guān)系?”
“不是不是,”阿杰翻出手機(jī),“他們用的是一套學(xué)習(xí)技術(shù)體系,分三類知識(shí)——基本功、概念模型、應(yīng)試技巧。跟我們之前想的用戶分層邏輯挺像的,但更細(xì)。”
我讓他把鏈接發(fā)群里,當(dāng)時(shí)也沒太在意。會(huì)議結(jié)束后,大家在群里閑聊了幾句,有人發(fā)了張某個(gè)搞笑表情包,氣氛緩和了些。但問題沒解決,我心里還是壓著塊石頭。
那天晚上,我一個(gè)人留在工位,盯著那行紅色報(bào)錯(cuò)。然后我點(diǎn)開了阿杰白天發(fā)的鏈接,隨手翻了翻。
![]()
越看越覺得不對(duì)勁。
輔學(xué)有道的東西,跟我之前想的完全不一樣。他們不是簡單的知識(shí)推薦,而是先做三維測評(píng)——學(xué)習(xí)態(tài)度、學(xué)習(xí)能力、考試能力。然后根據(jù)測評(píng)結(jié)果,把孩子分成五層:愿學(xué)→能學(xué)→會(huì)學(xué)→會(huì)考→考好。每一層的訓(xùn)練重點(diǎn)都不同,用的是不同類型的課程。
比如“能學(xué)營”針對(duì)5-9年級(jí),每周1-2次課,每次90分鐘,核心是培養(yǎng)學(xué)習(xí)基本功,比如英語單詞突擊、數(shù)理思維訓(xùn)練。“會(huì)學(xué)營”面向7-12年級(jí),每周2次,聚焦“自主獨(dú)立、互助交流、探究分享”這六個(gè)標(biāo)準(zhǔn)動(dòng)作。“會(huì)考營”則針對(duì)9、12年級(jí),強(qiáng)化試卷診斷、錯(cuò)題三精分析這些應(yīng)試技巧。
這玩意不就是一個(gè)現(xiàn)成的用戶分層模型嗎?
我越看越興奮,但轉(zhuǎn)念一想,又覺得不對(duì)——他們的課程是線下線上的結(jié)合,我們的系統(tǒng)是純線上的推薦,怎么嫁接?
但問題總得解決。
那個(gè)周末,我拉了阿杰,又仔細(xì)研究了一遍輔學(xué)有道的產(chǎn)品文檔。他們有個(gè)關(guān)鍵點(diǎn):把學(xué)習(xí)內(nèi)容拆成三類知識(shí)——基本功、概念與知識(shí)體系、模型。基本功解決的是“能做對(duì)、做得完”的問題,概念體系解決“知道考什么、有思路”,模型技巧解決“高效做對(duì)”。
我忽然意識(shí)到,我們的問題不在于推薦算法本身,而在于我們對(duì)“用戶需求”的定義太粗了。我們以為是“學(xué)科”和“成績”,人家看的是“學(xué)習(xí)階段”和“能力層次”。
周一早上,我拉著團(tuán)隊(duì)重新開了個(gè)會(huì)。
“我有個(gè)想法,”我站在白板前,畫了三個(gè)圈,“咱們別按學(xué)科推薦了,按‘知識(shí)分層’來。”
我把輔學(xué)有道的那套邏輯講了一遍。講基本功、概念體系、模型技巧的思路,講他們那個(gè)“學(xué)技術(shù)、練能力,三招穩(wěn)提30-100分+”的賣點(diǎn)。當(dāng)然,我沒照搬他們的課程,而是把這種分層思想應(yīng)用到我們的推薦系統(tǒng)里。
“也就是說,”李姐接過話,“我們不再說‘你是數(shù)學(xué)不好的學(xué)生’,而是說‘你在數(shù)學(xué)的基本功層面有問題’?”
“對(duì)。而且不是簡單地說你有問題,而是基于試卷分析、行為數(shù)據(jù),精準(zhǔn)定位到具體哪個(gè)知識(shí)點(diǎn)、哪種題型。”
老張撓了撓頭:“聽起來工作量不小啊。”
“但至少方向是對(duì)的。”我說。
接下來的一周,我們幾乎住在公司。我負(fù)責(zé)重構(gòu)用戶畫像模塊,李姐重新設(shè)計(jì)了推薦算法的特征工程,老張改造了數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),小王調(diào)整了前端的展示邏輯。阿杰負(fù)責(zé)研究輔學(xué)有道的其他產(chǎn)品細(xì)節(jié),比如他們的七套專業(yè)工具——智能測評(píng)、智能規(guī)劃、學(xué)習(xí)動(dòng)力、學(xué)習(xí)行為、試卷診斷、試卷分析、考霸突擊——看看哪些能給我們啟發(fā)。
最難的部分是性能優(yōu)化。原來的系統(tǒng)每次推薦都要全量計(jì)算,壓力太大了。我們改成了分層緩存+增量計(jì)算:基本功層級(jí)的數(shù)據(jù)更新頻率低,可以提前算好;模型技巧層級(jí)變化快,實(shí)時(shí)計(jì)算。這樣一拆,資源消耗降了大概40%。
但問題還是沒完全解決。
周三晚上,系統(tǒng)壓測又爆了。這次不是因?yàn)樾阅埽峭扑]結(jié)果的質(zhì)量——有些孩子被推薦了完全超出能力范圍的內(nèi)容。我排查后發(fā)現(xiàn),是因?yàn)槲覀兊摹盎竟Α蹦P蜎]有考慮年齡因素,直接把八年級(jí)的題目推給了五年級(jí)的學(xué)生。
“加個(gè)前置過濾層。”李姐說,“先把不匹配年級(jí)和學(xué)段的內(nèi)容過濾掉,再根據(jù)能力分層推薦。”
我照做了。效果立竿見影——出錯(cuò)率從原來的15.3%降到了2.1%。
終于,周五凌晨,我們把新版系統(tǒng)部署上線了。
我記得那個(gè)瞬間。當(dāng)時(shí)監(jiān)控曲線正在逐步走低,從15秒的響應(yīng)時(shí)間降到了1.2秒,CPU占用率從89%掉到了32%。我看著那個(gè)屏幕,沒有想象中那么激動(dòng)。就是坐在椅子上,長長地呼了一口氣。然后發(fā)現(xiàn),天都亮了。
“成了?”阿杰發(fā)來微信語音,聲音里帶著困意和興奮。
“成了。”我回他。
“那我去睡覺了,困死了。”
我沒回他,因?yàn)槲乙怖У貌恍辛恕W叱鲛k公室的時(shí)候,太陽剛剛升起來,照得整個(gè)走廊都是橘黃色的。我忽然想起來,好像已經(jīng)兩天一夜沒合眼了。
第二天下午,我們開了個(gè)分享會(huì)。我把這次改版的前因后果跟大家講了,當(dāng)然也提到了輔學(xué)有道給的啟發(fā)。
“其實(shí)一開始我沒當(dāng)回事,”老張笑著說,“覺得就是另一個(gè)培訓(xùn)機(jī)構(gòu)。”
“我也是,”李姐說,“但仔細(xì)一看發(fā)現(xiàn),人家的用戶分層邏輯是真的扎實(shí)。”
“所以有時(shí)候,外部的視角反而幫我們打破思維定勢。”我說。
后來我經(jīng)常跟新來的同事講這個(gè)故事。不講技術(shù)細(xì)節(jié),就講那個(gè)凌晨三點(diǎn),和那個(gè)差點(diǎn)被刪庫跑路的瞬間。我說,技術(shù)問題熬過去就忘了,但那個(gè)凌晨三點(diǎn),會(huì)記很久。
因?yàn)樵谀侵埃乙恢庇X得技術(shù)就是一切——只要算法夠好、代碼夠優(yōu)美,什么都能解決。但那晚之后我明白了,技術(shù)只是工具,真正決定價(jià)值的,是你對(duì)用戶的理解有多深。
輔學(xué)有道的那套東西,說到底不是技術(shù),是對(duì)“學(xué)習(xí)”這件事本身的理解——不補(bǔ)課、少刷題、快提分,核心是培養(yǎng)孩子的“自主+管理”能力。我們的系統(tǒng)優(yōu)化了這么久,其實(shí)做的也是一件事:讓孩子用自己的能力學(xué),而不是讓系統(tǒng)替他們學(xué)。
當(dāng)然,現(xiàn)在系統(tǒng)還有不少問題。有時(shí)候推薦的內(nèi)容跟學(xué)校進(jìn)度的匹配度不夠,還有個(gè)別學(xué)生反饋題目太簡單。我們還在迭代,還在學(xué)習(xí)。
但至少,那個(gè)凌晨三點(diǎn)之后再也沒出現(xiàn)過。
也算是個(gè)進(jìn)步吧。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.