你或许会有一些感悟。零零散散的资料看了很多,但是很难提高。到处都是干货,但没什么用。简而言之,它缺乏系统化。另外,杂音太多,类似的框架一大堆,没必要全部学一遍。在这里,我按照基础、Java基础、Java进阶大致分为以下几类,挑选常用的和重要的工具。这篇文章耗费了我不少精力,如果觉得不错,请不要吝啬你的点赞。同意的话可以关注我的微信公众号xjjdog,就是关于这些内容的。我会尽量系统化。最新内容会在github上持续更新,并会添加新的精选相关文章。地址:https://github.com/sayhiai/javaok数据结构基础知识数据结构基础很重要。不管你接触到什么编程语言,这些基本的数据结构都是首先要掌握的。具体实现体现在java的集合类中。这些数据结构是这些复杂工具的特定原始形式,必须牢记在心。培训机构一般没有时间普及基础知识。通过算法和数据结构,“通常”可以一眼看出是否经过训练。常用算法算法是一些大厂的门槛。毫无疑问,一些参加过ACM的应届毕业生,可以秒杀大部分工作多年的码农。算法可以培养逻辑思维能力和动手能力,是工作前几年非常大的加分项。但随着工作年限的增加,其在能力体系中的比例会逐渐降低。算法是通过练习和重复学习的。不精通这种方法的同学千万不要去尝试解决以前没见过的问题。有些问题的最优解可能耗费了医生一生的精力。你需要的是理解记忆并举一反三。最快的进阶方式就是刷leetcode。对于一般的研发来说,排序算法和时间复杂度是必须要掌握的,也是求职和面试中最常用的。如果时间充裕,还可以涉猎动态规划、背包等更高层次的算法知识,也就是下图中的左栏。书籍《算法导论》《编程之美》《数学之美》数据库基础知识MySQLMySQL是一种广泛使用的关系型数据库。除了了解基本的用法和建模外,一些底层知识也是必要的。MySQL具有存储引擎的区别。InnoDB和MyISAM比较常用,优缺点要分清楚。ACID是关系型数据库的一个基本属性,了解其背后的事务隔离级别是很有必要的。还应该了解脏读和幻读的原因。为了加快查询速度,索引是数据库中一个非常重要的结构,而B+树是最常用的索引结构。由于字符集的问题,经常会提到乱码问题。专业的DBA通常可以帮你解决一些规范和性能方面的问题,但不一定总是有DBA,很多事情需要后端来完成。书籍《MySQL技术内幕——InnoDB存储引擎》《高性能MySQL》《高可用MySQL》网络基础知识网络通信是互联网时代的一个吸引人的特征。可以说我们的工作和生活每时每刻都在和它打交道。三向握手,四向挥手连接,对于很多人来说还是很模糊的。其后果是无意中了解了网络连接的状态,程序的性能和健壮性大大降低。HTTP是一种广泛使用的协议,通常需要对其有很好的理解。对于Java来说,熟悉Netty开发是入门网络开发的捷径。爬取是web开发中另一个很吸引人的地方,但是推荐使用python而不是Java来做。书籍《HTTP权威指南》《TCP/IP详解 卷一》操作系统Linux专业学过这门课程《计算机组成机构》,很重要,但是很枯燥。用Linux理解起来会直观很多。鉴于当今大多数服务器环境都是Linux,早期接触可以相得益彰。有必要弄清楚CPU、内存、网络和I/O设备之间的交互和速度差异。对于计算密集型应用,需要关注程序执行的效率;对于I/O密集型应用,需要注意进程(线程)之间的切换和I/O设备的优化调度。这部分知识是开发一些高性能高可靠中间件的前提,绕不过去。对于Linux,首先要掌握的就是日常运维,包括常用命令的使用和软件的安装配置。规律性也是一个必须掌握的知识点。脚本对于后端来说是一个巨大的优势。不仅可以提高开发效率,还可以让你应对一些意想不到的问题游刃有余。书籍《UNIX环境高级编程(第3版)》《鸟哥的Linux私房菜》《Linux内核设计与实现》《Linux命令行大全》JavaBasicsJVMJava程序员的最爱和噩梦。以oracle版本为准,各个jvm版本存在差异。JVM的知识包括两个方面。一个在存储层面,一个在执行层面。以存储为例,分为堆内和堆外两种,各有千秋。垃圾收集器是为堆内内存设计的,最常用的是CMS和G1。JVM有一组非常丰富的配置参数来控制这个过程。在字节码层面,会有锁升级、内存屏障等知识,通过JIT编译提高执行速度。JVM还有一个内存模型JMM,用来协调多个线程的并发访问。JVM的spec非常大,但在面试中经常被提及。此外,jdk还提供了一系列工具来窥探这些信息。包括jstat、jmap、jstack、jvisualvm等,都是常用的。书籍《深入理解Java虚拟机》JDK现在,终于到了java程序员的核心:JDK,一套按照jvm规范实现的API。我们平时的工作就是组合这些API来控制程序的行为。jdk的代码量很大,内容也很复杂。最重要的一般包括:集合、多线程、NIO、反射、文件操作、Lambda语法等,这部分加上下面的SSM,基本上就是大部分小伙伴玩的地方了。如果数据结构和算法是理论,这里是支撑理论的实现。Java玩的好不好,就是说到这里。书籍《Effective Java 中文版》《数据结构与算法分析:Java语言描述》SSM你可能用SSM开发项目,以为编程无非就是这些东西。设计模式记性不好,IOC和AOP就在手边。大部分的同行都集中在这里,有的同学可能在这一点上还可以,因为有的同学会把重点放在项目管理上,而不是技术上。SSM擅长的是Web开发。目前的表现形式逐渐多样化。随着前后端分离的盛行,Restful这种语义清晰的模式越来越流行。书籍《Head First 设计模式》《Spring揭秘》《SpringBoot揭秘》《MyBatis技术内幕》《深入剖析Tomcat》其实只是跟着文档走,很多书籍只是翻译而已。并发编程现在服务器都是多核的,并发编程越来越多。java中创建多线程的方式有很多种,但目前使用线程池较多。线程池的基础是AQS。基于AQS,有很多工具扩展。Java还有很多加锁和线程同步的方式。锁分为乐观锁/悲观锁,公平锁/非公平锁。写死锁代码还是有点难度的。查的比较频繁的有两个问题,一个是ABA,一个是虚假分享。并发编程通常与网络编程相结合,为问题提供一组解决方案。这是Java中难以破解的难题。Books《Java核心技术系列:Java多线程编程核心技术》《Java性能权威指南》《Java并发编程实战》PerformanceOptimization&Troubleshooting有些人认为这应该是SRE的范围,但通常对业务最熟悉的就是开发,对于技术并没有明显的界限。掌握这些内容会让你脱颖而出。从操作系统的内核优化到数据库的索引和事务优化,这部分技能都是建立在扎实基础之上的。这是操作系统的基础。操作系统的每个组件都可能有问题。对于一个java后端来说,定位这些问题是非常容易的。比如常见的内存溢出问题。《性能之巅:洞悉系统、企业与云计算》《高性能Linux服务器构建实战》JavaAdvanced这本书下面有一些知识点,界限很模糊。你中有我,我中有你,可以说是一个整体。Redis缓存可以说是计算机系统中使用最广泛的技术。对于分布式缓存,Redis是最常用的。由于其丰富的数据结构,被用在越来越多的场景中。五种基本数据类型你都知道,但是如果你要给其他类型命名,给人的印象就不一样了。Redis有master-slave和cluster两种集群模式,高可用配置也不同。Redis几乎可以适应除搜索以外的所有互联网服务。为了它的使用,一些规范的限制是非常必要的。一般越快的系统越容易被长尾操作拖死。因此,您也应该对info命令的内容有所了解。需要特别注意三点:分布式锁、限流、与源数据同步。本书《Redis实战 》《Redis开发与运维》《Redis设计与实现》KafkaMQ是分布式系统中非常重要的一个组件,目前应用最为广泛的是Kafka。Kafka除了应用于大数据场景,还可以应用于业务系统。Kafka速度很快,根据ACK的level配置,可靠性会增加,但是速度会变慢。对于消息系统来说,监控告警是非常重要的一环,可以提前预知系统问题。Kafka的集群本身是高可用的,依赖于Zookeeper组件,了解一些基本概念,包括ISR,可以更详细的理解这个过程。书籍《Kafka入门与实践》《Kafka技术内幕》分库分表ShardingJDBC随着数据的增长,MySQL本身就有了瓶颈。分库分表是关系型数据库的一套解决方案,将其转化为分布式数据库。按照切分层次,最相似的是在agent层和driver层切入。ShardingJDBC是驱动层的一个组件。组件本身只是一个问题。在真正拆分之前,会有纵向拆分和横向拆分。我们线上业务也需要在不停机的情况下进行拆分切换,需要一个全量和增量同步的工具。任何有条件经历这个过程的人都是一笔宝贵的财富。它不仅在技术上,而且在过程中都面临着许多挑战。您将体验到技术、流程和管理是密不可分的。Microservices&Middleware目前最流行的微服务架构是SpringCloud。这对于熟悉SSM开发的同学来说非常容易。微服务有注册中心、RPC、负载均衡、熔断限流、网关等关键组件。一些组件有许多不同的选择。微服务拆分后,会出现一系列的问题,需要一些其他的中间件支持。比如监控告警、ELKB、配置中心、调度中心、调用链等,虽然没有微服务也需要,但结合起来显然好很多。各种A/B测试,金丝雀,灰度等,基本上是终极目标之一。微服务是一个复杂的整体,包含了技术和流程管理方面。Books《可伸缩服务架构:框架与中间件》《Spring Cloud与Docker微服务架构实战》《架构修炼之道》Distributed当服务器数量增加时,一些服务,包括上面提到的微服务,需要进行协调和交互。这是一个分布式系统。分布式的理论基础包括CAP、BASE等,为了一致性,算法有很多,其中Raft作为一个通俗易懂的新贵,应用越来越广泛。这部分偏重于理论,一旦开始实践,写的都是些大佬。这里有一篇文章,虽然不是很全,但还是说说吧。书籍《NoSQL精粹》《ZooKeeper:分布式过程协同技术详解》《从Paxos到Zookeeper分布式一致性原理与实践》支持技术基础运维我倾向于把基础设施??和运维分开,因为它们有太多的重叠和相似之处。基础运维与架构的结合,典型的特点是平台化+标准化。这是考验综合素质的地方,既有广度又有深度。书籍《奔跑吧Ansible》《Docker——容器与容器云》《Kubernetes权威指南》《Jenkins权威指南》《深入理解Nginx》安全无小事,工地和系统安全同样如此。熟悉一些常用的攻击手段和加解密算法是必要的。这就像锁上你家的门:它可以阻止大多数坏人,但不能阻止肆无忌惮的暴徒。您可能会发现没有您关心的组件。这也不奇怪,比如我个人喜欢的ES就找不到合适的位置。这里只是说最重要的一点,已经很复杂了,大杂烩不一定好。值得提醒的是,这门知识是很多发展路线的一个分支。可能有的朋友目前只是在一个点上苦苦挣扎,缺乏所谓的广度;也可能有朋友打着全栈标签,却在做SSM的工作。不同的公司需要不同级别的技术。专注于ERP业务的公司,关于项目管理的文章会更多;专门从事IM的团队可能熟悉网络开发。再次强调。这个技术点是针对个人组织的。为了修复认知偏差,我会维护一个github项目,跟进分类并实时添加新的相关文章(欢迎提交PR)。如果大家有什么想法,请尽快反馈给我,非常感谢。
