一个java程序员的正确发展路径以及成长路径应该是怎么样的?其实这困扰了好多人,这里我就一次性给大家讲清楚了,大家可以借鉴我的成长过程来学习吧。
大学中
大学中的思维是比较活跃的,也是比较不切实的,很多东西都是纯技术上理论上的东西。那个时候总觉得经验这个东西也太low了。
我举个栗子你就知道了。当年毕业的时候去一家公司面试,面试官问我锁会导致性能降低,如何提高锁的性能。我当时的回答:必须把锁的粒度降到最低层次,锁的粒度越低,并行度就会越高,这样才能提供锁的性能。面试官显然不喜欢我的回答,再一看其他同学的回答:增加锁的数量、减少锁的持有时间、使用管道避免锁、使用轻量级的锁。我一听,这他妈叫什么锁的优化?增加锁的数量也叫对锁进行优化?减少锁持有时间,这特么不废话吗?这也算答案?
当然,在后来的工作经验中,我知道了,同一个地方增加锁还真不是我想的那么回事,这是需要很丰富的经验才能知道的(比如java中并发包的分段锁),思维很简单,但是真要体会他的用处,却需要很丰富的经验的。
这就是我大学学习的方式,注重思维,而且是高端的思维,不注重具体经验,像什么编程的设计模式我一看就想吐,觉得那简直就是废物,要研究就得研究算法,那才是灵魂。就应该把内核方面的设计理念搞清楚了,必须把晶体管的PN节搞清楚了,必须把数据库的制作核心方法掌握了,这才是牛,当然,这是痴人说梦,理论来源于实际,没有实际却过分的去啃理论,这就是我大学的学习法方式。
工作三年内
毕业三年内,我最关心的是各自功能的实现方式,我觉得那种东西也能实现,一定要学会各自网站的做法,一定要学会支付,支付接口调用就是我的技术天花板了。
我尤其喜欢写一些刁钻古怪的SQL,工作中能用SQL解决的绝对不多写一段代码,我觉得写SQL的能力是真能力,实现算法的能力是真能力,那些架构,思维也太他吗简单了,大流量不就是分而治之吗,不就是资源不够扩容的问题吗,什么架构,纯扯淡。
我那时作为三年内的程序员,去别的地方面试的时候,觉得越是级别高的面试官月容易过,我动辄来一个非常刁钻的SQL优化,ACM款式的算法,与或剪枝算法,各种功能实现细节等,绝对让面试官插不上话,实际上我也是成功的,当然现在看来,我才是那个小丑。
工作五年左右程序员
工作在五年左右,肯定是比较关心高并发的问题了,系统内没啥访问量,就会觉得低人一等,总喜欢把QPS、PV、UV挂在嘴上,喜欢聊解耦、队列等小技术,还喜欢研究一些CPU飙高的解决方案,实际上没啥CPU飙高的问题来让我解决,只是背诵了一下处理方式而已,而且还不够熟悉。
那个时候的程序员,还喜欢研究什么分布式事务啊、什么数据一致性啊,什么CAP理论啊、以及什么JVM方面的优化啊,当然,这些东西深刻理解下来也是够喝一壶了,我想这是不高不低的程序员最关心的东西吧。
五年左右经验的时候,还在网上找了一套课程《如何搭建一个秒杀系统》,我不知道为什么当时会觉得秒杀那种系统很高级,像这种有固定套路和固定解决方案的东西,用到别处不一定就有用了,因为这种临时搭建的系统太局限了,实际生产中需要考虑的问题多了去了,这种搭建秒杀的系统无非就是弄个四层七层负载均衡,层层流量拦截、大量制定缓存、注意缓存一致性、注意数据一致性、注意主从一致性等等,分布式环境搭建,使用CAP理论等结合就完了,基本上就是这几个技术的排列组合,所以不要被什么秒杀系统给唬住了,秒杀系统从来都不是一个临时搭建的系统,而是整个架构和顶层规划的问题,这个我们后面谈。
十年左右的程序员
工作了十年左右,对于上面说的大部分技术肯定是烂熟于心了,什么技术适合什么场景,会遇到什么问题,以及大部分技术的底层原理和应用场景,什么操作系统内核、eBPF、GBD、将近数十种数据库(关系型、对象型、时序型号、数据湖型等等)原理、几十种中间件(存储、通信、负载均衡、限流、降级、熔断等都有对应的中间件),大部分的监控系统(比如应用相关的skywalking、opentelementry、zipkin,比如主机相关的普罗米修斯等、比如可视化方面的grafa,比如db监控方面的各种策略如tcpdump、如ng的域名监控等等),大数据方面(如时序计算flink、ETL等等)这些早就在五年到十年这中间摸爬滚打的差不多了。
这个时候与其说关系并发量、QPS这些low的东西,我更加关心的是系统能抗住多少个9了,系统提供的价值是什么了,系统能不能应对未来的变化了,研发的效率如何提高、成本如何降低等更加实际的问题了。
比如吧,系统最近不好的反馈越来越多了,尤其是最近一次做秒杀活动的体验不是很好,肯定是背后一系列的问题导致的,而不是单纯的那个所谓的秒杀系统没做好的问题,是不是人员配备不齐全?是不是系统的资源配置不合理?是不是架构的组合太迂回?是不是研发的交付质量太低了?是不是系统缺乏系统的可观测性等等问题,我都要深度思考,还要能拿出解决方案?
所有的问题我都要去思考,思考了之后,我得预案,未来如果再出现这样的秒杀,我们的系统能抗住吗?我如何解决当前系统面临的以上的这些问题?我如何拉动资源?如何说服领导?如何在现有人员配备不充足的情况下,合理平滑的将这些问题平滑过渡到我新规划的蓝图中?我不仅仅要规划、还要权衡、要降本、要增效、要揣摩上级意图、要合理安排程序员的日常、要统筹所有的迭代等等。
十五年左右
这个状态跟十年左右差别也还是有很多的,十年左右工作经验的我关心的是企业内部的东西,比如增效降本什么的拉,比如互联网团队的信息孤岛问题等等,但是现在我的眼光向外了,我更加关心的是整个行业的情况怎么样。
这个时候的我更加专业钻研一个领域了,也就是监控方面的领域。
所以我不再仅仅是关系自身团队的监控系统建设了,我更加关心的是行业的发展,更关心兄弟公司们的监控是如何做的。比如我们做的应用类监控是在skywalking的基础上做的,但是我们看到兄弟公司早就比我们领先了,兄弟公司已经在opentelementry的基础上开发新的应用监控系统了,这个就是行业的一个进步。
比如可观测方面,主机方面我们还处于读取/proc,兄弟厂商们已经是发展到了通过eBPF来实现更加强烈的可观测了,而且友商的可观测可视化要比我们做的更加精细。
我们的检测告警是有时效性的,从用户的系统出现问题,到真正把异常信息发送给用户,是有一定的时差的,我们目前的监控系统只能做到分钟级别的告警,这当然是有多方面的原因的,具体我就不细说了,但是友商的居然能够做到秒级告警,这是我们需要学习的,他们是资源配置多?还是这方面的技术已经相当成熟了?
比如友商居然能自建拨测系统,节点达到全球,全年营收居然能够达到一个亿?他们是怎么做到的?我们要如何借鉴等等。
最后总结一句吧,看到了我的故事应该明白了吧,一个人哪里能一直做码农,程序员是需要进步的,年龄到了这个层次,你就要做这个年龄该做的,比如我十年左右干的活,五年左右的程序员就是干不了,因为他没那个见识和阅历,我五年左右干的活,刚毕业的学生也干不了,因为他没有那样的思维。
只有这样,才能让你一直有竞争力,要学会转换思维,转换角色,路才走的远。企图CRUD就想一直吃红利?凭什么?