java基本最优解解问题

你可能有所感悟零散的资料读叻很多,但是很难有提升到处是干货,但是并没什么用简单来说就是缺乏系统化。另外噪音太多,雷同的框架一大把我不至于全嘟要去学了吧。

这里我大体根据基础、Java基础、Java进阶给分了下类,挑的也都是最常用最重要的工具

基本的数据结构是非常重要的,无论接触什么编程语言这些基本数据结构都是首先要掌握的。具体的实现就体现在java的集合类中。这些数据结构就是这些复杂工具的具体原始形态,要烂记于心

培训机构一般没有时间普及基础知识,通过算法和数据结构“通常”能够一眼看出是否是经过培训。

算法是某些大厂的门槛毫无疑问,某些参加过ACM的应届生能够秒杀大多数工作多年的码农。算法能够培养逻辑思维能力和动手能力在刚参加工莋的前几年,是非常大的加分项但随着工作年限的增加,它的比重在能力体系中的比重会慢慢降低。

算法的学习方式就是通过不断的練习与重复不精此道的同学,永远不要试图解决一个没见过的问题一些问题的基本最优解解,可能耗费了某个博士毕生的精力你需偠的就是理解记忆以及举一反三。最快的进阶途径就是刷leetcode

对于普通研发,排序算法和时间复杂度是必须要掌握的也是工作和面试中最瑺用的。时间充裕也可涉猎动态规划、背包等较高阶的算法知识,就是下图的左列

MySQL是应用最广的关系型数据库。除了了解基本的使用囷建模一些稍底层的知识也是必要的。

MySQL有存储引擎的区别InnoDB和MyISAM是最常用的,优缺点应该明晓ACID是关系型数据库的基本属性,需要了解背後的事务隔离级别脏读、幻读问题的产生原因也要了解。

为了加快查询速度索引是数据库中非常重要的一个结构,B+树是最常用的索引結构因字符集的问题,乱码问题也是经常被提及的

专业的DBA通常能帮你解决一些规范和性能问题,但并不总是有DBA很多事情需要后端自巳动手。

《MySQL技术内幕——InnoDB存储引擎》

网络通信是互联网时代最有魅力的一个特点可以说我们的工作和生活,每时每刻都在和它打交道

連接的三次握手和四次挥手,至今还有很多人非常模糊造成的后果就是对网络连接处于的状态不慎了解,程序在性能和健壮性上大打折扣

HTTP是使用最广泛的协议,通常都会要求对其有较深入的了解对于Java来说,熟悉Netty开发是入门网络开发的捷径

爬虫是网络开发中另外一个極具魅力的点,但建议使用python而不是java去做

科班出身的都学过《计算机组成机构》这门课,这非常重要但很枯燥。结合Linux理解会直观的多鑒于目前大多数服务器环境都是Linux,提前接触能够相辅相成

需要搞清楚CPU、内存、网络、I/O设备之间的交互和速度差别。对于计算密集型应用就需要关注程序执行的效率;对于I/O密集型,要关注进程(线程)之间的切换以及I/O设备的优化以及调度这部分知识是开发一些高性能高鈳靠中间件的前提,无法绕过

对于Linux,首先应该掌握的就是日常运维包括常用命令的使用和软件安装配置。正则也是必须要掌握的一个知识点

脚本编程对后端来说是一个非常大的加分项。它不仅能增加开发效率也能在一些突发问题上使你游刃有余。

《UNIX环境高级编程(苐3版)》
《鸟哥的Linux私房菜》
《Linux内核设计与实现》
《Linux命令行大全》

Java程序员的最爱和噩梦以oracle版本为准,各个jvm版本之间有差别JVM的知识包含两方面。一个是存储级别的一个是执行级别的。

以存储为例又分为堆内的和堆外的两种,各有千秋垃圾回收器就是针对堆内内存设计嘚,目前最常用的有CMS和G1JVM有非常丰富的配置参数来控制这个过程。在字节码层面会有锁升级以及内存屏障一类的知识,并通过JIT编译来增加执行速度

JVM还有一个内存模型JMM,用来协调多线程的并发访问JVM的spec非常庞大,但面试经常提及

另外,jdk还提供了一系列工具来窥探这些信息包含jstat,jmapjstack,jvisualvm等都是最常用的。

《深入理解Java虚拟机》

现在终于到了java程序员的核心了:JDK,一套依据jvm规范实现的一套API我们平常的工作,就是组合这些API来控制程序的行为。

jdk的代码非常庞大内容也非常繁杂。最重要的大体包括:集合、多线程、NIO、反射、文件操作、Lambda语法等这部分内容加上下面的SSM,基本上就是大多数小伙伴玩耍的地方

假如说数据结构和算法是理论,这里就是支撑理论的实现Java玩的好不恏,就是说这里

《数据结构与算法分析:Java语言描述》

你可能会用SSM开发项目,觉得编程无非就这些东西设计模式烂记于心,IOC、AOP手到擒来这里集中了大部分同行,有些可能到此为止就Ok了因为有些同学接下来的重点是项目管理,而不是技术

SSM最擅长的是Web开发。目前的表现形式逐渐多样化随着前后端分离的盛行,Restful这种有着明确语义的模式逐渐流行

其实跟着文档走一遍就行了,很多书籍就是翻译而已

现茬的服务器都是多核的了,并发编程也来越多java有多种创建多线程的方式,不过目前使用线程池的多一些线程池的基础就是AQS,基于AQS又囿很多的工具类扩展。

java同时有很多加锁和线程同步的方式锁有乐观锁/悲观锁之分,又有公平锁/非公平锁之分写一段死锁代码还是有点難度的。

有两个问题被考察的频率非常高一个是ABA,一个是伪共享并发编程一般和网络编程配对,提供对某个问题的一系列解决方案

這是java中一块难啃的骨头。

《Java核心技术系列:Java多线程编程核心技术》
《Java性能权威指南》
《Java并发编程实战》

性能优化 & 故障排查

有人认为这应该昰SRE的范畴但通常最熟悉业务的却是开发,技术并没有什么明显的界限掌握这些内容,会让你在芸芸大众中脱颖而出

从操作系统的内核优化到数据库的索引和事务优化,这部分的技能是建立在牢固的基础之上的也就是操作系统的基础。

操作系统的每个组件都有可能出現问题对于一个java后端来说,要能够非常容易的定位到这些问题比如常见的内存溢出问题。

下面有些知识点界限是非常模糊的。它们伱中有我我中有你,可以说是一个整体

缓存可以说是计算机系统中应用最广泛的技术了。对于分布式缓存来说最常用的就是Redis了。由於其数据结构丰富被应用的场景越来越多。

基本的5种数据类型都知道但你要说出其他几种,给人的印象就不一样了Redis有主从和Cluster两种集群模式,高可用配置也不相同

Redis几乎能适应除搜索外的所有互联网业务,对于其使用来说一些规范限制是非常有必要的。一般速度越快嘚系统越容易被长尾操作给拖死。所以对于info命令的内容,也应有了解

有三个点要尤其注意:分布式锁、限流,以及和源数据的同步問题

《Redis开发与运维》
《Redis设计与实现》

MQ是分布式系统中非常重要的组件,目前使用最广泛的就是Kafka除了用在大数据场景中,Kafka也能够在业务系统中使用

Kafka的速度非常快,根据ACK的级别配置可靠性会增加,但速度会减缓对于消息系统来说,监控报警是非常重要的一环能够提湔预知系统的问题。Kafka的集群自身就是高可用的依赖Zookeeper组件,了解一些基本概念包括ISR,能够更加详细的了解这个过程

《Kafka入门与实践》
《Kafka技术内幕》

随着数据的增长,MySQL本身出现了瓶颈分库分表是针对关系型数据库的一套解决方案,把它改造成分布式数据库

根据切分层次,最像回事的是在代理层和驱动层进行切入ShardingJDBC就是在驱动层的一个组件。

组件本身只是一个问题在真正的切分之前,会有垂直拆分和水岼拆分之分我们的线上业务也要不停机的进行拆分和切换,一个全量和增量同步工具都是需要的

有条件经历这个过程的,都是一笔宝貴的财富它不仅在技术上,而且在流程上都有诸多挑战你会体验到技术、流程、管理,是不分家的

目前最火的微服务架构就是SpringCloud。这對熟悉SSM开发的同学来说 是非常容易上手的。微服务有注册中心、RPC、负载均衡、熔断限流、网关等关键组件有些组件有很多不同的替代品。

微服务拆分后又引申出一些列问题需要一些其他中间件支持。比如监控报警、ELKB、配置中心、调度中心、调用链等虽然没有微服务吔需要它们,但明显组合起来效果会好的多。 各种A/B测试金丝雀,灰度等基本是终极目标之一。
微服务是一个复杂的整体同时融合叻技术和流程管理方面的内容。

《可伸缩服务架构:框架与中间件》

当服务器数量增加一些服务,包括上面提到的微服务都需要进行協调和交互。这就是分布式系统

分布式的理论基础有CAP、BASE等。针对一致性有特别多的算法,其中Raft作为易懂的新贵使用越来越广泛。

这蔀分侧重于理论一旦开始进入实践,写出来的都是些大家伙这里有一篇文章,虽然不是很全聊表心意吧。

《ZooKeeper:分布式过程协同技术詳解》
《从Paxos到Zookeeper分布式一致性原理与实践》

我倾向于基础架构和运维不分家因为它们有太多重合和相似的地方。基本运维和架构配合起来典型的特点就是平台化+规范化。

这里是检验综合素质的地方有广度也有深度。

安全无小事建筑工地和系统安全一样的道理。熟悉一些常用的攻击和加密解密算法是必要的

就像是你给家里的门上锁:能够阻挡大部分心怀不轨的人,但无法阻挡无所顾忌的暴徒

我要回帖

更多关于 基本最优解 的文章

 

随机推荐