本科一般是 22 岁毕业,5 年开发经验一般是指 27 岁。这个阶段,不少程序员可能通过多次跳槽,薪资有一定涨幅,但真有可能还在小公司甚至外包公司做增删改查的业务,然后坐等 30 岁的到来。

就以 Java 为例,一些发展情况一般的程序员情况会怎么样呢?

1 会用 Spring boot+JPA 等框架做业务,而且由于业务做多了,熟悉框架相关技能,在公司里也能凭借做熟业务而干得风生水起。

2 熟悉日志,测试,项目部署和问题排查等项目开发技能,但仅限于开发单机版的业务。

3 还是在小公司,干的活除了是开发以外,更多干的是打杂扯皮的活。或者说,能凭借在公司里干久了,能在合理利用规则的前提下摸鱼。

4 如果再跳槽,大概率还是找小公司。一方面不知道如何面大公司,另一方面估计连面大公司需要你熟悉哪些技术也未必知道,或者是知道了以后也没有相关技术的项目实践经验;或者看下技术大厂还不错的外包岗机会。

上述情况应该是有 3 到 5 年 java 经验程序员的普遍情况,有一定上进心,但不知道上进途径。在这个阶段接下来怎么继续提升呢?下文就从简到难,给出相关执行步骤(仅限 Java 方向)。

1 多参与解决实际问题,哪怕这个问题不是你管的。同时如果有运维或分布式组件相关的问题,一定要参与。这样不仅能继续提升业务水平,而且能立竿见影地提升技术。

2 了解项目从开发到测试到部署整个流程,这样能熟悉项目管理的相关技术和组件。

3 结合业务,熟悉分布式组件或微服务以及云开发等技术,有机会的话,多参与此类任务,多排查和解决此类问题。

4 在上述基础上,看些脱离业务但和项目基础设施有关的技术和组件,比如如何搭建集群,如何扩容和迁移机器,如何解决高并发层面的数据库性能问题,以及如何应对限流熔断和服务降级等问题,如果可能,多参与些诸如压测等性能调优等的工作。

其实如果上心,一般能在 3 个月的时间内熟悉上述 1 到 3 点,如果再多问问大牛,多参与实践,上述第 4 点也能在半年内掌握。到了这个程度,就别再满足当下公司给的薪资了,跳槽一次的话,薪资涨个 3 成都算少的。

下文就继续展开说明,先说如何通过排查问题提升技能。

1 在开发过程中,一定会遇到各种问题,有业务层面的,有数据库或 OOM 或组件层面的,最值钱的应当算是架构和集群层面的。遇到问题后,哪怕不是自己的,一定得参与,哪怕有其它人负责解决,那么人家在解决后,也应该通过看日志搜索关键字等动作,复盘人家的分析和解决过程。

2 一般项目的日志是部署在 linux 上的,有些项目可能还有 ELK 等可视化日志管理工具,可能有些项目还会通过 new relic 或 cat 等组件监控日志或系统,比如日志里出现 Exception,或有数据库长 sql,就会告警。

看日志解决问题过程中,首先得掌握打开日志或从监控工具中获取有效信息等做法。再进一步,甚至可以去关注比如 logback 或 ELK 等日志组件等配置方式,以及去关注 Cat 等监控组件等细节。当然在排查问题过程中,连接数据库客户端等工具也必不可少。

3 这样一旦出现问题,解决的步骤一般是,根据时间点拿到日志,再通过关键字搜索日志,再用 trace-id 或 thread-id 等观察整条链路在不同模块里的日志。查到出错信息后,再去排查相关代码。

4 上述从日志里得到相关信息的步骤,虽然简单,但没有操练前不是每个人都能熟悉掌握。此外,分析排查问题的过程一定会涉及到业务和组件等技术。

也就是说,如果程序员多参与解决问题,那么一开始可能无从下手,估计连日志在哪以及该如何打开日志都不知道,到了后面,可能别人找到了问题,你才刚打开日志。但所谓熟能生巧,多参与几次,多复盘几次,后面一定能高效发现并排查解决问题。

通过看日志分析解决问题能提升哪些方面的技能呢?业务层面的就不说了,往浅了讲,能熟悉 Java 的各种异常,往中了讲,可以熟悉排查 oom 或数据库性能问题的技巧,往深了讲,甚至能了解分布式组件相关的技能。

再说说从项目管理和部署方面提升能力的操作要点。

项目一般会用 Gradle 或 Maven 来管理,用 Git 管理代码,用 jenkins 做部署,部署上线前,可能需要到数据库里做建表或修改表结构等操作,上线时,可能还要对应修改配置文件。

java 程序员如果可以,一定别开发完代码就了事,可以多和运维或做发布的人多沟通,从中一方面能了解基于 jenkins 等组件的项目发布流程,另一方面,还能熟悉项目打包部署和调试等细节。再进一步,通过熟悉这一流程,还能知道项目和 nginx、redis、dubbo 和消息中间件等组件的对接方式。总之,如果多参与几次项目发布,或者哪怕没机会动手实践,也可以在一旁熟悉各种命令。这种技能甚至有些 java 高级开发也未必掌握。

再说下从分布式组件层面获取技能的方式。

一个项目哪怕再普通,多少会结合些分布式组件,比如用 nginx 做负载均衡,用 redis 做缓存,用 dunno 做远程调用。甚至可以这样说,如果程序员不注意观察,眼里只有被分配到活,自然可以不用接触相关技能,但如果肯多问人,肯多和相关人员交流,一定能接触到分布式组件方面的技能。

这块该怎么看呢?

1 结合业务需求看为什么要用组件?比如要解决数据库层面的性能问题,所以要用 redis 或 mycat。

2 看项目里怎么用,比如怎么通过配置文件连接 redis 或 dubbo,怎么通过注解或 API 使用组件。

3 如果可以,看下组件是如何在 linux 上搭建的,尤其需要关注集群的搭建方式。

4 着重关注组件方面问题的解决。比如遇到 dubbo 超时问题,或 kafka 消息重发,这类问题其实只要关注,发生的频率不比业务问题要低。

这方面也是能熟能生巧,刚开始的时候可能连组件是什么都未必清楚,但观察一阵代码,同时解决一些问题后,估计集群长什么样,使用组件可能会有哪些坑,应该都能知道。

在熟悉组件以后,就可以多观察高并发相关的技能了。

高并发方面的问题其实也是一样的,刚开始可能无从下手,但多参与几次问题排查和解决后,大家其实会发现这并不神秘。

高并发相关技能包括哪些呢?

1 搭建组建环境层面,有扩容,更换服务,搭建集群和迁移数据等技能。

2 在解决实际问题层面,有熔断,服务降级和限流等动作,这方面甚至还可以包括分布式锁和消息幂等操作。

3 从功能方面,包括用 nacos 等组建搭建服务治理环境,用 dubbo+zookeeper 搭建远程调用环境,用 nginx 或 ribbon 搭建负载均衡环境,以及用 nginx 或 gateway 搭建网关环境,或者是用 seata 搭建分布式事务环境。

可能上文提到的技术,一些 java 初级开发都未必听全,但本人亲眼见过,一个才 2 年开发的 java 程序员,人比较上心,基本掌握上述技术才用了 4 个月,到 7,8 个月的时候都能解决高并发问题了。

其实做这个程度,别说高级开发,估计架构师相关的技能都能掌握不少。虽然说,对 java 开发的要求一般是能顺利做好开发任务,同时确保代码质量,而且能解决本职方面的问题,但如果 java 开发仅仅止步于自己所管的一块,估计增长的也是些业务技能,这种技能估计换个工作就没用了。

但是相反,大多数 java 项目总会包含些架构,集群和组件等方面的技术,而且 java 程序员如果肯主动上进,那谁也不能拦着。可能刚开始会步步维艰,甚至连打开 linux 日志的命令也要先查,但只要肯坚持,那么最终收益的还是自己。

本人也见过不少 java 程序员,在一家公司的某个组里,大概有 4,5 个初级开发,他们的薪资普遍只在年薪 15w 左右。

其中有些人可能就仅限于自己所管的这块,确实,业务做多了,完成任务的速度和质量能提升,但这些人平时接触到的也就是增删改查。但也有一些人,平时在工作之余,甚至是利用加班,多去和其它组以及运维和中间件组交流,有问题总是跟在后面,哪怕一头雾水,也会找人复盘,盯着问。

就这样大概过了半年,这两批 java 开发的差别就肉眼可见。一些只完成自己任务的程序员,估计依然停留在增删改查阶段,充其量顶多是个熟练工,按薪资来衡量,估计依然是停留在年薪 15w 的水平,况且年纪又大了,竞争力可能还下降。

但一些积极上进的程序员,由于日常工作中会主动接活并多参与事情,平时也经常出错,或者有时候分析问题不到位。但过了半年,这些人多少能掌握排查问题的技巧,多少参与过 OOM 或分布式组件等问题的排查,多少也开发了缓存等高并发方面的活,这样的话,出去面个高级开发应该不成问题,假以时日,估计升级到架构,应该也是时间和体力方面的问题。

转 zi___老胡聊 Java


↙↙↙阅读原文可查看相关链接,并与作者交流