软件圈很内卷?返璞归真才是技术的本质

语言: CN / TW / HK

theme: fancy

2022 年什么会火?什么该学?本文正在参与“聊聊 2022 技术趋势”征文活动 」

最近两年,整个软件行业,被内卷这个词汇所席卷,各位应当深有体会。

那么对于程序员来说什么才是内卷?是必备的面试八股文?是35岁危机?是996的加班文化?还是你渐渐稀疏的头发?

说起本质,作为技术人,还是基于对技术或能力的欠缺,下面我们来分析下原因,以及

为何会内卷?

简单来说,造成内卷的因素基本源于自身的原因。

  • 自身学历和地位的原因。
  • 自我认知的原因。
  • 自我提升的能力。

就目前来说,自身的学历并没有很重要。不说大厂,在很多新兴互联网公司,独角兽企业,哪怕你是中专还是高中,仍然有很多码农在奋斗着。

而地位,是需要通过我接下来所说的两点去弥补:

  • 自我认知

    从我一个java程序员来讲,我的路只有两条,技术管理。这也是绝大多数程序员面临的选择。

    从技术层面来讲,无论是深度还是广度都很重要,只有这样才能不被时代潮流所淘汰。肯沉淀,有创新,能接受新事务,这就是提升技术的方向。

    从管理来说,谈吐、只是储备,大局观,甚至是人脉都是你需要去不断提升的。

    除去这些,也许你还要耐心的等待一点机遇。

  • 自我能力的提升

    我们都知道的一个道理,优胜略汰。你的能力上去了,才有更大的舞台。

    方式很简单,在别人玩乐的时间,你去阅读一个源码、去学习个算法、去安静的看些提升认知的书籍。

    能力的提升,体现在点滴和毫厘之间。

如何返璞归真?

从java程序员的角度来说,有些技术,在2022年,你必须要学会,如果你会了,就要了解其原理和实现过程。想要摆脱内卷,就要透过现象看本质:

经常听到的一句话:源码有什么用?工作中完全用不上啊。但是确实是有用的,你要做到返璞归真。这样你在写代码的时候会不自觉地感受到它的存在。

下面我来说下新的一年,作为java程序员的你必须要会的技术或者原理,帮助你返璞归真,摆脱内卷的环境。

  • JVM

    相信你在各种培训机构,面试题都见到过它的身影,那么JVM到底有没有必要学习?答案当然是肯定的,很重要。 我就简单提几个点,你感受下在你工作中是否用的到或者发生过:

    • 堆和栈:你是否明白并发是数据原子性不能保证的原因?
    • 内存溢出和内存泄漏:导致你的系统频发卡顿甚至不能使用?
    • 吞吐量和响应时间的关系:取决于你的jdk版本,它的gc是那种,它更加倾向于吞吐量还是响应速度?
    • 你可听过DCL问题?为什么会出现的?
    • 为什么你的服务器CPU经常会达到100%?
    • 为何你的服务经常不能注册到网关上?真的是网关的问题吗?有没有可能是你的代码导致GC所造成的?

    上面的问题是不是都和日常的工作息息相关呢?所以JVM是java工作者的必会核心之一。

  • java的并发编程

    很多同学对这部分只是听说过,工作中并没有实际使用过,这是事实。但是这部分真的是没有必要的吗?

    目前微服务大行其道,确实在编写业务代码中很少使用这些知识,更不要说了解其原理。

    但是你仔细思考,这些内容对于你的编码仍然是有着根深蒂固的影响的:

    • 当你开心的使用java8的CompletableFuture做异步调用的时候,你可曾想过当你的代码发生阻塞会怎样。
    • 当你还在使用Synchronized去面对微服务场景的时候,不知道你的领导会怎么看你。

    • 你的全局变量定义的是否是安全的?即使你没有使用多线程?

    • 你使用线程池的时候,该如何定义它的大小?什么优势IO密集型?什么是计算密集型?

    • 单例模式是为了解决什么问题?

    我所提到的不过是冰山一角,并发编程完全可以称为一门学科,重要程度不言而喻,你还不学起来吗?

  • Spring使用及部分原理

    spring作为java开发的框架一哥,我这么说应该没有人反对吧,无论是后面出现的springboot,springCloud,都是依托于它的基础之上。虽然现在很少使用了,但是它的核心还是无时无刻的围绕在我们的程序当中。

    比如如下这些问题: * 你看见过循环依赖的报错吗?怎么解决?为什么会这样? * 为什么你的Bean在启动服务后无法被找到?抑或者没有被依赖注入? * 你写的@Transaction为什么没有生效? * 为什么在微服务环境下很少提到@Transaction?就真的没有用了吗? * 你在设计代码的时候是否在考虑使用依赖倒置的模式? * 是否我可以采用aop的方式来完成这个功能?

    如果你没有真正仔细学习过spring,可能你不会去考虑上面这些问题。

  • 始于java8的lambda

    你还在一行一行敲着你的代码吗?是时候靠考虑下lambda表达式了。它具有更简洁的语法,更加清晰的语义,使你的代码更加高大上。

    目前已经越来越多的组件开始拥抱lambda:

    • 我们常用的mybatis-plus,在新版本中开始引入lambda。
    • 其他语言如;JS,python等都相继支持。

    你还在等什么?

  • mysql的索引原理

    因为mysql是全世界最受欢迎的数据库,且免费开源,是学习索引的最佳例子。

    比如下面这些知识,你都应该知道一二: * B+树是如何存储的?如何查询的?为什么能够提升效率? * 为何选择B+树,相比于其他如B树等有何优势? * 除了B+树索引外,mysql还有其他索引吗?用在什么方面的? * 什么是最左匹配原则?为何有这种说法?

    • 什么是行锁?什么是表锁?你更新一条数据就不会造成死锁吗?

    上面这些是部分的内容,但是当你学过后,你会发现打开了新世界的大门。并且会时长回忆的。

  • Elasticsearch使用和部分原理

    作为java程序员,你必须了解的工作,而且是了解其原理。

    它能够作为很好地方向带你学习索引的知识,比如: * 什么是倒排索引? * 倒排索引和mysql的索引有什么不同,这里为何不使用B+树? * Elasticsearch适合什么场景?写多还是读多? * 集群下的分片,副本是什么意思?

    当你掌握后,相信提升必然不小。

  • 部分微服务框架

    框架这部分是必会的,熟读源码暂且不谈,但是我提到的这部分建议尽快掌握其一。

    • 微服务框架:springCloud、springbCloudAlibaba、Dubbo
    • 注册中心:Nacos(推荐)、eureka、zookeeper(不推荐)
    • 消息中间件:RocketMq、RabbitMq、kafka
    • 缓存:redis(推荐)、MongoDB
    • 持久层框架:Mybatis、Mybatis-plus
    • 分布式事务:seata(推荐)
  • 监控组件

    这部分内容维持着整个微服务的高效、稳定的运行,在大流量的环境是是必须的。不要求你学精通,但是至少能够部署并使用。

    • 链路监控:SkyWalking(推荐)、ZipKin
    • 资源监控:Prometheus + Granfana
    • 服务监控:SpringBootAdmin
  • 大行其道的云原生

    云原生这几年一直是处于行业技术的前列的,并且在不断地进步。大中小企业纷纷选择应用上云,节约人力成本的同时,提高系统的可用性。

    目前最火的毫无疑问就是K8s,不管你的企业环境如何,我觉得你都有必要去了解甚至掌握这一门技术,随着时间推进,它会有更多的潜力和发展。


上面我只列举了差不多一半的,作为java程序要要掌握的基础知识,相信如果你在未来一年全部掌握,一定能够摆脱内卷,做到返璞归真。

未来的技术无论如何去发展,上面的内容仍然是作为一名java程序员,应该了解并学习的,很长一段时间都不会被摒弃的,你还在等什么呢?