Java笔试面试

离开菜鸟&新的面试体验

2020-03-11  本文已影响0人  Monica2333

在阿里菜鸟短暂的待了4个多月,又有了一份热腾腾的面试感想。这又是我蛮遵从内心(renxing)的一个决定。
先说说阿里的好:

如果一个公司的员工都抱有如此的信念去身心立行的工作,那公司的能量是巨大的。个人当然也能从中收获。这些要求我觉得更多是从公司,管理者的视角出发的。耳濡目染,这里面有一些好问题:
谁是客户?
变化又是什么?

离开的原因:

决定离开的那一刻,一身轻松了。

开始找工作环节。

因为跳槽频繁菜等问题,并没有很多面试机会。这波主要面了腾讯两个部门/AfterShip/360/perfma/bilibili这些公司。腾讯的都挂了,其他的针对特定职位针对回答都幸运的拿到了offer了。针对我个人的简历内容,对我的Java和框架知识面试主要集中在Java并发包/JVM基础知识/Redis/Mysql/Zookeeper/Kafka/Canal这些方面。这里不再一一列举这些问题了,感兴趣的小伙伴可以参考我之前一篇面经
中的学习路线。简要总结下我回答的不好的问题吧。

微信支付

回答说:每个老鼠喝一批,比如a老鼠喝1-2瓶,b老鼠喝2-3瓶。依次类推。可用n-m只老鼠测试出来。他说有更优的方案。然后我就没想出来。。

其实需要解决的问题是:
1.如何让一个老鼠尽可能表示更多牛奶的状态?
2.又如何使得每一种老鼠们的状态组合都能唯一确定一瓶牛奶的状态?

这里的牛奶状态指的是 有毒 和 无毒。老鼠状态指的是 死 或 不死。

问题1是指一个老鼠不止喝一瓶奶,问题2是指一瓶牛奶是否有毒是可能有多只老鼠确定。也就是说老鼠喝牛奶是牛奶的排列组合 和 牛奶是否有毒是老鼠的排列组合。。

注意我们并不是想要全部列举出所有的牛奶N的排列组合,不然需要的老鼠个数就是2^N 了,获取最少的老鼠我们需要用X只老鼠排列组合出N种状态。也就是说2^X = N。老鼠个数应该为log2N (或log2N + 1)只。

假设有4瓶牛奶,0000表示这只老鼠一瓶牛奶也不喝。1000表示这只老鼠只喝第一瓶。我们准备2只老鼠。那么存在 两只死/两只都不死/一只死/另一只死 这四种状态,够表示4瓶牛奶了。比如说:
鼠1:1010
鼠2:0110

我觉得当时自己没回答上来主要就是卡在没有理清牛奶的排列组合 和 老鼠的排列组合 到底哪个才能解决问题。然后就没想出答案来。后来问了技术群里面的小伙伴,他们说这是蛮老的一道算法题了。。所以还是刷题少,笨呀。。。

扯了一点mysql半同步机制,然后他问如果master挂掉了怎么办。我说应该是有一些中间件或者运维监控框架可以做mysql自动选主切换的。yy的实现原理主要包括:发现主节点挂掉(通过心跳机制),选主(quorum机制,少数服从多数),数据同步,选主成功对外提供服务 这些阶段。其实觉得和ZK/Redis Cluster等的崩溃恢复是一样的原理,姑且就这么扯吧。

这个问题也请教了技术群里面的小伙伴,发现问题被我改成了这样子:

对于b2b2c的场景,订单按照b用户ID来做分库分表的话,c用户(可能下多个b用户的订单)去查订单时,需要做聚合,该怎么解决。(我也不知道我当时为啥改成了这样,但问题意思其实差不多的)。优秀的小伙伴们说了这个问题想问的两个思路。

思路一:b2b2c按照微服务的理念有3个领域边界:b/b/c,每个 服务领域内部都维护自己的表,所以c查b的话,查自己的表就行了。还有一个细节:在c领域内可冗余一些基本属性,这样在列表展示时,不去查b的东西;当点击进入b的详情时,再去分库分表查,这个时候就没有聚合了。

思路二:分库分表间怎么聚合的问题

分库分表下聚合,可以先LocalHashAgg,然后gloabalAgg。聚合一般就是先groupby分组准备好数据然后再做标量运算,标量运算是可以逐渐累积的,所以可以先针对每个要聚合的列累积标 key量数据。也就是
先在每个分表上做哈希表:
groupby key->scalar value
然后再汇集到一个节点合并

变成了spark的group by应该怎么实现的问题。。

总之我觉得这问题的回答够我写这篇文章装逼了,里面的名词大家自己搜索吧。。。

我一两句就回答完了,然后他也懒得继续问下去了。。其实阿里内部技术论坛有很多业务中台的分享文章,想进阿里的小伙伴加油呀,我是无缘了。。之前有了解到很棒的支付领域博主凤凰牌老熊
感兴趣的大家也可以关注一波。

后面面试官还提到了了c++/go/大数据的这些名词,我都说我不会。感谢面试官的一小时。。

腾讯PCG部门

我觉得我是被面试官刷候选人面试次数的,不觉得问了什么技术问题,30分钟让我GG了。

离腾讯还很远。。。

AfterShip

我说我懂一些Redis的原理,二面让我自由发挥。我中间提到了缓存淘汰策略,LFU/LRU,说LFU的淘汰效果比LRU好。然后他问我做过测试吗,实际工作中使用LFU吗?我只好说我看过别人博客中的一些性能测试数据。。类似的也问了一些关于性能测试调优实战的问题。但是在我的工作经历中我并没有多少类似的实战经验,硬伤。。面试结束我问他对我有什么建议,可能基于我的简历和面试表现,印象中记得他提到的两个点是:
1.明白自己想要的
2.假设-》验证-》落地-》过程中有沉淀
(类似吧,我有些忘记了,感谢面试官,面试官其实很牛逼的。。)

CTO面的话就是要表明“价值观”潜力的时候了。我表达了作为一个开发对产品运营/商业思维/数智量化/owner精神的兴趣。。总之我觉得我是靠这番自吹才能幸运拿到offer的。

题外话:在这波面试中,在谈论非技术话题的时候,我都在尽量表达我对产品运营和管理等商业思维和软技能的兴趣。有用,有趣。。

奇虎360

一面主要由名词概念引申Java的一些并发体系的内容。二面我提到一些fsync/fork/AQS,然后他接着问fsync/fdatasync的区别,fork都包含哪些函数,c++中的Multithreading听说过吗?

我懂个鬼,不过我觉得面试官很牛逼就是了。。

perfma

学Java的很多都看过假笨大佬的JVM文章吧,因为几个月前面过一次。所以这次的技术面试很简单。也因为我面试的岗位所需技术深度问题,假笨大佬让我讲讲Java agent,我讲的不好也就不咋再接着聊技术了。记忆较深的问题有:

对问题的第一反应总能暴露点什么,我还需要强化的思维和行动。。

bilibili

bilibili是有信仰加成的公司,我的几轮技术面主要考察的是对知识的理解和掌握。因为我乖乖承认没啥性能调优之类的实战经验了。。其中觉得回答不好的问题是:

面经就这么多了,这段时间的体会主要是:

上一篇下一篇

猜你喜欢

热点阅读