如何面試Python後端工程師?


謝邀。我之前在豆瓣負責過一段時間我們組的技術面試。由於現在不再去面試,可以爆一爆。

1. 我從來不問google可獲得的答案的問題, 只是問問面試者「在過去的工作中,遇到的Ta認為最有成就感的一件事情是什麼」和「如果出現了一個google不到的問題,你會怎麼解決」這樣的問題。

2. 我從來不問操作系統等和Python無關的話題,首先是我不怎麼問和工作太無關的話題,有些東西用不到很多就被會遺忘,挑起來這種問題其實挺無聊;其次我是非計算機專業畢業,問的東西說不定我自己都沒有把握,那就不出來獻醜了。我只關注面試者的學習能力和解決問題的方式,說白了,是不是就是看他是不是「聰明的人」。

3. 不問面試者的短處。我在自己被面試的時候有過這種精力,面試者問他擅長的內容,我不一定搞的定,如果反過來面試Ta,我也會滅掉Ta。所以我會儘力尋找面試者的優勢和優點,尤其是對方已經明確承認。其實很多經驗和能力,只是需要一個機會和環境,所以我不想放過任何一個合適的人。

4. 面試者不會Python也沒有關係。面試者的主動性和學習能力覺得更重要,如果他在其他領域能證明做的不錯或者能讓我感覺到這個一個未來有潛質成為優秀工程師的人,不會Python沒有關係。 嗯目前看來,我沒有看錯過。

5. 我從來不問Python語法這種看書和google就能學會的問題,我只想了解Ta是否願意去學。舉個例子,我會讓面試者「講講日常開發中都用到了那些Python內置的模塊」,原因在我的專欄「Python之美 - 知乎專欄」的 Python不能不知的模塊 - Python之美 - 知乎專欄中有寫,基本上說完我就能評估出他的能力和風格,繼而就是再問一些問題去驗證我的評估是不是準確。

6. 最後,我一般都會和面試者細聊一個Ta認為在過去的工作或者自己開源的項目中最熟悉的一個,從項目設計、踩過的坑兒、開發周期以及如何安排、如何確定需求、如何和其他人協作等方面,最後評估下Ta是否能很容易的融入到我們現在的團隊,大家是否可以接受Ta,對工作不負責的、沒有用心工作的、沒有團隊意識的、溝通能力有缺陷的就放棄掉,對性格上容易發生衝突的、不適合團隊合作的我就得考慮下,未來也會如實反饋給HR。


更新:討論區挺熱鬧,有人說好簡單,有人說好難,其實我覺得這隻適合面試2~3年工作經驗的後端工程師。真的沒有問
很難的題目,只是可能你平時沒有注意。
在這裡我推薦幾本書吧
python參考手冊,絕對讓你更上一層樓
圖解密碼技術,密碼入門不二之選
mysql技術內幕第五版,有點厚當手冊讀讀,要有耐心,高性能mysql也強烈建議讀讀
effective tcp/ip programming

為什麼評論區有這麼大差異?我想是個人經歷不一樣吧,如果是搞web的對操作系統這塊和密碼技術會偏弱,但如果是系統工程師或是遊戲服務端這塊會明顯偏強。


吃午飯的時候我就一直在想這個問題,我覺得重點不是Python而是後端工程師,因為Python只是系統的一部分,linux基礎操作要熟吧,sql要懂吧,消息隊列要知道吧,git要熟悉吧......木桶理論,每一環都不能落下,精通其中一兩環就更好了。基礎功紮實,新東西學得快,代碼寫得溜,命令敲得順,bug解的好,媽媽再也不用擔心我天天加班了~~~

一.語言
1.推薦一本看過最好的python書籍? 拉開話題好扯淡
2.談談python的裝飾器,迭代器,yield?
3.標準庫線程安全的隊列是哪一個?不安全的是哪一個?logging是線程安全的嗎?
4.python適合的場景有哪些?當遇到計算密集型任務怎麼辦?
5.python高並發解決方案?我希望聽到twisted-&>tornado-&>gevent,能扯到golang,erlang更好

二.操作系統
可以直接認為是linux,畢竟搞後端的多數是和linux打交道。
1.tcp/udp的區別?tcp粘包是怎麼回事,如何處理?udp有粘包嗎?
2.time_wait是什麼情況?出現過多的close_wait可能是什麼原因?
3.epoll,select的區別?邊緣觸發,水平觸發區別?

三.存儲
存儲可能包含rdbms,nosql以及緩存等,我以mysql,redis舉例
mysql相關
1.談談mysql字符集和排序規則?
2.varchar與char的區別是什麼?大小限制?utf8字符集下varchar最多能存多少個字元
3.primary key和unique的區別?
4.外鍵有什麼用,是否該用外鍵?外鍵一定需要索引嗎?
5.myisam與innodb的區別?innodb的兩階段鎖定協議是什麼情況?
6.索引有什麼用,大致原理是什麼?設計索引有什麼注意點?
redis相關
1.什麼場景用redis,為什麼mysql不適合?
2.談談redis的事務?用事務模擬原子+1操作?原子操作還有其它解決方案嗎?
3.redis內存滿了會怎麼樣?

四.安全
web安全相關
1.sql注入是怎麼產生的,如何防止?
2.xss如何預防?htmlescape後能否避免xss?
3.csrf是什麼?django是如何防範的?

密碼技術
1.什麼是分組加密?加密模式有哪些?ecb和cbc模式有什麼區別?為什麼需要iv向量?
2.簡單說說https的過程?
3.對稱加密與非對稱加密區別?
3.如何生成共享秘鑰? 如何防範中間人攻擊?

五.雜
是否關注新技術啊?golang,rust是否了解?numpy,pandas是啥鳥?
是否緊跟時代潮流?逛不逛微博,刷不刷知乎?

可能你覺得我問的好細,但這好多都是平常經常遇到,並需要解決的,細節更能體現一個人。

如果你覺得小kiss,歡迎投簡歷給我yihaibo@longtugame.com,龍圖遊戲運營支持中心數據分析部招人;覺得有點問題,那還等什麼,趕快來和我交流交流。


面試其實還是要區分對待的,行內老牛和新人在不同的方向上都有各自的特點,包括老牛們豐富的經驗、全面的眼界等等,也包括新人的銳氣和新的思維觀念。


根據工作經驗要求劃分基本的可以分為兩大塊吧:

1)、 先了解其項目經歷,項目中的職責,看其對自己模塊,整體框架及業務的了解程度。再根據他接觸過的知識點拓展來問。接著拿現在項目中遇到過一些問題問問,聽他的解決思路。也可拿以後經常用的技術來問問。最後再補問一些他沒接觸過的技術知識來問。主要以聽為主,適當的引導。

2)、 對那些項目經驗不足的新人,適當的增加基礎技術比例,比如

- 談談裝飾器,迭代器,yield,內存管理等

- Python高並發解決方案

- 計算密集型,IO密集型任務怎麼辦

- Tcp/Udp協議,Http協議

- sql,cache, nosql

- web安全相關,sql注入,xss等


總體來說,不管對於老牛還是新人,紮實的基礎和靈活的思維,都是必要的。

但選擇一個合適的同事其實還有很多因素,包括一個新人的到來能帶給團隊活力,或者你正好需要一個認知全面,把控力十足,思路嚴謹的老同志···


來自Avazu Holding 吳清波


- 「你覺得Python4的語法會和Python3一致嗎?」
- 「不覺得」
- 「明天來上班吧」

==== 2015-10-19 更新 ====
上面是某次飯後消遣的段子,意在諷刺官方的Python2-&>3對於用戶並沒有實質提升的升級,反而帶來無數麻煩。

如何面試XX,這取決於你提供給的崗位對於人員的要求,Web,資料庫,系統,網路,測試均會或多或少的涉及。你想刨除這些領域相關的問題來一些客觀的Python乾貨?Google 搜索 Python Should Know 會得到很多有用的文章(Ten Things Python Programmers Should Know,https://zhehaomao.com/blog/2011/07/27/python-programming.html),作為考題也是不錯的選擇。Python最忌像一般C系的語言對待,它有許多idioms,不知道或者不了解他們最直接的壞處是複雜度和維護度的提升。當然這些都是軟問題,因為都是一交就會的東西(在基本素質夠硬的條件下,這就不展開了)。面試最核心的是你覺得你們在業界福利水平能夠吸引到怎樣的一群人,然後畫一條線(出一套和工作內容緊密相關的面試題目)圈出自己想要的人才。如果能力有限吸引不到足夠素質優秀的人才,不妨降低難度,選擇具有潛力可挖的同學來。當然,這又屬於另外一個話題了。

所以這是我抖得另外一個關於「面試」的機靈。


解釋一下 WSGI 和 FastCGI 的關係
解釋一下 Gevent 和 threading / multiprocessing 的關係
解釋一下 cookie 和 session 的關係,以及 xsrf 的攻擊和防範方法
解釋一下 Django 和 Tornado 的關係、差別
考考資料庫知識,SQL 語法和調優,SQLAlchemy 的用法


問他認識我不


『github id?』


1 個人感覺做題這種事情少做點。。或者參考的比重不用那麼高
2 問問題的話,應該先問他的經歷,然後拓展這他接觸過的知識點來問
3 對於一些現在項目或者以後經常用的技術,問問

面試時間太短,還是以交流為主,畢竟招人不僅僅是技術呀


以上各位都是從面試者的角度答覆的,我從被面試者的角度,記錄下自己被問到的問題【剛剛從成都到上海找工作】:

先夾帶點私貨:本人1999年入行,最近3年的項目經驗參見這個回答華為的員工工作幸福嗎? - 老王的回答中的【1、在華為研發8年的收穫是什麼:學習新知識的能力】,歡迎推薦上海的python工作機會。個人對這個行業的現狀是這樣理解的,對年薪30萬以下的程序員,沒有一組英文關鍵詞搜不到的答案,如果搜不到,就加個stackoverflow試試。從來上海之後的面試過程看,似乎面試官並不認同這個思路。只好重新回到刷題庫的方式上,以下為面試問題的整理,持續更新。

1、lock free:
陳碩的《linux服務端編程》裡面,講過一種不加鎖的方案:原子級操作,他的muduo庫中就有一個實現,用於實現+1操作【兩年前看的,如果有誤歡迎指正】。
考慮到面試官的python開發背景,應該指的是CAS實現lock free,以下內容參考了樂觀的並發策略——基於CAS的自旋
上文中有示意圖,我只寫下個人理解:
1.1、CAS是Compre And Swap的縮寫,意為比較並交換
&>對於不同線程間共享的數據,在對象/實例中保存一個副本
&>每次賦值之前,先拿副本和共享數據進行比較
&>如果結果一致,用一個原子級操作為共享數據賦值【同時,修改副本值】
1.2、CAS的不足:
&>只能保護一個數值,如果有多個,只能依靠互斥鎖來保護
&>對ABA類的問題,只能靠每次修改都增加版本號來解決【印象中&裡面講過多版本的機制】
&>長期自旋,浪費CPU資源 -- 這一點沒看懂,上文提供的示例代碼中getAndIncrement函數用了for(;;)

2、對mongodb中文檔中的數組類型變數如何加索引:
官方文檔:Multikey Indexes
stackoverflow上的相關問題:mongodb: Multikey indexing structure?
以及MongoDB索引類型:MongoDB Indexes (part 1)

3、接問題2,面試官問數組類型field,數量達到10萬、100萬時效率如何?
待續

2016-04-24更新:
上面的內容是4月15號寫的。
4月18號面試,兩輪面試後當天確定錄用,這次面試沒問技術細節,這個坑暫時不填了,安利下高票答案推薦的《Python參考手冊》。


語言, gil/mro/metaclass/descriptor/corountin 變著法子問吧,閉包和裝飾器可以一塊問,當然也可以結合項目經驗,如果做過後端api的,幾乎沒有不用到decorator的吧,說說staticmethod和裝飾器的區別啊,寫一個bottle綁定 url path的 decorator 或者口述一下原理,等等,這個基礎並不一定要對方完全覆蓋,但如果都答不上來肯定不行。

系統,對linux有多了解,做服務端開發,poll/select 得知道吧,負載均衡的幾種演算法要聽過把。

通信協議,tcpip http 等等,具體問題比如restfull 風格的api怎麼寫,網頁嵌入的im原理等

工程思維,大局觀,個人追求。這個結合對方實際經驗來問,問的越犀利越好。抓住項目中的critical point,候選人擔任了什麼角色,如何去解決,等等。

另外 我公司招python程序員,坐標北京三里屯,想來的小夥伴可以私信我


我有另外一個思路,就是不問具體python裡面的問題。尤其是一些很深的問題,因為可能大部分的項目不設計優化語言本身,甚至高級技巧也是很難碰到的,而是讓其快速解決具體問題。
因為用到python做開發就是注重開發快迭代快上手容易的特性(如果你用django當我沒說)

所以面試就是解決具體問題:

我參加過一個面試當時面試官直接讓我寫一個爬蟲爬某網站,我覺得這樣考還挺不錯的。
類似的問題包括處理日誌,配置一些自動化運維的場景,寫自動化測試,做個短鏈接服務等等。。。python程序員我自己感覺涉獵要非常廣,基本思路就是實際的問題-》解決方案(用到哪些工具,什麼場景用什麼)-》驗證/測試/自動化

如果是我來面的話我可能還會問一些編程基礎的,數據結構的使用方法,rush condition的處理方法,scale的方向,思路等等。。。畢竟寫得快是一方面,寫出來的東西能用是另外一方面。
如果解決問題迅速,寫的快,給的實際問題都能很快找到解哪怕是方向的話,那基本上我會覺得這個面試人解決問題的態度和能力都比較強,可以進一步考察~


1, 計算機基礎知識。包括:操作系統相關的,進程間通信,協議的本質(結合計算機網路等)
2, 個人對編程的興趣/學習能力,或者更進一步說,對問題的解決能力。從做過的項目,寫過的博客,開源項目等來看,當然更能看出來對問題的了解深度和實際代碼能力
3, 性格/責任意識。可以從做過的項目擔任的角色以及言行來看

個人認為,所有開發相關的面試,都應該包括 上面這些,基本能看出來一個人的真實水平和靠譜程度。至於樓上說的那些具體技能點,我倒覺得不用太在意。


作為一個寫python時間不長但是又一直幫公司面試python後端的人來說,我會問一些簡單的問題。
1)怎麼寫?implementation是最廉價的,隨便請一個高中生都能給你寫兩行,可是是不是pythonic?
2) Decarator
3) Yield/Generator
4) GC
5) 你丫寫過最好的一段代碼
6)你丫桶過最大的簍子
7)這個也是最重要的,除了python你還會別的么... 我接觸過很多號稱寫了五年python的人,其他東西一概不會,這種人我一般不敢要...
8)碰到過bottleneck么? 怎麼解決?


同求!搞3年android!想再學一門後端語言~~


推薦閱讀:

在面試中碰到面試官問你「為何不是黨員」時,該如何回答?
有哪些你曾面試過的人給你留下了深刻印象?
計算2的64次方有什麼特殊技巧?
產品經理的群面中,面試官比較喜歡哪個角色?
如何面試一個產品經理?如何判斷一個產品經理是否是一個很牛的產品經理?

TAG:面試 | Python | 後端工程師 |