程序员,最重要的是技术能力、沟通能力、团队协作能力、发现问题的能力。那么如何才能在面试中获得成功呢,就需要你把这几点都发挥出来。
1、热爱技术
表达你对你所做的一切感到骄傲,你对自己的选择充满自信,你对语言和工作流有着自己的看法。
涉及到编码问题的时候,沟通是关键。
一个在工作时需要帮助却能和人正确沟通的求职者比那些能轻松解决问题的求职者甚至更好。了解这是哪种问题。有两种类型的问题:
编码。面试官希望你能针对问题写出简洁高效的代码。
闲聊。面试官希望能和你聊一聊。
话题通常是(1)高水平的系统设计(“如何克隆Twitter?”);(2)琐事(“Javascript中的hoisting是什么意思?”)。
如果你开始编写代码,并且面试官并不想多说废话,只想尽快过渡到“实际”问题,那么如果你罗哩叭嗦太多的话,她可能会觉得厌烦。不妨直接问,“是不是为这个问题写代码?”
2、让人感觉你有团队精神
面试官想知道和你一起工作是什么感觉,会有什么问题,所以要让他们看到你的团队合作性。使用“我们”来代替“我”。
把自己的想法大声说出来。不是开玩笑,比如说:“我不知道这样做是否有效——但请让我试一试。”如果你不知道怎么办,不知道这个问题该如何解决,那么就说一说你现在的想法。
说一说你认为怎么做可能会有效。说一说你认为哪些会有用,以及为什么没用的原因。
这同样适用于琐碎的闲聊问题。当面试官要求你解释Javascript闭包的时候,“这与范围有关,不妨把它放到一个函数中”可能会让你得到90%的分数。
不知为不知。如果正在谈论的话题(例如,具体的语言事务,具体的琐事,运行时分析)的确是你不曾涉猎的内容,那么不要不懂装懂。相反,你可以直接说。
说话不要不经大脑。不要自信地将答案脱口而出。如果是正确的,那么你还是需要时间来考虑如何解释,如果是错的,那会显得你冲动鲁莽。
你不是在和人比速度,而且你这么做更有可能因为打断她的话或者妄下结论而惹恼她。
3、摆脱困境
有时候你会陷入僵局,放松。这并不意味着你已经失败了。
请记住,面试官通常更在乎的,是你能否巧妙地从几个不同的角度去揭示问题,而不是一根筋走到底地坚持正确答案。
画图。不要浪费时间在脑袋里思考,可以画到板上。画出几个不同的测试输入。画出你如何手动如愿得到所需的输出。然后想想将你的方法转换成代码。
解决问题的简单版本。不知道如何找到集合中的第4大条目?那么想想如何找到第1大条目,然后试试能否沿用这种方法。
写一个简洁低效的解决方案,然后对其进行优化。
讲讲自己的思路。讲一讲你知道什么。讲一讲你认为什么可能工作以及为什么无效的原因。你可能突然会意识到它实际上是可以工作的,或修改版本是有效的。也有可能,你会得到提示。
等待提示。不要用期待的眼光盯着面试官,但可以有短暂的“思考”时间——面试官或许已经决定给你个提示也说不定呢,等待她的提示以免打断她。
考虑空间和运行时的界限。如果你不知道你是否可以优化解决方案,那么就说出来。
调用帮助函数,继续前进。如果你不能或多或少地马上想出如何实现算法,那就跳过它。写一个命名合理的调用函数,例如:“this will do X”,然后继续下一步骤。
如果帮助函数非常微不足道,你甚至可以将它忽略。
不要担心语法。不妨一笑而过。如果你非要考虑语法,那就还原到英语。只要向面试官说明稍后会回来整理即可。
预备足够的空间。你可能后面会想要在代码行之间添加代码或笔记。从白板的顶部开始写,并在每一行之间留一条空白。
最后写一个重头检查的标志。不要担心你写的for循环是否应该有“<”或“<=”。在代码的最后画个勾选提醒自己最后再检查一遍。先按自己的思路走。
使用描述性的变量名。想名字需要时间,但可以防止你忘记自己写某段代码的目的。
使用names_to_phone_nums_map而不是nums。在名称中说明类型。返回布尔值的函数应该以“is_ *”,保存列表的Vars应该以“s”结尾。标准化很有意义。
4、完成之后的整理
浏览解决方案,大声地讲,输入一个例子。当程序运行时记录下变量保存的值——如果你只是记在脑子里,不会让你赢得任何加分。这有助于你发现bug和消除面试官的困惑。
寻找差一错误。你的for循环是不是应该使用“<=”来代替“<”?
测试边缘情况。措施包括空集合,单项目集合或负数。加分点:提一提单元测试!
不要惹人厌烦。有的面试官可能并不在意这些整理步骤。如果你不确定,可以这样说,“我通常会检测一些边缘情况——那么我们接下来是不是做这个呢?“
运行实践问题是没有捷径的。
好记性不如烂笔头。对自己诚实。用笔写可能一开始会让你觉得别扭。但是如果你现在就能克服这个难题,那么当面试的时候,你就不会觉得笨拙和不顺手了。
面试成功与否取决于两点:自身的能力好坏是第一要素,表达上的技巧是第二点。