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

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

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

