为什么在面试过程中很难回答“给您带来有关C#的五件事”的问题?[关闭]


32

在第73播客中,乔尔·斯波斯基(Joel Spolsky)和杰夫·阿特伍德(Jeff Atwood)讨论了“每个人都应该讨厌自己喜欢的编程语言的五件事”:

如果您对当前的工具链感到满意,则无需切换。但是,如果您不能列出您最不喜欢的编程语言的五件事,那么我认为您还不了解它。最好知道这些替代方法,并且对所使用的任何方法都保持批判的眼光。

很好奇,我问了我面试的任何候选人这个问题。他们中没有人能够引用他们至少讨厌C#¹的一件事。

为什么?这个问题有什么困难?正是由于面试压力大,被访者无法回答这个问题?

这个问题有什么问题使面试不好吗?


显然,这并不意味着C#是完美的。我自己列出了我不喜欢C#的五件事:

  • 泛型中缺乏可变数量的类型(类似于params参数)。
    Action<T>
    Action<T1, T2>
    Action<T1, T2, T3>
          ⁞ 严重?
    Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>

  • 缺少对度量单位的支持,例如在F#中。

  • 缺少只读属性。private readonly每当我想要只读属性时,都会写一个后备字段。

  • 缺少具有默认值的属性。是的,我知道我可以在无参数构造函数中对其进行初始化,并从所有其他构造函数中调用它。但是我不想。

  • 多重继承。是的,它会引起混乱,在大多数情况下您不需要它。它在某些(非常罕见)的情况下仍然有用,并且混淆也适用于该类(该类在C#中已解决),该类继承了多个包含相同名称的方法的接口。

我敢肯定,这个清单还远远不够完整,还有很多要强调的地方,尤其是比我的要好得多的地方。


¹一些人批评.NET Framework中的某些程序集,或者该框架中缺少某些库,或者批评CLR。这不算什么,因为问题是关于语言本身的,尽管我可能会接受有关.NET Framework核心否定性问题的答案(例如,诸如以下事实这样的事实:没有通用接口TryParse,所以如果您想将字符串解析为几种类型,则必须对每种类型重复一次),关于JSON或WCF的答案完全是题外话。


52
Why the question “give five things you hate about C#” is so difficult to answer因为这是一个清单问题,并且在您有机会回答之前,一个邪恶的mod会将其关闭为“非建设性的” ...; P
yannis 2012年

6
@Yannis Rizos:好点。顺便说一句,当在标题中键入此问题时,Stack Overflow警告:“您要问的问题看起来很主观,很可能已被关闭。”
阿森尼·穆尔坚科

5
也许您的大脑对于程序语言讨厌的存储空间大部分是您必须处理的其他语言的方面。
whatsisname 2012年

9
可能是因为大多数人并不讨厌。对大多数人而言,仇恨是一个很强的词。从您“讨厌” C#的那些非常琐碎的项目列表来看,当我有某些理由真正讨厌某些东西时,我真的不希望出现在您附近。我怀疑你的头会爆炸。我还怀疑,对于大多数人来说,列出一份清单很困难,因为您必须花费很多精力才能列出清单,而且您有几天的时间要考虑它。
Dunk 2012年

19
您是否注意到列表中的所有项目都是关于缺失的东西而不是做错的东西。我认为您未通过面试问题。每个人都可以列出该语言所缺少的功能,并声明它是讨厌的原因,但最讨厌的语言将是具有所有功能的语言。
史迪加

Answers:


42

如果我不得不猜测:

  1. 一些程序员缺乏多样化的语言知识。当您不知道存在更好的东西时,很难看到语言的错误。

  2. 有些程序员仅仅是代码猴子。他们几乎没有分析面前的问题,更不用说像他们的编程语言如何变得更好的事情了。

  3. 很少有人特别重要。他们看到的好处和功能,而不是缺点。如果面试不是那样的话,他们很难转变为这种思维方式。

  4. 至少在这里,过分批判被视为致命的人格缺陷。他们不是“一直在寻找更好的做事方式的有见识的开发人员”(就像我住过的某些领域),而是“讨厌所有事物的混蛋”。即使是那些能够想到自己所讨厌的语言的人,也可能会在面试中推迟似乎不太刻薄的事情。


22
至于第2个,我们更喜欢Software Simians,先生。
toniedzwiedz 2012年

@Tom我以为是pan programmatoribus
Stefano Borini,2012年

9
@Telastyn答案中应该没有五个要点吗?
本杰克逊

#4是我立即想到的,特别是在致力于使用C#的工作环境中。考虑到常见的面试和工作场所行为建议,在工作面试中被问到这似乎是诱使他们捕捉“不良态度”,使他们不想雇用该人。与法律起诉不同,在工作面试中被困不太可能是有效的辩护。;-)
Dronz

35

我想这个问题在面试中很难回答,因为它是:

  1. 真是出乎意料

  2. 需要大量思考,并且思考方式与面试中使用的方式完全不同,

  3. 通常很难在短时间内回答(除非在面试前做好准备)。

1.出乎意料

出乎意料的问题确实很难解决,尤其是在压力很大的情况下。想象一下在面试过程中的以下对话框:

HashSet<T>and和之间有什么区别List<T>
‒优化哈希集的方式可以非常快速地搜索元素。例如,如果您在set.Contains()循环中多次使用,则将set列表从列表移动到哈希集可能会使事情变得更快。
‒如何创建只读属性?
readonly对于仅具有吸气剂的属性,我使用标记为后备字段的字段。
‒的用途是sealed什么?
‒将它用于不能继承的类。
last您最近一次看牙医是什么时间?
- 什么?!

2.它需要很多不同的想法

当您被问到一般面试类型的问题时,您是在回忆着从书本或从实践中学到的关于语言和框架的知识。您可能会想找到答案,但不要过多。

另一方面,关于您讨厌的五件事的问题需要更深入的思考。您不能只回想起从书本中学到的东西,也不能通过类比找到任何东西。与其说是被动的,不如说是批评家,并发现所用语言令人不愉快的地方。

3.需要时间

坦白说,我列出了我讨厌C#的五件事(实际上更多),但是我经过很长时间才考虑过。有些事情来自.NET Framework 2时代。我为.NET Framework 2列出的大多数问题不再有效,因为它们已被删除,某些问题涉及LINQ和所有这些功能性编程,有些问题涉及动态编程。我不确定如果不准备这个问题,是否能在面试中找到所有五个要素。


3
我认为您通常是对的,但是使用某种语言进行足够长的时间编程只会使您讨厌它的某些“特殊性”。就像某种命中列表。或者至少我曾经使用过的每种语言/平台都有一个。也许我只是被宠坏了而且很挑剔。
K.Steff

2
@ K.Steff:“命中列表”是一个完美的名字:)。即使使用我最喜欢的平台,我当然也可以想到五个以上的问题。如果您问我喜欢的语言但被迫使用(例如Java或Python),我可能会持续几个小时:P。
迪洪·杰维斯

1
您是否可以轻松地记住用语言所讨厌的那些东西,将取决于“特殊性”相对于您必须处理的其他事物有多麻烦。例如,我的大部分工作涉及与某个(特别是可怕的)外来系统及其API进行交互。相比之下,关于C#/。NET的大多数困惑都显得苍白无力,被我深深吸引。
丹·里昂斯2013年

可以跟踪每种语言/平台的“命中列表”并随身携带某种语言“足够长的时间”,然后随身携带它,这真是太好了。然后还有其他人只是在编程“足够的时间”之后不理会这些问题。其他人所做的就是在其命中列表中找到问题的解决方案,然后再也不必担心命中列表问题,因为他们使问题消失了。如果有足够的问题来携带清单,那么他们一定认为花时间解决自己的问题已经足够了。
Dunk 2014年

21

我认为这很难,因为有五个字。而且在较小程度上,是因为仇恨这个词。

?如果您只想出四个呢?你没有回答这个问题吗?如果您有什么超过五?现在,当场,您必须找出其中哪五个是最适合使用的。

仇恨是一个非常否定的词。人们被告知要在面试中避免这种消极情绪。此外,我认为这听起来奇怪,很多人有很多东西他们“恨”约他们会花一整天的编程语言有些人甚至会认为这是一个有趣的问题:如果他们真的来了有五件事,他们会因为讨厌C#而无法胜任编程而被取消比赛资格。不幸的是,这种不正当的技巧问题在面试中并非没有。

相反,您可能会问,如果取决于您,您对C#有什么改进? 这使受访者可以回答许多问题。这种表述也将“仇恨”一词的否定性换成相对积极的“改善”。


2
您反对“五个”的观点很不错-许多人可能会在不同程度上拥有他们不喜欢的事物的连续体,但是他们可以决定代表前五名的事物的唯一方法就是对所有可能接近的事物进行排名。如果某人最近刚遇到麻烦,而这通常是一个小麻烦,他们可能不得不花点时间想一想,它是否真的应该进入前五名,或者只是因为最近才是问题而想到了。此外,C#与.NET交织在一起,以至于很难说要归咎于什么。例如...
supercat

1
……我认为所有语言都应保证,如果构造函数抛出异常,则部分构造的对象将得到Disposed,但是由于没有所有语言都必须执行的要求,因此可以认为这样做的语言会引起错误的期望。因此,可能尚不清楚是将避免因C#构造函数故障而导致的资源泄漏的困难归咎于C#还是CLS。
supercat

14
  • 为了对比,大多数候选人并没有深入地涉及一种以上的语言或范例。我还没有与其他面向对象的语言,现在工作了5年,一个我曾在(PowerBuilder中)一直在努力,我有很多的烦恼。刚从大学毕业的大多数人都(或认为他们)是一种很热门的东西,也许是两种语言,并且已经“暴露”了三到四种(这意味着他们至少完成了一项家庭作业,但要求少于一个学期)当然要学习它)。知识或经验不足以真正知道语言的问题。在现实世界中找到一份工作,工作重点会大大缩小;您比其他人对语言的了解要多得多,在此过程中,您逐渐接受了该语言不会做或以一种奇怪的方式所做的事情,以致您不记得了做不同的事情。

  • 大多数将C#与Java / C / C ++进行比较的精通候选人都对此感到满意。C#从头开始设计,可以做很多比Java更好的事情(事件,回调,图形库,数据库工作)。反过来,与C ++相比,Java的设计更易于使用,并且更加专注于正确的代码。我还没有见过一位C#程序员,他想在不是至关重要的性能和近电路级控制的任何环境中都返回C ++。

换句话说,考虑到所有因素,See-Sharpers的效果非常好。

这是我的清单:

  • Lambda语句不可观察/评估。可以将对命名方法的调用插入VS的QuickWatch中。表达式也可以。但是lambdas?不(至少不是在VS2010中)。使调试Linq链成为真正的琐事。

  • 字符串以外的引用类型的可选参数值只能为null。如果要创建重载堆栈,则可能要使用其他默认值。我也许能够基于属性默认一个值,或者基于另一个参数的简单表达式。但是我不能。因此,当可选参数的选项受到极大限制时,不必创建过载堆栈(对于像ReSharper这样的重构助手来说就不那么容易了,以创建样板)的价值降低了。

  • C#的年龄已经足够老到足以引起严重的遗留代码问题。最初为1.1编写的代码将使习惯于4.0的任何人感到恐惧。甚至2.0代码也错失了很多。同时,引入了第三方库,使ADO.NET之类的东西看起来非常原始(并且ADO.NET的“连接模型”中的许多现在已经成为一个很大的反模式)。但是,为了向后兼容,.NET一直支持所有这些旧的,糟糕的代码,从不敢说“ ArrayList是一种糟糕的方法,很抱歉我们曾经将其放入,并且正在采用;使用List代替,如果您绝对需要一个不同类型的列表,请将其声明为List<Object>

  • 严重限制了switch语句规则。关于PowerBuilder,我可能要说的最好的事情之一是,Choose Case语句(等效于switch)允许基于变量的布尔表达式。即使有代码,它也允许switch语句掉线。我理解为什么不允许第二个语句(更可能是无意地而不是有意地完成)的原因,但有时编写这样的语句仍然会很好:

    switch(someInt)
    {
        case < 0: //all negative values enter here
           //...
           break;
        case 0: 
           //...
           break;
        case 1:
           //...
           //no break; continue through to the code for > 1
        case > 1 // all positive values enter here (including 1)
           //...
           break;
    }
  • 没有INumeric接口。如果是数字,则可以对它进行数学运算。在许多情况下,实际方法不必在乎插入的类型是什么。准确性是呼叫者的责任。但是,不可能创建只接受数字类型作为GTP的通用方法或类。

3
“大多数将C#与Java / C / C ++进行比较的精明候选人都对此感到满意”。这是我的想法。C#令人讨厌很多,因为它使您可以专注于业务问题的解决方案,而不是技术问题的解决方案。我对这种语言最大的抱怨是,我不能在切换案例测试中使用资源字符串,因为它们在技术上是变量,而不是常量。
斯蒂芬

4
泛型和容器上的内容- 泛型中具有扩展名的超级示例和模糊示例?解释一下。分配Bag<Fruit> bag = Bag<Huckleberry>意味着您可以做bag.add(new Watermelon())无法忍受的事情。

4
+1为无数字。稀有,但令人讨厌。
jmoreno

假设Thing<out T>有一个静态字段,实例方法和静态方法都可以访问该字段。如果将a Thing<Cat>传递给需要a的方法Thing<Animal>,并且该方法在Thing<Animal>引用上调用上述实例和静态方法,则这些方法应访问哪个静态字段?
超级猫

11

我建议问题的一部分是害怕给出一个错误的答案-您说您讨厌X,面试官喜欢X,或者认为您讨厌X的原因是白痴,说您认为没问题,这似乎不太受争议。

大多数人可能还没有真正考虑很多问题。他们有当前的问题和过去的问题,由语言造成的过去的问题已经过去,所以人们主要考虑的是解决方案,而不是问题,因为那是更重要的,很少有人会遇到由语言引起的当前问题。


7

对于面试,我只要求1或2,但我同意,如果您不能说出所使用工具的任何限制,那么您可能不太了解。我们问这个关于SSIS的确切问题,它确实有助于将小麦与谷壳分离。我们雇用的每个回答了这个问题的人都变成了一名出色的员工。我们需要具有实际知识的人,而不是几次看过它的人。我敢打赌,这也是您想要的。

我认为这是一个有效的问题,很多人都无法回答,这只是许多求职者实际上有多贫穷的一个例子。如果某人的分析能力不足以找出该工具的某些局限性,那么他们将如何具有足够的分析能力来解决棘手的编程问题?


1
+1 5令人生畏,因此1或2可能会得到更多答案。
Laurent Couvidou 2012年

2
仇恨与限制完全不同……
mattnz

4

就像您所说的那样,您缺乏对C#的深入经验和/或没有其他语言的知识。我采访了许多认为自己是资深的开发人员,他们无法回答某些问题,即使C#表面有些许刮擦也应该向他们揭示。

没有足够的挖掘,您将无法达到语言的极限,并希望它们消失了。万一有人想知道我的前五名

  1. 不可变的对象需要进行大量的创建仪式(与默认情况下对象不可变的功能语言相反)。
  2. 元编程很难做到。将类型发射与Lisp宏进行比较。(编译器服务将为以后的工作提供很大帮助)。
  3. 扩展方法很棒...扩展属性和扩展运算符(特别是隐式和显式运算符)会更好。
  4. 显式类型转换在编译时而不是运行时解决。
  5. 没有序列匹配,它比函数重载要干净得多。

我同意您的前两点,但是我对扩展隐式转换的想法感到震惊。
CodesInChaos 2013年

3

我认为他在谈论他所说的方式;如果您认为它已损坏,那么您可能不明白为什么会这样。您的知识可能存在漏洞。

具有讽刺意味的是,认为自己通过引用“伟大的乔尔”作为面试问题的面试官可能会忽略这一点。


我认为情况并非总是如此。例如,道格拉斯·克罗克福德(Douglas Crockford)在“ JavaScript:好的部分”中说过,您应该避免使用该语言的某些功能,而且我认为他并不意味着它们“太硬”了。
K.Steff

10
我认为他是在说相反的话-如果您认为平台完全没有损坏,那么您就不会足够了解它。也就是说,他的观点是,只要您对它的缺点不盲目,就可以坚持使用一个平台。
迪洪·耶尔维斯

3

他们可能不愿回答,因为他们的印象是,如果他们可以列出他们讨厌的5种语言,那么面试官可能会转身说'哦,我们正在寻找C#'忍者',而您似乎并没有或“如果您不喜欢该语言,为什么要申请这份工作?”。

受访者承受着很大的压力,要在采访中保持积极的态度。


如果我讨厌某种语言,那并不意味着我讨厌该语言。这个问题<del> </ del>也必须以肯定的方式回答。如果我们不讨厌HTML4,为什么我们需要HTML5?:)
e-MEE 2012年

3

因为语言决定了我们的思维方式。通过每天使用C#,您已经习惯了以一种自然地解决语言问题的方式来思考和设计代码的习惯。

您现在无需思考就可以做,甚至不知道自己做了。这就是为什么很难指出坏事是什么原因。毫无疑问,当您开始学习C#的那一天,您发现了很多问题,但是现在您不再看到它们了。习惯是有力的东西。思想习惯,甚至更多

积极的一面是,如果您很难列出C#中的缺陷,那一定是因为您是一名优秀的C#程序员,您喜欢这种语言,并且比其他语言更多地使用它。

但是,如果您想更加了解C#中的缺陷,就必须改变思维方式。了解更多编程语言,并习惯它们。争取使用尽可能不同的语言。您习惯于静态输入吗?尝试使用Python或Ruby。您习惯于面向对象和命令式的吗?Haskell完全是另一个世界。

当您回到C#时,您会想:“为什么我需要一百行C#来完成这一简单的事情,而这只是Haskell中的一行?”。您会讨厌有关C#的许多事情。

  • C#没有不可为空的引用类型。
  • 没有代数数据类型。
  • 没有字符串插值。
  • 语法在每个地方都过于冗长。
  • 没有宏系统。
  • 类型推断是有限的。
  • 没有正则表达式文字。
  • 没有结构类型。
  • 对不变性的支持不佳。
  • C#结构易于出错。
  • 标准馆藏非常有限。
  • 无法定义构造函数的参数约束。
  • 不能在数学运算符上有约束的情况下进行一般编程。
  • 没有“新类型”。
  • 没有数组切片,没有范围文字。
  • 函数没有将它们可以作为其类型的一部分列出的副作用。:)

(当然,没有一种语言可以拥有一切。语言设计非常困难,并且无法将每种功能添加到同一种语言中。针对不同目的的不同工具。)

是的,这个问题很难很好地回答,尤其是在面试中。但是可以回答的人证明他们已经考虑过,并且有一定的见解。


+1。优点。确实,我实际上在C#中讨厌的很多事情都来自其他语言没有相同缺点的事实。缺少真正的元组(即无法(a, b) = this.something();像Python 那样做)是我想到的第一件事。
2014年
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.