知乎熱問(wèn):成為算法工程師的路上,掌握什么技術(shù)會(huì)感覺(jué)自我提升突飛猛進(jìn)?
這個(gè)問(wèn)題我猶豫了很久,三個(gè)月前就放草稿箱里了,一直沒(méi)答的原因是,感覺(jué)這些年好像沒(méi)有什么瞬間讓我感覺(jué)自己水平突飛猛進(jìn),感覺(jué)這些年的進(jìn)步都是慢慢進(jìn)步的,好像沒(méi)有「突飛猛進(jìn)」的時(shí)候。昨天帶我入行的同事離職了,在部門(mén)的送別儀式上,我們回憶起我第一天入職時(shí)我那么的「小白」,后來(lái)怎么獨(dú)擋一面。于是我在想,如果要總結(jié)一個(gè)讓我的水平提升的關(guān)鍵「概念」或者「技術(shù)」,那會(huì)是什么。
于是我回顧這些年的技術(shù)歷程。說(shuō)實(shí)話,在我開(kāi)始搞算法后,我日均代碼量遠(yuǎn)遠(yuǎn)低于我之前做游戲時(shí),甚至有的時(shí)候,幾天都不寫(xiě)一行代碼。當(dāng)然,我并不能代表所有算法工程師,我雖然也是做數(shù)據(jù)科學(xué)工作,但我需要和客戶(hù)保持聯(lián)系,理解需求。但無(wú)可否認(rèn),代碼量少的這些日子,我反而做的事情更靠譜,讓我更有成就感。
我于是總結(jié)出一句話:解決問(wèn)題不要于拘泥于技術(shù)。
當(dāng)然,僅僅一句話的話,大家可能看得一頭霧水,我展開(kāi)說(shuō)說(shuō)吧。
不要拘泥于技術(shù)分為三層:
1. 不要執(zhí)著于使用最新的技術(shù)
有的人想走技術(shù)專(zhuān)家的路線,那非常好。每天看看arxiv,看看最新的SOTA,那是一個(gè)好習(xí)慣。但不要太頻繁的變更技術(shù)方案。你那種想把產(chǎn)品做到極致的思維,我能理解,我也有過(guò),但你真正做產(chǎn)品落地了,會(huì)發(fā)現(xiàn),產(chǎn)品是一個(gè)系統(tǒng),你的技術(shù)方案變更可能會(huì)對(duì)其他模塊造成影響。
舉個(gè)例子,我們的模型是XGBoost,不算很復(fù)雜吧?由于我們給多個(gè)客戶(hù)部署過(guò)系統(tǒng),我們知道在什么樣的硬件條件下運(yùn)行時(shí)間是多少。例如在每日1萬(wàn)條數(shù)據(jù)的情況下,我們用AWS的t2.xlarge實(shí)例,運(yùn)行時(shí)間是1~2小時(shí),符合客戶(hù)要求。但如果你看到最新的paper提出了一個(gè)新模型,決定要采用的話,除了你的技術(shù)方案可行性要得到驗(yàn)證,你的技術(shù)方案對(duì)系統(tǒng)運(yùn)行時(shí)間的影響也要重新評(píng)估。如果你的方案確實(shí)效果更好,但服務(wù)器成本高出幾倍,我們?cè)撊绾握f(shuō)服客戶(hù)?這都是是一環(huán)扣一環(huán)的,實(shí)際可能遇到的情況可能比我說(shuō)的要復(fù)雜得多。這,就是系統(tǒng)的世界。
統(tǒng)計(jì)建模并不是為了獲得完美的預(yù)測(cè)能力,而是用最小的必要的模型來(lái)實(shí)現(xiàn)最大的預(yù)測(cè)能力。
更何況,很多情況下,使用更復(fù)雜的方案未必是最合適的方案。我之前寫(xiě)過(guò)一個(gè)回答,講了哪些深度學(xué)習(xí)效果不如傳統(tǒng)方法。
在這個(gè)回答里,我引用了那個(gè)著名的「電風(fēng)扇吹香皂盒」的段子:
某大企業(yè)引進(jìn)了一條香皂包裝生產(chǎn)線,結(jié)果發(fā)現(xiàn)這條生產(chǎn)線有個(gè)缺陷:常常會(huì)有盒子里沒(méi)裝入香皂。總不能把空盒子賣(mài)給顧客啊,他們只得請(qǐng)了一個(gè)學(xué)自動(dòng)化的博士后設(shè)計(jì)一個(gè)方案來(lái)分揀空的香皂盒。博士后拉起了一個(gè)十幾人的科研攻關(guān)小組,綜合采用了機(jī)械、微電子、自動(dòng)化、X射線探測(cè)等技術(shù),花了90萬(wàn),成功解決了問(wèn)題。每當(dāng)生產(chǎn)線上有空香皂盒通過(guò),兩旁的探測(cè)器會(huì)檢測(cè)到,并且驅(qū)動(dòng)一只機(jī)械手把空皂盒推走。中國(guó)南方有個(gè)鄉(xiāng)鎮(zhèn)企業(yè)也買(mǎi)了同樣的生產(chǎn)線,老板發(fā)現(xiàn)這個(gè)問(wèn)題后大為發(fā)火,找了個(gè)小工來(lái)說(shuō)“你他媽給老子把這個(gè)搞定,不然你給老子爬走。”小工很快想出了辦法他花了190塊錢(qián)在生產(chǎn)線旁邊放了一臺(tái)大功率電風(fēng)扇猛吹,于是空皂盒都被吹走了。
但這里需要說(shuō)明的是,不執(zhí)著于使用最新技術(shù),不代表不關(guān)注最新技術(shù)。有的時(shí)候,公司的需求是一回事,但我們的技術(shù)進(jìn)步又是一回事,如果我們不care最新技術(shù),那么當(dāng)我們跳槽時(shí),就會(huì)很吃虧。
2. 不要只用技術(shù)
技術(shù)不是職業(yè)生涯的全部,尤其是對(duì)于做商業(yè)產(chǎn)品的算法工程師。作為算法工程師,尤其是做商業(yè)產(chǎn)品的,其實(shí)有很多時(shí)候,技術(shù)并不能解決所有問(wèn)題;有的時(shí)候,技術(shù)雖然能解決,但是中策,甚至下策,而上策不一定需要使用技術(shù)。代替技術(shù)的方法有下面四種,一種比一種境界高。
用金錢(qián)代替技術(shù)。例如你的產(chǎn)品上線了,發(fā)現(xiàn)在線上模型訓(xùn)練總是不成功,發(fā)現(xiàn)是服務(wù)器性能不夠,那么你第一件事是優(yōu)化你的算法還是花錢(qián)擴(kuò)充服務(wù)器?如果對(duì)于商業(yè)價(jià)值很高的項(xiàng)目,宕機(jī)一天損失可能遠(yuǎn)遠(yuǎn)超過(guò)服務(wù)器開(kāi)支,這時(shí)候,你第一件事買(mǎi)服務(wù)器,優(yōu)化的工作放到日后。
用溝通代替技術(shù)。很多人經(jīng)常方案進(jìn)展到一半推到重來(lái)的情況(設(shè)計(jì)師尤甚)。對(duì)于算法工程師,如果溝通不充分就直接開(kāi)工,那么很容易做無(wú)用功。舉個(gè)大家都能理解的例子,例如有個(gè)銀行讓你開(kāi)發(fā)個(gè)算法識(shí)別哪些客戶(hù)可能逾期,但由于銀行數(shù)據(jù)敏感,不能直接給你,只給了你data schema讓你自己模擬數(shù)據(jù),你說(shuō)沒(méi)問(wèn)題,回去花了一周寫(xiě)了個(gè)模型,準(zhǔn)確率(accuracy)是90%,很不錯(cuò),結(jié)果在客戶(hù)那一上線,準(zhǔn)確率99%,你更高興了,但很快你發(fā)現(xiàn),客戶(hù)的數(shù)據(jù)label 0:1的比例是1:99,你準(zhǔn)確率99%和瞎猜沒(méi)區(qū)別。事實(shí)上,如果你和客戶(hù)溝通得當(dāng),早點(diǎn)理解清楚數(shù)據(jù)情況,你就不會(huì)采用accuracy這個(gè)評(píng)價(jià)指標(biāo)。
用管理代替技術(shù)。這是區(qū)別高階工程師和普通工程師的重要能力。一個(gè)項(xiàng)目,如果管理得當(dāng),那么可以讓一線開(kāi)發(fā)人員輕松點(diǎn)的同時(shí)完成更多工作。
有的工作是另一個(gè)工作的基礎(chǔ),完成A再完成B的總時(shí)間可能小于先完成B再完成A。 工作是永遠(yuǎn)做不完的,即使都是技術(shù)工作,也有價(jià)值不同。好的技術(shù)管理人員應(yīng)該讓大家先做價(jià)值高的。
用眼光代替技術(shù)。做到這個(gè)級(jí)別,基本就是CTO級(jí)別了,充分了解現(xiàn)有技術(shù)優(yōu)缺點(diǎn),知道什么地方應(yīng)該投入新技術(shù),什么地方應(yīng)該采用舊技術(shù),什么地方甚至不需要技術(shù)。但畢竟我還沒(méi)做到這層,這里就沒(méi)什么經(jīng)驗(yàn)可以分享了。
更何況,對(duì)于算法工程師,除了技術(shù)能力,還有很多能力是必須的,如下圖,這些能力,組成了算法工程師的「落地能力」。

圖來(lái)自我之前寫(xiě)的一個(gè)被知乎日?qǐng)?bào)收錄了的回答。這里就不再重復(fù)其內(nèi)容了。
3. 不要只關(guān)注自己領(lǐng)域的技術(shù)
拋開(kāi)非技術(shù)的能力,來(lái)集中講講技術(shù)。對(duì)于技術(shù)能力,你是否以為你關(guān)注最新論文,會(huì)調(diào)參,就完事了。沒(méi)這么簡(jiǎn)單。我每次講算法工程師工作內(nèi)容時(shí),都會(huì)貼這張圖:

中間那個(gè)小小的幾乎都快看不見(jiàn)的黑塊,你放大圖片,會(huì)發(fā)現(xiàn)里面寫(xiě)著ML Code,這就是「算法」的部分。當(dāng)然,別被這個(gè)圖嚇到,這不一定全是你的工作,這里是一個(gè)團(tuán)隊(duì)的任務(wù),這個(gè)團(tuán)隊(duì)可能是兩人的團(tuán)隊(duì),也可能是幾十人的團(tuán)隊(duì),但可以肯定的是,無(wú)論你在哪個(gè)公司,一個(gè)算法工程師都不太可能只做純「算法」,不要忘了「工程師」三個(gè)字。
我作為一個(gè)算法工程師,你以為我只寫(xiě)python,偶爾加點(diǎn)scala?不,你可能想不到,我還寫(xiě)vba。我們客戶(hù)是銀行,他們有內(nèi)部的模型驗(yàn)證團(tuán)隊(duì),我們需要根據(jù)他們提供的模板來(lái)生成模型性能報(bào)表,而且這個(gè)報(bào)表模板還不能往外網(wǎng)傳,那怎么辦?只能用VBA寫(xiě)個(gè)Excel宏腳本自動(dòng)生成報(bào)表唄唄。畢竟他們提供的可編程環(huán)境就只剩excel了,至于python什么的,由于沒(méi)聯(lián)網(wǎng),pip install啥都不行。
所以我建議,作為算法工程師,多學(xué)習(xí)下周邊技術(shù),不要僅僅只會(huì)調(diào)參,看論文。周邊技術(shù)是指能為你快速實(shí)現(xiàn)驗(yàn)證與部署的技術(shù),并非所有技術(shù)都要學(xué)習(xí)。你作為一個(gè)算法工程師,學(xué)習(xí)linux,可以方便你部署模型;學(xué)習(xí)spark,能方便你快速處理大數(shù)據(jù);這樣你有什么新的idea都可以快速驗(yàn)證而不用再求數(shù)據(jù)工程師幫你反復(fù)做ETL。
但,吾生也有涯,而知也無(wú)涯。以有涯隨無(wú)涯,殆已!但你作為算法工程師,去學(xué)習(xí)安卓app開(kāi)發(fā),似乎就有點(diǎn)不必要了,除非你確定用得上,或者你是你們公司唯一的程序員(這種情況建議跳槽)。
這是我在自我提升路上的一點(diǎn)總結(jié),希望對(duì)大家有所幫助。
我是桔了個(gè)仔,一個(gè)和貓咪一起寫(xiě)代碼的貓奴,更多內(nèi)容可點(diǎn)擊原文查看。

往期精彩回顧
本站qq群851320808,加入微信群請(qǐng)掃碼:
