這次面試的是小公司,深圳計通智慧,面試分為初試和複試。使用騰訊視訊會議完成。相比與上次面試,這次有所進步,進複試了。當然,這可能也與面試風格有關。這次面試著重與專案經歷和技術,因此回答比較順暢。
這一週幹了什麼
我先是研究了上次面試沒回答出來,或者回答得不好的技術問題。然後順著簡歷上的技術,又複習了一下asp.net core
,wpf
。因為對mvc模板和webform模板不太熟悉,因為以前只做過維護。因此又花了一個週末半學習,半重溫式的學習了asp.netcore RazorPage
和asp.netcore mvc
兩個模板。最後是根據之前問到的問題,總結之後面試可能遇到的提問。
在這一週還投了幾個簡歷,收到了3個面試邀請。其中1個深圳,2個成都。星期一請假面試了深圳的那一家。因為他們要求上班時間面試。之後的面試也要求上班時間,麻煩了,短時間內不好請假了。而且面試之後的總結學習也需要時間。我是想緩一週的。投簡歷麻煩之處在於,我不知道對方是否會邀請面試。看來之後應該面試完一家,再投一家。
初試
在初試之前,人事微信詢問了公司、收入、婚姻、家庭、籍貫。我逐一如實回答。
初試要求我開啟影片。對方使用語音。一個年輕人事,一箇中年技術總經理,還有一個廣東中年人,聽聲音有一定年紀,不清楚角色,但也是能提技術問題的。聽hr介紹,都是擔任職位。這次面試不同於上次,基本是看著簡歷的專案經歷和其中的具體技術問題問下去的。
-
首先是自我介紹
我叫xx,今年27歲,四川人。2020年畢業於西南石油大學,到現在有4年了,所學專業是軟體工程
畢業後從2020年至今一直就職於目前這家公司。
最開始的1年在做winform,主要進行採集軟體維護,也開發過幾個頁面,之後主要進行asp.net framework webform和mvc維護,以及web開發,後端主要是寫sql。近兩年則開始用asp.net core進行後端開發和layui+vue進行前端開發 -
最近完成的專案中扮演什麼角色,做哪些工作
這個專案已經完成,我現在負責維護。開發的時候,由工程人員整理方案,和小組長討論之後,他會搭建好專案框架和部分基礎設施,然後把我們小組成員叫過去劃分任務。我們完成之後提交。經常遇到需求不清楚,就要自己和工程人員討論。這個專案的大多數地方我都參與了。專案總結總感覺不太好,之後還得再回憶修改一下。
-
asp.net core專案搭建流程
首先是webapplication建立一個builder,然後註冊託管服務,比如身份認證服務,efcore、各個業務邏輯服務、swagger服務之類的。然後是配置中介軟體,有靜態檔案訪問中介軟體,swagger中介軟體,不過這個在生產環境中一般是註釋掉的。然後還有404中介軟體、異常處理中介軟體。如果有用到websocket的話,還要註冊websocket中介軟體。還有appsetting中需要配置一些資訊。我翻一下專案,還有終結點中介軟體,跨域中介軟體,路由中介軟體。服務還有memorycache服務,redis服務,automapper服務,httpclient服務,mvc服務(但我們沒寫mvc頁面),總之挺大一堆
-
.netcore中日誌分為幾個等級
日誌在appsetting中配置,大概分為info,debug,warn,error,trace幾個等級吧。一般是註冊日誌中介軟體,在裡面列印日誌。controller中遇到錯誤大部分情況下會直接丟擲去,也有時候記錄一些資訊返回前端,阻止異常丟擲。日誌這方面真的是我的弱項,接觸太少了。
-
資料安全傳輸
主要是要資料加密吧。這方面沒有多少了解 -
專案中你們怎麼做身份認證的,身份認證有幾種
我確認了一下,你是指架構schema嗎?他說說下去。我說最基礎的是basic架構,但是basic使用明文傳輸認證欄位,basic所有最好是和https加密結合使用。然後常用的是bearer架構,這種token是加密過的,比較安全。 -
token的原理是什麼
token生成過程中使用數字簽名對資訊進行了加密,客戶端仍然可以檢視token資訊,但是沒法篡改。篡改了資訊的話,伺服器中介軟體那裡使用簽名驗證token時會報錯。 -
你說一下jwt身份認證流程
身份認證首先是登入方法那邊用數字簽名結合相關資訊生成一個token,返給前端。前端我們通常是存放在localstorage中。發起請求的時候將authorization欄位設定成這個token。然後後端會加一個身份認證中介軟體,在這裡驗證token。我們通常還會建立一個currentuser物件存放token解析出來的欄位,比如使用者id,系統資訊,業務資訊
-
怎麼讓token過期
首先是等待token過期。他問,還有呢?我想了會,哦,還有可以設定expire欄位,控制過期時間。他問,那過期時間設定為多久合適呢?我回憶了下說,不能設定太長,這樣使用token就失去意義了。應該是分場景吧。比如電腦上,我經常發現頭一天登入了,第二天開啟不會跳轉到登入頁面,看起來token過期至少設定了10多個小時。如果是手機端的話,可能幾十分鐘比較好吧。 -
你能說下越權訪問嗎
我說不了解這個。網上搜尋了下。越權包括水平越權和垂直越權。這個兩年前安全培訓,靶場演練講過,不過我忘了。水平越權指的是,A使用者修改請求引數ID,獲取B使用者的資訊。垂直越權指的是普通使用者獲取到了管理員的許可權。水平越權應對方法是將id和token進行比對。然而我們靶場演練時伺服器是php,使用查詢引數代表使用者,我不記得頭部有token。然而我們現在使用的.net,開發時把使用者id放在身份認證的token中,透過數字簽名防止篡改,這沒法水平越權。垂直越權我也不知道要怎麼才能做到。
-
不同平臺的系統有哪些通訊協議
最常見的就是http了,然後如果是和瀏覽器通訊的話,還可以用websocket。然後還有socket通訊。不知道webservice算不算?他說算。webservice應該屬於遠端過程呼叫rpc的範疇了。rpc只是一種手段,就是用網路傳輸函式呼叫資訊。vs中連線的服務那裡就提供了能把openapi介面做成遠端呼叫的功能。
-
你在開發過程中遇到過併發問題
有遇到過幾次併發問題。是在做簽到功能的時候遇到的。由於資料庫設計得不好,設計了一個多值屬性。然後簽到的時候很多個請求同時去修改這個欄位,就導致修改得不準確。最後只能去用lock關鍵字加鎖解決。他問用lock有什麼需要注意的?我說lock會導致很多執行緒阻塞在那裡,lock裡面儘量不要進行太多耗時操作。他問還有什麼要注意的嗎?我說還有就是lock中要使用靜態變數,否則每個執行緒都使用不同的物件,lock就沒用了。現在想想,實際上lock程式碼塊中的耗時問題應該交給快取中間層處理,既能避免資料不一致,也能避免訪問資料庫耗時太久
其實我碰到過一個比較嚴重的問題,在非同步方法中使用lock,結果lock失效,結果只能逼著使用同步方法。現在我能簡單猜測一下是同步上下文導致的。因為非同步同步上下文的機制是把變數複製到新執行緒上面去,結果被lock的靜態變數就和臨時變數沒什麼區別了 -
資源是怎麼回收的
這個我比較疑惑了,就問,你是說託管物件嗎,這個是clr負責的,如果是非託管物件。他說就比如檔案這些。這下我明白了,就說使用後呼叫close方法關閉。但是更好的做法是放在using中,這樣程式碼跳出using範圍後,物件就會被回收了,避免忘記呼叫close。我記得using是一個語法糖吧,似乎是被會被轉換為為呼叫dispose方法?但說實話,沒怎麼用過dllimport呼叫C++程式碼,不是很熟悉非託管這塊的資源釋放的實現。但我猜主要是C++裡面的mlloc申請的記憶體空間需要釋放吧,這個大一學習連結串列的時候第一次接觸這個函式。那對應的應該還有個freelloc函式才對。也就是說需要我們在C++中封裝這兩個函式,在C#中手動呼叫封裝的方法,代替clr申請和釋放記憶體。在C#中呼叫自定義的C++函式我有測試過,要說到記憶體的話,我只想到這個玩意了。
-
小組有多少人
有8個人我還要計數才知道,就直接按照印象說的
-
組織架構
按照業務橫著切分,分為鑽井和井下。按照職責豎著切分,分為工程部和軟體部。一共可以分成四組人員。 -
去過現場嗎
沒有真正去過現場。距離最近的一次是去新疆出差。平時也經常遠端到現場電腦上部署和解決問題。有些軟體是由工程人員帶到現場安裝的。他問,所以說你並沒有去過現場,我說是的。 -
用到了哪些orm框架
我們常用的框架efcore和sqlsuger。efcore用的比較多一點。efcore的話,我們的資料庫是多個應用共用的,所以都是以反向工程的方式生成模型,沒有用到codefirst。對方問,這兩個框架的優缺點是什麼?我說efcore的linq操作比較方便一點,但是sqlsuger的外連線,資料分組聚合比較方便。我還發現了efcore可以跟蹤模型,這在單例模式下比較有用,但webapi中通常都是注入的socpe作用域,跟蹤功能意義就減少一半。主要是我用ef寫過長度上百行的linq,用三元運算子和巢狀linq處理聚合以及開窗的問題。sqlsuger還沒這樣用過。
-
資料庫查詢速度慢的問題怎麼解決
最快捷的方式是加索引,比如日報表這些,資料達到幾百萬行或者上千萬行後全表掃描速度會很慢。加了索引之後連線到索引列上面去就會很快。在後期最佳化sql時一般會注意這方面。對方問,除了索引之外,還有呢?我想了寫說,還有物化檢視吧,用物化檢視把一些資料預先查詢好,這樣也能加快查詢速度。物化檢視是常用的,我們這裡大量使用。我觀察米遊社的資料統計有延遲,應該也是用的物化檢視。檢視查詢計劃看哪些大表走了全表掃描也是一個常見的方式,至少在dbeaver裡面還挺方便,就一個按鈕。
-
設計模式
設計模式本身在.net的各個框架中就大量使用。比如asp.net core的webapplicationbuilder使用了建造者模式,wpf中的命令使用了命令模式,C#中的事件使用了觀察者模式。我們在一些處理有些資料時還可能用到一種和樹形相關的結構模式,但具體名字我記不清楚了。工作中並沒有專門去關注設計模式,只是遇到相關問題,需要使用設計模式時,會去查一下。依賴注入容器中還經常使用工廠模式,使用匿名func委託作為工廠,比如各種provider
-
你從哪些地方學習新的知識
學習的途徑主要是看技術部落格和一些影片。工作中接觸到的技術是一個重要的方面,比如asp.net core這一塊。然後平時的興趣也是一個方面,比如我會學習一下像webrtc音影片的技術。還有就是有意向的方向,比如wpf,maui這些。 -
怎麼看待加班的
該加還得加啊,不然趕不上進度他能問出這個問題,意圖是什麼已經明顯了,要麼加班,要麼走人。不管我想不想進去,要想繼續的話,這裡只有這樣回答。
-
職業規劃,技術規劃、工資規劃
asp.net core本職工作這邊還是打算繼續精進。還有net aspire雲原生開發也打算去學習一下。然後桌面的話,wpf還是要繼續學習,畢竟是第一個現代化桌面框架(也是最成熟的)。工資還是希望比目前高几千,因為這4年就漲過一次工資,而且很少。 -
有什麼想問的
我沒看出來什麼動向,就說沒什麼想問的了。
複試
大概1個小時後,人事叫我做了一個MBTI性格測試,下午2點多,大概3個小時後,人事發來複試通知。這時我在上班,協商了時間後,複試在晚上8點開始。複試由年輕人事+40多到50中年技術總經理組成。雙方透過騰訊視訊會議進行。令我比較意外的,他很瘦。
複試比較少談論具體技術,感覺主要是個人的經歷和綜合能力提問。
-
首先人事介紹了一下他,然後讓我再自我介紹一下
我再複述了一下。他問,你畢業以後,包括實習,一直都在這家公司嗎?我說是的。 -
你對我們公司有什麼瞭解
我不是很瞭解。就只有上午發了一個公眾號過來時,進去看了一下。但是我看不懂那些業務。對方問,也就是說你對我們公司沒有多少了解是吧?我說是的。 -
怎麼評價直接上級
在他之前有一個老的組長,他比前一個組長年輕。他使用新技術比較多,來了之後我們就轉向了asp.net core。對方問,更立體一點,我說,可能他是後面來的,不是很關心我們吧。其實我是想很隱晦的說,他只顧讓我們加班完成他的業績和工資,剋扣我們的補休和假期,對我們沒有任何好處。前一個組長我提出這件事之後,他就不再叫我們加班了,但後面這個,不知道他是察覺不到,還是天降系地位不穩怎麼回事,對抗了好幾次,仍然沒有變化。
-
你所在小組有多大
大概有8人吧。開發有60-70,工程有50-60人左右。他問你們小組有多大,我說有8人。我們小組比較小,重心不在這邊。估計得等以後甲方這個業務專業的上司上位。 -
你怎麼看待AIGC
AIGC我用openai比較多。國內通義靈碼前幾周大幅度降價,我也去調了一些sdk。結果發現GPT和想象中的人工智慧差別有點大,算不上人工智慧。因為GPT伺服器只是根據我們的請求和歷史對話資料給出響應,而對話的歷史資料則需要我們儲存在本地,或者另一個伺服器,詢問時一起提交。GPT給出什麼回答,取決於我們提交多長的歷史資料,這看起來更像是以前機器學習用貝葉斯機率來給出回答。不過實際上還是挺好用的。平常用得很多。對方問你覺得那個好用一些?我說openai好用一些。對方問你怎麼判斷?我說,有時候我有疑問,openai解答得的更準確。我需要他完成一個任務的時候,openai完成的更完善,效果更好。
對方問你只用過這兩個嗎,還用過其他的嗎?你有了解DLLE嗎?我說不了解這個。對方說這個也很厲害。
通義最大的問題應該在於要求完成某個功能時輸出牛頭不對馬嘴,而且幻覺嚴重一點。AIGC確實很厲害,但是從我呼叫api介面的過程來看,這和我們想象中的人工智慧差別有點大啊。估計機器人老婆是沒指望了
-
你的簡歷裡面說了modebus,你簡單說一下吧
modbus主要是硬體小組在使用他們採集感測器資料,上傳到資料庫。我只是因為有相關性,下來了解了一下。modbus主要是分為兩個,一個是modbustcp,一個是modbusrtu。modbustcp使用網路來傳輸。modbus把裝置分為主機和從機,主機透過請求碼讀取從機的資料。除開異常碼的話,好像是有8個。然後從機的資料儲存分為4個資料棧。分別是線圈、開關、只讀暫存器,可讀可寫暫存器。線圈和開關用一個bit儲存資料,暫存器則是16位的。modbus協議報文比較長,最大好像是允許2的32次方個資料儲存,每個資料型別都是。但實際上一般都是每個資料型別只有10000個資料儲存空間。這裡我不能說答得很好。因為我沒在工作中用過modbus協議,所知完全是自學的,記憶不是很牢固。這兩個協議我自己都手動實現過,用起來應該不成問題 基於WebSocket的modbus通訊合集 。我是否應該去買個微控制器實踐一下呢?modbustcp還好,可以用網路操縱,但modbusrtu就麻煩了,我的電腦沒有串列埠。
-
你第一個簡歷寫了winform,裡面應該涉及一些硬體、感測器資料採集
實際上硬體資料採集是我們這邊的硬體小組做的。winform資料採集軟體其實是用來給技術員填報資料使用的。他們填報之後,會透過訊息佇列把資料上傳到資料庫。我感覺這可能是他比較失望的一個點,畢竟我沒真正做過硬體資料採集
-
你最新的那個專案分為前端,後端,實時資料3個端,你主導哪個
我並沒有主導哪一個,這都是組長主導。但是我3個端參與都比較多,參與最大的是組長,我算是參與第二多的吧。不知道他是不是想找一個負責過專案開發的
-
這個專案你有什麼收穫
最大的收穫應該是實時資料那個程式遇到一個webapi託管服務記憶體洩漏問題。我寫了一個後臺託管服務,每秒鐘執行一次,從redis取字串型別的資料,經過計算後,利用滑動視窗進行預警判斷。10秒內資料由有5次超過界限值就預警。但是執行之後記憶體就一直往上漲。我判斷是記憶體洩漏。最開是以為是在while迴圈內建立了太多物件,因為這沒有跳出當前函式,對變數的引用一直存在,物件無法釋放。然後我將計算放進一個新的函式,在迴圈內呼叫那個函式。這樣應該能解決問題。但問題還在。然後我就去找關於GC的資料。然後瞭解到GC分為0,1和2,供3代託管堆。我以為是物件慢慢從0代提升到2代,在2代堆積。就在每次迴圈結束手動呼叫GC。問題確實解決了,但GC會佔用5ms左右時間。這總是不太好。實際上這是誤打誤撞,我的分析不完全對,但真正原因不是這個。
然後我到網上提到這個問題,遇到了一個學習了.net高階除錯的人。就轉儲了一個fullDump檔案和pdb檔案給他,他分析之後,找到了原因。是固定物件堆沒有回收的原因。因為redis那邊使用的是字串存json,所有我只有一次性取出那個鍵,返回的資料大概90KB,超過了固定85000位元組,物件就被分配到了固定物件堆,只有2代GC發生時才會被回收。然後我這個程式基本沒有小物件能存活到第二代GC,所以這些大物件一直得不到回收。這不算經典意義上的記憶體洩漏,但結果還是隻能手動呼叫GC來解決。他問你是怎麼找到的人的呢?我說是在看一線碼農的影片,然後剛好遇到相關的事情,就留意上了.net高階除錯技術,在網上發了相關博文(實際是上一篇面試裡面提到的),然後有人就來問。
他問,所以說這是在專案中令你映像比較深刻的事情吧?我說對。
可能在網上實時交流技術這種事情比較少,可遇不可求?還是他在想公司的技術問題有哪些渠道找人解決?
-
最後人事問,你現在還在職,假如錄取的話,多久能到
不太確定,可能交接1周,回家花三四天看望一下家人就沒什麼事了。 -
你還有什麼想問的嗎
我說目前沒什麼想問的。我感覺這個問題很突兀,可能不算什麼好訊息,就這樣回答了。我之後從同學那瞭解到,對方有意向的話,結尾應該會問期望薪資。所以這是涼了
總結
- 自己這半年的學習還是有效果的,應該說技術追上來了
- 這次聚焦於專案和技術經歷,所以比較順暢
- 按照對方技術和人事私下以及面試的提問來看,他們可能時想找一個沒結婚、家庭沒多大負擔、能夠加班、能做專案、能到現場的人。(誰說的.net不加班的?)
- 我應該專注於簡歷上已經寫明的技術和經歷。他們是按照這個提問的。
- modbus的問題需要解決一下,最主要是怎麼實踐。
- 日誌也要研究一下,日誌平時用的太少了
- 要主導專案開發的經歷,這點是個問題。沒有機會啊
- 面試提綱、技術總結、專案總結還是要多想多寫多讀,做到熟悉
- 簡歷不能包裝,要不然萬一跨省工作,試用期的處境就不利了,很難退回來。
- 之後一週要消化一下這次面試
- 最後,這次面試我感覺還是展示出了自己的已有的能力,但是倒在了複試。也看到了技術以及專案上缺乏之處,接下來還是要補足這塊。聽說網際網路已經卷成紅海了,我在想還要不要找網際網路的?或許我現在還並沒有多大的選擇能力。年齡問題,這次他們似乎就想找沒結婚的。所以沒結婚工資天然有更低一等的潛力,但是現在社會並不愛婚姻,婚姻也不愛成員,我很迷茫。
追加
我弄錯了一個名詞。"記憶體洩漏"那個地方,應該是物件配分配到了大型物件堆,而不是固定物件堆,@successgo指出了這個問題。我到MSDN翻閱了一下,確實是記錯了。固定物件堆這個概念也是存在的,不過我沒接觸過。
如果物件的大小大於或等於 85,000 位元組,將被視為大型物件。 此數字根據效能最佳化確定。 物件分配請求為 85,000 位元組或更大時,執行時會將其分配到大型物件堆。
固定物件堆則是指的這個POH 的內部結構