我应该期望新毕业的毕业生熟悉基本的编程概念吗?[关闭]


9

在我期望某人已经在大学学习了几年编程的人与实际知道的人之间,似乎存在巨大差异。

我不觉得我在面试中问的问题过于复杂。我的一些常见问题是:

  • 引用类型和值类型有什么区别?

    如果受访者似乎不太了解自己的答案,或者如果他不知道我使用的术语,我会要求他向我解释当我写int = 0时会发生什么,从而获得更多细节。在方法中,对象o = 0,对象o = new MyClass()等如何?

    基本上,我会尽一切努力诱使受访者告诉我有关调用堆栈,堆等的信息,并且我会尽量坚持语言不可知论的概念。如果受访者告诉我他做了很多C或C ++或c#,我将更深入地研究特定的语言,并可能深入研究实现细节。

    如果需要,我问受访者什么是调用栈,或者以他选择的命令式语言将传递给函数的参数存储在哪里。

    大多数受访者不知道什么是调用堆栈,更不用说拳击方面的考虑了。

  • 抽象类和接口之间有什么区别?在哪种情况下,您应该使用另一种方法?

    通常,我还请他们想象一个小型库的设计,该库的用例旨在使用一些继承和一些抽象工厂

    大多数受访者都不知道真正的继承目的是什么。他们通常知道一些关键字(虚拟关键字,覆盖关键字等),但并不真正知道何时使用它们,更不用说解释什么是虚拟表了。

即使我事先筛选了简历,即使对于在涉及复杂体系结构的现实生活项目中拥有5年经验的人,我也要说不到25%的受访者能够正确回答这两个问题。当我说得正确时,我并不是说“深入”……只是为了大致了解该概念。

对于初中生,我可以聘用一个不知道如何很好地组织时间的人,或者不熟悉例如工业建筑过程的人,但是我有一种感觉,如果一个人没有听说过“几年学习计算机科学后,他要么很愚蠢,要么没有动力,要么非常不明智地选择了他的大学。

你认为我在这里太极端了吗?大学毕业后学习这些基本概念是否普遍?您是否认识一些不熟悉这些技术并在几年后成为非常优秀的软件工程师的人?您认为我的公司在吸引人才方面可能存在问题,还是在自己的招聘过程中遇到相同的问题?


编辑。关于“即时类型”的事情,这只是从法语到英语的字面翻译,因为我们通常会用法语进行采访。我已经解决了我的问题。但是,尽管如此,我认为你们所有人都完全理解我的意思,这是我的意思,不是吗?


4
只是一小段话,但另一方面,我不知道您对即时类型,值类型的含义。但是,我认为,拥有任何CS学位的所有人都应该能够回答这两个问题。为了改善您的问题,也许您可​​以举一个例子,说明您期望的答案应该多么详尽。
sebastiangeiger

在大学学习语言达2年以上,与其他科目竞争后,学生在考试结束后只剩下最低的要求。您唯一可以确定的是,他们可以学习该信息,或者他们曾经知道。只有实践经验才能赋予他们知识的持久性。乔尔·斯波斯基(Joel Spolsky)在他的博客文章(http://www.joelonsoftware.com/items/2009/10/26.html
Justin Shield

@sebastiangeiger; 你是正确的更新!
布兰恩

2
他必须知道他几乎一无所知。这是随着时间的推移变得更好的关键点。
deadalnix

有趣的是,布拉恩,所有回答此问题的人都提到“立即类型”(翻译错误),并告诉您他们不知道它是什么。您的面试官在说:“我没有深入研究这些问题吗?” 还是他们声称自己是例如运行时细节和对编译器的深刻理解方面的专家?
2011年

Answers:


15

术语是面试情况中的常见缺陷。

您使用术语向被访者问一个对您来说有意义的问题,但被访者可能用不同的术语知道它,或者可能只知道通论而不适用特定的语言或环境。误会随之而来。双方都不开心。

实际上,事实证明,受访者完全理解某些值可能直接存储在寄存器中,而其他值则引用了其他地方的内存块,但是由于您以特定领域主导的方式提出问题,因此您要问的是什么,以及您希望受访者告诉您的内容并没有真正传达出来。

也许在很多情况下,受访者会突然单击并说“哦- 就是您正在谈论的内容”,然后进行充分的解释。

这是一个艰难的平衡,因为刚从大学毕业的程序员就不会拥有团队环境中现实世界的发展所带来的多样化经验。同时,经验丰富的开发人员通常不会记住(甚至不感兴趣)他们在大学里学到的所有东西,因为这与他们的日常使用完全无关。

这两种类型的人(是的-这是受访者和面试官)需要学习如何沟通对方之前,你可以了解关于对方。确保这件事发生的责任在于经验丰富的人(面试官)。

更不用说有些人在面试中完全失去记忆的事实。包括我自己。我记得有人被要求用C语言编写程序,我一生都无法记住用于从指针(->)访问成员的符号,而不得不问别人。连我的第一份工作都没有。在过去的15年中,男孩一直困扰着我:-)

在我看来,沟通能力,有效和充分解决问题的能力要有用得多。快速捡起东西;表现出积极敏锐的态度;与其他人和其他核心价值观的良好互动。

不要放弃受访者,因为他们不知道什么是即时类型。继续。


@Brann-立即类型->值类型。注意到
罗杰·阿特里尔

好吧,也许从我的问题的措词来看还不够清楚,但是我确实做了很多事情以确保不存在术语问题。我问受访者在特定情况下会用他选择的语言发生什么,我问他是否知道调用栈是什么,我问他是否有不同的“种类”的记忆,我问他传递给函数的参数在哪里以他选择的命令式语言存储。真的,我不认为这是术语问题。有时,受访者对实例化课程后幕后发生的事情没有任何想法。
布兰恩

关于“继续前进”的事情,这就是我通常要做的。但是以我的经验,当受访者不知道值类型是什么时,他也不知道线程同步,也不知道泛型是什么,等等。所以在问了几个问题之后,当候选人明确不太适合这份工作,我通常会给他一些建议,告诉他们如何学习在技术面试中表现更好,然后继续下一位候选人:)
Brann

12

您是在询问特定于语言的知识,并且您使用的术语并非在所有语言中都100%相同。我-一个人-不知道什么是“即时类型”。

另外,考虑到大学里教授的东西不是如何用X编写标准代码,而是要学习很多底层概念并看到各种编程范例。换句话说,它很像驾驶执照-即使您了解基本理论,您仍然需要大量实际操作。


我已经更新为“值类型”。但是问题是,如果受访者不理解该问题,我通常会更详细地解释它,并尝试许多方法来诱使受访者告诉我有关调用堆栈,堆等的信息……(是的,我知道这些是实施细节,但仍然是不是真正针对特定语言的IMO的一般概念)
Brann

我认为“调用堆栈”概念是您正在谈论的那些通用概念之一。即使以十种不同的方式重新表达了问题的内容,以确保受访者知道我希望他告诉我有关内存分配,调用堆栈,值类型等的信息,但我还是经常会出现空白。
布兰恩

如果我对您的理解正确,那么您想知道开发人员是否了解指针,并且知道它们的作用以及如何使用它们?

不,我不知道。我想确保开发人员至少对使用所选语言的特征x或y时幕后发生的事情有一个大概的了解。向他询问指针只是让他谈论自己对内存分配了解的一种方式。
布兰恩

3
@Brann,有关调用堆栈,堆等的所有详细信息,本质上只是应用指针

3

“我听到了,我忘记了。我看到了,我记得了。我知道了,我理解了。” (而且,我认为理解可以更好地保留内存。)

简而言之,应届毕业生没有太多经验,因此,正如其他人指出的那样,无论他们的“选择”语言是什么,他们所拥有的知识都不会超过最低限度。

我去了一所专为简化对所选专业的学习而设计的学院(例如,如果您是CS专业,那么您就不会有历史文学;与历史文学最接近的是科幻小说),刚从大学毕业后,尽管我们确实了解了抽象(而且我学到的技术在.Net中比比皆是),但我无法告诉您接口与抽象类的区别什么。我们可能已经接触过接口,但是它迷失了传递类所需的所有其他内容。直到我大学毕业后的第一份工作,我才了解接口,尤其是以任何有意义的方式。

您提到用法语进行采访,这很明显地表明我们在不同的国家,所以您的里程可能会有所不同,但是在美国,大学在技术方面的排名远远落后于时代。因此,除非您要使用成熟的语言(C / C ++,COBOL等),否则很可能甚至您多年使用的语言在学生所学的版本中也可能不可用。例如,.Net 3.0引入了Entity Framework,WPF,WCF和许多其他有趣的东西,但即使是我的学校也仍然坚持使用.Net 1.1和2.0(这意味着坚持使用ADO.NET,甚至不了解对象。 -关系映射)。使用PHP的学校可能会坚持使用(非OOP)PHP 4。

同样要记住,学生必须吸收大量通常仅在短时间内使用的信息。“高级”概念(例如抽象概念)通常在课堂结束时讲授,在该课程中,学生可能只有一个星期左右的时间来玩,而与其他班级竞争时,他/他必须参加,并且可能兼职或全职工作的顶部。将所有这些结合在一起,使人能够记住任何东西,更不用说保持直截了当了,这真是一个奇迹。

至少在美国,通常认为新近毕业的毕业生对通用基础知识一无所知(也许通过价值传递和通过参考传递之间的区别),因为人们了解到通用理论和解决问题的能力是学校,而不是学习给定语言的来龙去脉。

我建议您使用更多的问题来衡量您需要教/再教的内容(记住,很可能他们只是没有学习您要使用的术语,即使您认为它无处不在),而不是受访者是否“一文不值”。将其与衡量他们的学习意愿以及他们一般的解决问题技能是什么样的方式相结合(认真地,给他们一个谜题以解决问题,并看看他们如何去做),那么您很可能拥有一个未来的摇滚明星可能已经过去了,因为他们不知道您所说的“调用堆栈”是什么意思。


好吧,在法国(我怀疑在大多数地方都是这样),每门CS课程都包括一些用C(或类似语言)进行的强制性编码(当人们了解内存分配等),以及一些用C ++ / java /进行的强制性编码。 .net(了解OOP的地方)。最重要的是,您还做了很多可以涉及很多领域的事情,但是如果那些毕业生不知道什么是虚拟方法,那意味着他没有认真对待自己的学习...我当然知道那是我毕业的时候。。。你会怎么看一个不知道系列是什么的数学系学生?
布兰恩

@Brann-根据我对计算机科学的快速研究(以及我以前对它的理解),CS不是编程专业。是的,它具有编程功能,但这不一定是它的主要重点。就此而言,“计算机科学”是如此广泛而又含糊其词,以至于各个学校之间都有所不同。斯坦福大学是美国顶尖的CS学校之一,其秋季和冬季课程选择列表(www-cs.stanford.edu/courses)上,只有不到六门课程似乎专注于实际编程(不仅仅是程序论),大约50类。
肖纳

这意味着一个学生可能会在一两个学期内使用任何一种给定的语言,而在以后的职业生涯中却不会使用它。最重要的是,他还学习了机器人技术和基因编程,这与标准的桌面/嵌入式系统/固件编程有很大的不同。
肖纳

对于不知道系列是什么的数学系学生,您会怎么看?-这取决于学生所学的数学类型以及他实际从事的工作。同样,学生完全有可能已经学会了它(因此,从技术上来说确实知道它是什么),却只是忘记了它,因为他从未在密码学或离散数学的日常工作中使用过它。数学和编程通常被认为是“使用或不使用”主题。
肖纳

3

您有很多狭窄的视图,并且确实隐含了它们。

  • 在我期望某人已经在大学学习了几年编程的人与实际知道的人之间,似乎存在巨大差异。

    据我所知,没有一所大学,人们在那里学习编程几年。大学提供计算机科学课程,其中编程是一方面。

  • 引用类型和值类型有什么区别?

    经验法则:如果Lisp可以做到没有区别,那只会很混乱;)

  • 基本上,我会尽一切努力诱使受访者告诉我有关调用堆栈,堆等的信息,并且我会尽量坚持语言不可知论的概念。

    谈论与语言无关的概念是一个好主意。但是,堆和堆栈都不与语言无关。

  • 如果受访者告诉我他做了很多C或C ++或C#,我将更深入地研究特定的语言,并可能深入研究实现细节。

    所有这些语言都有规范。语言未定义实现。可以使用LLVM交叉编译C和C ++,使其在Flash Player或任何JavaScript运行时上运行。这使您关于堆和堆栈分配的假设无效。
    使用C#,几乎是一样的。在执行之前,通过大量优化可以对C#进行JIT处理。由闭包捕获的局部变量最终将在堆而不是堆栈上结束,而转义分析允许将作用域局部对象(通常应该进入堆)存储在堆栈中。正确的寄存器分配也将大大减少堆栈分配的需要。

  • 如果需要,我问受访者什么是调用栈,或者以他选择的命令式语言将传递给函数的参数存储在哪里。

    您会问一个只有广泛的编程经验是Haskell的人吗?:P

  • 大多数受访者不知道什么是调用堆栈,更不用说拳击方面的考虑了,等等。

    自动装箱的基本思想是,原语也可以视为对象(或者至少可以在运行时发现其类型的值)。关于这种抽象,有三种类型的语言:

    1. 那些不存在的地方。我认为Objective-C是典型的例子。
    2. 那些真正存在的地方
    3. 那些存在但不成立的地方。我猜Java是最好的例子(我想现在已经解决了)。

    我不明白为什么人们不应该使用类别1的语言(实际上是个好主意)。我不明白为什么使用第二类语言的人真的应该打扰。而且我认为每个使用3类语言(即,一个核心语义特征被破坏的语言)的人都使用了错误的语言。

  • 抽象类和接口之间有什么区别?在哪种情况下,您应该使用另一种方法?

    现在这是非常主观的,并且实际上取决于语言。C ++没有接口。Objective-C没有抽象类。我认为任何一种同时具有这两种语言的语言都需要重新设计。许多现代语言使用特征,混合,类别,角色和类似构造来提供比部分实现的继承更干净的代码重用解决方案。无论如何,基于原型的语言完全没有类。

    归根结底,这是一个困难而充满争议的主题。面试很难解决这个问题,我真的不会钉任何人申请初级职位而不给我一个很好的答案。

  • 大多数受访者都不知道真正的继承目的是什么。他们通常知道一些关键字(虚拟关键字,覆盖关键字等),但并不真正知道何时使用它们,更不用说解释什么是虚拟表了。

    有许多面向对象的语言,不使用继承或经典vtable。

我的建议:

  • 非常小心,以为您对编程了解的一切实际上都是基本的编程概念。您可以假设每个优秀的程序员都有好奇心来寻找此类问题的答案。但是,您不能假设任何认识他们的人都是好人。我倾向于相信那些非常重视这些细节的人实际上可能看不到森林。
  • 不必担心实施细节。编程语言旨在创建抽象。您只需要根据这些抽象来思考。好的代码不是针对语言的实现细节编写的。它旨在将您的解决方案的语义最好地嵌入语言功能中。如果成功做到这一点,您的代码将不仅变得健壮,而且对熟悉该语言的任何人都易于阅读,并且更容易针对编译器进行优化。
  • 了解您期望的答案并不那么重要。了解他们是。如果有人只是因为认识他们,因为他们在一本教科书中读过它们,或者因为他的教授告诉了他们,那么这没有什么价值。实际上,您可以在几个小时内向自己解释所有这些事情。
    重要的是您了解如何将这些简单而孤立的事实应用于设计复杂问题的灵活且可维护的解决方案。

要解决真正的问题:

您认为我的公司在吸引人才方面可能存在问题,还是在自己的招聘过程中遇到相同的问题?

除了大型企业,所有公司都存在吸引熟练人才的问题。那是因为他们很少。并且由于这种假设,大学使人们变得熟练。没有。它使他们知识渊博(假设学生和大学都坚持自己的讨价还价)。经验是使人们熟练的技能。

有一些人在上大学之前就已经积累了经验,并且在学习期间继续这样做。因为他们喜欢编程,并且因为他们在课程中学到一些新想法时会尝试看看如何使用它,这是他们回到家中的第一件事。这是您想雇用的那种人。但是很少。
对编程和自我完善的热情以及对程序员的追求使程序员变得更好。及时。

我认为,您必须认识到,可悲的是,大多数人会在没有足够编程经验的情况下上大学。
同时,我们行业急需经验丰富的程序员。因此,我认为实际尝试介入是我们行业的使命。面试应聘初级职位的人,实际上是您愿意学习和改进的人们。您应该谨慎选择,因为您将需要投入大量精力,并且您不希望浪费这些精力。

可以认为这是雇用新鲜血液来成为赛车队的驾驶员:一个好的驾驶员对机械学有足够的了解,可以充分利用自己的汽车,但是仅此一项就毫无用处(甚至连头脑都没有开始)。您正在寻找的是愿意为自己的进步而努力并与您的团队保持良好关系的人。


1

不管我没有什么线索(值类型?好吧,我不确定,谢谢更新),我认为您对您的问题是正确的,而且完全不是极端主义者。如果有人马上就要离开学校,这些都是可以回答的问题。不过,我不会立即解雇候选人,仍有一些人可能因为他们学习而有潜力。

继续进行驾驶执照类比:有些人不在乎插入密钥(或按“开始”按钮)时会发生什么。他们只是这样做并开车。这也不意味着他们也一文不值,只是他们需要一段时间才能成为明星;-)

只是个人对学位/文凭的评论:我目前正在与具有化学领域和工业背景的人一起工作,这些人在IT领域拥有几年的经验,还与一些具有CS背景的“经验丰富”的人一起工作,并猜测谁是最有知识的人车辆发动机如何工作?是的,不是学习CS的人!所以我只是在经历文凭并不总是很重要的事实!


2
有些人可能花了很长时间来修补他们的车辆,以使其达到最高速度,以至于慢速的车辆甚至在启动之前就完成了。

足够公平:-)
Jalayn

对于CS以外的其他领域的人,我完全同意。但是对于实际上拥有CS学位的人来说,至少可以说不知道什么是价值类型似乎有点令人担忧……
Brann

@brann,他们可能不知道该术语,但仍然知道该变量保存的数据的物理位置位于数据段中,而不位于堆或堆栈中。您使用哪种语言,因为这似乎很重要?

我正在使用c#。而且我同意,了解这种实现细节在那种情况下可能并不那么重要(尽管在某些特定情况下可能如此)。事实是,我不是要寻找ac#专家。我试图找到一个足够聪明和有足够的动力去变得真正擅长使用C#编码的人。如果一个人不愿意学习/理解什么是价值类型,我倾向于(也许是错误地)认为他错过了这两种素质中的一种,至少
Brann

1

在面试过程中,我通常不会问有关术语或定义的具体问题。正如其他答案所指出的那样,人们对不同的概念使用不同的术语,尽管他们可能在概念上理解该主题,但可能无法将其传达给您。

在大三学生中,我非常关注他们的实习或学校项目。我问关于他们的问题的问题,让他们说清楚答案,然后我开始更深入地研究他们在项目中的实际参与,他们学到了什么,他们的感受如何。

通常,如果这个人在项目中很沉重,那么他们通常无法给我满意的答案,因此通常很容易分辨出来。只要注意不要将紧张和内向的错误误认为是无私和无关紧要的。

能够确定一个害羞和内向的好候选人有点困难,但是,我工作的文化对一个内向且害羞的开发人员来说就不好了,所以如果他们不能与我进行富有成效的详细对话,那么他们不太适合。


1
 or chose his university very unwisely.

那是非常不公平的。当您是一名学生时,您所能做的就是选择成绩最高的大学,或者打招呼让您与踢足球的机器狗一起玩的那所大学。而已。您只能在完成大学课程后对其进行评估,然后离开该行业并在行业工作了几年,并建立了一些不平凡的项目。

即使您在每门这样的课程上都闪过一个巨大的霓虹灯,说“我们不要教电话栈”,那么您希望学生们怎么做呢?花几个月的时间研究它,以便他们实际上可以理解这意味着什么以及需要多少东西来教它呢?每门课程都有各种标志吗?

人们不会现实地选择他们的教育。


0

在面试新毕业生时,我坚持其简历中列出的主题。如果他们使用Java,我将向他们询问Java。如果他们使用Blub,那么我花了半个小时阅读有关Blub的内容,并询问他们有关该内容的信息。但是我总是问使用language关键字。如果是Java,那么我会问“扩展”和“实现”,而不是“子类”和“继承”。我希望新毕业生能够谈论他们编写的一些代码,能够解决一个简单的编程问题,并掌握基本的数据结构(哈希表和树)。


0

作为设计面试流程的主管,我可以向您介绍公司对新毕业生的期望:我希望人们能够阅读文档并运用知识。因此,我们有一些非常实用的要求我们执行的任务。这些是简单的编码任务,并不比您的普通大学课堂练习难得多(有经验的“好”开发人员可以在大约15分钟内完成任务)。该候选人将获得一个可以访问互联网的工作站,一个编译器(在我们的示例中为Visual Studio)和帮助文件。

如果他们在这种情况下不能编写代码,则不会考虑雇用他们。就那么简单。整个“我不懂语言”的借口从来没有真正让我感到讨厌,因为每位来这里面试的候选人都知道会有测试,他们知道我们预先使用的语言和工具。您可以在家中下载Visual Studio Express,并在通过入门级测试之前做一些基础工作,那些不打扰的人……那就是我所说的危险信号。


这是找到声称自己知道某事的人的最佳方法,而他确实知道某事,足以使用它。询问术语的含义是什么,在教室外面很少使用,这是毫无意义的。我的意思是,在过去的18个月中,我从未有过关于引用类型的讨论,但是可能会抱怨涉及指针的内容。
拉姆猎犬,2011年
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.