我的公司即将雇用 .NET developers . 我们在各种.NET平台上工作:ASP.NET,Compact Framework,Windowsforms,Web Services . 我想编制好的问题列表/目录,这是一种最低标准,以确定申请人是否有经验 . 所以,我的问题是:
What questions 你觉得应该好 .NET programmer be able to respond ?
为了看到自己的赤字在哪里(有很多......),我也会把它视为自己的 checklist .
*更新:它想明确我们不仅仅测试.NET知识,解决问题的能力和一般编程技能对我们来说更为重要 .
25 回答
基本问题包括:
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?
覆盖和重载方法有什么区别?解释两者是如何完成的 .
受保护和内部有什么区别? "protected internal"怎么样?
短路运营商如何运作?
解释StringBuilder类是什么以及为什么要使用它?
静态方法和非静态方法有什么区别?
C#中的"volatile"关键字是什么意思?
解释将"ref"或"out"参数传递给方法时会发生什么 . What's the difference between those two keywords?
什么是弱引用?你什么时候想用?
DataTable和DataReader有什么区别?
值类型和引用类型之间有什么区别?
C#中的"readonly"关键字是什么意思?
我认为通常有助于您的申请人完成一个简单的编码练习,例如:
编写自己的链表类而不使用内置类 .
编写自己的哈希表类而不使用内置类 .
编写一个表示二叉树的类 . 编写一个遍历树的所有节点的方法 .
编写一种方法,在不使用内置方法的情况下对数组执行二进制搜索 .
为博客绘制数据库架构 . 每个用户只有一个博客,每个博客有很多类别,每个类别有很多帖子,每个帖子可以属于多个类别 . 请求您的申请人撰写查询以提取具体信息 .
接下来,寻找具体的技术诀窍:
(事件处理程序)使用自定义事件处理程序创建一个类,创建另一个挂钩到自定义事件处理程序的类 .
(XML)加载XML文档并选择具有属性x,y和z的所有节点 .
(函数式编程)创建一个接受另一个函数作为参数的函数 . Map 或折叠功能对此非常有用 .
(反射)编写一个函数,确定一个类是否具有特定属性 .
(Regex)编写一个正则表达式,删除HTML块中的所有标记 .
对于熟练的C#程序员来说,这些都不是特别困难的问题,他们应该让您对申请人的特殊优势有所了解 . 您可能还想使用一些使用特定设计模式的问题/代码示例 .
[Edit for clarification] :
似乎很多人不明白为什么我会问这些类型的问题 . 让我谈谈几个民族的评论(我不是直接引用,而是代言):
Q: 最后一次使用挥发物或弱引用的时间是什么时候?
A: 当我进行技术访谈时,我会看一个人是否理解.NET的高级和低级功能 . Volatiles和弱引用是.NET提供的两个低级功能 - 即使这些功能在实践中不经常使用,这些问题的答案也极具启发性:
对volatile的一个很好的理解表明,一个人理解编译器优化如何改变代码的正确性,线程如何保持共享状态的本地副本,这些副本在任何给定时间都可能不同步,并且最低限度地意识到多线程的一些复杂性码 .
对弱引用的一个很好的理解表明,一个人知道垃圾收集器的私密细节以及它如何决定何时释放内存 . 当然,你可以问候选人“垃圾收集器是如何工作的”,但询问弱引用会得到更好,更周到的回复 .
.NET是一种相当抽象的语言,但明星开发人员几乎总是对CLR有深刻的理解以及.NET运行时的低级细节 .
Q: 为什么有人需要实现自己的哈希表或链表?
A: 我并不是暗示Dictionary类是劣等的,或者人们应该推出自己的哈希表 . 这是一个基本问题,它测试一个人是否对数据结构的了解最少 . 这就是这些问题所测试的内容:最低限度的理解 .
您将在数据结构101的第一天了解这些哈希表和链接列表 . 如果有人无法从头开始编写哈希表或链表,那么他们的技术知识就会有很大差距 .
Q: 为什么这些问题如此严重?
A: 因为这个帖子的 Headers 是"questions every good .NET developer should know" . 每个.NET开发人员都开始编写crud应用程序的职业生涯,并且90%的所有应用程序开发人员都致力于 生产环境 线应用程序 .
我认为在大多数情况下测试人员对业务线应用程序知识的问题是合适的,除非您正在寻找具有特定利基的开发人员,例如编译器开发,游戏引擎开发,定理证明,图像处理等 . .
我在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 between a.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中的世代 garbage collector 怎么样?什么是non-deterministic finalization?
What is the difference between Finalize() and Dispose()?(external article)
in-proc 和 out-of-proc 之间有什么区别?什么技术在.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 " and an 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?各自的优点和缺点是什么?
什么是 OO relationship between an ASPX page and its CS/VB code behind 文件?
如何实现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怎么办? ASP.NET在不同版本的IIS(5到7)运行时在哪里?
这可能不是你想听到的,但我建议不要关注狭隘的技术,而应关注一般编程和解决问题的技巧 . 坚实的开发人员可以快速学习您希望他们做的事情 .
例如,我不是Compact Framework的人,所以如果你走向那个方向,我可能会失败 . 但如果我需要使用它,我可以做一些研究并直接进入 .
乔尔的书,Smart and Gets Things Done,对招聘开发者有很好的建议,并且有很多有关要问的问题 . 我强烈推荐它 .
我想如果我正在采访有LINQ经验的人,我可能只是要求他们解释LINQ . 如果他们可以解释延迟执行,流式传输,IEnumerable / IEnumerator接口,foreach,迭代器块,表达式树(无论如何),那么他们可以应对其余的 . (不可否认,他们可能是"ok"开发人员,而不是"get" LINQ - 我声称知道足够的LINQ来制作这是一个公平的问题 . )
在过去,我已经问了几个已经列出的问题,还有一些问题:
参考和值类型之间的差异
按引用传递vs按值传递
IDisposable和终结者
字符串,不变性,字符编码
浮点
代表
泛型
可以为空的类型
我和那些正在寻找解决问题能力的人在一起,而不是那些你可以从“101顶级.NET面试Q和As”中查找和记忆的东西 .
仅仅举个例子,我倾向于“知道”我每天需要使用的东西 . 我倾向于忘记(后来不得不重新查看)我很少使用的东西 .
如果你想在面试中绊倒我,那将非常容易 .
尽管如此,我已经构建了大量的基础架构,并为其WinForms和ASP.NET版本使用相同的Business Objects和Data层进行了编码,我们的代码库非常强大且可重用,足以让我们能够以不同的方式支持和开发20配置的网站版本,以及越来越多的(目前为5个)WinForms应用程序......
......有两个开发团队 .
我曾经在一个团队中担任技术主管,我的工作涉及很多招聘和面试 . 我最大的错误就是雇佣了一个比我们所有其他人都更了解我们使用的技术的人,包括我,我认为自己是一名专家 . 他知道一切......
...除了如何编写符合要求的代码,或者除了他自己以外的任何人都可以理解的代码 . 当我最终说服总理不续签 Contract 时,他所写的每一件事都必须改写 .
明智地构建你的面试......
Jon Skeet是谁?
我被问到的好问题是
您认为.NET的优点是什么?
您认为.NET有什么不好?
看看候选人会想出什么会很有趣,你肯定会学到很多关于他/她如何使用框架的知识 .
我总是会自己寻找软技能 - 没有双关语意 . 如此优秀的OO设计,测试驱动开发,良好的多语言(编程)语言背景和全面的一般智能(以及完成事情 - 我猜!) .
智能开发人员在学习您需要他们知道的各项技术时应该没有任何问题,即使他们以前从未查看过 - 所以我不会过多担心围绕WCF /紧凑框架等的具体问题 .
我会让他们写一些代码 - 最好的方法来找出他们知道什么以及他们如何工作 . 任何人都可以记住“参考类型和 Value 类型之间有什么区别?”的答案 .
说实话?
“什么是.NET?”
如果他们可以给你一个明确的答案,那就是.NET是什么,不是什么,它是如何使用的,它是由它组成的元素等等......如果他们能说服你知道它是什么,那么很可能是知道得很清楚 .
事实是,很多人并不真正知道.NET是什么 . 甚至那些为它编写程序的人 .
没有,真的 . 可能有非常简单的问题,世界上最聪明的人都不知道答案 . 不是因为它们很难,而仅仅是因为它们没有碰到它 . 您应该查看整个软件包和开发人员的技能,而不是他们是否可以回答任意问题 .
如果这个问题很容易用一两句话来回答,那么告诉不认识的人很容易 . 您应该寻找他们对概念和推理能力的理解,而不是他们回答“每个.NET开发人员应该能够回答的问题”的能力 .
了解参考和 Value 类型之间的区别 .
知道事件存储为硬引用(即记得取消注册事件或应用程序将泄漏内存) .
字符串是不可变的 .
Martin Fowler prefers design skills over platform knowledge . 另一方面,您可以提出一个问题,它将显示设计模式和.NET平台的知识,如下所示:
我建议询问他们定期阅读的博客以及他们所做过的个人编程项目,因为这将显示出学习的意愿和对编程的热情 .
这是一些我习惯于过滤程序员申请C#程序员的工作:
引用类型和值类型之间有什么区别?
解释IDisposable接口,C#语言构造需要它以及如何实现它 .
如果将null作为参数传递给具有不允许该参数为空的合约的方法,则会抛出哪个异常?
“哪个ASP:你会在 生产环境 中使用什么控件?为什么?”
这将告诉你你的主题是否曾经实际构建和维护一个大型项目足够长的时间被DataGrids和LinkButton烧毁,或者他是否还在拖拽/拖放“21天自学”阶段 .
(答案是asp:Repeater,asp:PlaceHolder,asp:Literal和asp:Content)
什么是线程?
什么是GC?
这是一个变量问题,并不是你现在应该能够完全回答的问题,但是你应该能够在适当的时候回答:
“.NET框架为完成任务X提供了什么?”
或者更具体地说:
“.NET框架是否包含一个执行X的对象?”
例如,我最近花了几个小时开发一个优化的对象来存储一个布尔数组并对其进行操作,例如执行收集方式NOT,OR,XOR,AND,设置所有值等等 . 它不是'直到我完成所有单元测试并调整它以获得最佳性能之后,才意识到我的“BoolArray”对象已经存在于.NET框架中,名称为“BitArray” .
这可能是一个难以回答的问题,因为很多时候关于使用什么对象/助手的最佳答案是您不了解或完全理解的对象/助手 . 如果每个人都真正了解简单的StringBuilder,这是一个可以提高性能的基本工具,.NET世界会有多棒 .
我将提出一些问题,重点是使用dotnet来理解编程概念
托管和非托管环境之间有什么区别? GC利弊JIT的优缺点如果我们需要开发应用程序X,我们可以使用dotnet吗?为什么? (这将确定他如何看待网络)
我建议也写一些小方法,让他用更好的dotnet类或标准方法用更好的性能重写它们 . 也写出不正确的方法(就任何方面而言)逻辑或其他方法,并要求他纠正它们 .
除了已经提到的一些问题之外,我还喜欢以下内容:
什么是代表?
应用领域是什么?
什么时候会使用lock关键字?
标准库通用集合类是否安全?
什么是扩展方法?
XmlDocument和XmlReader有什么区别?
如何从应用程序配置文件中读取配置设置?
这很有意思,冒着被我投票放在一边的风险,因为我天生聋,被问到这样的问题需要更多的努力来亲自传达我的想法 .
坦率地说,我真的不会读太多典型的问题,因为潜在的范例是“你能用多少声音来表达你的想法和理解?”,这就是面试官正在寻找的 . 沟通总是我最大的弱点,因为我的方式很容易让人感到沮丧 .
拥有知识并且知道所有类型是理想的但不幸的是,有一些我不知道的事情,但如果你实际上不知道答案并承认它而不是虚张声势,不要害怕通过它 . 如果一位面试官问我上面提到的一个问题,我不会确定或误解/误解这个问题,我会提前说出来,这可能是个人尴尬,但已经学会了解决这个问题 .
你会感到惊讶的是,有多少人真的会胡扯和虚张声势,在一天结束的时候,他们会用他们的“裤子”来比喻 .
我的2点,最好的问候,汤姆 .
还有一些:
部分课程 . 它的局限性?
密封课程
如何在.NET中实现本地化?
数据库连接
各种配置文件
代表与事件
非托管dll访问
思考
通用类
.NET 3.5中最热门
您使用过的单元测试框架 .
我不会问那些“从教科书中了解一些问题”,而不是问一些修补的东西,比如:
foreach循环在普通C#中做了什么? (期待他编写一个迭代器循环 . )
什么是单身人士?
让他/她解析String到Datetime(期望他/她使用TryParse而不是try / catch)
实施单例,策略和命令模式
让他/她重构一段代码进行测试 . 期望他/她将外部服务从测试单元中抽象出来并实现他自己的测试双重服务(不提供模拟框架)
这些不是100%肯定,取决于我可能会问他们的人:
让他/她保护一个来自null输入的方法(期望他/她使用多个返回来减少嵌套)
对象初始化程序如何工作(期望他/她编写线程安全的赋值)
另外我会问他他/她是如何学习他/她的东西以及他/她正在阅读的内容(博客,书籍) .
还有一些:
垃圾收集有什么限制 .
了解终结器和IDisposable .
请注意线程池以及何时使用它 .
如果您正在进行GUI应用程序 - 请注意Windows GUI是单线程的 .
使用foreach(我看到很多人在做MoveNext等)
我认为这不应该仅仅是问题,我知道有几个人在你采访他们时很聪明,但是一旦他们得到了真实的东西,他们就是太完美主义者,我会说他们无法对这项任务进行悲惨的编码 .
我曾经接受过采访,我有点喜欢第一个雇主给我一份技术问卷填写30分钟的方法 . 如果一个人成功,那么他将被要求进行1小时的面试,其中包括人格判断和角色发现问题以及技术术语 .
然后我被要求在6小时内开发一个三页的Web应用程序 . 应用程序中的约束巧妙地涵盖了应用程序开发的主要方面,如小型ERD,分层设计,UI一致性,控制特定问题,如在GridView中使用单选按钮,在网页上获取和显示数据库中的图像类型,一个算法开发,安全性,加密,散列,数据表示和操作 .
然后第二天,他们对开发的应用程序进行了30分钟的讨论,讨论了性能瓶颈区域以及设计和使用算法的改进 . 1小时可选测试,以改善您在上一步中开发的具有特定条件的算法 .
所以花了相当多的时间,但这样你就可以确保你招聘的人至少知道那些对优秀开发人员至关重要的概念 .
我更愿意给他一个问题并要求他使用你知道的.net的功能来解决它,为什么你认为这是最好的解决方案 .
这将破坏候选人在技术,分析和解决问题技能方面的几乎所有能力以及他解决问题的方法 .