这是我2021年的第5篇原创文章,原汁原味的技术之路尽在Jerrycodes
Jerry 哥作为一个刚刚结束 2020 秋招的人,谈谈自己一开始的乌托邦和最后的实现
Jerry 哥面试期间拿到的offer:
腾讯、字节、美团、网易、pdd等互联网offer
以及
农商行、农行、招商银行、上交所、招行、深信服、华为等offer。
大家都是从小白开始成长的,没有人一开始就是大佬,合理规划好自己,你也可以成为大佬,主要还是要保持不断进取斗志。
以下我将介绍的学习路线和学习方法,所有的资料会开源,书籍也有电子书,后台回复“电子书”即可。想要进一步交流的可以私信我,大家一起进步。
背景
一开始是想当算法工程师
后来主动转开发
后端准备什么
408 基础
后端语言基础
MySQL
Redis
一个拿得出手的项目
暑假实习面试
暑假实习感受
没有实习经历怎么办
先说一下自己的背景,Jerry哥 本硕都是一个中流211学校的学生,本科的时候只学过C++/C的知识,做过几个当时看起来很牛逼的课设(对于本科生来说),不排斥打代码。当然本科的时候学习是比较懒散的,看到什么学什么,没有什么特定的目标。
作为一名研究生,我是在一个中流 211 学校就读,读的也不是计算机科班专业,老师对计算机这块也不是很懂,但是研究方向却是深度学习方面的。由于老师的横向项目也是比较多,所以自己平时既需要做学术上的汇报,还要参与老师的横向项目。所幸的是项目都是和打代码相关,偏软件,也就萌生了往软开发展的想法。
为什么相当算法工程师?很简单,三个字,高大上
如果可以应聘上算法工程师,意味着你每天开着 google 的论文,复现顶级季刊的代码,想着可以用自己的算法为抖音做视频推荐,给你的 QQ 音乐做猜你喜欢。这些都是可以直接给你的工作带来刺激,想想因为你的算法,每天有若干人更加喜欢这个 app 了。
那时候的算法工程师竞争已经非常激烈了
但是我还是想去尝试一下算法岗,原因有三:
1.(研究方向)我当时研究的方向是自然语言处理,属于人工智能的一个分支。如果可以在该领域发表一篇不错的论文,可以试一试。
2.(个人兴趣)我当时数学学的还不错,对一些机器学习的算法推导都推过一遍了,而且也感觉做这一块有意思
3.(可替代性)说白了还是高大上,因为感觉算法工程师的可替代性不高,属于比较秀智商的,而且比开发来的高级,可能可以避免三十五岁之后的危机
人的认知都是在不断改变,事实上如果你足够强,45岁都没有危机。
后来到研二上学期,科研路不是很顺利,那个时候在想是否要转开发岗。当时摇摆的原因有:
没有论文。
没有一个很好的算法优化项目
身边的同学纷纷转了开发岗
让我们来看看算法岗的招录比
来看看开发岗的招录比
开发岗招三个人,大概有20个人来应聘
算法岗招三个人,大概有50个人来应聘
从面试官的角度自然是想要找到一个能够为企业带来最大贡献的人,拿 paper 做标准甚至远不如学历歧视来的理性。有些时候文章可能会成为筛简历时的敲门砖,但是本身水平才是一切的基础。
说重点,paper 还是敲门砖。
之前公众号里也举过一个例子
说真的现在算法岗前方一片狼藉 工资高的背后各路神仙打架 开发确实是一个不错的港湾 给大家举一个例子
某末流 985 实验室非王牌实验室
a 同学平时是实验室的大神 实验室主要是以做深度学习算法为主的 但是还没有 paper 但是凭借对深度学习的热爱想找算法岗 毕竟算法岗看起来是那么的高大上;
b 同学平时在实验室里是比较一般的同学 深知自己以后是走不了算法这一条路 所以自己在网上自学了前端/后端的知识 打算找一份JAVA 开发的工作, 到最后可能 a 同学可能会因为 paper 学历等原因 可能连一面都过不了;
我身边就是有一个这样的真实的案例:一个师兄是图像实验室的,然后发了一篇不错的 SCI 二区 idea 也是自己想的 最后面的是阿里的某部门算法岗
最后三面都过了之后接到电话说感觉学历有点低 可能和岗位不 match
其实当时也是纠结了几个礼拜,然后就转开发了,在前端/后端/安卓/ios 的选择上果断选择了后端,因为之前做过几个后端的项目,对后端有一定的了解。
所以这个也是个教训,你在选择未来要发展的方向的时候,兴趣很重要,但是同时能力也很重要,之前做过相关的项目很重要。如果我当时死磕算法岗,别说腾讯字节,就算二线厂如小红书这些都够呛能有面试机会,这就是现实,也是选择带来的红利。
我大概是十月份才开始准备学 Java。这里需要提一下,如果光学习语法而不去打代码,是很容易忘的,只有在 debug的过程中才会成长。如果你是零基础或者编程能力一般,请提早开始学,因为我之前已经学习过C++/C/Python/JavaScript等语言,所以语言的学习对我来说会轻松很多。
先看看后端开发工程师招聘要求,我们以阿里巴巴的招聘要求为例子:
总结一下:
计算机基础扎实,笔试面试会问到常见的数据结构和算法;
最好掌握一门脚本语言,如 Perl,Python,shell 等,对 linux 环境有一定认识,毕竟我们是在 linux 环境下进行部署;
熟练编写 SQL 脚本,有 MySql 开发经验,数据库 sql 语句 crud 是日常业务;
掌握一门服务端开发常用语言,如 Java、Golang、 C,C++,PHP,.NET 等编程语言中的一种或几种;
有项目经验更佳。参加过大学生数学建模竞赛,“挑战杯”,机器人足球比赛,或者写过项目放到 github 上;
乍一看感觉东西很多很杂,简单总结就是:
计算机考研 408 基础+算法题+会一门脚本+一门后端语言+MySQL+Redis+一个项目,有开源经历更佳
这是国内Top互联网的要求,按照这个接下来我会教你怎么准备。
408=计算机网络+操作系统+数据结构与算法+计算机组成原理
面试频率:★★★★
就一本书 《计算机网络自顶向下》,如果有时间可以多读几遍,真的是一本神书。
面试中计算机网络问的概率也比较大,主要针对网络层和传输层以及应用层问一些问题。所有的问题可以基于OSI七层模型展开
基础的问题比如:
tcp 和 udp 之间的区别
哪些协议用到了 tcp,哪些用到了 udp
http 和 https 之间有什么区别
加密方式分为哪几种(对称加密和非对称加密)
OSI,TCP/IP,五层协议的体系结构,以及各层协议
深入一点的有:
TCP 的拥塞控制是如何实现的
快重传和快恢复是如何配合
如果我计算机的 MTU(最大传输字节)设置过大会有什么影响
推荐一个菜鸟教程总结的一些知识点:
https://www.runoob.com/w3cnote/summary-of-network.html
推荐书籍
《计算机网络:自顶向下》 《图解 TCP/TP》 《图解 HTTP》
面试频率:★
计算机组成原理应该是面试当中会问到最少的基础知识了
从面向面试的角度来说,仅做了解即可,如果是平时学习的话,可以参考下面的图作为一个学习路线
推荐书籍
《计算机组成原理》
面试频率:★★★★★
数据结构与算法,必问项。无论是后端/前端/安卓/IOS,家家户户必备
数据结构与算法是面试当中的重中之重,因为不了解数据结构与算法,就好比你的汽车里没有发动机。
数据结构与算法的书籍可以说网上非常多,如果是小白学习可以学习 《大话数据结构》 ,属于比较生动形象地告诉你所有数据结构。
有一定基础了可以看看 《算法》 ,这本书比较难看懂,有兴趣的可以深挖,时间不足的话可以直接跳过。
书本上更多是一些静态知识,例如树的构成,平衡二叉树的构建,前序遍历等各种表示等等,又或者是图中结点之间关系的表述(邻接矩阵还是邻接表)等,如果没有去在实践中加深,很容易忘记。如果想要了解多一点关于数据结构在代,推荐可以当当网搜“数据结构与算法分析”+对应学习语言,像我当时就看了这本
这就提到了应届生常说的——刷题
这里要说一句,做题要注重方法!方法!方法!
其实我并不赞同刷题这个词,因为刷题意味着你仅仅是为了找工作而刷,如果仅仅为了记住答案或者某种目的,那么过个几个月后你肯定还是会忘记,所以我觉得做题很有必要,理解一道题更有必要,总结题目类型事半功倍。
刷题的时候我比较喜欢按照专题去做,例如有二叉树、图论、并查集、二分法、动态规划等专题,例如你只有学会了0/1背包问题才可以去做完全背包问题。如果短时间内在专题题目中练习的话,会加深对这个数据结构和算法的理解。
我主要依托于两个平台做题:推荐两个刷题网站:
https://leetcode-cn.com/
Leetcode是一个非常多人学习算法的社区,可以说现在想要进互联网大厂,都是需要刷题巩固的。
Acwing是近两年才火起来的社区,我在学习算法的时候其实也很迷茫,看着生涩的题解,一开始冷启动的时候只能刷几道题。
Acwing更多是一个题解社区,由北大NOIP金牌得主yxc创办,十分适合在校学生学习。
https://www.acwing.com/
我做的题目不是特别多,但是每一道题我都认真总结反复思考,这很重要,因为可能几天之内你重新做这个题目还能凭借艾宾浩斯的记忆曲线,形成肌肉记忆顺利的把代码打出来。但是当时间一长,更多是要凭借你的理解去解题,在工作中更是需要通过自己的分析选择特定的数据结构,思考至上。
我做的题目很少,这里稍微晒一晒把,我记得我三月份开始找实习的时候,做去年腾讯的校招题,五道题我AC了四道,基本上水平就可以看出来了,所以后面就把重心放到了其他地方。
如果要看往年的笔试真题,可以在我的公众号"大厂笔试"里看到,里面有一些我的解答,去年有的题目还帮师兄AC了不少题目。
《剑指offer》 属于入门级别的算法题了,也是属于面试中手撕常考题,一开始如果做leetcode比较吃力的话,可以先看看《剑指offer》,很多大厂的题目都是基于《剑指offer》或者它的变形。
ps:如果在日常学习中有遇到算法题相关的疑问也可以加我好友,有空可以解答一下。
面试频率:★★★★
操作系统应该是我决定去面后端才开始学习的,事实上每个程序员都要懂操作系统,这是我当时认识的一个盲区。
因为非科班的缘故,并没有上这门课,而且平时由于没有太多的需求,导致了这门课我是时间比较靠后才进行学习的。
操作系统特点为内容多,但于此同时也非常有趣同其他计算机知识紧密联系。后端开发工程师对操作系统的要求不小,如果有时间的话最好多复习点。
我学习的时候看了王道考研的视频,老师对知识点剖析得也比较不错,在这里也推荐一波
https://www.bilibili.com/video/BV1YE411D7nH?from=search&seid=10316055627636820951
操作系统在面试中被问到的概率中等,一般通常会问一些和内存相关的一些问题比如:
线程同步的方式有哪些
进程的通信方式有哪些
什么是死锁?死锁产生的条件?
分页和分段有什么区别
操作系统中进程调度策略有哪几种?
程序从堆中动态分配内存时,虚拟内存上怎么操作的
如果看完这个B站的视频,相信你在里头都可以找到答案。如果你已经对操作系统很熟悉了,相信我,用二倍速一天看完它,你肯定也会有不同的收获。
后端语言基础主要有C++、Golang、Java、PHP,我当时学习的是Java,主要就是考虑了以下几点:
岗位需求多
开源资料多
自己本科毕业的时候学过Java
接下来就介绍下Java学习
花了点时间系统性的看了一本 Java 的入门书 《第一行代码》,对 Java 的语言特性有一定的了解。如果你之前学习过其他编程语言,可以学的快一点。
这本书从并发编程的底层实现机制入手,逐步介绍了在设计Java并发程序时各种重要的技术、设计模式与应用,同时辅以丰富的示例代码 主要涉及Java并发机制的底层实现原理如volatile的应用、synchronized的实现原理与应用、Java对象头、锁的升级与对比、原子操作的实现原理等等,可以说是一本学习并发编程入门的好书籍,在面试的时候经常会有面试问你:
Synchronized和Reentrentlock之间的区别是什么
volatile是如何保证它的可见性
volatile能否保证原子性
Java通过引入虚拟机(VM)的概念,让编译后的代码直接跑在一台虚拟的机器上,无论最终的目标平台是什么,都在上面构建出一个虚拟的一致的虚拟机出来,就可以达到一次编译到处执行的效果了。
推荐一下这本书《深入理解Java虚拟机》
里头主要涉及垃圾收集、内存管理机制、内存模型、类加载的时机等,都是经常问的考点
如果是面试Java后端,虚拟机的知识真是必看,但是由于应届生基本上项目精要为0,所以面试官不会问道项目排查方面的内容,只会问一些比较基础的比如:
说一下堆栈的区别
什么是双亲委派模型
说一下类装载的执行过程
针对Java学习,不要只停留于表面的语法,要多看多做,切忌眼高手低。
数据库的学习,离不开实践。
先在自己的电脑上安装一个MySQL,可以参考:
https://www.runoob.com/mysql/mysql-install.html
安装版本最好高于5.7,因为有些特性才能学习到。
如果想要安装一个可视化工具,推荐navicathttp://www.navicat.com.cn/
安装完毕后开始MySQL的学习,针对这个的学习我分成了三个部分:
快速看完一个体系视频
操作数据库,练习SQL语句
结合InnoDB特性学习
1.看完一个系统性的视频或者书籍是为了能够让你在短时间内快速学习这个中间件,了解整个中间件的脉络。
我当时看的视频是这个:
https://www.bilibili.com/video/BV1UQ4y1P7Xr?p=75
2.操作数据库,练习SQL语句,我建议你直接使用终端进行操作。 有些人会说现在ORM这么成熟了还要学习SQL吗?当然,因为万丈高楼平地起,ORM底层也是操作SQL的,在性能排查上学习点SQL大有益处。explain语句怎么分析?死锁状态如何查看?索引如何建立?都要使用SQL。
InnoDB支持事务,支持行锁,已经是最常用的存储引擎。
四大特性:
原子性(Atomicity):事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
一致性(Consistency):执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;
隔离性(Isolation):并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
持久性(Durability):一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
3.多看一些MySQL的基础知识,MySQL的知识说实话非常多,但是它的体系结构非常明显,学习起来有章可循。在面试中经常会问道一些固定答案的题目比如:
MySQL索引使用的数据结构是什么
redo log和undo log之间有什么异同
如何利用bin log做主从复制
可以参考我公众号写的一些文章,也可以参考一下:
https://www.runoob.com/mysql/mysql-tutorial.html
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
Redis的优势在于:
性能极高 :Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 : Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 :Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
学习redis我推荐这本书 《Redis的设计与实现》(还是我在字节实习的时候同事推荐给我的)
这本书深入浅出的描述了redis的几种数据结构的底层实现以及主从复制、事务性、持久化等特性,一句话总结就是非常全面地剖析,例如redis底层字符串是由SDS构成,压缩列表何时会失效等等。
推荐一个学习网站:http://redisbook.com/
拿得出手的项目这个标准其实很模糊,五年前学生管理系统可以拿得出手,现在这种系统比比皆是。
无论是本科生还是硕士生,我觉得都可以从平时做的项目中挖掘一些自己的点,而不是一上来就看B站的视频自己做一个。
例如我之前做过一些机械臂的工作,我就把机械臂的信息和网页结合起来,通过网页远程登录访问机械臂设备进行操作。这种项目可模仿性低而且在你之前做过的项目中进行改进。
抛砖引玉,扯远了,我后面又帮老师做了一个小商店的支付项目,比较复杂,当时也是参考了一个慕课网的视频,具体可以关注我的公众号,回复项目即可,我都整理好了。
如果你有后端开发的项目或者后端开发的实习经历,那么我想你可以在这上面多思考以下几点,这个也是我当时面腾讯的时候面试官的四连追问:
你的项目需求是什么?
你的项目中有几个人完成?分工是什么?你在当中又是充当什么样的角色?
你觉得你的工作在当中完成的如何?有没有遇到什么困难?
觉得这个项目还有什么改进的地方,项目落地了吗?
一般暑假实习的面试比秋招面试简单,而且有一定的转正概率,所以同学们一定要去尝试面一下暑假实习。
当然会有的人会说,如果我的老师不让我去实习或者自己的时间安排不允许,怎么办?
这里我推荐,直接面,面上了去不去再说。
只有经历过面试,你才知道自己的水平怎么样,一场面试成功与否不在于你是否100%回答上面试官的所有问题,而是你已经发挥出你最好的状态了。只有在战场上你才能知道自己的真实水平。
三月份开始,陆陆续续大厂就都开始暑假实习招聘面试了。
面试首先就是投递简历,简历其实很关键,因为面试官是根据你简历上的亮点来提问你。
在一场三十分钟的面试当中,前面两分钟你可以做一段自我介绍,要想有开门红,必须要自我介绍得体。所以,你必须在面试开始自己的优点进行描述,这也是你唯一一个可以主动出击的地方。
我一般是这么介绍的:
面试官你好,我的名字叫J,我是来自XX大学通信学院的一名硕士研究生,这次是来应聘XX公司的后端开发岗位,主要有两点:
1.一是自己在平时项目和实习中有担任过后端开发工程师岗位的经历,主要做过xxx和xxx这几个项目,对Java、MySQL和Redis等中间件有一定的了解
2.在学校的学习中我还积极参加各种竞赛,如参加过全国建模比赛获得X等奖、 研究生电子设计大赛X等奖
基于以上原因我这次来应聘这个岗位
3.在学术上发表过XX论文(如果岗位不相关,三句话内结束),使用XX语言编写,已经被录用
简洁明了,主要突出你的优势:
1.做过哪些项目,有哪些经历,对哪些东西了解,进而诱导面试官去问你
2.分点叙述,如果有更好的经历可以继续补充,最好不要超过三点,逻辑清晰让面试官能够快速捕捉你的亮点
最好不要提及以下几点:
1.爱好,如运动、看电影等,技术岗面试不care这个,而且不会因为你的爱好就聊这些东西
2.涉及学生会社团等无关技术面试的介绍,这个只能体现你的课余生活
3.说一些和技术无关的面试话题
我每次在面试的时候都会开启手机录音,以方便复盘。面试是一个查缺补漏的好机会,面试官问你的问题,很可能下家公司也会问。如果你在第一场面试前只掌握了 50% 的知识,那么我希望你每次进步 5% ,这样到了第五场面试的时候,你就已经大概来到了70% 左右的水平。
最后我是去了字节跳动实习,吸引我的主要就是字节不pua且自由的文化吧。实习最大的感受就是忙,而且节奏快。项目里主要有三个人,人力不够,有的时候我得和测试产品聊需求,这也验证了网上说的一句话 “字节实习生和正式员工一样”。
在实习过程中也不用怕犯错,因为只有犯错你才能不断进步。
实习的时候主力语言是Golang和python,大概花了几天时间熟悉下Golang语法,然后直接开始干活。
实习可以让直接接触到生产环境的代码,同我们平时做的demo不同,在代码逻辑、架构设计选型、数据库设计等方面都很有讲究,当时参加技术评审会议讨论了很久,严谨务实是每个程序员的内功。
后来和我二面三面交流了一下我的面试情况,他们说一面的时候问了我大概一个小时左右,感觉基础还是比较不错,虽然有些问题不会,但是有自己的思考,所以二面面试官,也就是我的mentor,二十分钟就问完我问题了,三面本以为会刁难,结果也是二十分钟。这说明了一点,如果你在一面或者二面中表现非常出色的话,他们会写面评,后续的面试官看得到前面的面试评语,好面评是会加分的。
根据供需关系,可能最后你没有找到合适的岗位或者没有收到心仪的offer,导致了你没有实习经历。没关系,我身边也有很多同学没有实习经历但是在秋招的时候面上了很多大厂。我总结一下他们身边的优点大多如下:
1.计划性强
如果你没有实习经历,不意味着你同大厂或者互联网失之交臂。因为面试的时候更多的是询问基础知识,而我当时在实习的时候忙于业务代码,有些基础知识都忘了。如果你没有实习,合理安排好自己的时间,将我上面提及的几个技术栈学习好了,去面秋招也不是什么难事。
2.有比较好的项目
如果有比较好的项目,而且面试的部门刚好是相关的,那么如果在面试过程中和面试官聊的比较投机,那么你成功的概率就非常大了。例如我当时面试网易的时候,提及到了我在字节跳动做过的项目,他们非常感兴趣以至于全程都没怎么问基础知识,最后做了一道算法题然后就让我过了。所以如果没有实习经历,可以花点时间多打磨一下自己的项目。
下一篇文章我们聊聊每家技术面试给我的体验,喜欢的可以留言催更哈哈。