主頁 > 後端開發 > 我招了個“水貨”程式員

我招了個“水貨”程式員

2021-06-26 06:12:35 後端開發

這篇文章對很多沒有高并發經驗的程式員來說,會非常有幫助,

很多程式員可能都遇到過類似的困惑:

我沒有高并發專案經驗,但是面試的時候經常被問到高并發、性能調優方面的問題,該怎么辦?

這個問題怎么解決?和大家說說我招人的一個經歷,

程式員小張參加作業已 5 年,是一位高級工程師,是我親自招進公司,表現很出色,

前一陣子,我把小張叫進會議室,想讓他單獨帶個團隊,其中,我談到了面試時,他簡歷注水的問題,

事情是這樣的,大概兩年前,公司有個核心專案缺人,需要一位高級程式員,這個崗位非常重要,所以對面試人要求不低:

  • 有高性能、高并發開發經驗
  • 有高可用系統經驗
  • 參與中間件研發、優化和系統存盤優化

招聘持續了兩個月,面試了許多作業五年以上甚至十年的人選,卻依然沒有招到一個特別合適的,

就在我們快不抱希望的時候,同事讓我去面試一個有趣的人,他強烈推薦,并順手把簡歷遞給了我,這人正是小張,

接過簡歷后,我先翻了翻,這一翻,讓我皺起了眉頭,

簡歷里,小張的作業經驗只有區區三年,這三年全都在一家公司,公司本身還沒有什么名氣,

更重要的是,我懷疑他的簡歷做了手腳,

他說自己三年里,負責過兩個專案,一個是電商專案,一個是關于這個電商專案的對外開放平臺,對這兩個專案,他著重強調了專案的高并發,并說自己解決了很多技術難題,

就是這里出現了問題,我們當時也有電商專案,市面上稍微有點名氣的電商平臺我都非常清楚,卻沒聽說過他簡歷里的產品,所以我懷疑,這份簡歷是包裝過度了,

但是,對于這么明顯的問題,我不信前面的面試官們都沒看出來,那么,為什么他們還推薦我去見見呢?

說心里話,對簡歷包裝過度我是比較畝訓的,但是這只是我的懷疑,同時,前面的面試官竟然是帶著一種從未有過的滿意語氣,叫我一定面面他,對同事們的認可我又比較好奇,

就這樣,我帶著畝訓又好奇的矛盾心思見到了小張,

見到小張的時候,我由于有點畝訓,臉色顯得非常嚴肅,他可能看到我如此嚴肅,不禁局促了起來,但是,從他的眼神中,我又看到了很強的自信,我心里想,確實挺有趣的人,我決定要好好的面試下這個人,看看他到底有什么本事,能讓我的同事如此滿意,

問了下他大概背景后,開始了進入了正題,當進入了正題之后,小張的回答態度就讓我大加贊賞,態度自信,不卑不亢,邏輯表達也十分清晰明白,

這時候,我心里決定,如果小張后續的回答,能證明他的實力達到簡歷描述的八成水平,我會傾向于把 offer 給他,

我先問了問他對高并發的理解,比如

高并發需要參考哪些指標?

他告訴我,高并發由于產品型別不同,所以指標都不一樣,以他負責的電商系統來說,根據模塊的不同,關注的指標不同,商品瀏覽看得是 QPS,訂單模塊則是看得 TPS,同時,他們還需要關注活躍的用戶量等等,

這回答真不錯,面試以來,哪怕是作業多年的人,絕大多數的答案就是 QPS,無非再多一個 TPS,能把產品型別的不同和不同的高并發指標之間關聯起來,這說明小張是仔細對這個問題思考過的,

我愈發滿意了,在后面,我又追問了集群部署、多級快取、復雜查詢優化等有關性能優化的問題,還附加了系統高可用的各種策略,和如何拆分去保證靈活擴展等實際中我們正在采用的問題,

等面試完畢后,時間已經過了一個多小時,小張當時并沒有百分百答好我問的問題,

從實際回答來看,關于性能優化的細節,比如,系統瓶頸的檢測和優化,程式邏輯的優化,JVM 優化甚至資料庫的優化都答得異乎尋常的出色,

但是,對于高可用的大概策略,比如降級處理,限流處理等,他只知道大的方向,很多答案一聽就知道是從書本上或者互聯網上看來的,

而對于系統的擴展性相關問題,他甚至答的非常差,很多都回答不上來,

不過瑕不掩瑜,小張依然拿到了 offer,他期望的薪資我也沒有打任何折扣,這足以給他一份大大的驚喜了,

在后來的兩年里,小張的出色表現,證明我沒有看錯他,

他為了公司的核心專案做出了巨大貢獻,而他的技術水平,也有了肉眼可見的巨大提升,他成為了一名高并發經驗豐富的高級程式員,所以,現在打算讓他帶團隊了,

“那么,就剩一個問題了,你面試之前到底是如何做到熟悉高并發的性能優化的?” 我好奇的問出了我壓在心底的問題,

小張不太好意思的撓了撓頭,他詳細給我講述了他是如何搞定高并發經驗的,

我聽完后,真的是對他這些準備贊不絕口,我認為該分享出來,讓更多的人看到,

劃重點!

劃重點!

劃重點!

如果你也渴望有高并發經驗,那么下面的內容你要格外關注了,

小張確實是做了電商平臺開發的,但是,這個電商平臺沒多少訪問量,QPS 可能一只手都能數的過來,說句難聽話,也就是掛在網上而已,

他剛畢業入職開始,就參與維護了這套電商平臺,就這樣持續了一年后,他發現自己已經無法再有任何提高了,

他想跳槽,但是發現很多高級崗位都是要求高并發經驗的,他對此很著急,如果他繼續在以前的公司發展,就勢必接觸不了什么高并發,但是跳槽的話,他又必須有高并發經驗才能找到一個不錯的崗位去繼續提升自己,

這貌似成了一個死結,

在百般無奈之下,他決定自己模擬高并發去獲得經驗,

現在總結下來,其實他的練習可以粗略分為三個階段:

第一階段

這個階段,小張完成了在高并發條件下,對單機性能優化的學習,

小張用 Docker 容器去運行他維護的電商專案,然后用 jmeter、wrk 等工具去壓測,

在壓測期間,他敏銳地發現了由于系統每個模塊不同,所以性能表現就不一樣,這種現象引發了他的思考,他經過網路搜索和查詢資料,明白了不同模塊、不同產品對并發指標的要求是不一樣的,

基于這種情況,他又根據產品的業務邏輯撰寫了復雜的壓測腳本,能自動實作不同模塊的壓測任務,

就是在這種不斷地壓測探測下,他明白了如何探測問題,如何通過優化代碼、JVM 去解決問題,

比如,解決誤用 HashMap 導致死回圈的問題,又比如,誤用不帶快取的檔案 IO 流,去讀取檔案的問題等等,

在程式和 JVM 優化完畢后,他又發現資料庫也存在問題,于是,他又學會了如何優化資料庫 SQL,如何對資料庫分表等問題,

也是在這個階段,他認識到了快取的必要性以及同步快取資料狀態的重要性等重要知識點,

小張在搞了單機優化后,他覺得也沒有辦法再通過單機的壓測學到什么新的東西了,于是,他轉向了第二階段,

第二階段

小張從阿里云買了兩臺機器,他開始嘗試使用負載均衡去分擔高并發的壓力

同樣的,也是借助壓測工具去模擬了高并發,在壓測期間,負載均衡和系統屢屢出現和單機完全不一樣的問題,

比如,負載均衡本身的性能問題,比如,在一些時候,負載均衡后面的機器負載是不平衡的,需要對負載演算法進行調整,

這個階段,小張理解了負載均衡中大部分的細節,

但是,高并發中,很多系統的構成會很復雜,以至于需要分布式架構系統的程度,他們需要各種中間件做通信,做存盤,

所以,小張根據招聘的一些需求,他做了第三階段的練習,

第三階段

為了能熟悉市面上各中間件的使用,小張把他那套電商平臺改了又改,

比如,一些本地呼叫的方法,被他替換成了 Dubbo 遠程呼叫,比如,一些模塊間呼叫,被他替換成了 MQ 中間件傳訊息,再比如,一些放在關系資料庫的被頻繁訪問的資料,被他改存在了 MongoDB 中……

當然,壓測依然繼續,就這樣,小張又實踐了很多中間件和分布式框架的使用,

在模擬高并發練習的同時,小張不忘去讀各種高并發高性能的書籍,比如,《大型網站服務器容量規劃》、《互聯網創業核心技術:構建可伸縮的web應用》等書籍,

在來到我們公司面試之前,小張如此練習了兩年左右,

雖然小張面試的時候表現也存在很多不足,但是我當時看中他的一些優點是:

1. 小張滿足具有高并發經驗的要求

為什么我們需要找有高并發經驗的人?

說白了,我們想找的程式員其實是:

  • 不會亂寫性能很差的代碼
  • 能敏銳感知到影響系統的問題
  • 能獨立的處理由于高并發引發的問題

小張通過他的練習是掌握了這些技能的,

2. 小張滿足熟悉高可用的要求

我們找熟悉高可用的人,其實并不要求這個人一定能給出什么獨特的高可用方案,我們要求的是,他能知道高可用的知識后,去意識到高可用的重要性,

比如限流功能出現問題,他要能馬上認識到這是個很重要的問題,從而把解決的優先級提到很高,

小張通過學習,明白了高可用的重要性,也知道了高可用的大方向,這就夠了,剩下的細節,我們有信心帶小張在實際作業中學出來,

3. 小張能參與我們的中間件研發和存盤優化

小張主動改造過他們的電商系統,而且使用了很多的中間件,并對這些中間件都進行過優化,對這些中間件的特性比較熟悉,并且在實踐中,他也了解了很多原理,

除此之外,小張的主觀能動性尤其打動我們,他對技術的主動鉆研、主動學習,表明了他是一個喜歡走出舒適區,愿意挑戰自己的人,而這樣的人,有哪個團隊不歡迎呢?

所以,其實沒有高并發經驗并不可怕,

如果在作業中你接觸不到高并發的專案,那么也沒必要太糾結,公司做什么專案你改變不了,你能改變的只有你自己,關鍵還是自己要去主動學習,主動練習,主動提升,只有這樣的人,機會才會去垂青,

最后,畢竟在程式員這個圈子,90% 以上的人可能都沒有真正的高并發經驗,所以在此也希望各位面試官,在招人的時候,如果遇到好苗子可以適當寬容一些,給新人們一點機會,說不定能找到一匹千里馬,

碼字不易,看完之后如果覺得有幫助,希望你能幫忙隨手點個贊,你的支持對我很重要

最最后,推薦一本高并發相關的開源書籍:《深入淺出Java多執行緒》

本書的作者們都是阿里、ThoughtWorks 等大廠的高級程式員,

我看了一部分,雖然還沒全部看完,但是我已經迫不及待的想給這本書點贊了,

不多說了,我們直接看目錄:

書里還有很多例子,可以說是圖文并茂,

獲取方式:關注我的公眾號【四猿外】,關注后在后臺回復 666 ,

還有更多干貨資料不定期更新


你好,我是四猿外,一家上市公司的技術總監,管理的技術團隊一百余人,

我從一名非計算機專業的畢業生,轉行到程式員,一路打拼,一路成長,

我會把自己的成長故事寫成文章,把枯燥的技術文章寫成故事,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/288424.html

標籤:Java

上一篇:正排倒排,并不是 MySQL 的排序的全部!

下一篇:Netty 框架學習 —— 單元測驗

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more