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、核心容器等部分。

clipboard.png

Java web架構知識整理——我在阿里的一次面試經歷
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。

clipboard.png

Java web架構知識整理——我在阿里的一次面試經歷
Figuer 2 Hibernate工作流程

要理解ORM的理念:ORM意爲對象關係映射。是一種爲了解決程序的面向對象模型與數據庫關係模型互不匹配問題的技術。

hibernate中比較重要的是對象的4種狀態轉換及條件。分別是transient瞬時態、persistent持久態、detached遊離態和移除態,狀態轉換如下:

clipboard.png

Java web架構知識整理——我在阿里的一次面試經歷
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類圖,交互圖等,這將避免你犯很多錯誤。感謝面試官輕虐,自己覺得還有許多不紮實的地方,還需要繼續努力才能對得起這次機會。

最後針對以上內容,我整理了一下資料,(進階架構師方向思維導圖,學習必備)

clipboard.png

clipboard.png

針對架構圖譜錄制講的一些視頻資料

clipboard.png

clipboard.png

在Java技術上想提升自己的同學,請加羣828545509

領取獲取往期Java架構交流資料、源碼、筆記、視頻。Dubbo、Redis、設計模式、Netty、zookeeper、Spring cloud、分佈式、高併發等架構技術

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章