各位安安,这边想简单分享一下我 2023 年中旬(上周 ~ 昨天)的面试经验。
先自我介绍一下,本人是某广告相关公司的 Software Engineer, Backend,同时也是本次分享技术面试的主持人。
鉴于版上几乎都是求职者进行分享,所以本次在主管(老板)的授权下以面试主持人的角度进行分享,还请各方先进不吝指教。
本公司主要想找 PHP/Laravel Backend Engineer,如果有其它语言的经验也愿意学习 Laravel 的人也非常欢迎(受限于目前公司的人力资源,还无法擅自变更使用的框架与语言,但这是未来很重要的里程碑之一)
注:为避免有偷渡征才讯息的疑虑,本篇文章不会直接写出公司名称,如果有兴趣的话欢迎私信询问
注2:本公司仍然有在征才哦,如果你看到这篇文章觉得想来当我的同事可以来投看看 XDD
===
流程介绍
本公司技术面试为第二轮(第一轮我不会参与,这边也无法分享相关经验),表订时间约在 1 小时(但如果想跟我聊多一些,可以到 2 小时甚至以上,目前最高记录是 3.5 小时)。
1. 双方自我介绍
基于礼貌,我会尽量期许自己先开口自我介绍,但最近还在习惯这件事所以有时候还是麻烦对方先行自我介绍,也感谢近期应征者的海涵。
2. 面试偏好询问
参考一些面试经验,有些人不喜欢考卷、白板题或 assignment 等各种类别,所以我会先行询问对方的面试偏好。
以下选项择一或全选皆可,但选择越多可能会延伸面试时间;选择的项目并不会影响到评估的结果,因为会以各项分数平均计算(我会私心对一些有利于应征者的项目做加权,不过也不是只有我决定)。
(1) 白板题:算法,不能用 ChatGPT(或其它 AI 辅助) 但可以查文件
(2) 实作题:程式能力,能用 ChatGPT 也可以查文件
(3) 架构题:Senior 独有,能用 ChatGPT
(4) 问答题:基础知识,不能使用 ChatGPT 也不能查文件
(5) Assignment:指定一个 Open Source Repository,请你发一个 Pull Request(我会实际去看你的变更内容跟 commit message 以及跟 maintainer 的应对)
- 这部份会以自愿为优先,如果觉得真的很不想做或不知道从何下手的话也可以放弃(不计分)
利益申告:所有的问题与公司现行产品都尽量无关,这是为了避免有白嫖应征者思路的嫌疑;而 Assignment 的选择也会尽量挑选有一定用户基础的 Repository。
3. 询问想要面试的难度
目前有开放的职位有两个:
(1) Mid ~ Senior:能够考量系统架构并定义良好的 Interface,并且能跟架构师讨论未来的一些技术选型
(2) Junior ~ Mid:实作一些 CRUD API,以及实作一些 Senior 工程师定义好的 interfaces
如果不知道怎么选择也没关系,我可以根据应征者的实力自动调整问题的难度。
=====
聊天题(为了更了解对方,并核对履历内容,不列入计分)
1. 最近看了哪些值得一提的资讯领域的内容,包括但不限于文章、影片、漫画、meme、新闻、论文等
2. 擅长的工具与程式语言(用于确认履历中的叙述)
=====
白板题
给定一个二维阵列代表围棋棋盘
- 1 代表黑子
- 2 代表白子
- N (null) 代表未落子
若棋盘一定是理想的(定义下述),那白棋会被提多少子、黑棋会被提多少子?
举例:
N 1
1 2
(1,1) 白子会被提子
举例:
N 1 1 1 N
1 2 2 2 1
2 1 1 N 2
1 1 2 2 1
(0,2) 的白子会被提子
(4,3) 的黑子会被提子
“理想的”棋盘表示不会存在“打劫”的问题,举例来说下述棋盘结果是不会出现的,因为中间的白子与黑子会互相提子
N 1 2 N
1 2 1 2
N 1 2 N
备注:
这一题的来源是我曾经出给一个学生的作业,他是非本科转职前端,我本来只是想请他用 HTML + CSS 写个围棋棋盘,并且用 JS 实现落子逻辑,结果他连提子逻辑都一并写出来了。当时他是自行实现了 DFS 去计算棋子是否还活着(围棋术语是“有气”)。
题外话,前阵子跟这学生吃饭的时候他提到公司在做某个功能,他自行研发了一个资料结构来解决这个问题,我一看就说“你这不是自行实现了字典树(Trie)吗?!”,不得不说他真的是一个天赋异秉的人,怪我能力不够没能教好他。
(小声)打色码眼睛快脱窗 = =
=====
实作题
下列 PHP 程式码存在一些问题,请尝试指出这些问题并且重构它。
注:下述程式隐藏了一些不重要的细节(例如数据库连线、失败处理等),回答时也可以隐藏实作细节(不一定要精准的使用所有的函式)
<?php
extract($_POST);
$db = new DB(); // connect to DB
$user = $db->query("SELECT * FROM users WHERE username = $username AND password = $password"); // query from DB
echo $user ? 'Login Success' : 'Login Failed';
这一题其实是互动题,因为实作题可以使用 ChatGPT 所以我更期望应征者能跟我说明“为什么它要这样改”。
而且就我实测 ChatGPT 会唬烂所以不能全信(我认为分辨 ChatGPT 是不是在唬烂也是很重要的能力)。
=====
问答题
这部份不开放使用 ChatGPT,因为这些题目都是属于基础知识,如果开放使用 ChatGPT 几乎都会被秒杀。
然而,我们后续内部检讨认为应该要开放可查询 Google,毕竟有些东西是真的不会背在脑子里(虽然我是都有大概记着,但每个人习惯不同不能一概而论),如果版友们有任何想法也欢迎回馈,我们会尽可能改善我们的流程。
1. PHP 相关
(1) PHP 的执行与启动流程?[中级]:主要指的是它在 PHP Source Code 层级的执行流程,不仅仅是在外部观察到的结果
2. Redis 相关
(1) 单 Redis Instance 可能会当机或因为网络问题无法存取,有什么解决方案?[初级]:这应该算是八股题
(2) Redis 的 "字串" 是如何实现的,有没有什么值得一提的陷阱或细节?[中级]:这个是 Redis Source Code 的入门题,毕竟甚至有一个专门的网页来介绍 SDS
3. 作业系统相关
(1) Thread 跟 Process 有什么差别?[初级]:这个也是八股题,问到烂的那种
注:其实作业系统相关还有不少题目,但鉴于重复利用性我就先不公开(这些题目都没用到,因为我评估对方可能对作业系统没这么熟)
4. 数据库相关
(1) 请简述一下 MySQL InnoDB 的资料写入流程。[中级]:这可能是比较有争议的题目,因为不能查资料,如果没有相关的经验很难背起来
(2) 为什么大部份的 RDBMS 会选择 B+ Tree 作为其底层的资料结构?[中级]
(2.1) 有个应征者说因为 B+ Tree 有自平衡的特性,所以我又加问了“那为什么不使用 RBTree 或 AVLTree?”[中级]
(2.2) B Tree 跟 B+ Tree 又有什么差异呢?[中级]
(2.3) 近年来,LSM-Tree 相当盛行,能聊聊它与 B+ Tree 的差异吗,以及你认为为什么它会流行起来?[中高级]
(3) 请简单描述一下 CAP 理论。[初级]
(3.1) 因为有一个应征者有 MongoDB 的经验,所以我又加问了“那 MongoDB 丛集是牺牲了 CA 的哪个点来达到 P 的?”[中级]
5. 虚拟化/容器化
(1) 请简述一下 Virtualization 与 Containerization 的差异。[初级]
(2) 在 Linux 中,是如何达成 Containerization 的?[中级]
(3) 假设想让 PHP-FPM 与 Nginx 的应用程式 Containerize,会如何实践?[初级]
(3.1) 假设再加上 Laravel Queue Worker 及 Cronjob Scheduler,又会如何设计?[中级]
注:这题是因为去翻应征者的 GitHub 发现他有类似的经验,所以另外加上去的
=====
架构题
这部份有些难以说明,因为更着重的是互动性(根据对方的回答去反问一些问题),这边先省略
=====
Assignment
目前还没有人选过这个项目,看来大家是真的很不喜欢 Assignment。
以前我比较喜欢 Assignment 的时代有出过一些简单的(?)题目,例如用 Laravel 实现几个 APIs,但想想这会花费应征者太多时间这次就不采用这种方式,有兴趣的话我要问一下公司能不能授权公开当时的题目。