【云驻共创】资深Java开发者保姆级教你如何学习Java,如何在职场中脱颖而出?
一、前言
根据权威机构statista的统计,2022年全球开发人员最常用的编程语言中,Java稳居前六宝座:
当然了,还有其他权威机构的统计数据,Java的排名还要靠前,不管怎样,Java的受欢迎程度极其高,因为你仔细看下前五的语言:
- JavaScrip:主要用于前端开发;
- HTML/CSS:主要用于前端开发;
- SQL:主要用于数据库开发;
- Python:主要用于机器学习、数据分析、脚本开发;
- TypeScript:主要用于前端开发;
那么Java主要用于什么场景?
答案是Web后端开发、安卓开发、大数据开发等,所以在Java的应用领域中,它的强大和社区生态仍然是其他语言无法比拟的。笔者就是从事Java开发的,深知其语言的受欢迎度,本文我就以专业的Java开发者或者架构师的角度分享一下如何学习Java,互联网上有哪些资源可以利用,以及不同层次的Java开发人员如何指定自己的学习计划、职业计划,最后还会分享如何进行跳槽,如何进行面试,相信本文一定会给你带来帮助!
二、如何学习Java?
如果别人问我如何学习Java,我不会上来就说“Java基础、Spring、SpringBoot等”,而是会先问下对方几年经验,根据其经验来给出建议,本文也是,我会以初级、中级、高级三个层次进行展开。
2.1 初级Java开发(0-3年经验)
对于初级开发人员,还停留在Java语言本身的使用上,这个时候的目标就是怎么从小白变成“代码熟练工”。要想成为熟练工,就得“横向”学习Java语言的各个技术点和周边技术点,比如:
- Java 基础:JVM、JDK等;
- 面向对象编程:OOP概念、抽象、封装、继承、接口等;
- Java 基础语言结构:变量、类、对象、数组、字符串、列表、Map等
- 内存管理:垃圾收集、内存分配等
- Java 高级:反射、异常处理、多线程编程等
对于框架的掌握,基本上也是以熟练使用为主,当然了,最好能够选择一两个框架进行深入研究,这些框架包括:
- Spring:
- SpringBoot;
- SpringCloud;
- MyBatis;
- JPA;
- 等等。
对于数据库我们也要熟练使用,这里推荐大家熟悉三种数据库的使用,包括MySQL、PostgreSQL、Oracle,这三种数据库产品目前使用率比较高。确定学习哪些数据库产品后,你还要学习如何使用数据库,这里就得学习数据相关的技术了,比如:
- SQL基本知识:数据库服务的搭建、配置、建库、建表;
- SQL语句的学习:增(Insert)、删(Delete)、改(Update)、查(Select);
- SQL其他操作:分组(Group By)、排序(Order By)、连接操作(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN)、约束、唯一性、主键、外键等等。
除了数据库,对于初级Java开发,最好能够掌握1-3个中间件的使用,比如:
- Redis:一种键值对非关系型存储数据库,经常用于缓存;
- MongoDB:一种基于分布式文件存储的数据库;
- MQ:消息队列,可以选择一种产品进行学习,比如Kafka。
上面介绍的技术都是Java开发必备的技能,还有一些软技能也要掌握,比如Linux系统的操作、网络技术的原理、开发工具IDEA的使用、连接数据库的Navicat使用等等。
2.2 中级Java开发(3-6年经验)
中级阶段,最重要的就是优化和思考了,相信已经处于这个阶段的朋友能够理解我说的意思。中级工程师,理论上已经属于代码熟练工了,也就是编码完全没问题。但是人人都会编码,你的核心竞争力在哪?那肯定是你能写出更优美、性能更好的代码,并且能够具备排错技能。
所以在中级阶段,如何学习Java?
在Java基础方面,需要深入理解JVM的原理,能够对垃圾回收及其算法有深入了解,方便排查线上OOM问题。
在各类框架上,不仅仅要会用,还得掌握其原理,甚至遇到一些项目难题,能够读框架源码进行解决,还能借鉴源码的思想写出更优质的代码。
在中级阶段,还有一个特别重要的技能一定要会,那就是设计模式,Java中常见的设计模式大概有23种,这23种设计模式可以分成三组,如下图所示:
除了设计模式,还有一项Java技术能够体现出中级工程师的水平,那就是并发编程,如果你不会并发编程,那么你跟中级Java开发的水平还差一大截。
在并发编程中,像线程的基础概念、线程创建、线程启动、线程停止、线程中断、线程生命周期、线程异常、线程安全、死锁等具体知识一定要掌握。
除了Java的知识外,像中间件,比如Redis,在初级中,你可能更多的是简单使用,比如存或者取String类型的数据,使用起来更简单,但是在中级阶段,往往需要掌握的更多更深,比如使用Hash类型去处理数据,能够解决缓存穿透的问题等等。
在Linux的使用上,不仅仅是掌握几个人人皆知的命令,甚至你还可以像运维人员那样,会部署服务,会发布版本等,这些都是作为一个合格的中级Java开发应该必备的技能。
在初级阶段,遇到问题,大多数情况下,都可以通过咨询经验比你多的同事去解决,但是在中级阶段,你需要具备排障的技能,除了疑难杂症,大多数问题,对于一个编码熟练、掌握各个框架原理的中级工程师来说,排除故障不是一个很难的事。
总结一下中级Java开发,其实就是几个关键词:设计模式、并发编程、性能优化、排障。
2.3 高级Java开发(6年以上)
高级Java开发一般会在中级Java开发基础上有质的飞跃,初级注重的是熟悉编码,中级注重的是熟悉调优,高级注重的就是全面。这里的全面不仅仅是会编码、会调优,还要会架构、会管理、会沟通等。
那么要想称为高级Java开发,理应具备哪些技能呢?
我总结了以下几点:
- 识别业务问题并设计解决方案;
- 评估现有架构系统;
- 解决技术问题和设计缺陷,注重细节;
- 会合作,善于沟通;
以上我觉得是一个高级Java开发必备的软技能,但是作为开发人员,走到高级阶段,在Java或者Java周边技术应该掌握哪些知识点呢?
我觉得以下便是高级Java开发应该要精通的技术:
请注意我这里用的词是“精通”。
在性能调优上,不单单是局限于慢SQL,分库分表等常见调优,更多的是需要掌握JVM调优、数据库调优、Nginx调优、Java程序调优、Tomcat调优等。
在并发编程上,不单单就是写个多线程程序那么简单,更多的是能够灵活使用各种锁,比如乐观锁、悲观锁、自旋锁、偏向锁、轻量级锁、重量级锁、公平锁、非公平锁、可重入锁、非可重入锁、共享锁、排他锁等。特别要精通AQS、Unsafe、Semaphore、CountDownLatch、CyclicBarrier、Exchanger、Phaser等同步工具。在并发编程中,还需要精通多线程设计模式,比如:单线程模式、不可变模式、守护阻塞模式、守护中断模式、生产者消费者模式、读写锁模式、消息单线程模式、工人线程模式、未来模式等。
在分布式上,不能就懂负载均衡、远程调用等基础概念,更多的是要研究分布式事务、分布式锁、分布式单点登录、分布式调度任务、分布式注册中心等,还要精通分布式缓存、分布式通信、分布式调用、分布式消息通知、分布式分流等。
在微服务上,不能单单就是知道个SpringCloud基本概念,你还要精通其各个组件,比如:
- 路由网关:Zuul;
- 客户端负载均衡:Ribbon;
- 声明式服务调用:Feign;
- 注册中心:Nacos;
- 配置服务中心:Config;
- 调用链路跟踪:Sleuth;
- 消息总线:BUS;
- 分布式事务:Seata;
- 等等。
在中间件上,不能就只会一个Redis,还得要精通:
- 对象存储:比如华为云OBS、Minio等;
- RPC框架:Dubbo、gRPC等;
- 消息队列:RabbitMQ、Apache Kafka、Apache ActiveMQ、Apache RocketMQ等;
- 注册中心:Zookeeper、Eureka、Nacos等;
- 分布式日志:Elasticsearch、Logstash、Kibana等;
- 集成部署:Docker、Jenkins、Git、Maven
- 等等。
在开源框架上,我们既要善于贡献开源框架,还要善于使用开源框架。比如你在开发过程中觉得某个功能是共性的、能够解决行业痛点的,就可以考虑将其贡献为开源框架,可以在很大程度上提升自己的开源思想。在开源项目的使用上,如果能够善于使用,那么可以在很大程度上提高团队的开发效率,比如:
- Java 诊断工具:Arthas;
- 金融级分布式事务解决方案:hmily;
- Java工具类库:hutool;
- 即时通讯系统:J-IM;
- Api文档增强:Knife4j;
- mybatis 增强工具包:mybatis-plus;
- 等等。
三、有哪些Java学习资源?
要想学好Java,甚至称为该领域的专家,持续不断的学习才是王道,那么有哪些学习资源可以利用呢?
这里我将从几个方面来介绍:
- 书籍
- 学习平台
- 开源社区
3.1 书籍
要想入门Java,看Java入门书籍是必须的,要想精通Java,不看书是不能领会其思想的,这里我主要推荐这几本书:
- 《Java编程思想》:这本书可谓是Java程序员必读之书,适用于初中高级Java开发阅读,不过不建议毫无编程经验的小白看,因为书中的文字还是比较生涩的,没点基础还真的难以看下去。
- 《Head First Java》:这本书就很适合Java新手看了,其内容图文并茂,语言生动,阅读这样的书籍你会很有耐心,而且书籍中会穿插很多趣味性的问答、闯关、拼图等,让你可以在乐趣中学习,在学习中寻找乐趣,真心推荐Java新手能够去看看这本书,当然了,这本书也适合有点经验的开发者去温故知新。
- 《Java核心技术》:这本书我觉得适合初中级开发者阅读,首先内容上还是非常全面的,而且不是非常的难以理解,新版本的书已经针对Java SE 9、10和 11全面更新,所以在技术的迭代更新上还是蛮快的。
- 《Java8 实战》:这本书我是建议当作工具书,因为在现在的开发中 Java 8 这个版本的出场率是最高的,相对于之前的版本,Java 8增加了许多新特性,极大的提高了程序运行性能,也简化了好多繁杂的代码,即使现在又出现Java 9、Java 11、Java 17,甚至Java 19,但是变革性的还看Java 8,每当你忘了某个新特性该如何编码的时候,可以翻翻这本书,绝对对你有所帮助的。
- 《MyBatis技术内幕》:这本书主要写的是MyBatis这个框架,现如今,只要是JavaWeb开发,MyBatis是必定会出场的,所以这本书也推荐大家好好看看,这样才能更好的理解MyBatis的设计原理。
- 《Head First 设计模式》:这本书的作者和《Head First Java》一样,设计模式本身是很难理解的概念,没有个两三年的经验是很难运用自如的,这本书是真的将设计模式讲活了,语言非常生动,如果你是中级Java开发,“修炼”设计模式的时候,这本书我觉得应该是首选的。
- 《重构:改善既有代码的设计》:这本书主要将的是如何优雅的重构代码,适合中高级开发阅读。
- 《代码整洁之道》:和《重构:改善既有代码的设计》类似,也是教你如何写出整洁的代码。
- 《Java并发编程实战》:并发编程必看书籍。
- 《深入剖析Tomcat》:对于理解Tomcat底层原理非常有帮助。
- 《Redis设计与实现》:学习Redis,看这本书就差不多可以了。
- 《sql必知必会》:数据库入门与进阶,这本书值得看看。
- 等等。
3.2 学习平台
在学习平台上,我主要推荐
- 华为云学堂:我是优先推荐这个平台,免费学习,而且授课老师都是有实战经验的老师,或许能看到我们比较熟悉的大佬的课程,目前课程针对Java的比较少,但是少而精,你不必考虑该学哪一套,适合初级开发者学习。
- 慕课网:上面既有很多免费的视频教程,还有好多高质量的付费实战教程,慕课网的教程大多数都是短而精的,学习时间成本比较低。
- B站:别小看B站,上面有大量的系统性的Java教程可以学习,而且都是免费的,还有很多UP主会在上面分享日常开发中的技巧以及如何排查问题,我觉得很不错。
- 中国大学MOOC:在这个平台上,你可以学习来自全国各地大学的教授、专家上的课程,可以做到足不出户享受优质的资源。
- 我要自学网:上面的教程虽然不太多,但是该有的都有了,不需要有选择恐惧症,而且本身的教程也确实很全面,讲师也很有水平,只不过基本上都是付费的。
- 极客学院:主要是以视频教程和专栏为主,还是蛮不错的。
- jenkov:这是国外的网站,是我无意中发现的,内容也很全面,主要没有广告,本身的质量也很高,英文好的朋友也可以了解一下。
3.3 开源社区
写代码,如果你不利用好开源社区,那么你的技术永远不会有太大的进步,有了开源社区,思想碰撞,集思广益,不仅仅壮大了开源社区,也推动了开源程序的成熟。
以下开源社区,我想大多数Java开发者都非常熟悉:
- GitHub:全球最大的面向开源及私有软件项目的托管平台;
- Gitee:企业级 DevOps 研发效能平台,也是中国最大的代码托管平台;
- GitCode:CSDN旗下的代码仓库,目前正在成长之中,我觉得它会是匹黑马;
- stack overflow:国外的开源问答社区,相信很多开发者在搜索引擎中搜索某个问题的时候,都访问过该网站。
四、Java开发者如何制定学习计划和职业计划?
1、明确自己的职业目标
首先,需要明确自己的职业目标,你是想成为一名高级Java开发工程师?还是想成为Java技术专家或技术架构师?不同的职业目标需要不同的技能和经验,因此,在制定职业规划时,确保将目标设定为明确、具体和可实现的。
2、保持持续学习和提高技能
Java开发是一个不断进步的领域,您需要不断学习和提高自己的技能。参加培训课程、参加研讨会、读书学习等都是非常好的方法。同时,也需要了解最新的技术趋势和发展,例如云计算、大数据等。
3、积累项目经验和工作经验
在Java开发领域,经验是非常重要的,通过积累项目经验和工作经验,您将能够了解到实际问题和挑战,学习如何解决问题和提高解决问题的能力。
4、建立自己的技术品牌
在社交媒体上建立自己的技术品牌是一个不错的选择,可以在GitHub上分享代码,参加技术博客,参加技术论坛等等。通过建立自己的技术品牌,您可以让更多人了解自己,同时也能够与其他Java开发者建立联系,学习并分享经验。
5、提高英语水平
在Java开发领域,英语是一门非常重要的语言,很多技术文档和资料都是用英语撰写的,如果您的英语水平比较好,那么您将能够更加轻松地获取更多的信息和学习资源。
6、注重团队合作和沟通能力
Java开发很少是单打独斗的,通常需要与其他人一起工作,因此,团队合作和沟通能力是非常重要的。建议积极与同事交流合作,多学习如何与他人合作和沟通。
7、热衷于学习新技术
在工作中会经常遇到新技术需要应用到项目上,这个时候你就得“会”学习新技术,有人学习新技术要一年,而有人则需要一周,这个就是学习方法和职业习惯的差距,我在这里给大家分享三个法宝:
- 新技术出现的背景是什么?为了解决什么问题?
- 掌握新技术的原理,开始进行实战;
- 尝试解决问题,以问题导向再深入学习其原理。
经历这三个步骤,还有什么新技术能逃过你的手掌心?
五、如何跳槽?
Java开发跳槽跟其他工种不太一样,始终要记住一句话,那就是“要珍惜自己的羽毛”。
这个意思就是不要频繁跳槽,珍惜自己的跳槽频次,撇开大佬级别的开发,一般开发者的跳槽频次最好珍惜以下原则:
- 实习生:在正式毕业前,跳多少次都可以,不过最好有大公司的实习经验;
- 应届生:第一年最好不要跳槽,除非遇到非常不符合自己的公司和上级;
- 有经验的开发者:2年一次,5年不超过3次。
对于有经验的开发者,上面的建议不是绝对的,因为在工作中,会遇到各种机会,比如你的朋友在的公司需要紧急招人,待遇也不错,这个时候通过内推就能顺利进入,也不会担心频繁跳槽给面试官带来不好的印象。
对于跳槽的准备工作,我有以下建议:
1、准备简历:在寻找新工作时,简历是非常重要的。你的简历应该突出你的技能、经验和项目,同时突出你的个人优势和职业目标。确保简历格式整洁,易于阅读,并且没有拼写或语法错误。
2、寻找工作机会:你可以通过招聘网站、社交媒体、人力资源公司或者通过与前雇主的联系等方式寻找新工作机会。
3、建立网络:与其他Java开发人员建立联系,可以为你提供工作机会和职业建议,我是推荐每次跳槽后,能够保持与前同事的联系,一家公司能有个一两个人就可以了。
4、准备面试:一旦你收到面试邀请,就要准备好面试,回顾Java开发的基础知识和经验,并准备好回答常见的面试问题,还要准备自己的项目和代码示例。
下面我来详细介绍一下该如何面试?如何在面试的过程中与面试官博弈?如何谈薪资?下面绝对是干货!
六、如何面试
大多数的公司面试步骤一般都是:
有些公司在面试前还会进行笔试,甚至群面,还有多轮面试的,不过不管什么花样的面试,作为Java开发,你都逃不过上面图中列举的步骤,那么每个步骤如何进行应对呢?
6.1 自我介绍
这个非常重要,严格来说,自我介绍是你给面试官的第一印象,也是你自己讲话时间最长的环节,非常有必要提前准备好。
如果你是实习生,自我介绍的时候应该体现出你的专长和在校表现,比如“面试官你好,我叫xxx,今年xx岁,来自xxx大学xxx专业,在校期间我担任xxx,得过xxx奖,在Java开发方面,我的专业排名xx,参加过xxx比赛,获得过xxx荣誉,我熟悉Java开发基础语言,熟悉Spring全家桶,熟悉前后端分离开发流程,熟练使用IDEA、Git等开发工具,对于贵司的Java开发工作,我觉得以我的能力可以胜任!”
如果你是应届生,自我介绍的时候可以加上你实习过的公司,具体的业务,你在其中是什么样的角色等。
如果你是有经验的开发者跳槽,那么自我介绍的时候,需要挑几个你自己负责过的项目,解决过什么样的难题等。
一般自我介绍时间为1-2分钟,这个时间,面试官一般都在翻看你的简历,思考接下来要和你聊的内容。
6.2 Java基础知识点提问
这个环节,需要你在面试前好好准备,不是说你代码敲的好就不要准备了,有句话不是形容程序员面试的嘛,“面试造火箭,上班拧螺丝”,这个就反映出面试考察开发者的能力还是蛮多的,在基础知识点中,一般出场率比较高的面试题主要有:
- 谈谈 == 和 equals 的区别;
- 谈谈接口和抽象类的区别;
- BIO、NIO、AIO 有什么区别;
- 谈谈List、Set、Map;
- HashMap 的实现原理;
- 创建线程有哪几种方式?
- 怎么防止死锁?
- final、finally、finalize 有什么区别?
- 等等。
这个可以上网百度一下的,平时记住多积累。
6.3 框架提问
这个和基础知识点差不多,不过框架可提问的就多了,光Sping全家桶知识点就非常多了,不过我们还是需要多看看高频面试题了,比如:
- Spring 常用的注入方式有哪些?
- Spring 自动装配 bean 有哪些方式?
- Spring JDBC API 中存在哪些类?
- @Autowired和@Resource之间的区别;
- 解释Spring框架中bean的生命周期;
- 依赖注入的基本原则;
- 说一下 spring 的事务隔离;
- Mybatis动态sql有什么用?执行原理?有哪些动态 sql?
- 如何获取自动生成的(主)键值?
- SpringBoot、Spring MVC 和 Spring 有什么区别?
- SpringBoot 有哪几种读取配置的方式?
- SpringBoot Starter 的工作原理是什么?
- 等等。
框架这块的面试题太多了,非常灵活,所以框架提问才能体现出一个Java开发者平时的技术积累到底如何,所以各位在准备面试的时候,这个要好好准备!
6.4 项目经历提问
这个主要看下面试者经历的项目有没有和该司重合的部分,假如有重合可能优先录用,毕竟有重合就代表经验差不多,还有就是看你在项目中的角色,从角色中就能看出你的水平以及有没有担当。从项目经历中还能问出你解决问题的思路,从而从侧面判断出你的排障水平。
6.5 介绍本司业务
这个可能是由面试者主动问面试官的公司业务,也有可能面试官会主动说,看情况,不过如果面试官主动说的话,可能对你的能力差不多认可了。
6.6 谈薪资
这个是面试博弈中最重要的环节,毕竟咱们面试者跳槽的最终目的就是为了赚钱更多,但是谈薪资真的是个高情商的活,不会的人可能谈崩,或者没有争取到自己想要的薪资。
那么我们该如何和面试官谈薪资呢?
1、自己需要想好自己想要多少钱,一般来说,根据自己的面试情况,可以上调现有薪资的10%-30%,自己觉得面试过程很ok,那么你可以多要,觉得一般般的话,可以少要。
2、定好自己的期望薪资后,面试官假如问你期望薪资,你可以这样说:“面试官,我在上家公司工资是xxx,我现在不管是能力还是经验都有提升,这次跳槽,我期望工资是xxx”。
3、这个时候面试官肯定会压价,会跟你谈公司各种福利,加一加,加到你要的标准,可能会低一点,但是纯粹薪资上可能会与你的期望有所差距,这个时候你可以这样回答:“上家公司也有您提到的这些福利,而且我们还会有项目奖励,这些钱我没有算到我的期望工资里,我觉得我的能力是值那么多钱的,希望您能再次考虑一下”。
4、这个时候基本就定型了,如果面试官觉得你ok会帮你争取,如果觉得性价比不高,基本上就没希望了。
记住一句话,谈薪资要学会察言观色、见机行事!
6.7 其他
除了以上内容,面试官也会和你聊聊其他事,比如你住在哪,有没有结婚,有没有小孩等等,总之面试官绝对不是闲聊,他的每个问题就在考虑你和公司的适配度。
七、总结
本文主要给大家介绍了Java语言的背景知识、如何学习Java、Java学习资源、如何制定学习计划和职业计划、如何跳槽、如何面试等。文章中汇总了笔者多年的经验,一定会对您有所帮助,看了本文,有任何问题可以在下方评论区与我讨论!感谢您的阅读。
本文参与华为云社区【内容共创】活动第22期。
任务34:自学Java,你都有哪些方式和学习资源?
- 点赞
- 收藏
- 关注作者
评论(0)