慚愧,從一次電面提及。我我的在某國企作一名軟件設計師,國企你們都懂的,待遇通常並且沒啥意思,作的方向基本都是操做系統、驅動和工具軟件的開發,語言基本都是C/C++。最近也想跳槽,恰好有幸獲得了一次阿里的面試機會,因而就試了試。java
首先是電話面試,當時正在上班,人多口雜,好不容易找了個沒人的地方開始面試。面試的方向是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須要掌握哪些東西。這裏是一些知識點的蒐集,暫不作詳細說明,歡迎各位博友補充指正。restful
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的核心主要有三點:
反轉控制就是指將控制權由類內部抽離到容器,由容器類的實例化及動做進行配置管理。
對象的依賴關係由負責協調系統中各個對象的第三方組件在建立對象時設定。對象不自行建立或管理它們的依賴關係,依賴關係被自動注入到須要它們的對象中。經過參數和配置可以體會出「注入」這個詞在這裏有多形象。依賴注入的最大好處就是鬆耦合。不須要再類內部去和特定的類進行綁定,而是將一些依賴關係以參數的形式注入到類內部。
在軟件開發中,分佈於應用中多處的功能被稱爲橫切關注點。這些橫切關注點每每和業務邏輯是相分離的,將這些橫切關注點與業務邏輯相分離正式AOP要解決的。AOP編程可以讓遍及在應用各處的功能分離出來造成可重用的組件。是高內聚低耦合的又一個體現,將通用實現模塊與核心業務模塊相分離。
具體參考:《Spring In Action》
數據持久化框架其實也有不少,須要掌握的不只是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類圖,交互圖等,這將避免你犯不少錯誤。感謝面試官輕虐,本身以爲還有許多不紮實的地方,還須要繼續努力才能對得起此次機會。