本文主要是介绍我的春招之路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
[图]2019-05-18 摄于北京红螺寺
这是 herongwei 的第 67 篇原创
阅读本文大概需要 8 分钟
2019 年的春招实习,可以说是一次很难得的经历,这次实习找工作,我才发现,原来自己还是如此之菜!暴露出自身很多的问题,虽然拿到了几家小公司的实习 offer,其中包括一家外企的实习 offer ,但距离自己理想的目标还差很远,从三月初-到五月底,给大家讲讲自己当年找实习的一些经历和分析,希望对其有所帮助
1、前言
我在大学就一直学的是 Linux 、C/C++ 方向,到了研究生阶段,虽然也上过大数据,机器学习的课程,但在学校里头这些课程只学了理论,实践能力这块,还是相当不够的,评估了一下自己的自身水平,最终还是选择走 Linux 、C/C++ 方向,所投递的岗位是后台开发、C++ 开发、软件开发这些职位。
现在回过头来,比较后悔的是,在 2019年初,没有早点准备的意识,导致我后面在三月中旬才开始准备春招,那个时候其实很多互联网公司招人竞争已经开始了,没有抓住机会,后面三月中旬才开始投递简历,在牛客网、51job、智联招聘上面看见相关职位的进行海投,机会真是留给有准备的人的,早些参加面试、可以积累一些经验,我觉得还是很有必要的。
有的同学有可能走的是 Java、前端、运维、大数据, 机器学习算法相关的岗位,但是我觉得影响不大,多看看别人是怎么准备的,在回过头来看看自己在方向还缺少什么,针对自己,制定出适合自己的学习路线,然后持续努力。
2、准备
目前我是走 Linux C/C++方向的,接下来我具体先谈谈我的一些准备
1、数据结构 + 算法
数据结构:平衡树(BinSort--->AVL---->RBTree) 和 B B- B+ B*
算法:十大排序算法+字符串/数组相关+树相关+五大经典算法
十大排序算法:冒泡+插入+选择+希尔+快排+归并+堆排序+桶排序+基数+计数
字符串:Trie(字典树),KMP,BM,AC 自动机
树:BST(平衡二叉树),AVL(二叉搜索树)
五大经典算法
贪心算法。经典的求最小生成树的 Prim 算法和 Kruskal 算法、计算强连通子图的 Dijkstra算法、构造 huffman 树的算法等都是经典的贪心算法
分治算法
动态规划算法
回溯法(探索与回溯法)
分支限界法
算法的重要性就不在多说了,《剑指 offer》 + Leetcode,把这 2 处算法题都拿下,国内任何公司的手写算法,将没有太大的问题,先把《剑指 offer》上面的 60 多道题刷 2 遍,再把 Leetcode 上面的 easy 以及 medium 刷至少 2 遍,hard 确实难度比较大,看个人时间了。
推荐的网站/资料:
剑指 Offer
LeetCode
《算法-红书第四版》
《剑指 Offer》
《程序员代码面试指南》
《挑战程序设计竞赛》
慕课网:玩转算法面试 从真题到思维全面提升算法思维
2、计算机网络
计算机网络:体系结构(4/7) + 协议 + TCP/IP + 网络安全
基础
各层协议的作用,以及 TCP/IP 协议的特点。
以太网的特点,以及帧结构。
集线器、交换机、路由器的作用,以及所属的网络层。
IP 数据数据报常见字段的作用。
ARP 协议的作用,以及维护 ARP 缓存的过程。
ICMP 报文种类以及作用;和 IP 数据报的关系;Ping 和 Traceroute 的具体原理。
UDP 与 TCP 比较,分析上层协议应该使用 UDP 还是 TCP。
理解三次握手以及四次挥手具体过程,三次握手的原因、四次挥手原因、TIME_WAIT 的作用。
可靠传输原理,并设计可靠 UDP 协议。
TCP 拥塞控制的作用,理解具体原理。
DNS 的端口号;TCP 还是 UDP;作为缓存、负载均衡。
HTTP
GET 与 POST 比较:作用、参数、安全性、幂等性、可缓存。
HTTP 状态码。
Cookie 作用、安全性问题、和 Session 的比较。
缓存 的Cache-Control 字段,特别是 Expires 和 max-age 的区别。ETag 验证原理。
长连接与短连接原理以及使用场景,流水线。
HTTP 存在的安全性问题,以及 HTTPs 的加密、认证和完整性保护作用。
HTTP/1.x 的缺陷,以及 HTTP/2 的特点。
HTTP/1.1 的特性。
HTTP 与 FTP 的比较。
推荐资料:
《计算机网络 自顶向下方法》
《计算机网络》
《TCP/IP 详解 卷 1:协议》
《UNIX 网络编程 卷 1:套接字联网 API》
《Linux 多线程服务端编程》
《图解 HTTP》
3、操作系统
基本特征。包括1、并发;2、共享;3、虚拟;4、异步。
基本功能。包括1、进程管理;2、内存管理;3、文件管理;4、设备管理。
系统调用。包括大内核和微内核。
中断分类。包括1、外中断;2、异常;3、陷入。
六大高并发 IO 模型的特点以及比较。
多进程,多线程,进程池,select、poll、epoll 的原理、比较、以及使用场景
epoll 的水平触发与边缘触发。
进程/线程/协程 + 内存管理 + 页式/段式 + 中断机制
进程与线程的本质区别、以及各自的使用场景。
进程状态。
进程调度算法的特点以及使用场景。
线程实现的方式。
协程的作用。
常见进程同步问题。
进程通信方法的特点以及使用场景。
死锁必要条件、解决死锁策略,能写出和分析死锁的代码,能说明在数据库管理系统或者 Java 中如何解决死锁。
虚拟内存的作用,分页系统实现虚拟内存原理。
页面置换算法的原理,特别是 LRU 的实现原理,最好能手写,再说明它在 Redis 等作为缓存置换算法。
比较分页与分段的区别。
分析静态链接的不足,以及动态链接的特点。
推荐资料
《现代操作系统》
《深入理解计算机系统》
《UNIX 环境高级编程》
《Unix/Linux 编程实践教程》
《鸟哥的 Linux 私房菜》
《The Linux Command Line》
4、Linux + C/C++
C/C++:指针的理解、虚函数相关、类模板,深拷贝与浅拷贝,对象机制,砖石继承等基础语法底层。
深入C++ + 深入模块 STL中容器底层实现以及空间配置器。
boost 库中的智能指针的底层实现。
Linux内核源码剖析(内核数据结构)。
Linux:常见命令的使用,grep、find、xarg、以及Linux查看内存,进程等命令,vim 的熟练掌握、Linux 系统相关的知识。
文件系统的原理,特别是 inode 和 block。数据恢复原理。
硬链接与软链接的区别。
能够使用常用的命令,比如 cat 文件内容查看、find 搜索文件,以及 cut、sort 等管线命令。了解 grep 和 awk 的作用。
僵尸进程与孤儿进程的区别,从 SIGCHLD 分析产生僵尸进程的原因。
5、设计模式 + 数据库
设计模式:单例模式必须手写饿汉式、懒汉式,其他模式了解会讲就行。
mysql 和 redis,底层实现,多表查询,索引问题。
手写 SQL 语句,特别是连接查询与分组查询。
连接查询与子查询的比较。
drop、delete、truncate 比较。
视图的作用,以及何时能更新视图。
理解存储过程、触发器等作用。
系统原理 ACID 的作用以及实现原理。
四大隔离级别,以及不可重复读和幻影读的出现原因。
封锁的类型以及粒度,两段锁协议,隐式和显示锁定。
乐观锁与悲观锁。
MVCC 原理,当前读以及快照读,Next-Key Locks 解决幻影读。
范式理论。
SQL 与 NoSQL 的比较。
MySQL B+ Tree 原理,与其它查找树的比较。
MySQL 索引以及优化。
查询优化。
InnoDB 与 MyISAM 比较。
水平切分与垂直切分。
主从复制原理、作用、实现。
redo、undo、binlog 日志的作用。
Redis 字典和跳跃表原理分析。
使用场景与 Memchached 的比较。
数据淘汰机制。
RDB 和 AOF 持久化机制。
事件驱动模型。
主从复制原理。
集群与分布式。
事务原理。
线程安全问题。
推荐资料
《MySQL 必知必会》
《高性能 MySQL》
《MySQL 技术内幕》
《Redis 设计与实现》
《Redis 实战》
《大规模分布式存储系统》
6、系统设计(扩展加分项)
性能
伸缩性
扩展性
可用性
安全性
分布式
分布式事务
CAP
BASE
Paxos
Raft
分布式锁
分布式 ID
集群
负载均衡
Session 管理
缓存
缓存特征
LRU
缓存位置
CDN
缓存问题
一致性哈希
攻击技术:XSS;CSRFSQL 注入;DDoS
消息队列:消息模型;使用场景;可靠性
高并发系统
秒杀系统
限流算法
服务熔断与服务降级
服务拆分
幂等性
远程服务访问方法
微服务
SOA
系统设计:Web 页面请求过程;二维码登录:TinyURL:KV 存储系统:搜索引擎
中间件:RabbitMQ;ZooKeeper;Dubbo;Nginx
其它知识:新技术;开源项目。
3、正文
春招经验:
内推阶段:一般 3 月份以电话面试为主,少量视频面试(BAT级别的敲算法),有些公司内推阶段也得答笔试 (bat是直接面试的)。
正式阶段:到 4 月份的时候,一般大部分公司都会来各个城市,此时以现场面试为主,这个时候积极主动一点,多跑跑,多去试一试。
前面说了,不管是春招还是秋招的面试,基础 + 算法 + 项目,缺一不可,对于基础 + 项目,我觉得是比较容易学习与准备的,关于项目,如果自己所在实验室有跟着老师做过的,好好整理一波!如果没有的话,去 GitHub 上找一些开源的项目,自己down下来好好研究一番,思考能否改进,项目数量不在多而在精,关键在于自己是否深入理解了,1-2 个项目即可。
面试准备的时候,要注意项目的背景需求,项目中的亮点,以及主要使用的技术点,遇到哪些困难,怎么解决?
这几点,面试官会问的很细的!
针对不同的岗位,大家可能还是有些不一样的(体现在语言+深入的方向+项目),基本上可以按照前面整理的那个思路进行准备,是比较全面的,也是一个平时、秋招的学习方向,至于相关推荐的书籍、视频资料在公众号之前的文章也有发过,自己多去搜索下,结合自己的情况,制定符合自己的一套找工作的打法!
自身经历:春招实习一般招聘的都是大厂,可以多投几家,也是相对容易,争取一些机会,增加经验。接下来说说自己主要春招实习内推的公司经历:
下面开始
3月-5月:
新浪微博,web 搜索业务部门,数据挖掘岗位
面经:
1、自我介绍。
2、两道算法题:一道格子取数,典型的动态规划(P1);一道 TOP K 问题,在 100 W 个数中求前 10 大的数,典型的堆排序,构建一个大顶堆(P2)。
3、数据挖掘常用算法(P3)。
4、手写快排+归并排序(P4),说一下复杂度(时间和空间),有没有哪里可以改进的地方。
5、如果解决机器学习中数据不平衡的问题(P5)?
阿里云-智能事业群基础设施事业部-C++ 研发工程师
面经:
4.24 中午 12 点 阿里一面:
一开始,对着简历,聊项目,让自己介绍一下自己和做过的项目,然后针对你简历上的某个项目开始问了,你这个这个是怎么实现的?为什么要这么设计?为什么要弄两个缓冲区?服务器和客户端如何通信?感觉阿里面试官聊项目真的非常细,但是态度一直很温和,也不着急,一时回答不上来,我就说,这个问题我之前没考虑过,给我一分钟思考一下等等,然后面试官说没关系,这点感觉阿里的面试官挺好的,比较有耐心,在一定程度上缓解了自己的紧张。
简单回忆下。
1、MYSQL数据库几种索引类型?分别讲一下简单使用(P6)。
2、数据库索引底层实现(P7)?
3、12306 网站 现在有 1200 票,但是同一时间有 2000 个客户买票,如何解决超卖现象(P8)?
4、一棵树层次遍历存到数据库,请问数据库表如何实现?有哪几个字段(P9)?
5、堆排序主要有哪些应用场景(P10)?
6、栈和队列有哪些应用场景(P11)?
7、进程和线程区别?进程间,线程间通信方式(P12)?
总结:其实都是一些基础的问题,基础一定要平时积累!
今日头条-财经业务部-后台研发工程师
面经(一面):
1、简单自我介绍,说一下你未来的规划?
2、聊一下你的简历的项目,项目的背景需求;主要的亮点;难点;自己是怎么解决的
3、还是项目:实现一个客户端的推流 API 接口,如何实现?四个线程的协同处理?点播回放的具体实现?两个缓冲区如何工作的?
4、HTTP 报文的格式,HTTP的 keep-alive 机制和 TCP 的区别?get 和 put 方法区别(P13)?
5、了解哪些文件一致性校验的哈希算法(P14)?
6、ipv4 和 32位int 转换函数(P15)?
总结:头条的面试官人真的超 nice ,非常专业,态度和蔼,但是要求真的很高!
上海-快牛科技-基础业务部-后台研发工程师
面经:
自我介绍之后
现场面:
1、简单自我介绍
2、聊一下你的简历的项目,项目的背景需求;主要的亮点;难点;自己是怎么解决的?
3、请你设计一个全局的并发集群订单号生成的一个服务?说一下设计思路?
4、单词翻转?
5、简单说一下你未来的规划?
电话面:
1、简单说一下你未来的规划?为什么想来上海?
2、如何保持每一天都有进步?
3、平常喜欢干什么?
4、项目中遇到什么最大挑战?
5、最有收获的一件事是什么?
6、如何处理自己的负面情绪。
PS:现场一面+电话面之后,大概过了一个月时间,突然接到 HR 小姐姐电话,给我发了口头实习 offer,工资还蛮满意的,后来由于各种原因去不了,就拒绝了这个实习 offer。。。
美团-广告变现部门-后台研发工程师
面经:
走的内推,笔试完了,大概过了一个礼拜接到面试电话。
自我介绍之后
1、手写快排+归并+堆排序(made,就是当时现场堆排序有点记不清了,导致一面GG)。
2、两道算法题:一道数组连续 k 个元素序列最大和;一道斐波那契数列递归和非递归代码实现;
3、HTTP 和 HTTPS 区别?
4、HTTPS 有哪些好处?如何实现加密?
5、HTTP 常见报文格式,HTTP 的 keep-alive 机制和 TCP 的区别?
6、HTTP 请求方法有哪些?
7、HTTP 状态码?
8、HTTP 具体应用?
9、HTTP /2.0 说一下?
10、GET 和 POST 比较?
11、二叉树遍历:前序,中序,后序?
这次面试,面了很多 HTTP 的知识,准备的不是太好,面完,就感觉应该 GG了,果然面试官送我下电梯的时候,转身给我说一句话:最近招人越来越严了,你们应届生过来面试,不会太要求其它框架性的东西,就是考你们基础知识的能力,是否扎实,是否有潜力。
BIGO 北京分部-后台研发工程师
面经:
这场面试很尴尬,全程都不知道自己在说些什么。
自我介绍之后一面:
1、按 Z 字形打印二叉树?
2、说一说快排和堆排序?
3、说一说 Linux 的软连接和硬链接?
4、说一说熟悉的 Linux 命令?
5、磁盘存储很多碎片化的小文件会带来什么问题?
二面:
1、手写判断一棵树是否二叉平衡树?
2、手写判断一棵树是否二叉查找树?
3、说一说智能指针底层实现?
4、写一个简单版的 C++ 智能指针?
5、说一说 C++智能指针的引用计数?
6、剖析过什么源码?STL 什么源码能说一说吗?
总结:
态度要端正,手写代码的时候一定要多练一练,平常要多练练手写代码。简历上写的剖析什么代码源码一定要自己狠明白,清楚,否则面试官会问得很细的,不懂的不要随便给自己挖坑啊,不能着急!
杭州-恒生电子-基础架构部-后台研发岗位
面经:
1、自我介绍。
2、聊一下你的简历的项目,项目的背景需求;主要的亮点;难点;自己是怎么解决的?
3、为什么想来杭州,你的未来规划?
PS:这场面试之后,感觉面得挺好的,最后没有消息,所以说,校招面试玄学是有一定道理的,把握住心态,争取每一次都有总结和收获,就不怕下一次的面试!
北京-一家小公司,做云计算的
面经:
1、自我介绍
2、C++ 的浅拷贝和深拷贝?
3、了解哪些哈希函数?
4、C++的对象,类和模板?
4、聊一下你的简历的项目,项目的背景需求;主要的亮点;难点;自己是怎么解决的?
5、未来的打算和规划?
北京-一家小公司,做视觉图像处理的
1、自我介绍
2、C++ 的构造函数,拷贝构造函数?
3、C++ 的 move,bind 语义?
4、C++ 的 Copy on Write?
5、算法题:LeetCode-打家劫舍(动态规划),递推方程:dp[i]= max(num[i] + dp[i - 2], dp[i - 1])。
6、设计一个 视频下载函数的 API?
7、聊一下你的简历的项目,项目的背景需求;主要的亮点;难点;自己是怎么解决的?
通用电气 GE-医疗业务部门-综合岗位
最近的一场外企面试,给我留下了很深的印象!面试过程全程都很愉快,收获很多!
公司:通用电气 GE
现场面试岗位: 嵌入式软件开发工程师
面试时间:两个小时。
第一次外企面试,感觉非常好。
面试官态度很和蔼。
详细问了项目,非常细。
最后半小时聊聊天,英文交流´・ᴗ・`
1、快速傅里叶变换?
2、最近学了什么算法?
3、大学主要学了啥?
4、生命中最 touch time ?
5、聊聊家乡 hometown ?聊聊家庭 family?
6、如何保持每天都有所进步? every day progress ?
其实我的语速还可以适当的放慢一点,表达更清楚一些,以至于面试官一直怀疑简历上的项目是不是自己写的,实在是尴尬了。
面试官一直问我开发板的 cpu 型号是哪个?其实我真的想说我记不清了,但是面试官好像不放手,一直追问我后续的有关于嵌入式相关的知识,其实我真的想说这一块记不太清了,后面这块答的不太好。
最后聊了聊,面试官给了我一些建议:
1、职业规划不要设定固定范围,不要受一些约束,不要用框框架架来约束自己。
2、要保持对新事物的好奇心?青春不要荒废!
3、不能只局限于自己的本职工作,对不是自己负责的范围要多保持热情,思考一下自己能不能帮上忙,能不能对一些关键的架构,网络,拓扑结构,调整,看看能不能对软件的性能提升有没有帮助。
4、学算法,不能留于表面,更重要的要去,肯去专研算法底层的逻辑,底层算法逻辑其实都是数学,掌握核心,底层逻辑,才能有机会,有新的想法,才能有创新。
自己的启发:
1、英语口语要学好啊。保持一个日常的交流没问题。
2、最后跟我谈谈心,聊聊职场,聊聊人生,感觉收获很大!
总结:
没事多去面一面,跟前辈们多多交流,知道自己几斤几两,自己的表现哪里还可以做的更好,知道自己的缺点,弥补自己的不足,同时也能发挥自己的优点,也是一种学习的另一种方式。
春招的面试经验大概就是这么多,后面会陆续更新。
欢迎大家一起交流~
推荐阅读
如何超过大多数人
周末分享-Linux 相关资料(基础知识,系统开发,高并发网络编程)
这篇关于我的春招之路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!