最近两年,整个软件行业,被内卷这个词汇所席卷,各位应当深有体会。
那么对于程序员来说什么才是内卷?是必备的面试八股文?是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程序员,应该了解并学习的,很长一段时间都不会被摒弃的,你还在等什么呢?
作者:我犟不过你
链接:https://juejin.cn/post/7057405916424962061
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。