惭愧,从一次电面说起。我个人在某国企做一名软件设计师,国企大家都懂的,待遇一般而且没啥意思,做的方向基本都是操作系统、驱动和工具软件的开发,语言基本都是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架构知识整理——记一次阿里面试经历的更多相关文章

  1. Java web 入门知识 及HTTP协议详解

     Java  web  入门知识 及HTTP协议详解 WEB入门 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资 ...

  2. Java web 开发填坑记 2 -如何正确的创建一个Java Web 项目

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/72566261 本文出自[赵彦军的博客] Java web 开发填坑记 1-如何正确 ...

  3. java部分基础知识整理----百度脑图版

    近期发现,通过百度脑图可以很好的归纳总结和整理知识点,本着学习和复习的目的,梳理了一下java部分的知识点,不定期更新,若有不恰之处,请指正,谢谢! 脑图链接如下:java部分基础知识整理----百度 ...

  4. 一名十年Java程序员回忆阿里面试经历——揭开阿里面试的“遮羞布”

    阿里面试经历 去阿里面试可以说非常非常的偶然和戏剧性,因为本人根本没投简历,以至于阿里hr给我电话的时候我一度认为是诈骗电话.因为深圳这家公司不错我还想在这里干个两年左右再考虑考虑. 这个时候的本人已 ...

  5. Java Web面试题整理(思维导图)

    1,动态网站技术有哪些? 2,一般的Web架构是指BS 还是CS,BS架构是什么咚咚? 3,Web应用程序的流程,即把一个URL串输入地址栏后发生写什么? 4,说一说Servlet生命周期? 5,在W ...

  6. Java Web 开发填坑记- 如何正确的下载 Eclipse

    一直以来,做 Java web 开发都是用 eclipse , 可是到 eclipse 官网一看,我的天 http://www.eclipse.org/downloads/eclipse-packag ...

  7. 阿里面试经历JAVA总结

    为记录阿里的电面经历,特与大家分享,岗位是JAVA研发工程师. 一面主要问题如下: 1)首先自我介绍 2)数据结构算法的基本问题,如排序算法,二叉树遍历,后序遍历非递归,图的最短路径问题 3)对一个数 ...

  8. java多线程中 volatile与synchronized的区别-阿里面试

    volatile 与 synchronized 的比较(阿里面试官问的问题) ①volatile轻量级,只能修饰变量.synchronized重量级,还可修饰方法 ②volatile只能保证数据的可见 ...

  9. java web dev知识积累

    tomcat体系结构 可以从tomcat的server.xml文件中元素的层次结构来理解tomcat的体系结构: Server(可以视为tomcat本身)->经由connector可以有多个(c ...

随机推荐

  1. 【多线程】Future和FutureTask以及CompletionService

    Future接口 此接口主要用于: 代表异步计算的执行结果: 用于可取消的task:(比使用interrupt实现取消要方便 ) FutureTask类 FutureTask是Future的一个实现类 ...

  2. SSL证书在线工具

    证书在线工具 如果您是第一次申请SSL证书,如果您对您的服务器如何使用SSL证书还不熟悉的话,我们推荐您使用本套工具,本套工具支持所有SSL服务器证书格式和各种WEB服务器.帮助您在线生成CSR文件, ...

  3. .net下连接数据库

    可以新建一个按钮,在click事件下,写入一下代码 using( SqlConnection conn=new SqlConnection(Data source=.; Catalog Initial ...

  4. datagridview 不显示行号的问题

    环境:C#,Winform 场景: 窗体上有两个tab页A.B,每个tab页上都有一个DatagridView.窗体加载后,显示tab A选项卡.序号正常显示,但点击B选项卡后,DatagridVie ...

  5. css设置背景图片,ie显示不了

    本来是想给导航栏<div class="nav"></div>添加背景图片的,设置css样式如下: .nav{background:url("ht ...

  6. 黄聪:MYSQL提交一批ID,查询数据库中不存在的ID并返回

    假设你数据库有个A表: ID NAME    1 aaa    2 bbb    3 ccc    4 ddd 需求:给你几个ID,返回A表中不存在的ID? 例如提交1,2,8,9 返回8,9 sel ...

  7. java命令行HPROF Profiler

    The HPROF Profiler The Heap and CPU Profiling Agent (HPROF)是JAVA2 SDK自带的一个简单的profiler代理,它通过与Java Vir ...

  8. svn 提交错误 400 Bad Reqest MKACTIVITY 请求于XX失败 Conflict Unable to connect to a repository at URL

    思路来源:http://www.cnblogs.com/wangyt223/archive/2012/11/22/2782801.html svn 提交错误 400 Bad Reqest MKACTI ...

  9. PC-Lint安装配置与集成到VS2010

    第一篇 PC-lint 9 安装及配置教程 1.从这里下载PC-lint.9.0e.rar,解压缩(目录中的patch文件夹不用,因为它只能将PC-lint升级到9.0e ) 2.点击pclint9s ...

  10. DBA_Oracle Erp加密和解密账户密码(案例)

    2014-09-09 Created By BaoXinjian