我的公司即将招聘。net开发人员。我们在各种。net平台上工作:ASP。NET,紧凑框架,windows窗体,Web服务。我想整理一份好问题的清单/目录,这是一种衡量应聘者是否有经验的最低标准。我的问题是:
你认为一个优秀的。net程序员应该能够回答哪些问题?
我也会把它看作是我自己的一张清单,以便看到我自己的缺陷在哪里(有很多……)
*更新:它想要明确的是,我们不仅仅测试。net知识,解决问题的能力和一般的编程技能对我们来说更重要。
我的公司即将招聘。net开发人员。我们在各种。net平台上工作:ASP。NET,紧凑框架,windows窗体,Web服务。我想整理一份好问题的清单/目录,这是一种衡量应聘者是否有经验的最低标准。我的问题是:
你认为一个优秀的。net程序员应该能够回答哪些问题?
我也会把它看作是我自己的一张清单,以便看到我自己的缺陷在哪里(有很多……)
*更新:它想要明确的是,我们不仅仅测试。net知识,解决问题的能力和一般的编程技能对我们来说更重要。
当前回答
我更喜欢给他一个问题,让他用。net的特性来解决它,你知道,为什么你认为这是最好的解决方案。
这将破解候选人几乎所有的能力,包括技术、分析和解决问题的能力,以及他解决问题的方法。
其他回答
这可能不是你想听到的,但我建议不要关注狭隘的技术,而是一般的编程和解决问题的技能。扎实的开发人员可以快速学习您想让他们做的任何事情。
举个例子,我并不是一个支持紧凑框架的人,所以如果你这么做的话,我可能会让你的面试失败。但如果我需要使用它,我可以做一些研究,然后直接投入。
Joel的书《Smart and Gets Things Done》为招聘开发者提供了很好的建议,其中有大量关于该问哪些问题的内容。我强烈推荐它。
以下是我用来筛选c#程序员职位的程序员的一些方法:
引用类型和值类型之间的区别是什么?
解释IDisposable接口,c#语言构造需要它,以及如何实现它。
如果将null作为参数传递给具有不允许该参数为空的契约的方法,您将抛出哪个异常?
这是一个可变的问题,你现在不应该完全回答,但你应该在适当的时候回答:
“.NET框架提供了什么来完成任务X ?”
或者更具体地说:
" .NET框架是否包含一个做X的对象?"
例如,我最近花了几个小时开发了一个对象,该对象经过优化,可以存储一个布尔值数组并对其进行操作,例如执行集合的NOT、OR、XOR、and、设置所有值等。直到我完成了所有的单元测试,并将其调整到最佳性能,我才意识到我的“BoolArray”对象已经存在于. net框架中,名为“BitArray”。
这可能是一个很难回答的问题,因为很多时候关于使用什么对象/ helper的最佳答案是你不知道或不完全理解的。如果每个人都知道简单的StringBuilder(一个可以显著提高性能的基本工具),. net世界将会多么美好。
我认为这不应该只是问题,我认识一些人,当你面试他们的时候,他们很聪明,但一旦他们进入现实,他们就太完美主义了,我想说,他们在完成任务时很糟糕。
我曾经参加过一次面试,我喜欢第一个雇主给我一份技术问卷,让我在30分钟内填写。如果一个人成功了,他将被要求进行一个1小时的面试,包括性格判断和性格发现问题以及专业术语。
然后我被要求在6个小时内开发一个3页的web应用程序。在应用程序中施加的约束巧妙地涵盖了应用程序开发的主要方面,如小ERD,分层设计,UI一致性,控制特定问题,如在GridView中使用单选按钮,在web页面上从DB中获取和显示图像类型,算法开发,安全性,加密,哈希,数据表示和操作。
第二天,他们进行了30分钟的讨论,讨论开发的应用程序,包括性能瓶颈领域以及设计和使用算法的改进。并在特定条件下进行1小时的可选测试,以改进上一步开发的算法。
所以这需要相当多的时间,但通过这种方式,你可以确保你招聘的人至少知道那些优秀开发人员所必需的概念。
基本问题包括:
Whats the difference between an abstract class and interface? When would you want to use them? What's the difference between a left join and an inner join? What's the difference between viewstate and sessionstate? What's the difference between overriding and overloading a method? Explain how both are done. What's the difference between protected and internal? What about "protected internal"? How do short-circuited operators work? Explain what the StringBuilder class is and why you'd want to use it? What's the difference between a static method and a non-static method? What does the "volatile" keyword in C# mean? Explain what happens when you pass a "ref" or "out" parameter into a method. What's the difference between those two keywords? What's a weakreference? When would you want to use one? What's the difference between a DataTable and a DataReader? What's the difference between a value-type and a reference type? What does the "readonly" keyword in C# mean?
我认为要求申请人完成简单的编码练习通常会有所帮助,例如:
Write your own linked list class without using the built-in classes. Write your own hashtable class without using the built-in classes. Write a class that represents a binary tree. Write a method that traverses all nodes of the tree. Write a method to perform a binary search on an array without using built-in methods. Draw a database schema for a blog. Each user only has one blog, each blog has many categories, each category has many posts, and each post can belong to more than one category. Ask your applicant to write queries to pull specific information out.
接下来,寻找具体的技术诀窍:
(Event handlers) Create a class with a custom event handler, create another class which hooks onto the custom event handler. (XML) Load an XML document and select all of the nodes with properties x, y, and z. (Functional programming) Create a function that accepts another function as a parameter. A Map or Fold function works really good for this. (Reflection) Write a function which determines if a class has a particular attribute. (Regex) Write a regular expression which removes all tags from a block of HTML.
对于一个熟练的c#程序员来说,这些问题都不是特别难回答的,它们应该能让你很好地了解申请人的特殊优势。您可能还想使用一些使用特定设计模式的问题/代码示例。
[编辑澄清]:
似乎很多人都不理解我为什么会问这些问题。让我来谈谈一些人的评论(我不是直接引用,而是转述):
问:上一次有人使用挥发物或弱引用是什么时候?
答:当我进行技术面试时,我会看一个人是否理解。net的高级和低级特性。volatile和弱引用是。net提供的两个低级特性——即使这些特性在实践中不经常使用,这些问题的答案也非常具有启发性:
A good understanding of volatiles demonstrates that a person understands how compiler optimizations change the correctness of code, how threads keep local copies of shared state which may be out of sync at any given time, and is minimally aware of some of the complexities of multithreaded code. A good understanding of weak references demonstrates that a person knows about the intimate details of the garbage collector and how it decides when to free memory. Sure, you could ask candidates "how does a garbage collector work", but asking about weak references gets a much better, more thoughtful reply.
. net是一种相当抽象的语言,但明星开发人员几乎总是对CLR和. net运行时的底层细节有深刻的理解。
问:为什么每个人都需要实现自己的哈希表或链表?
答:我并不是在暗示Dictionary类是劣等的,或者人们应该滚动自己的哈希表。这是一个基本问题,测试一个人是否对数据结构有最低限度的理解。这就是这些问题要测试的:最低限度的理解。
在数据结构101课程的第一天,您将了解这些哈希表和链表。如果有人不能从头开始编写哈希表或链表,那么他们在技术知识方面存在巨大的差距。
问:为什么这些问题都与原油有关?
答:因为这篇文章的标题是“每一个优秀的。net开发人员应该知道的问题”。每个。net开发人员的职业生涯都是从编写糟糕的应用程序开始的,而90%以开发应用程序为生的人都与业务线应用程序有关。
我认为在大多数情况下,测试一个人对业务线应用程序的知识是合适的,除非你在寻找非常特定领域的开发人员,如编译器开发、游戏引擎开发、定理证明、图像处理等。