Answers:
基本问题包括:
我认为通常可以要求您的申请人完成一个简单的编码练习,例如:
接下来,查找特定的技术知识:
对于熟练的C#程序员来说,这些都不是特别困难的问题,它们应该使您对申请人的特殊优势有所了解。您可能还需要处理一些使用特定设计模式的问题/代码示例。
[为澄清而编辑]:
似乎很多人不理解为什么我会问这些类型的问题。让我谈谈一些人的评论(我不是直接引用,而是改写):
问:什么时候最后一次使用挥发物或弱引用?
答:当我进行技术面试时,我会看一看是否有人理解.NET 的高级和低级功能。易失性和弱引用是.NET提供的两个低级功能-即使在实践中不经常使用这些功能,对这些问题的答案也非常揭示:
对volatile的良好理解表明,一个人了解编译器优化如何更改代码的正确性,线程如何保持共享状态的本地副本(在任何给定时间可能不同步),并且对多线程代码的某些复杂性知之甚少。
对弱引用的深入了解表明,一个人了解垃圾收集器的内在细节,以及垃圾收集器如何决定何时释放内存。当然,您可以问候选人“垃圾收集器是如何工作的”,但是询问弱引用会得到更好,更周到的答复。
.NET是一种相当抽象的语言,但是明星开发人员几乎总是对CLR和.NET运行时的底层细节有深刻的了解。
问:为什么有人需要实现自己的哈希表或链表?
答:我并不是在暗示Dictionary类不如从前,或者人们应该使用自己的哈希表。这是一个基本问题,它测试一个人是否对数据结构了解得最少。这就是这些问题所测试的:最低限度的理解。
您将在数据结构101的第一天了解这些哈希表和链接列表。如果某人无法从头开始编写哈希表或链接列表,那么他们的技术知识将有很大的差距。
问:为什么这些问题如此偏重?
答:因为该线程的标题是“每个优秀的.NET开发人员都应该知道的问题”。每个.NET开发人员的职业生涯都始于编写原始应用程序,而人们谋生的所有应用程序开发中有90%与业务线应用程序有关。
我认为测试人员对业务线应用程序的知识的问题在大多数情况下都是合适的,除非您正在寻找非常特定的领域的开发人员,例如编译器开发,游戏引擎开发,定理证明,图像处理等。 。
(Regex) Write a regular expression which removes all tags from a block of HTML.
- 我很
我在Scott Hanselman的博客中找到了这些列表:
我认为这些帖子中最重要的问题分为几类。我编辑并重新排列了它们。幸运的是,对于大多数这些问题,Stack Overflow已经有了不错的答案。只需点击链接(我将尽快更新所有链接)。
a.Equals(b)
和之间有什么区别a == b
?Assembly.LoadFrom
或Assembly.LoadFile
合适?Finalize()
和之间有什么区别Dispose()
?(外部文章)Debug.Write
和之间有什么区别Trace.Write
?什么时候应该使用?catch (Exception e) {throw e;}
和catch有(Exception e) {throw;}
什么区别?typeof(foo)
和之间有什么区别myFoo.GetType()
?q=
where以外的所有值q=5
(如中http://localhost/page.aspx?q=5
)生成的页面的传出版本?这可能不是您想听到的,但我建议您不要专注于狭窄的技术,而要专注于一般的编程和解决问题的技能。扎实的开发人员可以学习您希望他们快速完成的所有工作。
例如,我不是一个精简框架专家,所以如果您朝那个方向走,我可能会失败。但是,如果需要使用它,我可以进行一些研究,然后立即开始使用。
乔尔(Joel)的著作《聪明而成功》(Smart and Gets Things Done)为招聘开发人员提供了很好的建议,并且针对要提出的问题种类有很多内容。我强烈推荐它。
我认为,如果我要采访具有LINQ经验的人,我可能只会请他们解释LINQ。如果他们能够解释延迟执行,流式处理,IEnumerable / IEnumerator接口,foreach,迭代器块,表达式树(无论如何要获得奖励积分),那么他们就可以应付其余的工作。(诚然,他们可能是“好的”开发人员,而不是“获得”的LINQ-我真的在考虑他们声称知道足够的LINQ使其成为一个公平问题的情况。)
过去,我曾问过已经列出的几个问题,以及其他一些问题:
我和正在寻找解决问题能力的人在一起,而不是可以从“ 101顶级.NET访谈问答”中查找和记住的东西。
仅以自己为例,我倾向于“知道”我每天需要使用的东西。我倾向于忘记(后来不得不重新查找)我很少使用的东西。
如果您想在面试中让我绊倒,那将非常容易。
尽管如此,我还是为使用WinForms和ASP.NET实例使用相同的Business Objects和Data层的系统设计和编码了许多基础结构,并且我们的代码库强大且可重用,足以支持和开发20+网站的配置版本不同,以及越来越多的WinForms应用程序(目前为5个)...
...有两个开发团队。
我曾经在团队中担任技术主管,而我的工作涉及大量的招聘和面试。我最引人注目的错误是雇用了一个比我们所有人(包括我在内)对我们正在使用的技术了解更多的人,而我将自己视为专家。他什么都知道
...除了如何编写满足要求的代码,或者除他本人以外任何人都可以理解的代码之外。当我最终说服总理不要续签合同时,他写的每件事都必须重写。
明智地组织面试...
乔恩·斯基特是谁?
我会一直寻找自己的软技能-无双关语。因此,良好的OO设计,测试驱动的开发,良好的多语言(编程)语言背景和全面的整体智慧(我想应该是把事情做完了!)。
聪明的开发人员即使您以前从未看过它们,也不必费心地学习您需要他们了解的各个技术,因此,我不必担心WCF /紧凑框架等特定问题。
我会让他们写一些代码-找出他们所知道的以及他们如何工作的最佳方法。任何人都可以记住答案:“引用类型和值类型之间有什么区别?”
以下是一些我用来过滤申请C#程序员职位的程序员的信息:
引用类型和值类型有什么区别?
解释IDisposable接口,哪种C#语言构造需要它,以及如何实现它。
如果将null作为参数传递给具有约定不允许该参数为null的方法的方法,则会抛出哪个异常?
“ ASP中的哪个:您将在生产中使用什么控件,为什么?”
这将迅速告诉您您的主题是否真的已经建立并维护了一个足够大的项目,足以被DataGrid和LinkButton烧毁,或者他是否仍处于“ 21天自学”的拖放状态。
(答案是asp:Repeater,asp:PlaceHolder,asp:Literal和asp:Content)
这是一个可变的问题,并不是您现在应该可以完全回答的一个问题,但是在适当的时候您应该可以回答的问题:
“ .NET框架提供了什么来完成任务X?”
或更具体地说:
“ .NET框架是否包含执行X的对象?”
例如,我最近花了几个小时来开发一个对象,该对象经过优化可存储一个布尔数组并对其进行操作,例如进行按集合的NOT,OR,XOR,AND,设置所有值等。直到完成所有单元测试并将其调整为可能的最佳性能之后,我才意识到我的“ BoolArray”对象已经存在于.NET框架中,并且名称为“ BitArray”。
这可能是一个很难回答的问题,因为很多时候,关于使用哪种对象/助手的最佳答案是您不知道或不完全理解的答案。如果每个人都真正了解简单的StringBuilder(一个可以显着提高性能的基本工具),那么.NET的世界将是多么美妙。
我将建议一些问题,重点是理解使用dotnet的编程概念,例如
托管环境和非托管环境有什么区别?GC的优缺点JIT的优缺点如果需要开发应用程序X,可以使用dotnet吗?为什么?(这将确定他如何看待互联网)
我还建议写一些小的方法,并请他使用更好的dotnet类或标准方法以更好的性能重写它们。还写逻辑上不正确的方法(就任何方式而言)或其他,然后请他纠正。
这很有趣,在我天生聋哑时,冒着因接受我的意见而被否决的风险,被问到这样的问题将需要更多的精力来表达我个人的想法。
直言不讳,我真的不会读太多的典型问题,因为潜在的范式是“ 您能多大程度地表达自己的思想和理解?”,这正是面试官在寻找的东西。由于我的方式,沟通始终是我最大的弱点,并且很容易感到沮丧。
拥有知识并成为全知的类型是理想的,但是不幸的是,有些事情我不知道,但是不要害怕如果您实际上不知道答案并接受它而不是虚张声势通过这。如果面试官问我像上述问题中的一个问题,我不确定该问题是谁,或者我误会/误解了这个问题,我会先说这个问题,这可能会让人感到尴尬,但是已经学会了解决这个问题。
您会惊讶地发现,实际上有多少人会摇摇晃晃并虚张声势,而到最后,比喻说,他们的“裤子垮了”被赶上了。
我的2cents,最好的问候,汤姆。
我不会问那些“从教科书中知道些什么”的问题,而是问一些诸如此类的小事:
这些不是100%肯定的,具体取决于我可能问他们的人:
我还要问他/她如何学习自己的东西,以及他/她在读什么(博客,书籍)。
还有一些:
垃圾收集有哪些局限性。
了解终结器和IDisposable。
注意线程池以及何时使用它。
如果要使用GUI应用程序,请注意Windows GUI是单线程的。
使用foreach(我看到很多人在做MoveNext等)
我认为这不应该只是问题,我认识一些在您采访他们时才华横溢的人,但是一旦他们了解真实事物,他们就会成为完美主义者,我会说他们无法为这项任务编写糟糕的代码。
我曾经接受过一次面试,我也很喜欢这种方法,即第一位雇主给了我一份技术问卷,填写了30分钟。如果成功,那么将要求他进行1个小时的面试,内容涉及人格判断和性格寻找问题以及技术术语。
然后,我被要求在6小时内开发一个三页的Web应用程序。应用程序中施加的约束巧妙地涵盖了应用程序开发的主要方面,例如小型ERD,分层设计,UI一致性,控制特定问题,例如在GridView中使用单选按钮以及从网页上获取和显示数据库中的图像类型,一种算法开发,安全性,加密,散列,数据表示和操作。
然后第二天,他们进行了30分钟的讨论,讨论开发的应用程序,该应用程序涵盖了性能瓶颈领域以及设计和使用算法的改进。1小时可选测试可改善您在特定条件下在上一步中开发的算法。
因此,这花费了大量时间,但是通过这种方式,您可以确保所雇用的人员至少了解那些对于优秀开发人员必不可少的概念。