前情提要:/t/1139545
虽然最后我勉强找了份工作,但情况并不是很妙:我接手的那套系统所支撑的业务线被大厂收购了(我入职后才知道这件事),他们有成熟的技术方案,用不到我们这套系统。所以等数据迁移完成后,这套系统将会停用。(谁说的做 infra 比做业务更稳定的啊喂,人家做业务的跑去跟大厂签合同了,我做底层的直接原地失业)
其实也不完全算是失业,领导说到时候会安排我转岗,去做其他产品线的技术支持,薪资不变。这刚一毕业就去做技术支持,以后的职业生涯怕是离开发越来越远了。我还是有点追求的,所以这些天骑驴找马,继续准备面试。
我们小县城也没什么开发岗位,我打算往二线及以上城市发展,找 Linux 开发相关的岗位,预期薪资 15k+(综合行情和自身能力,我觉得这个价位是比较合理的)。
当然众所周知现在求职不容易,投了十几份简历,目前只接到了两个面试,全都一面挂。那就分享一下吧。
首先是一家中小厂,面的游戏服务端岗位。
微信电话面试,先是简单的自我介绍,然后问项目,问我最近解决的技术挑战。本来打算讲讲我梳理屎山代码的经历的,可是这玩意不结合具体代码不好讲。于是就讲了讲最近做的一个性能优化:
我们系统里的进程间通信依赖一个消息中间件。其中对于那些需要原样发送的 raw 数据,本来是使用 splice 进行传递。虽然 splice 是 zero-copy 的,但仍然有系统调用开销,尤其是对于那些大量发送小数据包的场景,会影响性能。于是我做了基于 SCM_RIGHTS 的改造,将 fd “发送”给目标进程,从而进程间可以直接收发 raw 数据,无需 broker 对其转发。实测对于大量小数据包的场景,有 5-10% 的延迟和吞吐量改善。
面试官对其中的一些细节进行了提问,但感觉他似乎并不了解什么是 SCM_RIGHTS 。
然后就是技术问题环节,以 Linux 八股为主。随便举几个印象比较深的:
其中大部分我只能说个模棱两可,毕竟没实际做过相关内容或深入学习过,只能根据已有知识推测。
也问了一些网络和算法的八股,但这些是我的弱项,连续几个没答上来,就不再问了。一共持续了大概一个小时吧,最后面试官说,如果有后续,本周之内会再联系。今天已经周日了,应该是挂了。
然后是武汉的一家小厂。虽然是小厂,但是小有名气,家人用过他们的产品也觉得不错。
先是让我登进他们内网的一个平台(应该是搭的开源 OJ 平台)做题。四道编程题,语言 C/C++/Go/Rust 自选,时间 60 分钟,允许在本地编写然后复制到页面中提交。
前三道不算太难,思路明确,分别是回溯、贪心、动归。如果对标 leetcode 应该稍低于 medium 的平均难度。还算顺利地做出来了(但不能确定是否处理好了所有的边界条件,因为提交后没有提示通过了多少测试用例),第四道没有思路,时间也不够了(后来查了下也可以贪心)。
本来以为挂了,但是转天突然收到了面试邀约。
先是问项目。比起工作中的内容,面试官对我的开源项目更感兴趣(虽然最多的也只有十几个 star ),而且比起实现细节,更关心技术选型的过程和最终敲定方案的理由。
然后是一道场景题:实现一个简易的 terminal pager 。要求是既能支持常规文件,也能支持管道这种 non-seekable stream 。而且要控制好缓存逻辑,不能因为数据量太大而爆内存。支持的命令不需要太多,能翻页和跳转到首尾行即可(也就是 less 的 j/k/g/G )。
还是 60 分钟,语言从 C/C++/Go/Rust 中自选,编辑器和工具链用我自己电脑上的,允许查资料(问 AI 也行),但是要全程屏幕共享,做题的过程也会被打分。
本来我以为这个挺简单,甚至还玩起了花活,支持了一下 alternate screen 。然后很快发现时间不够用了。要想正确实现 pager ,还是挺考验编程能力的。
于是我果断放弃了支持 soft wrap ,先把最基本的显示错乱的 bug 解决了。在时间结束的前一分钟,本来以为大功告成,突然 segfault 了,十分尴尬(后来看了下,是没处理好边界条件的原因)。但我自认为表现得还不错,完成度挺高的了,应该能过。
然而今天刚刚收到邮件通知,面试没过。面评里写到:有一定的计算机基础和编程能力,但对于代码细节的掌控还有所欠缺,恐难以胜任。
emm ,好吧,这确实是我的不足,需要在工程实践中逐步提高。
接下来我会继续充电,不断提高自己,寻找合适的工作机会。大家如果有什么建议,或者想吐槽自己的面试经历,也欢迎留言讨论。
![]() |
1
processzzp 4 天前 via iPhone ![]() 武汉那家应该是锂钠氪锶吧?如果你的目标是 15k 的话,更建议你去北上深杭一线城市找工作,一线城市开 15k 才是真的初级工作,二线城市的 15k 工资约等于一线城市 30k 工资的要求。二线城市只适合当地土著+初级工作躺平,但凡有一个条件不满足都建议去一线城市找工作
|
2
prosgtsr 4 天前 via iPhone
虽然方向不同,但是看完我更加能理解为什么我找不到工作了,我就是个废物
|
![]() |
3
swananan 4 天前
看 op 之前帖子,应该是刚毕业没多久。
我感觉能通过做 fd 转发,提升 IPC 性能,最后能落地,已经挺不错的了。 再把故事打磨一下呢,怎么发现这样的问题,如何确定方案(有什么其他的优化方案),怎么上线,最后怎么拿到性能提升的结果,如何体现对业务贡献度。看看这样拉扯,面试能不能顺利点 感觉只是运气差了点,虽然是校招,15k 着实有点低了,找个厂子干几年再跳槽,应该会猛涨不少 |
4
fcyxp 3 天前
这些问题让我一个上班七八年的人 也不一定都回答得上来
|
5
fcyxp 3 天前
至于算法我更是一个也不会
|
![]() |
6
Yc1992 3 天前
面试运气因素占比一半以上,感觉可以转服务端开发吧,Linux 桌面开发岗位很少
|
![]() |
7
j4fun 3 天前
哇可以用 ai 面试,这公司可以处~
|
8
HermesLi 3 天前
转行吧,骚年,别做计算机相关了,直接转行自媒体,都上 v 站了,翻新外网的热门剧本还是很吃香的,只要敢做,继续运维,目前并不占优势,且墙内供需关系已经变化了,本人 DevOps 在苏州一个小厂上班 20.5k ,算是团队核心成员,就我这个简历扔出去,就像石沉大海,后面我找了一下原因,以为我不行,诸不知直聘等很多公司发布的招聘是假的,如何解释?那就是保持招聘的状态,只聊天,实际上不招聘,每个岗位 500 元/月,这事儿我这两天才知道的。。。所以在找工作中难找不是没原因的,根本没机会好吧,不是你的问题,好多刁难,或者看起来很好的工作哪里轮得到新来的人,没内推吗?
要么,找个内推的 要么,web3 数字牛马 要么,自媒体,当然你得花时间,既然都有自我提升的习惯了,换一个赛道不一定会很差,说不定打开新天地 |
9
noogler67 3 天前
面的题我乍一看都不会。我是资深开发。
|
10
gullitintanni OP |
11
GiveMeABigName 3 天前 via Android
@HermesLi 翻新外网的热门剧本是啥意思?
|
12
wangyuescr 1 天前
@gullitintanni 这个公司是以前深度 deepin linux 技术人员王勇开的,王勇的云粉丝很多,和王垠有的一拼。
以前 UOS 统信软件的企业微信 同事吧 还有人匿名发帖怀念王勇。 |
13
wangyuescr 1 天前
@GiveMeABigName 就像金融投行中年老登面试官的场景剧,最开始是外网有的,然后国内也跟进整个汉化版。
|
14
kiraskyler 1 天前
这两个问题我回答一下,v 站大佬多,有不对的多多指点:
- 如果让你调试一个 core dump ,但是没有 debug symbol 也没有源码,你的思路是什么? gdb -c ,gdb 进入环境,敲 bt ,即使没有 debug symbol ,也可以看到每一层栈的地址,根据 info proc mappings 查看进程中已映射的动态库的地址位置,每一层栈都可以找到具体在哪个动态库,在动态库中的偏移,readelf -s -W 动态库可以找到符号在动态库中的位置。 简而言之,这道题考察的是手动栈回溯。 如果是 dwarf 的栈记录形式,一般面试不会问这个,dwarf 太复杂了,几十页标准,如果是不省略帧指针的站回溯,每一层栈都会先压栈 rbp 寄存器,甚至可以已知寄存器值就自己栈回溯。 如何在 Linux 中实现在执行程序时校验签名的机制?你这样实现,用户有办法绕过么? 有没有一种实现方法,即使用户有 root 权限也无法绕过? - linux 内核里,execve 执行程序,每一种类型都有对应的内核模块,比如 elf 文件内核模块,"#!"开头的脚本也有内核模块跳转。可以通过在 elf 内核模块中添加校验。但是这种方式侵入性,写不好了可能内核会 dump ,也可以找到合适的位置,ebpf 方式 hock 内核,校验失败给进程发信号方式阻止运行,缺点是 ebpf 的 api 太少,不能自己读取内核文件,必须找到内核模块读取到校验信息的位置 hock 才可以。ebpf 方式也许用户态可以有办法停止,内核模块较难,卸载 elf 模块所有程序都不能运行了。 |
15
kiraskyler 1 天前
@kiraskyler elf 签名机制还有纯用户态的方案,比如大多数 elf 都会使用动态库,一般也都使用 ld 作为链接器,这类 elf 启动时的入口是 ld ,可以在 ld 的源码里加校验。也可以使用 LD_PRELOAD 形式附加一个我们自己写的程序,并使用__attribute__((constructor))形式让一个函数提前于 main 函数执行,也可以做到校验功能,但这两种方法都对完全不使用 ld 链接器的程序无效,纯静态编译或指定链接器可以跳过此方法,这类程序的 elf 入口点直接指向本程序。但只让是使用 ld 的 elf ,用户态方案也都没问题,且用户态即使 root 执行也没办法(除非替换 ld/修改环境变量等)
|
16
kiraskyler 1 天前
Linux 上 Ctrl+Alt+Fx 切换 tty 这个功能是在哪里实现的?如何修改快捷键? 如果让你写个程序从而 ./changetty 3 切换到 tty3 你如何实现?
ctrl+alt+fx 这一块内核代码没看过 切换 tty 可以直接 open("/dev/tty/3")得到文件描述符,dup 将现在的标准输入输出转发到 tty3 即可。但是否影响其他 tty3 用户未知。可以先遍历/proc/<pid>/fd 看看有没有进程使用 tty3 ,没有了再切换 |
![]() |
17
Clannad0708 1 天前
不是我现在工资比你高我看你的发的我都看不懂,上班 1 年了
|
18
zjcpyc 1 天前
辞职躺了三个月准备去找工作,看到你的问题我都不想去了,继续躺吧,都不会
|
19
gullitintanni OP @kiraskyler #16
其实面试官说的切换 tty 想问的是 chvt(1) 的实现,当时我只记得是在 /dev/tty 上面调用某个 ioctl 实现的(具体答案是 VT_ACTIVATE )。 所以我觉得这种八股挺无聊的,记得这些细枝末节又能怎样呢?想知道直接搜一下不就好了。 |
20
kiraskyler 18 小时 42 分钟前
@gullitintanni 学到了,确实是这样,这道题确实没有意思,考察不出来什么
|
21
kiraskyler 12 小时 26 分钟前
@gullitintanni 我又分析了第一题:linux 面试题:Ctrl+Alt+Fx 切换 tty 这个功能是在哪里实现的? https://blog.csdn.net/weixin_42544902/article/details/149806468
|