记录第一次面试
Hello,我是 Alex 007,一個熱愛計算機編程和硬件設計的小白,為啥是007呢?因為叫 Alex 的人太多了,再加上每天007的生活,Alex 007就誕生了。
看標題應該就知道了,這是我第一次面試,在這里記錄一下。
先來看一下簡歷(小菜雞一個,大佬輕噴):
面試官:先來一個簡單的自我介紹吧。
Alex:好的,面試官你好,我叫Alex,今年十九歲,目前就讀于中華大學,所學專業是人工智能與大數據。
在校期間對于專業課方面非常重視,有扎實的編程基礎,拿過兩次校級獎學金,大一就了獲得藍橋杯A組二等獎,帶隊參加過很多比賽,像大學生創新創業、華北五省等等,也拿過很多獎項。
技術能力方面,對Python比較熟悉,經常使用Django框架,C++和Go有一些了解,C++是學校的必修課,Go是我自學的。另外對于前端相關的技術,比如JavaScript、jQuery、BootStrap、Vue都有些了解,還自學過Linux操作系統,熟悉一些基本的操作和Vim指令,數據庫方面經常用的是MySQL和Redis。
另外再大學期間還加入了一個社團,Matrix工作室,因為成員比較多,不方便管理,各種工作流程都不是很規范,我就開發了一套工作室官網和管理系統,用到的技術有Django、jQuery、BootStrap、RBAC組件等等,目前這兩個項目已經初步做完了,因為我們還沒開學,所以打算再繼續優化,等開學返校之后再測試上線。
大一下學期開始在中華小學實習,擔任機器人社團指導老師,主要是教三年級到六年級的孩子們一些基本的Python編程、玩樹莓派機器人和展示一些AI方面的小玩具等等。
我個人是非常熱愛編程,而且適應能力強,單身可加班,996無壓力,我想面試的崗位是Python實習生,以上就是我的自我介紹,請多多指教,謝謝。
面試常規操作,上來先自我介紹,這里我準備了兩版,一個是40秒 ~ 一分鐘快速版,另一個是一分半 ~ 兩分鐘版,面試官沒有說具體的時間限制,就用了比較詳細的版本。
面試官:你簡歷中寫的這幾個項目,覺得哪個是功能比較完善的呢?
Alex:我覺得比較完善的是工作室的官網和管理系統,因為這兩個是真正要投入使用的,所以做得比較詳細。這兩個項目其實屬于比較簡單的類型,不用考慮高并發之類的問題,主要集中在博客系統、權限管理之類的功能實現上。
回答面試官的問題,然后在答案中提到高并發這個比較熱的詞,引導面試官朝這個方向問,當然提前要預備這方面的知識。
面試官:這兩個項目大概有哪些功能?
Alex:工作室官網這個項目,首先第一個功能是針對新加入工作室的成員的培訓,主要也是大一的同學,沒有學習的途徑和資源,每加入一批新成員我們就要安排幾次培訓,費時費力,所以我們一些學長學姐就把自己的學習歷程總結整理到網站上,幫助新成員快速學習。第二個功能也是針對新成員的,我們以前納新都是先宣講,然后發紙質的報名表,這樣效率非常低,因此我們制作了簡歷系統,想要加入工作室的學生可以直接投遞簡歷。第三個功能是一個在線答題的平臺,主要是用于對新成員的考核和平時的練習。第四個功能是一個博客系統,工作室的成員可以在這個平臺上寫博客,做筆記,同時引入了積分制度,寫博客可以賺積分,積分主要用于做績效考核和等級劃分。
管理系統這個項目就是用于統計工作室所有成員的信息,學習情況,還有等級、部門 、團隊的劃分這些功能,通過RBAC組件可以對不同的成員賦予不同角色而擁有不同的權限。
面試官沒有問我們引導的問題,隨機應變嘛,問啥說啥,針對簡歷上項目的功能要提前準備好,同時通過一些專業術語繼續引導面試官提問的方向。
面試官:你剛才說這兩個項目都是你負責的,那你在項目中主要負責那一塊呢?
Alex:我主要負責的是搭建項目整體的框架,實現一些主要的功能,前后端的框架都是我搭建的,但是并不完善,前端像頁面的美化、特效,后端像登錄、token驗證這些功能交給專門做前后端的人去做,之后我就負責前后端的聯調,像API、數據格式的定義這些工作。
面試官:在做項目的過程中有沒有遇到什么困難?
Alex:在工作室官網這個項目的開發過程中并沒有遇到什么太大的困難,都是一些很常見的功能,而在管理系統的項目開發過程中,一開始因為對Django聲明周期不太熟悉,導致在開發Stark組件的時候有很多莫名其妙的錯誤,還不知道問題出在哪,后來我們還是積極查閱資料,讀了很多大佬關于Stark組件的博客和源碼,重新梳理了流程才得以解決。在線教育平臺這個項目中遇到的問題就比較多了,比較麻煩的是跨域的問題,像工作室的官網和管理系統并不是前后端分離開發的,所以在解決跨域問題上沒有什么經驗,也是查了很多博客,最后在后端Django加了一個中間件,通過process_response添加允許的操作才得以解決。
關于項目的提問大概就到這,1.項目有哪些功能,2.項目開發過程中遇到了什么困難,都是怎么解決的,這些問題在往簡歷上寫項目經歷的時候就得準備好。
面試官:對Python的進程、線程、協程有哪些認識?
Alex:先說進程吧,我們寫的代碼并不能直接運行,只有將程序裝載到內存中,操作系統為它分配資源才能運行,這種執行的程序就叫進程,進程是計算機最小的資源分配單位;而線程是操作系統能夠進行運算調度的最小單位,它被包含在進程之中,是進程中實際工作的單位,一個進程可以并發多個線程,每條線程并行執行不同的任務,當然是在不考慮GIL鎖的情況下;而協程一種基于單線程實現并發的手段,是由用戶程序自己控制調度的,在單線程內開啟協程,一旦遇到IO操作,就會從應用程序級別控制切換,以此來提升效率。
面試官:你剛剛提到了GIL鎖,可以簡單說一下么?
Alex:GIL,就是Global Interpreter Lock,中文名叫全局解釋器鎖,這是一個互斥鎖,用來防止多個本機線程同時執行Python字節碼。GIL只存在于CPython中,存在即合理,CPython的內存管理不是線程安全的,所以GIL鎖也是必要的。每次執行Python程序,都會產生一個獨立的進程,在這個進程中,不僅有該進程開啟的線程,還有解釋器開啟的線程,比如垃圾回收這種解釋器級別的線程。所有的線程運行在一個進程內,線程的任務需要將代碼傳給解釋器去執行,而數據都是共享的,這樣就到導致線程不安全。舉個簡單的例子:對于同一個數據100,可能線程1執行x=100的同時,而垃圾回收執行的是回收100的操作,解決這種問題沒有什么高明的方法,就是加鎖處理。所以GIL可以保證Python解釋器同一時間只能執行一個線程。
終于按照引導的內容提問了,開始背答案。
面試官:然后你說一下什么是裝飾器、生成器和迭代器。
Alex:首先說一下迭代器吧,迭代器對象就是實現了iter() 和 next()方法的對象,其中iter()返回迭代器本身,而next()返回容器的下一個元素,在結尾處引發StopInteration異常。而生成器是創建迭代器的工具,在Python中,一邊循環一邊計算的機制,稱為生成器(Generator)。生成器對延遲操作提供了支持,所謂延遲操作,是指在需要的時候才產生結果,而不是立即產生結果。裝飾器本質上是一個Python函數,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外功能。裝飾器就有很多應用場景了,比如可以在Web開發中用于檢查某個用戶是否有權限去做某件事,這種授權檢測被大量使用在Django、Flask這種Web框架中。另外裝飾器也可以用于打印日志,記錄程序運行時間。
這部分其實不太熟,瞎編了好多,這是結合當時說的和事后查的資料總結的答案。
面試官:那你在項目中有沒有用到剛才說的裝飾器做登錄認證的權限驗證?
Alex:這個倒是沒有用到,在工作室官網和管理系統中直接用的Django自帶的權限驗證組件,在線教育平臺這個項目用的是Django Rest Framework的權限驗證組件。
面試官:如果讓你自己去寫一個登錄驗證的功能,你會怎么去實現?
Alex:首先要獲取前端發送過來的用戶名和密碼,然后去數據庫中驗證數據合法性,驗證通過之后,給用戶生成一個token,將用戶的基本信息+token一方面存放到Redis中,另一方面返回個客戶端。當用戶再次請求的時候,必須攜帶token值,后端從數據包中獲取token,然后在Redis中獲取用戶的基本信息并封裝到request中。如果請求中沒有token值的話說明用戶未登錄,或者token已經過期。這樣,通過token和Redis可以實現用戶的登錄驗證。
這部分面試官估計是覺得我裝飾器掌握的不好,想問我怎么用裝飾器來做一個登錄驗證的功能,結果我一通胡扯,還好沒被打斷,又詳細的問了一遍。
面試官:那這個功能你打算用什么實現?裝飾器還是什么?
Alex:我覺得這個功能屬于比較簡單的類型,不需要用到裝飾器吧,寫個函數就行了,實在想用裝飾器也可以。
哈哈,裝飾器實在忘記了,極力回避。
面試官:不用裝飾器的話那這個功能你打算怎么實現?
Alex:其實可以寫一個驗證中間件,如果請求中攜帶了token的話,就按照之前說的那種方式做驗證,沒有的話就正常走。
腦袋靈光一下,想到了可以用中間件。
面試官:簡述一下Django的生命周期。
這個我就不敘述了,直接貼圖:
面試官:除了Django這個框架之外還有沒有了解過其它的Python Web框架?
Alex:目前還沒有,因為我自覺Django掌握的還不是很熟練,想要先把Django吃透,再去了解其它的框架,當然選擇Django也是有原因的,首先就Django是最負盛名且最成熟的Web框架,而且擁有豐富的組件,可以自由擴展。其它的Web框架,比較熟悉Flask、Tornado的單詞書寫。
嘿嘿,開個小玩笑。
面試官:那假如說公司里有一個Tornado的項目讓你接手,大概需要多少時間?
Alex:這個要看項目的復雜程度了,如果不是很深入的話,可以很快的入手。假如說像Matrix工作室的官網和管理系統這樣比較簡單的,大概需要半個月左右,但在線教育平臺就比較復雜了,用到了一個擴展的第三方庫,時間大概有一個月左右。
這個問題我沒聽全,問的是接手一個Tornado項目,我就聽見了項目需要多少時間,哈哈,結果也是亂說一堆,面試的時候一定要把音量調大。
面試官:在前后端分離的項目中,交互經常用到RestFul規范,簡述一下吧。
這我也不多說了,直接上答案:
每個URL代表一種資源,URL中盡量不要用動詞,要用名詞。
GET/POST/PUT/DELETE/PATCH
https://www.bootcss.com/v1/mycss
https://www.bootcss.com/api/mycss
https://www.bootcss.com/v1/mycss?page=3
https://www.bootcss.com/v1/mycss
1* 信息,服務器收到請求,需要請求者繼續執行操作
2* 成功,操作被成功接收并處理
3* 重定向,需要進一步的操作以完成請求
4* 客戶端錯誤,請求包含語法錯誤或無法完成請求
5* 服務器錯誤,服務器在處理請求的過程中發生了錯誤
GET請求 返回查到所有或單條數據
POST請求 返回新增的數據
PUT請求 返回更新數據
PATCH請求 局部更新 返回更新整條數據
DELETE請求 返回值為空
返回值攜帶錯誤信息
如果遇到需要跳轉的情況 攜帶調轉接口的URL
面試官:狀態碼403個404代表什么?
403:表明對請求資源的訪問被服務器拒絕了
404:表明服務器上無法找到請求的資源
面試官:那502和503呢?
502(錯誤網關):服務器作為網關或代理,從上游服務器接收到無效響應
503(服務不可用):服務器目前無法使用(由于超載或停機維護)。
面試官:簡述一下三次握手和四次揮手。
建立雙工通信,確保雙方都能收到對方的信息,所以需要3次握手。
第1次握手:建立連接時,客戶端發送syn包(syn=x)到服務器,并進入同步已發送狀態,等待服務器確認;SYN:同步序列編號。
第2次握手:服務器收到syn包,必須確認客戶的SYN(ack=x+1),同時自己也發送一個SYN包(syn=y),即SYN+ACK包,此時服務器進入同步已接受狀態。
第3次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=y+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。
全雙工關閉需要客戶端和服務器發送和接受都關閉,但是關閉連接時,當Server端收到FIN報文時,很可能并不會立即關閉SOCKET,只能先回復一個ACK報文,所以需要4次揮手
第1次揮手:客戶端進程發出連接釋放報文,并且停止發送數據。此時,客戶端進入FIN-WAIT-1(終止等待1)狀態。
第2次揮手:服務器收到連接釋放報文,發出確認報文。服務端就進入了CLOSE-WAIT(關閉等待)狀態。TCP服務器通知高層的應用進程,客戶端向服務器的方向就釋放了,這時候處于半關閉狀態,即客戶端已經沒有數據要發送了,但是服務器若發送數據,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個CLOSE-WAIT狀態持續的時間。
客戶端收到服務器的確認請求后,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送連接釋放報文(在這之前還需要接受服務器發送的最后的數據)。
第3次揮手:服務器將最后的數據發送完畢后,就向客戶端發送連接釋放報文,FIN=1,ack=u+1,由于在半關閉狀態,服務器很可能又發送了一些數據,假定此時的序列號為seq=w,此時,服務器就進入了LAST-ACK(最后確認)狀態,等待客戶端的確認。
第4次揮手:客戶端收到服務器的連接釋放報文后,必須發出確認,ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態。注意此時TCP連接還沒有釋放,必須經過2MSL(最長報文段壽命)的時間后,當客戶端撤銷相應的TCB后,才進入CLOSED狀態。
服務器只要收到了客戶端發出的確認,立即進入CLOSED狀態。同樣,撤銷TCB后,就結束了這次的TCP連接。可以看到,服務器結束TCP連接的時間要比客戶端早一些。
面試官:說一下什么是TIME-WAIT和CLOSE-WAIT。
由于socket是全雙工的工作模式,一個socket的關閉,是需要四次握手來完成的:
接下來就是對一些工具的提問,像是Git、Nginx和Jenkins,也就是問問有沒有用過。然后問了一下排序算法和自我評價。
面試差不多到這里就結束了,感覺還有很多地方需要繼續學習啊。
總結
- 上一篇: 198. House Robber
- 下一篇: 84. Largest Rectangl