知乎熱問:成為算法工程師,掌握什么技術(shù)會(huì)感覺自我提升突飛猛進(jìn)?
這個(gè)問題我猶豫了很久,三個(gè)月前就放草稿箱里了,一直沒答的原因是,感覺這些年好像沒有什么瞬間讓我感覺自己水平突飛猛進(jìn),感覺這些年的進(jìn)步都是慢慢進(jìn)步的,好像沒有「突飛猛進(jìn)」的時(shí)候。昨天帶我入行的同事離職了,在部門的送別儀式上,我們回憶起我第一天入職時(shí)我那么的「小白」,后來怎么獨(dú)擋一面。于是我在想,如果要總結(jié)一個(gè)讓我的水平提升的關(guān)鍵「概念」或者「技術(shù)」,那會(huì)是什么。

作者:桔了個(gè)仔,南洋理工大學(xué),Datawhale成員
于是我回顧這些年的技術(shù)歷程。說實(shí)話,在我開始搞算法后,我日均代碼量遠(yuǎn)遠(yuǎn)低于我之前做游戲時(shí),甚至有的時(shí)候,幾天都不寫一行代碼。當(dāng)然,我并不能代表所有算法工程師,我雖然也是做數(shù)據(jù)科學(xué)工作,但我需要和客戶保持聯(lián)系,理解需求。但無可否認(rèn),代碼量少的這些日子,我反而做的事情更靠譜,讓我更有成就感。
我于是總結(jié)出一句話: 解決問題不要于拘泥于技術(shù)。
當(dāng)然,僅僅一句話的話,大家可能看得一頭霧水,我展開說說吧。
不要拘泥于技術(shù)分為三層:

1. 不要執(zhí)著于使用最新的技術(shù)
有的人想走技術(shù)專家的路線,那非常好。每天看看arxiv,看看最新的SOTA,那是一個(gè)好習(xí)慣。但不要太頻繁的變更技術(shù)方案。你那種想把產(chǎn)品做到極致的思維,我能理解,我也有過,但你真正做產(chǎn)品落地了,會(huì)發(fā)現(xiàn),產(chǎn)品是一個(gè)系統(tǒng),你的技術(shù)方案變更可能會(huì)對其他模塊造成影響。
舉個(gè)例子,我們的模型是XGBoost,不算很復(fù)雜吧?由于我們給多個(gè)客戶部署過系統(tǒng),我們知道在什么樣的硬件條件下運(yùn)行時(shí)間是多少。例如在每日1萬條數(shù)據(jù)的情況下,我們用AWS的t2.xlarge實(shí)例,運(yùn)行時(shí)間是1~2小時(shí),符合客戶要求。但如果你看到最新的paper提出了一個(gè)新模型,決定要采用的話,除了你的技術(shù)方案可行性要得到驗(yàn)證,你的技術(shù)方案對系統(tǒng)運(yùn)行時(shí)間的影響也要重新評估。如果你的方案確實(shí)效果更好,但服務(wù)器成本高出幾倍,我們該如何說服客戶?這都是是一環(huán)扣一環(huán)的,實(shí)際可能遇到的情況可能比我說的要復(fù)雜得多。這,就是系統(tǒng)的世界。
統(tǒng)計(jì)建模并不是為了獲得完美的預(yù)測能力,而是用最小的必要的模型來實(shí)現(xiàn)最大的預(yù)測能力。
更何況,很多情況下,使用更復(fù)雜的方案未必是最合適的方案。我之前寫過一個(gè)回答,講了哪些深度學(xué)習(xí)效果不如傳統(tǒng)方法。
在這個(gè)回答里,我引用了那個(gè)著名的「電風(fēng)扇吹香皂盒」的段子:
某大企業(yè)引進(jìn)了一條香皂包裝生產(chǎn)線,結(jié)果發(fā)現(xiàn)這條生產(chǎn)線有個(gè)缺陷:常常會(huì)有盒子里沒裝入香皂??偛荒馨芽蘸凶淤u給顧客啊,他們只得請了一個(gè)學(xué)自動(dòng)化的博士后設(shè)計(jì)一個(gè)方案來分揀空的香皂盒。博士后拉起了一個(gè)十幾人的科研攻關(guān)小組,綜合采用了機(jī)械、微電子、自動(dòng)化、X射線探測等技術(shù),花了90萬,成功解決了問題。每當(dāng)生產(chǎn)線上有空香皂盒通過,兩旁的探測器會(huì)檢測到,并且驅(qū)動(dòng)一只機(jī)械手把空皂盒推走。中國南方有個(gè)鄉(xiāng)鎮(zhèn)企業(yè)也買了同樣的生產(chǎn)線,老板發(fā)現(xiàn)這個(gè)問題后大為發(fā)火,找了個(gè)小工來說“你他媽給老子把這個(gè)搞定,不然你給老子爬走?!毙」ず芸煜氤隽宿k法他花了190塊錢在生產(chǎn)線旁邊放了一臺(tái)大功率電風(fēng)扇猛吹,于是空皂盒都被吹走了。
但這里需要說明的是,不執(zhí)著于使用最新技術(shù),不代表不關(guān)注最新技術(shù)。有的時(shí)候,公司的需求是一回事,但我們的技術(shù)進(jìn)步又是一回事,如果我們不care最新技術(shù),那么當(dāng)我們跳槽時(shí),就會(huì)很吃虧。

2. 不要只用技術(shù)
技術(shù)不是職業(yè)生涯的全部,尤其是對于做商業(yè)產(chǎn)品的算法工程師。作為算法工程師,尤其是做商業(yè)產(chǎn)品的,其實(shí)有很多時(shí)候,技術(shù)并不能解決所有問題;有的時(shí)候,技術(shù)雖然能解決,但是中策,甚至下策,而上策不一定需要使用技術(shù)。代替技術(shù)的方法有下面四種,一種比一種境界高。
用金錢代替技術(shù)。例如你的產(chǎn)品上線了,發(fā)現(xiàn)在線上模型訓(xùn)練總是不成功,發(fā)現(xiàn)是服務(wù)器性能不夠,那么你第一件事是優(yōu)化你的算法還是花錢擴(kuò)充服務(wù)器?如果對于商業(yè)價(jià)值很高的項(xiàng)目,宕機(jī)一天損失可能遠(yuǎn)遠(yuǎn)超過服務(wù)器開支,這時(shí)候,你第一件事買服務(wù)器,優(yōu)化的工作放到日后。
用溝通代替技術(shù)。很多人經(jīng)常方案進(jìn)展到一半推到重來的情況(設(shè)計(jì)師尤甚)。對于算法工程師,如果溝通不充分就直接開工,那么很容易做無用功。舉個(gè)大家都能理解的例子,例如有個(gè)銀行讓你開發(fā)個(gè)算法識(shí)別哪些客戶可能逾期,但由于銀行數(shù)據(jù)敏感,不能直接給你,只給了你data schema讓你自己模擬數(shù)據(jù),你說沒問題,回去花了一周寫了個(gè)模型,準(zhǔn)確率(accuracy)是90%,很不錯(cuò),結(jié)果在客戶那一上線,準(zhǔn)確率99%,你更高興了,但很快你發(fā)現(xiàn),客戶的數(shù)據(jù)label 0:1的比例是1:99,你準(zhǔn)確率99%和瞎猜沒區(qū)別。事實(shí)上,如果你和客戶溝通得當(dāng),早點(diǎn)理解清楚數(shù)據(jù)情況,你就不會(huì)采用accuracy這個(gè)評價(jià)指標(biāo)。
用管理代替技術(shù)。這是區(qū)別高階工程師和普通工程師的重要能力。一個(gè)項(xiàng)目,如果管理得當(dāng),那么可以讓一線開發(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ù)。但畢竟我還沒做到這層,這里就沒什么經(jīng)驗(yàn)可以分享了。
更何況,對于算法工程師,除了技術(shù)能力,還有很多能力是必須的,如下圖,這些能力,組成了算法工程師的「落地能力」。

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

中間那個(gè)小小的幾乎都快看不見的黑塊,你放大圖片,會(huì)發(fā)現(xiàn)里面寫著ML Code,這就是「算法」的部分。當(dāng)然,別被這個(gè)圖嚇到,這不一定全是你的工作,這里是一個(gè)團(tuán)隊(duì)的任務(wù),這個(gè)團(tuán)隊(duì)可能是兩人的團(tuán)隊(duì),也可能是幾十人的團(tuán)隊(duì),但可以肯定的是,無論你在哪個(gè)公司,一個(gè)算法工程師都不太可能只做純「算法」,不要忘了「工程師」三個(gè)字。
我作為一個(gè)算法工程師,你以為我只寫Python,偶爾加點(diǎn)scala?不,你可能想不到,我還寫vba。我們客戶是銀行,他們有內(nèi)部的模型驗(yàn)證團(tuán)隊(duì),我們需要根據(jù)他們提供的模板來生成模型性能報(bào)表,而且這個(gè)報(bào)表模板還不能往外網(wǎng)傳,那怎么辦?只能用VBA寫個(gè)Excel宏腳本自動(dòng)生成報(bào)表唄唄。畢竟他們提供的可編程環(huán)境就只剩excel了,至于python什么的,由于沒聯(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。
但,吾生也有涯,而知也無涯。以有涯隨無涯,殆已!但你作為算法工程師,去學(xué)習(xí)安卓app開發(fā),似乎就有點(diǎn)不必要了,除非你確定用得上,或者你是你們公司唯一的程序員(這種情況建議跳槽)。
這是我在自我提升路上的一點(diǎn)總結(jié),希望對大家有所幫助。
最后還有句話是這么說的:栽一棵樹最好的時(shí)間是十年前,其次是現(xiàn)在。對于學(xué)習(xí)編程或者正在工作的朋友,如果你想更好的提升你的編程能力幫助你提升水平!筆者這里或許可以幫到你~
微信公眾號(hào):C語言編程學(xué)習(xí)基地
分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!
