從超高頻的後端面試題出發,指明學習方向html
你們好,我是魚皮。前端
還記得個人老弟小阿巴麼?他目前正值大一暑假,在家自學編程(刷短視頻)中。git
他整個大一期間基本都在學習前端。後來,我帶他寫了一次後端,結果就崩了,寫了一堆 bug!程序員
詳情請閱讀:前端老弟第一次寫後端,崩了!github
但沒想到,這貨踩了坑後,反而愛上了後端開發。這一到週末就纏着我,讓我給他講講後端開發應該學習哪些知識。面試
雖然很想給他總結一份後端學習路線,但我也很忙,因而就思考有沒有什麼更快捷的方式讓他了解到後端要學的技術。redis
我想一想:他學編程是爲了找好工做,想找到好工做就要先經過面試。。。算法
有了!正好我朋友在大廠 「阿巴阿巴」 作 Java 後端面試官,我直接把小阿巴送過去參與面試,不就能讓他知道本身要學的技術了麼?sql
OK,起飛!數據庫
一天後,小阿巴回來了,一臉苦樣,說本身一道題都沒答出來。
我問了下考點,大笑道:你運氣太好了,這不全是後端面試中的 超高頻 經典題目麼?全中!
好了,下面就經過此次的大廠面試題,分享下後端程序員要學的知識以及原因。
大綱:
對於開發崗位的程序員,不管是前端仍是後端,最低要求都是 熟練使用 至少一門編程語言。像前端的核心語言是 JavaScript,後端有 Java、C++、Golang、Python 等。
目前 Java 後端崗位的需求量比較大,因此這裏以 Java 爲例。
面試題
Java 中 == 和 equals 的區別?
題解
分析
熟練並不僅是能寫出代碼就夠了,不少編程語法層面的 小細節 也必須關注!在工做中,不少 bug 的產生正是由於對細節知識的欠缺,所以這些細節也是面試官最愛考察的點。
好比 Java 中的 == 和 equals 都是判斷變量是否相等,但有啥區別呢?若是使用不當,頗有可能會把相同值的變量判斷爲不相等,致使業務邏輯錯誤。還有 final 關鍵字、volatile 關鍵字等,都是經常使用的 Java 語法,也是高頻考點。
因此,鞏固語法基礎很重要,推薦《Java 核心技術卷 I》。
面試題
Java 中的集合及其繼承關係?
題解
分析
每種編程語言都有內置的類庫和函數,雖然可能不是最方便的,但一般源碼實現都比較合理、性能也不錯。想熟練使用一門編程語言,提升開發效率,或者編寫本身的封裝庫,就必定要先掌握語言原生的類庫。
好比 Java 中提供了集合類,讓咱們很輕鬆地操做各類數據結構,好比數組、鏈表、Set、Hash 等,這些都是工做中經常使用的類,所以有必要了解它們的原理,才能更合理、正確地去使用。像 HashMap 的實現原理、HashMap 和 HashTable 的區別、ArrayList 和 LinkedList 的區別,也是高頻考點。
面試題
什麼是 Spring 的依賴注入?
題解
分析
除了作基礎架構以外,在企業中開發基本都是用現成的框架,不用什麼都本身寫,可以大大提高開發效率。但會用框架只是最基本的要求,怎麼能最大化框架的性能、下降出 bug 的機率、進一步下降開發成本、甚至如何本身設計實現一個框架,纔是優秀的程序員應該思考的。所以,經常使用框架的設計原理是高頻考點,好比 Java 中 Spring 框架的核心設計 IOC 和 AOP、使用多級緩存解決循環依賴等。
面試題
JVM 的內存結構是怎樣的?
題解
分析
大廠面試中,少不了編程語言的底層實現。
雖然工做中不多會直接用到這方面的知識,但書到用時方恨少,大廠對求職者的需求一般不是你如今能作什麼,而是你將來是否可以應對潛在的挑戰。萬一到時候線上程序出一個緊急且嚴重的 bug,須要分析垃圾收集器的日誌,讓你現學,還來得及麼?這就要求咱們瞭解底層,對 Java 來說,關鍵就是 Java 虛擬機(JVM)。
此外,瞭解底層可以加深你對編程語言的理解和對架構的認知,不少底層的設計原理是能夠應用到工做寫程序中的,像如何分配管理內存、垃圾收集器的設計、回收算法等。
簡單來講就是:把工具玩兒明白,讓造工具成爲可能。
推薦書籍:《深刻理解Java虛擬機》第3版
不管你學習什麼編程語言,這些知識都是程序員重要的基本功。雖然未必在工做中直接用到,但打好基礎,可以全方面提高你的編程能力和素養,在面對問題時纔會有更多的想法和思考。
面試官經過這些問題,能看出你的學習是否紮實,是否可靠。
面試題
如何用棧實現隊列?
題解
分析
數據結構是獨立於編程語言的重要思想,像鏈表、數組、棧、隊列、集合、字符串、哈希表、樹等等,都是寫程序經常使用的數據結構,所以也是面試高頻考點。
工做中,雖然不會讓你本身實現一個數據結構,但至少要了解每一個數據結構的特色、使用場景、時間和空間複雜度,不然寫出來的代碼可能會 「又重又慢」,稍有不慎,內存溢出!
面試題
假設你正在爬樓梯。須要 n 階才能到達樓頂。每次你能夠爬 1 或 2 個臺階,有多少種不一樣的方法能夠爬到樓頂呢?
題解
分析
和數據結構相似,算法也是程序員的核心素養。像排序、動態規劃、遞歸、迭代、二分、分治、深搜廣搜等基礎算法,都是面試的重點。
面試題
TCP 三次握手、四次揮手經歷了哪些過程?
題解
分析
對後端開發而言,大部分的工做就是寫接口,接受前端或其餘客戶端發送的網絡請求,給出對應的數據響應。所以,網絡知識至關重要。
好比工做中經常使用的網絡協議、HTTP 請求與響應、會話、四七層負載均衡等,都是常見考點。由於不少的協議都是在 TCP、UDP 的基礎上進行封裝,因此 TCP 和 UDP 也是高頻考點。瞭解這些有助於寫出更優雅規範的接口、減小網絡請求的耗時、或者提升整個接口的併發度等。
面試題
什麼是死鎖?
題解
分析
操做系統雖然是很底層的知識,但畢竟咱們編寫的程序都是跑在操做系統上的,所以操做系統的一些概念無時無刻不在被開發者使用,好比進程和線程、死鎖、文件、套接字、CPU、內存管理、輸入輸出等。你思考問題的深度、程序性能優化的極限,很大程度上取決於對操做系統的瞭解。
面試題
MySQL 如何性能優化?
題解
分析
大部分作後端開發的程序員離不開數據庫,並且工做中基本就是寫 CRUD,從數據庫中增刪改查數據。
對於在學校裏作的小項目,基本瞭解數據庫的使用,會寫幾條簡單的 SQL 語句就夠了。可是在大廠業務(尤爲是 ToC)中,數據量動輒百萬千萬、甚至數億,這就對數據庫設計和性能優化提出了要求。
所以,大廠後端面試中,超高頻的面試題就是:MySQL 如何性能優化?對於這類問題,只靠背誦很容易被面試官揭穿,比較推薦本身去作個項目,設計個庫表實戰,看看不一樣的優化方式是否有效、能獲得多大的效果。
還有很常見的面試題就是:給你一個場景,讓你去設計數據庫表結構。大部分題目都要求你臨場發揮,因此在平時多作項目、多去參考其餘系統的設計真的很重要。
此外,還要了解數據庫中的常見概念,好比事務、鎖、索引等;還有一些基本操做,好比存儲過程、備份、定位慢查詢。不然可能寫出的代碼會有 bug、一不當心插入的數據就不一致了、一不當心就把整個表給鎖住了、刪庫跑路也無能爲力等。
面試題
Redis 有哪些數據類型?
題解
分析
Redis 是一款高性能的 Key-Value 數據庫,它在後端開發中的做用很是大。
好比爲了提升接口性能、減輕數據庫壓力,用 Redis 作緩存;爲了解決併發衝突,使用 Redis 作分佈式鎖;爲了實現單點登陸、提升用戶效率,使用 Redis 存儲會話或令牌;Redis 還能夠用於作實時排行榜、計數器、布隆過濾器、隊列系統等。
所以,大廠面試中,Redis 的考點也愈來愈多,常見的有 Redis 的基本使用(有哪些數據類型?有哪些應用場景?集羣搭建)、工做機制(持久化機制 RDB 和 AOF 的區別?爲何單線程?) 、場景設計等。
面試題
請手寫單例模式的實現代碼?
題解
分析
設計模式是程序員們在軟件開發過程當中抽象出的、用於同一類問題的解決方案,通常是比函數、組件更高層的抽象,用了設計模式的代碼通常有以下特色:
正由於這些優勢,設計模式不管是對工做效率仍是思想的提高都頗有幫助,也成爲了面試高頻考點。常見的設計模式雖然有 3 大類、23+ 種,但面試重點主要是單例模式、工廠模式、觀察者模式等。
面試題
爲何用線程池?
題解
分析
如何用最少的資源,寫出性能更高、更可靠、更可擴展的程序是後端程序員須要思考的問題。所以,高併發編程是面試的重點。像線程池、鎖、隊列、併發包、同步異步等,都是高頻考點。有時還會給一些實際問題讓你分析,好比經典的秒殺系統的設計、訂單超賣問題如何解決。
面試題
Linux Top 命令的輸出信息分別表示什麼?
題解
分析
企業項目通常都是部署在雲服務器上的,大部分服務器的操做系統都是 Linux,所以後端開發工做中,必不可少地要操做 Linux 服務器,好比部署項目、安裝和配置服務、查看系統運行信息、定位線上問題排障等。
所以,要熟悉基本的 Linux 命令,可以適應無鼠標的命令行操做。
還要了解一些經常使用的系統分析命令,幫助排查問題。好比 top 命令,能夠查看系統的資源佔用、總體負載,還能具體查看每一個進程佔用了多少 CPU、內存,從而鎖定異常線程。
面試題
你用過 Git 版本控制系統麼?
題解
分析
企業開發大部分都是團隊協同而非單兵做戰,不少人要同時編寫同一個項目的代碼,那麼如何保證代碼的同步、減小衝突、查看改動呢?這就須要使用版本控制系統,目前最主流的是 Git。
現在,Git 已是程序員的必修課了,但不少同窗只是草草瞭解幾個簡單的 Git 操做,好比上傳和更新代碼到 GitHub,這是不行的。在工做中,還常常會用到工做區、分支、合併、回退、解決衝突的功能,也必須知道如何操做。
順帶一提,大多數員工剛進公司要作的事就是用 Git 拉取代碼,若是連這個都不會,就真的很尷尬了。
面試題
什麼是微服務?和傳統架構有什麼區別?
題解
分析
現在的架構形式豐富多彩,早就不是一套架構吃遍天的時代了。單點、集羣、分佈式、SOA、微服務、容器、雲原生、服務網格,這些架構都有什麼特色?分別適用於哪些場景?如何選擇?如何實現?這些問題都是後端程序員須要考慮、學習和實踐的。
聽完我這一通分析,一貫囂張的小阿巴竟也變得沉默了,點了個 贊 就放下了手機。
想學好後端進大廠,真的是任重而道遠,你們加油!
我是魚皮,最後再送你們一些 幫助我拿到大廠 offer 的學習資料:
歡迎閱讀 我從 0 自學進入騰訊的編程學習、求職、考證、寫書經歷,再也不迷茫!