计算机基础
网路
TCP 协议,它和 UDP 的差异
TCP 三次握手四次挥手
拆、粘包
HTTP
操作系统
进程、线程、内存等概念;服务器常见的命令使用《鸟哥的 Linux 私房菜》
数据结构与算法
二叉树、红黑树、栈、队列等
选择和排序算法 LeetCode,(第4版)
java基础
基本容器,,如:HashMap、ArrayList、HashSet、LinkedList 等,不但要会用还得了解其中的原理。这样才能在不同的场景选择最优的设计;
IO、NIO 也是需要掌握。日常开发中大部分是在和磁盘、网络(写日志、数据库、Redis)打交道,这些都是 IO 的过程。
常见的设计模式如:代理、工厂、回调、构建者模式,这对开发灵活、扩展性强的应用有很大帮助。
Java 多线程是非常重要的特性,日常开发很多。能理解线程模型、多线程优缺点、以及如何避免。
良好的单测习惯,很多人觉得写单测浪费时间没有意义。但正是有了单测可以提前暴露出许多问题,减少测试返工几率,提高代码质量。
良好的编程规范,这个可以参考《阿里巴巴 Java 开发手册》以及在它基础上优化的《唯品会 Java手册》,《Java核心技术·卷I》值得推荐
多线程应用
多线程的出现主要是为了提高 CPU 的利用率、任务的执行效率。但并不是用了多线程就一定能达到这样的效果,因为它同时也带来了一些问题:
- 上下文切换
- 共享资源
- 可见性、原子性、有序性等。
一旦使用了多线程那肯定会比单线程的程序要变得复杂和不可控,甚至使用不当还会比单线程慢。所以要考虑清楚是否真的需要多线程。
会用了之后也要考虑为啥多线程会出现那样的问题,这时就需要理解内存模型、可见性之类的知识点。
同样的解决方式又有哪些?各自的优缺点也需要掌握。
谈到多线程就不得不提并发包下面的内容 java.util.concurrent。
最常用及需要掌握的有:
- 原子类:用于并发场景的原子操作。
- 队列。常用于解耦,需要了解其实现原理。
- 并发工具,如 ConcurrentHashMap、CountDownLatch 之类的工具使用以及原理。
- 线程池使用,以及相关原理。
- 锁相关内容:synchronized、ReentrantLock 的使用及原理。 这一块的内容可以让我们知道写 JDK 大牛处理并发的思路,对我们自己编写高质量的多线程程序也有很多帮助。 推荐《Java并发编程的艺术》很好的并发入门书籍。
- JVM 内存划分,知道哪块内存存放哪些内容;线程安全与否;内存不够怎么处理等。
- 不同情况的内存溢出、栈溢出,以及定位解决方案。
- 分代的垃圾回收策略。
- 线上问题定位及相关解决方案。
- 一个类的加载、创建对象、垃圾回收、类卸载的整个过程。 推荐《深入理解Java虚拟机》
- 索引的数据结构及原理、哪些字段应当创建索引。
- 针对于一个慢 SQL 的优化思路。
- 数据库水平垂直拆分的方案,需
- 了解业界常用的MyCAT、sharding-sphere 等中间件 推荐《高性能 MySQL》
- 首先是一些基础理论如:CAP 定理,知道分布式系统会带来的一些问题以及各个应用权衡的方式。
- 了解近些年大热的微服务相关定义、来源以及对比,有条件的可以阅读 martin fowler 的原文 Microservices,或者也可以搜索相关的国内翻译。
- 对 Dubbo、SpringCloud 等分布式框架的使用,最好是要了解原理。
- 接着要对分布式带来的问题提出解决方案。如分布式锁、分布式限流、分布式事务、[分布式缓存]https://github.com/crossoverJie/Java-Interview/blob/master/MD/Cache-design.md)、分布式 ID、消息中间件等。
- 也要了解一些分布式中的负载算法:权重、Hash、一致性 Hash、故障转移、LRU 等。 最好能做一个实践如:秒杀架构实践 之前有开源一个分布式相关解决组件: https://github.com/crossoverJie/distributed-redis-tool
推荐 《大型网站技术架构》
懂点架构首先分布式肯定得掌握,毕竟现在大部分的架构都是基于分布式的。
这其中就得根据 CAP 理论结合项目情况来选择一致性还是可用性,同时如何做好适合现有团队的技术选型。
这里推荐下开涛老师的《亿级流量网站架构核心技术》,列举了很多架构实例,不过网上褒贬不一,但对于刚入门架构的能科普不少知识。
保持竞争力- 打好基础。不是学了之后就忘了,需要不停的去看,巩固,基础是万变不离其宗的。
- 多看源码,了解原理,不要停留在调参侠的境界。
- 关注行业发展、新技术、新动态至少不能落伍了。
- 争取每周产出一篇技术相关文章。 积极参与开源项目。
https://github.com/crossoverJie/Java-Interview