问问每个优秀的.NET开发人员应该能够回答?
我的公司即将聘请.NET开发人员 。 我们致力于各种.NET平台:ASP.NET,Compact Framework,Windowsforms,Web服务。 我想编一个好问题的清单/目录,这是一个最低标准,看看申请人是否有经验。 所以,我的问题是:
你认为如果一个好的.NET程序员能够回应什么问题?
我也把它看作是我自己的清单 ,以便看到我自己的赤字在哪里(有很多…) 。
*更新:它要表明,我们不是只testing.NET的知识,解决问题的能力和一般的编程技能对我们来说更为重要。
基本问题包括:
- 抽象类和接口有什么区别? 你想什么时候使用它们?
- 左连接和内连接有什么区别?
- viewstate和sessionstate有什么区别?
- 重载和重载方法有什么区别? 解释两者是如何完成的。
- 受保护和内部有什么区别? 那么“受保护的内部”呢?
- 短路操作人员如何工作?
- 解释一下StringBuilder类是什么以及为什么要使用它?
- 静态方法和非静态方法有什么区别?
- C#中的“volatile”关键字是什么意思?
- 解释当将一个“ref”或“out”parameter passing给一个方法时会发生什么。 这两个关键词有什么区别 ?
- 什么是弱引用? 你什么时候想要使用一个?
- DataTable和DataReader有什么区别?
- 值types和引用types有什么区别?
- C#中的“只读”关键字是什么意思?
我认为通常可以帮助你的申请者完成一个简单的编码练习,例如:
- 写你自己的链接列表类,而不使用内置的类。
- 编写你自己的散列表类,而不使用内置的类。
- 写一个代表二叉树的类。 编写遍历树的所有节点的方法。
- 编写一个方法来执行二进制search数组而不使用内置的方法。
- 为博客绘制数据库模式。 每个用户只有一个博客,每个博客有很多类别,每个类别有很多post,每个post可以属于多个类别。 要求你的申请人写出查询来提取特定的信息。
接下来,寻找具体的技术诀窍:
- (事件处理程序)使用自定义事件处理程序创build一个类,创build另一个挂钩到自定义事件处理程序的类。
- (XML)加载XML文档并select所有具有属性x,y和z的节点。
- (函数式编程)创build一个接受另一个函数作为参数的函数。 地图或折叠function对此非常有用。
- (reflection)写一个函数来确定一个类是否有一个特定的属性。
- (正则expression式)编写一个正则expression式,从HTML块中删除所有标签。
这些都不是一个熟练的C#程序员回答的特别困难的问题,他们应该给你一个你的申请人特别优势的好主意。 您也可能想要使用特定devise模式的几个问题/代码示例。
[编辑澄清] :
似乎很多人不明白为什么我会问这些types的问题。 让我谈谈几个人的意见(我不是直接引用,而是改述):
问:最后一次使用挥发性物质或弱引用的时间是什么时候?
答:当我进行技术面试时,我会看看一个人是否理解.NET的高级和低级function。 挥发性和弱引用是.NET提供的两个低级function – 即使这些function在实践中不经常使用,对这些问题的回答也是非常明显的:
-
对volatile的理解表明,一个人理解编译器优化如何改变代码的正确性,线程是如何保持共享状态的本地副本,在任何给定的时间可能是不同步的,并且最小程度地意识到一些复杂的multithreading代码。
-
对弱引用的深入理解表明,一个人知道垃圾收集器的私密细节,以及它如何决定何时释放内存。 当然,你可以问候选人“垃圾收集器是如何工作的”,但询问弱引用会得到更好,更周到的答复。
.NET是一种相当抽象的语言,但是明星开发人员几乎总是对CLR和.NET运行时的低级细节有深入的了解。
问:为什么有人需要实现自己的散列表或链表?
答:我不是暗示Dictionary类是劣等的,或者人们应该推出他们自己的散列表。 这是testing一个人是否对数据结构有最less理解的基本问题。 那是什么这些问题testing:最基本的理解。
您将在数据结构101的第一天了解这些哈希表和链表。如果有人不能从头开始编写哈希表或链表,那么他们的技术知识就有很大的差距。
问:为什么这些问题如此重视?
答:因为这个线程的标题是“每个好的.NET开发者应该知道的问题”。 每个.NET开发人员都开始写自己的职业写作应用程序,所有应用程序开发人员中有90%是为了生活而关注业务线应用程序。
我认为在大多数情况下,testing人们对业务线应用程序的知识的问题是适当的,除非您正在寻找开发人员在特定的领域,如编译器开发,游戏引擎开发,定理certificate,image processing等。
我在Scott Hanselman的博客上find了这些清单:
- 什么伟大的.NET开发人员应该知道(更多的.NET面试问题)
- ASP.NET面试问题
以下是我认为这些post中最重要的问题。 我编辑和重新安排他们。 幸运的是,对于大多数这些问题,堆栈溢出已经是一个很好的答案。 只要按照链接(我会尽快更新) 。
与平台无关的.NET问题
- 线程和进程有什么区别 ?
- EXE和DLL有什么区别 ?
- 什么是强types与弱types ?
-
a.Equals(b)
和a == b
什么区别 ? - 什么是拳击 ?
- string是一个值types还是引用types ?
- 什么是全局程序集caching (GAC)? 它解决了什么问题 ?
- 什么是接口 ,它与Class有什么不同?
- 什么是反思 ?
- 从概念上讲, 早绑定和迟绑定有什么区别?
- 何时使用
Assembly.LoadFrom
或Assembly.LoadFile
适当? - 什么是Asssembly合格名称 ? 它是一个文件名? 它有什么不同?
- 强命名程序集与强命名程序集有什么不同?
- 这是做什么的? sn -t foo.dll
- .NET CLR中的世代垃圾收集器如何pipe理对象的生命周期 ? 什么是非确定性定稿 ?
-
Finalize()
和Dispose()
之间有什么区别? ( 外部文章 ) - in-proc和out-pro -pro之间有什么区别? 什么技术可以在.NET 中实现程序外的通信 ?
- 什么是FullTrust ? GAC的assembly是否有FullTrust?
-
Debug.Write
和Trace.Write
什么区别 ? 什么时候应该使用? - Debug和Release版本有什么区别? 有一个显着的速度差异? 为什么或者为什么不?
-
catch (Exception e) {throw e;}
和catch(Exception e) {throw;}
之间有什么区别 ? -
typeof(foo)
和myFoo.GetType()
什么myFoo.GetType()
? - XML命名空间的目的是什么?
- XML“ 片段 ”和XML“ 文档 ”之间有什么区别? ( XML基础 )
- 你将如何使用.NET validationXML ?
ASP.NET
- 什么是回传 ?
- 什么是ViewState ? 它是如何编码的 ? 它被encryption了吗? 谁使用ViewState? 为什么它是有用的或邪恶的?
- ASP.NET中有哪些会话状态提供程序 ? 各有什么优点和缺点?
- 什么是ASPX页面和CS / VB代码隐藏文件之间的OO关系 ?
- 如何实现ASP.NET HTML 输出caching ,caching通过
q=
所有值生成的页面的传出版本,除非q=5
(如http://localhost/page.aspx?q=5
)? - 什么是HttpHandlers ?
- 什么是HttpModules ?
- 需要什么来configuration一个新的扩展在ASP.NET中使用 ? 例如,如果我想让我的系统以* .jsp扩展名提供ASPX文件呢?
- cookies如何工作? 什么是Cookie滥用的例子?
- 什么样的数据通过HTTP头传递?
- IIS如何在运行时与ASP.NET进行通信 ? ASP.NET在不同版本的IIS(5到7)运行时在哪里?
这可能不是你想听到的,但我build议不要把重点放在狭窄的技术上,而是在一般的编程和解决问题的技巧上。 坚实的开发人员可以快速学习任何你想要的东西。
例如,我不是一个简洁的框架,所以如果你朝这个方向走,我可能会失败。 但是,如果我需要使用它,我可以做一些研究,并直接进入。
Joel的书Smart and Gets Things Done对招聘开发者有很好的build议,并且有大量的问题需要解答。 我强烈推荐它。
我想如果我正在采访一个有LINQ经验的人,我可能会问他们解释一下LINQ。 如果他们可以解释延迟执行,stream式处理,IEnumerable / IEnumerator接口,foreach,迭代器块,expression式树(无论如何都是奖励点),那么他们可以解决其余问题。 (无可否认,他们可能是“好的”开发人员,而不是“得到”LINQ – 我真的在想,他们声称知道足够多的LINQ是一个公平的问题。
过去我已经问过几个已经列出的问题,还有一些问题:
- 参考和值types之间的区别
- 通过引用传递与传递值
- 一次性使用和终结器
- string,不变性,字符编码
- 浮点
- 代表
- generics
- 可空types
我和那些正在寻找解决问题能力的人在一起,而不是那些你可以从“101顶级.NET面试问答”中查找和背诵的东西。
只是以自己为例,我倾向于“知道”我日常需要使用的东西。 我倾向于忘记(后来不得不重新查看)我很less使用的东西。
如果你想在面试中绊倒我,那将是非常容易的。
尽pipe如此,我已经为一个系统架构了许多基础架构,并为它的WinForms和ASP.NET化身使用了相同的Business Objects和Data层,而且我们的代码库是健壮的,可重用的,足以支持和开发20+不同configuration的网站版本,以及越来越多的数量(目前是5)的WinForms应用程序…
…有两个开发团队
我曾经在一个团队中担任技术主pipe,而且我的工作涉及到很多招聘和面试。 我最惊人的错误是雇用一个比我们其他人更加了解我们所使用的技术的人,包括我在内,我把自己算作一个专家。 他知道一切
…除了如何编写符合要求的代码,或者除了自己之外都可以理解的代码。 当我最终说服总理不要续签合同时,他所写的每一样东西都必须重写。
明智地组织你的面试…
Jon Skeet是谁?
我被问到的好问题是
- 你认为.NET有什么好处 ?
- 你认为.NET有什么坏处 ?
看一个候选人想出什么是很有趣的,你肯定会学习他/她如何使用框架。
我会一直寻找自己的软技能 – 没有双关意图。 这么好的面向对象devise,testing驱动的开发,一个好的多(编程)语言背景和全面的一般智能(和我认为完成的事情)。
一个聪明的开发人员应该没有任何问题,即使他们以前从未看过他们,也不需要学习他们需要知道的各种技术,所以我不会太在意WCF / compact框架等方面的具体问题。
我会让他们写一些代码 – 最好的方式来找出他们知道什么和他们如何工作。 任何人都可以记住“引用types和值types有什么区别?”的答案。
说实话?
“什么是.NET?”
如果他们能够给出一个明确的答案,说明什么是.NET,什么是.NET,它是如何使用的,它是由什么组成的,等等……如果他们能说服你,他们知道它是什么,那么他们有可能知道的很好。
事实是,很多人并不知道.NET是什么。 即使是为它编写程序的人也是如此。
没有,真的。 世上最聪明的人不知道答案可能是非常简单的问题。 不是因为他们很难,而只是因为他们没有碰到它。 你应该看看整个软件包和开发者的技能,而不是他们是否可以回答任意的问题。
如果这个问题很容易用一两句简短的话来回答,只要告诉不认识的人很容易。 你应该寻求理解概念和推理能力,而不是回答“每个.NET开发者都应该能够回答的问题”的能力。
知道参考和值types之间的差异。
知道事件被存储为硬引用(即记住取消注册事件或应用程序将泄漏内存)。
string是不可改变的。
Martin Fowler 比平台知识更喜欢devise技能 。 另一方面,你可以问一个问题,这将显示devise模式和.NET平台的知识如下:
- 在.NET Framework中命名devise模式和原则以及如何使用它们?
我build议询问他们定期阅读的博客以及他们所从事的个人编程项目,因为这样会performance出学习的意愿和对编程的热情。
这里有一些我用来过滤应用程序作为C#程序员的程序员:
引用types和值types有什么区别?
解释IDisposable接口,C#语言构造需要它,以及如何实现它。
如果将null作为parameter passing给具有不允许该参数为空的合同的方法,则会抛出哪个exception?
“你在生产中使用哪种ASP:无论哪种控制,为什么?
这将很快告诉你,你的主题是否曾经实际上构build和维护了一个大型项目,足以被DataGrids和LinkButtons烧毁,或者他是否还在拖/放“21天自学”阶段。
(答案是asp:Repeater,asp:PlaceHolder,asp:Literal和asp:Content)
什么是线程?
什么是GC?
这是一个可变的问题,而不是现在你应该完全可以回答的问题,但是你应该能够在适当的时候回答:
“.NET框架提供了什么来完成任务X?
或者更具体地说:
“.NET框架包含一个X对象吗?”
例如,我最近花了几个小时开发一个经过优化的对象来存储一个布尔值数组并对其进行操作,例如执行集合方式NOT,OR,XOR,AND,设置所有值等等。直到我写完所有的unit testing并调整它以获得最佳性能之后,才意识到我的“BoolArray”对象已经存在于.NET框架中名为“BitArray”的位置。
这可能是一个难以回答的问题,因为很多时候,对于使用什么对象/助手的最佳答案是你不知道或完全理解的问题。 如果每个人都知道即使是简单的StringBuilder,一个可以提高性能的基本工具,.NET世界将会是多么美妙。
我会build议一些问题集中在使用dotnet类似的编程概念的理解
pipe理和非pipe理的环境有什么区别? GC的优缺点JIT的优缺点如果我们需要开发应用程序X,我们可以使用dotnet吗?为什么? (这将确定他如何看到dotnet)
我build议也写小方法,并要求他用更好的dotnet类或标准的方式改进它们的性能。 也可以写出不正确的方法(根据任何)逻辑或任何方法,并要求他纠正它们。
除了已经提到的一些问题之外,我还喜欢以下内容:
- 什么是代表?
- 什么是应用程序域?
- 你什么时候使用lock关键字?
- 标准库generics集合类是否安全?
- 什么是扩展方法?
- XmlDocument和XmlReader有什么区别?
- 如何从应用程序configuration文件读取configuration设置?
这是很有意思的,如果我觉得这是一个天生的聋子,那么这个问题就有可能被低估,因此被问到这样一个问题需要更多的努力来expression我个人的想法。
直言不讳,我不会读太多典型的问题,因为基本的范例是“ 你如何发声你的想法和理解? “这就是面试官正在寻找的东西。 沟通总是我最大的弱点,由于我的方式,可以很容易地感到沮丧。
拥有知识和成为知识型人才是理想的,但不幸的是,有些事情我不知道,但是如果你实际上不知道答案并承认它而不是虚张声势通过它。 如果面试官问我上面这样一个问题,我不确定或者误解/错误地解释这个问题,我会先说,这可能会令人感到尴尬,但是已经学会了解决这个问题。
你会惊讶地发现有多less人真的会在这里虚晃一</s>,在这一天结束的时候,他们会用“裤子下来”来比喻。
我的2cents,最好的问候,汤姆。
再多一些:
- 部分class级。 其局限性?
- 密封的类
- 如何在.NET中进行本地化?
- 数据库连接
- 各种configuration文件
- 代表vs事件
- 非托pipedll访问
- 思考
- generics类
- .NET 3.5中最热门的
- 你使用的unit testing框架。
我不会问那些“从课本中知道”的问题,而是问一些修补的东西,比如:
- foreach循环在纯C#中做了什么? (期待他写一个迭代器循环。)
- 什么是单身人士?
- 让他/她parsingString到Datetime(期待他/她使用TryParse而不是try / catch)
- 实现单例,策略和命令模式
- 让他/她重构一段代码进行testing。 期望他/她将外部服务从被测单位抽象出来并实施他自己的服务testing(不提供嘲讽框架)
这些不是100%肯定的,这取决于我可能会问的人:
- 让他/她的一个方法从空input(期待他/她使用多个返回来减less嵌套)
- 对象初始值设定程序如何工作(期待他/她编写线程安全赋值)
我还会问他/她如何学习他/她的东西,他/她正在读什么(博客,书籍)。
再多一些:
垃圾收集有什么限制。
了解终结者和IDisposable。
请注意线程池以及何时使用它。
如果你正在做GUI应用程序 – 注意Windows GUI是单线程的。
使用foreach(我看到很多人在做MoveNext等)
我认为这不应该只是问题,我知道有几个人在采访他们的时候非常出色,但是一旦他们得到了真实的东西,他们就太完美了,我可以说他们没有能够很好地编写任务。
我曾经接受过采访,我有点喜欢第一个雇主给我一个技术问卷填写30分钟的方法。 如果一个人成功了,他将被要求进行一个小时的面试,包括个性判断和性格发现问题以及技术性的术语。
然后我被要求在6小时内开发一个三页的网页应用程序。 应用程序中的约束巧妙地涵盖了应用程序开发的主要方面,如小型ERD,分层devise,UI一致性,控制在GridView中使用单选button,在网页上从数据库获取和显示图像types等特定问题,安全性,encryption,散列,数据表示和操作。
接下来的一天,他们就开发的应用程序进行了30分钟的讨论,讨论了性能瓶颈区域以及devise和使用algorithm的改进。 和1小时的可选testing,以改善你在上一步开发的algorithm与特定的条件。
所以花了相当长的时间,但是这样可以确保你所雇用的人至less知道那些对于一个好的开发者来说至关重要的概念。
我宁愿给他一个问题,并要求他用.net的function解决问题,你知道为什么你认为这是最好的解决scheme。
这将在技术,分析和解决问题的能力方面解决候选人的所有能力,以及解决问题的方法。