Questions every good .NET developer should be able to answer?
我的公司即将雇用.NET开发人员。我们在各种.NET平台上工作:ASP.NET、Compact框架、WindowsForms、Web服务。我想编制一份好问题的清单/目录,这是一种检查申请人是否有经验的最低标准。所以,我的问题是:
你认为一个好的.NET程序员应该能够回答什么问题?
我也会把它看作是我自己的一个检查表,以便看看我自己的赤字在哪里(有很多…)。
*更新:它希望明确我们不仅仅是测试.NET知识,而且问题解决能力和一般编程技能对我们更重要。
基本问题包括:好的。
- 抽象类和接口有什么区别?你想什么时候用?
- 左联接和内联接有什么区别?
- viewstate和sessionstate有什么区别?
- 重写和重载方法有什么区别?解释两种方法是如何完成的。
- 受保护和内部的区别是什么?"内部受保护"怎么样?
- 短路操作员如何工作?
- 解释什么是StringBuilder类以及为什么要使用它?
- 静态方法和非静态方法有什么区别?
- C中的"volatile"关键字是什么意思?
- 解释将"ref"或"out"参数传递到方法时会发生什么。这两个关键词有什么区别?
- 什么是Weakreference?你想什么时候用?
- 数据表和数据阅读器有什么区别?
- 值类型和引用类型有什么区别?
- C中的"readonly"关键字是什么意思?
我认为让你的申请者完成一个简单的编码练习通常会有所帮助,比如:好的。
- 不使用内置类编写自己的链接列表类。
- 不使用内置类编写自己的哈希表类。
- 编写一个表示二叉树的类。编写一个遍历树的所有节点的方法。
- 编写一个方法,在不使用内置方法的情况下对数组执行二进制搜索。
- 为博客绘制数据库架构。每个用户只有一个博客,每个博客有多个类别,每个类别有多个帖子,每个帖子可以属于多个类别。请你的申请者写下查询来提取具体信息。
接下来,寻找具体的技术诀窍:好的。
- (事件处理程序)使用自定义事件处理程序创建一个类,创建另一个挂接到自定义事件处理程序的类。
- (XML)加载XML文档并选择具有属性x、y和z的所有节点。
- (函数式编程)创建一个接受另一个函数作为参数的函数。一个地图或折叠功能对这个非常有用。
- (反射)编写一个函数,确定类是否具有特定属性。
- (regex)编写一个正则表达式,从HTML块中删除所有标记。
对于一个熟练的程序员来说,这些问题都不是特别难回答的问题,它们应该能让你很好地了解申请者的特殊优势。您可能还需要处理一些使用特定设计模式的问题/代码示例。好的。
[为澄清而编辑]:好的。
似乎很多人不明白为什么我会问这些类型的问题。让我来谈谈一些人的评论(我不是直接引用,而是改为转述):好的。
问:上一次使用挥发物或弱引用物是什么时候?好的。
答:当我进行技术面谈时,我会看一个人是否理解.NET的高级和低级功能。挥发物和弱引用是.NET提供的两个低级功能——即使这些功能在实践中不经常使用,对这些问题的回答也非常有启发性:好的。
对volatiles的良好理解表明,一个人了解编译器优化如何更改代码的正确性,线程如何保持共享状态的本地副本(在任何给定时间可能不同步),并且至少了解多线程代码的一些复杂性。好的。
对弱引用的良好理解表明,一个人知道垃圾收集器的详细信息,以及它如何决定何时释放内存。当然,您可以问候选人"垃圾收集器是如何工作的",但询问弱引用会得到更好、更周到的答复。好的。
.NET是一种相当抽象的语言,但是star开发人员几乎总是对clr和.NET运行时的低级细节有深入的了解。好的。
问:为什么有人需要实现自己的哈希表或链表?好的。
答:我并不是说字典类是下等的,也不是说人们应该使用自己的哈希表。这是一个测试一个人是否对数据结构了解最少的基本问题。这就是这些问题测试的目的:最低限度的理解。好的。
在数据结构101的第一天,您将了解这些哈希表和链接列表。如果有人不能从头开始写哈希表或链表,那么他们的技术知识就有很大的差距。好的。
问:为什么这些问题是以积垢为导向的?好的。
答:因为这个线程的标题是"每个优秀的.NET开发人员都应该知道的问题"。每一个.NET开发人员都开始写CRUD应用程序的职业生涯,90%的谋生应用程序开发人员都关心业务线应用程序。好的。
我认为,在大多数情况下,测试一个人对业务线应用程序的知识是合适的,除非你在非常特定的领域寻找开发人员,如编译器开发、游戏引擎开发、定理证明、图像处理等。好的。好啊。
我在Scott Hanselman的博客上找到了这些列表:
- 伟大的.NET开发者应该知道什么(更多.NET采访问题)
- ASP.NET面试问题
以下是我认为这些帖子中最重要的问题,分为几类。我编辑并重新安排了它们。幸运的是,对于这些问题中的大多数,栈溢出已经有了一个很好的答案。只需遵循链接(我会尽快更新它们)。
独立于平台的.NET问题- 线程和进程之间的区别是什么?
- exe和dll有什么区别?
- 什么是强类型还是弱类型?
a.Equals(b) 和a == b 有什么区别?- 拳击是什么?
- 字符串是值类型还是引用类型?
- 什么是全局程序集缓存(GAC)?它能解决什么问题?
- 什么是接口,它与类有什么不同?
- 什么是反射?
- 从概念上讲,早期绑定和后期绑定有什么区别?
- 何时使用
Assembly.LoadFrom 或Assembly.LoadFile 是合适的? - 什么是组合限定名?它是文件名吗?有何不同?
- 强名称程序集与非强名称程序集有何不同?
- 这是做什么的?SnT英尺
- .NET CLR中的世代垃圾收集器如何管理对象生存期?什么是非确定性终结?
Finalize() 和Dispose() 有什么区别?(外部物品)- 进程内和进程外有什么区别?什么技术支持.NET中的进程外通信?
- 什么是完全信任?GAC'ED大会拥有完全信任吗?
Debug.Write 和Trace.Write 有什么区别?什么时候使用?- 调试版本和发布版本之间的区别是什么?是否存在显著的速度差异?为什么或为什么不呢?
catch (Exception e) {throw e;} 和Catch(Exception e) {throw;} 有什么区别?typeof(foo) 和myFoo.GetType() 有什么区别?- XML名称空间的目的是什么?
- XML"片段"和XML"文档"有什么区别?(XML基础)
- 如何使用.NET验证XML?
ASP.NET
- 什么是回邮?
- 什么是视图状态?它是如何编码的?它是加密的吗?谁使用ViewState?为什么它是有用的还是邪恶的?
- ASP.NET中有哪些会话状态提供程序可用?各方面的优缺点是什么?
- ASPX页与其CS/VB代码隐藏文件之间的OO关系是什么?
- 如何实现ASP.NET HTML输出缓存,缓存通过
q= 的所有值生成的页面的传出版本,除了q=5 中的情况(如http://localhost/page.aspx?q=5 )? - 什么是httphandler?
- 什么是httpmodules?
- 在ASP.NET中配置新扩展需要什么?例如,如果我希望我的系统提供扩展名为*.jsp的aspx文件怎么办?
- 饼干怎么用?什么是滥用曲奇的例子?
- 什么样的数据通过HTTP头传递?
- IIS在运行时如何与ASP.NET通信?在不同版本的IIS(5到7)中,运行时的ASP.NET在哪里?
这可能不是你想听到的,但我建议你不要把重点放在狭隘的技术上,而应该放在一般的编程和解决问题的技能上。可靠的开发人员可以快速学习您想要他们做的任何事情。
例如,我不是一个结构紧凑的人,所以如果你这样做的话,我可能会让你的面试失败。但如果我需要使用它,我可以做一些研究,然后直接跳进去。
乔尔的书《聪明,做事有方》,对雇佣开发人员有很好的建议,还有很多关于问题种类的有趣章节。我强烈推荐。
我想如果我是在采访一个有林肯经验的人,我可能会让他们解释一下林肯。如果他们能够解释延迟的执行、流式处理、IEnumerable/IEnumerator接口、foreach、迭代器块、表达式树(无论如何都是为了奖励点),那么他们可能可以处理其余的部分。(诚然,他们可能是"好"的开发人员,而不是"得到"Linq——我真的在想他们声称对Linq有足够的了解,从而使其成为一个公平的问题。)
在过去,我问过一些已经列出的问题,还有一些其他问题:
- 引用类型和值类型之间的差异
- 传递引用与传递值
- IDisposable和终结器
- 字符串,不可变,字符编码
- 浮点
- 代表们
- 泛型
- 可空类型
我和那些寻求解决问题能力的人在一起,而不是那些你可以从"101顶.NET面试问答和答"中查找和记忆的东西。
举我自己为例,我倾向于"了解"我每天需要使用的东西。我往往会忘记(后来不得不重新查找)我很少使用的东西。
如果你想在面试中绊倒我,那就很容易了。
尽管如此,我已经为一个使用相同业务对象和数据层的系统构建和编码了许多基础架构,以实现WinForms和ASP.NET的化身,我们的代码库非常健壮,并且可以重复使用,足以支持和开发20多个不同配置的网站版本,以及不断增加的NUMB。WinForms应用程序的ER(当前为5…)
…有两个开发团队。
我曾经在一个团队中担任技术主管,我的工作涉及大量的招聘和面试。我最大的错误是雇佣了一个比我们所有人(包括我在内)都更了解我们使用的技术的人,我把自己当成了一个专家。他什么都知道…
…除了如何编写符合要求的代码,或者除了他自己以外的任何人都能理解的代码。当我最终说服首相不再续约时,他写的每一件事都必须重写。
明智地安排面试…
乔恩·斯基特是谁?
我被问到的好问题是
- 你认为.NET有什么好处?
- 你认为.NET有什么不好的地方?
很有意思的是,看看候选人会想出什么样的办法,你肯定会学到很多关于他/她如何使用这个框架的知识。
我一直在寻找软技能自己-没有双关语的意图。所以很好的OO设计,测试驱动的开发,良好的多语言(编程)背景和全面的通用智能(我猜是完成工作!).
智能开发人员不应该在学习您需要他们了解的个别技术时遇到任何困难,即使他们以前从未看过这些技术——因此,我不会太担心有关WCF/Compact框架之类的特定问题。
我会让他们写一些代码——找出他们知道什么和如何工作的最好方法。任何人都可以记住"引用类型和值类型之间的区别是什么?"的答案。
说真的?
"什么是.NET?"
如果他们能给你一个明确的答案,告诉你.NET是什么,它不是什么,它是如何使用的,它是由什么元素组成的,等等…如果他们能让你相信他们知道这是什么,那么他们很可能很清楚。
事实上,很多人并不真正知道.NET是什么。甚至那些为它编写程序的人。
没有,真的。可能有一些非常简单的问题,世界上最聪明的人都不知道答案。不是因为他们很努力,只是因为他们没有遇到。您应该关注整个软件包和开发人员的技能,而不是他们能否回答任意问题。
如果这个问题很容易用一两句话回答,那么只告诉一个不认识的人就足够容易了。您应该寻找他们对概念和推理能力的理解,而不是他们回答问题的能力"每个.NET开发人员都应该能够回答"。
了解引用类型和值类型之间的区别。
知道事件存储为硬引用(即记住注销事件,否则应用程序将泄漏内存)。
字符串是不可变的。
马丁·福勒更喜欢设计技巧而不是平台知识。另一方面,您可以问一个问题,它将显示有关设计模式和.NET平台的知识,如下所示:
- 命名您知道的设计模式和原则,以及它们在.NET框架中的使用方式?
我建议询问他们定期阅读的博客和他们所从事的个人编程项目,因为这将显示出学习的意愿和对编程的热情。
"ASP中的哪一个:在生产中使用过什么控件?为什么?"
这将很快告诉你,你的主题是否真的构建和维护了一个大项目足够长的时间来被数据报和链接按钮烧掉,或者他是否还在拖放"在21天内自学"阶段。
(答案是asp:repeater、asp:placeholder、asp:literal和asp:content)
以下是我用来筛选作为C程序员申请工作的程序员:
引用类型和值类型有什么区别?
解释IDisposable接口,C语言结构需要它,以及如何实现它。
如果将空值作为参数传递给具有不允许该参数为空值的协定的方法,您会抛出哪个异常?
我不会问那些"从教科书中知道一些东西"的问题,而是问一些小问题,比如:
- foreach循环在普通C语言中做什么?(希望他编写一个迭代器循环。)
- 单身汉是什么?
- 让他/她将字符串解析为datetime(期望他/她使用typarse而不是try/catch)
- 实现单例、策略和命令模式
- 让他/她为测试重构一段代码。期望他/她将外部服务从被测试单元中抽象出来,并实现他自己的服务测试双重(不提供模拟框架)
这些不是100%肯定的,这取决于我可能会问他们的人:
- 让他/她从空输入保护一个方法(期望他/她使用多个返回来减少嵌套)
- 对象初始值设定项如何工作(期望他/她编写线程安全分配)
我还会问他/她是如何学习他的/她的东西的,他/她在读什么(什么博客,什么书)。
我将提出一些问题,重点是如何理解使用类似dotnet的编程概念
托管环境和非托管环境有什么区别?GC优缺点JIT优缺点如果我们需要开发应用程序X,我们可以使用dotnet吗?为什么?(这将确定他如何看待网络)
我还建议编写小方法,并要求他使用更好的dotnet类或标准方法以更好的性能重写它们。也写下正确的方法(根据任何逻辑或任何东西),并要求他纠正它们。
除了前面提到的一些问题外,我还喜欢以下内容:
- 代表是什么?
- 什么是应用程序域?
- 什么时候使用lock关键字?
- 标准库通用集合类是线程安全的吗?
- 什么是扩展方法?
- xmldocument和xmlreader有什么区别?
- 如何从应用程序配置文件读取配置设置?
还有几个:
什么是线?
GC是什么?
这很有意思,我生来就是聋子,如果被问到这样一个问题,我就得付出更多的努力来表达我个人的想法,否则我可能会被否决。
坦率地说,我真的不会读太多典型的问题,因为基本的范例是"你能把你的想法和理解表达得多好?"这正是面试官想要的。沟通一直是我最大的弱点,因为我的方式,可以很容易地感到沮丧。
拥有知识并成为无所不知的人是理想的,但不幸的是,有些事情我不知道,但如果你真的不知道答案并承认它,而不是虚张声势,那就不要害怕了。如果一个面试官问我一个像上面这样的问题,我不确定或不理解/不理解这个问题,我会事先说出来,这可能会让我感到尴尬,但我已经学会了处理它。
你会惊讶于到底有多少人会虚张声势地胡言乱语,在一天结束的时候,他们的"下身裤"被打上了隐喻。
我的两分钱,最好的问候,汤姆。
这是一个有点变化莫测的问题,而不是你现在应该能够完全回答的问题,而是你应该能够在适当的时候回答的问题:
".NET框架为完成任务X提供了什么?"
或者更具体地说:
".NET框架是否包含执行X操作的对象?"
例如,我最近花了几个小时开发了一个对象,它被优化为存储一系列布尔值并对其进行操作,例如执行一个明智的非集合、或、xor和、设置所有值等。直到我完成所有单元测试并调整它以获得最佳性能后,我才实现了我的"boolarray"对象。已存在于.NET框架中,名称为"BitArray"。
这可能是一个很难回答的问题,因为很多时候,关于要使用的对象/帮助者是您不知道或完全理解的对象/帮助者的最佳答案。如果每个人都知道甚至简单的StringBuilder(一种可以显著提高性能的基本工具),那么.NET世界将是多么美好。
还有几个:
垃圾收集的限制是什么?
了解终结器和IDisposable。
注意线程池以及何时使用它。
如果您正在使用GUI应用程序,请注意Windows GUI是单线程的。
使用foreach(我看到很多人在做movenext等)
我认为这不应该仅仅是问题,我知道一些人在你采访他们的时候很聪明,但是一旦他们找到了真正的东西,他们太完美主义了,我会说他们没有把任务编码得很糟糕。
我曾经接受过一次面试,我有点喜欢第一雇主给我一份技术问卷来填写30分钟的方法。如果一个人成功了,他将被要求接受一个小时的面试,面试内容包括性格判断、性格发现问题以及技术术语。
然后我被要求在6小时内开发一个三页的Web应用程序。应用程序中施加的约束巧妙地涵盖了应用程序开发的主要方面,如小的ERD、分层设计、UI一致性、控制特定的问题,如在GridView中使用单选按钮、在网页上从DB获取和显示图像类型、一种算法开发、安全性、加密、哈希、数据表示离子和操纵。
第二天,他们接着进行了30分钟的讨论,讨论了已开发的应用程序,涉及性能瓶颈领域以及对设计和所用算法的改进。以及1小时的可选测试,以改进您在上一步中开发的算法,并满足特定条件。
所以花了相当长的时间,但是这样你就可以确保你雇佣的人至少知道那些对于一个好的开发者来说至关重要的概念。
我宁愿给他一个问题,让他用你知道的.NET的特性来解决它,为什么你认为这是最好的解决方案。
这将使候选人在技术、分析和解决问题的能力以及解决问题的方法方面几乎丧失所有的能力。