本人说三点,第一去关注做业务以外的事情,第二去解决实际问题,尤其是值钱技术的问题,第三靠跳槽,找到能提供更值钱技术实践经验的项目。
下文就以Java为例,讲讲如何高效提升编程水平。先讲些看似能行但效果不好的做法。
1 看源码,这方面如果脱离项目开发单看源码,一定是看了就忘记。这里哪怕背熟了写得再精妙的源码,不用的话顶多3个月就忘,所以单看源码一定不行。
2 同理,单看理论方面的资料或看视频,效果也不好,比如去看微服务分布式甚至是云端k8s的资料,只要在当下项目里用不到,那一定会前看后忘。至于去背面试八股文,其实在面试过程中,如果无法证实自己值钱技术的项目实践经验 ,甚至连背八股文的机会都没。
3 过多关注于单机版的技术。这里解释下,Java单机版的技术比如是多线程并发,锁或者是集合底层技术,或者是其它api。和单机版相对的是分布式组件,比如搭建业务集群或组件集群。单机版技术不是不重要,但java要升级到高级开发,一定得掌握和单机版相对的分布式等技术。
4 过度重视业务。重视业务不是不重要,毕竟这关系到开发,但如果只重视业务,看似能在组里甚至是公司里能独当一面,但如果跳槽到话,只知道当前公司的业务不熟悉技术,一定不行。
总之,如果程序员只去看理论或技术,不管这些理论如何值钱,只要没机会在项目里用,或者是无法在面试中有效证明自己相关技术的项目实践经验,这些动作大多是无用功。
然后再说如何高效提升。首先得看项目里开发以外的事情,比如测试,部署以及如何在服务器里监控系统。
1 测试的话包括单元测试和压力测试,这块还包含如何同sonar等代码质量管理工具集成。
2 部署的话一方面包含maven和git以及jenkins等工具的用法,另一方面还包含如何在linux服务器上安装业务系统安装组件的方式。
3 系统上线后,一定会有各种监控工具,比如监控数据库慢查询,监控服务器是否工作正常,监控不正常后还会发邮件通知。
上述测试是程序员做的,部署和监控一般是由运维做,但如果程序员上心的话应该能掌握到位。这些技术一般先从api、部署配置文件和命令看起,然后再逐渐深入看细节。上述点那么是再简单的项目都会有,而上述技能掌握后,程序员就一定不仅仅只会做开发,而且能为后继掌握分布式高并发微服务打下好的基础。
如果可以的话,程序员更应当去多参与项目上线的工作,这过程中包含了大量组件和项目等方面的技能,可以说,很多技能哪怕写代码半年一年都无法掌握,甚至都不知道,但参与一两次发布,第一能知道后面该学哪些,第二甚至能在系统上线过程中直接学会。
为什么要在项目中实践上述技能呢?因为java高级开发或架构,姑且不论架构集群组件方面的技能,至少得走通项目开发测试部署相关流程,并能需要在这些过程中能独当一面。事实上如果程序员不掌握上述技术就去空谈架构,往往会缘木求鱼。
再说通过解决问题来提升。这里的问题包括业务问题和组件方面的问题,其中比较值钱的是组件方面的问题,而排查问题的基本步骤一般是看日志以及通过些命令和工具定位问题。
这里通过看业务问题,一定能进一步熟悉业务,以及做业务的相关组件,比如日志组件或限流组件等,而通过看分布式组件方面的问题,更能为后继面试证明自己的实力准备素材。
这里顺带提一句,如果程序员只关注自己业务的话,如果非自己的问题完全可以不问不理,但这样很容易成为只会增删改查的初级开发。这里推荐的做法是,组内有问题,哪怕不是自己的,尤其是组件方面的问题,一定得问,哪怕是事后复盘也好,一定能提升自己组件部署等方面的经验。
写到这里本人想说的是,提升编程水平的目的是变现,比如通过跳槽找到更好的工作,或者至少是能找个能提供更值钱技术的项目,相对地,如果本身项目包含的技术偏低,其中的程序员由于缺乏值钱技术的实践经验,其实是很难提升的。
具体在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程序员提升的瓶颈往往是架构师这个级别。而本文给出的方法,不仅涵盖了项目实践层面,而且还涵盖了面试准备层面,一定会对大家有帮助。
如果大家感觉本文有帮助,请多多帮忙点赞,这样的话,本人就会有更多的动力输出程序员如何通过面试谋求高薪的文章。 |