每个优秀的 .NET 开发人员都应该能够回答的问题? [关闭]
Posted
技术标签:
【中文标题】每个优秀的 .NET 开发人员都应该能够回答的问题? [关闭]【英文标题】:Questions every good .NET developer should be able to answer? [closed] 【发布时间】:2010-09-26 19:13:22 【问题描述】:我的公司即将招聘 .NET 开发人员。我们在各种 .NET 平台上工作:ASP.NET、Compact Framework、Windowsforms、Web 服务。我想编制一份好问题的清单/目录,这是一种最低标准,看看申请人是否有经验。所以,我的问题是:
您认为优秀的 .NET 程序员应该能够回答哪些问题?
我也将其视为我自己的清单,以便了解我自己的缺陷在哪里(有很多......)。
*更新:要明确的是,我们不仅仅测试 .NET 知识,而且解决问题的能力和通用编程技能对我们来说更为重要。
【问题讨论】:
【参考方案1】:我更愿意给他一个问题,让他使用你知道的 .net 的特性来解决它,为什么你认为这是最好的解决方案。
这将破解候选人在技术、分析和解决问题能力方面的几乎所有能力,以及他解决问题的方法。
【讨论】:
【参考方案2】:我不会问那些“从教科书中知道的东西”的问题,而是问一些修补的东西,比如:
foreach 循环在纯 C# 中的作用是什么? (期待他写一个迭代器循环。) 什么是单例? 让他/她将 String 解析为 Datetime(期望他/她使用 TryParse 而不是 try/catch) 实现单例、策略和命令模式 让他/她重构一段代码进行测试。期望他/她将外部服务从被测单元中抽象出来,并实现他自己的服务测试替身(不提供模拟框架)这些不是 100% 确定的,取决于我可能会问他们的人:
让他/她保护一个方法免受空输入的影响(期望他/她使用多个返回来减少嵌套) 对象初始化器如何工作(期望他/她编写线程安全赋值)我还会问他/她是如何学习他/她的东西的以及他/她正在阅读什么(什么博客、书籍)。
【讨论】:
【参考方案3】:还有一些:
-
部分课程。以及它的局限性?
密封类
如何在 .NET 中进行本地化?
数据库连接
各种配置文件
代表与活动
非托管 dll 访问
反思
泛型类
.NET 3.5 中最热门的
您使用过的单元测试框架。
【讨论】:
【参考方案4】:基本问题包括:
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? 重写和重载方法有什么区别?说明两者是如何完成的。 受保护的和内部的有什么区别? “受保护的内部”呢? 短路运算符如何工作? 解释什么是 StringBuilder 类以及为什么要使用它? 静态方法和非静态方法有什么区别? C# 中的“volatile”关键字是什么意思? 解释将“ref”或“out”参数传递给方法时会发生什么。 What's the difference between those two keywords? 什么是弱引用?您想什么时候使用? DataTable 和 DataReader 有什么区别? 值类型和引用类型有什么区别? C# 中的“readonly”关键字是什么意思?我认为让你的申请人完成一个简单的编码练习通常会有所帮助,例如:
编写您自己的链表类而不使用内置类。 编写您自己的哈希表类而不使用内置类。 编写一个表示二叉树的类。编写一个遍历树的所有节点的方法。 编写一个方法以在不使用内置方法的情况下对数组执行二进制搜索。 为博客绘制数据库模式。每个用户只有一个博客,每个博客有很多类别,每个类别有很多帖子,每个帖子可以属于多个类别。要求您的申请人编写查询以提取特定信息。接下来,寻找具体的技术诀窍:
(事件处理程序)使用自定义事件处理程序创建一个类,创建另一个挂钩到自定义事件处理程序的类。 (XML) 加载一个 XML 文档并选择所有具有 x、y 和 z 属性的节点。 (函数式编程)创建一个接受另一个函数作为参数的函数。地图或折叠功能对此非常有用。 (反射)编写一个函数来确定一个类是否具有特定属性。 (正则表达式)编写一个正则表达式,从 html 块中删除所有标签。对于一个熟练的 C# 程序员来说,这些都不是特别难回答的问题,它们应该让你很好地了解你的申请者的特殊优势。您可能还想处理一些使用特定设计模式的问题/代码示例。
[编辑澄清]:
似乎很多人不明白我为什么要问这些类型的问题。让我谈谈几个人的cmets(我不是直接引用,而是转述):
问:上一次有人使用 volatile 或弱引用是什么时候?
答:当我进行技术面试时,我会看一个人是否了解 .NET 的高级和低级功能。易失性和弱引用是 .NET 提供的两个低级特性——即使这些特性在实践中不经常使用,这些问题的答案也非常具有启发性:
对 volatile 的良好理解表明一个人了解编译器优化如何改变代码的正确性,线程如何保持在任何给定时间可能不同步的共享状态的本地副本,并且对某些多线程代码的复杂性。
对弱引用的深入理解表明人们了解垃圾收集器的内部细节以及它如何决定何时释放内存。当然,你可以问候选人“垃圾收集器是如何工作的”,但询问弱引用会得到更好、更周到的回答。
.NET 是一门相当抽象的语言,但明星开发人员几乎总是对 CLR 和 .NET 运行时的底层细节有深入的了解。
问:为什么有人需要实现自己的哈希表或链表?
答:我并不是说 Dictionary 类是劣等的,或者人们应该滚动他们自己的哈希表。这是一个基本问题,测试一个人是否对数据结构有最低的理解。这就是这些问题所要测试的:最低限度的理解。
您在数据结构 101 的第一天就了解了这些哈希表和链表。如果有人不能从头开始编写哈希表或链表,那么他们在他们的技术知识。
问:为什么这些问题如此粗俗?
答:因为这个帖子的标题是“每个优秀的 .NET 开发人员都应该知道的问题”。每个 .NET 开发人员的职业生涯都是从编写 crud 应用开始的,而在所有应用开发中,90% 的人都与业务线应用有关。
我认为在大多数情况下,测试一个人对业务线应用程序知识的问题是合适的,除非您正在寻找非常特定领域的开发人员,例如编译器开发、游戏引擎开发、定理证明、图像处理等。
【讨论】:
我认为您的清单是探索优势和劣势的好方法,但它不是“基本”知识。正如 Greg 指出的那样,我被“短路”运算符绊倒了,尽管它们很简单而且我经常使用它们:我只是忘记了这个名字。那会取消我的资格吗? 同样,我从未声明过变量“Volatile”,并且对 XML 做的很少,因此无法完成您的编程任务。然而,我是一名出版作家,赢得了一场大型编程竞赛,并编写了 4 款获得重大奖项的成功产品。 因此,我不一定不同意您的列表 - 我只是不同意您将知识项描述为“基本”。没有一个是硬概念——但有些只是非常具体,很多申请人并不熟悉。仍然 - 再次 - 请接受我的道歉。 此列表中的一半项目是琐事问题。这无助于找到好人,但可能会惹恼他们中的一些人,让他们在你的面试中走出去。(Regex) Write a regular expression which removes all tags from a block of HTML.
- 我闻起来很麻烦【参考方案5】:
这很有趣,并且有可能因为提出我的意见而被否决,因为我天生耳聋,被问到这样的问题需要更多的努力来传达我个人的想法。
坦率地说,我真的不会读太多典型的问题,因为基本范式是“你能在多大程度上表达你的想法和理解?”,这就是面试官的真正意思在寻找。由于我的方式,沟通一直是我最大的弱点,而且很容易感到沮丧。
拥有知识并成为无所不知的人是理想的,但不幸的是,有些事情我不知道,但如果你真的不知道答案并承认它,不要害怕而不是虚张声势。如果面试官问我一个类似上述问题的问题,我不确定或误解/误解这个问题,我会直接说出来,这可能会让我个人感到尴尬,但我已经学会了处理这个问题。
您会惊讶于有多少人实际上会胡扯并虚张声势,在一天结束时,他们会隐喻地“脱裤子”。
我的 2cents, 最好的祝福, 汤姆。
【讨论】:
【参考方案6】:我认为这不应该只是问题,我认识一些在你采访他们时表现出色的人,但一旦他们了解真实情况,他们就过于完美主义了,我会说他们在编写任务时表现不佳。
我曾经接受过一次面试,我有点喜欢第一个雇主给我一份技术问卷让我在 30 分钟内填写的方法。如果成功,他将被要求进行 1 小时的面试,内容包括性格判断和性格发现问题以及技术术语。
然后我被要求在 6 小时内开发一个三页 Web 应用程序。应用程序中施加的约束巧妙地涵盖了应用程序开发的主要方面,例如小型 ERD、分层设计、UI 一致性、控制特定问题,例如在 GridView 中使用单选按钮以及在网页上从数据库中获取和显示图像类型,一种算法开发,安全、加密、散列、数据表示和操作。
然后第二天,他们就开发的应用程序进行了 30 分钟的讨论,涵盖性能瓶颈领域以及设计和使用算法的改进。以及 1 小时的可选测试,以改进您在上一步中开发的特定条件下的算法。
所以这花费了相当多的时间,但这样你可以确保你所雇用的人至少知道那些对优秀开发人员至关重要的概念。
【讨论】:
【参考方案7】:我在Scott Hanselman 的blog 上找到了这些列表:
What Great .NET Developers Ought To Know (More .NET Interview Questions) ASP.NET Interview Questions以下是我认为这些帖子中最重要的问题,这些问题分为几类。我编辑并重新安排了它们。幸运的是,对于这些问题中的大多数,Stack Overflow 上已经有了很好的答案。只需点击链接(我会尽快更新它们)。
独立于平台的 .NET 问题
What is the difference between a thread and a process? What is the difference between an EXE and a DLL? What is strong-typing versus weak-typing? What is the difference betweena.Equals(b)
and a == b
?
What is boxing?
Is string a value type or a reference type?
What is the Global Assembly Cache (GAC)? What problem does it solve?
What is an Interface 它与 Class 有何不同?
What is Reflection?
从概念上讲,early-binding和late-binding有什么区别?
什么时候使用Assembly.LoadFrom
or Assembly.LoadFile
比较合适?
什么是Asssembly Qualified Name?是文件名吗?有什么不同?
strongly-named assembly 与没有强命名的有什么不同?
这是做什么的? sn -t foo.dll
.NET CLR manage object lifetime 中的分代垃圾收集器如何? non-deterministic finalization 是什么?
What is the difference between Finalize()
and Dispose()
? (external article)
进程内和进程外有什么区别?什么技术可以在 .NET 中启用out-of-proc communication?
What is FullTrust? GAC 的程序集是否具有 FullTrust?
What is the difference between Debug.Write
and Trace.Write
?什么时候应该使用它们?
What is the difference between a Debug and Release build? 速度有显着差异吗?为什么或为什么不?
What is the difference between: catch (Exception e) throw e;
and catch (Exception e) throw;
?
What is the difference between typeof(foo)
and myFoo.GetType()
?
What is the purpose of XML Namespaces?
XML“Fragment”和XML“Document”有什么区别? (XML Basics)
How would you validate XML using .NET?
ASP.NET
What is a PostBack? What is ViewState? encoded怎么样?是加密的吗?谁使用 ViewState?为什么它有用或邪恶? 在 ASP.NET 中有哪些 Session State providers 可用?各有什么优缺点? ASPX 页面与其 CS/VB code behind 文件之间的OO关系是什么? 如何实现ASP.NET HTML output caching,缓存通过q=
的所有值生成的页面的传出版本,q=5
除外(如http://localhost/page.aspx?q=5
)?
What are HttpHandlers?
What are HttpModules?
configure a new extension for use in ASP.NET 需要什么?例如,如果我希望我的系统提供带有 *.jsp 扩展名的 ASPX 文件怎么办?
How do cookies work? Cookie 滥用的例子是什么?
What kind of data is passed via HTTP Headers?
IIS communicate at runtime with ASP.NET 怎么样?不同版本的 IIS(5 到 7)中运行时的 ASP.NET 在哪里?
【讨论】:
我知道开发人员知道这一切,但仍然看不到比这本书更远的地方。思想开放很重要,此外,不要试图得到太多详细的答案,只要确保他们理解这个概念即可。 我老了,赛义夫。但另一方面,如果不了解细节,就无法正确应用“概念”。 有些问题真的很愚蠢,比如 Debug 和 Release 构建有什么区别。是的,Visual Studio 已经预定义了一些构建配置,但这不是一个独立于平台的问题。通过命令行或使用 Mono 编译的人可能不知道您在说什么。 你是否能够在面试的情况下以清晰的方式描述通常需要 2 页甚至一章的概念。我不能不事先排练他们 尽量不要让人们定义术语。你最终会遇到那些必须记住它们以进行测试的 CS 专业学生,但却错过了真正知道如何编程的人。我记得有一次有人问我什么是“尊重”。我没有第一个线索,尽管当时我每天要这样做 30 次。【参考方案8】:了解引用类型和值类型之间的区别。
知道事件是作为硬引用存储的(即记得取消注册事件,否则应用程序会泄漏内存)。
字符串是不可变的。
【讨论】:
【参考方案9】:除了已经提到的一些问题之外,我还喜欢以下问题:
什么是委托? 应用域是什么? 什么时候使用 lock 关键字? 标准库通用集合类线程安全吗? 什么是扩展方法? XmlDocument 和 XmlReader 有什么区别? 如何从应用程序配置文件中读取配置设置?【讨论】:
【参考方案10】:“哪些 ASP:你会在生产中使用什么控件,为什么?”
这将很快告诉您,您的主题是否实际上构建并维护了一个大型项目,其时间是否足以被 DataGrids 和 LinkButtons 烧毁,或者他是否仍处于拖放“21 天自学”阶段。
(答案是asp:Repeater、asp:PlaceHolder、asp:Literal和asp:Content)
【讨论】:
【参考方案11】:我被问到的好问题是
您认为 .NET 有什么优点? 您认为 .NET 的哪些方面不好?看看候选人会想出什么会很有趣,你肯定会学到很多关于他/她如何使用该框架的知识。
【讨论】:
【参考方案12】:说实话?
“什么是 .NET?”
如果他们可以就 .NET 是什么、不是什么、它是如何使用、它由什么元素组成等给你一个明确的答案......如果他们能让你相信他们知道它是什么,那么他们可能很清楚。
事实上,很多人并不真正了解.NET 是什么。甚至那些为其编写程序的人。
【讨论】:
【参考方案13】:我会建议一些问题,重点是理解使用 dotnet 之类的编程概念
托管环境和非托管环境有什么区别? GC 的优缺点 JIT 的优缺点 如果我们需要开发应用程序 X,我们可以使用 dotnet 吗?为什么? (这将确定他如何看待 dotnet)
我还建议编写小方法,并要求他使用更好的 dotnet 类或标准方法以更好的性能重写它们。 还要写不正确的方法(就任何而言)逻辑或任何东西,并要求他更正它们。
【讨论】:
【参考方案14】:没有,真的。可能有一些非常简单的问题,世界上最聪明的人都不知道答案。不是因为它们很难,而仅仅是因为它们还没有遇到过。您应该着眼于整个软件包和开发人员的技能,而不是他们能否回答任意问题。
如果问题很容易用一两句话回答,那么告诉不知道的人就很容易了。您应该寻找他们对概念和推理能力的理解,而不是他们回答“每个 .NET 开发人员都应该能够回答的问题”的能力。
【讨论】:
【参考方案15】:我建议询问他们定期阅读的博客和他们从事的个人编程项目,因为这将显示出学习的意愿和对编程的热情。
【讨论】:
【参考方案16】:马丁·福勒prefers design skills over platform knowledge。另一方面,您可以提出一个问题,该问题将显示设计模式和 .NET 平台的知识,如下所示:
说出您知道的设计模式和原则以及它们在 .NET Framework 中的使用方式?【讨论】:
【参考方案17】:这是一个有点多变的问题,并不是你现在应该能够完全回答的问题,而是你应该能够在适当的时候回答的问题:
“.NET 框架为完成任务 X 提供了什么?”
或者更具体地说:
“.NET 框架是否包含执行 X 的对象?”
例如,我最近花了几个小时开发一个对象,该对象经过优化以存储布尔数组并对其进行操作,例如执行集合方式的 NOT、OR、XOR、AND、设置所有值等。直到我完成所有单元测试并对其进行调整以获得最佳性能后,我才意识到我的“BoolArray”对象已经以“BitArray”的名称存在于 .NET 框架中。
这可能是一个很难回答的问题,因为很多时候关于使用什么对象/助手的最佳答案是您不知道或完全理解的那个。如果每个人都真正了解即使是简单的 StringBuilder(一个可以显着提高性能的基本工具),那么 .NET 世界将会多么美好。
【讨论】:
【参考方案18】:乔恩·斯基特是谁?
【讨论】:
或者更好:你是 Jon Skeet 吗? ;-) 这实际上是 C# 职位的好问题。考虑到 Jon Skeet 现在拥有与 C# 相关的 ***/google 搜索。如果你现在还不知道他是谁,那你要么是 Jon Skeet,要么不是在用 C# 编程。 没有冒犯 Jon Skeet - 但我认为 Rick Strahl 往往会更频繁地回答我遇到的问题类型。 @[Andrew Theken]:我会在那个上播放百分比 ;-) 谷歌搜索“Rick Strahl”的点击量为 38,500,“jon skeet”的点击量为 144,000。另外,Rick Strahl 不会在 SO AFAIK 上发帖。 两个人都擅长他们的工作......我们的收获。【参考方案19】:我想如果我在采访有 LINQ 经验的人,我可能只是请他们解释 LINQ。如果他们能够解释延迟执行、流式传输、IEnumerable/IEnumerator 接口、foreach、迭代器块、表达式树(无论如何都是为了加分),那么他们可能可以应对其余的问题。 (诚然,他们可能是“好的”开发人员,但还没有“获得”LINQ - 我真的在考虑他们声称知道足够多的 LINQ 以使其成为一个公平问题的情况。)
过去我已经问过几个已经列出的问题,以及其他一些问题:
引用类型和值类型之间的区别 按引用传递与按值传递 IDisposable 和终结器 字符串、不变性、字符编码 浮点数 代表 泛型 可为空的类型【讨论】:
是的,我想看到这样的答案。被录取的好人选。有更好的吗? @splattne:别傻了,这是 Jon Skeet 的回答,所以接受吧。这是不可避免的。 我刚想说...wt...你不要质疑Skeet! 这是一个比公认的更好的答案。它可以帮助您了解某人是否在声称的专业领域拥有深厚的知识,同时还可以探索范围相当广泛的语言功能知识。 这个答案比“设计你自己的链接列表”、“用正则表达式解析 HTML”或“你对大会、GAC 等了解多少......”更胜一筹,因为它解决您在开发过程中实际使用的工具和概念。对 LINQ 的深入了解也是必不可少的。我在这个网站上看到过很多例子,人们因为不懂 LINQ 而试图推出他们自己版本的 Union Distinct 和 Concat 来收集。【参考方案20】:我和那些寻求解决问题能力的人在一起,而不是那些你可以从 '101 *** .NET 面试 Qs 和 As 中查找和记忆的东西。
以我自己为例,我倾向于“了解”我每天需要使用的东西。我往往会忘记(后来不得不重新查找)我很少使用的东西。
如果你想在面试中绊倒我,那很容易。
尽管如此,我已经为一个系统构建并编码了大部分基础架构,该系统使用相同的业务对象和数据层作为其 WinForms 和 ASP.NET 化身,并且我们的代码库足够健壮且可重用,足以让我们能够支持和开发 20 多个不同配置的网站版本,以及越来越多(目前为 5 个)的 WinForms 应用程序...
... 有两个人的开发团队。
我曾经在一个团队中担任技术主管,我的工作涉及大量招聘和面试。我最严重的错误是雇佣了一个比我们其他人(包括我)加起来更了解我们正在使用的技术的人,我认为自己是专家。他什么都知道……
...除了如何编写满足要求或除他自己以外的任何人都可以理解的代码。当我最终说服首相不要续约时,他写的每一件事都必须重写。
明智地安排你的面试...
【讨论】:
这是一个非常有趣的观察。我们遇到了相反的情况:一小群开发人员比其他人知道更少,但他们说服管理层他们知道的更多。他们提出了一个我认为不可能的数据抽象类(我被批评为不是“团队合作者”)。 - 继续 - 经过 4 个月的“臭鼬工作”努力,他们向团队提交了......他们的转移文件到另一个部门 - 并且没有代码。团队的其他成员必须收拾残局。 底线,不过:我真的很喜欢您的观察,即编码结构的特定知识并不能保证能够创建满足客户需求的工作软件。【参考方案21】:这可能不是您想听到的,但我建议您不要专注于狭隘的技术,而是关注一般的编程和解决问题的技能。扎实的开发人员可以快速学习您希望他们完成的任何事情。
例如,我不是一个紧凑型框架的人,所以如果你朝那个方向走,我可能会通过你的面试。但如果我需要使用它,我可以做一些研究并直接加入。
Joel 的书 Smart and Gets Things Done 为招聘开发人员提供了很好的建议,并且有大量关于要问的问题的有趣部分。我强烈推荐它。
【讨论】:
也许招聘过程的一部分应该是 Cardspace 的问题或他们从未看过的东西! 也许可以,但研究存在问题,所以我认为这可能不公平。我更感兴趣的是看看他们如何思考问题,也许看到他们编写一些抽象的代码,这样我就可以知道他们是否会说原生代码。 如果我可以选择两个具有一般编程和解决问题能力的人,出于实际原因,我必须选择具有更好 .NET 知识和经验的人。 .NET 知识当然有,但是当涉及到更窄的技术时,我认为您可以与具有解决问题技能的程序员一起使用。 是的,我们都必须知道大量的“狭义技术”。但是对于我们认识的每个人,都有一堆我们不知道的(通常是因为我们不需要它们)。我是说您不想因为不了解 SharePoint 而错过一位出色的开发人员,因为他很快就会成为您最好的 SharePoint 人。【参考方案22】:还有一些:
垃圾回收有什么限制。
了解终结器和 IDisposable。
注意线程池以及何时使用它。
如果您正在开发 GUI 应用程序 - 请注意 Windows GUI 是单线程的。
使用 foreach(我看到很多人在做 MoveNext 等)
【讨论】:
我不知道,所以我查了limitations of garbage collection。【参考方案23】:我总是自己寻找软技能——没有双关语的意思。如此优秀的 OO 设计、测试驱动开发、良好的多(编程)语言背景和全面的一般智慧(我猜还有做事的能力!)。
一个聪明的开发人员在学习你需要他们知道的个别技术时应该不会有任何困难,即使他们以前从未看过它们 - 所以我不会太担心关于 WCF/紧凑框架等的具体问题.
我会让他们编写一些代码 - 找出他们知道什么以及如何工作的最佳方式。任何人都可以记住“引用类型和值类型有什么区别?”的答案
【讨论】:
正确。问死记硬背的问题就是自找麻烦。我工作的公司会问老技术人员的问题,但主要是:我有这些问题,这是一块白板,告诉我你将如何解决它们。可怕但有效。 ...但如果你不按照面试官的预期解决问题,你就会失败。 @gbjbaanb 有时。但如果是这种情况,你可能无论如何都不想在那里工作。记住,你也在面试公司。我认识几家面试失败的公司!【参考方案24】:什么是线程?
什么是 GC?
【讨论】:
【参考方案25】:以下是我用来筛选申请 C# 程序员工作的程序员:
引用类型和值类型有什么区别?
解释 IDisposable 接口、哪种 C# 语言结构需要它以及如何实现它。
如果将 null 作为参数传递给具有不允许该参数为 null 的协定的方法,您会抛出哪个异常?
【讨论】:
我的代码通常会抛出 NullReferenceException。 @Joshua,ArgumentNullException 你失败了。以上是关于每个优秀的 .NET 开发人员都应该能够回答的问题? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章