在 August 9, 2022 和 August 10, 2022 两天,我参加了 Troph(北京时代传浮科技有限公司)的软件开发相关岗位线上面试(一面,二面)。由于一些原因,以 rejected 告终。思前想后,最后决定将这次经历发到博客上。
troph,是一家以年轻的ACGNM爱好者为主导的虚拟社交公司。我们相信现实世界中的关系和连接无法定义一个人的所有社会属性,因为人与人之间存在超越物理属性的深层联系。1
Troph 是一家来自北京的,主打二次元社交的初创公司,成立于 May 31, 2019,公司注册资本 100 万。2在职员工约 30 人左右,工作时间 10:30-19:30。使用 Scrum 作为其任务交付框架,使用飞书作为其员工管理工具3。接受远程工作。
Troph 目前主要运营一款主打二次元的虚拟社交软件 Mew(Mew Online),提供 Android(Kotlin with Jetpack Compose) 和 iOS (Swift)两个平台的应用程序(完整内容),并支持在 Web 中直接访问(React,仅支持访问部分内容),后端采用 NodeJS 开发。总体来讲,Mew 是一款贴吧(Reddit)+QQ频道(Discord)形式的社交软件,你可以创建或加入公开/私密“据点”(也就是某一个频道,或者说 subreddit),然后为据点进行定制,包括设定“基建”(包含家具玩法的的子频道),创建“图书馆”(Wiki),并在“中枢”(贴吧)中发贴。
主页外观,通过 Web 访问,同原生平台访问外观
据点首页外观,通过 Android 客户端访问,同 Web 外观
据点基建外部页面外观,仅客户端可访问
据点基建内部外观,仅客户端可访问
据点图书馆界面外观,仅客户端可访问
因为一次特殊的经历(下面就会讲到),我了解到了这家公司及其产品,经过和其员工的一番交谈,遂开始准备面试。
August 4, 2022 下午,我收到了一封特殊的邮件,这是一封招聘邮件:
在此之前,我曾经收到过多封来自境内外的招聘邮件,但是毫无例外地,他们都属于“广撒网”的类型 —— 即向所有地区或年龄符合条件的 GitHub 用户发送同一封招聘邮件。
在简单了解了其名为 Mew 的产品后,由于本身也十分感兴趣,因此便回复了这封邮件:
再经过又一轮的邮件问候后,我获得了发件人的 QQ,之后,便开始聊了起来。
聊天过程中,我了解了这家公司的技术栈,产品定位以及工作节奏,并表达了目前我的状况(在校大学生,只能接受远程工作,目前还有其他工作在职)。最后,我们约定了 August 9, 2022 下午 16:00 进行第一次面试(技术面)
接下来,就是我的第一次面试了。
事实上,这确实是我第一次面试,因此自从确定了面试时间后,我便开始各种紧张,直到在面试开始前的一个小时,我仍然在思索应该如何自我介绍,应当如何整理自己的衣服之类的事情。
一个小时后,我发现我完全多虑了。
面试官是一位二次元小哥哥(看头像就知道了)。在得知不需要开摄像头聊以后,我便放松了一大半。接下来,便和面试官畅快的聊起来一些技术方面的问题 —— 事实上,我们聊的大部分是 Minecraft 模组和插件开发的一些基本流程。
中间,作为最重要的在线编程环节,我得到的题目是编写一个比较两个 Semver 版本号高低的函数,我的代码:
fun main(args: Array<String>) {
println(compareVersion("1.2.2","1.2.2"))
}
fun compareVersion(versionA: String, versionB: String): Int {
val versionAList = versionA.split(".").toMutableList()
val versionBList = versionB.split(".").toMutableList()
for (i in 1..(3 - versionAList.size)) {
versionAList += "0"
}
for (i in 1..(3 - versionBList.size)) {
versionBList += "0"
}
val compareVersionFirst = versionAList[0].toInt().compareTo(versionBList[0].toInt())
if (compareVersionFirst != 0) {
return compareVersionFirst
}
val compareVersionSecond = versionAList[1].toInt().compareTo(versionBList[1].toInt())
if (compareVersionSecond != 0) {
return compareVersionSecond
}
return versionAList[2].toInt().compareTo(versionBList[2].toInt())
}
写的时候其实还是蛮紧张的,而且大脑一片空白,因而我甚至想不到好的变量名。不过最后,我还是完成了这部分代码的编写(很显然逻辑写的很拉,除此之外,还有一些额外的 Semver 识别问题需要进一步解决)。
在这之后,就是一些有关技术栈的问题交流。最终,这场持续了四十多分钟的面试结束了。虽然一直开着空调,但是从房间出来时,我还是发现我早已汗流浃背。
一面结束后,很快收到了二面的通知:
因为想尽早结束,因此我回复第二天就可以进行二面。
经历了第一次面试后,第二次就显得轻车熟路了,整场面试大概持续了四十多分钟。
面试官是一位声音很好听的小姐姐,在这四十分钟里,我们讨论了有关我目前的一些状况,以及处事风格,性格相关的内容。当然,过程也是十分愉快的。
这其中还有一个小插曲,就是我的 Windows 11 在没有提醒的情况下自动重启更新了,而且因为是 Lenovo 固件更新,耗费了非常长的时间,导致面试的后半部分我不得不通过手机接着面试。
显而易见,文章开头就已经提到过,我最后被 rejected 了。
给出的原因是工作时间不太符合预期,这倒也在我的意料之中(但是还是有一些小失落)。
虽然最后被 rejected 了,但是不得不说的是,无论是收到的邮件还是面试过程中的交谈,这家公司依然带给了我非常好的印象(这些好印象包括但不限于非常“二次元”的团建过程以及十分可爱的员工)。总之,希望有朝一日,可以有机会到这家公司工作。