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