阅读 743

一个中小厂春招面试官的思考 | 掘金技术征文

写在前面

网上铺天盖地的都是互联网大厂的面经,以前都是BAT,现在都是字节跳动、快手、美团那些。刚好我能力比较菜鸟,大厂待了一阵就回到中小厂了,就写写中小厂的面试经历吧。

想来也是,大厂的面试经历就像好莱坞大片一样,肯定比低成本的电视连续剧好看多了,中小厂不就问问进程和线程有什么区别这类问题吗,有什么好写的?

但是细想一下,程序员怎么都有一千几百万,能去阿里头条的挤破头也不就那么几千人,那剩下的程序员总得找份相对较好的工作糊口吃饭吧。 所以其实我是很希望有人写写中小厂的状况的,这个才是占比更高的程序员现状。

先定义一下这篇文章里的中小厂是什么。大厂很容易理解,阿里、腾讯嘛,以及一批耳熟能详的互联网大公司。不过,即便把这些大公司累加起来,其实也只是程序员公司的很小一部分。 更多的是一些不知名的互联网公司、给各行各业做系统的传统IT公司、外包公司、传统行业大公司的技术部门、创业型技术公司等等等等。 如果下载个BOSS直聘,上面搜索到的公司99%都是没听过的,也可能部分好的公司不用它,但也从一个侧面说明这点。

我的公司

说回我自己。 我所在的公司是一个专门给电力、能源行业做系统的上市公司。一般人都没听过,就是那种别人问你公司名字,你大声说两遍他也还是问:啊?的那种公司。 不过在业内还是很出名的,电力系统也不是大家想的就是计算一下电表是多少钱这么简单,前端、后端、各种技术还是都能用到的,而且有个别系统用的技术也挺新挺潮的,当然,跟阿里那些肯定没得比,还差很远。 待遇比不上大厂,但是也不会996,管理还算人性化,所以从性价比来说,也不一定比大厂差。但是如果有能力有追求的,肯定不要待在这种公司,多劳多得嘛。

类似这样的公司,我就定义为中小厂。由于是我所在的公司,我肯定是偏爱的,就正如即使中国再怎么不好,我仍然还是爱我的祖国一样,所以我姑且称为中厂。 至于小厂就是那种一共就几个程序员,下个月都不知道会不会倒闭的那种吧。

言归正传说回面试。我们公司的的校招分为春招和秋招。去年,也就是2019年,我入选成为了校招面试官。 春招主要是招实习生,也许是刚好有个暑假,时间上也比较合适;秋招就是正式员工了。 想了一下,也有道理,秋招的如果走完流程后再进来实习半年,大四的就快毕业了,大三的可能也不太合适。 春招的时间是定在5月初。原因大概是暑期才是实习的黄金期,太早反而不好。由于今年的还没开始,所以回顾一下去年的。

我的思考

大约四月底就收到了通知邮件,定了是去一所一本和一所三本,前年听说是去的几所二本,所以每年都不太一样。 我第一次当面试官,心情肯定是有点紧张的,也有几个问题搞不清楚:

  1. 招聘的流程
  2. 应该招怎样的
  3. 问什么题目合适

第一个问题比较简单,虽然不是大厂,但毕竟上市了,公司还是有培训和资料的,否则谁敢买你的股票呢?这个问题我周末就迅速拿下了。 但第二和第三个问题就不太好办了。开始我想,不是问最难的题目,招技术最厉害的程序员吗?后来发现还真不是。

首先难的题目我没有。 你也不可能面试的时候真的问平常工作的内容。难道你问怎么写一个CRUD?估计被面试的那个人转头就走了,搞不好还在掘金上写一篇黑这个公司面试题的推荐文章。 虽说网上可以搜索一大把BAT的题目,搬过来用就行,我也相信相当一部分面试官是这么做的,但我不想这么做,总觉得应该问自己的东西。

接着,如果BAT的题目他都会了,那他为什么不去BAT,要选择来这个中厂呢? 所以,这个思路显然是不对的。

于是第二天上班,我做的第一件事情不是写代码,而是站了起来,环顾了一下四周,非常认真的看了一遍我身边日夜相对却从未在意的每一位程序员同事,忽略掉不太行的个别, 其实这些就是我需要招的人。

大致都有如下特点:

  1. 技术不太厉害,但能解决实际问题
  2. 深层原理不太了解,但基本概念都知道,知识面比较广
  3. 不一定会技术创新,但熟悉的技术写代码非常快
  4. 未必了解技术新动向,但熟知开发的众多坑,大多数时候能避开Bug
  5. 没有大牛的高傲,总是平易近人

写到第五点的时候,我想起了公司前几年挖了一个阿里的程序员过来,待了不到两个月就走了。 听项目里的同事说情况是他技术很厉害,总喜欢用DDD,但是项目里没有人会用,并且他又没到PM或者设计的能力只是一个开发者,特立独行,不按现有的代码规范来走。 这么看来,第五点反而是首要的。想起前几天在逻辑思维里听到的一句话其实说的很对:面试不是一场考试,而是一次沟通。

考试只有分数,而沟通却有喜恶。

紧接着,我就想我该出什么样的题目,能够找到这样的人了。 我首先想到的是问我项目中遇到的问题,如果能有思路解决,那我觉得就非常接近我的同事水平了。

面试题

比如:

  1. 问题一 如果用过mybatis: 是怎么用的?mybatis-generator是否用过?有什么好处?遇到什么问题? 有没有了解tk.mybatis的通用mapper?为什么需要它?和mybatis plus的对比? 通用mapper里默认会把数据库字段a_b转为aB,如果数据库字段名本身是aB,会自动转为ab,会导致什么问题?怎么处理这个问题?

其实这里面最后一个问题是我同事遇到的,最后他也解决了。这里面其实没有什么底层原理的深奥问题,但是我觉得对于一个简历上说用过mybatis的,那应该要懂才行。 否则就真的只会粘贴复制,遇到我同事的问题也解决不了。因为这个问题在百度上搜索是比较难搜索到答案的。 细节可以答不上来,但思路要有。关键是会查官方文档和看源代码,最后我同事也是靠这两步解决的。

  1. 问题二 如果用过kafka: 某一天日志出现了重平衡的报错,可能是什么原因造成的?怎么解决? 这个问题我前几天发的沸点里有三个原因,但其实在实战中,其中一个才是高频出现的。

还有一个同事遇到问题的是关于位移。如果第一条消息失败了没提交位移,第二条消息来了提交了,会发生什么情况?怎么解决这种问题? 这个kafka的客户端代码我看到有很多人使用原生的来写,有些是拿spring的@KafkaListener来写,会分别有点不同。

  1. 问题三 如果用过redis: 可以问一下怎么生成唯一流水? 如果放置的内存过大,怎么防止超出了redis的内存?如果你的程序A和别人的程序B共用同一个redis集群,那怎么能精确控制你自己的redis的内存使用?不控制会可能有什么问题?

  2. 问题四 如果用过mysql: mysql的分库分表可以问很多东西,但比较分散,每个公司用的基本都不一样,大多时候只能问一些原理性的。所以我可能不问,而会问一下事务。 比如spring里的@Transactional怎么用?有时候会不生效,为什么? 如果答上上了aop可以顺便问问;如果答上了异常,也可以顺便深入问问,等等。

因为redis和mysql有很多问题都与平台组相关,我公司的开发人员较少接触,所以不太好问网上的那些深入问题。

  1. 问题五 上面几个都不是和java直接相关,有些人可能都没用过,就不太好问。涉及java的,我遇到最多的问题都是和内存和多线程相关的。 比如,程序突然内存溢出报错了。怎么排查原因? 这个涉及到很多工具,jconsole、jvisualvm、jstack、jmap等等等等,但有些时候只在linux生产环境才能重现的,那有些工具就不太好在windows或者mac上调试了。 这个时候又怎么办? 有些时候通过日志或者jstack等,能明确知道是哪一行代码抛出的内存溢出,是不是就代表这行代码有问题?如果不是,又怎么定位是哪一行? 如果程序的内存突然增大很多(还没有溢出),又怎么定位问题?可能是什么原因?如果此时cpu也突然增高又可能是哪方面的原因?

如果一个程序很多循环,怎么能够尽可能避免死循环的出现?死循环如果出现了会有什么问题?

一个static的大Map,怎么清空里面的内存?有时候会发现这个Map明明指向了另一个对象了,但是原来的内存好像没回收,内存的占用还是越来越大,这是为什么?最终会不会溢出?

多线程下的问题就更是无穷无尽了,比如多线程下SimpleDateFormat可能会有什么问题?怎么避免? 多线程下Map和List这些该怎么使用?等等

最后

这些问题都是现在还能临时回忆起来的,其实还遇到很多问题,这些问题都是我的同事解决的。 我的同事虽然理论不太好,大多去不了大厂,但是问题还是都能解决的。所以如果能答上了怎么解决,面试就通过了,即使原理部分并不太说得很清楚。 对于经验较少的同学,能提供思路不能解决我觉得也都可以通过了。

最后说下,我们HR说实习生转正是基本100%的,但是根据我的观察并不是,而且转正率不高,虽然大多数是看不起我公司,但也有很多确实在干活时候发现不行的,领导自然也就不让转了。 而且,我面试的时候发现,很多同学都有腾讯、阿里的实习经验,我想为什么还会选择我们公司呢?一来可能是多积累经验,二来也可能是大厂也不好转正吧。(如果有人想看,后面也可以写下校招的过程)

写于2020.4清明。