本科一般是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