写这篇文章主要是为了自我梳理,总结和审视自身不足。也希望自己的经历能给非IT背景的同学一点启发和帮助。本文尽量多写干货少说废话,围绕校招中我常遇到的重要考核点展开,其中若有不专业之处,还望各位不吝指正。
先介绍一下自己:女生,港硕应届毕业生,本硕的专业均是电子工程类。本科期间代码接触不多,对数据结构、计算机网络等 CS 基础课程知之甚少。读研后才开始学习 Python,算是勉强入了门。由于对基础知识的了解不足,在秋招中总是被问到未曾接触过,但对 CS 出身的同学而言是很简单和常规的知识点,所以整个秋招都在不断地遇到新问题,再不断地学习恶补。面试结果意料中的惨烈,大厂全部挂掉。痛定思痛,决心春招卷土重来,只为给自己一个交代。最近接受了一个测试开发工程师 SP offer,虽然不是 BAT 这类 T1 梯队的公司,但相较秋招的结果已经非常满意,算是为大半年的校招路画上了句号。
废话说完,现在进入正题。
全文目录:
(1)测试岗位相关
(2)知识点准备
(3)求职相关
(1)测试岗位相关
1. 总览
总体而言,校招的测试岗可分为测试工程师和测试开发工程师。后者对代码的能力要求更高,考核的方面更广泛。
从另一个维度,也可以分为业务型测试和技术型测试。前者可能很少需要写代码,是对产品进行功能上的测试;后者不仅要懂测试,也要懂技术。
我投递过测试工程师和测试开发工程师,故本文涵盖的知识点包括了这两类岗位,以下便不再做区分,皆称为“测试”。
想要入行测试的确需要有所了解,关于岗位的介绍这里不加赘述,可以网上查阅了解,也可以通过公司的招聘官网列出的岗位描述 (Job Description, JD) 进行了解。
大家务必要对测试有个基本的认知:它是做什么的?它的重要性体现在哪?它需要哪些能力?
在面试中,一定会被问到的一个问题:为什么要选测试?你对测试的理解是什么?
其实这个问题就是为了考核你与测试岗的匹配程度,你可以考虑从过往经历(实习、项目、比赛等)中提炼出契合测试岗的一些特征。对非科班同学而言,它可以算是送命题,所以一定要想好怎么回答!!!
除此以外,未来的职业规划也是常见的问题,也需要有所准备。
推荐阅读:
- https://www.infoq.cn/article/pUeQtGSXwDh28deki*gU
- https://xie.infoq.cn/article/4735132da881b9f7e1fc6ea0b
(2)知识点准备
来看看测试岗主要考核的知识点有哪些部分:
1. 编程语言
编程语言一般要求会 Python 和(或) Java。
时间和精力有限情况下,可以只学Python(Python能满足大部分公司的要求)。但是需要对面向对象编程 (Object-Oriented Programming, OOP) 有所了解,而Java就是典型的 OOP 语言,可以通过 Java 对 OOP 进行理论上的大致了解,再用 Python 实现一个类的实例化操作。
推荐的Java入门书籍:
- Head First Java 2nd Edition
PS:我只对 Python 熟悉,故面试官也只会问 Python 相关问题。当然极少部分公司不接受不会 Java 的求职者,这可以查查面经或官网 JD 进行了解。此外,本文的某些术语会以 Python 为准(水平有限,暂时 Java 无能)。
对 Python 而言,我遇到较多的问题包括:
面试官一般会问你常用的Python库有哪些,比如threding、math、numpy、time等等,列举几项自己熟悉的库即可。
推荐的资料:
- 装饰器:https://www.bilibili.com/video/BV11s411V7Dt
- 多线程调用:https://www.bilibili.com/video/BV1jW411Y7Wj
- Python的多线程调用面临的性能问题:
- GIL (Global Interpreter Lock):https://realpython.com/python-gil/
- 内存管理机制:https://www.bilibili.com/video/BV1F54114761
- 正则化(作为了解,笔试有可能遇到):https://www.youtube.com/watch?v=K8L6KVGG-7o
2. 数据结构与算法
这一块内容涉及到编程,因此必需要常常用 Python/Java 进行练习。练习平台推荐 LeetCode 或牛客,刷《剑指offer》的题,至少过一遍。一定要刷《剑指offer》,因为面试手撕代码环节几乎都是书里的原题。
若想对某个算法进行强化练习,可以在 LeetCode 的算法题库中把简单难度的题刷一遍。
代码练习平台:
推荐的理论入门网课:
若网课看不完,可以着重关注以下的知识点(也是必需掌握的):
常见数据类型和数据结构:明白它们的意义、区别,以及如何在 Python 中实现。
栈、队列、链表、树:掌握基本的操作和算法,可以在 LeetCode 的算法题库单独刷一遍它们的简单题,建立对它们的初步认识。
排序算法:常见的9大算法,它们的实现原理和代码,以及时间和空间复杂度、稳定性,需要背熟。
其他的常见算法:在笔试中常遇到,但也是需要掌握的。
推荐的资源:
- B站up主:正月点灯笼
- 回溯算法:https://www.bilibili.com/video/BV1cy4y167mM
3. 测试原理和方法
面试总是逃不掉测试案例的分析环节,它是面试官考核你在测试岗位的专业度和契合度非常重要的一个依据。强烈推荐的学习资料:
一篇文章(只看基础篇01、02讲就好,免费万岁):
PS:签约公司的面试官问了我很多关于这部分的内容,包括V模型、敏捷开发等等,还好准备充足。
4. 计算机网络
这一部分主要考核的知识点包括:HTTP、TCP & UDP、DNS、cookies(后两者极少被问到)。其实也就是应用层和运输层这两部分的协议。差不多有一半的可能性会问到计算机网络的问题,如果是测开就大概率逃不过它了。
推荐的书籍:
- Computer Networking: A Top-Down Approach (7th Edition) 《计算机网络:自顶向下方法》(第7版)
非常好的书籍,看完第3章基本就能涵盖所有面试的提问。我是看的英文版本,中文版有些翻译不够准确。如果不习惯英文版本,也可以选择其他的书籍,重点在应用层和运输层。
HTTP 常见问题:
- 请求、响应报文的格式
- 请求方式:Get & Post 的区别
- 响应报文常见的状态码
- 在浏览器输入一个网站,按下回车后,页面的内容要经过哪些流程才能加载到浏览器页面:涉及到 DNS 寻址和 HTTP 的文件传输
- HTTP 和 HTTPS 的区别
- HTTP 是无状态的协议,怎么存储用户状态:使用cookies
TCP & UDP 常见问题:
- 它们的区别是什么
- TCP的拥塞控制 (Congestion Control) 机制
- TCP 的3次握手、4次挥手:为什么要有3次/4次,少了某一次会怎样
- 什么时候会使用UDP
- 它们的报文含有哪些字段
5. 数据库
除了代码能力,数据库也是必需要掌握的技能。面试中不仅要手撕代码,也要手撕数据库(不过不会太难,只是考察你是否具有数据库基础)。
我是学的 MySQL,推荐的教程:
- https://www.bilibili.com/video/BV1fx411X7BD
学完此课程,面试的数据库环节就不用担忧了
此外,常考知识点:
- 数据库设计三范式
- 4个安全等级
- 索引
6. 操作系统
操作系统也是被频繁问到的一个内容,考核的主要有:
Linux系统:
- 常用的终端指令(要多多练习啊):包括但不限于top、ps、grep、vim、touch……
- 入门教程(学完这个就够了):
https://www.bilibili.com/video/BV1Li4y1V7pG
其他部分:
- 进程和线程:
https://www.d.umn.edu/~gshute/os/processes-and-threads.html - 并发和并行:
https://medium.com/@itIsMadhavan/concurrency-vs-parallelism-a-brief-review-b337c8dac350
(3)求职相关
1. 笔试
笔试的平台一般是牛客和赛码。在笔试前先用牛客网刷一下往年公司真题,因为笔试平台对输入和输出有所规定,如果不提前练习,很可能连怎么输入数据都不知道。
我最常用的格式:
def solution(): (this is your solution) while True: try: (input data here) (call the solution function) print('output your result') except: break
输入数据我最常用的是 input().split() 这个方法。用 input 结合 split 切片函数,再配合 map 函数得到所需的数据类型;输出数据直接使用 print 函数。
关于输入和输出,这里不详细展开,建议在本地 IDE (推荐 Pycharm)上多多调试,多练习面对不同输入和输出的格式要如何操作,形成自己的一套格式。解决了该问题,才相当于正式地开始笔试(不然数据都输不进来,只能写个寂寞)。
2. 面试
一般来说,面试会有3、4轮,前面几轮是技术面,终面是项目主管或者HR面。
关于面试要做的准备和注意事项,牛客里有很多相关面经,这里不过多说明。只提几点我个人认为值得重视的地方:
- 了解 JD。投递公司的时候就可以把岗位介绍的页面打印为 pdf 进行保存,便于常常翻阅,熟悉该公司的测试岗所要求的能力。
- 心态上的准备。不要觉得自己机会很多,所以丢掉这场面试也没关系。把每一场面试当作最后一场,你会发现自己能更认真专注地对待每个机会。
- 提前了解公司。通过公司官网或者微信公众号,了解公司(尤其是该岗位)的一些文化、培训机制、业务场景等。不要觉得是无用功,认真做好功课,在向面试官提问的环节也可以根据这些信息咨询与岗位相关的问题。诚恳的态度在某些时刻会发挥意想不到的功效。
- 面试前的准备。常备纸和笔,着装干净整洁(正装最好)。由于目前大都是线上面试,注意关好门窗,手机调至静音,关掉电脑的各类社交软件(有时需要共享屏幕,突然收到消息或邮件会比较尴尬)。
- 学会总结。每场面试结束,将面试中的所有问题全部记录,并反思有无更好的回答。不懂的知识点,尽可能在下一场面试前学会。有所总结,才能有所成长,不要面完就完!
我是使用 excel 文档来记录所有的投递信息,也包括了面试的总结:
3. 写在最后
如果你能看到这里,我猜你大概会有所收获吧,至少我真心希望本文能对你有所帮助。
其实我在很长一段时间都很迷茫未来要做什么工作,2段实习经历岗位差异巨大且与测试毫无关联。在临近秋招时,才决定投递测试岗,这也导致了自己的准备不足。准备不足又遇上最难秋招季,可以说求职是我刚迈出校园受到的最沉重打击。整个夏天都处于焦虑、失眠、自我怀疑的负面情绪,这半年最大的功课就是学会与自己和平共处,接受当前的失败和不如意。
我想说,不是我们不优秀,或许只是比别人晚了一点进入这个行业,我们需要的可能是一些时间。找工作和找对象其实有些许类似,即便双方都很优秀,也不见得就会有感情产生,会有所谓缘分的因素在其中。面试亦是如此,有时候我们状态不好,有时候面试官状态也会不好,我们只是缺了点运气,在状态不好的时候相遇。我们尽力而为,其余交给运气,无论结果如何都是我们当前的最优解了。
人生不会在校招就戛然而止,我们的未来也不会因为一些挫折就轻易完蛋。再坚持一把,也许就守得云开,见月明。