作者:程序員喬戈裏
來源:牛客網
鏈接:https://www.jianshu.com/p/6b425cd760dc
跨專業轉CS拿下百度java後臺開發的乾貨分享

人們總以爲時間是一個小偷,偷走了我們所愛的一切。但,時間是先給予再拿走,每天都是一份禮物,每小時,每一分,每一秒。——《愛麗絲夢遊仙境2》

自我介紹

本人是某985碩士,專業是控制理論與控制工程,有幸拿到了百度的offer,以後也打算入職狼廠了,崗位是JAVA開發。從7月底一直到9月底一直忙的不可開交,也拿到了一些offer,7月底到8月底基本上是提前批面試,冷不丁就從某地的一個面試電話就來了,怪嚇人的。9月一整個月基本上就是秋招,筆試面試不斷。拿到了一些offer吧,下面就和大家分享一下我的一些算的上經驗的東西吧。

一.基礎知識學習心得

1.1 java基礎

對於java基礎來說,說先要選對教材吧,首先是java基礎,我看的是《JAVA從入門到精通》,這本書基本上涵蓋了java的所有基礎知識點,從基本面向對象的概念,到java的語法和一些小的練習,再到java的核心技術,接口、抽象類、多線程、反射、異常處理、IO編程和一些窗體應用程序的開發等,最後是一些高級應用,包括數據庫的應用等。這些都是JAVA的基礎。

談到JAVA,每本書都會寫到它是平臺移植性,爲什麼呢?就是存在JVM這麼一個神奇的東西,關於JVM,書籍我看了兩本,一本叫做《深入理解JAVA虛擬機》和《深入理解JVM&G1 GC》。前一本比較基礎,關鍵是要了解JVM的內存模型,一些關鍵的名詞和加載機制要理解,比如什麼是雙親委派模型,類加載的流程是什麼樣的等等;另外一個就是JAVA的內存回收機制,一些常用的回收算法要熟悉,還有包括GC的種類。那麼第二本書就是講到了G1這個回收器,這也是經常會問到東西。不過JAVA 11之後出來了一個ZGC最好也瞭解一下,網上有很多軟文的,這是我面試知乎的時候面試官提到的,也是去了解了一下。

在大多數的應用軟件中,其實我們更多的還是會關心程序運行的效率問題,那就不得不說一說併發編程,這也是面試經常問道的。我推薦的兩本書就是《JAVA併發編程的藝術》和《JAVA併發編程實踐》,裏面介紹的很全面,從線程、線程池、線程安全,相關java線程安全集合類和一些併發應用開發的技巧。其中諸如比較常見鎖、死鎖問題還有JAVA相關的關鍵字的描述都很清晰,也是作爲JAVA開發人員的基礎知識。

因爲JAVA是純面向對象的語言,很多時候我們在去面試的時候,我們通常會去面試一種叫做後端開發工程師或者是服務器端工程師,如果你是JAVA方向,那麼J2EE這方面的就一定要了解。我看的有兩本書,一本叫做《Spring3.X 企業級實踐》和《聊聊架構》兩本書,前一本主要講述了框架的一些東西,那麼裏面有一些名詞必須要明白,尤其是什麼是IOC和DI,什麼是AOP,什麼是SSH,什麼是SSM,什麼是MVC模式,什麼是ORM等等,這些都是大方向的問題,裏面還會牽扯到很多技術問題,這就需要平時的讀書和積累了,比如攔截器和過濾器是什麼之類的問題。另外一本書,就是架構,裏面主要是一些微服務架構之類的,微服務這個東西雖然比較火,但是面試的時候謹慎,容易把自己拉進坑裏,千萬別再面試官面前秀操作,到時候反而會打亂自己的節奏。除非是真的親自做過項目,否則只需知道一些名詞就好,例如Spring Cloud,Spring Boot之類的瞭解即可。

那麼說到了架構開發和軟件開發,那麼基本的軟件開發的知識要知道,首先是數據庫及其DBMS的使用。我主要看三本書,分別是《數據庫原理》,《必知必會MySQL》和《MySQL技術內幕》。數據庫理論的話,包括了常用的關係型運算,數據庫的設計範式,基本SQL語句,數據庫的表,視圖,事務,索引,觸發器和存儲過程,索引和事務着重看。關於MySQL,其實最主要的無非三個,第一數據引擎,MyiSAM和InnoDB經常被問到,第二MySQL中索引的使用,除了常見的聚簇索引、聯合索引,還要知道什麼時候倒排索引之類的比較冷門的第三就是MySQL事務的一些操作,鎖機制等等。

1.2 軟件工程及其相關的知識

第二是軟件工程及其相關的知識,尤其是BAT大廠很多時候也會問到其中的一些問題。這裏推薦系統的看《軟件工程——實踐者的研究方法》和《UML面向對象建模與設計》這兩本書,前者主要講述了軟件工程的系統知識,諸如軟件工程的基本概念,軟件開發方法,軟件開發原則,質量管理,軟件測試方法,文檔的撰寫,這其實也是我們開發人員的基本功吧。第二本書主要是在進行軟件設計,尤其是在設計數據庫之前,需要進行建模分析,UML是經常用到的方法,其中UML中的基本符號,還有用例圖、序列圖、通信圖、類圖等,因爲UML在設計模式的一些教材中也會用到,所以瞭解一下是很有必要的。

1.3 設計模式

說到設計模式,這也是基本功,其中最常用的教材就是《Head First》了吧,23種設計模式,分爲三大類,7大軟件設計原則,這些都是必須要了解的。其中,單例模式、工廠模式、裝飾模式、享元模式、建造者模式、適配器模式、代理模式、模板方法模式要重點掌握,因爲這幾個在J2EE和基本的JAVA開發中經常用到。

1.4 數據結構與算法

第三就是數據結構與算法,作爲筆試和麪試的重頭戲之一吧,那麼基礎就是最好結合視頻看看,單純看書有點枯燥,視頻和書籍的話就比較多了,這個仁者見仁的,所以大家只要認真學習,肯定會有效果的。這裏鏈表、棧、隊列、樹這幾種數據結構要熟練掌握,圖瞭解一下,但是關於圖引出的BFS、DFS這兩種策略要會,因爲回溯法和分支界定法會用到,另外排序算法要了解,幾種常見的排序算法及其變種一定要熟練。

1.5 計算機網絡和操作系統

第四就是計算機網絡和操作系統相關的知識點,這也是我們會忽略的一部分,尤其是基礎,因爲互聯網公司這些東西必須要知道啊,碰到最多的就是TCP、UDP、http、https之類的關鍵詞了吧,至於這幾個之間的區別要是說不上來就真的說不過去啦。至於操作系統,通常會結合主流的操作系統比如Linux或者windows系統來學習,我記着有面試官問我Ubuntu系統開機都做了些什麼操作,所以除了LINUX系統命令之外,關於整個操作系統的進程、文件、設備管理之類的也要了解。

1.6 大數據

最後就是一些大數據方面的知識,從數據分析平臺和服務來說,Hadoop,Spark,Kafka,Hive,Hbase等可以做適當瞭解;數據存儲來說,除了RDBS之外,Nosql也要知道,比如Redis,MonoDB等;數據分析和挖掘算法來說,我們雖然不是算法開發,但是這一部分我把它就做課外知識,但是也是要有所瞭解,要不然以後和技術大牛聊天兒也比較尷尬。這裏面就牽扯到機器學習的分類、聚類、降維和迴歸四個方面,從此衍生的諸如深度學習、自然語言處理之類的算法,有些名詞咱們至少要聽說過嘛。

以上就是我學習的一個大概的知識體系,總之語言其實的是次要,開發的框架和思路纔是最重要的,還有就是編碼能力!

二. 面試常見問題

我在這裏總結一些面試經常會問到的問題,其中分爲四大類,第一類是JAVA基礎相關,第二類是計算機知識類,第三類是場景題,第四類就是智力題。總結的肯定不全面,而且是我經常會被問道的問題,拿出來供大家分享。(詳細的一些問題可以看我牛客的帖子,https://www.nowcoder.com/discuss/123094)

2.1 JAVA基礎類

JVM的內存模型,什麼時候雙親委派模型?

JAVA的垃圾回收,標記算法和複製算法的區別,用在什麼場合?

GC、G1和ZGC的區別

爲什麼老年代堆不想年輕代一樣分成兩個區?

JAVA多線程實現機制有哪些?

JAVA中的鎖

設計模式相關問題

JAVA線程池有哪些參數,如果自己設計一個線程池要考慮哪些問題?

常見集合類的區別與聯繫

Spring框架的實現用到了哪些關鍵技術

SSH中每個職能部件都是什麼,實現什麼功能?

JAVA API中線程安全的類有哪些?

JAVA網絡編程中,BIO、NIO、AIO的區別和聯繫

重載、重寫和重構分別是什麼含義?

jsp的內置對象有哪些,servlet的工作流程。

2.2 計算機基礎類

TCP和UDP的區別,TCP三次握手和四次揮手,爲什麼要這樣?

http和https的區別,http1.x和http2.0的區別,SSL和TSL之間的區別

數據庫中索引的數據結構

B+樹和B樹的區別,和紅黑樹的區別。

聯合索引的特點,倒排索引的特點

簡述1NF到BCNF

數據庫的無限極分類問題

redis的緩存處理算法

redis集羣相關

mysql數據引擎相關

這裏還有很多,以上應該是在面試中出現頻率很高的了。

2.3 場景設計題

用10億個URL,如何找出我們所希望得到的100個URL

新浪微博好友關注的後臺表的設計

設計一個抽獎系統

。。。

這裏其實考察的就是知識使用的靈活性,遇到的時候冷靜分析,注重積累,一般面試官也不會爲難的。

智力題其實智力題也是面試的一些重頭戲,通常會考察咱們分析問題能力,一般題。

其實智力題也是面試的一些重頭戲,通常會考察咱們分析問題的能力,一般仔細分析分析也應該沒什麼問題。

三. 手寫代碼問題

手寫代碼是面試的時候95%會出現的狀況,其實主要還是平時的積累,多刷題,沒有別的方法,常用的書就是《劍指offer》了吧,我是把劍指offer刷了1遍,leetcode的題目做了100多道,重點關注leetcode的中等題,如果一個題目你能在10分鐘就能有完整思路,30分鐘內能夠AC,那考到的概率一般不大(除了ACM大神,哈哈!),當然如果一個題目思考了1天,看了解答也是毫無頭緒,那就放棄吧,因爲秋招時間緊,而且很容易出現厭學情緒。在手寫代碼方面呢,鏈表數組類問題屬於簡單難度的,二叉樹和樹相關的問題屬於中等問題,動態規劃類問題一定注意狀態方程執行條件,回溯一定注意遞歸停止的條件要完整。下面列咱們必須要爛熟於心的一些手寫代碼的題目

歸併排序、快速排序、堆排序,有的時候會考到多路歸併和雞尾酒排序。

鏈表翻轉,判斷鏈表是否有環並找到環的入口,單鏈表的第一個公共節點,鏈表的部分翻轉

二叉樹的前序遍歷、中序遍歷和後序遍歷遞歸版本,前序和中序遍歷的迭代版本,二叉樹的層序遍歷,二叉樹的深度、高度、葉子節點的個數,很多二叉樹的問題都可以用遞歸的方式求解。

最大子數組的和,最大子數組的乘積,字符串的公共前綴,上升子序列之類的動規的基本問題,還有約瑟夫環、荷蘭旗等等這些基礎的實際問題也要多用手寫一寫。

記住一點,用IDE調試和實際用手寫真的有區別,所以常規的題目還是用手寫一寫。

四. 面試技巧

關於面試的一些經驗技巧,我想談談自己的心得。我在秋招季參加了20多加公司的面試,有一天參加了5個公司的面試,那天差點沒暈過去。一共收到了10個公司的offer,3個sp,相信很多大神和大佬也收到了很多offer,下面就來講講。

着裝。咱們雖然不像產品、運營那些崗位會注重外形,但是穿着整潔大方是很有必要的,我之前又看到過穿拖鞋和短褲去面試的,面試官確實沒什麼好印象,我面試不管公司有沒有名氣,規模大小,都穿正裝,這樣自己也會有自信,也是對對方的尊重。

面試的時候心態很重要,不要被任何因素影響。不要因爲自己的老鐵或者閨蜜面試失敗就產生畏縮心心理,也不要因爲沒通過某個大廠的面試就心灰意冷,面試沒通過不是你不優秀,這是你不適合這個公司的這個崗位,而且,失敗是成功的母親,面試中不會的問題在網上及時看看帖子或者軟文之類的,及時彌補,會對自己有很大幫助。你會發現面試時候能學到只是不必自己平時學到的少。

面試的時候在手寫代碼時候,尤其是DP問題,很多時候轉換方程不會寫,那麼我們就先寫一種方案,因爲通常面試官沒說讓你寫最優代碼,那麼你寫出來一種,也是一種解答。通常面試官會慢慢引導你寫出最優代碼,不要慌張。當然瞭如果基礎代碼沒寫出來,那是會有點問題的。

關於項目。其實項目是好處也是坑,如果項目聊得不好的話,哪怕是自己做的,面試官有可能也會懷疑這個項目的真實性。另外,其實咱們幹開發也應該有一些機器學習和算法的知識儲備,如果項目中有的話。我不止一次的遇到了讓手推算法公式的面試官了,哈哈。

如果你挺到了hr面,那麼一定要真誠並且謙虛的介紹自己,如果問道現在手頭上拿到了幾個offer,那麼我通常是肯定回答(如果有的話),並且把現目前手上拿到的最好的說,因爲這樣顯示出你很優秀,如果對方真的很想要你,那麼肯定會在薪水和待遇方面和現目前這個offer持平或者給你個sp之類的。畢竟hr小姐姐小哥哥還是很溫柔的一般情況。

關於提前批,我有血的教訓,一定要慎重,不要着急趕着提前批,我阿里提前批四面掛了之後,再沒機會了就。所以要結合實際,當然提前批確實可以積累很多經驗,但是提前加入面試的壓力中,戰線拉長,那麼很容易崩掉的,所以一定要找到一個很好的解壓方式。像我壓力大了就去跑個10km,哈哈。

五.結束語

以上就是我的一些面試心得,希望能給正在準備明年春招和秋招的你們一點點幫助,以上都是我的個人觀點,如果有錯誤的地方,及時批評指正。當然有喜歡跑步或者跳舞的朋友,也可以一起交流交流,哈哈。給大家分享一下我的座右銘:一切都會有的,一切都是時間問題。

祝各位好運,加油!

END

相關文章