如何采访自然科学家的开发职位?[关闭]


30

原始问题

我已经为公司做过一些采访,主要是开发人员职位的计算机科学家,还有一些测试人员和项目经理。现在,我必须填补研发部门的研究小组的空缺(旁注:“研究”是指我们试图与大学,其他公司,研究中心一起使用研究项目中的软件来解决专业领域/市场领域的问题。和最终用户组织。这不是计算机科学研究;我们不会解决P = NP问题)。

现在,我们邀请了一个拥有化学硕士学位的人(他的简历中也有很多物理学方面的东西),他从未上过任何计算机科学课程。在当地一所大学的职业生涯中,我已经与他交谈了大约半小时,毫无疑问,这家伙很聪明。他的成绩也很出色,并且以优异的成绩毕业。为了获得理学学士学位,他需要在Mathematica中自学编程,并且可以相信地告诉我他非常喜欢编程。此外,他使用自己的软件(在Mathematica中实现)解决了理学硕士问题,可能解决了一些我可能不理解的物理化学问题。它包括一个GUI和8,000 LoC的显着大小。他似乎对我们在研究小组中所做的事情非常着迷,并且说实话,像我们这样的中小型企业很难找到好人。我对雇用他也很感兴趣,因为他可以协助我撰写项目建议书,报告,做演示等。他可能也适合我们的团队。

剩下的唯一问题是:我将如何检查他是否将获得在我们的项目中进行软件实现所需的编程技能,因为这将是工作的重要部分?

我当然会问他是什么,这让他着迷于编程。我还将询问他如何着手编写其自然科学软件以及其结构。我将询问他如何设法获得所需的软件开发技能和信息。但是我还有什么要问的吗?也许更具体些?我应该请他解释一下他的Mathematica解决方案吗?

需要明确的是:我不是在寻找特定语言或技术堆栈中的知识。我们是产品开发方面的.NET商店,但我想为我们的研究项目提供自由选择。因此,我对元能力能够学习实际需要的内容感兴趣。

我希望这个问题是可以回答的,而不是开放性的,因为我真的很想知道是否存在一种默认的方法来检查获得进一步的编程技能的能力。如果您不清楚某些地方,请给我一些评论,让我改善我的问题。

更新以反映在2011-12-01之前给出的答案

我接受什么答案,为什么

谢谢大家的回答,其中大多数都非常有帮助,所以我表示非常赞赏!尽管汤姆·斯奎尔斯(Tom Squires)的答案获得了最多的票,但我将接受古拉什亲王(Prince Goulash)给出答案。当然,汤姆(Tom)客观上是正确的,但是Prince的回答对我来说更有用,我仔细检查了FAQ(常见问题),认为是接受答案的标准。

面试中我要问他什么

  • 我让他解释一些简单的任务,例如克里斯·伯特·布朗(Chris Burt-Brown)提到的《骆驼有两个驼峰》中 的示例

  • 我将请他以图形方式解释一些更高级的控制流程。

  • 我将使用一个数学示例来检查他对递归的理解。

  • 我让他用自然语言解释他选择的算法。

  • 我将让他解释他的Mathematica解决方案,特别是我将询问他的过程模型,工具的使用,总体上代码和软件的结构以及不同的抽象层。

  • 为了检查他的动机,我将要求他对软件开发感兴趣。

  • 我问他是否知道他需要了解有关企业软件开发的知识。特别是,我希望将讨论转变为团队合作,结对编程,TDD的方向,因为我希望他仅凭自己的MSc工作就不会对此有很多了解。

听起来这将是一个漫长的采访;)

面试后更新2011-12-09

再次感谢大家的良好回答。他通过面试通过了面试。我从未对申请人感到满意。他的Mathematica解决方案似乎结构良好。尽管他不知道这些被引用为高阶函数,但他能够解释在哪里使用了高阶函数。他回答了我基于数学的递归问题,以及《骆驼有两个驼峰》中的简单作业和控制流程问题。当他解释一些算法时,我学到了很多关于非线性拟合的知识;)另外,他老实说,他当然不能保证他将能够学习到到目前为止尚不了解的有关专业软件开发的知识。但他可以相信地说,他总是擅长学习新概念-即使是独自学习-并且对软件开发真的很感兴趣。他还要求提供该项目的技术堆栈,首先将他应用到家里进行研究。他也对结对编程和团队合作感到好奇。现在,我希望能订立雇用合同。


9
我发现公司愿意雇用对使用的技术一无所知的人感到非常高兴。希望我能在职业生涯中找到自己的公司!
NoChance 2011年

Emmad:这就是我试图用“元竞争力”来解释和表示的意思。现在,如果我聘请了一位优秀的C#程序员,而该程序员无法(或不愿)学习Scala / Lift,那么对公司的好处是什么?老实说:在德国很难找到好人。尤其是当您不是像我们这样的时尚大都市中的中小型企业时。
Silas

2
请他对特定语言的简单控制流和其他非常基本的技术进行一些研究。然后,当他进来时,请他用这些来解决问题。
达伦·杨

2
目前,我已经与一些由科学家转为开发人员的人员合作。恕我直言,他们往往非常擅长解决开发中的问题,而不太擅长编写具有良好OO原则的可维护代码。如果您希望他不只是编写“快速而肮脏的”工具,还需要让一名传统的开发人员与他合作。
乔丹·本特利

2
我几乎是这个家伙。我具有计算物理/化学背景,并且开发了许多计算模型/代码,以及许多(有时很复杂且成功的)附带项目。我在专业开发环境中必须进行的主要调整与开发方法和团队合作有关。确保他了解在软件上一起工作需要什么。确保他了解您使用的方法(TTD /连续集成之类的东西)以及与他们合作对他的输出意味着什么。
drxzcl 2011年

Answers:


21

我在这里非常有偏见,因为几年前我以一名软件开发人员的身份开始了物理学博士学位,但是很少有编码经验(相当于Fortran的本科课程)。显然,这取决于您所开发的软件的类型,但是我的观点是,具有半个体面的科学/问题解决能力的人都非常容易掌握编码技能。我不希望这是对研究计算机科学的终身程序员的侮辱:当然,有些技术方面需要经过认真的培训才能掌握(例如多线程和非常低级的体系结构),但是我认为那是不是您要填补的职位。

就我目前的职位进行技术面试时,我遇到了一个相当复杂的数学问题,并被要求设计一个解决该问题的程序。重点是编写一种算法,该算法一旦实施便可以解决问题。我可以只使用单词来描述我的解决方案来写一个答案,但是如果我愿意的话,也可以用我选择的语言写一些代码。测试更多地是关于解决问题的能力以及我是否能够“像程序员一样思考”。显然,如果有能力相同的候选人,并且具有更直接的编码经验,那么他本来会很出色,但这对我来说似乎很公平。

最重要的是:检查候选人的技能,而不是希望他实现的理想。


2
与曾经是科学家的程序员一起工作过,不仅是他们不了解的底层细节,而且还有非常高层的东西。当然是YMMV,但这是普遍缺乏深度的问题。并非所有工作都需要...
Donal Fellows

1
@DonalFellows:我毫不怀疑经过特定培训的开发人员可能缺乏知识的广度和深度。它取决于角色以及所提供的内部培训的数量。
古拉什亲王

1
@DonalFellows:鉴于操作人员对确定申请人的学习能力感兴趣,而不是对他目前的知识

2
@DonalFellows:就像我之前说的那样,考虑到OP有兴趣确定申请人的学习能力,而不是他目前的知识 ……

2
@马克·班尼斯特(Mark Ba​​nnister):一个好的科学家可以学习,这不是一个有用的问题。一个更有用的问题是科学家是否会学习他或她需要知道的知识。那更多是个性问题。科学家是否知道他或她不了解软件工程的知识?
David Thornley

37

我如何检查他是否会掌握所需的编程技能

你不能。准确测试他还没有的技能是不可能的。您必须根据他的才智和态度做出判断。最终总是会有风险的。

根据个人经验,我可以说有可能从科学过渡到编程。他们基本上都归结为使用大脑来解决复杂的难题。


8
+1表示“他们基本上都归结为使用大脑来解决复杂的难题。”
joshin4colours 2011年

1
你怎么了 雇用那个家伙,看在天堂的份上!请记住,程序员只是高科技车床操作员。他热情,聪明,并且懂很多化学。如果您雇用他,那么下次您从现在开始一年以后再雇用您时,您会踢到您没有的屁股。
彼得·威尔逊,

1
CS毕业生从13岁左右开始从事编程工作的情况并不罕见。当他们进入大学的时候,大多数情况下他们已经是中级程序员。这并不意味着他们没有学到任何东西。编程很容易...计算机科学/软件工程不是。这并不是说他们将无法做出贡献并成为有价值的成员……但这确实意味着他们可能永远不会拥有相同的CS基础。
2011年

6

我没有任何其他来源来验证本文,因此我不能保证,但是:

骆驼有两个驼峰
http://www.eis.mdx.ac.uk/research/PhDArea/saeed/paper1.pdf

我们找到了一种针对编程能力的测试,并提供了详细信息。我们甚至可以在学生接触任何编程语言之前就非常准确地预测成功或失败,并且可以通过在暴露几周后使用同一台仪器进行测试来达到极高的准确性。


3
阅读该论文后,我相信要记住,我前一段时间已经阅读了有关该研究的更多内容。只是再次找不到它:(编辑:它在Coding Horror中提及,感谢您的提醒
Silas

您击败了我,我正要通过编码恐怖链接来回答@Silas添加
2011年

5

我如何检查他是否会获得所需的编程技能?

非常简单 给他技能。

现在,这不是一个非常令人满意的答案,但让我详细说明。

我在土木工程专业工作了3年后开始编程。这是应用物理学和数学的扎实背景。这不是CS学位所能提供的理论数学,但这是值得的。我从工程经验中汲取的经验是解决问题的坚实背景。具有数学背景的任何人在谈论问题的解决方案时都已经意识到优雅的概念。自从他们花了一些时间抓紧六页鸡的草稿并将其转换为可提交的精美的半页校样后,他们就已经接受了重构方面的培训。

任何研究过物理学的人都已经开发出一种直观的方法来将基本框架中的解决方案整合在一起。

这些技能之外的编程是什么?-语言,习语,模式和框架。这些很容易教。解决您无法解决的问题。如果您能够在这些方面提供指导,那么您将获得一名优秀的开发人员。

然后问题变成“您能等他多久才能站起来?”

tl; dr; 您可以教打字。你不能教聪明。


+1,非常好的答案。我希望人们对职业有更多开放的看法:拥有数学学位并不意味着您不能以编程为生,反之亦然。学习是IMO的重要技能。
K.Steff

2

我拥有材料科学理学学士学位,但我在软件开发方面的全部职业生涯都曾工作过。

我建议您的候选人可能不会对基本的编程和算法有任何疑问,但是当涉及到更多的“工程”类型需求时,他可能需要一些指导。我的意思是说,要很好地构造他的代码,不具有500个行函数,进行有效的测试,以提高效率。

可以讲授大多数内容,但是您可能需要设计一些问题来解决这个问题。


2

此外,他使用自己的软件(在Mathematica中实现)解决了理学硕士问题,可能解决了一些我可能不理解的物理化学问题。它包括一个GUI和8,000 LoC的显着大小。

在我看来,应聘者已经知道如何编程,因为他们可能没有专门开发人员拥有丰富的编程经验,但是他们有一个可证明的项目,即他们已经完成,需要完成大量工作。因此,您可以像使用使用与您的商店使用的语言不同的语言的开发人员一样采访候选人。

  • 核心能力 -候选人是否了解基本程序逻辑,流程控制,基本数据结构。
  • 高级能力 -候选人是否了解面向对象的编程和设计,高级数据结构,接口,抽象类等。
  • 解决问题的能力 -给定问题,考生是否表现出扎实的解决问题的能力。

Mathematica使用的语言相当先进,并且擅长为Mathematica编写软件的人应该在其他领域也能胜任,因此专注于该经验并将其用作编码经验的基础可能是进行访谈的好方法。


2

以航空航天工程专业的毕业生转为程序员的身份来说,从自然科学到编程的飞跃无疑是可能的。但是,请注意,能够解决问题并不总是与编写代码的能力相关。您似乎意识到这一点,这是一件好事。

对我来说,确保他掌握的最重要的概念是控制流递归(通常将其作为子集进行循环)。在雇用候选人之前,即使是非常聪明的人也要确保他可以写出简单的单词算法来解决问题。确保他可以采用该普通字算法并将其至少转换为伪代码。您甚至可以探究一下他是否至少可以理解多态性的概念,尽管在这种情况下我不确定这是否是必不可少的知识。

还要提防在Mathematica / MatLab /中解决科学问题的能力,但这并不意味着他可以编写出色的代码。这仅意味着他能够应用基本的(有时是极其基本的)编程原理,通常是if / else语句。学习成为一名优秀的程序员通常会在这个阶段对某人做出个人和雇主的承诺。警告:我遇到了非常聪明的人,他们都是优秀的工程师,无法从纸袋中编程出路,说实话,他们无法掌握基本的语言基础。

个人经验

我从学校毕业,获得了工程学学位,并拥有一些编程经验。我曾经使用过非常少量的C,相当多的MatLab和一些VB + Access。我花了大约3个月的时间学习才真正成为VB.NET商店的程序员。我又花了9个月才完全熟练。但是,我可以很自信地说,我的问题解决能力优于我在工作中遇到的其他程序员中的99%。我的雇主一直认为我是他们更有价值的资产之一。

结论

这是一个风险/回报的主张,但是通常只要有能力学习纯粹的问题解决能力的人就可以长期受益,只要他们能够学习编程概念,并且你们俩都愿意花时间在扩展他的编程上知识。但是,我坚信,在向他提供工作之前,他必须至少对编程的基础知识有基本的了解。以我的经验,一旦您处于这一点,就可以走得更远。


感谢您的回复。它证实了我的大部分想法。我只想补充一点,我遇到了很多计算机科学家,他们作为开发人员和架构师已经工作了多年,他们也无法编写出色的代码。甚至有些撰写有关编程的技术文章的人。底线:要想成为一名优秀的程序员,无论您拥有何种学位,他总是需要阅读大量书籍,学习不同的语言等等。
Silas

1

我将从一些基本的算法问题和基础知识入手,看看他是否对算法和编程逻辑感兴趣。如果他能够理解什么是算法,那么他最终可以发展出以后做具体事情所需的技能。


1

我该如何检查他是否会获得在我们的项目中进行软件实现所需的编程技能,因为这将是工作的重要部分

老实说,我很确定您不会在一两个小时的采访中得到这些信息。给他一个用C#编写的编程任务(不是太技术性的东西),需要一两个星期来解决。对于已经学习过Mathematica编程的人来说,这应该是足够的时间来学习该语言的基础知识。然后与他进行一次代码审查,并在此基础上做出决定。


1

您可能会看科学环境中的编程实践?(在Stack Overflow上)以了解自然科学的编程文化是什么样的。这样,您就可以将他的准备与同龄人的准备进行比较。

为此,您可能会要求他描述他惯用的编程实践,以便了解他是否知道还有其他方法可以做到这一点

我的企业中有许多“优秀程序员”,其资格是能够在头脑中保持足够的状态来拼凑一些工作代码,但其工作往往是非结构化的,并且难以维护。一般来说,他们可以教,但是......他们被教导。


0

我工作的另一个部门在我们的标准测试中使用了变体。第一个任务是将字符串中的单词反转。然后,使用该代码反转字符串中单词的顺序,但仍然保留。他们没有使用编程语言,而是让候选人在纸上设计算法并使用Scrabble板运行它们。


0

我会要求描述(使用自然语言)一种从物理学中计算出某种东西的算法。比简单的公式稍微复杂一点,然后我问他如何将他的计算封装在对象中(不需要OOP知识,您可以解释对对象的期望)。通过这种方式,您可以看到他的逻辑思维。这比任何编程技能都重要。


0

首先,他们可能很聪明,因此在最坏的情况下,他们可以学习成为有指导的优秀程序员。但是,如果您需要他们加入并成为一名优秀的程序员,请让他们发送一些他们编写的示例代码。

是一两个巨大的多功能函数,还是它们在适当的抽象级别上封装了功能?魔术数字始终是硬编码的吗?代码是DRY吗?他们给变量取了合理的名称,还是所有内容都是无法理解的缩写或单字母变量?您能否大致遵循其代码的逻辑?他们了解OO基础知识吗?

询问他们用于版本控制的内容(git / hg / svn / cvs / bzr等)。他们曾经分析过代码或使用过调试器吗?如果是,则使用哪种调试策略或它们的通用调试策略是什么?

如果他们没有通过此测试,并且您一开始就需要一个好的编码器,请跳过此人。否则,雇用他们,建议他们除了阅读通用编程/ CS书籍以外,还要阅读一些软件工程书籍(例如,Code Complete)。

(根据记录,我也是物理科学家,后来成为程序员。)


-3

由于他仍在大学里或刚刚毕业,所以习惯了学习。让他阅读和理解《设计模式》一书,一个月后(或一个月内)与他就这些主题进行彻底的讨论。(我认为)这可以告诉您很多关于他的能力(不仅是硬能力(也包括那些硬能力),而且还包括他如何处理新概念,理解其用法,了解优缺点等)。但这将花费您一个月的时间。


8
-1问题是关于如何采访他,而不是如何使他停止想要这个职位。
彼得·泰勒
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.