Trump White House invites a bloc of conservative podcasters as a jab at legacy media

On Thursday, several conservative podcasters were invited to the White House to participate in Podcast Row, an event meant to engage alternative media by granting them hours of unprecedented access to senior Trump Administration officials. The White House intends to make this a recurring event.  “Bringing in new media outlets has obviously been a priority […]

Read More

(帖子有点长)有这样的面试官得物凭什么做第一技术梯队的梦? 关于我在得物中间件组的一次糟糕面试经历.

dlzht:

2025 年 03 月 27 日, 下午 15:00, 我参加了得物的中间件组面试, 整体感觉非常糟糕. 实在是感觉不舒服, 只能来和兄弟们说道说道, 吐吐心中的怨气.

在后来得物的面试问卷调查里, 我有写到, 我是个有礼貌, 尊重别人的人. 这这篇文章里, 我保证只说几个他妈的还有一点点其他的, 实在是很恶心(因人而异哈), 对不起大家, 原谅我的冲动.

说明: 我也向 HR 索要面试录音来着, 但被告知不会提供, 靠记忆肯定会有误差, 而且我也会有主观情绪在里面, 这点我承认, 并且须加以强调. 当然, 后面如果有人想反驳我, 他们也会更有优势

面试流程

  1. 小插曲, 我提前 10 分钟就在飞书线上会议室等待, 因为我不想我这边音视频出问题. 因为我用的是 firefox, 系统是 arch, 桌面 wayland, 我怕飞书出兼容性问题, 也担心自己改了什么配置(webrtc 什么的).

    一切都好, 直到面试官出现, 差不多是整点吧, 提醒我有回音, 说是不是找个耳机. 这是我的疏忽, 之前没有用笔记本面试过, 当然面试邮件里没提醒我这一点.

    我找来了耳机, 面试官反应声音 OK, 但我感觉他那边声音有点小. 我听力没问题, 笔记本音量也尽量开得很大了. 但我感觉到前面的回音问题已经让他有点不满, 所以也没问他那边的音量, 这让我后面非常被动.

  2. 算法题, 15 分钟, 飞书的在线界面, 差不多是力扣的 143. 做得不咋样, 我有思路, 但没写出代码, 详情可以看下文.

  3. 问答环节, 体验非常糟糕. 面试过程没什么反馈, 看不到脸, 也没有沟通交流, 基本纯问答. 问的问题, 比皮包公司下的外包公司好. 我感觉面试者没有得到尊重, 和 HR 反应, 在后来的面试问卷上也一并写上

  4. 反问环节, 前面被面试官的态度惹得有点毛, 我就想试试他有几桶水. 正好他提到了 pingora(cloudflare 家的代理, 替代 nginx), 正好我也会一点, 那就来碰一碰嘛.

算法题

首先是算法题, 力扣的 143. 题目界面是飞书的, 提示功能不好用, 输入输出貌似没有现成的. 我不熟悉飞书, 不太清楚是不是有这方面的功能, 有在飞书的 v 友可以指点下. 面试官给了 15 分钟, 方便 v 友们看, 题目也贴出来(和面试题在示例上有一些区别):

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

L0 → L1 → … → Ln - 1 → Ln

请将其重新排列后变为:

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …

不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

一开始我一直在犹豫输入输出要写吗, 有点卡在那了, 所以界面上没有写东西. 我大概是有个思路的, 前一半顺序, 后一半倒序, 然后交叉连一下嘛.

但我不确定这边的入参, 问面试官数组的长度是能直接获取吗? 没有回应, 我不知道他在不在, 代码界面看不到脸. 打开 IDEA, 试着写了下. 我很是纠结, 几乎就是交代了. 最终, 我放弃了 IDEA, 在飞书的面板上写了下面的东西.

// 遍历链表获取长度 length, 取 length/2 记为 m
public static void s1() {}

// 遍历到 m 节点, 翻转 m-n 的元素
public static void s2() {}

// 分别遍历两个链表, 0-m, m-n,
// 从第 0 个开始交叉相连
public static void s3() {}

等时间到了, 才听到面试官的声音, 具体的我也没听清, 我觉得我没做好, 心里虚. 当然面试官也没给我什么反馈, 没让我讲下思路什么的, 开始下面的问答流程.

问答环节

下面开始问答环节, 全程还是代码界面, 我看不到对方的脸, 也不知道他能不能看到我. 看也看不到, 语言上也没什么反馈, 其实到这里我的心态已经有的压抑了, 我感觉面试官根本没有交流下去的意思, 态度也相当敷衍. 下面先说一下我感觉到非常不舒服的地方, 具体的问答在后面.

1. flux 的 map 和 flatmap 区别

一开始我没听清楚flux是什么, 但这两个函数我熟啊(在 Rust 里, Option, Result 经常用到这两个函数), streams 里也有, 所以试着反问下面试官, 是 stream 里的 map 和 flatmap 吗.

面试官语气有点加重, 好像有点不耐烦, "我说的是 flux, webflux", 我听到 web, 我才反应过来他说的什么东西, 可那也不读福禄克斯啊, 你早说异步框架里的不就行了.

读什么不重要, 咱黄种人读英文, 读得有偏差不是很正常, 能沟通能理解就好, 你说是这样吧. 可你他妈的, stream 里不是也有这两个函数, 而且和 flux 里的作用不是一样的么? 你要问 1+2=?, 我确认下问题是 2+1=?, 你这么不耐烦是怎么啦?

我小心翼翼得问一句是 stream 里的吗, 也是给你面子, 提醒一下你 stream 里也有, 你要心平气和和我说是 flux 里, 我也不计较. 可这不耐烦的态度, 我非得骂上两句. 我就去你妈的吧. 这是学会了 1+2=3, 然后不知道 2+1=几了, 这种水平也能派出来当面试官?

得物面试官的实力恐怖如斯吗, 他没用过 stream 吗, 还是脑子已经转不过来, 不会触类旁通了? 看得物的中间件团队, 有想涉足 Rust 语言的意思. 可要是都是这样的水平, 能玩得转吗, 我都要急出汗来了(事实证明玩得转, 有开源嘛, 有赛博活佛 cloudflare 在, 施舍设施, 还怕没自研?).

当然, 面试过程里我没有爆, 说了下 Mono 嵌套 Mono 的情况, 就是 Mono>这种, flatmap 把两层嵌套变成一层, 方便开发者嘛, 很高级的东西? 编程界皇冠上的明珠?

语言描述起来不会很清晰, 我也是被整的有些郁闷, 也不知道那位老哥听得怎么样, 可有什么高见? 来指点指点小弟我? 5 年前就算我去皮包::外包::公司面试, 面试官都不一定屑于问这种问题. 大哥, 前面的命名空间看得懂吗, 知道这问题什么水平吗, 知道作为得物的面试官应该是什么水平吗? 难不成是皮包::外包::其他::DW?

2. SCG 里 redis 是怎么调用的

问题具体怎么问的, 我记得不是很清楚了, 大概是这样的吧. 我一听很懵, SCG 是什么东西, spring 又引入什么自定义语言了吗. 我顿在哪里, 脑子里一顿搜索, fd --search-path ./my-brain SCG.

一个十万伏特比特反转下, 我想起来了, 前两天在得物的技术博客里看过这个缩写, 我把 Spring Cloud Gateway 默念了一遍. 哎, 对上了, 可 SCG 算什么耳熟能详, 大家都知道的缩写吗? 我真的去你妈的, 看把你能的.

说 spring 的网关不行么, 是母语丢人吗, 还是说清楚点丢人, 还是这样显得你能耐? 也许你是做这块东西的, 一年两年的混得熟了, 恐怕还写在报告写在文档里把, 一个缩写是不是还洋洋得意的, 经常能拿出来回味半天吧.

还好我不是一点货没有, 一个机灵反应过来了, 不然这面试官问完停顿个 5 秒, 估计又要跳下一题了(这个下面喷). 那就回到问题, spring 的网关是怎么调用 redis 的.

这是什么意思, 调用还能怎么调用, 实例.方法呗, 数据包么走网络呗. 我不知道面试官什么意图, 不至于问这么素质低下的问题把. 估计是想考异步, 毕竟异步网关里出现同步操作是大忌, 就回答了个异步调用.

我就去你妈的吧, 没给我清楚的反馈, 我现在也不知道他想问的什么. 我怀疑他是想问 redis 异步客户端那个类名. 你要是想问什么类, 你就说, 你想问异步的东西, 你就说, 小弟我不是来混的, 可你问得这是什么东西, 能来点阳间的东西么.

3. 问答好像有定时任务? timeout(|q| {a(q);}, 5)

提问的速度相对紧凑, 小弟确实不是来混的, 绝大部分还是能接得上. 但有些提问我听得不是很清楚(前面有提到音量问题), 有些我还在思考, 面试官等个 5 秒, 看我没说什么, 就自动跳转下一题了.

我可去你妈的吧, 咱也不求你会循循善诱什么的, 这要求确实高了. 但等一等面试者反馈, 或者问一声会不会, 这很难? 不会答的, 我想一会也自动放弃, 可你是怎么回事, 设置超时时间了? 被定时了? 精度是多少? 底层怎么实现的? 我的回合你怎么 unlock 了? 你的并发锁是怎么设计的? 就这能做高能并发吗? 还是说你高人一等, 哦, 你是操作系统啊, 你能抢占式呗? 我一个电源键关了你, 去你妈的.

tokio, netty 这些框架有没有请你去管理时间事件啊(在反提问环节, 我会提到 pingora 的时间事件), 效率一定很高吧, 管理亿级时间事件, 那还不是轻轻松松, 简简蛋蛋么, 这不把 pingora, MGW(美团的流量网关)这些秒得渣都不剩? 得物想做一流技术团队的梦, 有你不就行了, 稳稳当当, 一年净省他 10 个亿.

4. 操作系统是这么知道 IO 就绪的

这一个问题我没有那么恼, 因为我确实"不会", 我第一反应是中断吗? 可是不会这么简单一个词吧, 那么多操作系统, linux, windows, macos, android, bsd 什么的, 我怎么说出点门道来呢.

我确实不会, 我脑子里检索了下mio(Rust 对事件循环封装, 跨平台)的实现, 没什么线索. 卡着那个狗娘养的定时任务, 兄弟们谁懂啊, 顶不住了, 我认输了, 说我不会.

我不清楚面试官问这个问题的原因, 如果是美团博客MGW——美团点评高性能四层负载均衡提到的硬中断问题, 从而引出绕过内核技术, 那我还有的认可你, 你还有点东西的, 但如果给我一点提示, 我也能接的上.

我没得到面试官的反馈, 我个人觉得不是, 因为从得物发表的技术博客来看, 感觉还没用到这样的技术. 而且从后面我对面试官的反问来看, 也不太像有这个意思. 顺便说一句, 美团发的文章已经是 2017 年的了.

下面是问答的一些问题, 顺序和内容并不能保真(没提供录音, 不过我也不虚, 偏差的地方你说我来改), 凭记忆记录下, 大概有下面这些问题:

1. 线程的状态

Q: Java 的线程后哪些状态

A: 刚开始是创建, 然后调度执行, 遇到 IO 这类的就阻塞休眠, 条件满足后就绪, 再次被调度执行, 执行完成销毁

Q: 获取锁是休眠还是阻塞

A: 阻塞(有些迟疑, 我一时没有反应这个问题的点在哪)

Q: 线程池执行完任务是什么状态

A: 有个空闲时间的配置, 超过空闲时间没有在执行任务, 就会销毁

Q: 全部线程都会销毁吗

A: 不是很确定, 核心线程和工作线可能有所区别, 核心线程不销毁, 工作线程销毁

2. flux 中 map 和 flatmap 的区别

Q: flux 中 map 和 flatmap 的区别是

A: 我没有听清楚你的问题, 流里面的 map 吗

Q: 我说的是 flux(语气加强), webflux

A: 因为有些异步方法会返回 Mono 这样的结果, flatmap 可以把两层 Mono 合并, 减少开发者对中间中间过程的处理

3. 阻塞和非阻塞

Q: 阻塞和非阻塞的区别是什么

A: 阻塞会导致线程挂起, 直到操作系统返回. 非阻塞会立即返回, 告诉调用方当前是不是可读可写, 然后调用方在就绪时执行其他操作

Q: Java 是怎么实现非阻塞的

A: 底层是事件循环, 在 linux 上是 epoll 这类

Q: 说说时间循环呢

A: Java 里事件循环主要有 3 种事件, 文件, 网络和时间事件. epoll 有个 poll 方法可以传递超时参数, 利用这个参数和最近的就绪时间事件, 来处理时间事件

A: 文件和网络是告诉操作系统, 对哪些 fd 的可读可写感兴趣, 把这些事件注册到事件循环上

Q: 怎么知道哪些事件发生了呢

A: 我们是应用层面, 应用层面的话, 是操作系统告诉的

Q: 那操作系统是怎么知道的呢

A: 迟疑了一会, 不是很清楚, 没有看过这块的代码

4. 网关限流组件

Q: 你的网关限流是怎么实现的

A: redis 的 incr 命令, 用 lua 脚本, 调用会加一, 超过限制就返回错误

Q: 那计数不是会越来越大么

A: 超时时间, lua 会给 key 超时时间

Q: 要是想知道 1.5-2 秒调用了多少次怎么办

A: 我实现的比如说 10 秒内限流多少, 这个没法实现

Q: lua 脚本是放在哪的, redis 里吗

A: 我是写在项目里的脚本文件中, 通过 redisTemplate 调用

Q: SCG 里, redis 这样的是怎么调用的

A: (迟疑, 我还没反应过来 SCG 是什么, 怎么调用是怎么个意思?)

A: 异步调用

Q: 异步调用怎么实现

A: spring 有异步的客户端, 数据库有 r2db, redis 也有

5. 中间件

Q: 你对哪些中间件比较了解

A: MQ, Redis 这些都还可以

Q: MQ 里对哪个比较熟

A: RabbitMQ

Q: RabbitMQ 的消息在磁盘上是怎么存储的

A: (我不确实知道)RabbitMQ 的消息是怎么存储的...因为 RabbitMQ 不像 kafka, topic 分成不同的区块存在磁盘上. 我不清楚, 我没有读过 RabbitMQ 的源码, 不清楚消息是怎么存的

6. 线程安全

Q: ThreadLocal 可以在线程间共用吗

A: 不可以, ThreadLocal 存储线程自己的东西

Q: 怎么在线程间共享数据

A: 因为线程共享进程的内存空间, 共享变量就可以

Q: 共享变量怎么安全

A: 多个线程, 有写操作

7. 其他(有的问题我没答上来, 不多, 记忆不是很清了)

Q: SCG 负载均衡怎么实现

A: 我答的是什么随机, 比例分配这些的

Q: 我问的是自己怎么实现(语气加强)

A: 我想了想, 说不知道(狗娘养的定时任务, 嘀嗒嘀嗒叫得我恶心)

我确实不知道, 实现哪个接口? 实现什么方法? 无非是根据规则选个后端转发罢了, 去你妈的, 这是什么了不得的东西? 大学生期末考试?

还问了我的职业规划, 之前的加班情况什么的, 我不知道什么意思. 小弟我不怕你笑话, 要加班, 之前在创业公司, 赶项目, 整天整夜地睡在办公楼里; 要悠闲, 我已经一年没正经上班了. 我可忙可闲, 你要卷, 小弟我不怕你, 你要混, 小弟我也接得住.

反问环节

前面被面试官问得有点毛, 虽然没有爆出来, 我也想看看得物的技术人员有几桶水. 网关是吧, 让我来看看:

Q: 请问下得物的网关是怎么实现的?

A: 分流量网关和业务网关, 流量网关是 pingora, 业务网关是基于 SCG 改造的

Q: 哦, cloudflare 的 pingora(潮是挺潮的, 货保真吗, 咱鉴定一下), pingora 支持四层均衡吗

A: (我没听得清楚)大概意思是, 得物里用的搜是七层, 用的七层转发, 大概没考虑四层的东西, 你就直说呗

Q: (我会心一笑)pingora 的时间事件用的是 tokio 的吗

A: (回答的很含糊, 我记不清了, 扯了一些生态)如果你了解 rust, 你就会知道很多这样的组件, 是和运行时绑定的, balabala

Q: 你说的没错(你很熟 Rust? 精通吗? 有 15 年经验吗?), 但 pingora 的时间事件不是用的 tokio 里的. 因为 pingora 是网关, 一般来说时间事件不会很长, 不会有一年, 一天, 所以可以做更激进的优化(顺便说一句 hyper 也不强依赖 tokio)

A: ...

Q: 而且 pingora 里的时间管理是线程变量, 就是你上面提到的 ThreadLocal, 每个线程单独管理自己的时间事件

A: ...

Q: 这是一种无锁的实现(其实 pingora 糊了一层, tokio 的也支持)

然后我还想说一下时间精度啊, B 树的管理结构阿这样的东西, 但他打断了我, 问我还有什么想问的吗. 我说没了, 其实我有一箩筐东西拿来面他的, 协程, 有栈无栈, Pin 的约定, future 相关的, 再扯上 trait, 你有多少货, 小弟我和你掰扯掰扯. 当然我更想问问, 你做了什么. 给他留点面子吧.

但这里我想骂还是骂, 我就去你妈的吧, 开源的东西, 拿来做自己家网关, 都不用了解了解, 熟悉熟悉的? 不怕卡你脖子, 给你下毒? 是不是稍微改改也变成自研了, 画个蛇添点足就要拿去当业绩了? 基于开源没问题, 但咱得真有点自己的东西吧, 当然我也没问他有没有自己的东西.

吃饱了饭, 肚子装的都是什么货? 我不清楚这个面试官在组里是什么水平, 这是拿了个小卡喽米, 还是拿了个混饭吃的来面我? 我记得我在哪看到过, 得物想做一流的技术团队, 写这句话的人, 知道自己的队友是什么水平吗?

我就去你妈的吧, 不会也不丢人, 毕竟"闻道有先后, 术业有专攻". 可拿着自己会的洋洋得意, 捧着来考别人, 还一副很傲的态度, 我就去你妈的吧.

为什么我感觉很糟心

为什么我会感觉很恶心, 因为是我看得重了. 去年我就想转 Rust, 一时年轻辞去了工作, 这一年里也没正经上班. 当然自己有在写 Rust, 提 PR, 自己写东西.

这次得物的 HR 找到我, 给我发出面试邀请, 我是很看重的. HR 在电话约我面试的时候, 特意提到了 Rust 和网关这两个词. 一是说明 HR 看了我的简历, 还是有诚意的, 应该不是纯刷 KPI(事后和 HR 确认, 也说不是 KPI); 二是我想做 Rust 方向, 正好在之前的工作中, 我也做过网关的东西, 挺契合的.

得物虽然比不上大厂, 但技术应该也还不错(但这次面试下来, 不这么想了). 脉脉上虽然也看到了一些负面评论, v 站上也有, 但我想虽然可能毒, 但如果能去自己想去的方向(Rust), 那还是不错的.

所以我花了很多心思去准备这次面试, 包括了解得物的发展过程, 去读得物的技术博客, 去看得物中间件团队的沙龙分享等等, 重温了 spring 的网关, pingora 这些. 我的感觉是, 一, 得物是有人想推新技术的, 在最近的博客里可以看到两篇 Rust 相关的文章; 二, 得物有点技术, 而且不是我够不到高度(我说客气一点, 给我留点余地).

在得物的得物自研 API 网关实践之路里, 阐述了得物的自研业务网关, 这和我在上一份工作里做的事情有很多相似的地方, 都是基于 spring 的网关做点自己的内容. 鉴权, 限流, 日志, 后台管理等这些我一个人全包做了. 我都没哼哧哼哧写点吹牛的文章(老实人确实没出息, 去他妈的), 所以我感觉, 哦, 不错哦, 对口哦, 应该是可以聊得来的. 而且我 Rust 不错哦, cloudflare 家的 pingora 我也研习过, 在知乎上也写过小文章, 这不都挺对的吗.

哪知道是这么个面试, 说是大失所望也不为过. 如果得物卡学历, 我是二本出来的, 我认; 如果得物看算法, 看做题, 我也认. 这没什么好说的, 用什么工具来选人是公司的事, 我尊重其他人包括公司的选择, 我高考没考好, 是我自己的事. 可这次面试没有尊重面试者我(至少从我看来, v 友可能看法不一样), 如果是皮包公司, 我也认, 可得物也就这德行么. 连给公司选材的人都这样, 支撑得起你得物的技术梦吗?

这其实是第二次约面了, 第一次约的是 25 号的 15:00, 在差不多 13:00 的时间通知我面试官请假了. HR 是礼貌询问我, 改时间是否方便, 我也就同意了. 现在回想一下, 如果这两次是同一个面试官, 那我又要去他妈的了, 这么糟心, 还浪费时间, 浪费两次, 去你妈的.

前不久(24 年 08 月)得物也有裁员风波, 我不知道是裁了哪些人, 留下的是哪些人, 是不是懂的都懂的那种情况, 有没有懂哥出来懂一下. 唉, 写到这, 我的怨气也差不多消了, 也没什么精力了, 累累的, 睡一会了. 得物的 HR 和我说收到了反馈, 会有相关的反馈, 如果后续有什么, 再和兄弟们更新吧.

无奈的现状

现在的就业的市场, 对我这样的人确实很不友好. 一方面, 不甘心背八股, 刷算法; 另一方面, 学历不光鲜, 阅历没大厂. 但我暂时还没有放弃, 磕在我的选择上, 错了就错了吧.

我感觉到, 程序员这个世界有一群"老人"(不是指年纪, 有多种意思)在守着门, 有很多人会被卡得很累, 会被卡死, 而他们站在"高位", 只是因为他们"老"了.

用无船同志(Rust 异步的主力开发者)的话结束这篇无聊的文章. In civilizations without boats, dreams dry up, espionage takes the place of adventure, and police take the place of pirates. 算了, 走了, 该往前看了, 再往前走走吧.

Read More