我的編程能力從什么時(shí)候開(kāi)始突飛猛進(jìn)

對(duì)這個(gè)問(wèn)題感興趣的同學(xué),主要分兩種。
第一種是對(duì)編程有著無(wú)限興趣的,想要在編程之路上精進(jìn)專(zhuān)研的人。這些人學(xué)習(xí)編程,是出于自己自己的興趣,而這種興趣,幾乎從很早的時(shí)候就耳濡目染,被培養(yǎng)起來(lái)了。
第二種,或是因?yàn)樯钏龋蚴顷幉铌?yáng)錯(cuò),走上編程道路的人,他們學(xué)編程,真的只是為了掙口飯吃。
我屬于后者,可以說(shuō),是從一個(gè)不得不學(xué)習(xí)編程的人,吃過(guò)很多苦,最終,有了一丟丟收獲。
這個(gè)回答戳到自己心上了,碼的字有點(diǎn)多,如果你和我一樣,最開(kāi)始學(xué)習(xí)編程,只是為了謀生,痛苦而掙扎,那或許,我的經(jīng)歷值得你看下去。
1. 窘?jīng)r
上大學(xué)前,我沒(méi)有接觸過(guò)電腦,高考志愿是寫(xiě)在紙上,讓同學(xué)幫忙填到系統(tǒng)。
初入大學(xué),誤打誤撞從數(shù)學(xué)系轉(zhuǎn)到了計(jì)算機(jī)系,第一節(jié)計(jì)算機(jī)課程上,當(dāng)同學(xué)們都在噼里啪啦的敲字時(shí),我卻還在奇怪這機(jī)器怎么顯示屏不亮,是不是除了啥問(wèn)題。
為啥,因?yàn)槲疫B電腦開(kāi)機(jī)鍵是哪個(gè)都不知道。什么,你說(shuō)你不信,是的,我現(xiàn)在也不信,沒(méi)辦法,就是這么苦澀。
笨歸笨,上進(jìn)的心思還是有的,學(xué)校里的各種知識(shí)講座,不管能不能聽(tīng)懂,都會(huì)去湊湊熱鬧。有一次去了 ACM 講座,被學(xué)長(zhǎng)們的激情所打動(dòng),一激動(dòng)就報(bào)名參加了學(xué)校的 ACM 社團(tuán),然后,噩夢(mèng)和驚喜,同時(shí)開(kāi)始了。
ACM,名為國(guó)際大學(xué)生程序設(shè)計(jì)競(jìng)賽,學(xué)校里參加這個(gè)社團(tuán)的,基本都是從高中甚至初中就玩程序競(jìng)賽的「老同志」,很多都是在省級(jí)甚至國(guó)家級(jí)賽事上拿過(guò)獎(jiǎng)的。我一個(gè)編程基礎(chǔ)為 0 的小白,厚著臉皮每天和他們一起訓(xùn)練,精神的痛苦遠(yuǎn)遠(yuǎn)超過(guò)了肉體的折磨。
要知道,每天在一個(gè)團(tuán)體里出現(xiàn),但是沒(méi)人會(huì)注意到自己,任何有意思的話題,永遠(yuǎn)都沒(méi)法插上嘴,是一件非常打擊自信心和尊嚴(yán)的事情。
你會(huì)問(wèn)我,編程能力差可以努力呀,可以學(xué)呀,是呀,我也很努力,我也很痛苦,可這知識(shí)不進(jìn)腦子呀。
最終參加 ACM 的成績(jī)很差,第一年在學(xué)長(zhǎng)的帶領(lǐng)下拿了個(gè)銅牌,第二年自己參加,什么牌也沒(méi)撈上。
做過(guò) ACM 比賽的通知,都清楚,銅牌是不好意思說(shuō)出口的成績(jī),相當(dāng)于安慰獎(jiǎng)吧。我自己都想不通,每一個(gè)假期,都能看到自己在機(jī)房的身影,取得的成績(jī),真的對(duì)不起自己投入的時(shí)間。
直到很久之后,我才開(kāi)始釋?xiě)眩驗(yàn)槲野l(fā)現(xiàn),有時(shí)候努力的成果是在當(dāng)下能夠看到的,而另外一些時(shí)候,可能在稍遠(yuǎn)的未來(lái),才能開(kāi)花結(jié)果。
盡管第二年還沒(méi)取得什么成績(jī)之后,我就放棄 ACM 了,但不得不承認(rèn),經(jīng)過(guò)了一年多的練習(xí),我已經(jīng)基本上擁有了扎實(shí)的數(shù)據(jù)結(jié)構(gòu)算法功底,對(duì)程序效率的敏銳程度,也比沒(méi)有接受過(guò)專(zhuān)門(mén)訓(xùn)練的同學(xué)要好。
另外,我自己都沒(méi)有意識(shí)到,這一兩年的 ACM 醬油之旅,竟然成了我和計(jì)算機(jī)領(lǐng)域競(jìng)賽的相愛(ài)相殺的起點(diǎn),那時(shí)候的我,從沒(méi)意識(shí)到,幾年后自己能夠在另外一個(gè)競(jìng)賽賽道上,取得不錯(cuò)的成績(jī)。
大學(xué)時(shí)光的中后期,基本是在刷績(jī)點(diǎn) + 保研面試 + 實(shí)習(xí)工作中度過(guò)的,有點(diǎn)焦慮,有點(diǎn)充實(shí)。
第一次實(shí)習(xí)是以失敗告終的,但是保研結(jié)束后的大三暑假,一身輕松,于是聯(lián)系上了一家創(chuàng)業(yè)公司實(shí)習(xí),做的 PHP 開(kāi)發(fā)。
去了之后,發(fā)現(xiàn)同時(shí)入職的還有本校的另外一個(gè)小伙伴,是個(gè)技術(shù)極客,編程能力強(qiáng)悍。
由于之前沒(méi)有接觸過(guò)中大型項(xiàng)目的開(kāi)發(fā),編程思維還是處于面向過(guò)程,對(duì)于面向?qū)ο蟮拈_(kāi)發(fā)方式很不熟練,另外各種框架、組件十分生疏。
我還記得入職一個(gè)月后的一天,Leader 和我說(shuō),我這一個(gè)與干的活,他可能花個(gè)半小時(shí)就干完了,我知道,他說(shuō)的不是玩笑話,我的玻璃心,在那一瞬,碎的稀里嘩啦。
第二天,我逃避了,找了個(gè)理由離開(kāi)了公司,那一刻,我覺(jué)得心底里有個(gè)聲音對(duì)自己說(shuō):你真的不適合學(xué)技術(shù),可以去試試運(yùn)營(yíng)呀、銷(xiāo)售呀,之前很多兼職中,你不是做的很出色嗎。
如果不是因?yàn)閮e幸保研成功,繼續(xù)在計(jì)算機(jī)的道路上折騰,或許,我現(xiàn)在是一位出色的金牌銷(xiāo)售呢,我時(shí)常這么想。
2 轉(zhuǎn)機(jī)
如果說(shuō)學(xué)計(jì)算機(jī)的過(guò)程中,有什么時(shí)候是我一直做對(duì)的,那就是長(zhǎng)期堅(jiān)持和不斷嘗試。經(jīng)過(guò)一次次磨煉之后,終于迎來(lái)了一次對(duì)我來(lái)說(shuō)很不多的經(jīng)歷開(kāi)端。
大四在做完畢設(shè)之后,已經(jīng)是五月中旬了,離九月份研究生開(kāi)學(xué)還有一點(diǎn)時(shí)間,剛好可以做一份實(shí)習(xí)。于是在實(shí)習(xí)僧上尋找實(shí)習(xí)機(jī)會(huì),很幸運(yùn)的,拿到了一家從百度出來(lái)的創(chuàng)業(yè)公司的 Offer,方向是做機(jī)器學(xué)習(xí)自然語(yǔ)言理解領(lǐng)域的。
當(dāng)時(shí)很窮,這家公司給出的日薪是 300,每天還有 30 的飯補(bǔ),說(shuō)實(shí)話非常開(kāi)心,還記得從公司結(jié)束面試出來(lái)的第一時(shí)間就是掏出手機(jī)給女朋友報(bào)喜。那時(shí)候未諳世事的自己,能夠因?yàn)橐恍↑c(diǎn)事情欣喜若狂,因?yàn)橐恍↑c(diǎn)事情沮喪懊惱。
我未曾想到,這家公司,給我的生活帶來(lái)的改變,有如此之多,直到現(xiàn)在,雖然已經(jīng)離開(kāi)兩年多的時(shí)間了,但我們之間的故事和記憶,我想我會(huì)記上一輩子了。
在這個(gè)公司里,我從最開(kāi)始的小白,一點(diǎn)一點(diǎn)逐漸的對(duì) NLP 領(lǐng)域有了一定的掌握,非常感謝當(dāng)時(shí)帶我的師傅。
他是從百度出來(lái)的一位技術(shù)大牛,嚴(yán)謹(jǐn)?shù)拇a風(fēng)格,清晰的編程邏輯,讓當(dāng)時(shí)的我受益匪淺。后來(lái)的實(shí)習(xí)經(jīng)歷讓我們明白,不是每一次都有機(jī)會(huì)遇見(jiàn)這樣棒的 Leader 的。
開(kāi)始對(duì)于 NLP 的了解是一窮二白的,那就從最簡(jiǎn)單的文本數(shù)據(jù)處理開(kāi)始,學(xué)習(xí)基礎(chǔ)的 NLP 知識(shí)。
還記得當(dāng)時(shí)做的第一個(gè)項(xiàng)目是實(shí)現(xiàn)并優(yōu)化檢索問(wèn)答服務(wù),中間遇到了不少坑。沒(méi)辦法只能一點(diǎn)點(diǎn)的熬過(guò)來(lái),最終項(xiàng)目成功上線,也贏得了客戶的贊賞。
在這家公司實(shí)習(xí)期間,公司成功的進(jìn)行了兩輪融資,金額過(guò)億。我獲得了一次季度優(yōu)秀員工以及一次優(yōu)秀員工提名,可以說(shuō)為公司做出了一些貢獻(xiàn)。
后來(lái)又面試了滴滴、百度以及頭條的核心算法部門(mén),都通過(guò)了面試,最終去了頭條的人工智能實(shí)驗(yàn)室實(shí)習(xí)。
選擇頭條的原因是頭條的發(fā)展前景很好,年輕人也很多,在一起工作很開(kāi)心。再后來(lái),又去了微信。也許有的人會(huì)疑惑,為什么要跳來(lái)跳去呢,待在一家不好嗎?
這可能和每個(gè)人的選擇有關(guān),在職場(chǎng)里,需要注意的一條是不要頻繁跳槽,不然會(huì)給面試官留下不好的印象。但這條金科玉律有個(gè)小前提,是對(duì)正式工作的人而言的。
實(shí)習(xí)一般四五個(gè)月就已經(jīng)算不短的時(shí)間了。還有著一個(gè)隱形福利,社會(huì)對(duì)學(xué)生很包容,使得我們有機(jī)會(huì)在短時(shí)間內(nèi)快速體驗(yàn)不同量級(jí)、不同理念公司之間的文化碰撞。
我可以在兩年之內(nèi)快速體驗(yàn)到創(chuàng)業(yè)公司的快速崛起,小巨頭的工作熱情,還有大巨頭的核心部門(mén)的閃光時(shí)刻。全職工作的人有這樣的機(jī)會(huì)嗎?
當(dāng)然不太可能了,除非愿意給自己打上一個(gè)頻繁跳槽、不靠譜的標(biāo)簽。當(dāng)有這樣的機(jī)會(huì)時(shí),要好好把握,多了解未來(lái)要去打拼的世界,不至于畢業(yè)找工作吃虧入坑。
就這樣,陸陸續(xù)續(xù)輾轉(zhuǎn)幾個(gè)公司,認(rèn)識(shí)了很多技術(shù)大牛,有一些長(zhǎng)進(jìn),更多的是感到自身的不足,不論是技術(shù)層面,還是認(rèn)知層面的。最重要的一條認(rèn)知是,厲害的人永遠(yuǎn)非常多,不要和目前實(shí)力遠(yuǎn)超自己的對(duì)手比較,那樣除了能夠打擊自己,沒(méi)有其他用處。
3 爬坡
實(shí)習(xí)了大半年之后,對(duì)理論知識(shí)和實(shí)踐應(yīng)用有了一定的掌握之后,通過(guò)同學(xué)了解到國(guó)內(nèi)外的數(shù)據(jù)科學(xué)競(jìng)賽正在興起,查看一些比賽平臺(tái)之后,發(fā)現(xiàn)有一些任務(wù)在工作中遇到過(guò),就抱著在實(shí)踐中學(xué)習(xí)交流的心態(tài),參與其中,對(duì)于比賽的結(jié)果,既沒(méi)有底,也沒(méi)有期待。
很慶幸自己做出這個(gè)嘗試,因?yàn)樵谡嬲膮⑴c比賽之后,每一次提交結(jié)果之后,看到排行榜上的名詞變動(dòng),是非常緊張刺激的事情,很容易激發(fā)競(jìng)爭(zhēng)意識(shí),于是更為精細(xì)的處理分析數(shù)據(jù),對(duì)采用的算法模型進(jìn)行修改,使其更適應(yīng)于當(dāng)前任務(wù)。
我參加比賽的時(shí)間跨度其實(shí)并不長(zhǎng),前后一年的時(shí)間,最開(kāi)始參加的是中國(guó)計(jì)算機(jī)協(xié)會(huì)聯(lián)合 BDCI 舉辦的 CCF-BDCI2017 系列比賽,在其中的一個(gè)賽道上,很幸運(yùn)的取得了第三名,這對(duì)初次參賽是來(lái)說(shuō),還是挺不錯(cuò)的,我們隊(duì)伍拿到了一萬(wàn)元的獎(jiǎng)金。
第二個(gè)比賽,是參加了京東舉辦的對(duì)話比賽,這次我承擔(dān)了隊(duì)長(zhǎng)的角色,邀請(qǐng)了一批小伙伴,一起攻克難關(guān)。我記得中秋節(jié)三天,還在辦公室優(yōu)化模型,提交結(jié)果,一刻都沒(méi)有休息。最終取得了亞軍的成績(jī),與第一名失之交臂,亞軍的獎(jiǎng)金是十萬(wàn)元。
第三個(gè)比賽,參加了 AI Challenger 比賽,也是選擇文本 NLP 相關(guān)的賽道,同樣的很是拼命,中間通宵了兩個(gè)夜晚,很幸運(yùn),最后拿到了第一名的成績(jī),獎(jiǎng)金是四十萬(wàn)。
那一年之后,由于寫(xiě)論文、找工作各種瑣事,基本沒(méi)有參與任何比賽了。當(dāng)短暫的一年數(shù)據(jù)競(jìng)賽生涯,極大的鍛煉了我的編程能力,主要體現(xiàn)在,正對(duì)特定目標(biāo)快速實(shí)現(xiàn)和迭代優(yōu)化。
現(xiàn)在國(guó)內(nèi)外的數(shù)據(jù)競(jìng)賽平臺(tái)還是有很多,很多國(guó)內(nèi)巨頭每年都會(huì)舉辦規(guī)模浩大、獎(jiǎng)金豐厚的賽事,這里給出一些常見(jiàn)的賽事和平臺(tái):
1、最推薦的兩個(gè)主流平臺(tái)
Kaggle:https://www.kaggle.com
天池:https://tianchi.aliyun.com/home
2、國(guó)內(nèi)其他主要平臺(tái)
DataCastle:http://www.pkbigdata.com
Datafountain:https://www.datafountain.cn
Biendata:https://www.biendata.com
Kesci:https://www.kesci.com
FlyAI:https://www.flyai.com
除了這些平臺(tái),每年可能還會(huì)新冒出來(lái)一些平臺(tái),競(jìng)爭(zhēng)力比較小,這就需要大家自己多留意各路消息了。
當(dāng)然,除了編程能力的提升,還認(rèn)識(shí)了很多朋友,因?yàn)椴簧倩ヂ?lián)網(wǎng)員工也來(lái)參加比賽,基本年齡比我大幾歲,所以認(rèn)識(shí)了一些前輩,后來(lái)成為了常約飯的好朋友,天南海北,基本涵蓋了互聯(lián)網(wǎng)的大小公司,對(duì)于增長(zhǎng)見(jiàn)識(shí)非常有用。
4 近況
看到這里,你會(huì)覺(jué)得,我已經(jīng)精通編程了,各種任務(wù)游刃有余了。其實(shí),說(shuō)實(shí)話,編程硬實(shí)力,雖然不能說(shuō)菜,但還是普通。
有心人會(huì)留意到,無(wú)論實(shí)習(xí)還是比賽,我的技術(shù)棧是圍繞著算法來(lái)走的,導(dǎo)致我的純開(kāi)發(fā)技能欠缺不少。這著實(shí)很讓我頭疼,尤其是我今年畢業(yè)入職之后。
正式工作了,雖然是算法工程師,但也會(huì)經(jīng)常接到開(kāi)發(fā)量不小的活,剛開(kāi)始我很不適應(yīng),因?yàn)橹白鏊惴ㄖ饕?span id="s0sssss00s" class="s2"> Python 技能棧點(diǎn)的比較多,對(duì) Java 和 后端開(kāi)發(fā)框架用的比較少,任務(wù)需要就直接切換過(guò)來(lái)了。
然后,之前做算法開(kāi)發(fā),更多的是追求指標(biāo)的效果,在比賽中尤其是如此,但到了公司,開(kāi)始考慮到性能開(kāi)銷(xiāo)、投入產(chǎn)出比等各種因素,復(fù)雜度上升不少。
有一段時(shí)間,活非常趕,我又是新手,導(dǎo)致任務(wù)的進(jìn)度卡在我這里,壓力是非常大的,朋友吃飯時(shí)見(jiàn)到我,都會(huì)察覺(jué)我臉色的異樣,會(huì)關(guān)切的問(wèn)我發(fā)生了什么事。
沒(méi)到這個(gè)時(shí)候,我還是會(huì)想,如果寫(xiě)程序讓自己這么痛苦的話,我為什么要一條路走到黑?產(chǎn)品經(jīng)理或者其他的崗位也許對(duì)我來(lái)說(shuō)更為合適呢,畢竟我是一個(gè)善于總結(jié)和溝通的人。
后來(lái),逐漸熬過(guò)來(lái)了,我之所以沒(méi)有轉(zhuǎn)行,一方面是遇到的問(wèn)題還沒(méi)到無(wú)法解決的地步;另外一方面,再和一切其他崗位的前輩交流過(guò),才發(fā)現(xiàn)每一行都有相應(yīng)的痛處。譬如說(shuō),產(chǎn)品經(jīng)理經(jīng)常會(huì)為項(xiàng)目各方面的進(jìn)度折騰的焦頭爛額,畢竟寫(xiě)代碼的是程序員。這一點(diǎn)來(lái)說(shuō),作為程序員更好把控一些。
就這樣,打算在程序員的道路上繼續(xù)走下去,那相應(yīng)的技術(shù)書(shū)籍,就得花功夫啃起來(lái)。于是買(mǎi)了很多書(shū),早飯或者午飯后的半小時(shí),就會(huì)拎起技術(shù)書(shū)來(lái)翻翻,別小看這一個(gè)小時(shí),我已經(jīng)利用這時(shí)間翻完了之前很抗拒的基本大塊頭,雖說(shuō)做不到細(xì)嚼慢咽,但對(duì)于查漏補(bǔ)缺、在腦海中建立完整的知識(shí)體系很有幫助。
人往往高估自己短期的成長(zhǎng),而低估長(zhǎng)期的變化?,F(xiàn)在遇到一些暫時(shí)無(wú)法解決的困難,心理還是會(huì)覺(jué)得有些難過(guò)甚至絕望,對(duì)自己很容易產(chǎn)生自我懷疑。但轉(zhuǎn)念一想,比起數(shù)年前剛上大學(xué)時(shí),那個(gè)連電腦開(kāi)機(jī)鍵都不知道的懵懂男孩,我掌握的專(zhuān)業(yè)技能知識(shí),何止是翻番。
難過(guò)的時(shí)候,積極一點(diǎn)看問(wèn)題,往前看,找出自己這幾年的進(jìn)步;往后看,期待此后數(shù)年的成長(zhǎng)。這樣一想,日子或許活好過(guò)不少。
回到最開(kāi)始的問(wèn)題,我的編程能力從什么時(shí)候開(kāi)始突飛猛進(jìn)?
答:沒(méi)有任何時(shí)候一下子,就突飛猛進(jìn)了,而是一次次的挫敗、失望甚至打算放棄之后,無(wú)論是為生活所迫,還是不甘心,繼續(xù)堅(jiān)持下來(lái)了,開(kāi)始新的學(xué)習(xí)和嘗試,都會(huì)有一點(diǎn)點(diǎn)的進(jìn)步。這個(gè)世界有一個(gè)很美妙的東西叫復(fù)利,它不是金融的專(zhuān)有詞,學(xué)習(xí)的復(fù)利,更值得被我們這些普通人擁有。
以上,與君共勉,不限于編程,在學(xué)習(xí)的道路上,我們從未突飛猛進(jìn),我們正在突飛猛進(jìn),只要我們一直在前進(jìn),這兩者就不會(huì)矛盾。