慚愧,從一次電面說(shuō)起。我個(gè)人在某國企做一名軟件設計師,國企大家都懂的,待遇一般而且沒(méi)啥意思,做的方向基本都是操作系統、驅動(dòng)和工具軟件的開(kāi)發(fā),語(yǔ)言基本都是C/C++。最近也想跳槽,剛好有幸得到了一次阿里的面試機會(huì ),于是就試了試。
首先是電話(huà)面試,當時(shí)正在上班,人多口雜,好不容易找了個(gè)沒(méi)人的地方開(kāi)始面試。面試的方向是Java Web,面試官很nice,跟朋友一樣,一開(kāi)始問(wèn)了些比較基礎的東西,比如hashmap/hashtable的區別和優(yōu)缺點(diǎn),我答得還行,而且對于原理的東西還算講的比較透徹。
Java Web的面試自然就會(huì )問(wèn)到servlet,對于java多線(xiàn)程的東西還是那樣,原理性的東西和底層的機制都比較清楚,面試官也還算滿(mǎn)意,但往上層就不是我擅長(cháng)的了。當被問(wèn)到AOP時(shí),竟然語(yǔ)塞、啞口無(wú)言,因為根本忘了是干什么的了。本科的時(shí)候曾經(jīng)做過(guò)Web服務(wù)器類(lèi)似的課程設計,其實(shí)有接觸過(guò),然而讀研的時(shí)候方向太偏,過(guò)于底層,基本也就沒(méi)做過(guò)Java Web方向相關(guān)的項目。純粹是憑著(zhù)對互聯(lián)網(wǎng)的熱忱以及一些網(wǎng)上有著(zhù)同樣追求的朋友,從讀研到工作一年,依然堅持關(guān)注互聯(lián)網(wǎng)相關(guān)技術(shù)。
盡管后來(lái)的問(wèn)題有些沒(méi)答上來(lái),但面試官還是給了我一次面試的機會(huì ),11.20日從北京飛武漢參加專(zhuān)場(chǎng)面試。一面依舊先是一些基礎的題目,然后寫(xiě)了兩個(gè)算法程序,字符串轉換相關(guān)的,都挺簡(jiǎn)單的,雖然第二個(gè)題當時(shí)沒(méi)有很快反應過(guò)來(lái)。一面的過(guò)程中,發(fā)現以前掌握的一些東西真的有好多都忘記了,比如UML的類(lèi)圖關(guān)系怎么畫(huà),數據庫建表均不能第一時(shí)間寫(xiě)對,再比如Http協(xié)議302/301是什么意思等。我本以為會(huì )問(wèn)許多和Java Web框架相關(guān)的問(wèn)題,所以電面后一口氣,不到一星期把《Spring in Action》、《Struts in Action》還有Hibernate的一本電子書(shū)以及《深入分析Java Web》全刷了一遍,然而并沒(méi)有問(wèn)太多框架相關(guān)的問(wèn)題。后來(lái)算是自由發(fā)揮,就把自己以前做項目時(shí)碰見(jiàn)的JVM調優(yōu)過(guò)程講了講。
二面面對兩個(gè)面試官,基本不算是技術(shù)面,主要對著(zhù)簡(jiǎn)歷問(wèn)了一些做過(guò)的項目相關(guān)問(wèn)題,以及個(gè)人經(jīng)歷。由于自己項目經(jīng)驗還算豐富,做過(guò)的東西還算扎實(shí),所以這個(gè)不算什么問(wèn)題。后來(lái)又問(wèn)了自己對自己的定位及對于B2B業(yè)務(wù)有什么看法以及base的問(wèn)題,這就不多說(shuō)了。有一個(gè)問(wèn)題倒是難了我一下,當然也就1秒鐘。根據我的簡(jiǎn)歷,我做系統和底層的東西更適合,所以面試官問(wèn)我是否愿意去阿里云,我知道阿里云是潘愛(ài)民老師帶的,以前還和潘愛(ài)民老師合過(guò)影,相信很多人都看過(guò)《程序員的自我修養》,從中受益過(guò)。但我的回答是:“我確實(shí)覺(jué)得這個(gè)方向也不錯,也很仰慕潘老師,但既然我來(lái)面B2B Java Web相關(guān)的職位,說(shuō)明我更傾向于做偏應用方向的東西?!?/span>
大概是因為我有一些同學(xué)和朋友在阿里,自己也比較關(guān)注阿里,對阿里的技術(shù)框架還算比較了解,所以二面比一面情況好很多,感覺(jué)面試官還是挺滿(mǎn)意的,只不過(guò)提了一點(diǎn)就是我剛工作一年多,覺(jué)得年頭少了點(diǎn)。
終面完畢,和兩次面試的面試官都打好招呼后回到住的酒店睡了一覺(jué),本來(lái)有些忐忑,結果快晚上時(shí),面試官一個(gè)電話(huà)過(guò)來(lái)說(shuō)我情況還不錯,以后就算是同事了,預計會(huì )一周之內通知。聽(tīng)到這個(gè)消息,當然是相當興奮,在向面試官道謝后,和武漢的同學(xué)一起吃了頓飯,心情格外舒暢。
現在應該算是在等待最終的offer吧,希望自己好運。
“你學(xué)習一門(mén)技術(shù)的最佳時(shí)機是三年前,其次是現在?!边@話(huà)從來(lái)很靈驗。經(jīng)過(guò)這次面試,覺(jué)得需要整理下Java Web相關(guān)的資料,以便自己提高或者更快適應可能面臨的新的工作。
首先談?wù)凧ava Web需要掌握哪些東西。這里是一些知識點(diǎn)的搜集,暫不做詳細說(shuō)明,歡迎各位博友補充指正。
Servlet是運行于服務(wù)端的java程序,一般實(shí)現自己的Java服務(wù)端應用都從HttpServlet類(lèi)繼承,然后實(shí)現自己的init | doGet | doPost | service方法。Servlet的生命周期從其加載開(kāi)始,首先執行一次初始化,調用init方法,之后便可運行自身的服務(wù),當生命周期結束時(shí),調用destroy方法回收資源,結束服務(wù)。
僅了解原理當然是不夠的,還要實(shí)戰能力,在IDE中寫(xiě)寫(xiě)簡(jiǎn)單的代碼誰(shuí)都會(huì ),然而真正讓一個(gè)程序能夠運行起來(lái)也還需要點(diǎn)其他的東西,這里我指的是Servlet的容器。servlet的容器有很多,常用的以Tomcat為例,安裝好Tomcat后,在開(kāi)發(fā)時(shí)必須包含進(jìn)Tomcat的lib。IDE確實(shí)慣壞了好多人,目錄如何組織,程序如何編譯、如何部署這些問(wèn)題都被IDE屏蔽掉了,如果要對整體有比較透徹的了解,建議一切從命令行動(dòng)手。
具體可參考:《Servlet與JSP核心編程》。
Java Web開(kāi)發(fā)的用到的框架之多簡(jiǎn)直令人發(fā)指,而且因為版本的更新?lián)Q代導致的問(wèn)題也是層出不窮。然而這也是Web技術(shù)不斷演化的結果,要么選擇接受,要么引領(lǐng)節奏。
Spring是一個(gè)強大而又“輕量級”的Java開(kāi)發(fā)框架,之所以打引號是因為感覺(jué)并不是那么輕量。Spring的主要目的在于簡(jiǎn)化Java應用開(kāi)發(fā),以配置方式代替硬編碼方式的編程,模塊解耦,其架構如下圖所示。包括了數據訪(fǎng)問(wèn)、遠程通信、AOP、核心容器等部分。

Figure 1 Spring體系架構
Spring的核心主要有三點(diǎn):
反轉控制就是指將控制權由類(lèi)內部抽離到容器,由容器類(lèi)的實(shí)例化及動(dòng)作進(jìn)行配置管理。
對象的依賴(lài)關(guān)系由負責協(xié)調系統中各個(gè)對象的第三方組件在創(chuàng )建對象時(shí)設定。對象不自行創(chuàng )建或管理它們的依賴(lài)關(guān)系,依賴(lài)關(guān)系被自動(dòng)注入到需要它們的對象中。通過(guò)參數和配置能夠體會(huì )出“注入”這個(gè)詞在這里有多形象。依賴(lài)注入的最大好處就是松耦合。不需要再類(lèi)內部去和特定的類(lèi)進(jìn)行綁定,而是將一些依賴(lài)關(guān)系以參數的形式注入到類(lèi)內部。
在軟件開(kāi)發(fā)中,分布于應用中多處的功能被稱(chēng)為橫切關(guān)注點(diǎn)。這些橫切關(guān)注點(diǎn)往往和業(yè)務(wù)邏輯是相分離的,將這些橫切關(guān)注點(diǎn)與業(yè)務(wù)邏輯相分離正式AOP要解決的。AOP編程能夠讓遍布在應用各處的功能分離出來(lái)形成可重用的組件。是高內聚低耦合的又一個(gè)體現,將通用實(shí)現模塊與核心業(yè)務(wù)模塊相分離。
具體參考:《Spring In Action》
數據持久化框架其實(shí)也有很多,需要掌握的不僅是Hibernate,只是因為Hibernate在以前的企業(yè)級應用中用的比較多而已,另外MyBatis也占有相當重要的份額。Hibernate是一個(gè)全自動(dòng)的持久化框架,并不是那么方便,所以很多開(kāi)發(fā)者更傾向于使用MyBatis,淘寶就是這樣。
Hibernate的工作流程:首先通過(guò)configuration對象讀取配置文件;解析映射信息,創(chuàng )建StandardSessionFactory;調用openSession打開(kāi)session;創(chuàng )建事務(wù)transaction,之后進(jìn)行持久化操作;完成后提交事務(wù),關(guān)閉session,關(guān)閉sessionFactory。

Figuer 2 Hibernate工作流程
要理解ORM的理念:ORM意為對象關(guān)系映射。是一種為了解決程序的面向對象模型與數據庫關(guān)系模型互不匹配問(wèn)題的技術(shù)。
hibernate中比較重要的是對象的4種狀態(tài)轉換及條件。分別是transient瞬時(shí)態(tài)、persistent持久態(tài)、detached游離態(tài)和移除態(tài),狀態(tài)轉換如下:

Figure 3 Hibernate對象狀態(tài)轉換圖
Struts出現的最早,也是思想提供者之一,從名字就可以看得出其重要性,其設計目的是為了簡(jiǎn)化Java開(kāi)發(fā),統一事務(wù)切面化。
Struts最關(guān)鍵的地方在于A(yíng)ction的執行,攔截器的原理、valuestack及OGNL。
具體參考:《Struts in Action》
這個(gè)不用多談,太重要了,作為Web開(kāi)發(fā)者,如果不特別熟悉Http將會(huì )是一件很麻煩的事。
這里就不列舉23種模式了,個(gè)人覺(jué)得純粹看書(shū)學(xué)習《設計模式》并沒(méi)有什么用,要在實(shí)際應用中碰到,并且多問(wèn)幾個(gè)為什么,而且自己寫(xiě)代碼時(shí)能有使用設計模式的意識才能對各種設計模式有更深的領(lǐng)悟。
當然Web開(kāi)發(fā)遠不止這么些東西,我這里暫時(shí)也只好先列些重要的。應用開(kāi)發(fā)后,還有部署的問(wèn)題,因此又會(huì )涉及CDN和負載均衡等問(wèn)題就更復雜了......
另外在Web開(kāi)發(fā)的過(guò)程中,要養成良好的開(kāi)發(fā)習慣,比如開(kāi)發(fā)之前能夠熟練地使用UML類(lèi)圖,交互圖等,這將避免你犯很多錯誤。感謝面試官輕虐,自己覺(jué)得還有許多不扎實(shí)的地方,還需要繼續努力才能對得起這次機會(huì )。
?。ㄒ陨蠄D片均來(lái)自網(wǎng)絡(luò ))
聯(lián)系客服