招人背景
首先说一下朋友的公司招人背景,公司招聘PHP高级岗位,负责公司的B2B项目研发、并发问题的处理和解决。领导给了他两个要求:(接下来的讲述我会以朋友的第一人称来进行)
(1)技术比较好
(2)有大项目实战经验。
说白了这是一个纯粹的技术岗位,能够把项目核心代码解决好来,能够去处理好的并发带来的一些问题,避免一些隐患问题。
干我们这行的都懂,大厂都在清理 35 岁以上的基础岗,如果到了这个年纪还混不到中高层管理岗位,基础岗确实不太好找了。
现在的年轻人很厉害,很年轻就走上了管理层,所以我很庆幸公司在年龄上没有卡人,给了很多 30+ 的程序员简历供我筛选,因为我也是程序员,所以我不会在年龄上有所顾虑。
所以,确实就和标题写的那样,这两天我就面试了一个 32岁程序员,全程让我都感觉有点慌……
为什么慌?主要是因为年龄比我大不少,项目经验肯定也比我丰富得多,技术会不会很牛逼?会不会吊打我,狠狠地虐我?我真心怕 hold 不住。
但实际面试下来,场面一度尴尬,结局让我感觉有点唏嘘。
面试过程
面试者 11年工作经验,简历却只有 2 页,可以说非常简练,从程序员到小组长、项目经理、研发经理、技术总监都干了个遍,Java/PHP/Python/C# 也都有涉及。
从交谈过程中,他说是可以做一些优化的,能够去解决一些并发问题,自己的项目经验也比较丰富。首先我说先问些技术问题,然后在了解一下你的相关开发项目。
我: 你有互联网分布式相关项目开发经历么?
面试者: 有啊,那个 XXX 项目就是
我: 好,我看到了,我看这个项目有解决一些高并发的问题,那么我们就先来讲一个普通的场景,因为你项目经验比较丰富,我就不单问技术情况了,就说说场景是如何发生和去解决的。如果有一个普通场景,就是1000个用户下单一批商品,这个商品是多个,不是活动,但是库存只有100,这个情况。
面试者: 这个情况的话就可以使用传统的队列去解决
然后他就一直在说和用队列的处理的方式,之前他是如何处理的,首先,我不是很关心他之前做的一些业务,然后我就打断了他,就是普通的场景,不是说做活动。
面试者:那就根据实际的情况来,可以选择乐观锁的方式或者说分布式锁的方式。
我:嗯,那你说说实现方式,这个点这样用锁会比较好吗?
面试者:那乐观锁的话就是可以使用redis 的watch方法去做,监听一下我们的销量,然后配合redis事务去使用,然后就开始介绍分布式锁。
我:额。。我在打断一下,你使用队列或者锁在这种场景下都会去降低很多的这种项目的吞吐量,那这个的话不是会造成用户的阻塞等待?这样的话系统的吞吐量就会很差了。而且你不管前面用什么方式你最终都要落地到数据库的,那么这个怎么处理呢?
面试者:一般来说都不会在mysql处理呀,用缓存不就可以了。
可能他项目规模都不是很大,对于这种问题只能够去回答一些比较官方的解决方案。
我: 能介绍下服务与服务之间相互调用的时候,如果调用超时了是怎么处理的?
面试者: 超时啊,(想了几秒后)那应该是报错吧
我: 确定是报错吗?(他想了想,不说话,然后我接着说)没有重试机制吗?重试机制是怎样的?
做过分布式的项目的都知道重试机制,至少读操作要支持重试,写操作支持重试的话被调用方还要支持幂等性,不然会造成重复写入。
面试者: (又想了想,笑着和我说)这个项目有点久了,这个不太记得了……
然后我看了下这个项目,2014 年做的,6 年前了,他说太久不记得了,那也情有可原了。
我:好,你最近做的这个项目,能介绍下它的整体架构么?
面试者: 我们用了 Redis做虚拟库存,用了 MQ,用了微服务……(他说了一堆,都没说到重点)
我: 我想问的是,从上到下,这些技术是怎么承接起来的,整体的系统架构是怎样的?(现场没纸笔,不然我都想让他画图了)
面试者: 呃……我知道你的意思,主要是我真的不知道怎么表达……(然后他不说话了,场面尴尬了)
我: (赶紧找了继续追问了一个幂等性问题,因为做分布式的话这块肯定是会遇到的)那你如何理解幂等性呢?
面试者:就是我们使用mq的时候我们会有一个自带的id,然后根据这个id去判断是否被消费,如果已经被消费,那么你就不处理。
我: 不一定就是MQ,就是比如你做一个分布式的接口,那么这个接口的幂等性如何解决?
面试者:那就只能写一个标记了.......如果这个接口被调用了的话,那么你就标记他被调用,这样其他地方就根据这个标记去判断是否还可以调用……(想了半天也没有说出好的方案)
其实这里至少有三个方案:
接口为什么要实现幂等?
前端重复提交选中的数据,后台只产生对应这个数据的一个反应结果。
(1)token机制
当客户端请求页面时,服务器会生成一个随机数token,并且将token放置到session当中,然后将token发给客户端(一般通过构造hidden表单)。下次客户端提交请求时,token会随着表单一起提交到服务器端。服务器端第一次验证相同过后,会将session中的token值更新下,若用户重复提交,第二次的验证判断将失败,因为用户提交的表单中的token没变,但服务器端session中token已经改变了。
(2)通过版本号实现-乐观锁
这个的话就要分情况,因为加锁的话毕竟会对性能有一些影响
(3)Redis原子性
(4)去重表
利用数据库表单的特性来实现幂等,常用的一个思路是在表上构建唯一性索引。将某个内容id与用户id绑定建立唯一索引,每当用户点击这个内容时就往表中写入一条数据,这样重复点击的数据就无法写入。
然后我就问了一些他目前主要负责的项目,项目大概的规模,你自己在项目当中遇到的比较棘手的问题,你们是如何去解决的。了解了一些发展,为什么从上家公司离职这些问题。
总结
最后我把面试情况总结起来和领导说了,领导就说了一句:技术是提前。
第一次面试一个 32 岁的程序员,干了 11 年,如果还要面试做技术的岗位,这个面试情况确实不理想。也不知道他的真实经历是不是一直在外包公司?或许真该清楚认识下自己的定位和未来的职业规划了。
随着我跟朋友的沟通到下来这个文章,其实我也在感慨,朋友说他也感觉更慌了,日月如梭,他也快有这么一天了,如果做不到中高层,也要去和年轻抢饭碗,没办法,这是现实。
年纪来了,朋友感觉自己写代码确实也写不太动了,人也变得越来越焦虑不安,能干嘛去呢?路子也不多,也不知道该如何去发展!
唯一能做的就是朝着自已期望的岗位或者目标不断努力,不断的提升自己的硬实力和基本功,最好的贵人就是拼命努力的自己,程序员的核心竞争力就是你的技术水平,管理能力,只有这些都提升上来了,这样才能去为日益焦虑不安的自己,迎接未来更多的机会。
其实现在也有很多年轻人很厉害,年轻有为的也不少,但是还是要记住一句话,种一棵树最好的就是十年前,其次就是现在,如果你不去开始,那么你永远都不会有成功之花绽放在自己人生的枝头上。大器晚成,为时也不晚,这样的例子也数不胜数,所以你要相信,只要自己一直在准备,找到自己的职业道路,学习规划,机会总会到来的,总会有成功之花绽放的那一天。
如果你喜欢我写的技术文章以及面试总结,欢迎关注收看我的视频,并且点赞、收藏、关注我哦。
我是luke,感谢你的关注!
据说点赞,喜欢,收藏了的小伙伴升职加薪、面试必过,拿到心仪offer!