我的春招之路

我的春招之路

[图]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  相关资料(基础知识,系统开发,高并发网络编程)

我的春招之路