咱們組的開發人力一直比較緊張,今年春節後,高層終於給了幾個headcount,咱們能夠開始招人了。從三月初咱們就開始找簡歷,渠道有拉鉤,內推,我司本身的招聘網站和智聯等。簡歷篩了不少,也打了不少電話,叫過來面試了不少人,但是到目前爲止,已經三個月了,咱們只招到了兩我的,這兩我的都是內推來的。html
我負責第一次電話面試,若是電話面試以爲能夠,咱們會叫過來 作一份筆試題,而後我會針對筆試題再進行提問。咱們想要招聘的,是一批中級.net開發工程師,工做經驗最好在3到6年,在這三個月的面試過程當中,這些候選者鮮有我以爲滿意的。因此我就想,做爲工做了3到6年的.NETer,到底應該掌握哪些知識。c++
我負責的電話面試和筆試,着重考察.NET基本概念和基礎知識,不涉及任何項目經驗。在電話面試時,我問的第一個問題就是介紹一下.NET的類型系統,不過很遺憾的是,不少候選者在聽到「類型系統」這個詞後,徹底不知道個人發問點在哪裏,他們並不知道「類型系統」指的究竟是什麼,因此我不得不換個提問方式,轉而問「什麼是引用類型什麼是值類型,有什麼區別「,後者的問法,只是前者的一個子集而已。從.NET類型系統,能夠發問.NET如何實現跨語言開發,全部類型的共同父類是什麼,爲何要分引用類型和值類型,堆和棧的區別,裝箱拆箱等等一系列問題,遺憾的是到目前爲止尚未人可以說出我想要的答案。關於引用類型和值類型,候選人的回答也是五花八門的,有些人根本沒聽所過這兩個術語,有些人聽過,可是搞不清楚棧和堆的區別。而大部分的人,則徹底不清楚拆箱和裝箱的概念。讓我感到吃驚的是,不少人認爲拆箱裝箱就是父類型和子類型之間的類型轉換。最近面試的一個有10年經驗的.net開發者,居然認爲裝箱拆箱與反射有關。web
除去考察類型系統,我電話裏還會問到泛型,委託,linq,多線程編程,異步。遺憾的是大部分候選者對於這些在.NET編程中常常用到的技術掌握的也並很差,這幾個發問點裏,可能多線程和異步編程的問題會有點難度,不過我認爲做爲一個有五年左右工做經驗的人,理應掌握一些多線程和異步編程的技能。當我問道大部分候選者關於多線程和異步編程的問題時,他們都會回答工做中沒有用到過因此不清楚,在我看來這根本不是理由。而前三個發問點:泛型,委託,linq,則是很是基本的.NET編程技能,可是不少人僅限於用過,可是卻從未進行過一丁點的思考過,爲何.NET要引入泛型,委託和linq,引入它們是爲了解決什麼樣的問題,關於它們的實現原理大體是什麼樣子的。面試
在筆試題中,咱們會考察進程線程的基本概念,ado.net的使用,閉包,簡單的設計模式。遺憾的是,不少人並不能描述清楚進程的概念。在orm大行其道的今天,不少.NETer已經不知道如何使用原始的ADO.NET來訪問數據庫了,有些工做了五年的候選者從未據說過閉包,有些人沒法畫出經典設計模式的uml類圖。在面試了衆多候選者以後我很驚訝,關於這些軟件開發的基本技能,居然有這麼多人已經沒法掌握。sql
我面試的這些候選者,有至關一部分人都有在大公司的工做經歷,包括微軟的,攜程的。簡歷上的title也有很多寫的是開發組長,技術經理,架構師之類。簡歷上的項目經驗列出來有好幾頁,多的我都看不過來。然而他對於基本技能的掌握狀況實在使人堪憂。有至關一部分人,知足於作了一個又一個的項目,沾沾自喜。數據庫
我在我上一家公司時,個人直屬leader對我說「咱們是軟件工程師,不是碼農,不要知足於作成了多少個項目,這些項目都大同小異,能作一個就能作一百個。」這個leader對個人影響很是的大,他教會了我思考問題的方式。任何技術的出現,都是爲了解決一類實際問題,而且有個逐步完善的過程。當咱們在進行軟件開發用到了某種技術手段時,有多少人會去思考一下爲何我要採用這種技術,這種技術解決了什麼問題,若是不用會有哪些不便,在這種技術出現以前,是如何解決這類問題的。反過來,能不能本身嘗試造個輪子,簡單實現一下這個技術手段的功能。論語中說「學而不思則罔思而不學則殆」,學與思結合,收穫會有不少。編程
最後回到題目中來,3到6年的.NETer到底該掌握哪些知識。我認爲答案就在clr via c#中。其實我面試時問到的全部問題均可以從這本書中找到答案。c#的經典書籍並很少,若是隻看一本的話這一本就夠了,並且要反覆看,經常看,每次看可能都有新收穫。c#
咱們人尚未招滿,若是你以爲本身對.NET的掌握很是好,能夠發簡歷到個人郵箱裏lukexywang@qq.com。若是你還會c++的話,就更好了。工做地點在深圳南山區。設計模式
======================================分割線====================================多線程
昨天發完文以後,有個大學同窗到深圳來出差,就出去了,到晚上纔回來,文章發出來的時候我就想到可能會引起不少的爭論,你們下面的評論我都看了,談談個人見解。
下面有人說想到了老趙的博文http://blog.zhaojie.me/2011/03/my-interview-questions-for-dotnet-programmers.html,這位同窗看起來跟我是同時期混博客園的,七八年前的博客園是很是活躍的,老趙對個人影響比較大。
有人說每天加班沒時間學習的問題,人不想作一件事的時候老是能夠找到一萬個藉口。
有人說不知曉原理也能作出項目,是這樣子的。就我如今來講,個人數據庫知識很是薄弱,僅限於會寫查詢sql這樣子。索引的原理,存儲過程,數據庫內置函數的使用這些我都不太瞭解,並且我也認爲時間有限瞭解這些知識的原理還不是目前最重要的,由於我並非DBA。我要招一個.NET開發人員,.NET做爲安身立命的基本技能都還無興趣去了解的話,我不知道還能去了解什麼東西。
有人說我面試的這些知識點是考背書,有人說剛畢業時都記得,工做時間長了都忘記了。看起來大家當時確實只是背書而已。
關於小蝶的評論,我司的面試至少有四輪,我第一輪就是考察基礎,項目經驗後面會有人問。基礎知識的學習,一開始多是背書,可是在後續若干年的工做過程當中,在寫代碼時有沒有想過爲何代碼要寫成這樣子。我面試時問會不會用EF,或者會不會用NH,並沒什麼用處,由於並非人人都用過orm,掌握這些工具類庫的用法也並不會花費太多的時間。我第一份工做是winform開發,第二份工做開始asp.net開發,在第二份工做以前我沒有任何web開發的經驗,惟一的web知識就是http協議瞭解一點點。仍是那個對我影響比較大的leader說的,作網站這種東西,作一個和作一百個差距不大,看着demo寫幾回就ok了。關於基礎知識的掌握和理解,是否是能夠在平常工做中融入到你的思惟裏。一個知識你認爲你掌握了,那你是否是能給別人說清楚,能給別人說清楚纔算你掌握了,並非背書背會了就行。關於小蝶最後提問的那個問題,非託管數據到託管環境,如何避免裝箱。這個問題我第一次遇到,不過你的非託管數據指的是什麼呢?裝箱只會在值類型轉換成引用類型時發生,非託管數據到託管數據映射,就必定發生這種類型轉換?
來自大公司的候選人,我天然對他們的期待也比較高。這裏並無酸葡萄內心,由於我司也不是個小公司。
有人說「不要用本身掌握的東西來考驗別人,別人深究的技術點你不必定知道「,我要招聘一個.NET開發者,難道個人題目超綱了?問的不是.NET開發應該掌握的技能?
江寧織造的說法很中肯,關於理論和實踐,任何實際應用都是有相應的理論支撐的,在實際操做的過程當中,支撐這種具體實踐技能的理論是必定能夠提現出來的。我以爲這兩者不能割裂開看。確實招一個能幹活的人很容易,我也不須要考察這些,直接問有沒有用過ASP.NET MVC ,EF,Redis,ZooKeeper就能夠了。可是在寫代碼的時候,因爲對基礎的不瞭解,就會在不經意間埋下一個雷而不自知,這個雷最終可能會體現爲一個線上的偶發問題,在業務量較小時,可能經過屢試不爽的「重啓」來解決了,可是當業務量激增百倍時,偶發性問題的嚴重性就出來了,如何去查找緣由。有時候線索就在你手邊,可是卻發現不了。
本文是我多年從事.NET開發的一些體會,也並不就是標準答案,由於我水平還不夠給出來我題目中的標準答案。能引起討論就好。我給題目加個問號。
我面試時要問的,就是通用類型系統(CTS),https://msdn.microsoft.com/en-us/library/zcx1eb1e.aspx