Java Web架构知识整理——记一次阿里面试经历
惭愧,从一次电面说起。我个人在某国企做一名软件设计师,国企大家都懂的,待遇一般而且没啥意思,做的方向基本都是操作系统、驱动和工具软件的开发,语言基本都是C/C++。最近也想跳槽,刚好有幸得到了一次阿里的面试机会,于是就试了试。
首先是电话面试,当时正在上班,人多口杂,好不容易找了个没人的地方开始面试。面试的方向是Java Web,面试官很nice,跟朋友一样,一开始问了些比较基础的东西,比如hashmap/hashtable的区别和优缺点,我答得还行,而且对于原理的东西还算讲的比较透彻。
Java Web的面试自然就会问到servlet,对于java多线程的东西还是那样,原理性的东西和底层的机制都比较清楚,面试官也还算满意,但往上层就不是我擅长的了。当被问到AOP时,竟然语塞、哑口无言,因为根本忘了是干什么的了。本科的时候曾经做过Web服务器类似的课程设计,其实有接触过,然而读研的时候方向太偏,过于底层,基本也就没做过Java 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、核心容器等部分。
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。
Figuer 2 Hibernate工作流程
要理解ORM的理念:ORM意为对象关系映射。是一种为了解决程序的面向对象模型与数据库关系模型互不匹配问题的技术。
hibernate中比较重要的是对象的4种状态转换及条件。分别是transient瞬时态、persistent持久态、detached游离态和移除态,状态转换如下:
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 Web架构知识整理——记一次阿里面试经历的更多相关文章
- Java web 入门知识 及HTTP协议详解
Java web 入门知识 及HTTP协议详解 WEB入门 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资 ...
- Java web 开发填坑记 2 -如何正确的创建一个Java Web 项目
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/72566261 本文出自[赵彦军的博客] Java web 开发填坑记 1-如何正确 ...
- java部分基础知识整理----百度脑图版
近期发现,通过百度脑图可以很好的归纳总结和整理知识点,本着学习和复习的目的,梳理了一下java部分的知识点,不定期更新,若有不恰之处,请指正,谢谢! 脑图链接如下:java部分基础知识整理----百度 ...
- 一名十年Java程序员回忆阿里面试经历——揭开阿里面试的“遮羞布”
阿里面试经历 去阿里面试可以说非常非常的偶然和戏剧性,因为本人根本没投简历,以至于阿里hr给我电话的时候我一度认为是诈骗电话.因为深圳这家公司不错我还想在这里干个两年左右再考虑考虑. 这个时候的本人已 ...
- Java Web面试题整理(思维导图)
1,动态网站技术有哪些? 2,一般的Web架构是指BS 还是CS,BS架构是什么咚咚? 3,Web应用程序的流程,即把一个URL串输入地址栏后发生写什么? 4,说一说Servlet生命周期? 5,在W ...
- Java Web 开发填坑记- 如何正确的下载 Eclipse
一直以来,做 Java web 开发都是用 eclipse , 可是到 eclipse 官网一看,我的天 http://www.eclipse.org/downloads/eclipse-packag ...
- 阿里面试经历JAVA总结
为记录阿里的电面经历,特与大家分享,岗位是JAVA研发工程师. 一面主要问题如下: 1)首先自我介绍 2)数据结构算法的基本问题,如排序算法,二叉树遍历,后序遍历非递归,图的最短路径问题 3)对一个数 ...
- java多线程中 volatile与synchronized的区别-阿里面试
volatile 与 synchronized 的比较(阿里面试官问的问题) ①volatile轻量级,只能修饰变量.synchronized重量级,还可修饰方法 ②volatile只能保证数据的可见 ...
- java web dev知识积累
tomcat体系结构 可以从tomcat的server.xml文件中元素的层次结构来理解tomcat的体系结构: Server(可以视为tomcat本身)->经由connector可以有多个(c ...
随机推荐
- HackerRank "Manasa and Prime game"
Intuitive one to learn about Grundy basic :) Now every pile becomes a game, so we need to use Spragu ...
- LintCode "Heapify"
My first try was, using partial sort to figure out numbers layer by layer in the heap.. it only fail ...
- 剑指offer系列62---两个链表的公共结点
[题目]输入两个链表,找出它们的第一个公共结点. * [思路]1 获取两链表的长度: * 2 让长的链表先走n步后此时走到短链表起始位置: * 3 两链表同时遍历,直至相同,这时返回第一个公共结点. ...
- (转)Sqlite 管理工具 SQLiteDeveloper及破解
本文转载自:http://www.cnblogs.com/error404/archive/2012/03/21/2409898.html 功能特点 表结构设计,数据维护,ddl生成,加密数据库支持, ...
- 【转】class卸载、热替换和Tomcat的热部署的分析
这篇文章主要是分析Tomcat中关于热部署和JSP更新替换的原理,在此之前先介绍class的热替换和class的卸载的原理.一 class的热替换ClassLoader中重要的方法 loadClass ...
- 【gradle】之maven主库找不到Could not find org.restlet.jee:org.restlet:2.1.1
Could not find org.restlet.jee:org.restlet:2.1.1. 我是用gradle构建solr的时候出现的这个错误,通过google查询到这么一段解释 For th ...
- Office导入导出组件权限配置汇总
NET导出Excel遇到的80070005错误的解决方法: 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046}的组件时失败,原因是出现 ...
- 远程调用jboss as 7上部署的ejb出现No EJB receiver available for handling 异常
昨天倒腾了一天终于配置好了jboss as 7的域,今天又倒腾了一整天在上面部署了个EJB,然后试了一个利用JNDI来进行远程调用.下面记录一下过程中那些乱七八糟的问题: 首先是这个jboss-cli ...
- H5与Native交互的实现
PDF文件下载:将后缀png改成PDF.
- Android listview中使用checkbox
最近比较忙碌,我也不知道忙的什么东西,打算写的博客写了一半,还没写完,今天先扯一扯项目中遇到的一个问题,一方面防止以后遇到这个问题忘记如何解决,另一方面希望可以提供给遇到同样问题的朋友一个思路.下面开 ...