程序員讀研如何提高技術(shù)之我見
你想進(jìn)什么公司,和你讀什么計算機(jī)方向,關(guān)系不是很大。只要是理工科的學(xué)生,面對技術(shù)崗位,其實機(jī)會是差不多的。
至于你想什么職位,那顯然和你的專業(yè)/方向關(guān)系較大,比如說很多大數(shù)據(jù)職位,就明確表示要求你DM/ML/NLP/IR背景,但是這也只是說這些學(xué)生可能更有優(yōu)勢些,事實上,數(shù)學(xué)和統(tǒng)計學(xué)出身的,很多搞這個非常牛逼的。
所以,不要問選什么導(dǎo)師,選什么方向;也不要問我的實驗室很水老板很菜我還能找到好工作嗎?你要問的是:我想畢業(yè)去互聯(lián)
網(wǎng)公司,我讀研的這幾年是應(yīng)該打醬油呢,還是打地溝油?
想找一個好的互聯(lián)網(wǎng)技術(shù)類、研發(fā)類工作,無非就是以下4點(diǎn),你任選一點(diǎn),做好了,都是有利的,哪4點(diǎn)?
語言層面
算法層面
項目層面
專業(yè)層面
具體分析如下:
語言層面
你是想搞C++還是Java?選定一門語言后,多看一些這方面的書。
C++,不用說了,《Effective C++》,《More Effective C++》,《Inside The C++ Object Model》等等。
Java,最好能看點(diǎn)虛擬機(jī)相關(guān)的。尤其是Java虛擬機(jī)的內(nèi)存管理。以及多線程、線程池、設(shè)計模式等。
問題來了:學(xué)C++好還是學(xué)Java好呢?語言爭論每天都在發(fā)生,真的好無聊。建議按照方向和興趣來選擇,不靠譜的說:
如果是想做大型游戲開發(fā)、底層研發(fā)、系統(tǒng)研發(fā)、驅(qū)動研發(fā)等等,就選用C/C++。
如果是想做網(wǎng)站開發(fā)、網(wǎng)絡(luò)研發(fā)、上層開發(fā)、Android開發(fā)等等,就選用Java。
順便說一下,有空可以學(xué)學(xué)Python。
算法層面
學(xué)好算法。這個有兩條路,最好是并行,那就是看書和做題。
看書的話,主要有《算法導(dǎo)論》、《算法》(Robert Sedgewick著)、《算法競賽入門經(jīng)典》、《挑戰(zhàn)程序設(shè)計競賽》
找一本認(rèn)真看,認(rèn)真思考。證明過程可以不看,但是算法思想最好能懂,以及實現(xiàn),最好能在紙張上寫出來。復(fù)雜度總要知道吧?
研一的時候,我就把算法導(dǎo)論上的很多算法,都自己親自coding了下。
特別復(fù)雜的數(shù)據(jù)結(jié)構(gòu),比如紅黑樹、B樹,沒空就別搞了?;ヂ?lián)網(wǎng)面試一般都不要求的。
主要是排序、查找、簡單DP、貪心、圖算法和搜索。 根據(jù)身邊同學(xué)的面試經(jīng)驗,二分搜索和快速排序,是面試常備了??磿臅r候,如果有時間,可以思考幾個問題:
-
這個算法的時間空間復(fù)雜度,各是多少?如何分析?
-
工程實現(xiàn)里,都有哪些trick?如何加速?
-
這個算法可能用在哪些方面?有哪些應(yīng)用?你比如說吧,求交集的算法,就廣泛用在倒排索引、新浪微博共同關(guān)注、計算Jaccard系數(shù)等等上。
除了看書,還有就是很重要的:刷題啦。主要有poj,zoj等。找一個網(wǎng)站,認(rèn)真刷一些題目,踏踏實實的,別浮躁。
項目層面
如果實驗室比較牛,基本上忙項目就足夠累死累活了;不過做了相對給力的項目,對于找工作,還是有很大幫助的?;旧喜挥迷趺闯盍?。
如果老板這兒沒項目呢?
如果實驗室比較水,那就盡量去實習(xí)。大公司的實習(xí)經(jīng)驗很能給簡歷加分。如果老板不讓你出去實習(xí)。ok,既然實驗室很水,說明自由時間比較多,那還是可以干很多事。比如說,github上就有很多開源項目,你可以選擇一兩個著名的,閱讀源碼,然后嘗試自己也參與進(jìn)去。
說幾個我比較感興趣的開源項目吧:redis,spark。
專業(yè)層面
你對數(shù)據(jù)挖掘很精通,你對推薦系統(tǒng)很熟悉。你在NIPS,SIGIR上發(fā)表論文無數(shù);你是百度推薦大賽,阿里巴巴大數(shù)據(jù)比賽冠軍常客。
也就是說,除了嘗試發(fā)頂會論文,還可以參加各種比賽。本專業(yè)本領(lǐng)域里都有什么比賽可以參加呢?搜一下微博或者知乎,或者問下師兄師姐,不就知道了?
專業(yè)層面,可以做的東西非常多。比如,你對數(shù)據(jù)挖掘很感興趣,那么數(shù)據(jù)挖掘中的常見模型,我們了解多少?機(jī)器學(xué)習(xí),我們掌握到什么程度了?舉個例子:
-
SVM和logistic regression這兩種model,有什么特點(diǎn)?各自的適用場合?
-
feature selection的常用方法有哪些?為什么lasso可以作為feature selection?
-
Adaboosting為什么不容易over-fitting?你能不能從statistical view來解釋解釋?
-
哦,你和我說,你不是搞學(xué)術(shù)研究,你反感Learning Theory,你說你是一個工程師,那你寫了多少代碼?
scikit-learn,weka,以及spark,你會用哪個工具?(熟悉一種工具)
你有自己下載一些數(shù)據(jù)集跑跑實驗嗎?你有參加一些大數(shù)據(jù)相關(guān)的競賽嗎?(動手實驗/參加比賽)
專業(yè)層面,能做的,要做的,還有很多。
哦,最好熟悉下linux的基本使用。
最后的話
如果能在讀研期間做到這里的一點(diǎn)或者幾點(diǎn),到時候甚至不需要翻《編程之美》或者leetcode就毫無壓力啦。 最后說幾點(diǎn)個人感受。
-
算法牛,項目牛,長得又帥,又精通很多語言,這種人,是不多見的。
也就是說,你想拿一個好offer,一般只要有一兩點(diǎn)突出,就可以了。
-
互聯(lián)網(wǎng)面試,除了個別公司個別面試官,一般都是要考查(考查?考察?這兩個詞有什么區(qū)別?考察是調(diào)研、研究、分析的意思)算法的。你研一的時候準(zhǔn)備,看書做題,總比研三的時候抱佛腳來的好吧?
況且,算法的學(xué)習(xí),也不僅僅是為了面試吧?可能是受益終身的?;蛘?,吹牛皮裝逼作為談資,也是可以的。
-
別輕易說我就要去某某公司。到時候,你會發(fā)現(xiàn),選擇比你想象的多。
也有可能比你想象的還少,為什么?
就看你有沒有做到我上面說的這些了。