所谓的大龄危机,原因可能就源自于此。
要提升的话,一般得去多解决是实际的线上问题,尤其是组件或部署层面的问题,如果要准备面试的话,应该多去准备些自己解决过的实际问题,以此来证明能力。
通过准备如下问题,其实能很好串联起自己的能力。
1 我排查解决过数据库或JVM或CPU性能问题,具体我是通过看监控发现问题,然后通过看日志或通过其它工具发现问题,排查问题时,我深入了解了JVM或数据库等方面的细节。
2 在实际项目里,我排查和解决过Redis,kafka或微服务组件方面的问题,这些问题的表现形式是页面请求卡顿,或者是监控报出xx问题。解决的时候,我看了Redis或kafka的底层源码,了解了其中的xx细节或流程。
3 我在做需求的时候,用到了跨域,或者是Spring boot层面的AOP或异步或缓存等机制,具体是用xx语法,在使用过程中,我对spring boot的底层实现有了进一步的认识。
4 我参与了项目的部署,具体用到了docker或k8s甚至是service mesh,同时在linux上解决过各种问题,比如看过日志,搭建过Redis组件,或者简单一点的是重启服务。
以上的点,哪怕只有1年的Java开发经验,但在项目里都应该能接触到。当然如果认为事不关己,固然可以只做业务,但出去面试时就会发现自己只懂业务和简单的增删改查,但如果是脸皮厚些,多跟着人家学,也可以参加上述工作,并从中提升技能。
下文先说如何提升,在说有效方法之前,先讲些看华而不实的做法。
1 看源码,比如去看spring boot的IOC或AOP源码,这方面如果脱离项目开发单看源码,一定是看了就忘记。这里哪怕背熟了写得再精妙的源码,不用的话顶多3个月就忘,所以单看源码一定不行,但如果看源码,确实能让一些初级程序员产生虚假的提升感,这点大家务必要警惕。
2 同理,单看理论方面的资料或看视频,效果也不好,比如去看微服务分布式甚至是云端k8s的资料,只要在当下项目里用不到,那一定会前看后忘。至于去背面试八股文,其实在面试过程中,如果无法证实自己值钱技术的项目实践经验 ,甚至连背八股文的机会都没。
3 过多关注于单机版的技术。这里解释下,Java单机版的技术比如是多线程并发,锁或者是集合底层技术,或者是其它api。和单机版相对的是分布式组件,比如搭建业务集群或组件集群。单机版技术不是不重要,但java要升级到高级开发,一定得掌握和单机版相对的分布式等技术。
总之,只要是脱离项目实践的学习,哪怕投入再多的时间和金钱,效果还真未必好。这里再举个例子,比如某人做Java,最近发现深度学习技能很值钱,也费了不少功夫看了资料,跑通了代码,但结果发现第一平时项目用不到,第二面试也没方向,结果还真只是学了个寂寞。
然后再具体说如何高效提升。首先得看项目里开发以外的事情,比如测试,部署以及如何在服务器里监控系统。
1 测试的话包括单元测试和压力测试,这块还包含如何同sonar等代码质量管理工具集成,泛指一下,这里其实还需要了解基于gradle或maven等工具,打包部署项目以及整合测试等的相关配置和开发技巧。当然,一些更加基础的debug技能,这些属于是默认要掌握的。
2 部署的话一方面包含maven和git以及jenkins等工具的用法,另一方面还包含如何在linux服务器上安装业务系统安装组件的方式,有些项目还会引入docker或pipenlines这块,这些技能的值钱程度,其实是超出了大多数初级开发的想象。
3 系统上线后,一定会有各种监控工具,比如监控数据库慢查询,监控服务器是否工作正常,监控不正常后还会发邮件通知。
部署和监控一般是由运维或架构做,但如果程序员上心的话应该能掌握到位。这些技术一般先从api、部署配置文件和命令看起,然后再逐渐深入看细节。上述点那么是再简单的项目都会有,而上述技能掌握后,程序员就一定不仅仅只会做开发,而且能为后继掌握分布式高并发微服务打下好的基础。
如果可以的话,程序员更应当去多参与项目上线的工作,这过程中包含了大量组件和项目等方面的技能,可以说,很多技能哪怕写代码半年一年都无法掌握,甚至都不知道,但参与一两次发布,第一能知道后面该学哪些,第二甚至能在系统上线过程中直接学会。
当下不少人也知道微服务和分布式技能很重要,但如果经常参与部署,第一能知道这些组件的搭建和配置方式,第二大概率能解决组件层面的问题,这个基础上,再去背八股文,第一能体会更深,第二能结合解决过的问题去说,面试时更能展示自己的能力。
再说通过解决问题来提升。这里的问题包括业务问题和组件方面的问题,其中比较值钱的是组件方面的问题,而排查问题的基本步骤一般是看日志以及通过些命令和工具定位问题。
上文说了大致的方法,这里说下具体的操作细节。
这里通过看业务问题,一定能进一步熟悉业务,以及做业务的相关组件,比如日志组件或限流组件等,而通过看分布式组件方面的问题,更能为后继面试证明自己的实力准备素材。
这里顺带提一句,如果程序员只关注自己业务的话,如果非自己的问题完全可以不问不理,但这样很容易成为只会增删改查的初级开发。这里推荐的做法是,组内有问题,哪怕不是自己的,尤其是组件方面的问题,一定得问,哪怕是事后复盘也好,一定能提升自己组件部署等方面的经验。
写到这里本人想说的是,提升编程水平的目的是变现,比如通过跳槽找到更好的工作,或者至少是能找个能提供更值钱技术的项目,相对地,如果本身项目包含的技术偏低,其中的程序员由于缺乏值钱技术的实践经验,其实是很难提升的。
具体在java方面,可以说分布式微服务组件是个界限,不少小公司的程序员可能对单机版的开发技术掌握很熟,也很熟悉本项目的业务,但由于缺乏分布式微服务组件的项目实践机会,真可能长时间呆在小公司,最终只成为增删改查程序员。
这块该怎么提升?第一通过面试得到值钱技术的项目实践经验, 第二在项目中真正提升。
操作原则是,先熟悉各组件的api,最好搭建个环境真正调个api试验下,再结合自己的项目找个这个组件的使用场景,三是结合网上文章,当然最好是自己项目里真实情况,准备些解决组件方面问题的说辞,这块最好涉及源码。
这里不少人会认为架构层面的分布式高并发和微服务很泛,不知道面试时该怎么证明能力,其实这些技能,包括其它值钱技术,都可以从API和配置文件方面入手,进一步可以说明怎么搭建环境和如何解决实际问题。
就用比较常见的kafka消息中间件为例,哪怕你项目里技术过于简单,没用过个组件,那么怎么准备?第一就搭建个kafka环境,真实调用下kafka的api。第二在自己的项目里找个必需要用kafka的场景,比如支付通知,这块一定要想好,如果当面试官认为这个场景用不到,效果一定适得其反。第三在面试中,说明这个场景,再说下我kakfa是怎么发消息的,把api说出来,配置方式说出来,这样一定能证明自己在项目里用过kafka。
当然光会api还未必够,这里可以再扩展下,看下linux里搭建kafka组件的方式,或者是配置kafka集群的方式,面试中通过说些细节,比如命令和配置,就能证明自己搭建过环境。
更为重要的是,大家可以事先从网上找大量kakfa相关问题的文章,比如kafka代码没写好会导致OOM,kafka如果接收服务器down了会导致库存消息过多,这些文章里一定会有解决方法,再结合自己的项目场景改编下。比如人家是订单支付场景遇到的kafka问题,你的业务场景是企业信息发送,改下场景说下即可。
但是在面试中应当反过来说,比如在自己企业信息发送场景里,由于参数配置不对,导致了线上OOM问题。自己通过输入一些linux命令看情况,再通过看日志,看到日志里有xx异常,再通过一串定位,阅读了xx源码,定位到问题,然后解决,其中的细节人家的文章里应该能找到,这样哪怕你项目里没用过,面试官一定能相信你这方面的能力。
上文说的是单个组件层面的能力,类似于kakfa组件的redis,dubbo等都可以照此办理,第一结合项目业务说api和配置怎么用,第二说如何搭建环境,第三说如何解决问题,这方面真不难,只是费功夫。不过哪怕是增删改查程序员在面试中,更可以准备再高一级的,即架构或运维方面的技能。
这方面可以从如下哪些点来准备呢?比如项目监控,一般项目上线后会用zabbix或skywalking等组件监控,当项目服务器down了,或者数据库请求过慢会告警,这块虽然是运维的活,但你真可以去看些搭建zabbix的文章,外带看些配置相关文章,再准备个根据监控告警然后看日志然后解决问题的实例,这块不难。
如果你项目里用到过docker或k8s,就去看相关api和配置,这本身就是值钱点,当然如果解决过真实问题那最好。如果项目你没用过此类技术,就去看项目部署相关技能,比如jenkins部署,或者是jenkins整合sonar做质量管理,同样可以通过配置文件+解决过的问题来说。
在架构层面,集群是个很值钱的而且是属于必问的技术点,比如你可以说,你在项目里怎么搭建redis集群,怎么搭建zookeeper+dubbo集群,怎么搭建nacos集群,这块其实就是一些命令+配置,说到这块其实真就可以了。集群还包括业务集群,即几个业务节点用负载均衡组件或云组件串起来,这些步骤也能通过搭建命令+配置文件的方式来说。
当然如果再进一步,可以说下集群层面解决过哪些问题,比如节点失效后收到告警邮件后,你是怎么看日志分析处理的。老规矩,项目里没机会用,就到网上找,再根据你的业务场景改编。
当然如果再扩展一下的话,大家平时可以多收集些问题,这些问题的范围包括,OOM问题,数据库性能问题,redis+分库分表相关的性能问题等。
这方面的操作要点是,只要网上看到有解决线上问题的文章,只要其中包含分析问题解决问题的步骤的,当然最好再包含源码,这块你就根据你的业务改编下,当成你解决过的问题。
最后想说的是,程序员在自我提升过程中,千万别自欺欺人,目标一定要很明确,即尽早拿高薪,尽早进好公司。就以这个目标,大家其实自己都能排除到很多华而不实的提升方法。
同时说明一下,如下是java方面的,是一些初学者可能认为重要的原理性的知识点,但在实际开发中未必会用到。
1 Spring Boot AOP或IOC等源码,ArrayList等源码,Redis等源码,这些源码太多,但哪怕背出来也没用。
2 并发对象的源码或知识点,比如锁,线程池,并发过程的源码。
3 教科书上的操作系统,数据库原理或编译原理的知识点。
4 一些教科书上或网上资料上给出的算法。
但实际有用的原理性知识点,都是和开发项目有关的。
1 和调优有关的JVM底层原理,比如修改哪些参数能调优,优化哪些垃圾回收流程能调优。
2 和Oracle或MySQL或其它专门数据库相关的底层原理,比如MySQL执行和优化SQL的过程,总之了解这些以后能解决性能问题。
3 和问题相关的的Redis或Dubbo底层的源码,比如某天遇到Dubbo不定期出现OOM,通过debug,看到某个模块的某行代码有问题,然后可以通过修改某个配置来解决。这些确实也是底层源码,但绝非不需要漫无目的地看,而是出了问题再定位。
4 顺着第3点再扩展出去,组件等底层源码,确实也是原理性知识点,但应该是有问题再去debug,这样解决的问题多了,自然就了解组件底层比如线程结构等技能。这部分的技能其实并不是源码本身,而是debug+定位排查的技能。
还是这句话,和开发项目和调优性能或其它开发相关有关的原理性知识点,这有必要学,而且是在项目里学,除此之外,大概率学了白学。
但是,如果围绕项目问题去学,去准备面试,尤其是围绕组件,部署或架构层面的问题,这样大概率能提升。
本人顺带吐槽一句,当下有不少所谓的面试辅导,所讲述的仅仅是脱离项目实践讲八股文,这样的面试准备,应付小公司的面试绝对是绰绰有余,但如果去挑战大厂或中厂,对方大概率是会问项目实践经验。
而且得注意,很多小公司所做的项目,其实用到的技术并不值钱,但不过足以让有3,5年经验的初级Java跳槽到中厂。
所以这句话可以分两个方面来讲,第一,初级开发,哪怕是包装项目入行的初级开发,在小公司里其实也能完成初步的技术积累。第二,小公司确实不能长待,一般干个1,2年,就可以考虑跳槽了。
86万+

被折叠的 条评论
为什么被折叠?



