你知道一个好的客观的问题/测试来检查科学计算工作的申请人吗?
(事实上,这个测试是在候选人通过面试之后进行的。)
1)他们需要聪明。(编辑,感谢特伦特的话)
2nd) 他们必须主要处理编程(C++ 和 Python,使用科学库)、数字和数学,还要处理工程和物理主题。此外,不需要类似 C 或类似 Fortran 的风格......使用 OO 概念会很好。
申请人可以访问编译器、工具、库和互联网。测试时间不应超过 4 小时。
你知道一个好的客观的问题/测试来检查科学计算工作的申请人吗?
(事实上,这个测试是在候选人通过面试之后进行的。)
1)他们需要聪明。(编辑,感谢特伦特的话)
2nd) 他们必须主要处理编程(C++ 和 Python,使用科学库)、数字和数学,还要处理工程和物理主题。此外,不需要类似 C 或类似 Fortran 的风格......使用 OO 概念会很好。
申请人可以访问编译器、工具、库和互联网。测试时间不应超过 4 小时。
寻找聪明的人,他们将能够适应您的特定要求。这比试图找到满足你所有“复选框”的人要好得多。
但是您仍然应该测试它们是否会计算。有很多关于面试编程测试的帖子。不要担心您的特定域,只需看看他们是否可以编码。
它总是令人大开眼界;永远不会无聊。最好做一个较小的测试并与他们讨论,而不是一个大的测试。问他们为什么做出各种选择等。然后你就可以看看他们是否能清楚地解释自己
好吧,一个简单的问题是要求某人使用他们希望使用的任何库来解决一个简单的 ODE 系统。我所知道的库中没有一个足够简单,以至于可以在测试期间学习它们。例如,解决这个系统x=1:10
:dx/dt = -k (x^2/x)
。
更难的是请某人解决一个僵硬的ODE 系统。在这里,算法的选择变得很重要,“猜测”可能行不通。例如,大多数 Michaelis-Menten 方程都是刚性的。
dS/dt = - vmax * S/(Ks + S)
其中 dS 是底物消耗率,vmax 和 Ks 是常数(你可以给候选者)。正如我亲身发现的那样,在这里选择错误的求解器会导致相当灾难性的结果。
这两个问题本身都没有任何好处,因为几乎任何人都可以在 4 小时内通过反复试验来解决任何一个问题。但作为更大测试的一部分,它们可能有用。
编辑:它证明了什么?好吧,ODE在科学计算中无处不在。如果您至少在某个时候没有草率地处理它们,那么这就是您知识上的一个大漏洞。我只是尝试按要求回答问题。“要向科学计算工作的申请人提出哪些具体问题?”。为了解决申请人必须知道的问题
1) 基础微积分。
2)某种科学计算库(MATLAB、SciPy、GSL)。
3)如果问题被恰当地提出(例如,如果他们被要求计算加速度),那么领域知识(在这种情况下是物理学)也会被测试。
我认为这会检查所有框:)
我可能会后悔,但这是我非常普遍的建议 FWIW
1)不要面试候选人而不是工作规范。
在你的规范中至少有一套你不会妥协的“基本”,然后看看候选人,看看他们为这个职位带来了哪些其他技能——他们甚至可能带来你不知道自己需要的技能
2)做测试候选人
测试可能是几个口头问题,笔试等。这并不重要,但您绝对需要了解候选人知道什么以及他们不知道什么。
3) 一定要让候选人写代码
您将通过他们如何解决问题、他们如何实施问题以及更重要的是他们如何解释他们对您所做的事情来了解他们的更多信息。记住,这就是你雇佣他们的目的,这是他们一天中大部分时间都在做的事情
4) 不要问很多“记忆问题”</p>
要求某人记住 std::algorithm 的确切格式或 System.Xml.XmlDocument 中的所有方法是没有用的。人们使用文档和智能感知——克服它。
5)问开放式问题
问一些没有“正确”或“错误”答案的问题——这样你就可以让候选人有机会提出他们的意见,并且你正在进行对话,而不是美化的“勾选清单”。双向对话很有帮助,因为它可以让候选人放松,同样重要的是,它可以让你放松。进行讨论可以告诉您很多关于候选人的信息,即他们是否听取您的意见,他们如何回应反驳
6)看看他们是否已经完成了他们的研究
总是询问候选人是否听说过你的产品/团队/游戏/公司。如果他们不能告诉你他们申请的公司的最细微的一点,那么你很可能不希望他们在你的公司。毕竟输入谷歌需要 30 秒,所以对这个很残酷。相信我。
7)不要自己面试
你可能超级聪明,你可能知道你想要什么,你可能认为你可以读懂别人,但软件开发主要是一个协作的努力,所以要找几个人,不要只找另一个经理或高级程序员——带上在你的团队中并听取他们的意见。重要的是,事后赶上并讨论候选人,而它仍然在你的脑海中。
8)不要急于面试
分配面试的时间很大程度上取决于你面试的职位类型,即初级、经验丰富、高级,但除了你认为需要多长时间外,还要给自己额外的半小时。这给了你喘息的空间,如果你早点做完就好了。如果需要,请进行第二次面试。我经常做两次面试——第一次是技术性的,第二次更关注个性和团队。
你可能觉得不合适或者你没有时间,但不要打折扣。如果你觉得你第一次没有从候选人那里得到足够的东西,但仍有潜力,那就让他们重新加入。如果他们想在你的公司/团队工作,那么他们会回来的。
9) 一定要索取证据
如果候选人说“对……的发展做出了重大贡献”,那么请详细询问他们做了什么,他们从经验中学到了什么以及他们将再次做什么。如果他们不能给你证据和细节,那么他们很可能没有“做出重大贡献”。当心那些一直使用“我们做到了”的候选人。当然,开发是在团队中完成的,但他们必须能够说出他们的贡献以及描述团队的努力。
10) 做好诚实和直率的准备。
大多数候选人略微过度推销自己。这很好,他们的简历就是让他们获得面试的原因。但是,如果您认为候选人对他们的经历并不完全坦率,那么就这么说吧。确保您探索优势和劣势。太多的面试最终变成了一场冗长的销售交流。是的,候选人知道 UDP 的来龙去脉很好,但他/她是否知道他们何时做出了错误的决定以及如何处理?询问他们上一次犯错或上一次做出错误决定的时间。小心不要太重手或判断力 - 犯错误是完全自然的,我们大多数人一直都在这样做,重要的是我们如何处理它。
11) 不要被自信所吸引。
了解自己的东西和认为自己比其他人更好之间有一条很好的界限。在像编程这样的知识型职业中,这对我们所有人来说总是一种诱惑。我同意杰夫阿特伍德的观点。一个好的程序员知道编码很难,他们会犯错误,而且很多时候他们的代码很糟糕。糟糕的程序员不会——他们认为其他人的代码都很糟糕。买者自负。
我可以想到您可能想要涵盖的几点:
我认为你最好尝试与这个人讨论一个问题,看看他们在遇到这个问题时是如何推理的。他们想到了哪些算法,熟悉了哪些解决问题的方法?他们看到了哪些可能的陷阱?
通过允许该人与您讨论,您可以适应他们的特定技能,并且拒绝对考试感到紧张的候选人的风险也较小。你也可以很好地判断这个人是否适合你的团队——你不想要一个非常擅长解决面试类型问题但又不想讨论其他解决问题的方法或诸如此类的人。
测试他们的数学。关于他们应该具备的任何特定领域的数学知识的几个简单问题是非常客观的,并且可以快速筛选出 90% 甚至在该领域没有业务的申请人。
我们经常从一些基本的线性代数问题开始我们的申请者。如果有人不知道什么是交叉产品,那么继续面试就没有多大意义了。
一位(好)老板我曾经喜欢在电话屏幕采访开始时提出这样一个问题,“二到八是多少?” 令人惊讶的是,有多少人弄错了。(摇晃它不会结束电话屏幕,但它是一个非常强烈的预测候选人通常会遇到一些严重问题。)
以前的答案似乎都没有提到特定领域的知识——你在科学的哪个部分(在 21 世纪变得相当大)工作?我与一个致力于计算电磁问题的地球物理学家团队合作。有很多优秀的科学计算家我们不会再看两次,因为他们的领域离我们太远了。
我建议培训具有正确领域知识和错误编程知识的人比反之更容易。
“让我相信你是这份工作的合适人选”
通过这个问题,您可以测试一个优秀程序员所需的所有技能:
...唯一未经测试的是团队合作能力,但无论如何这都是一件很难测试的事情。
PS至于知识,您可以随时要求该人以“他知道的最可重用的方式”实现循环环形缓冲区,而无需访问互联网,无论是在python还是C++中。真正的“可用”代码比大量的复选框问题更能说明人和他们的编码文化。
这是一个相当有趣和困难的科学问题,但如果你的候选人真的很好,它可以在四个小时内解决。如果没有,您可以要求他们描述解决方案而不是实施它,或者判断不完整的解决方案。除了良好的编程技能外,还需要高中水平的物理。
在中央供暖系统中,有一个水循环网络,由以树形结构连接的管对组成。在叶子上有散热器,每个散热器需要发出相同的加热功率 P(常数)。在根部,进入管网(管对的热管)的水被加热到温度 T1(恒定)。树的内部节点是管道对,每个都假定有一定的长度(常数 len)。
热管中消散(损失)的热量为 U * len * (T1 - T0),其中 T0 是室温(常数),U 是传热常数 (W/(m*K))。由于这种功率损失,水在到达散热器之前会冷却下来(即使温度稍低也意味着散热器发出的功率要少得多)。
每个散热器都有一个调节流量 (kg/s) 的阀门。流量和温度共同决定了散热器的辐射功率。您可以使用以下功能:
radiatorPower(flow, temperature) -> power
实现一个将网络描述为树的数据结构和一个算法来确定每个散热器所需的流量,以便radiatorPower(流量,温度)等于P。
请注意,返回冷水的温度由发出的功率控制,不能直接控制或测量。另请注意,在树的每个分支处,管道对携带的水在节点的所有子节点(散热器或其他管道对)之间分配。管道热损失方程使用所有管道的初始 T1,因为假定树中较高管道的热损失对于热损失计算并不重要(T1 >> T0 并且损失很小)。
Water specific heat: c = 4190 J/(kg*K)
我觉得你应该问问他的经历。关于问题:不要问语言特性问题(比如 a = b ?? c ?? d),程序员应该对算法有想法,解决问题和团队中的良好沟通技巧(这很重要,真的)
我认为这样的事情不需要特定的测试。只需找一些已经在该领域工作的聪明人与申请人聊天即可。也许还包括 Kornel Kisielewicz 建议的内容。询问他或她以前的项目、使用的技术、他/她喜欢什么、不喜欢什么等。如果面试官很聪明,他们将能够判断他是否适合这份工作。
我曾接受过一般软件开发人员职位的面试。在聊了几句之后,他们说:“在你的简历上,你说你非常了解 C++ 和 Java。告诉我们你所知道的这两者之间的所有差异,而不仅限于语言本身。” 从那里它很好地流动,你可以在合适的时候轻松提出问题。就像我说 C++ 通常被翻译成机器码而 Java 被翻译成字节码时,他们会问字节码是什么意思,这两种方法的优缺点是什么,等等。