[图]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、最后跟我谈谈心,聊聊职场,聊聊人生,感觉收获很大!
总结:
没事多去面一面,跟前辈们多多交流,知道自己几斤几两,自己的表现哪里还可以做的更好,知道自己的缺点,弥补自己的不足,同时也能发挥自己的优点,也是一种学习的另一种方式。
春招的面试经验大概就是这么多,后面会陆续更新。