惭愧,从一次电面提及。我我的在某国企作一名软件设计师,国企你们都懂的,待遇通常并且没啥意思,作的方向基本都是操做系统、驱动和工具软件的开发,语言基本都是C/C++。最近也想跳槽,恰好有幸获得了一次阿里的面试机会,因而就试了试。java
首先是电话面试,当时正在上班,人多口杂,好不容易找了个没人的地方开始面试。面试的方向是Java Web,面试官很nice,跟朋友同样,一开始问了些比较基础的东西,好比hashmap/hashtable的区别和优缺点,我答得还行,并且对于原理的东西还算讲的比较透彻。程序员
Java Web的面试天然就会问到servlet,对于java多线程的东西仍是那样,原理性的东西和底层的机制都比较清楚,面试官也还算满意,但往上层就不是我擅长的了。当被问到AOP时,居然语塞、哑口无言,由于根本忘了是干什么的了。本科的时候曾经作过Web服务器相似的课程设计,其实有接触过,然而读研的时候方向太偏,过于底层,基本也就没作过Java Web方向相关的项目。纯粹是凭着对互联网的热忱以及一些网上有着一样追求的朋友,从读研到工做一年,依然坚持关注互联网相关技术。web
尽管后来的问题有些没答上来,但面试官仍是给了我一次面试的机会,11.20日从北京飞武汉参加专场面试。一面依旧先是一些基础的题目,而后写了两个算法程序,字符串转换相关的,都挺简单的,虽然第二个题当时没有很快反应过来。一面的过程当中,发现之前掌握的一些东西真的有好多都忘记了,好比UML的类图关系怎么画,数据库建表均不能第一时间写对,再好比Http协议302/301是什么意思等。我本觉得会问许多和Java Web框架相关的问题,因此电面后一口气,不到一星期把《Spring in Action》、《Struts in Action》还有Hibernate的一本电子书以及《深刻分析Java Web》全刷了一遍,然而并无问太多框架相关的问题。后来算是自由发挥,就把本身之前作项目时遇见的JVM调优过程讲了讲。面试
二面面对两个面试官,基本不算是技术面,主要对着简历问了一些作过的项目相关问题,以及我的经历。因为本身项目经验还算丰富,作过的东西还算扎实,因此这个不算什么问题。后来又问了本身对本身的定位及对于B2B业务有什么见解以及base的问题,这就很少说了。有一个问题却是难了我一下,固然也就1秒钟。根据个人简历,我作系统和底层的东西更适合,因此面试官问我是否愿意去阿里云,我知道阿里云是潘爱民老师带的,之前还和潘爱民老师合过影,相信不少人都看过《程序员的自我修养》,从中受益过。但个人回答是:“我确实以为这个方向也不错,也很仰慕潘老师,但既然我来面B2B Java Web相关的职位,说明我更倾向于作偏应用方向的东西。”算法
大概是由于我有一些同窗和朋友在阿里,本身也比较关注阿里,对阿里的技术框架还算比较了解,因此二面比一面状况好不少,感受面试官仍是挺满意的,只不过提了一点就是我刚工做一年多,以为年头少了点。数据库
终面完毕,和两次面试的面试官都打好招呼后回到住的酒店睡了一觉,原本有些忐忑,结果快晚上时,面试官一个电话过来讲我状况还不错,之后就算是同事了,预计会一周以内通知。听到这个消息,固然是至关兴奋,在向面试官道谢后,和武汉的同窗一块儿吃了顿饭,心情格外舒畅。编程
如今应该算是在等待最终的offer吧,但愿本身好运。设计模式
“你学习一门技术的最佳时机是三年前,其次是如今。”这话历来很灵验。通过此次面试,以为须要整理下Java Web相关的资料,以便本身提升或者更快适应可能面临的新的工做。安全
首先谈谈Java Web须要掌握哪些东西。这里是一些知识点的搜集,暂不作详细说明,欢迎各位博友补充指正。服务器
1.底层
Java语言相关的就不说了,首先是JVM的结构和工做原理。比较重要的是Java内存模型,各类GC算法,Classloader的加载原理等。我的对底层的一些东西还算比较了解,因此不过多纠结,实际上程序编译连接过程以及二进制文件的处理仍是很值得研究的。
JVM监控及调优。做为一个开发人员并不必定须要很是熟悉JVM调优的方法,但若是具有JVM监控及调优的能力,将让你对程序运行情况了如指掌,对于问题定位也会敏感得多。
Java多线程。对于线程安全的理解,以及如何在本身的程序中避免多线程形成的不一致问题等。
I/O。Java中经常提到的是BIO/NIO,即阻塞型I/O与非阻塞型I/O,其实并不难理解,结合Linux中的同步I/O和异步I/O的实现原理,基本都是相通的,每种I/O方式解决的问题,又存在什么问题,为何使用epoll。
2.Servlet
Servlet是运行于服务端的java程序,通常实现本身的Java服务端应用都从HttpServlet类继承,而后实现本身的init | doGet | doPost | service方法。Servlet的生命周期从其加载开始,首先执行一次初始化,调用init方法,以后即可运行自身的服务,当生命周期结束时,调用destroy方法回收资源,结束服务。
仅了解原理固然是不够的,还要实战能力,在IDE中写写简单的代码谁都会,然而真正让一个程序可以运行起来也还须要点其余的东西,这里我指的是Servlet的容器。servlet的容器有不少,经常使用的以Tomcat为例,安装好Tomcat后,在开发时必须包含进Tomcat的lib。IDE确实惯坏了好多人,目录如何组织,程序如何编译、如何部署这些问题都被IDE屏蔽掉了,若是要对总体有比较透彻的了解,建议一切从命令行动手。
具体可参考:《Servlet与JSP核心编程》。
3.框架
Java Web开发的用到的框架之多简直使人发指,并且由于版本的更新换代致使的问题也是层出不穷。然而这也是Web技术不断演化的结果,要么选择接受,要么引领节奏。
Spring
Spring是一个强大而又“轻量级”的Java开发框架,之因此打引号是由于感受并非那么轻量。Spring的主要目的在于简化Java应用开发,以配置方式代替硬编码方式的编程,模块解耦,其架构以下图所示。包括了数据访问、远程通讯、AOP、核心容器等部分。
Java web架构知识整理——我在阿里的一次面试经历
Figure 1 Spring体系架构
Spring的核心主要有三点:
IoC:反转控制。
反转控制就是指将控制权由类内部抽离到容器,由容器类的实例化及动做进行配置管理。
Dependency-injection:依赖注入
对象的依赖关系由负责协调系统中各个对象的第三方组件在建立对象时设定。对象不自行建立或管理它们的依赖关系,依赖关系被自动注入到须要它们的对象中。经过参数和配置可以体会出“注入”这个词在这里有多形象。依赖注入的最大好处就是松耦合。不须要再类内部去和特定的类进行绑定,而是将一些依赖关系以参数的形式注入到类内部。
Aspect Oriented Programming:面向切向编程
在软件开发中,分布于应用中多处的功能被称为横切关注点。这些横切关注点每每和业务逻辑是相分离的,将这些横切关注点与业务逻辑相分离正式AOP要解决的。AOP编程可以让遍及在应用各处的功能分离出来造成可重用的组件。是高内聚低耦合的又一个体现,将通用实现模块与核心业务模块相分离。
具体参考:《Spring In Action》
Hibernate
数据持久化框架其实也有不少,须要掌握的不只是Hibernate,只是由于Hibernate在之前的企业级应用中用的比较多而已,另外MyBatis也占有至关重要的份额。Hibernate是一个全自动的持久化框架,并非那么方便,因此不少开发者更倾向于使用MyBatis,淘宝就是这样。
Hibernate的工做流程:首先经过configuration对象读取配置文件;解析映射信息,建立StandardSessionFactory;调用openSession打开session;建立事务transaction,以后进行持久化操做;完成后提交事务,关闭session,关闭sessionFactory。
Java web架构知识整理——我在阿里的一次面试经历
Figuer 2 Hibernate工做流程
要理解ORM的理念:ORM意为对象关系映射。是一种为了解决程序的面向对象模型与数据库关系模型互不匹配问题的技术。
hibernate中比较重要的是对象的4种状态转换及条件。分别是transient瞬时态、persistent持久态、detached游离态和移除态,状态转换以下:
Java web架构知识整理——我在阿里的一次面试经历
Figure 3 Hibernate对象状态转换图
Struts 2
Struts出现的最先,也是思想提供者之一,从名字就能够看得出其重要性,其设计目的是为了简化Java开发,统一事务切面化。
Struts最关键的地方在于Action的执行,拦截器的原理、valuestack及OGNL。
具体参考:《Struts in Action》
4.HTTP
这个不用多谈,过重要了,做为Web开发者,若是不特别熟悉Http将会是一件很麻烦的事。
Http的报头格式
Http协议的各类返回码是什么意思
https如何实现
B/S架构的工做原理
Cookie和Session的原理
restful API
5.设计模式
这里就不列举23种模式了,我的以为纯粹看书学习《设计模式》并无什么用,要在实际应用中碰到,而且多问几个为何,并且本身写代码时能有使用设计模式的意识才能对各类设计模式有更深的领悟。
固然Web开发远不止这么些东西,我这里暂时也只好先列些重要的。应用开发后,还有部署的问题,所以又会涉及CDN和负载均衡等问题就更复杂了......
另外在Web开发的过程当中,要养成良好的开发习惯,好比开发以前可以熟练地使用UML类图,交互图等,这将避免你犯不少错误。感谢面试官轻虐,本身以为还有许多不扎实的地方,还须要继续努力才能对得起此次机会。
最后针对以上内容,我整理了一下资料,(进阶架构师方向思惟导图,学习必备)
针对架构图谱录制讲的一些视频资料
在Java技术上想提高本身的同窗,请加群828545509
领取获取往期Java架构交流资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术