那天下午三点,谢飞机走进互联网大厂明亮的面试等候区时,手里还捏着被汗水浸湿的简历。前台小姐姐微笑着递来一杯温水,他却因为紧张差点把水洒在裤子上——这个开场似乎预示了接下来两小时充满戏剧性的面试历程。
作为技术面试官,我见过太多候选人,但谢飞机的表现确实令人印象深刻。他穿着略显宽大的西装,领带打得歪歪扭扭,但背包里露出的《Java并发编程实战》书角却显示这是个认真准备的候选人。当HR把他领进会议室时,他对着玻璃门整理头发的动作,让我想起自己第一次面试时的模样。
谢飞机显然做了充分准备,他的简历上整齐罗列着:
但简历上用荧光笔标注的"重点掌握"几个字,和边缘处铅笔写的"volatile关键字"等小抄,暴露了他临时抱佛脚的痕迹。我注意到他手机屏保是一张写满算法复杂度的备忘录,这种既认真又可爱的准备方式,在技术面试中实在少见。
面试官笔记:候选人表现出的紧张往往与技术能力无关,重要的是观察其解决问题的思路。过度准备反而可能限制临场发挥。
"我们先从简单的开始,"我翻开评估表,"请说说ArrayList和LinkedList的区别?"
谢飞机眼睛突然亮起来:"这个我熟!就像食堂打饭和自助餐的区别..."他随即意识到比喻不太恰当,急忙补充道:"不是,我是说ArrayList像数组,随机访问快但插入慢;LinkedList像链表..."
我故意追问:"那为什么实际开发中更多用ArrayList?"
"因为..."他挠挠头,"就像大家宁愿排队也不愿吃自助餐?哦不!是因为CPU缓存行!ArrayList内存连续..."这个突如其来的深度回答让我暗自点头。
当话题转到多线程时,我给出了经典场景:"如何用三个线程交替打印ABC?"
谢飞机在白板上画了半天,突然拍桌:"应该用Condition和Lock!"然后写了这样的代码:
java复制class PrintABC {
private int state = 0;
private Lock lock = new ReentrantLock();
private Condition[] conditions = new Condition[3];
public PrintABC() {
for(int i=0; i<3; i++){
conditions[i] = lock.newCondition();
}
}
public void print(int targetState) {
lock.lock();
try {
while(state % 3 != targetState) {
conditions[targetState].await();
}
System.out.print((char)('A'+targetState));
state++;
conditions[(targetState+1)%3].signal();
} finally {
lock.unlock();
}
}
}
虽然忘记处理InterruptedException,但整体思路清晰。当我指出异常处理遗漏时,他懊恼地拍额头:"啊!就像煮泡面忘关火!"——这个神奇的比喻让会议室里所有人都笑了。
"假设线上Full GC频繁,你会如何排查?"我抛出实际问题。
谢飞机突然进入状态,语速飞快:"先jstat看GC情况,再用jmap导堆转储...等等!应该先用jstack看线程栈..."他像报菜名一样列出一串命令,最后不好意思地说:"其实我上周刚把jvm参数写在手机壳背面..."
他掏出手机展示:-XX:+HeapDumpOnOutOfMemoryError、-XX:SurvivorRatio=8...这种"移动小抄"的方式让人忍俊不禁,但能准确说出每个参数的作用,证明是真下过功夫。
"如何设计一个分布式ID生成器?"我抛出系统设计题。
谢飞机先是画了个雪花算法示意图,又突然停住:"等等,如果机器时间回拨怎么办?"他咬着笔帽思考的样子格外认真。
最终他给出改进方案:"可以增加时间校验层,检测到回拨就报警;或者预留位做序列号缓冲..."虽然方案不算完美,但能主动发现问题并思考解决方案的态度值得肯定。
当讨论缓存问题时,他激动地比划:"布隆过滤器就像食堂阿姨的漏勺!能挡住大部分无效请求..."这个接地气的比喻反而让复杂概念变得易懂。
他接着详细解释了缓存空对象、互斥锁等方案,甚至提到:"我们项目里用二级缓存策略,就像...就像在食堂门口先看菜单再决定排哪队!"——再次用食堂比喻征服了面试官。
我给出经典的两数之和问题,谢飞机自信满满:"这个简单!哈希表O(n)复杂度..."
但在白板编码时,他写完后突然僵住:"等等,我好像把参数顺序写反了..."慌乱中他手肘碰倒了矿泉水瓶,水洒了一桌。就在大家帮忙收拾时,他突然喊道:"不对!应该先检查再put!"然后冲回白板修改代码——这种专注度让人印象深刻。
"说说你常用的设计模式?"我继续考察。
"单例模式!"他不假思索,"就像我们公司只有一台咖啡机..."然后突然卡壳,"呃...双重检查锁要加volatile是因为...因为..."
他额头冒汗的样子让我想起考场上突然忘词的学生。当我提示"指令重排序"时,他如释重负:"对!就像食堂打饭要先刷卡再取餐,顺序不能乱!"——第三次用食堂做的比喻让面试官们相视而笑。
抛开那些搞笑的瞬间,谢飞机展现的技术素养其实相当扎实:
特别是他能在压力下快速调整状态,这种能力在实际工作中比死记硬背更重要。
根据这次面试,我总结出几点建议:
谢飞机最后离开时,把椅子认真推回原位,还顺手带走了空水瓶。这个小细节,加上他整场表现出的真诚与努力,让我们决定给他一次机会——毕竟技术可以培养,而优秀的学习态度和人格品质更为难得。
这场面试给我最大的启示是:技术面试不该是冰冷的能力测试,而是发现候选人闪光点的过程。有时候,那些看似"翻车"的瞬间,反而最能展现一个人的真实水平和潜力。