Android工程师转型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


个人公众号:石杉的架构笔记(ID:shishan100)

欢迎长按下图关注公众号:石杉的架构笔记!

公众号后台回复资料,获取作者独家秘制学习资料

石杉的架构笔记,BAT架构经验倾囊相授


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/275118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

书呆子rico_寻找设计和类型书呆子的清道夫

书呆子ricoI studied graphic design at an art school where typography was a core focus. I took 3 levels of typography classes and nearly lost my mind! But even before I studied type, I had a soft spot for signage. It’s one of the themes I enjoy shooting mo…

Regsvr32 dll OCX时报错,LoadLibrary(Dllname) 内存访问失败。

解决办法: 把要注册的DLL或者OCX文件COPY到C盘根目录,运用命令提示符工具,进入C盘根目录,再运行Regsvr32 DLLname.dll即可。 转载于:https://www.cnblogs.com/BrianLee/archive/2011/12/04/2275425.html

WebStorm 和 VsCode 的结合体来了!

大家好,我是若川。最近组织了源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。周末分享下简单的文章~每…

从零开始学Node.js(八_删查)

node.js的事件 Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。Node.js 几乎每一个 API 都是支持回调函数的。Node.js 基本上所有的事件机制都是用设计模式中观察者…

设计的概念以及含义_什么是设计概念? 以及为什么您应该始终从一个开始

设计的概念以及含义We work on designs almost every day, and we use different design methods to make the design usable, aesthetically appealing, and likable. But, many times, those well-crafted designs fail to reach a level to become market differentiator or…

C# 与java区别总结 收集

节选自《C、Java/C#之比较》http://dev.firnow.com/course/3_program/c/cppsl/2008520/117228.html 使用指针,由程序员根据需要分配、访问内存,程序运行时动作明确直接没有额外的处理步骤,程序的执行效率就高,但若程序员忘了释放内…

碎片化学习前端资料分享~

大前端学习,关注这几个大佬就够了。他们的文章提供的大前端知识非常完备,也经常推荐大前端面试、个人成长相关的文章,对于你来说,学大前端,关注这些公众号就够了。不多说,直接看这些大佬的介绍。&#x1f3…

1、类型和语法——类型

类型:值的内部特征,定义了值的行为,以使其区别于其他值1.1 类型事关强制类型转换1.2 内置类型七种除对象外,其他统称为“基本类型”函数是 Object 的一个字类型(可调用对象)数组也是一个“子类型“1.3 值和…

netflix 工作原理_Netflix如何在屏幕后面工作?

netflix 工作原理Netflix has reported to have over 182 million subscribers worldwide in the first quarter of 2020 (Of course, these numbers don’t include freeloaders like me, who’s family or friends have been generous enough to share their account and pas…

B/S开发中浏览器的工具利器

B/S系统的前端浏览器性能和标准兼容方面是开发中的一个重要问题,把IE中使用的各种工具整理一下,对于开发中标准、规范检查等起到一个作用 主要是三个主流的浏览器和相关的插件 FireFox Firefox-latest.exe firebug-1.7.3-fx.xpi yslow-3.0.3-fx.xpi 安装…

你需要的git命令大全来了

大家好,我是若川。最近组织了源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。虽然你可能用图形化工具…

uitest_您在Swift中的第一个UITest

uitest测试中 (TESTING) 什么是自动UITest? (What Is Automated UITest?) When we speak about testing, we usually think about unit testing. However, there is another kind of test that is extremely powerful and useful in the app world: UITests.当谈到…

UltraGrid中实现下拉Grid(UltraDropDown)

昨天提到了如何在Grid的Cell中下拉列表框,今天将演示如何在Grid的Cell中实现下拉Grid,这也是UltraGrid提供的一个很好的特性。 1. 拖放一个Grid到Form中,添加一些Band Column,然后设置Team栏位为DropDown或DropDownLis…

Vue团队核心成员开发的39行小工具 install-pkg 安装包,值得一学!

1. 前言大家好,我是若川。最近组织了源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。本文仓库 https:…

人脸识别及对比_没有“色彩对比可及性的神话”

人脸识别及对比重点 (Top highlight)When you need to work on interfaces, color contrast is a real thing you have to take into account to make it accessible. You have the right to be afraid of losing part of the aesthetics of your beautifully well-designed in…

Entity Framework4.0 (一)概述(EF4 的Database First方法)

Entity Framework4.0(以后简称:EF4),是Microsoft的一款ORM(Object-Relation-Mapping)框架。同其它ORM(如,NHibernate,Hibernate)一样,一是为了使开发人员以操作对象的方式去操作关系…

mysql 相关子查询使用【主表得数据需要扩展(统计数据依赖与其他表,但是与主表有关联)】...

2019独角兽企业重金招聘Python工程师标准>>> SELECT t.building,t.unit,t.room,t.ashcan ,(SELECT COUNT(a.resident_id) from t_address_book a where a.village_id t.village_id AND a.building t.building and a.room t.unit and a.house t.room and…

竟然被尤雨溪点赞了:我给Vue生态贡献代码的这一年

大家好,我是若川。最近组织了源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。这篇文章在知乎被尤雨溪…

java版电子商务spring cloud分布式微服务b2b2c社交电商(四)SpringBoot 整合JPA

b2b2c电子商务社交平台源码请加企鹅求求:一零三八七七四六二六。JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。JPA 的目标之一是制定一个可以由很多供应商实现的AP…

60款很酷的 jQuery 幻灯片演示和下载

jQuery 是一个非常优秀的 JavaScript 框架,使用简单灵活,同时还有许多成熟的插件可供选择,它可以帮助你在项目中加入漂亮的效果,其中之一就是幻灯片,一种在有限的网页空间内展示系列项目时非常好的方法。今天这篇文章要…