为什么最难不过二叉树的算法出现在面试题中都会被应聘者抱怨?
如果以求职者的角度来看,很多求职者的项目与技能和这些面试算法题有出入和差别,所以出现了leetcode,剑指Offer等专门应试面试算法的网站或书籍(个人极度反感,但是现实就是大部分面试就要考这些类型的,你不刷题不看就是容易被毙掉)。所以很多求职者认为自己的技能还没有表现出来,就被面试的算法直接给枪毙掉了,自然有所不服,无论你认为这是多么简单的算法,也许他在工作的时候,根本和这些算法完全不搭边,工作个几年不忘光才怪。那么除了算法以外,如何挖掘出求职者的闪光点,这也是对面试官的一个考验,因为考验算法的不外乎就一个根本目的:他到底聪不聪明。但是算法不好,就一定证明他不聪明,或者工作能力不好了吗?我觉得不一定。这就是要看面试官和面试者的交谈了,面试官去尽力挖掘,面试者去尽力表达推销自己,这就是一个交互的过程。
我说说我的理解,很多时候其实是记不清算法的细枝末节,工作中用到了自然可以查资料查文档,甚至本来就不用知道那些细枝末节,能知道大体怎么用性能如何瓶颈在何处如果要改进可以从什么方面入手就行了。但面试的时候不一样,面试官一个劲追问细节,甚至要提笔现场实现一个详细版本要考虑各种边界情况什么的(我了个去没有文档没有IDE我连String类有没有内置subString这种函数都不记得)难免让人心里没底。举个例子我以前实习的时候遇到过一个问题,可以归结为资源分配,用一个图模型去建模,最后化成一个线性规划模型。我觉得如果要面试,问到这里就差不多了。最多问问迭代求解和直接求解的区别和各自的优点,算法复杂度什么的,理论性强一点还可以问问原对偶问题……至于把梯度下降或者矩阵求逆都要现场写一遍,那就没必要了。当然了,面算法岗位和面开发岗位侧重点也不同,还是要结合具体岗位说的。如果是前面有人提到的PHP工程师或者网页前端,我觉得在实际工作中用到什么高深算法的机会应该很少了,面试时候多问问实际的细枝末节才是更能看出水平的。
在微博上看到的:“玩算法的码农,打拼靠蓝条,像是法师。数学就等于蓝条最大值,数学差,魔法值不高,很快就到瓶颈了。外语影响回蓝速度。经验和智力加急速和穿透的。不玩算法的码农,像是战士,打拼靠血条,体质加生命,精神加生命回复,经验和敏捷加急速和破甲。”
连二叉树等基本问题都回答不上的人弱爆了好嘛?还有说出[不面算法会死啊]这种话的人和北大青鸟三个月出来的技工没什么区别,远远谈不上优秀。算法的掌握可以分为三个级别:level1.基本不会。level2.出题的人挖了一个坑,然后你凭借自己的经验很轻松的跳进去了,然后出题的人很满意。level3.自己发明了一个算法证了它的复杂度,并且复杂度貌似还不错。那么写几页纸投给J.ACM上让同僚们挑挑刺吧!连二叉树问题都不会的属于level1。面试通过的(不管是国内面试还是人们眼中美国NB闪闪公司总部的面试)或者IOI拿了金牌!或者ACM/ICPCfinal拿了世界总冠军!他们也就是level2。level3的人就是那些你们在算法书上看到的XX(某人名)算法,XXtheorem的XX。让我们从上帝视角来观察,处在level1的那些人你们还好意思说[不问算法会死啊]这种话吗?想要成为优秀的人赶紧回家闭门修炼吧。对于90%的参加算法竞赛人,同学们你们也别觉得他们有多NB,他们也就是level2的水平,水一水面试,刷刷题,打打比赛。会把问题套到具体算法上,复制粘贴一下模板而已。一个智商正常勤快点的人什么都不做刷一年题可以成为那90%的人。level3的人中很多很少写代码或者甚至不!会!写代码你造吗?其实还存在level4,他们就是研究基础数学的数!学!家!。他们中NB的人对着level3的人说:你们别搞了,你们搞的这些都是数学里最非主流大家最不屑于搞的东西。呵呵。貌似跑题啦,不过码农还要说我不会算法可是我有项目经验啊,其实项目经验也只是多写点代码,多一点调试经验,多知道几个API而已,这还不一样是低端吗?唉,其实整个码农行业以及绝大多数行业差不多都是这样低端的存在大家混口饭吃而已。
至于“没本事不要设立高门槛”,我倒是觉得,不管有没有本事,有钱就有资格设置高门槛。至于门槛是设在这种看似不直接产生作用的算法能力上,还是设在什么管理、项目经验上,还是设在外貌性别上,这是企业站在自己的角度根据自己的需求选择的,你觉得不合适,大可选择别的企业,而不是到处抱怨。大企业,以及大企业出身的管理人员,尤其是面试应届毕业生的时候,都有可能会更倾向于成长型的员工。这种情况下,不面算法面什么?面你行业背景吗?面你项目经历吗?
作为面试官,我曾经听说过几个面试者对我给他们的面试经历评价为“明明小公司一个,面什么算法”。后来我曾经找出了其中一些人的简历,回忆了一下面试过程,基本上他们都满足以下四条中的两条以上:1、简历上4-5个项目经历,结果一问,别说不是项目主持了,根本就是参与度极低,一问三不知。(我曾遇到过同一个大概不超过1万行的项目在3个人简历上同时出现的,而且他们都不是项目主持)2、简历上声称熟练掌握的内容,掌握程度仅限于最基本的使用,缺乏任何的设计分析能力。3、对所面试的岗位毫无概念,不明白自己是否符合岗位描述上的必要条件4、对面试提问思路不清晰,或思路表达不清晰。面对问题时,不是仅仅得不到完美的最终答案,而是思路一片空白。5、坚决认为C++是王道,“我还是想做C++”,拒绝多语言工作和学习。但实际上C++掌握的并不好。鄙公司(小公司招人不容易啊!)面试程序时,除非简历上写明了ACM获奖经历,否则我给他们安排的所谓“算法题”基本上不会超过二分查找的难度,而且其实并没有太多思路上的扩展,仅仅是算法实现而已。而且这仅限于我实在找不出任何的其它亮点,完全无法满足一个C++岗位的要求,还坚持想从事C++岗位的时候才会进行这样的提问。因为我们其实是相信员工在岗位上的成长的,面试时不允许查找资料,时间也有限,能解决的问题难度不如工作时所能解决的问题难度也是很正常的。但至少你要有点思路吧?二分查找不会写个枚举也好吧?白卷是闹哪样?结果他们认为是因为算法题表现不好而被我拒绝了。除了鄙公司,以我在大公司的被面试以及面试经验,虽然连基本的算法题都答不出实在是一件值得鄙视和怀疑的事情,但我依然觉得如果你各方面能力均表现优秀,十分符合岗位所需的要求,其实是不太会因为一个复杂的算法题没有答上来而直接被挂掉的。当然,如果你在面试算法题时毫无思路,或缺乏基本的算法复杂度分析等能力,被扣分也几乎是一定的。你被各方面都不比你差,算法问题表现比你更强的面试者干掉,也是很有可能的。说了那么多,总结起来只有一句:“因为公司面算法而义愤填膺的,肯定是面试挂掉了而不知道自己究竟为什么挂掉了的。”我觉得未来的面试都改成综艺节目那种形式,四个人一组,现场用答题板答题,这样被刷掉的就不会有那么多怨言了……
先亮明观点:身为程序员,算法知识100%是必要的!本人从事的不是什么高大上的研究工作,跟数据挖掘模式识别自然语言处理云计算大数据blahblah全都不沾边。做过一段时间的J2EE开发,现在主要做基于HTML5的前台开发。看到这儿很多人要说了,不就是个做网页的嘛,做网页还用的上算法?不就是表单验证提交一下?candidate第一时间解决了问题,但不算完美。在一些提示下发挥和表现了自己对算法、数据结构的认识,比较完整的给出了解。作为interviewer,我就足够满意了。当然也不排除有些candidate上来就能给出很好的解答,那我也没有理由去鸡蛋里挑骨头。作为interviewer,目的是快速的了解对方的能力和水平,而不是为了考住对方
最简单的解释:典型的工人去面试工程师职位,通不过面试是应该的。我反对面试官随便网上找一道题就拿来问的做法,只应该考察工作上实际所需知识的做法,因为这两者都基于一个错误的面试思路,那就是用面试来考察你懂不懂什么的。面试不是用来考察你懂不懂什么的,而是用来考察你有没有解决问题的能力的,以及将来和你一起解决问题是否容易。我知道中国绝大多数人在经历了十多年应试教育后,无论是站在面试者的角度来看,还是若干年后成为面试官了从面试官的角度来看,都只会用这种方式来思考问题——「面试」嘛,有个「试」字不就应该跟「考试」差不多咯,而我们习惯的考试就是考察你是否懂某个知识咯,只要死记硬背就可以了。然而真正好的面试不是这样做的,有兴趣的可以去看我之前写的那篇《理想的技术面试过程》。回到问题上来,我认为正确的面试方式是这样子的:现在你来我这里面试,我就告诉你我们在做一辆车子的原型,现在少了一个轮子问你怎么办。没错,我就是要让你重新发明轮子。谁不知道楼下7-11有轮子卖,但我就想知道你会如何解决没有轮子的问题。你可以从各种听起来非常愚蠢的方法开始,例如问我这个原型是不是只是用来展出的,是的话把车子放在展厅一角然后让缺了轮子的一侧对着角落,这样子随便拿几块砖头把车撑起来就可以了,反正没人会去看车子的那一侧。然后我会告诉你,展厅的天花不可能打开,所以我们不能直接用吊车把原型放进去,最终原型在展厅外面卸下来后你还是是要想个办法把它弄进去。你可能会说,那就用埃及人用圆木搬动大石块的方法咯,在原型的底下放几条滚动的圆木至少能让它推得动吧。这听起来还是比较蠢,但我会告诉你这个思路的方向是正确的。这个讨论延续下去,最终你还是会提出用金属做轮子外面再包一圈橡胶的做法,从而完成了重新发明轮子的过程。之后我会把你带到车间里,告诉你这里有你所需的所有电动工具和原材料,你把你刚才发明的那个轮子造出来吧。有些人手艺非常好,一下子就能做出来一个非常好的轮子。有些人无论说得轮子有多圆,做出来的东西永远只能是方形的。大多数人介乎两者之间,对此我会说你不如把你造出来的轮子装到原型上试试看是否合适,不合适的话拿下来再调整一下。这是正常的面试流程。我不指望你一开始能够给我一个轮子,我也知道外面卖的轮子很便宜,但我需要验证你有没有遇到问题后解决问题的能力,这包括思维和动手两方面。在这个比喻的基础上,我们可以来探讨一下面试过程中遇到的各种面试者。那些不懂算法同时也非常拒绝面试算法的面试者,就如同一条汽车流水线上的工人来面试汽车工程师一样。「没有轮子?老板你这不是耍我么。我能够纯熟地把轮胎和轴承对齐,然后用电动工具把所有螺丝都拧紧。但没有轮子这就不是我的问题了。这要么是采购的问题,要么是仓管的问题,反正轮胎没有出现在流水线上我就什么都做不了。如果说没有电动工具,我可以去找两把手动工具来,用脚踩两下也能拧紧,但没有轮胎真的不是我能负责的。」当然这都不是最搞笑的,还有更搞笑的类型。ACM/ICPC竞赛选手或者是面试前专门在网上刷题的面试者,基本上一上来就「哦,你要个轮子是吧。我知道怎么造轮子,你给我工具和材料就行了」,然后就以极快的速度造了一个轮子出来,装上去也没有任何问题。有一定的概率我在仔细检查后发现,这个轮子是用铆钉装上去的,所以拆不下来了,橡胶是一次充气后完全密封的,因此漏气之后不可能再打气。不过想想也合理,这类工程师专业做撞击测试,所以在他们的世界里面任何东西造出来都不是长期使用的,而是拿去测试一下,通过或通不过都立即变废品。还有一些情况是这样子的,例如我问超大整数乘法然后对方说用Python直接用乘号,又或者说我问快速排序对方说用Haskell一行写完。这就如同一个面试者打开公文包掏出一个轮子说「我这正好有一个,不知道是否合适?」呃……你的百宝袋里面还有什么?最后从面试官的角度来说,面试ACM/ICPC竞赛选手往往都很无聊。他们能够给出一个完美的轮子,但我不觉得我能从他们身上学到新东西。(面试过足够多的人后,要见到一个比已知完美轮子更完美的轮子其实非常难。)更有趣的面试者会说,「你知道吗,其实中国古代独轮手推车的轮子设计得比古罗马战车的轮子要合理」。其实我不知道你在说什么,但如果你能够把整套理论说得自圆其说的话我觉得你至少有点思维能力,同时你还真的对轮子感兴趣。事后我可能会去搜索一下看看你说的理论是否正确,但至少我会学到点新东西。
回答请先登录