每个优秀的.NET开发人员都应该回答的问题吗?[关闭]


246

我的公司即将雇用.NET开发人员。我们在各种.NET平台上工作:ASP.NET,Compact Framework,Windowsforms,Web Services。我想汇编一个好的问题清单/目录,这是一种最低标准,以查看申请人是否有经验。所以,我的问题是:

您认为一个好的.NET程序员应该回答什么问题

我也将其视为自己的核对清单,以便查看自己的不足之处(有很多...)

替代文字

*更新:它想表明我们不仅在测试.NET知识,而且解决问题的能力和一般的编程技能对我们来说更加重要。

Answers:


171

基本问题包括:

我认为通常可以要求您的申请人完成一个简单的编码练习,例如:

  • 无需使用内置类就可以编写自己的链接列表类。
  • 无需使用内置类即可编写自己的哈希表类。
  • 写一个代表二叉树的类。编写一个遍历树的所有节点的方法。
  • 编写一种无需使用内置方法即可对数组执行二进制搜索的方法。
  • 为博客绘制数据库架构。每个用户只有一个博客,每个博客都有很多类别,每个类别都有很多帖子,每个帖子可以属于多个类别。请您的申请人写查询以提取特定信息。

接下来,查找特定的技术知识:

  • (事件处理程序)使用自定义事件处理程序创建一个类,并创建另一个与该自定义事件处理程序挂钩的类。
  • (XML)加载XML文档,然后选择所有具有属性x,y和z的节点。
  • (函数编程)创建一个接受另一个函数作为参数的函数。Map或Fold函数对此非常有用。
  • (反映)编写一个函数,该函数确定类是否具有特定的属性。
  • (正则表达式)编写一个正则表达式,以从HTML块中删除所有标签。

对于熟练的C#程序员来说,这些都不是特别困难的问题,它们应该使您对申请人的特殊优势有所了解。您可能还需要处理一些使用特定设计模式的问题/代码示例。

[为澄清而编辑]

似乎很多人不理解为什么我会问这些类型的问题。让我谈谈一些人的评论(我不是直接引用,而是改写):


问:什么时候最后一次使用挥发物或弱引用?

答:当我进行技术面试时,我会看一看是否有人理解.NET 的高级低级功能。易失性和弱引用是.NET提供的两个低级功能-即使在实践中不经常使用这些功能,对这些问题的答案也非常揭示:

  • 对volatile的良好理解表明,一个人了解编译器优化如何更改代码的正确性,线程如何保持共享状态的本地副本(在任何给定时间可能不同步),并且对多线程代码的某些复杂性知之甚少。

  • 对弱引用的深入了解表明,一个人了解垃圾收集器的内在细节,以及垃圾收集器如何决定何时释放内存。当然,您可以问候选人“垃圾收集器是如何工作的”,但是询问弱引用会得到更好,更周到的答复。

.NET是一种相当抽象的语言,但是明星开发人员几乎总是对CLR和.NET运行时的底层细节有深刻的了解。


问:为什么有人需要实现自己的哈希表或链表?

答:我并不是在暗示Dictionary类不如从前,或者人们应该使用自己的哈希表。这是一个基本问题,它测试一个人是否对数据结构了解得最少。这就是这些问题所测试的:最低限度的理解。

您将在数据结构101的第一天了解这些哈希表和链接列表。如果某人无法从头开始编写哈希表或链接列表,那么他们的技术知识将有很大的差距。


问:为什么这些问题如此偏重?

答:因为该线程的标题是“每个优秀的.NET开发人员都应该知道的问题”。每个.NET开发人员的职业生涯都始于编写原始应用程序,而人们谋生的所有应用程序开发中有90%与业务线应用程序有关。

我认为测试人员对业务线应用程序的知识的问题在大多数情况下都是合适的,除非您正在寻找非常特定的领域的开发人员,例如编译器开发,游戏引擎开发,定理证明,图像处理等。 。


8
我认为您的清单是探索优点和缺点的好方法,但不是“基础”知识。正如Greg所指出的,尽管“短路”操作员很简单,但我经常使用它们,但我被它绊倒了:我只是忘记了这个名字。那会取消我的资格吗?
Mark Brittingham,

33
同样,我从未声明过变量“ Volatile”,并且对XML几乎没有做任何事情,因此无法完成您的编程任务。而且-我是出版作家,赢得了大型编程比赛,并且撰写了4项获得重大奖项的成功产品。
Mark Brittingham

24
因此,我不一定不同意您的清单-我仅不同意您对知识项目的描述为“基本”。没有一个是很难的概念,但是有些只是非常具体的概念,很多申请人都不熟悉。还是-再次-请接受我的道歉。
Mark Brittingham

39
此列表中的一半项目是琐事问题。这无助于找到好人,但可能会使其中的一些人恼火,以至于无法参加面试。
贾森·凯斯特

15
(Regex) Write a regular expression which removes all tags from a block of HTML.- 我很
麻烦

135

我在Scott Hanselman博客中找到了这些列表:

我认为这些帖子中最重要的问题分为几类。我编辑并重新排列了它们。幸运的是,对于大多数这些问题,Stack Overflow已经有了不错的答案。只需点击链接(我将尽快更新所有链接

与平台无关的.NET问题

ASP.NET


8
我知道开发人员知道这一切,但除了本书之外,别无他法。开明的态度非常重要,此外,不要试图获得太多详细的答案,只是要确保他们理解这个概念。
赛义夫汗

我老化了,赛义夫。但是,另一方面,如果您不了解详细信息,则将无法正确应用“概念”。
splattne

2
有些问题确实很愚蠢,例如Debug和Release版本之间有什么区别。是的,Visual Studio已经预定义了一些构建配置,但这不是平台无关的问题。通过命令行或使用Mono进行编译的人可能不知道您在说什么。
lubos hasko 09年

3
您是否能够在访谈情况下以清晰的方式描述通常占用两页甚至一章的概念。我不能不提前排练
Chris S

1
尽量不要要求人们定义术语。您将得到CS专业学生,他们必须记住他们进行测试,但会错过真正知道如何编程的人。我记得曾经被问到什么是“防御”。即使那时我一天做30次,我也没有第一条线索。
杰森·凯斯特

94

这可能不是您想听到的,但我建议您不要专注于狭窄的技术,而要专注于一般的编程和解决问题的技能。扎实的开发人员可以学习您希望他们快速完成的所有工作。

例如,我不是一个精简框架专家,所以如果您朝那个方向走,我可能会失败。但是,如果需要使用它,我可以进行一些研究,然后立即开始使用。

乔尔(Joel)的著作《聪明而成功》(Smart and Gets Things Done)为招聘开发人员提供了很好的建议,并且针对要提出的问题种类有很多内容。我强烈推荐它。


招聘过程的一部分可能是Cardspace中的问题或他们从未看过的东西!!
珍妮弗

也许可以,但是存在研究问题,所以我认为这可能是不公平的。我对观察他们如何思考问题以及也许看到他们编写抽象的东西更感兴趣,这样我就可以发现他们是否以本地语言讲代码。
Brian MacKay

如果我可以选择两个都有通用编程和解决问题能力的人,出于实际原因,我必须选择一个具有更好的.NET知识和经验的人。
splattne

.NET的知识当然可以,但是当涉及到较窄的技术时,我认为您可以与具有解决问题能力的程序员一起使用。
珍妮弗

5
是的,我们每个人都必须知道大量的“狭窄技术”。但是对于我们知道的每个人,都有很多我们不知道的东西(通常是因为我们不需要它们)。我是说您不想因为不了解SharePoint而错过一个出色的开发人员,因为不久之后他可能是您最好的SharePoint专家。
Brian MacKay,2009年

66

我认为,如果我要采访具有LINQ经验的人,我可能只会请他们解释LINQ。如果他们能够解释延迟执行,流式处理,IEnumerable / IEnumerator接口,foreach,迭代器块,表达式树(无论如何要获得奖励积分),那么他们就可以应付其余的工作。(诚​​然,他们可能是“好的”开发人员,而不是“获得”的LINQ-我真的在考虑他们声称知道足够的LINQ使其成为一个公平问题的情况。)

过去,我曾问过已经列出的几个问题,以及其他一些问题:

  • 引用类型和值类型之间的区别
  • 通过引用与按值传递
  • IDisposable和终结器
  • 字符串,不变性,字符编码
  • 浮点
  • 代表们
  • 泛型
  • 可空类型

1
是的,我想看看这种答案。被接受的好候选人。有人更好吗?
splattne

5
@splattne:别傻了,这是乔恩·斯基特的回答,所以就接受吧。这是不可避免的。
史蒂文·A·洛

3
我只是想说... wt ...你不问斯凯!
赛义夫汗

1
这是一个比公认的更好的答案。它可以帮助您了解某人是否在所谓的专业知识领域拥有丰富的知识,同时还可以探究广泛运行的语言功能的知识。
Mark Brittingham,

1
这个答案胜过“设计您自己的链接列表”,“使用正则表达式解析HTML”或“您对Assembly,GAC等了解多少...”,因为它可以解决您所需要的工具和概念在开发过程中实际使用。精通LINQ也是必不可少的。我在该站点上看到过很多实例,人们在其中尝试将自己版本的Union Distinct和Concat推向收藏集,因为他们不了解LINQ。
Evan Plaice 2010年

42

我和正在寻找解决问题能力的人在一起,而不是可以从“ 101顶级.NET访谈问答”中查找和记住的东西。

仅以自己为例,我倾向于“知道”我每天需要使用的东西。我倾向于忘记(后来不得不重新查找)我很少使用的东西。

如果您想在面试中让我绊倒,那将非常容易。

尽管如此,我还是为使用WinForms和ASP.NET实例使用相同的Business Objects和Data层的系统设计和编码了许多基础结构,并且我们的代码库强大且可重用,足以支持和开发20+网站的配置版本不同,以及越来越多的WinForms应用程序(目前为5个)...

...有两个开发团队。

我曾经在团队中担任技术主管,而我的工作涉及大量的招聘和面试。我最引人注目的错误是雇用了一个比我们所有人(包括我在内)对我们正在使用的技术了解更多的人,而我将自己视为专家。他什么都知道

...除了如何编写满足要求的代码,或者除他本人以外任何人都可以理解的代码之外。当我最终说服总理不要续签合同时,他写的每件事都必须重写。

明智地组织面试...


1
这是一个非常有趣的观察。我们遇到了相反的情况:一小群的开发人员比其他人了解的,但他们说服管理层他们知道更多。他们提出了一个数据抽象类,我认为这是不可能的(我因没有成为“团队参与者”而受到批评)。
Mark Brittingham 2009年

-继续-经过4个月的“臭鼬工作”,他们向团队提供了....他们将论文转移到另一个部门-并没有代码。团队的其他成员必须拾起碎片。
Mark Brittingham

1
但最重要的是:我真的很喜欢您的观察,即编码结构的特定知识并不能保证能够创建满足客户需求的工作软件的能力。
Mark Brittingham

34

乔恩·斯基特是谁?


11
或者更好:您是Jon Skeet吗?;-)
splattne

对于C#职位,这实际上是一个好问题。考虑到Jon Skeet现在拥有stackoverflow / google搜索与C#相关的内容。如果您现在不知道他是谁,那么您要么是Jon Skeet,要么就不是使用C#进行编程。
lubos hasko

2
没有冒犯乔恩斯基特-但我认为里克施特拉尔倾向于与答案更频繁出现的各类问题我碰上..
安德鲁Theken

1
@ [Andrew Theken]:我将在那一个上播放百分比;-) Google为“ Rick Strahl”产生38,500的命中率,“ jon skeet”产生144,000。另外,Rick Strahl不在SO AFAIK上发帖。
史蒂文·劳

1
两个人都擅长于自己的工作...我们的收获。
GR7

33

我被问到的好问题是

  • 你觉得什么 .NET有什么?
  • 您认为.NET有什么不好

看到候选人会提出什么将会很有趣,您当然会学到很多关于他/她如何使用框架的知识。


18

我会一直寻找自己的软技能-无双关语。因此,良好的OO设计,测试驱动的开发,良好的多语言(编程)语言背景和全面的整体智慧(我想应该是把事情做完了!)。

聪明的开发人员即使您以前从未看过它们,也不必费心地学习您需要他们了解的各个技术,因此,我不必担心WCF /紧凑框架等特定问题。

我会让他们写一些代码-找出他们所知道的以及他们如何工作的最佳方法。任何人都可以记住答案:“引用类型和值类型之间有什么区别?”


2
发现。提出死记硬背的问题就是自找麻烦。我工作的公司问的是一个老技术问题,但主要是:我有这些问题,这是白板,让我知道如何解决它们。吓人但有效。
克里斯·布鲁克斯

4
...但是,如果您没有按照面试官的期望解决问题,那么您就会失败。
gbjbaanb

1
@gbjbaanb有时。但是,如果是这种情况,您可能根本不想在那儿工作。请记住,您也在面试公司。我知道一些公司没有通过面试!
托尼·恩尼斯

13

老实说

“什么是.NET?”

如果他们可以为您提供有关.NET是什么,它不是什么,它是如何使用的,它由什么元素组成的清晰答案,如果他们可以说服您他们知道它是什么,那么他们非常了解。

事实是,许多人并不真正知道.NET是什么。甚至那些为它编写程序的人。


11

没有,真的。可能存在非常简单的问题,世界上最聪明的人都不知道答案。不是因为他们很难,而是因为他们还没有遇到过。您应该查看整个程序包和开发人员的技能,而不是他们是否可以回答任意问题。

如果问题很容易用一两句话回答,那么告诉一个不认识的人也很容易。您应该在寻找他们对概念和推理能力的理解,而不是他们回答“每个.NET开发人员都应该能够回答”问题的能力。


10

了解引用类型和值类型之间的区别。

知道事件存储为硬引用(即,记住注销事件,否则应用程序将泄漏内存)。

字符串是不可变的。



4

我建议查询他们定期阅读的博客以及他们从事的个人编程项目,因为这将显示出学习的热情和对编程的热情。


3

以下是一些我用来过滤申请C#程序员职位的程序员的信息:

引用类型和值类型有什么区别?

解释IDisposable接口,哪种C#语言构造需要它,以及如何实现它。

如果将null作为参数传递给具有约定不允许该参数为null的方法的方法,则会抛出哪个异常?


我的代码通常会抛出NullReferenceException。
约书亚

5
@ Joshua,ArgumentNullException,您失败了。
Nicolas Dorier 09年

3

“ ASP中的哪个:您将在生产中使用什么控件,为什么?”

这将迅速告诉您您的主题是否真的已经建立并维护了一个足够大的项目,足以被DataGrid和LinkBut​​ton烧毁,或者他是否仍处于“ 21天自学”的拖放状态。

(答案是asp:Repeater,asp:PlaceHolder,asp:Literal和asp:Content)



2

这是一个可变的问题,并不是您现在应该可以完全回答的一个问题,但是在适当的时候您应该可以回答的问题:

“ .NET框架提供了什么来完成任务X?”

或更具体地说:

“ .NET框架是否包含执行X的对象?”

例如,我最近花了几个小时来开发一个对象,该对象经过优化可存储一个布尔数组并对其进行操作,例如进行按集合的NOT,OR,XOR,AND,设置所有值等。直到完成所有单元测试并将其调整为可能的最佳性能之后,我才意识到我的“ BoolArray”对象已经存在于.NET框架中,并且名称为“ BitArray”。

这可能是一个很难回答的问题,因为很多时候,关于使用哪种对象/助手的最佳答案是您不知道或不完全理解的答案。如果每个人都真正了解简单的StringBuilder(一个可以显着提高性能的基本工具),那么.NET的世界将是多么美妙。


2

我将建议一些问题,重点是理解使用dotnet的编程概念,例如

托管环境和非托管环境有什么区别?GC的优缺点JIT的优缺点如果需要开发应用程序X,可以使用dotnet吗?为什么?(这将确定他如何看待互联网)

我还建议写一些小的方法,并请他使用更好的dotnet类或标准方法以更好的性能重写它们。还写逻辑上不正确的方法(就任何方式而言)或其他,然后请他纠正。


2

除了已经提到的一些问题之外,我还喜欢以下内容:

  • 什么是代表?
  • 什么是应用程序域?
  • 什么时候使用lock关键字?
  • 标准库通用集合类线程安全吗?
  • 什么是扩展方法?
  • XmlDocument和XmlReader有什么区别?
  • 如何从应用程序配置文件中读取配置设置?

2

这很有趣,在我天生聋哑时,冒着因接受我的意见而被否决的风险,被问到这样的问题将需要更多的精力来表达我个人的想法。

直言不讳,我真的不会读太多的典型问题,因为潜在的范式是“ 您能多大程度地表达自己的思想和理解?”,这正是面试官在寻找的东西。由于我的方式,沟通始终是我最大的弱点,并且很容易感到沮丧。

拥有知识并成为全知的类型是理想的,但是不幸的是,有些事情我不知道,但是不要害怕如果您实际上不知道答案并接受它而不是虚张声势通过这。如果面试官问我像上述问题中的一个问题,我不确定该问题是谁,或者我误会/误解了这个问题,我会先说这个问题,这可能会让人感到尴尬,但是已经学会了解决这个问题。

您会惊讶地发现,实际上有多少人会摇摇晃晃并虚张声势,而到最后,比喻说,他们的“裤子垮了”被赶上了。

我的2cents,最好的问候,汤姆。


2

还有一些:

  1. 局部类。及其局限性?
  2. 密封类
  3. .NET中如何进行本地化?
  4. 数据库连接
  5. 各种配置文件
  6. 代表与活动
  7. 非托管DLL访问
  8. 感言
  9. 通用类
  10. .NET 3.5中最热门
  11. 您使用的单元测试框架。

2

我不会问那些“从教科书中知道些什么”的问题,而是问一些诸如此类的小事:

  • 在普通C#中,foreach循环有什么作用?(期望他编写一个迭代器循环。)
  • 什么是单身?
  • 让他/她将字符串解析为Datetime(期望他/她使用TryParse而不是try / catch)
  • 实施单例,策略和命令模式
  • 让他/她重构一段代码进行测试。期望他/她从受测单元中提取外部服务,并实现自己的服务测试双(不提供模拟框架)

这些不是100%肯定的,具体取决于我可能问他们的人:

  • 让他/她保护方法免受空输入的影响(期望他/她使用多次返回来减少嵌套)
  • 对象初始化程序的工作方式(期望他/她编写线程安全的分配)

我还要问他/她如何学习自己的东西,以及他/她在读什么(博客,书籍)。


1

还有一些:

垃圾收集有哪些局限性。

了解终结器和IDisposable。

注意线程池以及何时使用它。

如果要使用GUI应用程序,请注意Windows GUI是单线程的。

使用foreach(我看到很多人在做MoveNext等)


1
我不知道,所以我查了垃圾回收局限性
MSpeed 2011年

1

我认为这不应该只是问题,我认识一些在您采访他们时才华横溢的人,但是一旦他们了解真实事物,他们就会成为完美主义者,我会说他们无法为这项任务编写糟糕的代码。

我曾经接受过一次面试,我也很喜欢这种方法,即第一位雇主给了我一份技术问卷,填写了30分钟。如果成功,那么将要求他进行1个小时的面试,内容涉及人格判断和性格寻找问题以及技术术语。

然后,我被要求在6小时内开发一个三页的Web应用程序。应用程序中施加的约束巧妙地涵盖了应用程序开发的主要方面,例如小型ERD,分层设计,UI一致性,控制特定问题,例如在GridView中使用单选按钮以及从网页上获取和显示数据库中的图像类型,一种算法开发,安全性,加密,散列,数据表示和操作。

然后第二天,他们进行了30分钟的讨论,讨论开发的应用程序,该应用程序涵盖了性能瓶颈领域以及设计和使用算法的改进。1小时可选测试可改善您在特定条件下在上一步中开发的算法。

因此,这花费了大量时间,但是通过这种方式,您可以确保所雇用的人员至少了解那些对于优秀开发人员必不可少的概念。


0

我希望给他一个问题,并请他使用您知道的.net功能解决问题,以及为什么您认为这是最佳解决方案。

这将使候选人的技术,分析和解决问题的能力以及他解决问题的方法几乎具有全部能力。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.