面試造核彈,工作擰螺絲?
最近在工作中遇到這麼一個問題。
一個使用機器學習演算法的框架,在特徵處理模組,往往需要對原始特徵進行特徵交叉。對於簡單的單值特徵來說,只需要將需要交叉的特徵組合起來即可;但是對於多值特徵之間的交叉,則需要窮舉多值特徵每一個值的組合。例如,如果一個包含2個值的特徵和一個包含3個值的特徵組合,那麼將會產生出6個組合。
一般的,我們可以把這些多值特徵描述為
vector<vector<Feature>>
那麼給定這樣的一個數據結構,如何輸出所有的特徵組合呢?
直觀想法,這好像是直接遍歷就可以解決,但是稍微細想一下,簡單的N重for迴圈,無法解決這個問題。
在紙上畫了一會兒之後,突然發現,這不就是一個輸出全排列的問題嗎?
把問題抽象出來之後,我先是按照手工列舉全排列的思路,寫了一個非遞迴的迴圈版本,但是可讀性不好。然後又實現了一個可讀性更好的遞迴版本。
上面這個問題,只是一個引子。
我相信,程式員在大學畢業找工作的時候,一定刷過各種各樣的演算法題、資料結構題,什麼貪心演算法、動態規劃、快排、二分查詢,現在演算法工程師們還要手推SVM、反向傳播演算法等等,面試時也是歷盡千辛萬苦;然而工作後卻發現,正是應了題目那句話:面試造核彈,工作擰螺絲。
作為面試官也是一樣,考察了基礎知識、演算法題、智力題一大圈,結果招來的人入職後,發現怎麼幹活還是不靠譜?
話分兩頭說。
對於上面的特徵交叉問題,完全可以限定只支援2個特徵交叉。那麼直接
f1 = features[0] f2 = features[1] for i in f1: for j in f2: cross(i, j)
就直接解決了~皆大歡喜,完全不用想什麼全排列不全排列的事情。
如果事事都這樣簡而化之,那麼確實,大部分的工作都是擰螺絲。
但是,時代發展這麼快,萬一將來,擰螺絲的工種直接被AI取代了呢?這麼說吧,不涉及深入思考的工作,都將會慢慢邊緣化。千萬不要用戰術上的勤奮,掩蓋了戰略上的懶惰。
另一方面,面試官在面試時,是要考察什麼能力?是不是演算法題寫的滴水不漏就行了?
拋開對人的相關素質的考察(責任心、合作能力、態度等),我覺得不管是出演算法題,還是出智力題,其實最主要的,是考察一個人抽象問題的能力。
所以,直接讓人默寫一個快排,或者手推SVM,基本和問他“中國面積最大的計劃單列市是哪一個”沒什麼區別。正確的做法,應該是從一個實際問題出發,在對話中,瞭解應聘者的能力。
在萬事搜尋一下便知的時代,同樣遇到一個陌生的問題,有的人就能很快的從搜尋引擎上得到答案,有的人在搜尋引擎上亂翻一天也解決不了。為什麼?這就是抽象問題能力的差異。
還是以上面我遇到的問題為例。有的人遇到這樣的問題,可能會去直接搜尋“特徵交叉”,這樣得到的結果中,噪音是非常多的;而有的人直接搜尋“全排列演算法”,基本上前三條就可以找到答案。
最後說一句。腦子這個搜尋引擎是最快的,所以知識、經驗還是要儘量記在腦子中;而抽象能力+搜尋引擎,可以極大的擴充套件你的知識邊界。
最後,祝大家中秋節都能造核彈~
推薦閱讀:
ofollow,noindex" target="_blank">使用雙buffer無鎖化
crontab-auto-kill/" rel="nofollow,noindex" target="_blank">crontab為何自動中斷轉載請註明出處: http://blog.guoyb.com/2018/09/22/interview/
歡迎使用微信掃描下方二維碼,關注我的微信公眾號TechTalking,技術·生活·思考:
