今年是我工作的第四年,一路走來磕磕絆絆,想把自己的學(xué)習(xí)和工作路徑做一份總結(jié),也希望這份總結(jié)能夠幫助那些想成為算法工程師的同學(xué)。
這一次不是21天,也不是3個月速成班,而是需要三年! 我是以一個一線互聯(lián)網(wǎng)公司對算法工程師的要求寫的這份總結(jié)和指南,如果你只是想渾水摸魚,急功近利,那么我寫的東西肯定是不適合你的。 在這三年里,我面試了大大小小互聯(lián)網(wǎng)公司15家左右,收割了包括bat在內(nèi)的大部分offer。當(dāng)然,有幾份offer是面試多次才獲取的,比如百度,阿里等。 剛畢業(yè)的時候去面試死的很慘,到后期能力提升上來了,面試也就容易了,也形成了一套自己的面試套路:刷題!
因此這篇文章皆在表達以下幾個目的:
自我總結(jié)。對過去三年求學(xué)和求工作經(jīng)歷的總結(jié),不斷反思,共同探討
學(xué)習(xí)路徑規(guī)劃。我會根據(jù)自己的理解推薦三年左右的學(xué)習(xí)規(guī)劃
面試指南。結(jié)合自身的面試經(jīng)歷,總結(jié)出一些可用實踐方案
需要說明的是:文章表達的只是我個人的理解,如果你的理解與我的有出入,那么純屬“不巧合”,以我為準(zhǔn)(捂臉???♀?)! 同時,我是假設(shè)你與我一樣的基礎(chǔ):沒有數(shù)學(xué)和計算機基礎(chǔ),但是至少有本科學(xué)歷 這樣的前提條件下來寫的。 此處我不想針對學(xué)歷做任何討論,現(xiàn)實的世界就是沒有學(xué)歷你將寸步難行,找工作尤為明顯。
我規(guī)劃的學(xué)習(xí)路線并不是嚴(yán)格按照我當(dāng)初自學(xué)的方法來進行的,因為我當(dāng)初走了很多彎路,踩了很多坑。在閱讀這份總結(jié)前需要一點備注信息:
我假設(shè)每周能學(xué)習(xí)10個小時左右,具體怎么分配可習(xí)性安排。但是學(xué)習(xí)要有連貫性,有保證有大塊整段時間來學(xué)習(xí)!每次學(xué)20分鐘這種所謂的零碎時間學(xué)習(xí)就拉倒吧,你將一事無成
堅持堅持堅持!最難人可貴的不是知識本身而是你的毅力和堅持!智商上的差距真的不是很大,大的是每個人的毅力與野心
不存在所謂的速成班,算法更是如此!也不存在所謂的業(yè)務(wù)愛好,走馬觀花搞一搞,算法不是你想搞,想搞就能搞!既然要學(xué),就做好拼盡全力的準(zhǔn)備。否則就是在浪費時間,真的!!
我們把整個學(xué)習(xí)路徑分為三部分:
夯實基礎(chǔ)
機器學(xué)習(xí)
算法工程師
一、夯實基礎(chǔ)
算法工程師兩把斧,一把是數(shù)學(xué),一把是計算機知識。所謂的算法無非就是應(yīng)用計算機工具將數(shù)學(xué)知識應(yīng)用到業(yè)務(wù)中。 但數(shù)學(xué)和計算機的知識包羅萬象,普通人即使終其一生也不可能學(xué)完或者學(xué)精整個學(xué)科。 對于算法工程師來說,我們只挑選最核心的知識來學(xué)習(xí)即可!下面直擊要害
數(shù)學(xué)
統(tǒng)計概率
微積分
線性代數(shù)
機器學(xué)習(xí)入門
計算機
C/C 語言
數(shù)據(jù)結(jié)構(gòu)和算法
PYTHON編程語言
JAVA編程語言
英文
至少要是大學(xué)六級的水平,雅思6.5分,閱讀小分6.5才算合格
我先來說英文,據(jù)我所觀察,英文是區(qū)分一個程序員是否優(yōu)秀的重要標(biāo)志。你英文好不一定就能成為優(yōu)秀的程序員,但是英文不好很大概率上你不可能成為優(yōu)秀的程序員。 算法這個行業(yè)發(fā)展太快速了,日新月異,大部分資料都是英文的,發(fā)表的paper也肯定都是英文的。中文的翻譯書籍往往還沒出版,英文的版本就已經(jīng)迭代好幾次了。英文不好,你上不了Google,上不了github,上不了stackoverflow,上不了這個星球上任何優(yōu)秀的程序員網(wǎng)站。 很大程度上,英文能力會對你的學(xué)習(xí)工作視野產(chǎn)生決定性影響。說到這,很多同學(xué)都寒心了,“我就是英文不好,咋辦”。 其實大部分城學(xué)員英文都“不好”,包括那些你看到的優(yōu)秀程序員! 但是有一點他們肯定很厲害,就是英文閱讀的能力。沒錯,對于大部分程序員來說,只要閱讀過關(guān),英文就夠用了,如果聽力還過關(guān),那基本上足夠用了,如果寫作業(yè)過關(guān),那就很厲害了,如果口語也過關(guān),那就忽略我寫的這一段,你將會體驗英文給你帶來的巨大優(yōu)勢!
數(shù)學(xué)
數(shù)學(xué)是算法的“靈魂”! 數(shù)學(xué)學(xué)不好會比英文還糟糕,英文是錦上添花,數(shù)學(xué)是你能力的上限!其實發(fā)展到今天,機器學(xué)習(xí)等知識涉及到是數(shù)學(xué)知識實在是太多了,我自身也沒有完全搞清楚或者說將全部的知識弄明白,只能結(jié)合自己學(xué)習(xí)過的以及身邊一些案例來給大家做一個推薦
統(tǒng)計概率
統(tǒng)計學(xué)和概率論經(jīng)常被放在一起使用,直到現(xiàn)在還有很多人在區(qū)分機器學(xué)習(xí)和統(tǒng)計學(xué),有所謂的“統(tǒng)計派”和“計算機派”(參考吳恩達以及他的恩師喬丹,不是打籃球的那個)。 統(tǒng)計學(xué)涉及的回歸分析是機器學(xué)習(xí)里最簡單的線性模型,概率論里面的概率分布和概率計算是機器學(xué)習(xí)演算的一個核心。機器學(xué)習(xí)模型對樣本進行預(yù)測的都是給出一個概率值,表達不確定性!
如果你是文科生,數(shù)學(xué)又很弱的話,我推薦你學(xué)習(xí)《商務(wù)與經(jīng)濟統(tǒng)計》。這本書淺顯易懂,不會像國內(nèi)教材那樣枯燥乏味,每一章節(jié)都會含有一個具體的商業(yè)案例,大量的習(xí)題(雖然習(xí)題很弱)。每天學(xué)習(xí)1-1.5個小時,差不多30天能學(xué)完。最難的章節(jié)屬于假設(shè)檢驗以及線性回歸那里,單也僅僅是相對的難而已,比起機器學(xué)習(xí),它毛都不算!
如果你是理科生或者數(shù)學(xué)功底不錯的話,我推薦你學(xué)習(xí)陳希孺的《概率論與數(shù)理統(tǒng)計》。很傳統(tǒng)很經(jīng)典的中國式教材,但是寫的內(nèi)容實在是好,前后銜接的恰到好處,由淺入深,概念解釋的直白明了,涵蓋了以后機器學(xué)習(xí)所需要的幾乎全部概率知識。缺點就是純教科書班的書籍,讀起來略微枯燥。
推薦星級
《商務(wù)與經(jīng)濟統(tǒng)計》 五星
《概率論與數(shù)理統(tǒng)計》 四星
建議學(xué)習(xí)周期:40天
微積分
我只推薦一本書《普林斯頓微積分讀本》和一門簡單的課程《微積分的本質(zhì)》。我看過很多微積分的教材,包括同濟的《微積分》以及《托馬斯微積分》,但是都沒有《普林斯頓微積分讀本》更能吸引我的注意力。這本書淺顯易懂,書籍看起來很厚,但是學(xué)習(xí)起來并不費力,作者的寫作觀點很友好,風(fēng)格較為輕松卻又不失嚴(yán)謹(jǐn)。建議如果基礎(chǔ)較差的同學(xué)可以“重頭來過”,好好的跟學(xué)一遍!我對泰勒展開式那一章節(jié)尤為記憶深刻,作者先是引入了一個及簡單的案列,接著就此案列進行了深入的講解,一目了然。
《微積分的本質(zhì)》是三藍(lán)一棕出品的簡短視頻,通過酷炫的動態(tài)PPT演示了微積分的過程。但是真的僅僅是入門級別的視頻,就當(dāng)做課外“讀物”學(xué)一學(xué)吧
推薦星級
《普林斯頓微積分讀本》 四星
《微積分的本質(zhì)》 四星
建議學(xué)習(xí)周期:60天
線性代數(shù)
線性代數(shù)到底怎么學(xué),我真的一直沒有找到很好的方法。我看過很多的書籍和視頻,包括同濟的那一本很薄的書,我一度以為那是本很好的教材,直到我在網(wǎng)易云課堂上學(xué)習(xí)了MIT的線性代數(shù)課程,像是打開了新世界的大門,原來線性代數(shù)背后的理論并不是憑空記憶而來的。后來又學(xué)習(xí)了《線性代數(shù)的本質(zhì)》這套課程,那令人震驚的動畫演示線性變換至今令我記憶猶新!
推薦星級
《MIT線性代數(shù)》 五星
《線性代數(shù)的本質(zhì)》 五星
建議學(xué)習(xí)周期:20天
計算機技能
PYTHON
如果你想入門計算機,首先應(yīng)該先學(xué)一門語言,它會是你使用最多的一個工具。而PYTHON幾乎是最簡單的最適合新手學(xué)習(xí)的一門語言。我個人認(rèn)為學(xué)習(xí)PYTHON需要包含以下幾個方面:
PYTHON的基礎(chǔ)語法
使用PYTHON掌握基礎(chǔ)的計算機編程思路
PYTHON用于數(shù)據(jù)處理和數(shù)據(jù)分析
任何一門語言的學(xué)習(xí)都離不開語法本身,Python也不列外,但相對于其他語言,Python語法就簡潔明了。我看過很多PYTHON入門的書籍,要說好的我就只推薦兩個,一本是《LEARN PYTHON THE HERD WAY》,另一本是《PYTHON編程:從入門到實踐》。如果你每天抽出兩個小時來學(xué)習(xí),一般兩個星期就能搞定PYTHON語法。
接下來我推薦學(xué)習(xí)的可能與你在其他地方看到的不一樣,我希望你能學(xué)習(xí)一些計算編程思維,再直白一點就是學(xué)習(xí)一點數(shù)據(jù)結(jié)構(gòu)和算法。 隨著我自己工作經(jīng)歷的增長,越來越發(fā)現(xiàn)編程思維(數(shù)據(jù)結(jié)構(gòu)和算法)對于工作以及思考問題的重要性,所以直到現(xiàn)在我仍然在不斷的惡補之前落下的數(shù)據(jù)結(jié)構(gòu)和算法。因此你不妨在一開始學(xué)習(xí)階段就來彌補一些!
我給你推薦的是一本書以及這本書配套的課程,這是我看過的最好的教程: 《PYTHON編程導(dǎo)論》以及EDX上開設(shè)的專門的對應(yīng)視頻課程。這套教程除了講解PYTHON基礎(chǔ)知識外,還會講解常用的編程算法,包括查找,排序,搜索等等,可以說是相當(dāng)好的入門計算機課程。
PYTHON是一門非常綜合的語言,被發(fā)明出來也不是為數(shù)據(jù)挖掘或者數(shù)據(jù)分析專用的。PYTHON能夠成為“AI第一語言”得益于它眾多的第三方庫,因此我們還需要學(xué)習(xí)一下專門用來進行數(shù)據(jù)處理的第三方庫:pandas、numpy、matplotlib。唯一推薦的書籍就是pandas作者寫的《利用PYTHON進行數(shù)據(jù)分析》,這本書介紹了幾乎三個庫主流的用法,相當(dāng)實用。唯一的缺點就是編排比較亂,學(xué)的很零散,所以需要你自己好好的總結(jié)一番!
推薦星級
《PYTHON編程:從入門到實踐》 四星
《PYTHON編程導(dǎo)論》 五星
《利用PYTHON進行數(shù)據(jù)分析》4星
建議學(xué)習(xí)周期:30天
機器學(xué)習(xí)
我們宗旨是成為一名算法工程師,現(xiàn)代意義上算法工程師一般就是指機器學(xué)習(xí)工程師。在第一年的夯實基礎(chǔ)階段,我們并不能完全深入的學(xué)習(xí)完機器學(xué)習(xí)的知識,但是入門還是一定要具備的。機器學(xué)習(xí)數(shù)學(xué)基礎(chǔ)三板斧:微積分、線性代數(shù)、統(tǒng)計概率! 所以你可以看出來,為什么我花了很大篇幅和你講要認(rèn)真學(xué)習(xí)這三門課!
那么入門階段該怎么做呢? 很簡單,一門課一本書。
一門課
吳恩達《MACHINE LEARNING》公開課
這真的是地球上最好的機器學(xué)習(xí)入門課程了!我無法用文字來推薦它,總之你就記得學(xué)習(xí)機器學(xué)習(xí)看著門課程就絕對錯不了。網(wǎng)上一大堆關(guān)于這門課的資料、評價、筆記等等,數(shù)不勝數(shù)!
一本書
《Introduction to Data Mining》(數(shù)據(jù)挖掘?qū)д?/span>)
很遺憾,我并沒有推薦周老師的書,也沒有推薦韓老師的書(如果你不認(rèn)識兩位老師,那就忽略這句話)。 數(shù)據(jù)挖掘?qū)д撌俏覍W(xué)習(xí)過的最好的入門級別的教材,與其它一上來就開始講解模型的書籍相比,這本書會從最開始的數(shù)據(jù)準(zhǔn)備,數(shù)據(jù)處理講解,給與新手最好的入門方式。其內(nèi)容板塊安排的又是相當(dāng)?shù)暮侠恚绕涫菦Q策樹和異常檢測這兩章,我覺得是相當(dāng)?shù)木?,手把手教你推?dǎo)一個決策樹!有一個章節(jié)我覺得可以不學(xué),就是關(guān)聯(lián)分析,似乎可能好像仿佛大約已經(jīng)沒人使用這種技術(shù)了,雖然我當(dāng)初仔細(xì)的學(xué)習(xí)過,而且這本書寫的也相當(dāng)?shù)暮?,但是真的沒應(yīng)用過,都快忘記的差不多了。請君自行判斷~
文:小明