【实习】百度搜索架构组-服务端研发工程师(c++)
招聘信息
工作内容:
负责百度最核心的搜索工程架构,最前沿的智能化搜索方向。
为在搜索大规模应用深度学习、机器学习等最先进前沿AI技术提供工程落地与性能优化。
从工程视角覆盖模型全周期进行优化,降低资源成本,提升研发效率。
岗位要求:
- 具备良好的数据结构与算法基础。
- 熟悉Linux操作系统,计算机网络等,基础知识扎实。
- 熟悉C/C++/JAVA/Python/Go中的一种、
- 有CUDA编程/系统级编程/网络编程项目经验加分、
- 有深度学习/机器学习项目经验加分
面试流程
自我介绍
1.机械专业的,自学的编程。对编程感兴趣?在学校参与过编程相关的比赛?
2.之前参加过一次实习?“沈自所”关于“机器人”的实习,简要介绍,几乎不问。
3. 三个项目经历从哪里来?挑一个做的好的说说吧。
项目:google测试框架
- google测试框架的简单介绍?(实际的工程应用人员怎么应用google测试框架);你实现了里面的什么功能?是怎么实现的?
- cmake与makefile有什么区别? makefile有什么不爽?
思考点:a. 依赖关系(makefile一个大工程 3000+);b.跨平台(linux,windows);c.文件存储,生成文件路径(每个目录下弄一个);d. cmake当成编程语言
linux下的常用的命令
- 简述你会哪些命令?
权限;数据处理(tr,cut);linux三剑客(grep, sed);网络 - 会awk吗?:快速的统计,比较常用,python用的也比较多(大型的文件)
题目:对于一个几万行的文件,每行的格式是tm=0, sz=10, pdt=3,inf=8,平均的pdt是多少? - 看某个端口被一个进程占用
lsof -i:8000
下面方式可以吗?netstat -alnt | grep "8000" | grep "local"
通过进程id来找进程的具体名字
计算机网络
三次握手:
- 简单描述(通过了)
四次挥手:(主要说说状态的转换)
- 三次挥手,为什么必须要四次挥手?time_wait;
- 不能发送,只能接收?
- 为什么需要2msl的等待?
- 大量的time_wait状态可以怎么解决?服务端,第二次挥手,到客户端给他发消息? linux下的配置项?
运维帮忙解决了。
epoll,与select,poll,epoll是怎么解决select的问题;
- 函数原型与操作过程(似乎不重要)
- 轮询
- 红黑树
- 共享内存(fd拷贝,用户态和内核态的切换)
其他项目
用到了哪些原子操作? 互斥锁和条件变量是原子操作?
多线程常用的锁:互斥锁,读写锁(共享锁),自旋锁(不会)
多线程与多进程的区别:
- 资源的切换
- 一个线程被cutdown,calldown,
- 资源分配,cpu调度
- 安全性,稳定性;
- 控制难度?
c++语言
C++的话,你对c++,比较熟?
你对容器方面了解:list,queue,map,vector
vector,预先分配一段连续的内存?8个已满,push_back之后,自动扩容。自动扩容,内存怎么重新布局?
2倍2倍的扩。看看计算机底层的知识。
编程题
给你一个链表头,移除倒数第n个元素,并且返回链表头
1->2->3->4->5
k=2
1->2->3->5
最好遍历一次
当看k很大的时候,怎么办?直接返回
带入边界条件(很容易溢出)
然后带你逐行的分析代码?整数数组nums按升序排列,值互不相同,经历过旋转,旋转位置未知,[0, 1, 2, 4, 5, 6, 6],旋转后[4, 5, 5, 7, 0, 1, 2];
输入:一个旋转后的数组,目标值 target
输出:存在则输出下标值,否则输出 -1
思路:二分来做,单边比较[5, 6, 7, 8, 9, 10, 1, 2, 3, 4] a.找2 b.找3
反馈:
- 不了解c++,有c的基础也是ok
- c++11风格变化很大,新特性;c++03,c++98使用起来不是一个语言
- stl底层的原理还是不够深入,vector的动态扩容,什么时候用list,什么时候用vector,map的底层实现。
- 继承与派生,接口与抽象,原理
- 工程实践:分布式;数据库(百度搜索用的相对少,操作系统的内存的操作)
- 计算机网络有所了解,但是对于细节不够熟练
二面
项目准备
面试经历
网络出现问题 -> 可以用微信小程序
自我介绍 感谢 -> 计算机+电子基础课(东大计算机A)-> 兴趣(×技博),实习,学生活动 -> 机器人 -> c/c++ -> 计算机底层
读研的研究方向和项目? 所以的项目经历是在自动化所实习的事情。
与专业不是相关,是工作还是兴趣?但是互联网就业有很多方向,你是偏底层,学习路径是很陡峭了,你为什么这样选择?c++面对是技术体系,能具体说说嘛?基本上是自学的? -> 不错
写个代码:可以用本地的环境
快速排序:10min写完 -> 简单说一下思路 -> 随机数生成 -> arr定义全局 -> 写的挺好的
15min -> 用两个栈实现一个队列 -> 讲一下思路 -> 举例子
简历:C/S模型文件传输与聊天
为什么用TCP协议?
你进程间的通信为什么用共享内存?(不用管道,消息队列,文件)?是你现有的认知认为共享内存快,还是你进行了测试发现共享内存适用高并发的?涉及到竞争,这是什么场景,怎么去解决?(自己出了个场景)?文件传输用socket,socket是怎么流程?TCP有三次握手出现在哪一个阶段?四次挥手出现在哪个过程?(客户端cltr + C -> signal -> close -> flag -> 服务端 close)? socketfd实际发送的是什么(FIN)?继续吧,发了FIN之后,发生了什么? 常见问题,为什么服务端接收到客户端FIN,发了个ACK之后又发了一个FIN过去,为什么比三次握手多一次?(想不出来,时间所限)?客户端有shutdown, shutdown和close的区别?你知道单工和双工?如果是server端的fd已经处于关闭状态,client再次发送一个请求?(不是建立连接的请求,client不知道server端关闭了,还是想继续发文件),面试官再举例,server端和client是不同步的,正常下是你的流程,FTP服务器突然挂掉了?(connection refused),我又说了端口复用?你的server端是怎么支持多客户端下载,epoll是接收请求只要是触发监听,多个客户端同时要拿文件?(目录用文件锁)? 更好并发的实现方法?(尝试读写锁,还是考虑同时争抢一个资源)。加入client1, client2想只下载自己的文件,一定用锁吗?(客户端名字 + 字符串匹配)?各自文件放在server端处理,你有了解多线程?(技术栈点歪了,多线程偏多,不过你的技术思考很深入了)?你有了解机器学习和深度学习?(背景知识是必要的)
【搜索架构部】-【模型架构组】部门介绍
服务端相关的开发,搜索最核心最底层,
【模型架构组】:深度学习(AI) 用于搜索,辅助算法开发人员,性能优化。主要运行载体是GPU,百度资源的昆仑(上万块的卡)。传统搜索是基于倒排、接词、词与词的召回;智能化搜索(输入词语-> 深度学习特征 -> 相关性比较 -> 向量检索)
【实习】:自我驱动很有收获;校招提前批,不用参加校招,职业发展很正;技术为核心,技术人员的地位很高;工作强度ok(字节,快手,拼多多很累),弹性工作;实习生培养和正式员工培养是一致的,实习(90%工资);专职的mentor(很可能围绕他的内容一直做),不只是产出,还有成长,不只是螺丝钉;进来是P3, P4,希望做经理,总监,高级工程师;应该有租房补贴?
个性化问题
- 多久来实习,实习多久?
- 你是哪年?很年轻,百度呆个几年,市场价值很好!2-3年后很多人来挖你。
- 湖南人;来北京;
三面准备
经理面:思路,表达能力,一些技术;正常发挥就好;比较自由;