学习经验总结|C++后台开发/云计算方向,offer收割机的学习路线
作者:特立独行MVP
链接:https://www.nowcoder.com/discuss/188367
来源:牛客网
我是20年毕业,目前计划去字节跳动实习,暑假实习拿到了BAT,微软等十几家的实习offer(这里的B指的字节 百度没鸟我。。)
具体面经参见:https://www.nowcoder.com/discuss/172152
暂时写个个人的学习路线,供大家参考参考~
个人介绍
南京大学电子科学与工程学院,本硕。本科:通信工程。
实习经历:在北京图森未来的基础架构部门。
目前我也是图森在南京大学的校园大使,大家有想去实习和工作的可以私信我内推呀~
我之前也是经历过很长一段时间的迷茫,纠结于算法还是研发方向,因为我本身做过算法优化相关的工作(本科末也水过paper)
之前也对深度学习机器学习有过很大的热情,但是迫于环境和自身的想法还是选择了研发方向,主要是后台开发和云计算相关。所以大家如果能够很早的确定自己的方向还是可以少走些弯路的。当然我的经验仅供参考。
由于我所在的实验室比较的。。。。坑。。。。所以研一研二根本没办法出去实习,而且南京之前也没有特别好的大厂可以就近去实习。我在研一末和研二初的时候还是去尝试投了一些实习,去年是拿到了
- 微软的nlp的寒假实习
- momenta的高精地图开发的春季实习
- 趋势科技的开发岗位实习
- 图森未来的基础架构 实习
- 华泰证券 项目实习
没敢投任何的大厂,那个时候我还是比较的菜的,怕菜的被拉黑。家如果有机会还是可以尝试寒假或者早一点的实习,会在之后都比较有优势。
目前我暑假实习基本告一段落,拿到的offer如下:
- 阿里云 存储团队 (杭州)经历5面
- 腾讯 csig 后台开发 (上海) 经历4面
- 头条 基础架构(北京、上海 ) 经历4面
- 网易互娱 基础架构 (广州) 经历3面
- 快手 基础架构 (北京)经历4面
- 依图 后端开发 (上海)经历3面
- 远景智能 后端开发 (上海) 经历3面
- 虾皮科技 c++开发 (深圳)经历3面
- 商汤科技 云平台开发 (北京)经历3面
- 华为云 云计算 (杭州) 经历2面
- 海康威视 大数据开发 (杭州)经历3面
整个面试周期就是从2月底到4月底这,两个月,别问我为什么拿到了这么多,我面也快面吐了。我个人的准备大概是在研一的下学期开始的,一直到研二上整整一年,后面我会从语言基础,数据结构和算法,基础知识点,项目上进行总结。
学习建议
虽然面试有很多的地方可以讨巧和临时补充以及团队合作。但是从个人的发展和未来成长来说,我觉得基础是最最重要的。我个人是看书为主结合一些自己感兴趣的项目会写着练练手如果没时间写就多看看别人的项目源码,然后就是写写博客记录一些自己遇到的问题和想法,很多的问题真的都有在面试当中被问到。
算法和数据结构
这一段算法大神或者ACM大神就不要看了,我怕被喷。
算法这块因为我没打过ACM,所以一开始恶补的很多,我建议先找一些比较靠谱的视频或者公开课去学会比较好,当然如果学校里的课还不错可以去上上,因为我的专业开的计算机相关的课非常少,我记得本科就一个c语言和c++程序设计。所以我是蹭了很多计科的课:比如数据结构,算法设计与分析这类的课。因为算法这东西还是需要时间去训练的。
课程
- 浙大的数据结构
- MIT的算法导论
刷题
当然如果你时间不够那么,牛客网左神的算法课你就不能错过了!非常系统和直接,就是干货,看过的都说好。
学完了之后呢,当然就是刷题了,我不推荐每天没日没夜的刷,当然我也曾经这样过一天刷他个十几道,但是真的这样效率其实不高,我是建议在有一定题量之后每天随便找个时间写个1-2题就够了,难度就是leetcode中等就行了,推荐大家一些必刷的和一些我觉得还不错的oj:
必刷:
- 剑指offer 2遍左右够了
- leetcode 所有简单和中等的
- 左神算法课上的所有例题
个人推荐:
- hihoCoder :他会有一个每周周赛,都在周日,四道题。难度和代码量都还是挺大的,如果想去外企我建议多刷刷。
- lintcode: 为什么推荐呢,因为他有个CAT模式也就是天梯上分,写一题上一颗星每题有时间限制15分钟或者30分钟,提交次数限制3次,没过会惩罚加题。总之非常适合面试模式。我是刷的停不下来。
- codeforces:这个就偏比赛一点,但是很多新题都是这上面改的所以值得做一做。
再给一个我认为好的算法博客:
书籍:
- STL源码剖析 : 各种数据结构的实现 都在里面 c++必问
- 算法导论 :当个参考书吧,没事推个导,计算个复杂度还是有点意思的。
- 算法竞赛入门经典
语言基础
我个人的话主要语言是c++,python,java也就是个javaSE水平,go入门。
我个人建议开发的话必选就是一门主流静态语言:c++或者java当然现在go也非常的火热。加上一门解释性语言:python
如果只懂得一门语言的话,竞争力会小一点。除非你是精通c++级别的,那当我没说,
c++学习建议
首先c++不容易学好,如果仅仅是学习语法或者写个算法题那几天就行了。但是用好c++还是需要很长时间的积累的。
多的不说了给大家推荐几本书:
- C++语言的设计与演化
- Effective C++
- More Effective C++
- 深度探索C++对象模型
- c++ Primer :当个字典吧
- STL源码剖析
只从语言本身而言就是多看多理解和多使用。没啥捷径就是干。
当你觉得语言不是问题的时候那么就可以去看看操作系统相关的以及高性能服务器相关的知识,这些应该是后台方向必点的技能点了。
进阶
操作系统
操作系统的话原理大家都懂,但是一问深的就不知道了,什么进程线程,调度算法,虚拟地址这些的问题早就被问烂了。但是如果直接去看linux源码的话,相信大家和我一样刚开始都是拒绝的。还是直接怼书吧,基础最重要:
- 深入理解计算机系统 :经典!太好看了!
- Linux内核设计与实现:不算系统但是算入门级别 建议和操作系统的课本结合一起看会更好
- 深入理解linux内核 :讲的2.6版本的内核
建议先把上面的几本书看看,然后看自己的兴趣吧,如果对哪块很感兴趣那就去看源码看实现吧。
服务器编程
服务器编程其实就是建立在对linux的系统调用的理解以及网络协议的理解上的。如果这两块的知识比较好的话就可以动手实现一些简单的服务器,然后对比别人实现的,压测一下性能啥的,可以作为一个还不错的个人项目,我其实也就是这么做的。
- Linux高性能服务器编程
- UNIX 环境高级编程
- UNIX网络编程卷1
计算机网络
计算机网络的话我是看的浙大的计算机网络课程,主要就是专注于协议的原理和分层模型,因为东西还是比较的琐碎的,建议大家多做些笔记写一写文档。不论对于记忆还是日后的复习都是很有用的。
- 计算机网络原理:自顶向下方法
数据库
对数据库的理解也是必不可少的。如果是去大厂的话光会一个mysql基础可能是远远不够的。
像是Redis,MongoDB等非关系型数据库也是需要好好的掌握的。因为在实际的项目当中会经常使用Redis
作为缓存,包括其分布式集群的原理等等都是面试的重点。
MySQL的话建议可以看看,mysql必知必会,原理比较少但是使用细节还是挺多的,适合先过一遍。其次就是可以看看尚硅谷的mysql高级部分的课程,关于mysql的查询优化以及其他的高级特性都是书本上很少有的。很多的数据库难题都是这上面出现的。
Redis建议看看Redis设计与实现这本书,非常详细的讲了Redis的底层数据结构,包括其复制,集群部分也做了很好的解释。然后的话可以再去理解一下分布式的Raft算法,Gossip协议等等。
数据库就是多用多学,个人建议用学一学docker,以后配置这些服务非常方便,也是现在云计算的一个很重要的组件。
云计算
为什么会接触到云计算其实也是之前实习的时候重要做的项目,主要就是关于docker容器化以及Kubernetes容器编排框架。
docker在容器化的贡献是巨大的,也可以为我们在日常配置服务过程当中减去非常大的麻烦,不论是工作中还是平时自己的使用都是非常友好的。
如果是走这个方向的话对于docker以及k8s是必修的,建议看看下面的书或者博客:
- Kubernetes权威指南
- docker源码剖析
- 极客时间:深入剖析Kubernetes专栏
面试技巧
大大小小的面试我也是经历了大几十轮了,总结下来就是要有策略,要有总结,以及要有信息。
首先就是策略,一开始最好不要立刻投大厂,因为一上来就面大厂的话容易崩,刚开始面的人少所以难度也会相对高一些,有的还凑合的会被大厂当备胎,很难受的。其次就是能内推就不要走官网,能免笔试免笔试,不是说笔试难度大还是咋地,这玩意其实是玄学,因为你说你一个人做呢没问题,大神嘛无所谓但是你保不齐别人是一个实验室或者一个班级的人在做,如果遇到点坑的题目,你交代了,别人合作做出来了那你被挂能怪谁呢。还有就是如果大家也是合作做题的话,oj的查重或者作弊系统的判别现在越来越严,如果保不齐你被抓到了,可能就被企业拉黑,然后你还不知道,后面怎么投都没面试机会这是最惨的。还有就是大家都是一起做的,然后分数也差不多,但是别人接到了面试而你没有,我就遇到了这样的情况,就很玄学我都怀疑是随机选的人面试。反正就是笔试有风险,大家还是抱紧学长学姐的大腿,能走内推就内推。但是内推之前还是需要能够了解一下这个部门,大概是做什么的,hc的数量以及技术氛围,这点其实很重要,因为一旦进了流程,你反悔就来不及了,如果过了之后还想换部门那只能重新面试,再走一遍别说多恶心了。其实哪个部门最好或者哪个部门最有前景啥的这些问题,真的很难了解的非常清楚,我就纠结过很久很久,这种事情找不到最优解的,不过还好对我而言现在只是实习。
其次就是面试总结了。面试过程当中我建议大家开启手机录音。这样方便事后复盘,我是每次都会再听一遍自己的录音,不论是写面经还是琢磨自己的回答有录音真的方便很多。因为面试期间的紧张感会让你很难用最好的描述回答清楚问题,那么事后总结就会让你在下次遇到同样的问题的时候回答的更好。如果说大家有小伙伴在一起战斗的话那么经常互相分享经验真的会决定你能不能拿到offer,大家的经验会让你迅速成长,说实话面试实习这2月也是我成长的最快的一个阶段。
最后就是信息。在面试结束的时候,一般面试官都会问:你有什么问题问我。这个时候我个人最经常问的就是这个部门正在做什么,如果我进来我会接触到什么。面试官才是最了解这个部门的人,只有从他的口里得到的信息才是最真实也是最有用的,通过他的回答你会了解到这个部门做的产品或者是使用的技术,对于自己的学习方向也有很大的指向作用。其次,我会问的问题就是:您认为我在哪些方面可以提高自己。这个问题其实从侧面可以让你获取你此次面试的结果。因为这个问题不像问我面试能不能过这样直白的面试禁忌。一般面试官会指明他认为你的缺点,如果他在说的时候带有建议的语气以及对你其他方面的肯定那基本是十拿九稳了,再不济有大佬对你的一个建议指导对你自己查漏补缺也是非常有帮助的。说下我自己的经历吧,我在面阿里云3面的时候,那位p9大佬在我问完这个问题之后不仅肯定了我的一些表现还给我推荐了2本书建议我去阅读,这真的是非常良好的面试体验。
最后
这个帖子我会在以后继续的更新,我目前还在慢慢的职业摸索阶段,也还是一个菜鸟而已,如果有任何错误的地方也欢迎大家指正修改。
以后的经验我也会更新在这个帖子里,希望对大家有帮助!