春招开始了!

现在已经有大厂开启春招了,牛客网上的暑期实习面经也开始多起来了:7ecafe60d3ed6ac26eb56a56c8fad723.png

不过目前大厂的面经还不多(除了字节已经开始:

0c5623fc3358bbbc62ec9e78428129f0.png

按去年时间点,估计 BAT 春招全面铺开应该是 3 月初的样子,所以还有半个月左右时间复习。

最近呢,也有很多小伙伴都在私信问我要准备到什么程度才能去面试,所以我在这再给大家发一下一些高频问题。

想要拿到大厂C++研发的话,下面这些技能应该是要掌握绝大多数的:

一、C/C++语言基础:

  • 包括基本关键字含义,语言底层实现机制(虚函数、引用等),面向对象还有模板泛型编程

  • 编译链接机制、内存布局、对象模型

  • 智能指针 RAII ,手写简单版智能指针

  • C++11 部分新特性 右值引用、完美转发等

  • 部分设计模式,比如安全实现单例、观察者模式这些

  • STL源码部分实现原理

这部分有时间的可以找到 C++ Primer、Effective C++ 系列、 STL 源码剖析相关章节读一读,比较重要的是深度探索 C++ 对象模型这本书,这本书前面一部分是将对象模型的比较适合了解C++底层一些机制,建议有空必读

二、OS && Linux:

  • 进程线程,一并学习fork vfork clone这些系统调用

  • Linux内存管理, 包括物理内存、虚拟内存、分页和分段机制、slab分配器这些东西,面试官问到malloc这些都能扩展讲一讲,一并需要了解brk malloc这些函数内部实现

  • 了解文件系统,特别是VPS,看完这部分,对于软硬连接和Linux读文件是怎样一个过程这类问题就很简单

  • 死锁相关、还有信号量同步原语怎么实现消费者生产者、读者写者、哲学家就餐这些

  • Linux 进程调度可以了解下,比如CFS

  • 还有就是Linux下进程的布局,这其实问到C++内存布局就可以往这个方向聊

  • Linux下程序是如何被编译链接的,静态链接、动态链接,如何被加载执行的,这部分推荐csapp第七章,或者程序员自我修养

  • 常见命令,比如性能监控top ps , IO监控 iostat多熟悉下,比如查看网络连接状态netstat,lsof这些

  • 进程间通信机制,最好能够说一点内核实现,比如管道内核是如何实现的(匿名Inode)

三、数据库

尽量做到能写中等难度的连表查询sql,会分组、一些函数count sum这些,还有最重要的就是数据库原理

  • 索引,有哪些分类,B+树,哈希索引,对于B+树相关的问题也要熟悉

  • 事务,特点(ACID), mysql存储引擎默认支持的事务级别之类。我反正被问了两次

  • 锁,封锁方式,如何避免死锁

  • 数据库设计关系范式也可以了解下

四、计算机网络

  • TCP是重中之重,比如拥塞控制、流量控制、快速重传这些,nagle算法,列一些典型问题吧:

    既有和网络编程结合的问题,也有问TCP原理本身的

    • UDP 如何实现可靠数据传输?

    • TCP如何拆包、解决粘包

    • TIME_WAIT过多怎么造成的,如何解决

  • 套接字编程基本的要会,socket bind listen connect close accept这些函数也要清楚

  • 进一步就是Linux五大IO模型,三种IO复用方式,select poll,epoll

  • ARP、DHCP协议怎么工作的

  • DNS协议

  • HTTP、HTTPS协议

五、算法

刷题,系统的分类学习,提升很快

  • 链表,以及各种题型,去leetcode按标签刷

  • 二叉树、平衡二叉树

  • 二分查找以及几种变体,比如lower_bound upper_bound

  • 几大排序算法,稳定性,极端情况,做到手写快排、堆排bug free,了解下快排优化思路

  • hash

  • 贪心、回溯、dfs、bfs,动态规划

  • Tire树

  • 手写LRU, 双向链表+hash

  • 海量数据处理思路

  • 可以了解一下KMP这类字符串匹配算法

六、多线程

  • 基本的POSIX线程api

  • 互斥锁和条件变量我觉得必须掌握的

  • 其它的就看你又没有时间了

七、项目

  • 理想的项目应该是出于自己的兴趣做的各种轮子,比如http ftp服务器,实现加密算法,文件压缩,p2p聊天,网络库,甚至mini os,k-v数据库。但是短期内这些可能都不是很好准备,所以大家按照自己已有的完善下吧。做到有测试、有性能改进方面的思考。

  • 我的经验是七八场下来项目提问时间没超过10分钟,而且提问的主要点是如何测试、如何改进的,以及效果

八、常用组件

  • Redis

  • Nginx

这些都是最好了解下原理,就算没用过,也去搜几篇博客看看。

对于 Java 方向,其实基础差不多,区别就是 Java 语言的 JVM、垃圾回收算法、线程、并发等等。

总之,很核心的一点就是别"偏科",我相信大多数人包括我自己在复习的时候其实会更喜欢在舒适区的,就是对于自己比较熟悉的部分越愿意去看,而薄弱的地方反而有点抵触。

所以大家一定要对薄弱的地方投入更多的精力,面试是各个方向都要考查的,有时候其实问的并不深,所以广度优先的复习特别重要,如果对于一些很简单的“常识性”问题都答不上的话,给面试官的印象会很差。

C++ 开发的同学可以参考一下我上面列出的一些点,对照的去补齐。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值