惭愧,从一次电面说起。我个人在某国企做一名软件设计师,国企大家都懂的,待遇一般而且没啥意思,做的方向基本都是操作系统、驱动和工具软件的开发,语言基本都是 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 需要掌握哪些东西。这里是一些知识点的搜集,暂不做详细说明,欢迎各位博友补充指正。
Servlet 是运行于服务端的 java 程序,一般实现自己的 Java 服务端应用都从 HttpServlet 类继承,然后实现自己的 init | doGet | doPost | service 方法。Servlet 的生命周期从其加载开始,首先执行一次初始化,调用 init 方法,之后便可运行自身的服务,当生命周期结束时,调用 destroy 方法回收资源,结束服务。
仅了解原理当然是不够的,还要实战能力,在 IDE 中写写简单的代码谁都会,然而真正让一个程序能够运行起来也还需要点其他的东西,这里我指的是 Servlet 的容器。servlet 的容器有很多,常用的以 Tomcat 为例,安装好 Tomcat 后,在开发时必须包含进 Tomcat 的 lib。IDE 确实惯坏了好多人,目录如何组织,程序如何编译、如何部署这些问题都被 IDE 屏蔽掉了,如果要对整体有比较透彻的了解,建议一切从命令行动手。
具体可参考:《Servlet 与 JSP 核心编程》。
Java Web 开发的用到的框架之多简直令人发指,而且因为版本的更新换代导致的问题也是层出不穷。然而这也是 Web 技术不断演化的结果,要么选择接受,要么引领节奏。
Spring 是一个强大而又 "轻量级" 的 Java 开发框架,之所以打引号是因为感觉并不是那么轻量。Spring 的主要目的在于简化 Java 应用开发,以配置方式代替硬编码方式的编程,模块解耦,其架构如下图所示。包括了数据访问、远程通信、AOP、核心容器等部分。
Figure 1 Spring 体系架构Spring 的核心主要有三点:
数据持久化框架其实也有很多,需要掌握的不仅是 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 出现的最早,也是思想提供者之一,从名字就可以看得出其重要性,其设计目的是为了简化 Java 开发,统一事务切面化。
Struts 最关键的地方在于 Action 的执行,拦截器的原理、valuestack 及 OGNL。
具体参考:《Struts in Action》
这个不用多谈,太重要了,作为 Web 开发者,如果不特别熟悉 Http 将会是一件很麻烦的事。
这里就不列举 23 种模式了,个人觉得纯粹看书学习《设计模式》并没有什么用,要在实际应用中碰到,并且多问几个为什么,而且自己写代码时能有使用设计模式的意识才能对各种设计模式有更深的领悟。
当然 Web 开发远不止这么些东西,我这里暂时也只好先列些重要的。应用开发后,还有部署的问题,因此又会涉及 CDN 和负载均衡等问题就更复杂了……
另外在 Web 开发的过程中,要养成良好的开发习惯,比如开发之前能够熟练地使用 UML 类图,交互图等,这将避免你犯很多错误。感谢面试官轻虐,自己觉得还有许多不扎实的地方,还需要继续努力才能对得起这次机会。
我有一个微信公众号,经常会分享一些 Java 技术相关的干货。如果你喜欢我的分享,可以用微信搜索 "Java 团长" 或者 "javatuanzhang" 关注。
来源: http://geek.csdn.net/news/detail/250892