面試了一個32歲的程序員,場面一度很尷尬。
招人背景
首先說一下朋友的公司招人背景,公司招聘PHP高級崗位,負(fù)責(zé)公司的B2B項目研發(fā)、并發(fā)問題的處理和解決。領(lǐng)導(dǎo)給了他兩個要求:(接下來的講述我會以朋友的第一人稱來進(jìn)行)
(1)技術(shù)比較好
(2)有大項目實戰(zhàn)經(jīng)驗。
掃碼免費領(lǐng)取,無套路
(限時加贈《12萬字Java面經(jīng)總結(jié)》)
????????????

說白了這是一個純粹的技術(shù)崗位,能夠把項目核心代碼解決好來,能夠去處理好的并發(fā)帶來的一些問題,避免一些隱患問題。
干我們這行的都懂,大廠都在清理 35 歲以上的基礎(chǔ)崗,如果到了這個年紀(jì)還混不到中高層管理崗位,基礎(chǔ)崗確實不太好找了。
現(xiàn)在的年輕人很厲害,很年輕就走上了管理層,所以我很慶幸公司在年齡上沒有卡人,給了很多 30+ 的程序員簡歷供我篩選,因為我也是程序員,所以我不會在年齡上有所顧慮。
所以,確實就和標(biāo)題寫的那樣,這兩天我就面試了一個 32歲程序員,全程讓我都感覺有點慌……
為什么慌?主要是因為年齡比我大不少,項目經(jīng)驗肯定也比我豐富得多,技術(shù)會不會很牛逼?會不會吊打我,狠狠地虐我?我真心怕 hold 不住。
但實際面試下來,場面一度尷尬,結(jié)局讓我感覺有點唏噓。

面試過程
面試者 11年工作經(jīng)驗,簡歷卻只有 2 頁,可以說非常簡練,從程序員到小組長、項目經(jīng)理、研發(fā)經(jīng)理、技術(shù)總監(jiān)都干了個遍,Java/PHP/Python/C# 也都有涉及。
從交談過程中,他說是可以做一些優(yōu)化的,能夠去解決一些并發(fā)問題,自己的項目經(jīng)驗也比較豐富。首先我說先問些技術(shù)問題,然后在了解一下你的相關(guān)開發(fā)項目。
我:?你有互聯(lián)網(wǎng)分布式相關(guān)項目開發(fā)經(jīng)歷么?
面試者:?有啊,那個 XXX 項目就是
我:?好,我看到了,我看這個項目有解決一些高并發(fā)的問題,那么我們就先來講一個普通的場景,因為你項目經(jīng)驗比較豐富,我就不單問技術(shù)情況了,就說說場景是如何發(fā)生和去解決的。如果有一個普通場景,就是1000個用戶下單一批商品,這個商品是多個,不是活動,但是庫存只有100,這個情況。
面試者:?這個情況的話就可以使用傳統(tǒng)的隊列去解決
然后他就一直在說和用隊列的處理的方式,之前他是如何處理的,首先,我不是很關(guān)心他之前做的一些業(yè)務(wù),然后我就打斷了他,就是普通的場景,不是說做活動。
<p data-pid="mq_NXtBb">面試者:那就根據(jù)實際的情況來,可以選擇樂觀鎖的方式或者說分布式鎖的方式。
我:嗯,那你說說實現(xiàn)方式,這個點這樣用鎖會比較好嗎?
面試者:那樂觀鎖的話就是可以使用redis 的watch方法去做,監(jiān)聽一下我們的銷量,然后配合redis事務(wù)去使用,然后就開始介紹分布式鎖。
我:額。。我在打斷一下,你使用隊列或者鎖在這種場景下都會去降低很多的這種項目的吞吐量,那這個的話不是會造成用戶的阻塞等待?這樣的話系統(tǒng)的吞吐量就會很差了。而且你不管前面用什么方式你最終都要落地到數(shù)據(jù)庫的,那么這個怎么處理呢?
面試者:一般來說都不會在mysql處理呀,用緩存不就可以了。
可能他項目規(guī)模都不是很大,對于這種問題只能夠去回答一些比較官方的解決方案。
我:?能介紹下服務(wù)與服務(wù)之間相互調(diào)用的時候,如果調(diào)用超時了是怎么處理的?
面試者:?超時啊,(想了幾秒后)那應(yīng)該是報錯吧
我: 確定是報錯嗎?(他想了想,不說話,然后我接著說)沒有重試機(jī)制嗎?重試機(jī)制是怎樣的?
做過分布式的項目的都知道重試機(jī)制,至少讀操作要支持重試,寫操作支持重試的話被調(diào)用方還要支持冪等性,不然會造成重復(fù)寫入。
面試者:?(又想了想,笑著和我說)這個項目有點久了,這個不太記得了……
然后我看了下這個項目,2014 年做的,6 年前了,他說太久不記得了,那也情有可原了。
我:好,你最近做的這個項目,能介紹下它的整體架構(gòu)么?
面試者:?我們用了 Redis做虛擬庫存,用了 MQ,用了微服務(wù)…(他說了一堆,都沒說到重點)
我:?我想問的是,從上到下,這些技術(shù)是怎么承接起來的,整體的系統(tǒng)架構(gòu)是怎樣的?(現(xiàn)場沒紙筆,不然我都想讓他畫圖了)
面試者:?呃……我知道你的意思,主要是我真的不知道怎么表達(dá)……(然后他不說話了,場面尷尬了)
我:?(趕緊找了繼續(xù)追問了一個冪等性問題,因為做分布式的話這塊肯定是會遇到的)那你如何理解冪等性呢?
面試者:就是我們使用mq的時候我們會有一個自帶的id,然后根據(jù)這個id去判斷是否被消費,如果已經(jīng)被消費,那么你就不處理。
我:?不一定就是MQ,就是比如你做一個分布式的接口,那么這個接口的冪等性如何解決?
面試者:那就只能寫一個標(biāo)記了.......如果這個接口被調(diào)用了的話,那么你就標(biāo)記他被調(diào)用,這樣其他地方就根據(jù)這個標(biāo)記去判斷是否還可以調(diào)用……(想了半天也沒有說出好的方案)
其實這里至少有三個方案:
接口為什么要實現(xiàn)冪等?
前端重復(fù)提交選中的數(shù)據(jù),后臺只產(chǎn)生對應(yīng)這個數(shù)據(jù)的一個反應(yīng)結(jié)果。
(1)token機(jī)制
? ? ? ?當(dāng)客戶端請求頁面時,服務(wù)器會生成一個隨機(jī)數(shù)token,并且將token放置到session當(dāng)中,然后將token發(fā)給客戶端(一般通過構(gòu)造hidden表單)。下次客戶端提交請求時,token會隨著表單一起提交到服務(wù)器端。服務(wù)器端第一次驗證相同過后,會將session中的token值更新下,若用戶重復(fù)提交,第二次的驗證判斷將失敗,因為用戶提交的表單中的token沒變,但服務(wù)器端session中token已經(jīng)改變了。
(2)通過版本號實現(xiàn)-樂觀鎖
這個的話就要分情況,因為加鎖的話畢竟會對性能有一些影響
(3)Redis原子性
(4)去重表
利用數(shù)據(jù)庫表單的特性來實現(xiàn)冪等,常用的一個思路是在表上構(gòu)建唯一性索引。將某個內(nèi)容id與用戶id綁定建立唯一索引,每當(dāng)用戶點擊這個內(nèi)容時就往表中寫入一條數(shù)據(jù),這樣重復(fù)點擊的數(shù)據(jù)就無法寫入。

然后我就問了一些他目前主要負(fù)責(zé)的項目,項目大概的規(guī)模,你自己在項目當(dāng)中遇到的比較棘手的問題,你們是如何去解決的。了解了一些發(fā)展,為什么從上家公司離職這些問題。
總結(jié)
最后我把面試情況總結(jié)起來和領(lǐng)導(dǎo)說了,領(lǐng)導(dǎo)就說了一句:技術(shù)是提前。
第一次面試一個 32 歲的程序員,干了 11 年,如果還要面試做技術(shù)的崗位,這個面試情況確實不理想。也不知道他的真實經(jīng)歷是不是一直在外包公司?或許真該清楚認(rèn)識下自己的定位和未來的職業(yè)規(guī)劃了。
隨著我跟朋友的溝通到下來這個文章,其實我也在感慨,朋友說他也感覺更慌了,日月如梭,他也快有這么一天了,如果做不到中高層,也要去和年輕搶飯碗,沒辦法,這是現(xiàn)實。
年紀(jì)來了,朋友感覺自己寫代碼確實也寫不太動了,人也變得越來越焦慮不安,能干嘛去呢?路子也不多,也不知道該如何去發(fā)展!
唯一能做的就是朝著自已期望的崗位或者目標(biāo)不斷努力,不斷的提升自己的硬實力和基本功,最好的貴人就是拼命努力的自己,程序員的核心競爭力就是你的技術(shù)水平,管理能力,只有這些都提升上來了,這樣才能去為日益焦慮不安的自己,迎接未來更多的機(jī)會。
其實現(xiàn)在也有很多年輕人很厲害,年輕有為的也不少,但是還是要記住一句話,種一棵樹最好的就是十年前,其次就是現(xiàn)在,如果你不去開始,那么你永遠(yuǎn)都不會有成功之花綻放在自己人生的枝頭上。大器晚成,為時也不晚,這樣的例子也數(shù)不勝數(shù),所以你要相信,只要自己一直在準(zhǔn)備,找到自己的職業(yè)道路,學(xué)習(xí)規(guī)劃,機(jī)會總會到來的,總會有成功之花綻放的那一天。
如果你喜歡我寫的技術(shù)文章以及面試總結(jié),歡迎關(guān)注收看我的更多作品,并且點贊、收藏、關(guān)注我哦。

我是曾曾,感謝你的關(guān)注!
據(jù)說點贊,喜歡,收藏了的小伙伴升職加薪、面試必過,拿到心儀offer!