1. 数据结构与算法你合格了吗?作为一个打算当程序员的你,基本的数据结构和算法你必须掌握吧?如果连数组,链表,这两个基本的结构都搞不懂,时间复杂度与空间复杂度的概念都不知道,你配说入门二字?如果平衡二叉树,红黑树,哈希表,堆,桶,图,这些基本的数据结构都不知道其特性和应用场景,甚至连听都没听过的人,拿什么去合格?也不要求你掌握多么深难的算法了,如果连简单的冒泡和选择排序被要求你手写下都面有难色,估计一写代码也只能面向百度编程,合格吗?那么快排、插入、希尔、堆排序、二路归并、多路归并、桶排、计数、基数这些稍微复杂一点而又基本的东西你要是都有所了解,那么姑且就合格了吧。
2. 操作系统你合格了吗?如果几个基本的linux命令都不知道的人,看个日志遇到文件大了估计都要卡死服务器的主,你认为这叫合格?系统简单的脚本还是要会编写一点吧?内存分配、进程、线程调度这些简单基础的概念你还是要知道以下的,别说这些东西没用,不少经典的东西在做实现的时候,都参考了不少操作系统的设计思路,这些都有所理解,算你及格吧。
3.数据库层面的事情你合格了吗?。几大范式定义概念你知道吗?数据库事务的ACID能扯明白吧?隔离层级分别保障的粒度,以及这些隔离层级下依然存在的问题你得知晓吧?这些算是最基本的要求了,如果都不明白那还提什么合格二字?SQL写得荣誉无比,拿SQL搞运算写出复杂无比但是卡得爆机你就可以沾沾自喜了?就问你SQL优化搞没搞过?主流的MYSQL的存储引擎之间的区别,几种索引的区别和应用场景,这些你都如数家珍撒?再说了作为一只技术狗,数据库事务的实现方式你应该知道一些吧?二阶段提交、三阶段提交你知道不?了解这些算你还凑活事儿吧。
以上算通用层面的东西,只要你说你还是个程序员,你就应该是合格的。下面我们就来掰扯下和java有关的东西了。
1.集合方面的事情你合格了吗?map,set,list的区别概念,能捯饬明白?你看看数据结构重要不?就问你点具体的实现类简单点的就HashMap HashSet ArrayList,看你能明白多少,然后换点稍微有意思的话题HashTable,CurrentHashMap,TreeSet,LinkedHashSet,LinkedList,BlockingQueue及其各种实现看你能白活多了?搞java的嘛,这些怕是老生常谈的面试面试开场白噢?要是一问三不知,怕是你自己都不好意思说自己合格吧?
2.IO方面:IO要掌握的就比较多了,IO的设计模式你知道吗?BIO\NIO\AIO它们是怎么设计的呢?Facade\Reactor\Proactor又都是些什么鬼呢? select,poll,epoll又有哪些区别?以上的东西和NIO\AIO,又有哪些联系呢?都知道,那么mina,netty,Grizzly,听没听过,玩没玩耍过?相信很快能摸出你的合格特性。别说这些没有用哈,rpc的框架的异常堆栈抛出来了,基本上都在上面三个东西里面,至于合格几分就是你的事情了。
3.多线程你合格了吗:不问这个怕是面试官不合格吧?线程的生命周期,同步异步的区别,什么时候需要同步,什么时候需要异步,线程的调度方式,聊聊并发编程,为啥要并发,怎么去并发,你处理了哪些并发问题,说句真心话,别说没有应用场景,都知道业务流程有主次之分,那么对于不影响主流程的次要流程,你如果都没异步处理过的下,你过去搞的系统或者说工作经验真心不好说合格二字了。
4.JVM你合格吗:都是搞java的,那么虚拟机的一些东西你总得知道吧?JVM的内存模型,垃圾回收机制,各种机制下的垃圾回收器怎么工作还是知晓些吧。基本的参数调优,你应该有所了解吧。这些知道其实大概其合格了。不过,JVM字节码这种苛刻的要求,如果你非要看了某些面经上来炫技,那么必须满足你的诉求,大家好生掰扯,希望你能达到合格的目的。
5.搞web开放的人,一些基本的常识你都不了解你合格吗?http协议、https协议,dns解析过程、servlet是个什么东西?生命周期如何?request/response区别,session/cookie区别实现机制,redirect/forward的区别你能给简单讲讲?如果这些都不了解,你怕不是搞java web开发的,又到哪里去合格?
6. 编程框架你合格了吗?都是搞web开发的,问下web的框架执行流程都不清楚,你能说你合格吗?比如SpringMVC是如何工作的?你自己实现个web框架可以还是不可以?怎么做,可有思路?自己吃饭用的勺子怎么工作的你还是应该了解的撒?反射加代理再用个map做缓存就能搞的事情都不知道,这个怕是不合格噢。
7.Spring的基本原理你掌握合格了吗?IOC\AOP的实现原理怎么来的?bean的作用域有哪些,务传播机制,隔离层级,这些你都了解吗?如果只是知道点用法,你就认为你合格了,那么估计技术这条道路你的走法也合格不到哪里去。实现机制的一些事情你还是该掌握吧?比如代理的几种方式JDK的cglib的aspectJ的,你又知道多少?抛弃了框架你自己实现基于类的代理有门么?mybatis听过没?不管你听没听过反正jdbc那些事情,数据库连接池的那些事情,面试的时候还是要人认为你合格的,必须和你好好聊聊。spring boot?如果上面这些你掌握得比较好,你算都够可以了,合格了吧?
8.一些通用问题你合格了吗:大名鼎鼎的apache你知道吗?web服务器,应用服务器类的区别你知道吗?ngnix玩耍过没?ngnix你都用来干了些什么?缓存可有听过?怎么来玩耍?从浏览器端一直到后端的各层缓存该怎么来玩耍?策略又是如何来定的?分布式缓存可有听过?memcached,redis可有玩耍过?总之话题很多,根据你掌握的深浅程度,聊聊就可以知道你不是不是合格了。
9.分布式的一些问题你合格了吗:你可知晓为啥需要你的系统搞成分布式的?分布式有哪些经典问题?应用无状态的几种实现方式你都了解(别拿机构你告诉你的每一次请求都打到认证中心那种方式来扯,培训刚毕业多半是合格不了的)?全局唯一ID,(莫要拿什么雪花算法之类的烂大街的来扯,被当成机构里听了两句就出来扯的是,那真的阿弥陀佛恭喜你了),分布式锁怎么搞?负载均衡有没有概念?如何做?如何保障你的应用高可用?如何去保障分布式环境下的一致性问题?消息中间件玩耍过没有?知不知道都有哪些,实现区别在哪里,用它干嘛去?分布式的环境下如何去保障服务的可靠性?如何面临雪崩问题?如何面临穿透问题?包括但不限于spring cloud的相关话题,都解决了哪些分布式中哪些个方面性的问题,如何解决的,策略有哪些?至于你掌握了多少,掌握到什么程度,有没有真正的搞过就决定你合格的程度了。
10.你解决问题的思路是否合格?比如你系统里用于登陆验证的加密盐值泄露了,你如何解决?前提不能影响正常用户的使用噢?真的只是你一个应用就能解决问题的事情吗?再比如,给你一个大文件里面全是数字如何去完成排序?你以为你想到归并排序,就万事大吉了?不认真思考问题,张嘴就来,基本分都达不到,你算什么合格?有没有想到这个文件怎么读、怎么写,读到哪里,写道哪里?你想没像过读取后写到不同的机器,然后不同的机器跑一样的算法然后合并结果,最后输出?对的,能想到这些东西,说明你能思考问题,并借鉴其他软件的经典解决思路,比如hadoop,在思考问题的一些思想上你算合格了