离开菜鸟&新的面试体验
在阿里菜鸟短暂的待了4个多月,又有了一份热腾腾的面试感想。这又是我蛮遵从内心(renxing)的一个决定。
先说说阿里的好:
- 资源
技术,行业,人脉等大厂全方位的沉淀。 - 思维
对商业思维的锻炼。在我看来思维首先是完成一件事的完备逻辑。比如做一个需求,需要思考关注它的业务价值,技术实现的复用性,上线后的数据量化分析,复盘。这个链路上需要 业务方-》产品-》技术-》运营环环相扣,每个环节都做好了,那么结果就出来了,能力也沉淀下来了。为什么做一个需求要这样子做?我觉得这种思维是明确做这件事的本质和目的是什么。 在职场需要拥有的就是商业思维,员工能帮公司做的就是创造财富和节省成本。我所在的小组,老大经常强调我们去思考业务,思考如何通过技术提升研发效率。 - 价值观
先来看下阿里的新六脉神剑:
客户第一,员工第二,股东第三。
因为信任,所以简单。
唯一不变的是变化。
今天最好的表现是明天最低的要求。
此时此刻,非我莫属。
认真生活,快乐工作。
如果一个公司的员工都抱有如此的信念去身心立行的工作,那公司的能量是巨大的。个人当然也能从中收获。这些要求我觉得更多是从公司,管理者的视角出发的。耳濡目染,这里面有一些好问题:
谁是客户?
变化又是什么?
- 工作氛围
在这段时间,我第一次遇到在职场上给我一些指导建议的导师(虽然不是我名义上的导师),牛逼的老大和一些牛逼的同事....
离开的原因:
-
工作内容不喜欢
作为一个搬砖码农,时时刻刻在搬砖,在搬特别不喜欢的砖。。翻译成人话就是我所做的项目是别人家XX公司的从0.5-1的项目,坑深带的人不行技术要求也不高。。我并不想扮演一个猪队友带一批猪队友的工作角色。 -
个人真正所想
刚进来阿里时,阿里的那些好处真好。可是慢慢的开始纠结,我想要的是什么?
我想要更好的技术平台能够实践提升自己的技术,我想要更多的时间学习自己感兴趣的计算机和其他领域的知识。我想要通过自媒体输出自己的一些能力和思考...我需要除工作外更多的时间,我也需要一个更适合我的平台。
决定离开的那一刻,一身轻松了。
开始找工作环节。
因为跳槽频繁菜等问题,并没有很多面试机会。这波主要面了腾讯两个部门/AfterShip/360/perfma/bilibili这些公司。腾讯的都挂了,其他的针对特定职位针对回答都幸运的拿到了offer了。针对我个人的简历内容,对我的Java和框架知识面试主要集中在Java并发包/JVM基础知识/Redis/Mysql/Zookeeper/Kafka/Canal这些方面。这里不再一一列举这些问题了,感兴趣的小伙伴可以参考我之前一篇面经
中的学习路线。简要总结下我回答的不好的问题吧。
微信支付
- 老鼠喝奶问题
n瓶牛奶,其中只有1瓶有问题。有问题的牛奶会导致老鼠喝了第二天死掉。 如何用最少的老鼠测试出哪瓶牛奶有问题。
回答说:每个老鼠喝一批,比如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
我觉得当时自己没回答上来主要就是卡在没有理清牛奶的排列组合 和 老鼠的排列组合 到底哪个才能解决问题。然后就没想出答案来。后来问了技术群里面的小伙伴,他们说这是蛮老的一道算法题了。。所以还是刷题少,笨呀。。。
- 进程/线程/协程的区别
协程的话不懂呀,当时瞎扯什么CAS。后来搜了几篇文章,大家可参考下:
https://www.zhihu.com/question/50185085/answer/183463734
https://www.zhihu.com/question/20511233/answer/83307265
https://zhuanlan.zhihu.com/p/94018082
https://www.cnblogs.com/chaser24/p/6250841.html
- mysql 主从同步机制
扯了一点mysql半同步机制,然后他问如果master挂掉了怎么办。我说应该是有一些中间件或者运维监控框架可以做mysql自动选主切换的。yy的实现原理主要包括:发现主节点挂掉(通过心跳机制),选主(quorum机制,少数服从多数),数据同步,选主成功对外提供服务 这些阶段。其实觉得和ZK/Redis Cluster等的崩溃恢复是一样的原理,姑且就这么扯吧。
- 分库分表的选择
我提到了之前有个B2b产品是按照大B的用户ID来做分库分表的,然后他问如果小b想查询他在大B中的所有订单,该怎么聚合?
回答说:写入mysql,同时同步给ES,构建索引,查询用ES。
他说还有没有别的方法?然后他有提示说基于小b用户分库分表构建一套数据,我说我项目的场景其实是一个b只会对应一个B的。。。
这个问题也请教了技术群里面的小伙伴,发现问题被我改成了这样子:
对于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是有信仰加成的公司,我的几轮技术面主要考察的是对知识的理解和掌握。因为我乖乖承认没啥性能调优之类的实战经验了。。其中觉得回答不好的问题是:
- Redis cluster的扩容怎么做
我一开始并没有整理好思路,只从Redis cluster的slot迁移说起了一些操作。然后面试官说扩容过程中会存在key的hash找节点错误问题。然后我才开始说数据迁移时的全量迁移-》增量双写-》集群原子切换-》二次读-》读切换 问题。。应该是这个思路吧。。
面经就这么多了,这段时间的体会主要是:
-
认真工作
工作占据了我们一大部分生命,如果仅仅是为了取得一份薪水,那还是过的蛮煎熬的。谋生当然是工作的基本目的,但是需要想清楚从工作中想获得的成长和想得到的结果是什么。明确目标,然后锻炼思维,实践并落地。。 -
工作/生活的平衡
人生的平衡,还要记得找一找自己活着的意义。。