結(jié)束了為期三個(gè)多月的秋招,決定在學(xué)生生涯的最后階段對(duì)自己的技術(shù)棧做一個(gè)整理,第一篇首先從碩士三年的學(xué)習(xí)規(guī)劃談起吧。
先做一個(gè)簡(jiǎn)單的自我介紹,博主本人就讀于上海某高校計(jì)算機(jī)專業(yè),科班出身。熱愛(ài)存儲(chǔ)與虛擬化技術(shù),在相關(guān)領(lǐng)域有一定的技術(shù)積累,包括數(shù)據(jù)庫(kù)、rocksdb存儲(chǔ)引擎、文件系統(tǒng)、NVMe driver、虛擬化以及kernel by pass技術(shù)。在秋招中有幸獲得阿里、騰訊、百度、Intel、網(wǎng)易互娛、金山云等公司的offer。在此希望能夠?yàn)槲磥?lái)的同學(xué)介紹一些碩士期間的學(xué)習(xí)路線,希望大家能夠有效利用三年的學(xué)習(xí)時(shí)間,積累自己的技術(shù)棧。
1. 確立目標(biāo)
大家剛?cè)雽W(xué),首先要對(duì)自己未來(lái)三年后的規(guī)劃有明確的目標(biāo)。對(duì)于一般人來(lái)說(shuō)(大神除外),無(wú)非主要關(guān)注兩種選擇,一是未來(lái)能夠加入到喜歡的公司繼續(xù)搬磚做工程技術(shù)(工程型),另外一種是希望能夠做research,參與最前沿的科研項(xiàng)目,將來(lái)能夠?qū)⒆约旱膶W(xué)術(shù)成果發(fā)表在頂會(huì)上(學(xué)術(shù)型)。只要大家能夠確定自己的目標(biāo),制定相應(yīng)的學(xué)習(xí)計(jì)劃,堅(jiān)持下去,就一定會(huì)有收獲。當(dāng)然,在自己剛?cè)雽W(xué)還在迷茫時(shí)候,可以試著嘗試先選定一個(gè)努力的目標(biāo),只有試了才知道自己適不適合。博主本人屬于工程學(xué)術(shù)兼?zhèn)湫?,具體的學(xué)習(xí)規(guī)劃后面將詳細(xì)介紹。
2. 制定規(guī)劃
在這不具體介紹每個(gè)專業(yè)的學(xué)習(xí)規(guī)劃是什么,因?yàn)橛?jì)算機(jī)方向?qū)嵲谔嗔耍瑢?duì)于每一個(gè)方向都要涉及到特別多的技術(shù)積累,在這是講不清的,況且博主對(duì)其它方向也不是特別熟悉。在這里主要告訴大家,該如何摸索自己的學(xué)習(xí)規(guī)劃,坦白的說(shuō),就是在這個(gè)方向上我如何學(xué)哪些東西,才能在將來(lái)秋招大隊(duì)中顯示出自己獨(dú)特的地方。在此以博主自己的“存儲(chǔ)”方向?yàn)槔?,?lái)說(shuō)明如何摸索。
基礎(chǔ)知識(shí)
基礎(chǔ)知識(shí)相當(dāng)重要,主要是計(jì)算機(jī)相關(guān)的必修課,如語(yǔ)言相關(guān)、數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)、數(shù)據(jù)結(jié)構(gòu)、計(jì)算機(jī)網(wǎng)絡(luò)等?;旧蠈?duì)于所有的計(jì)算機(jī)方向來(lái)說(shuō),都離不開(kāi)上述基礎(chǔ)知識(shí)。雖然說(shuō)把這些學(xué)好,貌似還做不了什么成就出來(lái),但沒(méi)有這些基礎(chǔ)知識(shí)是萬(wàn)萬(wàn)不能的。然而,大多數(shù)同學(xué)對(duì)基礎(chǔ)知識(shí)還有很大的誤區(qū),認(rèn)為所從事的工作就是以語(yǔ)言劃分為主的,本科加碩士七年時(shí)間,只要熟練掌握一門語(yǔ)言,例如Java,未來(lái)就能勝任一份工作,這是遠(yuǎn)遠(yuǎn)不夠的。編程語(yǔ)言是計(jì)算機(jī)學(xué)科中最重要的一項(xiàng)基礎(chǔ)知識(shí),也是做其它事情的先前條件。就好像剛出生的小孩子一樣,學(xué)會(huì)了走路說(shuō)話,似乎還不能自己獨(dú)立做一些事情,然而如果連說(shuō)話走路都還沒(méi)有達(dá)到的話,還說(shuō)明還是需要很多的時(shí)間來(lái)成長(zhǎng)的。其實(shí)編程語(yǔ)言是大二就應(yīng)該熟練掌握的知識(shí),而且至少需要會(huì)三種不同的編程語(yǔ)言。個(gè)人認(rèn)為,語(yǔ)言只是基礎(chǔ),必須熟練掌握,沒(méi)有哪個(gè)語(yǔ)言好,哪個(gè)語(yǔ)言不好。各類編程語(yǔ)言(C/C++、Java、Python、Shell、Golang等)都是相通的,不存在會(huì)不會(huì)的問(wèn)題,團(tuán)隊(duì)需要什么,老板需要什么,大家就用什么,即使不熟悉的,看個(gè)兩三天基本就應(yīng)該可以上手工作了。
以存儲(chǔ)方向?yàn)槔@是我遇到的各種編程語(yǔ)言的使用場(chǎng)景:
C:底層基本都是用C寫的(例如文件系統(tǒng)、driver),C是我個(gè)人使用最多的語(yǔ)言。
C++:由于喜歡鉆研數(shù)據(jù)庫(kù)的源碼,因此如果要自己動(dòng)手修改MySQL內(nèi)核、Rocksdb引擎等,都必須掌握C++。否則源碼看不懂,自己改內(nèi)核也無(wú)從下手。
Python:因?yàn)樵谡撐闹?,博主?jīng)常會(huì)遇到一些算法方面的研究,因此在模擬各類不同的算法時(shí),經(jīng)常會(huì)選用Python最為測(cè)試語(yǔ)言。
Shell:由于經(jīng)常操作Linux,對(duì)于一些經(jīng)常使用的集成測(cè)試,都會(huì)手寫shell腳本來(lái)完成。并且針對(duì)一些有規(guī)律的重復(fù)性操作,自己經(jīng)常會(huì)寫一些shell腳本來(lái)控制,大大提高了自己的工作效率。
Golang:由于在深圳某T公司實(shí)習(xí)的時(shí)候,項(xiàng)目需要優(yōu)化Kafka的客戶端,因此使用golang進(jìn)行重構(gòu),雖然之前沒(méi)接觸過(guò)golang,但看了一天教程,基本第二天就直接開(kāi)始用golang來(lái)coding了。
此外還有數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)等,此處不再多敘述,如果在基礎(chǔ)知識(shí)方面還很欠缺的話,建議多花額外的時(shí)間補(bǔ)習(xí)。
必備工具
熟練掌握各類工具真的是事倍功半。最早的時(shí)候沒(méi)有在這方面投入很多精力,導(dǎo)致失去了很多東西。因此建議大家在自己方向上的必備工具一定要花時(shí)間去學(xué)習(xí),這是未來(lái)在效率上和別人競(jìng)爭(zhēng)的神器。下面還是以我的專業(yè)"存儲(chǔ)"方向?yàn)槔?,?lái)說(shuō)明工具的重要性。
在做存儲(chǔ)相關(guān)的技術(shù)時(shí),經(jīng)常會(huì)遇到行一些奇葩的bug,例如I/O hang,segmentation fault等。此外,存儲(chǔ)方面大部分的主要關(guān)注點(diǎn)是性能的提升,因此不同的類型的性能評(píng)估測(cè)試也是必備項(xiàng)。此外,對(duì)于經(jīng)常寫代碼的同學(xué)來(lái)說(shuō),好的編輯器,例如vim,各種調(diào)試、測(cè)試工具都是必不可少的。
- fio: 大名鼎鼎的fio,用來(lái)直接評(píng)估裸盤以及文件系統(tǒng)的I/O性能。
- perf:可以用來(lái)生成火焰圖分析程序中的熱點(diǎn)函數(shù)以及CPU使用率等,直觀的分析出程序中的瓶頸以及問(wèn)題所在。
- cgroup:在做性能評(píng)估的時(shí)候,經(jīng)常會(huì)遇到為了達(dá)到真實(shí)的使用場(chǎng)景,用于一些資源限制,系統(tǒng)資源分配管理的工具。
- gdb:Linux下編程,尤其是系統(tǒng)軟件,都離不開(kāi)gdb的調(diào)試。尤其經(jīng)常遇到segmentation fault的時(shí)候。熟練的使用gdb決定了debug的速度。
- valgrind:程序檢測(cè)工具,就算再嚴(yán)謹(jǐn)?shù)娜?,難免會(huì)遇到一些疏忽的意向不到的錯(cuò)誤,例如memory leak。因此,熟練使用這類工具能夠保證代碼的質(zhì)量,提前解決一些意想不到的bug。
- vim:vim真的是特別強(qiáng)大的編輯器,尤其是在Linux環(huán)境下工作的同學(xué),vim的常用配置方法以及各種快捷鍵都是必須要熟練掌握的技術(shù)。
此處不再一一介紹,主要是向大家說(shuō)明工具的重要性。
提升階段
在有了牢固的基礎(chǔ)知識(shí)以及熟練掌握各類神器工具之后,后面需要開(kāi)始進(jìn)階學(xué)習(xí),并不斷的動(dòng)手提升自己。
首先是基本的進(jìn)階,就是一些常見(jiàn)的算法與編程。建議可以通過(guò)在各類編程平臺(tái)上動(dòng)手練習(xí)(例如leetcode),一是鍛煉自己的算法思維以及語(yǔ)言的熟練度;其次是學(xué)習(xí)其它大神的寫代碼規(guī)范。如果能夠堅(jiān)持一到兩年,每天至少一道題的話,會(huì)有很大的提高,這個(gè)過(guò)程是量變到質(zhì)變的過(guò)程。
其次是閱讀學(xué)習(xí)一些優(yōu)秀項(xiàng)目的源碼,如果能夠?qū)⒁粋€(gè)項(xiàng)目理解到一行行代碼程序的話,才是真正的學(xué)習(xí)到其精華,并且能夠加深對(duì)其的認(rèn)識(shí)。例如,我們都學(xué)過(guò)操作系統(tǒng),知道操作系統(tǒng)基本的線程管理、內(nèi)存管理、I/O系統(tǒng)等。但都是理解在文字概念的層面,如果能夠深入內(nèi)核源碼,去細(xì)細(xì)品味每一個(gè)子模塊,每一個(gè)數(shù)據(jù)結(jié)構(gòu)的話,對(duì)個(gè)人的技術(shù)來(lái)說(shuō)是很大的提升。例如,在博主大四的時(shí)候,便開(kāi)始閱讀Linux內(nèi)核文件系統(tǒng)與內(nèi)存管理相關(guān)的源碼。當(dāng)然,當(dāng)你第一次看這么龐大的項(xiàng)目的時(shí)候,一定是一臉懵逼,不知所云。所有人都會(huì)經(jīng)歷從不會(huì)到會(huì)再到精通的過(guò)程,沒(méi)有人第一次看就能直接看懂的。我們要做的是,堅(jiān)持不懈。在別人看電視劇的時(shí)候,我們?cè)诳丛创a,在別人玩游戲的時(shí)候,我們還在看源碼,在別人逛淘寶的時(shí)候,我們還在看源碼。所以當(dāng)別人在最后抱怨太難放棄的時(shí)候,你基本已經(jīng)上道了。
博主在碩士期間精讀過(guò)多個(gè)優(yōu)秀項(xiàng)目的源碼,ext4、blobstore、Redis、Rocksdb、SPDK、DPDK等。
進(jìn)階學(xué)習(xí)
要想在相關(guān)領(lǐng)域內(nèi)學(xué)習(xí)到最前沿的技術(shù),個(gè)人認(rèn)為有兩個(gè)最佳的渠道。一是各類開(kāi)源社區(qū),二是各類計(jì)算機(jī)頂會(huì)的論文。
首先從開(kāi)源社區(qū)談起,隨著我國(guó)互聯(lián)網(wǎng)的發(fā)展,越來(lái)越多的大公司開(kāi)始倡導(dǎo)去IOE,因此隨之而來(lái)的是各種開(kāi)源項(xiàng)目的不斷崛起。而且越來(lái)越多的企業(yè)開(kāi)始使用開(kāi)源軟件作為底層服務(wù)軟件,并且為了更夠更加匹配公司的實(shí)際業(yè)務(wù)環(huán)境,越來(lái)越多優(yōu)秀的開(kāi)發(fā)者加入到開(kāi)源社區(qū)當(dāng)中來(lái)。因此,為了學(xué)習(xí)到這些新技術(shù)的發(fā)展方向,要時(shí)長(zhǎng)關(guān)注各類社區(qū)的動(dòng)向,最好能參入其中。首先,若想了解到更多的未來(lái)發(fā)展方向,可以訂閱社區(qū)的mailing list,看社區(qū)中的大牛經(jīng)常會(huì)提出什么討論,新的patch等。其次,再不斷的學(xué)習(xí)相關(guān)源碼的時(shí)候,試著做一些優(yōu)化,可以向社區(qū)提patch,來(lái)參與其中。對(duì)于大家來(lái)說(shuō),這個(gè)剛開(kāi)始不容易上手,可以選擇先從文檔和注釋做起,比如有一些文檔寫的不夠全面、不夠規(guī)范,或者有一些必要的地方缺少注釋說(shuō)明,這些都可以作為一個(gè)貢獻(xiàn)去向社區(qū)提request。在逐漸的更加熟悉后,可以經(jīng)常關(guān)注該項(xiàng)目的github issues,看是否有一些bug需要解決,可以嘗試幫著社區(qū)解bug,其次也可以針對(duì)一些該項(xiàng)目缺少的功能,自己進(jìn)行開(kāi)發(fā),向社區(qū)做貢獻(xiàn)。這是一個(gè)很好的學(xué)習(xí)路徑。
其次是各類計(jì)算機(jī)頂會(huì)。各大公司和名校的最新research都會(huì)發(fā)表在一些好的計(jì)算機(jī)會(huì)議上。要經(jīng)常關(guān)注每年的會(huì)議,精讀自己感興趣領(lǐng)域的最新研究。例如,博主是學(xué)存儲(chǔ)方向的,因此經(jīng)常會(huì)關(guān)注一些系統(tǒng)和數(shù)據(jù)庫(kù)方面的會(huì)議,例如FAST、OSDI、VLDB、USENIX ATC等。例如,經(jīng)常閱讀這些頂會(huì)的論文,你將會(huì)發(fā)現(xiàn),如今LSM Tree、用戶態(tài)軟件棧、Open Channel SSD、RDMA、NVDIMM等,都是目前近幾年無(wú)論在企業(yè)界還是學(xué)術(shù)界都特別關(guān)心的技術(shù)。通過(guò)閱讀學(xué)習(xí)這些優(yōu)秀的論文,一是能夠?qū)W習(xí)到其中精妙的系統(tǒng)設(shè)計(jì),二是能夠?qū)W習(xí)到很多表達(dá)的技巧(包括presentation、做PPT、畫各類圖等),這些積累都是特別重要的財(cái)富。
其次,無(wú)論是參與到開(kāi)源社區(qū)中,還是精讀論文,都需要有一個(gè)良好的英語(yǔ)基礎(chǔ)。無(wú)論是閱讀、寫作、還是聽(tīng)力和口語(yǔ)都是必須的。因此,每天留出額外的時(shí)間去學(xué)習(xí)英語(yǔ)是必不可少的。博主本人在這方面就有些缺失,因此目前仍在不斷努力加強(qiáng)中。
4. 核心競(jìng)爭(zhēng)力
確立了目標(biāo)與學(xué)習(xí)計(jì)劃是遠(yuǎn)遠(yuǎn)不夠的,態(tài)度決定一切。最主要的還是腳踏實(shí)地,一步步地去學(xué)習(xí)。當(dāng)然,學(xué)習(xí)的過(guò)程中難免會(huì)遇到很多困難,最主要的還是堅(jiān)持不懈,勇敢的去戰(zhàn)勝困難。要向優(yōu)秀的人看齊,不要被外界的東西所打擾。例如,書還沒(méi)看兩頁(yè),就去打游戲了。剛配了一個(gè)環(huán)境,遇到點(diǎn)困難就放棄了,轉(zhuǎn)身去看電視劇了。這樣是萬(wàn)萬(wàn)不能的。
要有堅(jiān)定和果斷的意志。以博主本人碩士期間的生活舉例,通常周中晚上都是12點(diǎn)、1點(diǎn)睡覺(jué),早上一般都是7點(diǎn)吃過(guò)早飯就坐在實(shí)驗(yàn)室了。中途從不玩手機(jī)、不打游戲、不看劇、不逛淘寶的。但是周末喜歡出去瘋玩兩天,周末除了特殊情況需要加班加點(diǎn)趕論文外,一般情況周末是不去實(shí)驗(yàn)室的。因此,可以做到勞逸結(jié)合。但個(gè)人非常喜歡技術(shù),曾經(jīng),修改一個(gè)開(kāi)源項(xiàng)目,自己琢磨到半夜,在遇到問(wèn)題真的很難過(guò),但在自己的堅(jiān)持下,當(dāng)新的功能可以完全跑起來(lái)的時(shí)候,半夜回去躺下都激動(dòng)不已,難以入眠。