前言:
现时我们对“java安卓软件开发”大概比较关注,姐妹们都需要剖析一些“java安卓软件开发”的相关文章。那么小编同时在网络上汇集了一些有关“java安卓软件开发””的相关文章,希望看官们能喜欢,你们一起来学习一下吧!欢迎关注头条号:石杉的架构笔记
周一至周五早八点半!精品技术文章准时送上!!!
精品学习资料获取通道,参见文末
本文是公众号读者jianfeng投稿的面试经验
恭喜该同学成功转型
目录:
毅然转型,没头苍蝇
制定目标,系统学习
面试经历
毅然转岗,没头苍蝇
首先,介绍一下我的背景。本人坐标广州,2016年毕业于一个普通二本大学,曾经在某机构培训过Android。
2018年初的时候已经在两家小公司工作干了两年的android开发,然后会一些Tomcat、Servlet之类的技术,当时的年薪大概也就15万这样子。
由于个人发展规划,在当时就已经决定了转型干Java后端开发了,但是由于之前没有相关经验,当时好像一个没头苍蝇一样,胡乱买了几本书籍,准备学习Spring MVC,MyBatis的XML配置方式。
但是当时有个同事给我提了一句,现在都流行Spring Boot了,然后我就转学Spring Boot,百度网上看了几篇文章,写了几个Demo就以为自己很吊了。
接着又从同事的那里得知,还有个Spring Cloud的东西,现在很流行。然后又转战Spring Cloud,同样看了几篇博客写了几个demo之后觉得自己叼的不行~(汗颜)
接下来,还是熟悉的套路,同事说jenkins很吊,docker很吊、k8s很吊呀,还有什么领域驱动模型,DDD啊,被牵着鼻子走。
反正听到别人说那个牛逼就学习那个,但是每个技术都是demo入门级别的掌握水平。我当时甚至连Controller/Service/DAO/Mapper、DO/DTO/VO之类的基本常识都不会。
制定目标,系统学习
这一切的转折点在2018年5月,当时觉得这又搞一下,那又搞一下,不行啊。没有系统的学习,各种东西都掌握的不好。
于是沉下心来开始进行系统的专题性学习,并且自己定下对每个技术的学习目标。官网文档开始,先掌握其基本用法,然后跑通最基础的demo之后,基于这个demo,一步步调试,读懂其底层源码,边读边写笔记,这个过程及其漫长和煎熬。
在这个过程中,我疯狂的搜索了各种视频教程,博客,公众号,各种途径都用上了。
给我的感觉是,确实有视频、博客讲的挺好,但是极少。很多讲的还是比较浅,点到为止。此时需要我们自己进一步深入到源码层面研究,一点点啃,一点点摸索,边啃边记笔记。
在这一段时间,利用了很多业余时间学习,基本上可以保证工作日每天学习2~3个小时,周末每天平均12小时。
(可能这块大家不是很相信,大家都是上班,为什么我就有时间学习呢。我要说的是,时间是自己控制的,可以利用坐地铁时间或者午休时间)
就这样准备了大半年,截止2019年3月,因为对于当前公司的业务场景和薪资不太满意,所以忍不住想出去跳槽了。
在这个过程中,尤其前期,我经历了至暗时刻,摸索学习源码几近崩溃,如同黑暗森林一般。有的源码我反复读了不小5遍,画图、记笔记,一遍遍的强化总结。
然而,正是这段时间,我的整个知识栈飞速扩张,并且因为我学完一个东西,都会自己画图,一步步给自己讲解。这种学习方式让我对新东西的掌握及其扎实,效果比那种泛泛而学好很多。
在这大半年的时间里,学到了包括以下内容:
Java基础
JDK集合、并发包内容,这些基本上都是研究到底层源码了。比如volatile,AQS之类的,已经到了熟练于心,随时可以手工画图的地步。同时专门去学习了设计模式,并且可以初步尝试在公司项目中使用。
微服务架构
现在比较流行的微服务架构,这一块选择了学习比较热门的Spring Cloud。将Spring Cloud的Eureka/Ribbon/Feign/Hystrix/Zuul这些套件深入理解其源码实现,对其底层源码熟烂于心。
分布式技术
比如一些分布式事务,分布式锁,分布式接口幂等性,分布式基础理论CAP之类的东西,这些也要掌握它们的场景以及对应的解决方案。
这里说一下,其实本人就职的公司并没有这些挑战,甚至是单机系统,但是这一块的技术方案其实是可以平时用自己公司项目来设想一下,设想做成分布式之后,会面临什么问题,应该怎么解决。
ps:顺便提一下,这块本人是受了石杉老师的文章:【offer收割机必备】我简历上的Java项目都好low,怎么办?的启发,也推荐大家看一下,在公司没有高大上的高并发项目时,应该怎么应对?
IO、网络基础
这一块个人觉得还是很重要的,比如一些网络基础,Linux IO模型,Java里面的BIO、NIO、AIO、这些内容其实还是很有必要掌握的。
ElasticSearch
这个是分布式搜索引擎,目前大热,一般互联网公司都或多或少用到了es,这一块是需要对其分布式架构原理,搜索原理都搞的门儿清才行。
缓存、MQ
因为面对高并发场景,缓存MQ这两块也是必问的,所以专门看了一些缓存架构实战的视频教程。对于MQ的话,专门对RabbitMQ、Kafka这两种深入研究。
项目经验
项目经验这一块是硬伤,确实来说这一块在原来公司里面不是很大的场景。
高并发这一块平时确实积累不到很多知识,只能通过想象,当系统遇到的并发量提升10倍、100倍的时候,系统应该如何设计?
当遭遇到高并发流量时,用一些什么样的方案可以支撑?采用缓存还是MQ,采用了之后又什么坑,又如何解决,这一块需要自己深度思考一些细节问题。
数据结构、算法
这一块没啥好说的,就是靠平时积累以及leetcode刷题。我刷了几十题这样,加上平时积累的一些数据结构也是比较够用的。
除此之外,在面试前还突击了一下那些场景的面试题,包括MQ、Mysql、分库分表、之类的常见互联网面试题。
这一块主要是看了石杉老师的《Java面试突击第一季》教程,如果你要短期突击,个人真的非常推荐,因为可以迅速帮你补充面试的各种技术点。
ps:个人非常感谢中华石杉老师的几套课程:《亿级流量系统架构》、《elasticSearch从零开始到顶尖高手》、《Java面试突击第一季》,如果你能从头到尾吃透这里面的东西,正常的面试根本拦不倒你!
除此之外,石杉的架构笔记公众号很多精品文章也让我受益良多,比如公众号的并发系列、分布式系列、微服务系列。
文章分析了很多面试高频热门考点,我在面试时,很多问题都直接命中。
因此,我将自己的面经投稿到平台,希望分享给更多朋友。同时也是对石杉老师表示感谢,希望公众号越做越好!
有点跑题。。。喝杯水继续!
看到这里,可能部分同学觉得不可能,在不到一年的时间里从一个啥都不懂的小白,做到能熟练掌握这么多东西的?
我想说的是,每个人的情况不一样,我这边学习一个东西起码是经过5遍之后才能熟练记住,有的甚至看了不下10遍,反复的画图操练,自己对自己讲解。
所以,最重要的是肯花时间去学习。甚至我可以透露一下,我除了学了这些之外,我还学习了一些大数据的技术,比如Hadoop的HDFS、Kafka源码、Spark开发、Storm之类的
面试经历
接下来说下我的面试经历,在面试之前,本人基于职业发展的考虑,投简历基本上都是瞄准比较有点知名度的互联网公司。
面试策略一开始也是想先找几个小公司面面看,试试水。但是,好像今年行情确实不怎么样,往往投了很久没啥反应。
后面一咬牙,干脆直接投心仪的公司,后面通过投简历和内推的一些手段,拿到了5家公司的面试邀请。
我这边面试的仅有5家公司,这些公司的面试套路基本上都是差不多。
1面问基础,二面问项目,3面hr
某汽车服务平台(拿到offer)
首先面试题是有一些算法的,比如让你写一个递归算法,还有一些二分查找之类的题目,总体来说还算比较简单的算法题了。
1面的时候基本上就是自我介绍,然后问问比较熟悉那一块,然后讲了一些AQS原理。当时是手工在纸上画图的。
给面试官讲完AQS之后,又让我把话题扯到了volatile这一块,我就从CPU内存模型、Java内存模型,然后结合CPU高速缓存的数据结构讲解一下可见性问题是如何出现的。
之后又问了一些分库分表的事情,HashMap的原理。
2面的时候是总监面,主要是上来就问了自己有没有遇到到线上full gc,还有一些JVM内存划分,GC收集算法,垃圾回收器之类的知识。
然后讲一下自己看过啥源码,然后围绕着项目问了一些问题,比如说你遇到过最大的挑战是什么?
3面就是hr了,这一块主要就是问一问离职原因(钱太少咯),然后其他就是问一下职业规划,这块按照自己想的说就行了。
最终的结果是拿到了25万的offer。总体来说,这家公司的面试过程相对比较简单一些。
某跨境电商公司(挂掉)
第二家公司主要做跨境电商,是通过内推拿到面试机会的。这里面了2轮。
技术面试:
面试官问的算是比较全面了,首先自我介绍,然后就开始技术问题:
HashMap原理?synchronized和ReentrantLock有什么不同?AQS原理?线程池的各个参数作用?Spring Boot如何实现AutoConfig?还问了CurrentHashMap这一块原理?
接着是问MQ:
用RabbitMQ,他们有几种exchange?消费者推拉模式有什么区别?为什么用MQ?
然后到了Redis这一块:
缓存穿透、雪崩、击穿各种场景的问题以及解决方案?redis为啥速度快?以及Redis Pipeline相关的一些问题。
然后又问Mysql了:
mysql的索引原理是啥?然后mysql的执行引擎有几种,有啥区别?事务隔离级别?线上数据库用什么级别隔离?@Transactional有什么关键参数?针对分布式场景下的事务解决方案是如何实施落地的?TCC事务、还有一些可靠消息方案,针对你公司的业务场景讲解清楚,然后详细问每一个细节是如何落地的,这样会不会出什么问题?
接下来还讨论到分布式,比如说分布式锁啊,zk和eureka有什么不同,CAP理论这一块,还有画出项目架构图。Zuul线上怎么配置。
2面hr面,这一块也聊了挺久,主要也是问一些职业规划啊,还有工作意愿之列的,介绍一下原来工作情况这样。最终是让回去等通知。
当晚通过内推的人知道被淘汰,其实在面试完本人也是觉得有机会的,不过最终却是淘汰了,也没什么好说的,我觉得问的问题80%都答得挺好的。
总的来说,这次面试还是可以的,问的算是比较全面的,自己也知道自己哪一方面不足。查漏补缺!
某少儿在线教育公司 (拿到offer)
这家公司技术总体来说还是非常可以的,3面都是技术,老板也是技术出身,兼了hr的工作。
1面主要让你画出线上的项目架构图,然后针对分布式事务,缓存架构,并发之类的都问了。
比如说分布式事务,还有一些Spring Cloud的底层原理,Hystrix原理,CAS底层如何实现的?HashMap的原理,AOP如何使用的?事务有几种实现方式,RabbitMQ如何控制消费速度?。
2面的也面的比较全面,也是问了一些AQS原理,volatile原理,synchronized底层原理,HashMap原理,针对Redis和ZK两种分布式锁的一些问题
还有一些Mysql优化,索引底层数据结构,还有就是公司部署的时候是服务部署多少机器,是如何考量应该用多少机器?
然后使用到Redis,为什么上来就用Redis cluster架构而不考虑Master-slave模式呢?还有redis cluster为什么是分为16384个slot?
红黑树和完全二叉树有啥区别?B+树原理、为什么不用红黑树实现索引?
线上如何扩容集群?Mysql执行计划,snowflake算法,如何解决分库分表后的跨表join问题?那些场景使用了tcc事务?哪些场景使用了可靠消息方案?
然后让画一下Hystrix的架构原理图,分布式接口幂等性如何保证?如何设计一个1000万并发的系统,要求只能用有限的资源?还有就是一些项目管理的问题。
3面问了一些ArrayList的问题,然后问了Spring IOC有什么作用?还有就是mysql在表数据量非常大并且数据单一的情况下如何优化查询性能?
总结:这家公司最终给了25万的offer。总的来说面试官也算很nice了,问的问题比较全面,基本上项目,java基础、mysql、事务、mq、缓存都有涉及到,也算是测出了我的水平。公司属于比较技术性,可能是因为老板也是技术出身的原因吧。
某职业教育公司(拿到offer)
这家公司纯粹就是混混经验的,面试过程也是1轮技术,1轮hr
技术面试: 基本上就是围绕Spring源码,MyBatis设计思想,还有一些分布式事务的问题。。。然后还问了一些大数据类的问题,HDFS、HIVE之类的问题。然后就是问了一些项目的问题。总的来说问的比较少东西。
hr面:2轮直接hr,然后hr可能是得到1面面试官的反馈吧,当场给我offer。
但是说我这个工作年限(2016年毕业)正常来说是15万年薪的,因为我技术好给到25万,但是30万是不可能了(我当时写期望是30万的)
某智能汽车平台 (挂掉)
1面:2个面试官一起面,主要是围绕项目来问,首先画一下自己的项目架构图,然后问一下你觉得项目里面那一块比较有挑战性。
我就分析了一下Spring CLoud的源码、还有分布式接口幂等性方案,分布式锁,分布式事务的一些方案都讲解了。
然后还问了一些比如说,新旧系统的数据库如何迁移啊?然后怎么做的灰度发布啊?主要都是围绕者项目来问,这一块其实没有问的多深入。
2面也是技术面,主要是问了一些项目的问题,问我做商品服务的,电商详情部分是不是我搞的?
我说了一些缓存架构的东西,三级缓存,数据库缓存双写一致性方案,Cache Aside Pattern,分析了数据库缓存的数据不一致的问题,然后给出了解决方案!
还有如果多个实例如何确保正确,这样又扯到了分布式锁,分别讲了一下Redis的分布式锁和zookeeper的分布式锁,对redisson、curator的底层原理分析了一波。
最后,等了十几分钟,二轮面试官说负责人出差北京了,让回去等通知。最终等了2天也没啥通知,暂且认为是失败了吧。
总的来说,面试了5家公司,拿到了3家公司的offer,战绩还算可以。另外的话,还有一些面试的技巧。我觉得最重要的是自己要有信心,面试失败了难免会气馁,但是这个时候不要灰心,赶紧回去查漏补缺,然后把知识补起来。
另外,面试的时候,如果面试官问道一个问题,要主动带节奏。
举个例子,比如问到了AQS的实现原理,你就可以首先画个图,说明一下AQS底层是如何实现的?然后扯到底层的state变量是volatile的,然后对于volatile又可以扯出可见性,有序性,原子性,然后扯到了Java内存模型,CPU内存模型,还有高速缓存的一些硬件实现啊,MESI协议。以及它是如何通过指令、内存屏障来保证可见性的。
我举这个例子的意思就是说面试官问到一个问题,如果了解其底层原理,就主动说,你看过xx的原理,跟他说一下。这样可以让面试官对你的印象更加深刻。
当然了,这一切都是需要自己有很扎实的计算机基础,还有对某些技术研究的比较深入才能达到的。
最后我还是选择了上文中第一家汽车服务平台,因为几家公司给的年薪都是25w,然后我选择的是最有挑战场景的电商类公司,对于技术成长会比较有好处。
最后,我想说的是,其实我算是半路出家做Java开发的了,付出了很多时间和努力,走过不少弯路,但也收获了不少东西。
我这里不想给各位拼命打鸡血灌鸡汤,个人认为技术积累的过程注定孤独,甚至黑暗,且周期漫长,需要你有足够强的毅力和想改变自己的内驱力。
希望咱们都可以通过不懈的努力,实现自己的梦想。我行你也行的,一起加油!
END
一大波微服务、分布式、高并发、高可用的原创系列文章正在路上,
欢迎关注头条号:石杉的架构笔记
周一至周五早八点半!精品技术文章准时送上!!!
十余年BAT架构经验倾囊相授
推荐阅读
1、拜托!面试请不要再问我Spring Cloud底层原理!
2、微服务注册中心如何承载大型系统的千万级访问?
3、「性能优化之道」每秒上万并发下的Spring Cloud参数优化实战
4、「“剁手党”狂欢的背后」微服务架构如何保障99.99%的高可用?
5、兄弟,用大白话告诉你小白都能看懂的Hadoop架构原理
6、大规模集群下Hadoop NameNode如何承载每秒上千次的高并发访问
7、「性能优化的秘密」Hadoop如何将TB级大文件的上传性能优化上百倍
8、拜托,面试请不要再问我TCC分布式事务的实现原理!
9、最终一致性分布式事务如何保障实际生产中99.99%高可用?
10、拜托,面试请不要再问我Redis分布式锁的实现原理
11、Hadoop底层算法如何优雅的将大规模集群性能提升10倍以上?
12、亿级流量系统架构之如何支撑百亿级数据的存储与计算
13、亿级流量系统架构之如何设计高容错分布式计算系统
14、亿级流量系统架构之如何设计承载百亿流量的高性能架构
15、亿级流量系统架构之如何设计每秒十万查询的高并发架构
16、亿级流量系统架构之如何设计全链路99.99%高可用架构
17、七张图彻底讲清楚ZooKeeper分布式锁的实现原理
18、大白话聊聊Java并发面试问题之volatile到底是什么?
19、大白话聊聊Java并发面试问题之Java 8如何优化CAS性能?
20、大白话聊聊Java并发面试问题之谈谈你对AQS的理解?
21、大白话聊聊Java并发面试问题之微服务注册中心的读写锁优化
22、互联网公司的面试官是如何360°无死角考察候选人的?(上篇)
23、互联网公司面试官是如何360°无死角考察候选人的?(下篇)
24、「Java进阶面试系列之一」你们系统架构中为何要引入消息中间件?
25、「Java进阶面试系列之二」系统架构引入消息中间件有什么缺点
26、「行走的Offer收割机」一位朋友斩获BAT技术专家Offer的面试经历
27、「Java进阶面试系列之三」消息中间件在你们项目里是如何落地的?
28、扎心!线上服务宕机时,如何保证数据100%不丢失?
29、 一次JVM FullGC的背后,竟隐藏着惊心动魄的线上生产事故!
30、「高并发优化实践」10倍请求压力来袭,你的系统会被击垮吗?
31、消息中间件集群崩溃,如何保证百万生产数据不丢失?
32、亿级流量系统架构之如何在上万并发场景下设计可扩展架构(上)?
33、亿级流量系统架构之如何在上万并发场景下设计可扩展架构(中)?
34、亿级流量系统架构之如何在上万并发场景下设计可扩展架构(下)?
35、亿级流量架构第二弹:你的系统真的无懈可击吗?
36、亿级流量系统架构之如何保证百亿流量下的数据一致性(上)
37、亿级流量系统架构之如何保证百亿流量下的数据一致性(中)?
38、亿级流量系统架构之如何保证百亿流量下的数据一致性(下)?
39、互联网面试必杀:如何保证消息中间件全链路数据100%不丢失(1)
40、互联网面试必杀:如何保证消息中间件全链路数据100%不丢失(2)
41、面试大杀器:消息中间件如何实现消费吞吐量的百倍优化?
42、兄弟,用大白话给你讲小白都能看懂的分布式系统容错架构
43、从团队自研的百万并发中间件系统的内核设计看Java并发性能优化
44、如果20万用户同时访问一个热点缓存,如何优化你的缓存架构?
45、「非广告,纯干货」英语差的程序员如何才能无障碍阅读官方文档?
46、面试最让你手足无措的一个问题:你的系统如何支撑高并发?
47、Java进阶必备:优雅的告诉面试官消息中间件该如何实现高可用架构
48、「非广告,纯干货」中小公司的Java工程师应该如何逆袭冲进BAT?
49、拜托,面试请不要再问我分布式搜索引擎的架构原理!
50、互联网大厂Java面试题:使用无界队列的线程池会导致内存飙升吗?
51、「码农打怪升级之路」行走江湖,你需要解锁哪些技能包?
52、「来自一线的血泪总结」你的系统上线时是否踩过这些坑?
53、【offer收割机必备】我简历上的Java项目都好low,怎么办?
54、【offer去哪了】我一连面试了十个Java岗,统统石沉大海!
55、支撑日活百万用户的高并发系统,应该如何设计其数据库架构?
56、高阶Java开发必备:分布式系统的唯一id生成算法你了解吗?
57、尴尬了!Spring Cloud微服务注册中心Eureka 2.x停止维护了咋办?
58、【Java高阶必备】如何优化Spring Cloud微服务注册中心架构?
59、面试官:消息中间件如何实现每秒几十万的高并发写入?
60、【非广告,纯干货】三四十岁大龄程序员,该如何保持职场竞争力?
61、面试官:请谈谈写入消息中间件的数据,如何保证不丢失?
62、【生产实践总结】支撑百万连接的系统应该如何设计其高并发架构?
63、面对BAT大厂的竞争对手时,小公司Java工程师是如何败北的?
64、【纯干货分享】小公司出身的我,是如何拿下知名独角兽公司offer
65、用小白都能看懂的大白话告诉你:什么是分布式计算系统?
66、老司机生产实践经验:线上系统的JVM内存是越大越好吗?
67、Java同学找工作最懵圈的问题:到底啥是分布式系统开发经验?
67、尴尬的面试现场:说说你们系统有多大QPS?系统如何抗住高并发?
68、分享一套GitHub上stars 10000+的Java面试题(含解析)
69、小公司面试10连挂之后,我拿到了互联网一线大厂offer!
70、【架构设计之道】这波操作,会把你的中间件架构带到另一个Level
71、三年努力,梦归阿里!
72、阿里三面,P9面试官是如何360°无死角考察候选人的?
73、如果让你设计一个消息中间件,如何将网络通信性能优化10倍以上?
74、简历写Kafka,面试官大概率会让你讲acks参数对消息持久化的影响
75、【嗅探底层】深入揭秘Synchronized在JVM是如何实现的?
76、面经分享:斩获7枚offer,入职阿里平台事业部!
77、【架构设计的艺术】Kafka如何通过精妙的架构设计优化JVM GC问题
78、不了解这些“高级货”,活该你面试当炮灰。。。
79、面对十亿数据量的技术挑战,如何对系统进行性能优化?
80、Kafka参数调优实战,看这篇文章就够了!
81、阿里小哥带你玩转JVM:揭秘try-catch-finally在底层都干了些啥?
标签: #java安卓软件开发 #java的安卓开发