同是Java开发,年薪15W和50W的到底差在哪里?

简介: 在这个IT系统动辄就是上亿流量的时代,Java作为大数据时代应用最广泛的语言,诞生了一批又一批的新技术,包括HBase、Hadoop、MQ、Netty、SpringCloud等等 。

在这个IT系统动辄就是上亿流量的时代,Java作为大数据时代应用最广泛的语言,诞生了一批又一批的新技术,包括HBase、Hadoop、MQ、Netty、SpringCloud等等 。

一些独角兽公司以及腾讯、阿里、百度、网易等知名大厂对Java人才的需求量连年升级,有2年工作经验的优秀程序员能轻松达到30w+的水平,但与此同时对人才的要求也越来越高

比如,大厂的面试官经常会以如下句式来询问:

聊一聊你对JVM的原理,如何减少Full GC的情况?

针对高并发场景,如何优化,都采用了什么技术?

相比关系型数据库,NoSQL的优势在哪里,你们在什么场景下会用到?

可以看到,对于社招同学而言(特别是有2~5年工作经验的同学),不仅仅会问一些编程语言、设计模式等基础问题,还要对一些项目有深入的实战经验。

但现实却是,很多同学在技术生涯最初几年都会沉浸在业务开发中,忽视了对系统知识的梳理和技术视野的扩展。日复一日,导致很多同学就以为这就是技术的全部,同时在重复的体力劳动中也丧失了对技术细节的深入探讨。

每个程序员都追求“成就感”,而获得成就感最好的方式就是自己在技术上的突破。

技术的突破需要依赖业务场景的需求和自身刻意的规划学习,二者缺一不可,但前者是机会,往往不是自己能完全把控的,如果在自己工作中没有实践场景,最好的办法就是系统的学习与梳理,为自己制定一个不同时间段的发展道路,待机会来临时就能一展身手。

以工作前5年的规划为例,至少需要突破三个层次:

Part.1

对代码精益求精

最开始工作的时候,我们会抱怨业务需求对技术没挑战,觉得在学校学到的这么多知识却没有用武之地。

实质上这是忽略了技术开发的本质,技术开发是一个工程项目,而工程项目的落地最重要的就是细节控制,也就是代码的品质,比如:

代码是否遵循了规约?接口设计的是否随意?测试用例是否都通过?

满屏的if-else是否可以用合理的设计模式来替代?有没有遵循SOLID原则,KISS原则?

有没有考虑用更合理的数据结构和算法改变代码的复杂性,提升运行的性能?

代码出bug的概率有多大,能否降低?

这是程序员的立足之本,基本是工作1年左右要达到的。在这一阶段看书是比较好的提升方式,比如:《Java编程思想》、《effective java》等。但要注意的是,在看书的过程中一定要思考能否运用书中的经验来改善自己写的代码,运用到实处,比如看到final和static,想想自己代码中用的是否合理。

此外,还可以看些常用的开源框架,如果你用的是Spring框架等,那么下面一个很好的知识结构:

Part.2

跳出来,主动了解技术全貌

在将基础打牢之后,需要主动突破舒适区,不断的去扩大自己的技术视野,做到有广度。

这一步比较难,因为很多同学会被公司的技术和业务牵着走,比如公司当前的业务规模决定了技术上不需要分布式技术,那么很多同学就不会去思考如果规模大了之后,如何利用分布式技术解决该问题。

如何解决这个问题?除了寻找更大规模的业务外,要时刻保持时刻跳出当前层级和环境来思考的习惯。比如,你只用了关系型数据库,那么有没有想过数据一直产生,到达TB级别的时候该如何快速检索与保存呢?

此外,技术的全貌还包括各种技术之间的关系,你用了Dubbo,那么Duboo和Netty是什么关系,为什么会用到Zookeeper呢,和Spring Cloud又是什么关系?如果能在学习新技术的时候,将繁杂的技术关系理顺,会有一览众山小的感觉。

在工作的2~3年时间内达到这个水平,30w的年薪就离你不远了。如果你对高并发和分布式技术感兴趣,那么下面一幅图会有帮助:

Part.3

不去造轮子,

前提是得知道轮子的内部结构

如果说,第二步是增加你的知识广度,那么造轮子就是增加你的技术深度,通过造轮子,才能真正把握技术的来龙去脉。

很多人信奉“不去造轮子”,看似性价比很高的一句话,却不知道这句话是有前提的,那就是“你得知道轮子的内部结构”,否则就是自我麻痹。接下来需要选择某一个或几个方面深入研究下去,构建自己的核心竞争力。

比如,消息队列在高并发分布式系统中一个及其重要的组件,起到削峰填谷、系统解耦的作用。我们以消费端如何快速获取数据来看思维是如何一步步深入的:

首先消费端要想及时获取数据,是否需要建立一个长连接?长连接的实现方式如何?

数据是通过push还是pull方式给到消费端,各自有什么弊端?

如果消费失败,可能是哪些原因引起?如果是因为网络原因引起,该如何解决?

这些问题都会在你自己造轮子的过程中暴露出来,从而加深你的理解和技术深度,一个有技术深度的程序员才是有灵魂的。而大厂也是愿意为有趣的灵魂买单的,这个时候看的就不仅仅是工资水平,更多的是在于晋升和发展前景的广阔性。

在Java语言上有所建树的开发者,都经历过以上3个层次。但可惜的是,囿于外界环境和自身设限,大部分的Java开发者却只停留在了第一个层次中,在日复一日的体力劳动中丧失了对技术细节的深入探讨,也丧失了晋升和薪资谈判中的筹码。

如何过渡到第二、三个层次?除了上文谈到的内容,这里我还想给你2个切身的建议:

1、扩宽自己的眼界,学着从全局看待问题,并且勇于挑战别人眼中的难题

2、持续提升你的学习能力,虽然有很多人以「在公司学不到东西」为理由离职,但你要知道:公司的目的是盈利。盈利的前提下,公司会尽力培养你,但是更多的时候能力成长还是得靠自己。学习能力弱的人,在哪里都没用。

如果你依然觉得有些茫然,不如加入我的Java填坑之路:860113481 跟有多年Java开发经验的资深工程师聊一聊。也可获取免费的视频学习资料以及电子书学习资料喔!

相关文章
|
15天前
|
Java API Maven
如何使用Java开发抖音API接口?
在数字化时代,社交媒体平台如抖音成为生活的重要部分。本文详细介绍了如何用Java开发抖音API接口,从创建开发者账号、申请API权限、准备开发环境,到编写代码、测试运行及注意事项,全面覆盖了整个开发流程。
58 10
|
21天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
41 4
|
23天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
55 4
|
22天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
31 0
WK
|
28天前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
47 0
|
Java 开发工具 git
Java开发初级6.24.3
5.在Git使用过程中,进行Git配置的操作命令是哪个() A. config B. config -g C. config -a D. git config 相关知识点: 在git中,经常使用git config 命令用来配置git的配置文件,git配置级别主要有:仓库级别 local 【优先级最高】、用户级别 global【优先级次之】、系统级别 system【优先级最低】 正确答案:D 10.RDBMS是什么? A. Rela Database Management Systems B. Relational Database Management Systems C. Relation
138 0
|
SQL 前端开发 JavaScript
Java开发初级6.24.2
3.Java网站src/main/java目录保存的是什么资源? A. Java源代码文件 B. 测试代码 C. JavaScript、CSS等文件 D. 图片资源 正确答案:A 4.什么是索引Index? A. SQL数据库里的表管理工具 B. SQL数据库里的查询工具 C. SQL数据库里的目录工具 D. SQL数据库用来加速数据查询的特殊的数据结构 正确答案:D
146 0
|
Java
Java开发初级6.24.1
1.下面关于泛型的描述中错误的一项是? A. “? extends 类”表示设置泛型上限 B. “? super 类”表示设置泛型下限 C. 利用“?”通配符可以接收全部的泛型类型实例,但却不可修改泛型属性内容 D. 如果类在定义时使用了泛型,则在实例化类对象时需要设置相应的泛型类型,否则程序将无法编译通过 相关知识点: https://edu.aliyun.com/course/35 正确答案:D 2.下列选项中属于SVN中控制鉴权用户访问版本库的权限默认权限的是() A. write B. read C. none D. null 相关知识点: auth-access:取值范围为"writ
240 0
|
Java 开发工具 git
Java开发初级6.23.3
5.在Git使用过程中,进行Git配置的操作命令是哪个() A. config B. config -g C. config -a D. git config 相关知识点: 在git中,经常使用git config 命令用来配置git的配置文件,git配置级别主要有:仓库级别 local 【优先级最高】、用户级别 global【优先级次之】、系统级别 system【优先级最低】 正确答案:D 10.RDBMS是什么? A. Rela Database Management Systems B. Relational Database Management Systems C. Relation
127 0
|
SQL 前端开发 JavaScript
Java开发初级6.23.2
3.Java网站src/main/java目录保存的是什么资源? A. Java源代码文件 B. 测试代码 C. JavaScript、CSS等文件 D. 图片资源 正确答案:A 4.什么是索引Index? A. SQL数据库里的表管理工具 B. SQL数据库里的查询工具 C. SQL数据库里的目录工具 D. SQL数据库用来加速数据查询的特殊的数据结构 正确答案:D
217 0