在深化代码之前,大多数面试官都喜爱聊聊你的布景。他们想知道:
对于编程的元认知。你有思考过怎么才干非常好地编程吗?(译者注:元认知(Metacognition)或译为后设认知,这个名词由 Swartz 及 Perkins 创造及界说,即“认知的认知”或“知识的知识”。简言之,即是对自个的认知过程(包含:回忆、感知、核算、联想等各项)的思考。)
自立精力/领导才能。你看到你的作业完结了吗?就算你不用这么做,你会主动批改不对的作业吗?
交流。他们会和你聊聊技术上的疑问是有用的,仍是苦楚的?
你最少应当预备好下面中的一项:
你处理过技术疑问中一个风趣的比如
你战胜人际抵触的一个比如
领导才能或自立精力的比如
你在曩昔项目中应当做啥的故事
你最喜爱言语的一些细节,以及对于你喜爱和不喜爱说的言语上的一些作业
对于公司商品或事务的疑问
对于公司工程战略的疑问(测验,Scrum等)
好好预备有关资料。你要展现你做过最骄傲的作业,你很期望了解他们正在做啥,并且你对言语和作业流程有一些自个的主意。
交流
一旦涉及到编程的疑问,交流是要害。在过程中需求帮助但能够清楚与人交流的提名人,要比那些能够垂手可得处理疑问的提名人愈加难得。
了解它是哪一类疑问。疑问有两类:
编程。面试官期望看到你处理疑问,并且能够写出整洁和有效的代码。
聊聊罢了。面试官仅仅想让你说点啥。这些疑问一般要么是高层次的体系规划(“你怎么规划 Twitter 的备份?”),要么是琐碎的作业(“JavaScript 中 hoisting 是啥?”)。有时分琐事是为了引出一个“真实的”疑问,比如,“咱们怎么能快排一个整数数组?好的,如今假定咱们不再运用整数而是……”
假如面试官在进入“真实的”疑问之前,仅仅想很快得到一个相似闲谈的答复,而你却开端编写代码了,她会感到绝望。只需求问一句,“咱们要为它编写代码吗?”
让人觉得你们是一个团队的。面试官想知道和你一同处理疑问会是啥样子的,所以要让面试官觉得你是乐于协作的。用“咱们”来代替“我”,比如,“假如咱们选用一个广度优先搜索,咱们会很快得到一个答案。”假如要你挑选在纸上仍是在白板上编写代码,最好挑选白板。这么你就能够坐在面试官的周围,面临着疑问(而不是和她隔着一个桌子)。
说出你的主意。我是仔细的。“让咱们试着这么做——但我还不断定它是不是会起作用。”,假如你被卡住了,就说出你的主意。说说啥也许会有用。说说你以为啥东西能够作业,以及为啥它不作业。这也适用于琐碎的闲谈疑问。当被请求解说 JavaScript 闭包时,“它跟规模有关,并且是在函数中完结”,这么的答复就能够让你拿到 90% 的分数。
说你不知道。假如你碰到一个现实(例如,特定言语的边边角角,一个涉及剖析运转时的难题),不要不懂装懂。相反应当说“我不断定,但我猜想是这么,由于……”,这个『由于』包含经过展现其它选项的荒唐性来排除它们,或许从其它言语或疑问中找到相似的比如。
怠慢过程。不要自傲地信口开河一个答案。假如它是准确的,你依然需求解说它,假如它是过错的,就会显得你很莽撞。你并没有由于速度快而赢得啥,相反更也许会由于打断她或急于得出结论而惹恼面试官。
摆脱困境
你有时会被卡住。放松。这并不意味着你现已失败了。记住与找到准确答案的才能比较,面试官一般愈加重视从不一样角度探究疑问的才能。就算期望迷茫,也要持续探究不抛弃。
画图。别浪费时刻光在脑袋里边想 —— 在黑板上思考。画几个不一样的测验输入。用手画出怎么取得想要的输出。然后思考将你的办法转换成代码。
处理一个更简略的疑问。不知道怎么找到调集中第四大的项目?先思考怎么找到最大项,再看看你能否改动一下办法。
先写一个简略和低效的办法,再想办法去优化它。运用暴力的办法。尽全部尽力得到答案。
愈加大声说出你的主意。说出你知道的。说说你以为啥也许会作业和为啥它行不通。你也许会意识到它的确有用,或许一个改进的版本会游有用。或许你也许会得到一个提示。
等待提示。不要一脸等待地盯着面试官,只需求停下来“想一下” —— 你的面试官也许现已决定给你一个提示,仅仅在等待一个机遇,避免影响到你。
思考空间和运转时刻的约束。假如你不断定是不是能优化处理方案,大声说出你的主意。例如:
“我最少要查看一切的项,所以我不能再优化了。”
“暴力的办法即是测验一切的也许性”
“这个答案将包含 n^2 个项,所以我最少要花这么多时刻。”
把你的主意写下来
你很简单让自个堕入紊乱。你先集中精力把主意写下来,最终才去关怀细节。
调用辅佐函数并进行下去。假如你不能很快想到怎么完结一部分的算法,不论巨细都越过它。呼叫一个命名合理的辅佐函数,声明“这将会完结某事”,并进行下去。假如辅佐功用不重要,你完全能够不去完结它。
不要忧虑语法。只需略过它就好了。假如有必要的话请转换成英语。只需求说你会回头看它的。
给自个留下满足的空间。你后边也许要在两行之间增加代码或注释。从白板的顶部开端,在每一行之间留下一个空白行。
为最终的查看做好符号。别忧虑你的循环应当是 “<” 仍是 “<=” 。你能够做一个符号提醒自个最终去查看。只需把全体算法写下来。
运用描述性的变量称号。这么会花一些时刻,但会避免你忘记代码正在做的作业。运用 names_to_phone_nums_map 代替 nums。在命名中暗示类型。回来布尔值的函数应当以 “is_ ” 最初。具有一个列表的变量应当以“s”结束。挑选你能了解的规范并坚持下去。
当你完结后,记住做好善后作业。
你输入一个比如,手动过一遍你的办法,并大声说出你的主意。当程序运转时,你写下变量保留的值 —— 在脑袋里做这些不会给你带来任何加分。这么能够帮你查找疑问,并且能够消除面试官对于你正在做啥的疑问。
查找一开端的过错。你应当在循环中运用“<=”而不是“<”?
测验鸿沟状况。包含空集、单个元素调集或负数等等。加分项:提一下单元测验!
不要觉得麻烦。有些面试官并不介意这些善后过程。假如你不是很断定这一点,能够这么说:“我一般会用一些鸿沟条件来测验代码 —— 接下来咱们要这么做吗?”
实习
最终,处理实践疑问是无法代替的。
用纸和笔来编写代码。诚笃地面临自个。刚开端也许会觉得很扎手。这没啥。假如你如今能战胜这种扎手的疑问,比及真实面试的时分,就不会显得笨手笨脚了。
咱们遇到的实践疑问反映了面试的流程,即当你堕入困境时会得到提示,当你的算法能够进一步优化时也会得到鼓舞。