研究生最后一年學習計划
前言
又是一年畢業季的到來,想想研究生真是過的飛快。最近忙着實習與校招,目前還沒有正式收到offer但是問題也不是很大,前段時間在菜鳥網絡基礎架構部門實習時經歷了很多,與一群比我牛逼很多的人共事也學到了很多(盡管也被批評了很多),接下來我將會一邊總結實習過程中的感受、遇到的問題,一邊規划一下未來一年的學習計划。
實習總結
主要工作
1、參與了菜鳥基礎架構組的彈性擴縮容項目,主要完成的是對系統的監控數據獲取、聚合等功能
其實這塊業務並沒有什么技術含量,簡單點說就是離線拉取數據,並對數據進行CURD。其中,比較有意思的是全程使用Java8的stream類庫,這個知識點我找時間總結一下(包括foreach、map、reduce、paralleStream等等)。另外需要考慮很多額外的東西,例如數據其實每天只更新一次,所以為了提速接口rt采用了redis來做緩存;同時HTTP接口拉取監控數據不穩定,很容易超時或者連接失敗,導致改次請求無法獲取數據,這時需要對代碼進行良好的異常處理,還需要考慮數據拉取失敗時的重試策略(這塊還沒來得及完善,基本思路是設置最大重試次數,在異常捕獲處重新拉取)。
另外一個點,由於是對ip維度進行統計、聚合,那么ip數量很大時如果還是串行執行就很慢了,所以需要使用多線程來提速。
2、參加黑客馬拉松比賽,完成類隔離容器項目
這塊我打算專門寫一篇博客來細講,就不在這多說了,屆時會把鏈接更新過來。先甩一張架構圖鎮樓。

我理解的企業的用人要求
最近也參加了很多家公司的面試,有如意也有被虐的很慘的,以下是一些知識點的總結(實際上下面的很多都沒有涉及到,畢竟校招還是考察基礎更多一些)。
- 算法及數據結構:重要性就不用說了,面試中很多公司(絕大部分外企,百度、頭條、快手等)都會非常看重這塊,如果想去以上公司那就必須要投入很多時間和精力去刷題了。
- MySQL原理:互聯網最常用的關系型數據庫,面試幾乎都會問到,考察點如存儲引擎比較、視圖、索引、花式join等,我認為索引尤為重要,應該多多去學習和理解原理(之后計划寫一篇關於索引的總結)。
- Redis原理:互聯網非常常用的內存型Key Value數據庫,單線程,支持持久化,速度非常快,面試常被問到Redis支持的數據結構,深入的可能會問實現原理(准備學一下)。
- Nginx原理:性能高、吞吐量大的服務器,適合做靜態資源服務器和后台的負載均衡入口,同樣也是單線程,基本配置和原理值得學習。
- Tomcat原理:Tomcat是Javaer最常用的服務器,其本身也是一個Java進程,作為一個容器運行webapps目錄下的war包項目。我認為經常會考察的點在於Tomcat的常用配置、內部的類加載器等。
- Spring原理:搞Java的應該沒誰不知道Spring,常見面試題有Spring bean初始化流程,IOC和AOP原理,Spring上下文管理等。目前來說SpringBoot應該要比SpringMVC更火一點了,必須學習。
- RPC原理:分布式系統中不同服務之間調用的一種方式,我理解的是類似於HTTP的一種暴露服務的方式(可能有誤),Java中常見的如Dubbo,其他的有gRpc,值得深入學習。
- MQ原理:消息隊列在互聯網中也是有着非常重要的地位,是一個同步轉異步的好方式,相關框架特別多,比如Kafka、RocketMQ、RabbitMQ等,那就必須要了解各個框架之間的優劣勢和特點。
- 分布式基礎知識:稍微大點規模的系統都需要用到分布式,因為單機所提供的資源是有限的,互聯網中分布式自然是家常便飯了。分布式系統中需要考慮數據一致性問題,這里面水非常深,任重道遠。
- Linux:Linux是最常用的服務器系統,現在Docker(容器)又是新潮技術,特點是易部署、擴展性強。研發工程師不僅要懂得開發,也要懂一些運維的基本功。比如我在面試中就遇到了很多直接問Linux命令的問題,也包括一些shell腳本的使用。至於操作系統本身,那就更是基本功了。多使用多記錄,慢慢來吧。
以上是零零散散的知識點,另外語言的基本功、系統設計能力、設計模式等也是后台開發者必備良葯。私以為,上面這些點掌握80%,去面阿里拿個P6應該沒問題了(不知道會不會被噴哈哈)~
學習計划
上面說的這些知識點,其實我都只是略懂一二甚至很多都只是了解的層面,所以在接下來的空閑時間里我決定盡可能地去學習和整理這些內容,並以博客的形式記錄下來。
分布式系統
這塊東西其實很多,我覺得沒有必要把所有的東西都看一遍,一來不現實二來其實也用不到那么多。分布式系統的原理性包括分布式一致性、分布式事務等核心原理是必須要理解透的,能滔滔不絕的扯個2、3個小時的程度我覺得就可以了。常用的分布式工具比如zookeeper、Kafka、Hadoop這類系統,也是必須去學會使用及了解原理的,師兄給我的建議是拿Hadoop去從源碼級別看起,能學到很多書本上沒有的東西,我會盡量朝這個方向去努力的。
為了強迫自己去學習,開啟了一個系列博客寫作計划,目前已經有第一篇產出:ZooKeeper學習之一:安裝及命令行使用,后續我會繼續加油。
刷LeetCode
有人可能想說研三不都已經結束找工作了嗎怎么還要刷題?稍微考慮遠一點,正式工作了一般來說都是沒時間去刷題了,萬一要跳槽去一些外企或者喜歡面算法的公司(快手等)的時候,就非常尷尬了,所以還是要把以后的壓力分攤到現在來。
刷題是一種好習慣,應當堅持。
機器學習
機器學習、深度學習、AI等名詞幾乎是近兩年來IT圈內最熱的詞匯,如果只是說熱度高,那么並不是每個人都需要去學習,而是說這門技術你是否能夠用得上、能否產生價值。
我在研究生期間更多的是彌補本科落下的代碼量、實習經歷,自己也不夠勤學去追趕新潮技術,所以對於機器學習這方面只是停留在“聽過”的層面。而在阿里實習的過程中,我發現即使是后台研發人員也可能遇到需要使用到機器學習、統計學習等方法來解決的問題。例如在進行彈性擴縮容項目開發時,就需要對服務的流量進行預測,這塊實際上是時間序列的數據的預測,自然涉及到了統計和機器學習相關知識(將推薦轉換成分類問題)。
沐神(李沐)最近開啟了一個深度學習教程,看了第一節課感覺很親民,有時間的話可以追一追:動手學深度學習。
總結
總體上說,做技術開發還是多敲代碼多采坑多記錄多積累的過程,所以還猶豫什么,just do IT~
