V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ototsuyume
V2EX  ›  程序员

为什么面试总喜欢考算法题?

  •  3
     
  •   ototsuyume · 2015-08-20 16:13:53 +08:00 · 3697 次点击
    这是一个创建于 3383 天前的主题,其中的信息可能已经有所发展或是发生改变。

    每年校招的季节总会有这种讨论,有人觉得考算法题没意义不如考实战考项目考 XX 。有人大学的时候做了很多个网站写了很多项目然而就是做不出这些“没有意义”的算法题拿不到 offer ,有人觉得太简单做算法题区分度不大。

    先来看一下,在大公司来说,程序员日常的开发工作是怎么样的。就拿腾讯来说,比如你的职位是 qq 的后台开发,那么你的日常开发语言是 C++,你日常的工作是维护一大堆已经上线的用 c++写成的 cgi 和后台的逻辑 server ,有新需求的时候用 C++去开发新的逻辑 server 和 cgi 来实现这些功能。而这其中, cgi 有现成的库,逻辑 svr 也有现成的库,存储方面用公司内部开发的 CKV 或者其他组件,它们有专门的运维团队来维护,其他像发布数据统计日报等全部都有现成的组件。你只需要把产品的逻辑组织好填到框架中就行。

    那么你工作之外接触的其他技术哪部分跟你工作中用到的东西有关系?你开发网站用的 php/python ?或者是做存储用的 redis 和 mysql ?甚至更时髦的 docker ?

    事实就是,越成熟的大公司,内部有越多的内部组件内部系统,你在里面工作,你不需要担心应该采用什么数据库用什么语言什么发行版的 linux ,你只需要选择现有的组件设计好架构组织好代码就足够。

    那么回到面试题目这个问题上,特别是校招面试上面,假如一个应届生非常聪明和刻苦,每天都是专研计算机课程的专业课程(算法、编译器、 os 、 etc.),里面的每个算法都倒背如流,甚至能在一场面试内写个 LR1 的 parser 算法出来,那么你问他一些实际项目是考察不出他的潜力的和实际的学习能力的。而对于一个没怎么学过算法,但是做了几十个外包网站的同学,他的项目能力很强,但是你确定他能在入职后应付到工作中遇到的挑战?

    所以说,面试考算法是一个基准点,因为算法是计算机科学里面最基础的学科,其他更高级的学科都是在这个基础上面展开的。在过了这个基准点的基础上,再考其他的东西,例如更复杂的算法,实际的项目经验,知识广度等。这也是目前国内大公司面试的标准形式。但这其中有个问题是面试官的知识水平不一,所以有时候面试官水平不够甄别出水货和牛人。说白了就是不够标准化。就比如我试过一次面试,面试官连珠带炮问了我两个小时,但是全都是问的各种基础概念,假如我当时对着电脑打字速度够快的话,他这种面试方式有何意义?

    而说到面试的标准化,那就得说回微软 /google/facebook 以及湾区众多 hot startup 的面试方式。这些公司的 onsite 面试一般是四轮,应届生大多数情况下不会有设计题,几乎都是算法题。在现在刷题网站越来越多的时代,靠考算法题还有没有筛选度?

    这里我拿 facebook 来举例,因为 facebook 的面试太过标准化了。 facebook 的面试分为四轮,其中一轮 culture fit ,两轮算法,一轮设计(应届生不会有这一轮)。 facebook 的算法题不难,几乎不会有 dp 题目,大概就是 leetcode 上面中等难度及以下的题目。有人说,这么简单的题目,随便一个英语好点的搞过 acm 的学生都能过。实际上去年 facebook 在中国招了多少个应届生呢?不超过 30 个。

    为什么?一道简单的算法题,你现在对着电脑想,可能没什么难度,一下就能写出来,但是面对面试的时候的压力,你能否在十几分钟内在纸上能写出整洁无 bug 的代码?另外,简单的题目只是一道开胃菜,后面几乎可能有稍难的 follow up 。而且还有非常关键的一点,就是沟通能力。以前在知乎上面看过一个是清华的一个竞赛出身的学生问为什么 google 问的问题那么简单他答出来了还被拒了,你搞竞赛出身你有一身牛逼的 coding 本领熟悉各种奇技淫巧,但是要你解释思路的时候却三言两语就糊弄过去,换你做这样的同事你愿意不?一道算法题你觉得做出来不难,但是试试自己用语言描述出你的思路,然后证明你的算法是对的,可不一定那么简单。

    而对于社招来说,算法题是一个考查方面, design 题目也很重要, design 题目很大程度会影响你的入职的级别和工资。而假如你知识面广或者某个方面很厉害,在简历上体现出来的话面试官也会适当地问你有关的问题,这里也是加分点,但是这不是能否通过面试的关键点。

    说了这么多,我只想说明一点,面试时考算法不一定是最好的,但是是比较有效的,而且是比较公平的方法。至于你说花几天的时候让他做一个项目,那么你想想 facebook 人均创收几十万上百万美刀,本来请个人过来面试已经要花个几百刀的了,还要让个员工花了几天去应付他,那一年下来得亏多少钱?公司不是傻子,你要是发明一种更有效的更低成本的甄别人才的方式,不用多久肯定就传开来了

    28 条回复    2015-08-22 12:21:10 +08:00
    fszaer
        1
    fszaer  
       2015-08-20 20:29:07 +08:00
    这个时候是不是要 @一下因为翻转二叉树没写好被拒绝的那位了=。=
    ototsuyume
        2
    ototsuyume  
    OP
       2015-08-20 20:42:25 +08:00
    @fszaer 这个已经被人讨论到烂了,我的看法是 google onsite 面试有四轮,不会因为某轮面得差就终止面试,也不会单单因为一道题做不出来拒掉他,更何况他本身的履历就非常不错。但是他只提到面了一轮问了一道问题,这里面槽点太多了。除了他没人知道真实的情况,说不定他就是看不爽 google 编个段子出来黑一下

    写了这么多好像并卵,游戏规则别人定,你想去那些公司就只能按照对方的游戏规则来玩。当然更好的是自己能当庄家自己定游戏规则。反正既然无法反抗就乖乖地享受
    oclock
        3
    oclock  
       2015-08-20 21:21:17 +08:00
    因为工程能力、靠谱程度比算法更难考查
    lincanbin
        4
    lincanbin  
       2015-08-20 21:38:28 +08:00 via Android
    为什么?一道简单的算法题,你现在对着电脑想,可能没什么难度,一下就能写出来,但是面对面试的时候的压力,你能否在十几分钟内在纸上能写出整洁无 bug 的代码?

    引出了纸上写码这个新问题。
    lcqtdwj
        5
    lcqtdwj  
       2015-08-20 21:40:19 +08:00   ❤️ 1
    因为真正的好程序员必须要有好的算法功底
    YouXia
        6
    YouXia  
       2015-08-20 21:54:09 +08:00 via Android
    以前我也认为纯粹的考算法意义不大,因为工作中那些算法基本上用不到。

    而最近这段时间负责搜索引擎代码优化,对计算机基础和算法都有较高要求,每当自己陷入困境,我就后悔学生时代刷题刷的太少。

    于是我跟同学自嘲说,以前认为工作中基本上用不了那些算法,主要原因是自己当时做的项目太弱,眼界太低,现在需要了,反而后悔莫及。
    UnderIndex
        7
    UnderIndex  
       2015-08-20 22:05:25 +08:00
    ACMer 弱弱路过..
    如果不专搞 ACM ,常用的算法就那么多。链表二叉树图论这些基本的数据结构算法就那么点,撸清楚了没什么面试能难得到的。。还是看自己的知识面广度和深度吧,操作系统,网络这些也很重要。
    orvice
        8
    orvice  
       2015-08-20 22:10:09 +08:00
    其实就是一个成本的问题吧。。。
    最简单的方式找到需要的人,而漏掉一些人也是可以接受的这样?
    refresh
        9
    refresh  
       2015-08-20 22:19:32 +08:00
    懒,算法有标准答案,其它没有
    算法当然重要,顶端的程序员都是算法牛人
    但问题是,很多公司并非招顶端的程序员,也招不起顶端的程序员
    很多公司根本不知道自己需要什么样的人
    以及如何去找到这些人

    招扫地的,就要求他有招地的技能就好了
    有人会问,假如有一天,万一你遇到一个算法上的难题怎么办?
    那你还不如招会日语呢,万一有一天你遇到一个难题,只有日语资料你怎么办,如果你会日语,不是一下就能解决问题了?

    我对算法牛人保持敬畏,但我反对一刀切都考算法
    对于一般程序员,会用递归迭代右左反转之类的就差不多了
    算法这种事,让专职的程序员大牛去干吧

    对于多数程序员,英语水平比算法重要 N 倍

    欢迎喷我
    publicID321
        10
    publicID321  
       2015-08-20 22:39:34 +08:00
    幸福源自磨难
    wdlth
        11
    wdlth  
       2015-08-20 22:43:13 +08:00
    如果连枯燥的算法都能忍受得了,其他的问题应该不大。大概是这么想的……
    msg7086
        12
    msg7086  
       2015-08-20 22:57:35 +08:00
    @refresh 日语能力还是比较重要的。
    现在写 ruby ,不少资料就是日语的,你要是不会日语那不得抓瞎了。
    lvfujun
        13
    lvfujun  
       2015-08-20 23:19:06 +08:00
    @msg7086 哈哈, ruby
    我就不喷了。。。。。。放着阳光大道不走,非得走独木桥。
    msg7086
        14
    msg7086  
       2015-08-21 02:23:46 +08:00 via Android
    @lvfujun 阳光大道是什么鬼
    ericls
        15
    ericls  
       2015-08-21 07:54:30 +08:00
    因为国内招聘是买方市场

    别人想怎么弄就怎么弄

    就算要求面试者跪着面试 也有人会去
    yakczh
        16
    yakczh  
       2015-08-21 08:56:22 +08:00
    因为靠算法简单,写两行字就搞定,判断结果也是固定的模式,

    比如 求 1-10 之间的整数 加起来之和等于 10 的所有排列组合
    输出结果
    (1,9 )
    (2,8 )
    ...
    (1,1,1,1,1,1,1,1,1,1 )



    考项目经验这个出题维度多,比较复杂,判断结果也不好判断 A 做了个图书馆项目,B 做了个调查问卷项目,你说这两个人谁技术水平高?
    zonghua
        17
    zonghua  
       2015-08-21 09:00:51 +08:00 via iPhone
    也就是数据结构的什么东西,谈不上算法。我倒是希望多考察操作系统和计算机网络,这些也能很好地客观评价。
    sandideas
        18
    sandideas  
       2015-08-21 09:17:00 +08:00 via iPhone
    @yakczh 弱弱的问下这题比较巧妙的解法。。
    sandideas
        19
    sandideas  
       2015-08-21 09:21:53 +08:00
    @yakczh 搜索然后剪枝么。。
    CtrlSpace
        20
    CtrlSpace  
       2015-08-21 10:04:44 +08:00
    大公司应该考察算法比较多
    普遍小公司拉进来能立马干活的就不错了。
    (参考培训机构的出来忽悠一下 10K+,算法,数据结构为 0 ,啥是链表?)
    ren2881971
        21
    ren2881971  
       2015-08-21 10:59:59 +08:00
    提高门槛而已。 刷掉一部分 不适合当程序员的人。
    twittercom
        22
    twittercom  
       2015-08-21 11:53:07 +08:00
    算法测试的是逻辑思维,是基础,是攻城狮杀人放火居家旅行必备良药。
    ikaros
        23
    ikaros  
       2015-08-21 12:39:19 +08:00
    为什么能力优秀的人一定要去 Google FB 之类的大公司? 只有在大公司才能体现价值么? 应该是相反吧
    wshcdr
        24
    wshcdr  
       2015-08-21 13:17:33 +08:00
    唉,算法是最简洁的面试程序员的方法了
    ototsuyume
        25
    ototsuyume  
    OP
       2015-08-21 21:22:28 +08:00   ❤️ 1
    @ikaros 你这里说的价值指的是什么?在我看来,现在 90%的创业公司搞的东西都是没有价值浪费生产力的东西,个个都想着搞一个 app 搞一个网站就能改变世界。先不说谷歌和 facebook 微软这种,就算在 bat 里面你做的事情起码能对用户有非常直接的影响。而且一些问题只有在 bat 这种级别的公司才会遇到,而有人觉得解决这种问题才能体现他们的价值。试想一下一个研究分布式系统的 phd ,去创业公司写 pv 不到 bat 一百分之一的网站后台,是不是有点太浪费了?
    ikaros
        26
    ikaros  
       2015-08-21 22:08:43 +08:00
    @ototsuyume 我说的价值肯定是自己的人生价值了,我不否定你说的 90%,但是你自己为什么不为自己挑选那 10%呢?
    "就算在 bat 里面你做的事情起码能对用户有非常直接的影响。" 首先我觉得能做对用户非常有直接影响的肯定不是程序逻辑实现和运维或者 DBA,而应该是产品策划之类的,在 BAT 这种大公司里面分工肯定不会由程序去做这一块,而是让他专注于精通于自己的业务.所以我的观点是,BAT 之类的企业校招时招了几乎最优秀的员工,却让他们进去做螺钉,专注于一块业务.
    但是在创业型公司里,你肯定会主动或被动地接触很多方面东西.
    但是如果你是专门做分布式或者其他的什么的博士或者博士后等等,你又恰好想专精这一领域那么肯定这些大企业更适合你.
    ototsuyume
        27
    ototsuyume  
    OP
       2015-08-21 22:33:46 +08:00
    @ikaros 我本来只是想说为什么很多公司喜欢考算法题不是讨论大公司跟小公司的问题,创业公司跟大公司这个讨论篇幅太长懒得展开了。我只是对你认为在创业公司才能体现自己的价值这一点表示异议而已,人生价值不只是创业做 full stack
    heloman
        28
    heloman  
       2015-08-22 12:21:10 +08:00
    其实,算法最能区分正规科班和培训机构出来的!
    如果真的问项目,大部分科班毕业生被培训机构的完爆,毕竟是不会吹牛的
    问算法,反而是好事儿
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2582 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 02:42 · PVG 10:42 · LAX 18:42 · JFK 21:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.