写在前面
目前拿了几个比较满意的意向了,秋招暂时结束了,随便写点东西总结一下。以下内容仅供参考。
关于岗位
我是只会C++和Python,所以主要投了C++后台开发岗、基础架构,还有一些游戏开发岗。
关于实习
实习挺重要的,建议7月前去实习,7月份开始准备秋招。另外实习经历好好准备一下,每次面试大概率问道。主要关于实习期间做的项目,项目的背景,自己实现的部分,遇到什么难点,还可以怎样优化,收获等等。
关于笔试
多刷leetcode,我是每日一题加周赛,保持手感。笔试大多数公司都是ACM模式,就是需要自己进行输入输出,这个还是需要注意一下的,平时熟悉一下这种方式。有些笔试题会直接给多行输入,不提前给出有多少行,没碰到过的话就不知道该怎么输入。对于不会做的题可以骗一些分,如暴力实现、忽略一些难处理的情况等。 有些公司会出一些选择题,基本都是一些基础、语言相关的,全靠平时的积累了。
关于面试
一般笔试不太差的话都能进面试,不过今年有些笔试ak都没进,太卷了。 面试主要问一些项目、基础还有编程题。
编程题
面试时的编程题一般比笔试简单,一般流程是先说一下思路,然后开始写,写完自己主动debug。写的时候代码的规范也比较重要,代码规范的话平时自己写的时候就要留意,养成习惯,c++的话可以参考谷歌的c++代码规范。
项目
项目的话我就写了一个实习项目以及两个自己写的小项目。实习的项目不算难,所以大多数都是介绍一下项目,说一下难点收获啥的就完事。自己写的小项目就经常问的比较深入,我一个项目是c++人手一个的服务器项目,我是参考陈硕的muduo来写的,大部分面试题在陈硕大佬的书里有出现过。常见的有线程池的实现,定时器的实现、时间轮和时间堆,epoll ET和LT编程时注意什么,非阻塞和阻塞,多个epoll和一个epoll有什么优劣,双缓冲异步日志的实现,sigpipe信号是什么,如何知道TCP对面断开连接,TCP nagle算法,缓冲区满了怎么办,怎么把你的服务器修改成代理服务器,为什么是多线程的跟多进程(nginx)相比有什么优劣,怎么压测的,性能瓶颈是什么。
基础
一般叫八股文,就是有格式化、固定化的答案的题目,不过现在大多数公司都不局限于问八股文了,更多的会衍生开来,就是越问越深。随便举一些常见的题目吧
c++
c++岗位c++基础基本是必问的,可能因为c++太难了
- c++内存管理:这个算是最高频了,一般会问虚拟内存中各区域,然后问一下堆和栈,malloc和new,更深入就问malloc实现,可能会延伸到tcmalloc实现,此外还有内存泄露,gdb调试coredump等问题
- 关键字:static高频,几乎必问,const ,inline(说起来inline现在好像没啥用了,内不内联全看编译器了),然后还有override,volatile,mutable等
- 多态:高频,静态多态和动态多态,虚函数的实现相关
- 类:继承和组合
- stl:主要问常用stl的实现,迭代器失效相关
- 指针:智能指针的实现,shared_ptr循环引用问题
- RAII:算是c++一个特性,确定性析构算是c++与其他高级语言相比最大的区别之一吧。
- 原子变量:比较低频,一般shared_ptr会问到一点,其他的像memory order,内存屏障之类小概率被问道。
- 编译过程,静态链接和动态链接
- 其他的还有有些根据代码答输出是什么,主要会考构造析构函数、虚函数的调用、sizeof一些类的大小什么的,平时关注一下即可,如果问一些特别偏那也没办法
数据结构
比较简单,用多了就熟悉了
- 数组和链表区别
- 栈和队列,用链表实现栈和队列,栈和队列的互相实现
- hash表,解决冲突方法
- 平衡二叉树,红黑树
- 布隆过滤器
操作系统
c++岗位免不了问到linux操作系统,自从学了mit的6.S081倒是希望多问点操作系统。
- 进程和线程:超高频,网上有教科书式标准答案,我一般会加一点在linux操作系统里的实现(它们其实都是task_struct实现,只是创建线程时会共享当前进程的一些资源)。有时会问到协程(很奇怪我竟然没遇到过)。还有进程调度(主要有先来先服务(适合较短时间的进程),时间片轮询(适合实时进程),CFS(linux常用的公平调度算法))
- 进程通信:六大金刚,一次通信最快的是哪种(信号)
- 锁: 主要用于线程同步,锁的种类、实现、应用场景
- 虚拟内存:高频,用户态访问一个地址全过程(以x86-64系统为例,先查快表,没中就通过mmu获取物理地址,如果没有该地址映射,发生缺页中断,该core dump的core dump,不该的就分配内存,内核完成页面映射返回用户态重新执行,之后根据物理地址查cache,没有一级cache命中就去内存读取数据)。有一次还被问道查cache是物理地址还是虚拟地址,当时不太确定,一顿分析感觉都可以,之后看了csapp,才知道其实这是两种流派,目前大多数架构都是根据物理地址来查的。
- 用户态内核态度切换,fopen函数的实现,ls的实现,kill的实现,文件描述符的实现,信号的实现,信号都能被屏蔽吗,proc文件系统
- linux的一些命令,top, ps, df, grep, find, netstat, tcpdump, awk, sed等,其中top会问到里面的一些指标,比如us, sy, load average, buffer/cache
网络
c++服务端开发必定问到网络相关问题,主要以TCP为主,光一个TCP就能问好多
- TCP:和UDP区别,拥塞控制,三次握手,四次挥手,客户端服务端状态的变化,网络编程linux原生api(socket, listen, accept, connect)对应什么状态,time_wait,syn 攻击
- http: 报文格式,TLS握手,状态码
- cookie ,session
- 网络包从一个局域网到另一个局域网的全过程,ARP协议作用
数据库
c++岗数据库感觉问的就不是很多
- 写sql:没怎么写过,一般只说个思路,然后直接说不会写。。。
- 索引:索引是什么,b+树、b树、hash索引的区别,特别是b+树的优势,聚簇和非聚簇索引最左匹配等
- 事务,ACID特性,分别是怎么实现的,怎么解决幻读
其他
- 智力题(没怎么问到过)
- redis:了解过,但是面试问到直接说不了解
- 分布式:没问到过
- 自己的一些意愿,想做什么,职业规划啥的,感觉挺重要的。一般一面反问的时候了解一些部门的业务,基础架构可能有计算、存储、网络方向之类的,然后二面三面之前可以了解一下这个方向,这样被问到对面试部门的了解的时候就不会没话说了,可能可以加分。
- hr面试的一些问题,一般常见的问题,没准备过不知道说什么就很尴尬, 比如团队合作时遇到的冲突怎么解决(我就没遇到过什么冲突,大家都和和气气的)。
总结
几个建议:
- 早点确定自己的找工作的方向,感觉算法、c++、java后端差异还是挺大的,今年不是那么好转了
- 早点实习,早点投(虽然早点投还是会被泡池子排序,总比晚点没hc了好)
- 好好准备实习/项目经历,简历上每一句话都会被问到
- 基础知识相关最好了解底层实现,看过源码最好了
- 多刷题
|