結束了為期三個多月的秋招,決定在學生生涯的最后階段對自己的技術棧做一個整理,第一篇首先從碩士三年的學習規(guī)劃談起吧秋茫。
先做一個簡單的自我介紹,博主本人就讀于上海某高校計算機專業(yè)乃秀,科班出身肛著。熱愛存儲與虛擬化技術,在相關領域有一定的技術積累跺讯,包括數(shù)據(jù)庫枢贿、rocksdb存儲引擎、文件系統(tǒng)刀脏、NVMe driver局荚、虛擬化以及kernel by pass技術。在秋招中有幸獲得阿里愈污、騰訊耀态、百度、Intel暂雹、網(wǎng)易互娛首装、金山云等公司的offer。在此希望能夠為未來的同學介紹一些碩士期間的學習路線杭跪,希望大家能夠有效利用三年的學習時間仙逻,積累自己的技術棧驰吓。
1. 確立目標
大家剛入學,首先要對自己未來三年后的規(guī)劃有明確的目標系奉。對于一般人來說(大神除外)棚瘟,無非主要關注兩種選擇,一是未來能夠加入到喜歡的公司繼續(xù)搬磚做工程技術(工程型)喜最,另外一種是希望能夠做research,參與最前沿的科研項目庄蹋,將來能夠?qū)⒆约旱膶W術成果發(fā)表在頂會上(學術型)瞬内。只要大家能夠確定自己的目標,制定相應的學習計劃限书,堅持下去虫蝶,就一定會有收獲。當然倦西,在自己剛入學還在迷茫時候能真,可以試著嘗試先選定一個努力的目標,只有試了才知道自己適不適合扰柠。博主本人屬于工程學術兼?zhèn)湫头垲恚唧w的學習規(guī)劃后面將詳細介紹。
2. 制定規(guī)劃
在這不具體介紹每個專業(yè)的學習規(guī)劃是什么卤档,因為計算機方向?qū)嵲谔嗔蓑茫瑢τ诿恳粋€方向都要涉及到特別多的技術積累,在這是講不清的劝枣,況且博主對其它方向也不是特別熟悉汤踏。在這里主要告訴大家,該如何摸索自己的學習規(guī)劃舔腾,坦白的說溪胶,就是在這個方向上我如何學哪些東西,才能在將來秋招大隊中顯示出自己獨特的地方稳诚。在此以博主自己的“存儲”方向為例哗脖,來說明如何摸索。
基礎知識
基礎知識相當重要扳还,主要是計算機相關的必修課懒熙,如語言相關、數(shù)據(jù)結構普办、操作系統(tǒng)工扎、數(shù)據(jù)結構、計算機網(wǎng)絡等衔蹲≈铮基本上對于所有的計算機方向來說呈础,都離不開上述基礎知識。雖然說把這些學好橱健,貌似還做不了什么成就出來而钞,但沒有這些基礎知識是萬萬不能的。然而拘荡,大多數(shù)同學對基礎知識還有很大的誤區(qū)臼节,認為所從事的工作就是以語言劃分為主的,本科加碩士七年時間珊皿,只要熟練掌握一門語言网缝,例如Java,未來就能勝任一份工作蟋定,這是遠遠不夠的粉臊。編程語言是計算機學科中最重要的一項基礎知識,也是做其它事情的先前條件驶兜。就好像剛出生的小孩子一樣扼仲,學會了走路說話,似乎還不能自己獨立做一些事情抄淑,然而如果連說話走路都還沒有達到的話屠凶,還說明還是需要很多的時間來成長的。其實編程語言是大二就應該熟練掌握的知識肆资,而且至少需要會三種不同的編程語言阅畴。個人認為,語言只是基礎迅耘,必須熟練掌握贱枣,沒有哪個語言好,哪個語言不好颤专。各類編程語言(C/C++纽哥、Java、Python栖秕、Shell春塌、Golang等)都是相通的,不存在會不會的問題簇捍,團隊需要什么只壳,老板需要什么,大家就用什么暑塑,即使不熟悉的吼句,看個兩三天基本就應該可以上手工作了。
以存儲方向為例事格,這是我遇到的各種編程語言的使用場景:
C:底層基本都是用C寫的(例如文件系統(tǒng)惕艳、driver)搞隐,C是我個人使用最多的語言。
C++:由于喜歡鉆研數(shù)據(jù)庫的源碼远搪,因此如果要自己動手修改MySQL內(nèi)核劣纲、Rocksdb引擎等,都必須掌握C++谁鳍。否則源碼看不懂癞季,自己改內(nèi)核也無從下手。
Python:因為在論文中倘潜,博主經(jīng)常會遇到一些算法方面的研究绷柒,因此在模擬各類不同的算法時,經(jīng)常會選用Python最為測試語言窍荧。
Shell:由于經(jīng)常操作Linux,對于一些經(jīng)常使用的集成測試恨憎,都會手寫shell腳本來完成蕊退。并且針對一些有規(guī)律的重復性操作,自己經(jīng)常會寫一些shell腳本來控制憔恳,大大提高了自己的工作效率瓤荔。
Golang:由于在深圳某T公司實習的時候,項目需要優(yōu)化Kafka的客戶端钥组,因此使用golang進行重構输硝,雖然之前沒接觸過golang,但看了一天教程程梦,基本第二天就直接開始用golang來coding了点把。
此外還有數(shù)據(jù)結構、操作系統(tǒng)等屿附,此處不再多敘述郎逃,如果在基礎知識方面還很欠缺的話,建議多花額外的時間補習挺份。
必備工具
熟練掌握各類工具真的是事倍功半褒翰。最早的時候沒有在這方面投入很多精力,導致失去了很多東西匀泊。因此建議大家在自己方向上的必備工具一定要花時間去學習优训,這是未來在效率上和別人競爭的神器。下面還是以我的專業(yè)"存儲"方向為例各聘,來說明工具的重要性揣非。
在做存儲相關的技術時,經(jīng)常會遇到行一些奇葩的bug躲因,例如I/O hang妆兑,segmentation fault等魂拦。此外,存儲方面大部分的主要關注點是性能的提升搁嗓,因此不同的類型的性能評估測試也是必備項芯勘。此外,對于經(jīng)常寫代碼的同學來說腺逛,好的編輯器荷愕,例如vim,各種調(diào)試棍矛、測試工具都是必不可少的安疗。
- fio: 大名鼎鼎的fio,用來直接評估裸盤以及文件系統(tǒng)的I/O性能够委。
- perf:可以用來生成火焰圖分析程序中的熱點函數(shù)以及CPU使用率等荐类,直觀的分析出程序中的瓶頸以及問題所在。
- cgroup:在做性能評估的時候茁帽,經(jīng)常會遇到為了達到真實的使用場景玉罐,用于一些資源限制,系統(tǒng)資源分配管理的工具潘拨。
- gdb:Linux下編程吊输,尤其是系統(tǒng)軟件,都離不開gdb的調(diào)試铁追。尤其經(jīng)常遇到segmentation fault的時候季蚂。熟練的使用gdb決定了debug的速度。
- valgrind:程序檢測工具琅束,就算再嚴謹?shù)娜伺てǎy免會遇到一些疏忽的意向不到的錯誤,例如memory leak涩禀。因此疯搅,熟練使用這類工具能夠保證代碼的質(zhì)量,提前解決一些意想不到的bug埋泵。
- vim:vim真的是特別強大的編輯器幔欧,尤其是在Linux環(huán)境下工作的同學,vim的常用配置方法以及各種快捷鍵都是必須要熟練掌握的技術丽声。
此處不再一一介紹礁蔗,主要是向大家說明工具的重要性。
提升階段
在有了牢固的基礎知識以及熟練掌握各類神器工具之后雁社,后面需要開始進階學習浴井,并不斷的動手提升自己。
首先是基本的進階霉撵,就是一些常見的算法與編程磺浙。建議可以通過在各類編程平臺上動手練習(例如leetcode)洪囤,一是鍛煉自己的算法思維以及語言的熟練度;其次是學習其它大神的寫代碼規(guī)范撕氧。如果能夠堅持一到兩年瘤缩,每天至少一道題的話,會有很大的提高伦泥,這個過程是量變到質(zhì)變的過程剥啤。
其次是閱讀學習一些優(yōu)秀項目的源碼,如果能夠?qū)⒁粋€項目理解到一行行代碼程序的話不脯,才是真正的學習到其精華府怯,并且能夠加深對其的認識。例如防楷,我們都學過操作系統(tǒng)牺丙,知道操作系統(tǒng)基本的線程管理、內(nèi)存管理复局、I/O系統(tǒng)等冲簿。但都是理解在文字概念的層面,如果能夠深入內(nèi)核源碼肖揣,去細細品味每一個子模塊民假,每一個數(shù)據(jù)結構的話浮入,對個人的技術來說是很大的提升龙优。例如,在博主大四的時候事秀,便開始閱讀Linux內(nèi)核文件系統(tǒng)與內(nèi)存管理相關的源碼彤断。當然,當你第一次看這么龐大的項目的時候易迹,一定是一臉懵逼宰衙,不知所云。所有人都會經(jīng)歷從不會到會再到精通的過程睹欲,沒有人第一次看就能直接看懂的供炼。我們要做的是,堅持不懈窘疮。在別人看電視劇的時候袋哼,我們在看源碼,在別人玩游戲的時候闸衫,我們還在看源碼涛贯,在別人逛淘寶的時候,我們還在看源碼蔚出。所以當別人在最后抱怨太難放棄的時候弟翘,你基本已經(jīng)上道了虫腋。
博主在碩士期間精讀過多個優(yōu)秀項目的源碼,ext4稀余、blobstore悦冀、Redis、Rocksdb滚躯、SPDK雏门、DPDK等。
進階學習
要想在相關領域內(nèi)學習到最前沿的技術掸掏,個人認為有兩個最佳的渠道茁影。一是各類開源社區(qū),二是各類計算機頂會的論文丧凤。
首先從開源社區(qū)談起募闲,隨著我國互聯(lián)網(wǎng)的發(fā)展,越來越多的大公司開始倡導去IOE愿待,因此隨之而來的是各種開源項目的不斷崛起浩螺。而且越來越多的企業(yè)開始使用開源軟件作為底層服務軟件,并且為了更夠更加匹配公司的實際業(yè)務環(huán)境仍侥,越來越多優(yōu)秀的開發(fā)者加入到開源社區(qū)當中來要出。因此,為了學習到這些新技術的發(fā)展方向农渊,要時長關注各類社區(qū)的動向患蹂,最好能參入其中。首先砸紊,若想了解到更多的未來發(fā)展方向传于,可以訂閱社區(qū)的mailing list,看社區(qū)中的大牛經(jīng)常會提出什么討論醉顽,新的patch等沼溜。其次,再不斷的學習相關源碼的時候游添,試著做一些優(yōu)化系草,可以向社區(qū)提patch,來參與其中唆涝。對于大家來說找都,這個剛開始不容易上手,可以選擇先從文檔和注釋做起石抡,比如有一些文檔寫的不夠全面檐嚣、不夠規(guī)范,或者有一些必要的地方缺少注釋說明,這些都可以作為一個貢獻去向社區(qū)提request嚎京。在逐漸的更加熟悉后嗡贺,可以經(jīng)常關注該項目的github issues,看是否有一些bug需要解決鞍帝,可以嘗試幫著社區(qū)解bug诫睬,其次也可以針對一些該項目缺少的功能,自己進行開發(fā)帕涌,向社區(qū)做貢獻摄凡。這是一個很好的學習路徑。
其次是各類計算機頂會蚓曼。各大公司和名校的最新research都會發(fā)表在一些好的計算機會議上亲澡。要經(jīng)常關注每年的會議,精讀自己感興趣領域的最新研究纫版。例如床绪,博主是學存儲方向的,因此經(jīng)常會關注一些系統(tǒng)和數(shù)據(jù)庫方面的會議其弊,例如FAST癞己、OSDI、VLDB梭伐、USENIX ATC等痹雅。例如,經(jīng)常閱讀這些頂會的論文糊识,你將會發(fā)現(xiàn)绩社,如今LSM Tree、用戶態(tài)軟件棧技掏、Open Channel SSD铃将、RDMA项鬼、NVDIMM等哑梳,都是目前近幾年無論在企業(yè)界還是學術界都特別關心的技術。通過閱讀學習這些優(yōu)秀的論文绘盟,一是能夠?qū)W習到其中精妙的系統(tǒng)設計鸠真,二是能夠?qū)W習到很多表達的技巧(包括presentation、做PPT龄毡、畫各類圖等)吠卷,這些積累都是特別重要的財富。
其次沦零,無論是參與到開源社區(qū)中祭隔,還是精讀論文,都需要有一個良好的英語基礎路操。無論是閱讀疾渴、寫作千贯、還是聽力和口語都是必須的。因此搞坝,每天留出額外的時間去學習英語是必不可少的搔谴。博主本人在這方面就有些缺失,因此目前仍在不斷努力加強中桩撮。
4. 核心競爭力
確立了目標與學習計劃是遠遠不夠的敦第,態(tài)度決定一切。最主要的還是腳踏實地店量,一步步地去學習芜果。當然,學習的過程中難免會遇到很多困難融师,最主要的還是堅持不懈师幕,勇敢的去戰(zhàn)勝困難。要向優(yōu)秀的人看齊诬滩,不要被外界的東西所打擾霹粥。例如,書還沒看兩頁疼鸟,就去打游戲了后控。剛配了一個環(huán)境,遇到點困難就放棄了空镜,轉身去看電視劇了浩淘。這樣是萬萬不能的。
要有堅定和果斷的意志吴攒。以博主本人碩士期間的生活舉例张抄,通常周中晚上都是12點、1點睡覺洼怔,早上一般都是7點吃過早飯就坐在實驗室了署惯。中途從不玩手機、不打游戲镣隶、不看劇极谊、不逛淘寶的。但是周末喜歡出去瘋玩兩天安岂,周末除了特殊情況需要加班加點趕論文外轻猖,一般情況周末是不去實驗室的。因此域那,可以做到勞逸結合咙边。但個人非常喜歡技術,曾經(jīng),修改一個開源項目败许,自己琢磨到半夜友瘤,在遇到問題真的很難過,但在自己的堅持下檐束,當新的功能可以完全跑起來的時候辫秧,半夜回去躺下都激動不已,難以入眠被丧。