背景
先说下背景吧,我是2019年毕业的本科生,985非科班,而且是和计算机专业八杆子打不着的那种非科班。大二的时候打球认识了我们学校一个计算机专业的学生,听他说互联网现在薪资好高,写代码特别有意思,于是开始跟着他学了一些写代码的知识。我之所以说是“写代码的知识”而不是计算机知识,是因为我当时是直接上手学Java Web那一套东西,什么数据结构、操作系统、计算机网、数据库完全没看直接就开始搞“xxx管理系统”这种玩具项目了,写出来的代码现在看来不堪入目,想想也挺有趣。学得感觉差不多了的时候就开始投实习简历,大三机缘巧合之下进入了广州的一家互联网公司实习。可以说是运气很好了,以我当时的水平,今年再去投这家公司的实习估计一面都过不去。
后来也算是有了大半年后端开发实习经历吧,这家公司也给我发了校招offer。我借着这段实习经历,秋招又陆续拿到了几个互联网公司的offer。后来因为前女友保研到了北京的缘故,我选择了一家大厂的测试开发offer,去了北京。
测开的工作体验
入职以后,发现测开要学的东西还是不少的。Docker、Jenkins、Python、CI/CD啥的。不过干了一阵我就发现,就算是在一家号称技术驱动的大厂,测试开发工程师这个岗位的工作内容还是以业务测试为主。我终于理解各路测开JD上那句“热爱质量保障工作”是啥意思了:所谓测试开发,保障质量是根本,“点点点”是保障质量的重要手段,开发能力也是保障质量必不可少的,但本质上讲,测试开发工程师的开发部分,也是为了测试。
因为有些东西单纯靠点点点很难高效测好,所以需要具备一定的开发能力;因为维护一套稳定的测试环境,能更好地测试,所以需要熟悉Docker和Linux脚本;因为持续集成、自动化测试能更高效地回归已有功能,所以需要懂python脚本和Jenkins;因为测试需要复现问题,定位到是谁的Bug,所以需要熟悉查日志、Linux命令。测试开发工程师,本质上就是一个测试的岗位。很多应届生都在问哪哪哪的测试开发,开发部分占多少比例,我觉得这个问题没有意义,因为测开的目的是保障质量,是测试,如果你所在的业务,点点点能更高效保障质量,那你的工作就是点点点为主,如果写代码写测试工具能更好地保障质量,那你的工作写代码的成分就会多一些。点点点和开发测试工具都只是手段,本质上都是为了测试,如果你本身就不喜欢测试,不喜欢那种费尽心思找到一个Bug的感觉,那你就不适合测开这个岗位。
真诚地告诉各位想投测试开发岗位应届生:各路测开JD里的那一句“热爱质量保障工作”,可能是整个JD里最真实的一句话。建议认真思考下自己符不符合这句话。
转开发的准备
大概在今年2月左右吧,我实在是厌恶了每天高强度的业务测试工作,因为我本质上不是一个喜欢质量保障的人。于是产生了转行的想法,我当时有两个打算,一个是转产品经理,一个是转后端开发。转产品经理这个打算在三四月的时候就彻底取消了,因为我发现以我的背景,别说什么大厂小厂了,想拿到一个正常点的产品经理offer都是不可能的事情。所以,我的出路就确定了:转后端开发。
因为我有过一段互联网公司的后端开发实习经历,而且还是985+大厂出身,所以简历还算比较好写,简历关也好过。接下来就是准备面试了。因为疫情的缘故,春节那段时间没什么聚会,我刚好就利用了这段时间,把leetcode hot100、剑指offer的算法题从头到尾过了一遍。因为前年秋招的时候刷过,所以这个并没有花费我多少时间。春节假期剩下的时间,我把实习时候的做的项目仔仔细细总结了一遍,涉及到的技术也都再认真复习了一遍。然后是选语言,虽然我是写Java出身的,但已经快一年没碰过Java了,而且Java要准备的东西太多了,所以我选择了平时工作刷题用到的Python。后来发现招Python后端开发的公司太少了,于是又速成了一下Golang,花半个多月的时间用Go撸了一个小项目,开始投Go的岗位,当然这是后话了。春节过后就开始边投简历边学习啦。
我一开始投都是小厂,找面试感觉。面了几家后发现,虽然是社招,但由于我非科班+转行,面试还是以计算机基础知识的考察为主。我在操作系统、网络之类的基础知识上的掌握还是欠缺了很多。于是我开始学习这方面的知识。由于我是在职跳槽,而且我们公司工作强度还是很大的,我没有时间从头到尾把《现代操作系统》《TCP/IP协议详解》《Unix网络编程》之类的书从头到尾过一遍。所以我选择的方法是直接在网上看面经,面经上考到的相关知识点都搜出多篇博文或者查书,综合对比来记忆理解。简单来说就是面向面经学习。在这里感谢牛客网的各位老铁,各位大佬的面经对我面试的帮助特别大。
这段时间可以说是我工作以来最辛苦的一段时间,在日常平均10点下班的情况下,还要回家马上开始学习,平均每天学到凌晨两三点吧,然后还要抽出时间去面试。所以还是和各位应届生啰嗦一句,入行需谨慎。
面试
两三个月的时间里前前后后面了十几家公司吧,也拿到了一些offer。因为我那段时间实在是太累了,所以很多面经都没有总结。这里按记忆发一些出来回馈牛客吧。
字节跳动:
最右:
图森未来:
一面:
两道算法题。一道是方程求根;一道是李抠肆舞。两道都是先说思路再写,做出来后还有follow-up。
二面:
1.python的装饰器、functools.wraps的原理、atexit、多种方法实现单例模式。
2.一道sql题,出个场景写sql,怎么加索引,加了之后的执行过程。
3.DNS协议的解析过程。
4.TCP的三次握手。
剩下的忘了,肯定不止这些。
三面:
深挖实习项目,问题没啥代表性。
图森的整个招聘体验是我这两个月以来遇到的最好的,最后HR还会给你面试官的反馈,可以说是很良心了。
快手:
一面:
1.Flask的context、threadlocal。
2.docker的namespace和cgroup、cmd和entrypoint的区别。
3.TCP的三次握手。
4.僵尸进程和孤儿进程。
5.RPC服务的概念,RPC服务一般都怎么做序列化?怎么处理传输层的字节流?
6.散列表、哈希算法,如何处理哈希冲突。
7.反转链表。
8.利口妖凌武
二面:
纯写题。
1.利口妖尔巴
2.利口尔妖武,不能用优先队列做。
3.具体忘了,一道图的题,很像剑指offer里面的岛屿最大面积,反正我用BFS做出来面试官说OK。
三面:
1.原地对链表排序。
2.一个系统设计,排名系统。各种表怎么设计,应该怎么加缓存啥的。讨论了很久。
3.聊了下我现在做的业务,以及面试官介绍自己部门的业务。
快手的面试感觉很注重计算机基础和算法题,项目一点都没问。
音娱时光:
一面:
1.反转链表
2.Z字打印二叉树
3.python的dict 底层是什么 哈希算法
4.python的垃圾回收机制
5.https加密过程 客户端如何识别服务端的证书?比如服务端A发送服务端B的证书?
6.http2 了解么?
7.get和post有什么区别?put和post有什么区别?幂等性是什么?为什么put有幂等性,post没有?
8.tcp的三次握手 作用 流量控制 滑动窗口 如何理解tcp是基于字节流的
9.url请求到服务端返回的全过程。
二面:
1.多叉树的第n层 层次遍历
2.递归太深会怎样?答栈溢出。为什么会栈溢出?python函数中的临时变量存在哪?那很深的时候,用循环会怎样呢?为什么不会栈溢出?
3.什么是阻塞?
4.装饰器是什么?装饰器中的变量是放在哪的呢?
5.cookie和session,session是在哪的呢?sessionid是怎么拿到,怎么查的呢?
三面:
1.反转数字,不能把数字变成字符串。
2.一些基础题吧,我忘了。
音娱时光这家公司给我的面试体验也是比较好的。上网搜了下,是一家A轮创业公司,做日本直播产品的,也做出了一些成绩。
滴滴:
一面:
1.四次挥手 time_wait怎么产生 有什么危害
2.进程间通信 匿名管道和命名管道的区别
3.http 长连接 http怎么解决沾包问题 thrift怎么解决沾包问题
4.统计日志文件中502的次数
5.手机号用mysql中的什么数据类型
6.B+树的叶子结点存什么
7.sql慢查询
8.微服务的理解
9.分析 sql语句的时间
二面:
我不知道二面马上接着一面开始,导致我面完回去开会了。等HR打电话给我的时候,面试官已经等了一会了,深入问了下四次挥手time_wait,我不咋会,面了二十分钟左右就结束了。
木瓜移动:
进去先写一套笔试题,一共是三道:
1.有一个表,只有一个字段队名,四条数据abcd。假设abcd分别代表四只足球队,写一条sql,结果是四只球队之间的对阵。
2.shell脚本,输出一个日志文件第五行出现次数最多的五个第五行的内容。
3.算法题,编辑距离。
一面:
1.讨论上面三道题目
4.IO模型、进程间通信
5.问项目 反射是什么
6.mysql建索引的原则
7.新建一个索引会发生什么
8.https加密过程
9.list和数组什么区别
一面完后就是HR面,问了下薪资,然后告诉我二面面试官请假了,如果有二面的话会安排视频面试。然后就没有然后了。
网易游戏:
一面:
1.如何测试rpc服务的并发量。python的多线程可以么?python有GIL,为什么多线程还生效?
2.Thrift有什么优缺点。
3.dict的底层实现。
4.shell :统计今天的日志的个数
5.shell:统计某某和
6.TCP的拥塞控制算法
7.TCP的滑动窗口协议,滑动窗口的大小是如何计算出来的?
8.进程的内存管理、内存分布
9.python的迭代器和生成器,有什么区别和特性
10.python装饰器、有参数的装饰器和没参数的装饰器有什么区别
11.python里is和==的区别?a=1,b=1,a is b是啥?python会缓存什么?
12.python的垃圾回收机制。除了引用计数还有什么?
13.python源码读过吗?
14.内存中堆和栈的区别?临时变量放哪?
15.线程同步一个进程的什么?
16.阻塞是啥?send recv 阻塞非阻塞的区别?阻塞的线程占用CPU吗?为什么vim一个超大的文件CPU会卡?
17.起几个线程死循环 cpu会爆吗?
18.epoll和select?epoll 边缘触发。
19.链表找环的入口
20.省份定位ip
21.64只球队找到最强的,找前二强的,前k强的。
不止这些,两个面试官内容非常多。还有的我忘了。
二面:
两道算法题吧,都是动态规划的。具体的我忘了。
网易游戏的面试非常有难度,对基础知识都是不断深挖问到你不会为止。
还有几家ihandy、Face++、虎牙直播、伴鱼、smartx啥的,面试内容我基本上彻底忘了,要不就是搞混了,就不发了。
最后再次感谢牛客网各位老铁的面经,对我帮助非常大。
#字节跳动##图森未来##社招##Python工程师##golang工程师##面经#