Java开发除了增删改查还能做什么?很迷茫?
❝近日,闲逛知乎,忽见一问,曰 “Java开发除了增删改查还能做什么?很迷茫?”。余大喜,此非送分题乎?遂答之,故成此文。博君一乐耳。
❞
参加工作不久的初中级开发工程师通常都会有题主的感受,就是觉得Java开发,尤其是后端Java开发好像只能做CRUD,干一些增删改查的重复、简单的工作。
每天面向的就是表格处理、报表处理、后台管理系统等等。所谓的高并发、高可用是一点儿都没接触到。
实际上,这是正常的感知,因为每个人最直观的感知就会决定他对这个事物的认知。
❝话说回这个问题,Java开发真的只能做CURD之类的工作吗?
❞
答案当然是否定的,当然,我们说软件本身归根到底都是由算法+数据结构构成的,进一步细化之后,其实就是通过一系列的增删改查操作,构成算法,对数据结构进行操作,赋予业务属性。
那么我们说Java,甚至于各种其他的编程语言,都是在增删改查也不为过。
这里有点钻牛角尖了,我想题主说的增删改查应当就是字面上的意思,也就是平时的开发主要就是通过使用开发框架完成简单的需求。
而完成需求的主要过程就是调用api的增删改查功能,业务逻辑怎么看都复杂不起来。
实际上,当我们开发接触业务系统的主流程,我们会发现,好像简单的api调用没有那么好用了。
为了实现查询的高性能,我们不能再简单地通过 「Data Access Layer(或者说DAO?)」 基于JDBC/MyBatis/JPA 直接操作DB了事。
而是需要整合缓存,作为查询的缓冲。而缓存又进一步分为本地缓存、分布式缓存。
此时我们就不得不考虑缓存失效策略,缓存与DB数据一致性的处理,如果恰好使用了诸如Redis、cassandra、MongoDB等分布式NoSQL.
数据库,我们还得进一步考虑如何保证它们的高可用,以及如何对查询进行优化。
退一步说,即便没有使用缓存,当用户数量增加,请求激增,或者产品贴心的提出了要在系统中增加秒杀、大促等场景,那么我们就不得不考虑对DAL/DAO层进行优化,常见的优化诸如:读写分离、分库分表、慢查询优化。
站在一家公司业务发展的进程上看,分库分表往往不是一开始就引入的,而是先对数据库进行读写分离,主从架构优化,然后对业务中的sql进行优化,
那么对于研发而言,掌握常见的SQL优化策略,就显得尤为重要,如explain的使用、索引的原理及优化。
如果使用了分库分表,那么就需要对各种分库分表的中间件进行选型,势必需要进行调研学习,框架整合,选型比较等一系列的工作,这和传统的增删改查
相比又增加了些许挑战。
我们假设一开始的服务是单体的,那么这个时候项目的代码基本上都是写在一个工程里,业务之间的调用也都是本地调用,跑的很好。
随着业务量增加,用户数增多,竞品数量增加,导致需求迭代越来越快,需求提出越来越多,于是不得不考虑对单体服务进行服务化改造,
那么此时就又需要接触到服务化框架,比如说Dubbo、gRPC(当然它本质上还是一个rpc框架,需要自己增加各种服务化的支持,如负载均衡、服务发现等)、SpringCloud(它本质上是一个微服务框架,提供了一揽子的解决方案),
自然而然地,我们就需要通过rpc调用改造原先的本地方法调用,通过MQ(Kafka、RocketMQ、Pulsar等)对异步场景下的数据交互进行改造。
分布式了,服务间调用链路长了,复杂了,监控得加对吧,那么就自然而然需要引入各种监控框架,比如说APM探针,如ZipKin、PinPoint、SkyWalking等组件,
日志分析系统,如ELK、Flume等组件,有了监控上报的数据,我们还得提供一些可视化的界面,可以自研,也可以使用开源的组件比如说prometheus + kibana。
公司业务复杂了,系统规模变大了,老板想看看业务数据,搞搞用户画像,搞搞日志分析,这个时候就得引入大数据那套生态圈,hadoop、flink、HBase用起来了,
想用sql方便查数据,于是HIVE也得用起来了,ETL搭起来了,本质上还是增删改查,但是复杂度和当初的单体系统DAO/DAL不可同日而语。
业务系统数据要导入大数据系统,kafka也接进来了,zookeeper也得搭起来了,那么自然的,不得了解一下zookeeper一致性实现的机制,各种ZNode的特性和使用方法,
再了解了解ZAB算法,学习一下优秀的分布式协调算法是怎么实现的,于是你对分布式系统的认识又加深了。
后来,业务复杂到,迭代一次就得修改好多个微服务,很头疼,于是大佬说,要不咱们试试DDD吧,重构一下系统。
于是我们又得学习一通DDD的方法论和工具箱,大刀阔斧的搞了领域驱动改造。
此时的我们,回头一看,原来Java不止是简单的增删改查,它的生态如此之广阔,此时的自己感受着Java生态圈的庞大和自己显著的成长,突然眉头一动,
恍然大悟,KAO,搞了半天,这些玩意儿不还是增删改查嘛!
继续更新一下,当写业务系统写到一定程度,大概率需要定制一些自己的组件,封装一些类库,这个时候大概率也就开始读源码了。
当接触了优秀的开源框架的源码,比如:Spring的core、Context包、Guava、RocketMQ、Netty、甚至JDK的JUC包源码,我想基本上也就不会再纠结Java到底可以干什么了。
因为源码已经告诉你了,Java可以干的事情很多,
它可以开发IOC、AOP框架,简化业务开发的工作量;
它可以开发各种微服务中间件,简化服务化改造的成本和投入;
它可以开发各种三方类库,提升代码质量减少重复开发;
它可以封装复杂的底层细节,让开发者更加友好地进行并发编程;
重要的,它能够提供一个窗口,让开发者不断更新知识体系,不断进步和持续学习。
对于公司发展而言,它也能够持续带来流量的增加和业务的发展。
总结:
学习三境界,看山是山,看山不是山,看山还是山。
题主能提问出这个问题,恰巧表明题主已经到了看山不是山的层次,有所质疑,有所进步,祝我们都能继续进步,到达更高的认知层次。
看了看其他的一些答案,各种推荐书,还有推荐自己的笔记要关注的,蚌埠住了。
答案原地址:https://www.zhihu.com/question/510619641/answer/2347022679