當前位置: 妍妍網 > 碼農

面試被拷打,真面不動了。。。

2024-03-22碼農

現在春招火熱招聘中,許多同學正在準備八股文。 今天,分享一位同學的上岸經歷,內容涵蓋計畫經驗、八股文、演算法以及場景題。 並且文末分享該同學的上岸簡歷,正準備找工作面試的同學,記得關註一波。

星球原文連結:https://t.zsxq.com/18gUbJ275

本文已獲原作者授權

另外, 目前每天在持續更新春招崗位招聘資訊,並且收集了對應崗位的投遞連結,大家看看有無心儀的公司,盡快投遞起來。

截止到今天 3 月 13 日,依然在持續更新~

個人情況

計畫

我一共做了三個計畫, 、 、黑馬點評。

黑馬點評主要詢問 Redis 相關的問題,網上八股一大堆,卷就完事了。

聚合搜尋平台主要告訴面試官我懂 ES 和設計模式,能把實作的思路說通就行。

場景題基本都是針對 API 開放平台,招架不住,復盤的時候有了一些思路,希望能給大夥一點啟發。

做完這三個計畫,需要掌握你用到的技術棧,比如 ES、Sentinel、Dubbo、RabbitMQ 的使用、基本原理、容錯。如果實習了,就換上實習的真實計畫,結合工作經歷,再面對場景題會更得心應手。

八股文

推薦多關註並搜集一些優秀的八股文作者,每個作者都有擅長的領域,寫得好的領域,針對性的看,不然可能會出現由於作者精力有限,某個八股題目寫的比較簡單,導致面試時被問穿,那麽就會被打上深度不夠的標簽,還是很傷的。

個人建議

但,也不要有太大心理壓力,朋友們, 完成比完美更重要! 如果不能記下完美的答案,那至少要記下基本的答案。不要讓完美主義影響你的完成速度,這是血的教訓哇。

魚皮星球的計畫多多梳理,有一段時間我還是很懷疑魚皮計畫的含金量的,在什麽地方能勝過別人的計畫?朋友們, 含金量是夠夠的 ,不要急著否定,當你覺得你的想法更好時,去實踐,如果發現自己只是異想天開、鉆牛角尖的時候, 就會知道計畫的含金量,至少應付實習應該是夠的,放心做。

當然,不乏真的有更好的想法,星球裏的大佬不是也把自己的實作發出來了嗎?去學,去借鑒就好了。自己完成了新的想法之後,開源出來,接收群眾的拷打也是不錯的方式。魚皮之後也會走開源的路,大夥就不用自己從 0 整合擴充套件計畫了,而是可以在前人的基礎上擴充套件,還能學到多人合作的一些規範,感覺很不錯。

技術棧拷打(結合計畫)

1、一條 ES 語句的執行流程

答:最好說到分片規則、分布式儲存、分布式查詢的流程。

分布式新增:

解讀:

1)新增一個 ID =1的文件

2)對 ID 做 Hash 運算,假如得到的是2,則應該儲存到 Shard-2

3)Shard-2的主分片在node3節點,將數據路由到node3

4)保存文件

5)同步給 Shard-2 的副本 Replica-2,在 Node2 節點(別忘了備份數據!)

6)返回結果給 Coordinating-node 節點

分布式查詢:

1)Scatter phase:分散階段,Coordinating node會把請求分發到 每一個 分片

  1. Gather phase:聚集階段,Coordinating node匯總data node的搜尋結果,並處理為最終結果集返回給使用者

為什麽要把請求分發到每一個分片?因為查詢的時候不是用 ID 查,而是用關鍵字查,根本不知道數據在哪個分片,只能全查。透過協調節點,ES 集群對外一致,不管查哪個節點都能查出來。

2、Dubbo 怎麽實作負載均衡?

檢視:負載均衡 | Apache Dubbo (https://cn. Dubbo.apache.org/zh-cn/overview/core-features/load-balance/)

最好可以把一致性哈希的原理講清楚。

3、單邊快排如何實作?

1)雙邊快排怎麽實作也說一下

2)有幾種選擇基準值的辦法?哪種最好

3)怎麽最佳化

4)非遞迴怎麽寫

4、 Dubbo 底層怎麽進行 RPC 呼叫?

Dubbo 框架的工作流程如下:

1)服務提供者啟動時,向註冊中心註冊自己提供的服務。

2)服務消費者啟動時,向註冊中心訂閱自己所需的服務。

3)註冊中心返回可用的服務地址列表給消費者。

4)消費者透過負載均衡演算法選擇一個服務地址,並向該地址發起呼叫請求。

5)服務提供者接收到請求後,根據請求參數執行相應的業務邏輯,並將結果返回給消費者。

現在還是不知道怎麽回答,上面是 GPT 說的,也就是 Dubbo 的那張經典的流程圖。

我傾向於回答動態代理模式+ RPC 的呼叫流程:

1)在 RPC 框架中,代理可以完成序列化、網路 I/O 操作、負載均衡、故障恢復以及服務發現等一系列操作,而上層呼叫方只感知到了 一次 本地呼叫

2)Client 首先會呼叫原生的代理。

3)Client 端 Proxy 會按照協定(Protocol),將呼叫中傳入的數據序列化成字節流。

4)之後 Client 會透過網路(Netty框架),將字節數據發送到 Server 端。

5)Server 端接收到字節數據之後,會按照協定進行反序列化,得到相應的請求資訊。

6)Server 端 Proxy 會根據序列化後的請求資訊,呼叫相應的業務邏輯。

7)Server 端業務邏輯的返回值,也會按照上述邏輯返回給 Client 端。

5、一個物件建立的流程?

1)最好能接著說類載入機制

2)最好能說出建立物件有幾種方式

3)反射

4)序列化

5)Unsafe 類

6)實作 Cloneable 介面重寫 Clone 方法

6、Sentinel 一些原理

1)三種限流模式

2)整體框架

3)熔斷降級怎麽做

4)和 Hystrix 的區別有哪些

計畫拷打

聚合搜尋平台 + 黑馬點評:

1)說說聚合搜尋平台的實作

2)ES 集群怎麽搭建?

3)布隆過濾器怎麽解決沖突,能刪數據嗎?(不能)

4)RabbitMQ 的原理,怎麽實作訊息順序性

5)RabbitMQ 怎麽負載均衡

6)ZSET 底層實作

7)JUC 的大部份內容

API 開放平台:

1)為什麽不考研

2)Dubbo 3.0和 Dubbo 2.0最大的區別是什麽:[ Dubbo 3 套用級服務發現 | Apache Dubbo ](https://cn. Dubbo .apache.org/zh-cn/blog/2021/06/02/ Dubbo 3-套用級服務發現/)

3)Dubbo 註冊時會註冊什麽數據上去?

4)Nacos 為什麽對於臨時例項采用心跳檢測,非臨時例項采用主動詢問?

5)你把 Nacos 同時作為配置中心和註冊中心,知道這樣有什麽壞處不?

6)測試過 Nacos 的並行註冊能力嗎?為什麽 Nacos 能抗住那麽高註冊?

7)元空間會 GC 嗎?

8)元空間儲存哪些數據?

9)垃圾回收器,問了很多

10)JVM 調優

其中第四點,面試官說他們測試過,區別不大。

第 6 點,當時我記得黑馬說能抗 10w+,但是面試官告訴我,實際測試並沒有那麽高。

哈哈,在大佬面前,學生是不是背八股,痕跡還是很明顯的,大夥盡量結合著自己的實踐說,沒實踐過就謹慎點。

八股文

1)計畫介紹

2)微服務的優點

3)Spring 預設使用的容器是什麽?Tomcat 的連線數了解嗎?

4)Redis 的 Zset 說說特性,底層實作(因為簡歷上寫著,所以經常被問)

5)什麽數據需要保存到 Redis 裏?

6)緩存的缺點?怎麽進行數據同步?

7)AOP 失效的場景有哪些?

8)MySQL 主鍵采用什麽結構?為什麽要自增,為什麽要用 Int?

9)手撕,16 min,小卡殼

10)HTTPS 的演變流程說一下,有幾個版本?怎麽建立連線的、流程是什麽?用到了哪些非對稱加密演算法,對比一下它們,RSA 怎麽進行加密的、怎麽生成隨機數的?ECDHE為 什麽前向安全?具體的加密公式是什麽

11)類上加 Static 是為什麽?

12)怎麽優雅的中斷一個執行緒?

13)Redis 為什麽一般用單庫?分片集群下 Lua 指令碼有什麽問題?什麽時候會失效

手撕演算法

為什麽全是手撕?面了一個小時。

1)手撕單例,記得五種,寫到第四種說不用寫了。

2)手撕插入排序變種(根據題意)

3)給二元樹中序後序遍歷,建二元樹

4)矩陣旋轉(力扣原題)

場景題

面了1個小時,基本都是場景題+兩道題,不好描述場景。

1)AK/SK 怎麽做的?SDK 是公開的嗎?簽名演算法公開?這會出現什麽問題,現在你能想出更好的解決辦法嗎?

答:SDK 是公開的嗎?簽名演算法當然可公開,不然開發者怎麽用,只要秘鑰不泄露,就沒問題(我被詐了應該)

2)你的註冊器模式,需要把 Bean 物件放入 Map 裏對吧?你怎麽知道有多少個 Bean 要放入 Map 中?直接改程式碼嗎?你能實作線上可插拔嗎?根據需要加 Bean 進 Map 裏

答:反射、或者透過監聽配置的變更來更改 Map 內的值(分布式配置中心)

3)你在面試,女朋友在自習,任何一人完成手頭的事後都可以先去飯店,現在要求你和女朋友晚上同時吃飯,你和女朋友都是單執行緒的,請問怎麽保證不會有人先吃完飯,而是同時吃?

答:使用訊息佇列,先到的人(比如女朋友)發送訊息給訊息佇列,然後另一個人(我)完成手頭的任務後就消費該訊息,前往餐廳,女朋友設定回呼函式,當我到達餐廳後,女朋友觸發回呼,就知道我到來了。

4)我們生成了一個隨機數作為介面呼叫是否過期的判斷,這個隨機數是客戶端生成的本地時間,本地時間可能出現不準確,怎麽辦?

答:每次都向伺服端發起統一的請求,獲得統一的時間。

5)追問時間有偏差怎麽辦?我要很準確的時間。

答:設定一個容錯的視窗,在一定範圍內的誤差都可以忍受

6)追問每次都生成這個隨機數太慢了,你有什麽辦法最佳化?

答:緩存一些隨機數

7)你的 SDK 怎麽適配其他語言的計畫?

8)Skywalking 監控呼叫鏈時怎麽區分不同例項?怎麽傳遞上下文?

9)Java的序列化有哪幾種方式, Dubbo 的序列化了解嗎?你還了解哪些序列化

10)手撕了兩題,一道 SQL,一道力扣

11)Java 內建序列化、Protocol Buffer、Hessian、JSON、XML,都談談

後面的筆面大部份都拒了,只面了三家還在流程中的比較大的廠。

華為

一面 50 min:

1、手撕:Excel 表字母列轉對應數位列,也就是:26 進制轉 10 進制,10 進制轉 26 進制,0 需要特判。

2、Spring 裏的核心配置是啥?

3、資料庫三範式了解嗎?

二面 40 min:

1、手撕:反轉連結串列 II

三面 30 min:

表現得牛馬一點就行了。

碎碎念:面的時候已經擺爛一個星期了,雖然很快就放我入池了,但難道其實一面就掛了?因為後面都沒問啥難的,也沒給我打保溫電話,傷心。

最後兩面

1)Java 的 HashMap 底層

2)紅黑樹的 5 個特點、怎麽旋轉保持這些特點?

3)紅黑樹的套用場景

4)為什麽 InnoDB 用 B+ 樹不用紅黑樹

5)三層 B+ 樹能存多少行數據?

6)這個儲存量受每行數據大小影響嗎?

7)聯合索引如何實作?

8)命中主鍵索引和命中非主鍵索引有什麽區別?(好吵阿,面試官那邊,好像在居家辦公?)

9)問了一些計畫內容,給了一道場景題

答:Nginx+ 閘道器集群提升閘道器吞吐量時,需要在 Nginx 裏配置閘道器 IP 和埠,請問你有什麽辦法上線一個節點下線一個節點自動知道它的ip?(不會,提示我有點類似 Nacos,然後就...或許會了)

1)口撕:N 個升序列表,合並成一個升序列表。

沒寫過...尷尬

- 1 號連結串列和 2 號連結串列合並成新1號連結串列,新1號再和3號繼續合並,以此類推。時間復雜度分析,最佳化

- 突然發現有點像歸並排序,說了一些歸並的思路,時間復雜度分析,繼續問有沒有其他思路

- 把所有節點保存在集合中,然後呼叫 Sort,比較暴力

- 看我實在想不出,提示可以用優先佇列...然後讓我說了一下優先佇列的思路

最後一面

1)場景題:一次性呼叫多個介面,對於介面返回的 Data,怎麽去組合?要求靈活易擴充套件,最好零程式碼

答:這個剛好是面試官他們在解決的問題,提示我需要設定統一的規則。

2)RPC 和 HTTP 對比?RPC 有什麽缺點?

3)Netty 是什麽 IO?底層框架說一下

4)場景題:異步解構時,有短板效應,怎麽最佳化?

5)場景題:異步解構時,某些介面呼叫出現異常怎麽辦?(不會,沒遇到過,現場想了一些)

答:響應優先,就把異常介面的錯誤響應碼和正常介面的正常數據打包返回,讓使用者決定是否使用這個數據,異常介面重試,重試成功那就返回完整正確結果,多次重試還是失敗,直接返回這次呼叫(包含多個介面呼叫)失敗的響應碼

6)追問:如果我需要出現異常呼叫,直接停止主執行緒,直接返回這次呼叫的失敗響應碼,怎麽辦?

答:用訊息佇列,盡量讓主執行緒自然停止,直接中斷會出大問題。

7)設計模式幾大原則

8)單一職責原則,有沒有不需要遵守該原則的場景?

8.1)我說了一下我的理解:單體計畫想要簡單起見那可以這樣搞,或者最佳化介面呼叫速度。但最好還是遵循這個原則,因為有利於計畫擴充套件性。

8.2)然後面試官說了他的理解:這個單一原則並不是說只能做一件事,或最小化的事,這是一個抽象的概念,根據你的定義會改變,最重要的是介面的 可讀性 是否統一,簡單來說就是,一個介面裏做了很多事,但介面的命名或者表達是否明確,這才是單一。提醒我不要太堅持教條化的原則

9)芮氏替換原則,能出現父類的地方都能出現子類別,但是繼承是能改變父類的,比如重寫,你怎麽理解,這是否違背了芮氏替換原則?

9.1)我的理解:比如 RPC 裏用到的代理模式,要對父類增強的情況還是得遵循這個原則的,如果有需要多型的場景或授權以不遵守,根據需求而定。

9.2)面試官也給出了他的理解:這個原則還是很不錯的,最好還是遵守,因為這個原則的基本條件是父類足夠簡單,足夠抽象,父類能夠被覆蓋的只有抽象的部份,我們需要盡量區分父類能夠覆蓋和不能覆蓋的部份。

最後三場面試還是很舒服的,整體偏向於溝通,不會的題也會盡量給出引導和提示,沒有那種單純你問我答的考試的感覺,也沒有咄咄逼人高高在上的感覺。

面試的時候有個小訣竅,轉移你的目標,比如我們面試,目標肯定是透過,但是這樣壓力就會很大,可能導致你發揮不好,真的不過的時候,還要 Emo。這時候轉移你的目標,你是去學習,交流,進步的,這是個機會,這樣想了之後,我的表現就自然了很多,不會的題就看看能不能從面試官嘴裏問出點蛛絲馬跡,過不過,倒是次要的,壓力就會小很多。祝大家以後面試都能遇到和善的氛圍。

簡歷

簡歷:上編程導航多看看別人的簡歷就可以了,就知道怎麽寫了。

我傾向的排版:個人資料—>教育背景(包括獎學金、比賽)—>計畫—>技術棧

計畫:照著魚皮推薦的寫就行了,計畫有兩個以上,每個寫三四點就行了,只有一個那就寫多點吧。

比賽和評獎評優因人而已,不相關的比賽也盡量放上去,HR面會問問,看看你的團隊合作能力。

評獎評優那必須放呀,不然三年書白讀了,績點排名都放,當然要是不太好看就不放了。

社團活動、擔任職位,我覺得放不放都可以,畢竟應聘的是技術崗。

我的簡歷,計畫方面有很大的局限性,因為沒實習,大夥實習後可以替換為實習的計畫。

萬事開頭難,當我準備了一個半月,第一次寫簡歷的時候,才發現,我還是啥也不會,非常膽怯,只敢寫了解。

下面這個是我第一版簡歷,可以說非常搞笑了,你說你了解,可是到底了解了個啥?太空泛了。

這還是我看兩遍星球的簡歷寫法後寫的,哈哈哈...

後面就是聽從魚皮建議,多看其他人的簡歷。當時我逛編程導航,大夥都很優秀,我隨便挑了十來份,就挑到了噠哥的,問琴的,他倆做的計畫和我一樣,然後我就大概知道應該怎麽寫了。

技術棧,我覺得 Java、JVM、JUC、Redis、MySQL,這五個一定得寫?畢竟找工作一定會學。其他的就看後續的學習情況,比如我看了小林的計網,HTTPS整個流程還算熟悉,那自然要靠這個打動面試官。

提醒一下,朋友們,八股要經常復習,我擺了之後,下面有幾個記得的,我也不確定了。

復習的話就多模擬面試,洗澡的時候自言自語,看看能不能把整個流程講清楚。技術棧我比較傾向於寫了解,比如IOC、AOP,之前我被問穿過一次,不敢寫熟悉了。

最後,如果哪裏寫得有問題在評論區說一下吧,我自己由於燈下黑,找不出問題了。我的簡歷曾被某大廠面試官打為中等偏下水平,確實和魚皮大學的簡歷比起來,略顯狗屎,有中等偏下也不錯了。輕噴。

附上魚皮大學時的技術棧,那是真的一行頂我十行哈哈哈。

歡迎學編程的朋友加入魚皮的 ,和 2.8 萬名 編程學習者共 享知識、交流進步。

星球擁有 30+ 原創學習路線和專欄、 上千篇 優質編程學習求職幹貨。

還有魚皮從 0 - 1 全程直播帶做的 原創計畫 ,手把手帶你 掌握獨立開發計畫的方法 ,並且提供 現成的簡歷寫法 ,成功幫助不少小夥伴找到了工作。

歡迎感興趣的同學加入體驗,本號讀者可限時享用專屬優惠券:

三天內不滿意可全額退款,有沒有用自己試了才知道