研究生最后一年学习计划
前言
又是一年毕业季的到来,想想研究生真是过的飞快。最近忙着实习与校招,目前还没有正式收到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~