坐标上海、
》
博主最近找工作的真实经历。
从01月5号-01月11号为期一周的面试安排以及遇到的问题,做一个总结,带你走进2019年这个互联网寒冬环境下找工作的真实经历,带大家做一个梳理,希望能帮到大家。
》
这里不讲虚的,直接上来就是面试官抛出的问题,以及后来面试通过情况,回答问题情况,关注点在哪,整个做一个详细的说明,毕竟年底,HR想压薪资,并且好多一部分公司招人需求并不是很强烈,寒冬已至,只有不断的面喽…
好了,下面开始总结。
》
从01月02号周三开始投递简历,面试邀请往后排,安排了为期3天的面试,然后,后面边面试边投递。
2019.01.04周五 小雨
1
Firstday AM10:00
这天安排了3家,甲方和外包均有、
周五上午10:00 甲方,上海市黄浦区,地铁9号线打浦桥站
1、老流程,填表,笔试(非技术题),面试
2、笔试不多说,直接进入面试
面试官3人组,技术面试官(27/8年轻小伙子),hr(大姐姐),产品(大姐姐)
1、自我介绍,博主傻帽的说了如下:
“你好,我是打豆豆, 老家xxx,以前在北京一家外包,这家公司主要做金融以及电商的项目,最近做了个基于springCloud架构的综合品类电商的这么一个项目,我在项目中负责商品后台管理以及es实时搜索模块的开发,参与了…此处省略100字 ”。
问题如下:
说老家时候,hr大姐姐直接打断:“你说下你之前在哪家公司?”
打豆豆:xxx 还没说完 hr又打断:“说下最近做的哪个项目,还有在项目组中担任什么样的角色?”
打豆豆:比拉比拉…负责商品后台管理以及es实时搜索模块的开发
2、支付
技术面试官: 说下支付模块实现
打豆豆内心 : 尼玛,老子开发的是后台商品管理,上下架,CURD,还有ES搜索模块,你问我支付模块…
打豆豆不动声色 : 支付这个,前台…到order微服务生成唯一order号…调用微信支付宝银联接口,支付成功更改订单状态status …
3、秒杀
技术面试官: 说下商品秒杀实现
打豆豆内心 : 尼玛,秒杀业务的线程并发,熔断,限流,以及单人秒杀权限只有一次,orderId 不重复支付(分布式事务)最终结果一致性。实在不行用TCC
打豆豆不动声色 : 支付这个,虽然不是我开发的,也有参与,保证支付订单的幂等性呗
PS: 当然现场答得不好,好多东西没讲出来,
我可以用分布式锁来解决,
也可以用身份标签来解决
当然重要的是支付ok 生成的订单流水插入mysql ,重复请求支付同一orderId时候先查询流水,然后决定事务是否回滚、
4、整个springCloud的架构了解么
打豆豆:
5、JWT鉴权
技术面试官: 哎呦,还做了JWT鉴权,你说下JWT鉴权实现流程是怎样的?
打豆豆内心: 尼玛,上脸了…麻烦瞅下简历,你这一问这个项目都是我做的好啦,我独立开发,我是全栈…
打豆豆: 额,这个… 结合Zuul网关微服务做了一个JWT(java webService token)+rsa 相结合…
请求进来…
auth-center鉴权中心微服务,存放一个rsa.pri(私钥)…调用…微服务…
在每一个微服务存放一个rsa.pub(公钥),用来解密token 、完成对用户的鉴权…
PS: 当时答得一塌糊涂,以上均是做了优化,
防止有小伙伴没有看清楚,照着我这博客背然后弄错了,面试吃瘪回来找我理论。
所以这些回答均是优化过了,当时这个jwt 鉴权答得不怎么样、
6、日常高并发从不缺席
技术面试官: 你们并发量多少?秒杀时候高并发问题怎么处理的?
打豆豆内心: 这个是我强项啊
打豆豆: mysql 并发600左右,使用redis的master-salve 读写分离架构以及消息队列,外加mysql 主从,数据分发
表结构优化,当然表结构优化这一点不能够过早的优化,在你并发量较低情况下,业务需求不需要做过早的分表,过早的分表会导致一些其他的问题凸显、
PS: 当然不能够忘记 高可用,宕机仍会导致你整个应用的瘫痪,这一点上springCould较为注重AP
技术面试官: 恩,hashmap用到过?hashmap的特点 ,实现原理是怎样的?
打豆豆: …使用场景在… 底层数据结构是…
技术面试官: hashmap的hash冲突 怎么解决?
打豆豆内心: 啥?懵逼…
打豆豆: 不太了解
PS: 解决方式,1、再次hash 2、链表对 相同hashcode值的key 进行处理(hashmap底层默认的处理方式)
当然,redis 单机模式读写数据qps在万级别,qps要达到 数十万级别的话,那就要用读写分离,集群了,redis集群可基于zookeeper 和redis cluster 搭建、
具体可自行百度
小结
这家凉凉,下午还有两家
Firstday PM13:00
周五下午13:00 外包,浦东新区碧波路 ,2号线张江高科地铁站
这家上去就是让做题
1,N道逻辑判断
2,定义单例Rectangle类 编码;判断2个矩形相交编码
好多人在等,笔试没过
Firstday PM16:30
周五下午16:30 外包,徐汇区华宜大厦 ,9号线宜山路
1、无笔试
2、面试
redis 。分布式。mysql存储过程(当时没答出来)。高并发
3、薪资未达到期望
2019.01.06周日 小雨 下午2:30
1
Second day PM 14:30
甲方,上海市杨高中路,xx科技
流程
1、填表笔试,几个选择,编程题 :系统时间上一个月是哪一天?
2、面试
结果未通过
技术面试官: ok ,自我介绍下
打豆豆 : …负责某某某…
技术面试官: ok ,thymeleaf 静态化怎么实现的
打豆豆 : …xxx
静态化的具体实现(回答的不好)、
PS : 静态化,生成HTML,请求进来从nginx 拉取静态页面…但是有静态化同步问题,使用mq解决
技术面试官: 静态化页面存在可变动的信息?类似于库存?
打豆豆 : 当然了,有货没货显示就行了,status字段么
技术面试官: es 搜索,秒杀
打豆豆内心 : 秒杀你妹,这模块又不是我做的…
打豆豆 : 怎么怎么 … 秒杀配置熔断限流
技术面试官: nginx 服务器,使用场景,哪里用的?除了反向代理别的地方用在哪了?
打豆豆 : 熔断限流具体设置(没答上来)。
PS : 设置线程熔断时间 300ms ,为了单线程 能抗 3/s 个请求、
技术面试官: 期望薪资
技术面试官: 有什么想问的?
打豆豆 : xxx上下班时间,你们主要做哪些方向?线上碰到过什么比较棘手的问题?支付幂等性怎么保证?
技术面试官: 有没有其他要问的?
打豆豆 : 没有
2019.01.07周一 晴
第三天排了3家
1
2
Third day AM 10:00
甲方,上海市长宁区通协路,地铁二号线淞虹路站
流程:1、笔试
2、面试
笔试未通过,算法和编程以及表设计写了下,估计做完中午了,没写完直奔下一家
题超多,sql 题20道,选择6页,算法(二分法),表设计1个
数据库优化设计1道
表拆分1道
Third day PM 14:30
甲方,2019年1月7日 14:30
上海市黄浦区打浦路
无笔试
期望薪资未达到
以下为了节省时间,直接磕重点了,不写那么细了
技术面试官: 项目
技术面试官: 秒杀实现、springcloud用了什么组件
打豆豆 : Zuul 等等
技术面试官: 数据库
打豆豆 : 就一些优化问题,引擎优化具体怎么做讲一讲ok了,结合redis 处理并发
技术面试官: 递归了解多少,jdk8新特性
打豆豆 : 递归开始结束条件,新特性lambda
技术面试官: 我们是一家…期望薪资多少… 什么问题?
打豆豆 : 恩恩…比拉比啦…
技术面试官: 引擎 …内存片段怎么怎么滴…微信厉害吧,我仿微信写了个一样的…
打豆豆内心 : 牛批牛批…
Third day PM 17:00
甲方,2019年1月7日 17:00
上海闵行区 ,甲方 中庚环球创意中心
无笔试
未通过
技术面试官: 说下项目,负责那些模块
技术面试官: springcloud都哪些组件
技术面试官: hashmap hashtable 还有线程并发问题
技术面试官: redis集群高可用怎么保证
打豆豆: 比拉比啦…
技术面试官: 有用过es,那你说下es的原理
打豆豆内心: es不就读写,底层怎么读怎么写…到内存buffer …刷新…oscache…segmentFile合并…
然后使用的话,创建index ,映射… 根据词条…
技术面试官: IK分词器底层原理
打豆豆内心: 栽了…
打豆豆: 栽了…
2019.01.08 周二 小雨
1
Fourth day AM 10:30
甲方,上海市张江路,地铁2号线广兰路站 xxx金服
流程
1、无笔试
2、面试
结果未通过
技术面试官: ok,负责了后台和搜索,那你说下购物车怎么实现的,就说下从购物车的表设计,到添加购物车,然后展示购物车,使用redis 的话,你是如何设计 key 和value 的…整个你来说,我来写?
技术面试官: 我们就说说最常见的购物车模式,登录才能够添加展示购物车的这种,来,你讲一讲。
打豆豆内心: 尼玛,这个
打豆豆: 可以把数据存放在localStorage, 购物车若基于redis 设计的话,key 设计成userId ,value 设计成 map<skuid, 商品数据> ,就是一个双层map结构
1、添加购物车
数据添加到mysql同步到redis ,并存入localstorage 中
2、展示购物车
localstorage 中是否存在数据,
存在 ,返回值渲染到页面、
不存在,请求redis 把数据渲染到前端、
技术面试官: 涉及到哪些表?
打豆豆: 涉及到的表有:
tb_user 、tb_spu、tb_spu_detail 、 tb_sku 、tb_spec_group 、tb_spec_param 、tb_category 、tb_brand
技术面试官边记边问: 涉及到这么多张表,说下你封装了哪些数据?
打豆豆内心已接近崩溃: 商品的通用规格参数、特有规格参数…比拉比拉…
技术面试官边: ok ,目前这些问题均已解决,你说后台商品是可以修改的,我修改商品,你购物车如何同步?
打豆豆内心: 终于正常些了,呼呼
打豆豆: 使用rabbitMq 队列,在后台定义监听器,监听…比拉比啦,删除redis ,创建新的redis 数据
技术面试官边内心: 好,重点来了,小伙子,嘿嘿
技术面试官边: 方案可行,具体下,删除redis 你怎么找到被更新的数据的id ? 也就是说,redis 中这么多数据,你怎么找到哪个被更新了,哪个被修改了?
打豆豆: 额,额,没答好
技术面试官边: 其他问题开始问… 秒杀怎么实现的
打豆豆: 比比比…
技术面试官边: 你们版本控制工具用的什么,常用哪些命令?
打豆豆: git svn 都用过,现在用git ,用了git 就停不下来…创建分支,合并分支…
技术面试官边: 合并分支几种方式?
打豆豆: 2种,…
技术面试官边: 另一种呢?
打豆豆: 我只用过这一种,打豆豆内心一脸黑线
技术面试官边: 既然git 分布式的,为什么说分布式?
打豆豆: 比拉比啦,还举了个提交代码的例子
技术面试官边: mysql 数据库优化,你在开发中做了什么优化,具体细节
技术面试官边: 数据库引擎优化你做了哪些?
打豆豆: 没有做,但是可以这样优化…ok,就这样
技术面试官边: 你提到MQ,你说下你用过几种?都有什么优缺点?
打豆豆: activemq、rabbitmq、kafka、rocketMq 比拉比啦…高吞吐的话就kafka了,比拉比拉…
技术面试官边: 技术广度是够了,期望薪资多少?有什么想要问的?
打豆豆: 估计凉凉,随便问了点
技术面试官边: 哦,今天先到这儿
每一个购物车均是一个对象(如下),所以购物车列表是个 json数组
{
skuId:2131241,
title:"大麦",
image:"",
price:190000,
num:1,
ownSpec:"{"机身颜色":"陶瓷黑尊享版","内存":"6GB","机身存储":"128GB"}"
}
1
2
3
4
5
6
7
8
外层map的key
// 获取登录用户
UserInfo user = LoginInterceptor.getLoginUser();
// Redis的key
String key = KEY_PREFIX + user.getId();
// 获取hash操作对象
BoundHashOperations<String, Object, Object> hashOps = this.redisTemplate.boundHashOps(key);
// 查询是否存在
Long skuId = cart.getSkuId();
Integer num = cart.getNum();
Boolean boo = hashOps.hasKey(skuId.toString());
//判断
1
2
3
4
5
6
7
8
9
10
11
Fourth day PM 13:30
外包某为,上海浦东新区锦绣东路 锦绣申江,地铁2号线广兰路站
无笔试
2、面试
结果未通过,原因:缺乏移动性,至今不懂他说的移动性是什么、
技术面试官: 说下项目,负责那些模块
订单模块说说怎么开发的
微服务配置
参与的哪些模块都说下
打豆豆内心: ok…
打豆豆: 比拉比啦…
技术面试官: redis相关
集合数组,hashmap
mq使用长连接短链接,使用场景
设计模式了解多少?单例模式使用场景
技术面试官: 怎么保证订单的一致性问题
打豆豆: 好多方法啊,1、加锁,2、使用身份标识,3、可以使用mq 连接各个服务 …不推荐使用分布式锁 …
并发性能收到影响…推荐使用ticket …
技术面试官: zookeeper了解多少,谈下使用作用等
打豆豆: 配置管理,故障转移…
技术面试官: maven构建子工程
打豆豆: 怎么滴怎么滴… 打包方式 pom …依赖传递…
技术面试官: 有什么想问的?
打豆豆内心: 没问期望薪资,ok ,问你几个问题,看你水平咋样,反正是凉凉了,露出了邪恶微笑
打豆豆: 你们业务流 是怎样的,哦,做支付啊,ok,TCC有用过? 你们是怎么保证分布式订单不重复支付的呢?
技术面试官: 啥?
技术面试官: 加锁
打豆豆: 是加同步锁 线程?
技术面试官: 恩
打豆豆: 锁级别跳不过jvm 啊,并且对性能上有影响,有考虑过么?其实使用zk锁也可以解决这样的问题
技术面试官: 使用分布式锁
打豆豆: 其实,分布式锁一样跳不过 jvm ,本质是一样的,那这个你们是怎么处理的呢?
技术面试官内心骂娘: 额,我们都是前端做的,我们调接口就行了
打豆豆: 不会吧,前后端一般情况下都会做校验呀,尤其后端数据库这块要保证数据的一致性、
技术面试官: 不知道、你还有其它问题么
打豆豆: 没有了
PS: 其实这个问题给每一个请求一个门票,支付req来了校验门票,已支付,插入数据库流水,同步redis ,同时销毁门票,第二个请求来了,判断是否存在流水就行了,只要不是特别要求一般用不到TCC事务补偿,基本这些就能99.99保证不重复支付了
Fourth day PM 17:00
外包,外高桥富特北路237号,6号线航津路站;
1、无笔试
2、面试
结果未通过,面试过程中就收到邮件说已停止招聘了,尼玛大坑
技术面试官: 随意问了几个模块
技术面试官: concurrentHashMap 什么特点?
技术面试官: null 键,那你说为什么支持null 键?
打豆豆内心: 好吧,我认栽…
先点开源码过一下,然后写个demo 跟进去瞅瞅
//key为null的话 hash值为 0
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
// 源码如下:
public V get(Object key) {
Node<K,V> e;
return (e = getNode(hash(key), key)) == null ? null : e.value;
}
1
2
3
4
5
6
7
8
9
10
6.1 、开启debug
/**
- @auther SyntacticSugar
- @data 2019/1/11 0011下午 10:05
*/
public class YZTest {
@Test
public void test(){
HashMap<Object, Object> map = new HashMap<>();
map.put(null, "null值");
System.out.println(map.get(null));
}
}
1
2
3
4
5
6
7
8
9
10
11
12
6.2、跟进去
// 底层是这样处理的
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
1
2
3
4
再往下会调用hash(key) 方法对key 进行hash值计算,把计算出结果传参,调用putVal( ) 方法、
//key为null的话 hash值为 0
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
1
2
3
4
5
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
//声明变量
Node<K,V>[] tab; Node<K,V> p; int n, i;
// 1、直接到这里判断
if ((tab = table) == null || (n = tab.length) == 0)
//2、满足条件就调用 resize()方法返回一个Node<K,V>[] 对象
// 给 tab赋值
//n=16
n = (tab = resize()).length;
if ((p = tab[i = (n - 1) & hash]) == null)
//3、 i=0
//调用构造创建 Node对象
//直接到 ++modCount;
tab[i] = newNode(hash, key, value, null);
else {
Node<K,V> e; K k;
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))
e = p;
else if (p instanceof TreeNode)
e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
else {
for (int binCount = 0; ; ++binCount) {
if ((e = p.next) == null) {
p.next = newNode(hash, key, value, null);
if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
treeifyBin(tab, hash);
break;
}
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;
}
}
if (e != null) { // existing mapping for key
V oldValue = e.value;
if (!onlyIfAbsent || oldValue == null)
e.value = value;
afterNodeAccess(e);
return oldValue;
}
}
//4、 ++modCount值为0
++modCount;
//5、 ++size值0 ,threshold值是12
// 所以走afterNodeInsertion(evict);
if (++size > threshold)
resize();
//6、 evict值为true
//然后执行 return null 就返回 null
afterNodeInsertion(evict);
return null;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
返回值为null ,所以key 为 null
至此,hashmap 底层对null 键的处理就完毕了、
2019.01.09 周三 小雨
安排了4家,面了3家
1
2
Fifth day AM 10:00
外包,上海黄浦区广东路,南京东路地铁站 ,世界贸易大厦
流程
1、笔试
2、面试
结果未通过
技术面试官: ok,负责了后台和搜索,那你说下后台商品那几张表?
技术面试官: 你做的这么快就忘了?
打豆豆内心: 尼玛,逆向生成又不是我设计的表
Fifth day PM 13:00
甲方,上海市杨浦区,地跌8号线黄兴路
无笔试
2、面试
结果通过
项目
静态化实现同步
redis分布式
hashtable和hashmap和concurrenthashmap
开源项目参与
部署
dubbo和cloud的接口区别
如何保证分布式商品id唯一
如何保证订单不重复(幂等性)
spring了解多少
mvc框架了解多少(手写过mvc框架,估计是个加分项)
bean加载的整个过程(答的不好)
只回答了工厂,反射
mq的了解,项目为什么选rabbit
搜索模块
遇到什么问题,怎么解决的
单例模式有用到?什么场景?还有哪些场景
设计模式了解多少
Fifth day PM 15:30
甲方外派,上海徐汇区钦州路,地铁1号线人民广场
无笔试
2、面试
结果一面通过
如何保证分布式id唯一,
如何保证
线程阻塞和同步?
打豆豆: 同步/异步关注的是消息通知的机制,而阻塞/非阻塞关注的是程序(线程)等待消息通知时的状态。
打豆豆:
阻塞状态(Blocked):一个正在运行的线程因某些原因不能继续运行时,就进入阻塞 状态。这些原因包括:
等待阻塞:当线程执行了某个对象的wait()方法时,线程会被置入该对象的等待集中,直到执行了该对象的notify()方法wait()/notify()方法的执行要求线程首先获得该对象的锁。
同步阻塞:当多个线程试图进入某个同步区域(同步锁)时,没能进入该同步区域(同步锁)的线程会被置入锁定集(锁池)中,直到获得该同步区域的锁,进入就绪状态。
其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
treemap和hashmap
docker部署(不知道)
mysql语句执行顺序(没答上)
insert into(没答上)
select insert into
递归
项目越来越慢怎么处理
死锁问题,遇到过?什么是死锁问题?
什么场景遇到?
安全问题考虑过?你开发遇到过?
文件注入,sql注入,命令注入?前端注入?怎么解决
前端框架怎样?vue门户是你写?
说下所有的你熟悉的前端框架
能写前端?
打豆豆: 写能写,丑一点而已
一般都是前端写
学习通过什么方式
2019.01.10 周四 小雨
安排了2家,面了一家
1
2
Sixth day AM 10:00
外包,凯旋路369号 龙之梦雅仕大厦, 地铁二号线中山公园站
流程
1、笔试
2、面试
结果未面试,做完笔试11:00 等待20分钟仍不见面试官,直接走了
一个外包公司而已,不懂得尊重人
Sixth day PM 14:00
甲方,上海市松江区, 地铁松江大学城站
流程
1、笔试
2、面试
结果薪资未达到期望
轮询底层
网关配置
熔断限流配置
redis超高并发
jwt鉴权如何传递信息,如何解析出userInfo中信息到其他微服务
userid保存到哪里?rsa非对称加密载荷中
如何判断2个token是不同的token
(当时回答每个用户携带标记,)
(面试官说解析出来token判断id ,也可行,
判断signatrue )
后来想想是 signatrue标识着每一个token都不同
(宝贵时间问了问)咨询了业务流程
2019.01.11 周五 小雨
安排了2家,某国企复试二面,宝钢一面
1
2
Seventh day AM 9:30
某国企二面,浦东新区沈家弄路, 地铁二号线
无笔试
2、面试
结果未通过,乌龙了,招前端的,我一个后端,嘎嘎
Seventh day AM 9:30
外包宝钢,宝山区漠河路600号 东鼎国际大厦,3号线友谊路站
无笔试
2、面试
结果未通过,做物流项目,卖钢铁,对面试官水平保持怀疑
技术面试官: 我们是卖钢铁的,你们做商城的,差不多
技术面试官: 我们这边主要做物流,其他人做其他的…
打豆豆内心: 哎呀,我去,啥都没问
技术面试官: 对加班什么看法
打豆豆: 钱到位一切ok
技术面试官笑笑: 你期望的这个就能让你拼命干了么?
打豆豆内心: 这家伙不是来招人的…
打豆豆: 开什么玩笑,这点薪水是正常上下班的钱…
技术面试官: 有什么想问的么
打豆豆一分钟都不想待: 没有
That's all .
欢迎工作一到五年的Java工程师朋友们加入Java高并发: 957734884,群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!
网友评论