抱着对进入新兴互联网公司的渴望,我投递了字节跳动的提前批,投递的岗位是视频编解码工程师。很幸运地通过了简历筛选,并且在6-28日晚上8点进行了面试。
       第一面的面试官人挺不错的,温文尔雅,简单介绍一下流程。首先是惯例的自我介绍,这时面试官看了看简历,然后让我讲一下自己在学校和教研室做的项目。然后就是提问一些c/c++语言的一些问题:
       1)c语言的内存模型,有哪几个区,都是有什么作用,动态分配的内存在哪里,栈区和堆区有什么不同。
       2)c++的智能指针介绍一下。
       3)static关键词的作用,对一般的变量/函数,类中的变量/函数各有什么作用。
       4)类继承中public继承和private继承的区别,private继承的意义是什么。
       5)什么是虚函数,虚函数的实现方式。
       6)char a[4]={0x01,0x02,0x03,0x04};int p=a;cout<<p;显示的值。
       然后就是手写代码环节,题目是反转链表,剑指offer的原题。
       遇到不清楚的问题,面试官会引导你回答,如果实在不会,他也会安慰你说这个确实在编码方面很少用到。虽然不知道他是不是在骗你,但是听到这种话,一下子安心了许多。
       一面的体验挺不错的,回答的也可以。然后紧接着就是二面,重点来了。
       二面的面试官怎么说呢,后来回想起来真的是第一眼就看出来他似乎是很不耐烦,不过当时比较紧张,也没注意,这都是后话了。
       首先还是惯例的自我介绍,然后就是讲项目。然后共享屏幕写了两个小题目分别是定义并赋值一个函数指针,分配64位对齐的内存。第二个问题当时没写出来。看出来面试官似乎对我有点不满意。然后就是手写代码。
       重点来了。题目是求一个二叉树的最大深度,简单啊。我就写了一个层序遍历的方法。然后面试官看了看指出了我的错误。

    int maxDepth(TreeNode* root) {
        int res=0;
        if(!root) return res;
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty())
        {
            res++;
            int n=q.size();
            for(int i=0;i<n;++i)//面试官说这里的for循环是多余的
            {
                if(q.front()->left) q.push(q.front()->left);
                if(q.front()->right) q.push(q.front()->right);  
                q.pop();              
            }
        }
        return res;
    }

       当时我一懵,这个代码应该没问题啊,我检查了一遍,说我觉得这个地方没有问题,for循环时必要的,不然的话输出的是节点的个数而不是最大深度。随后就是一通解释与反驳,我都配图讲解,举例子一点点揉碎了讲。但是面试官依然不理解,仍然坚持for循环是多余的。当时已经面了接近两个小时了,已经有点烦躁了,再加上一个简单的问题半天解释不通,真的是把我给惹怒了,我的情绪逐渐失控,分贝愈来愈高,最后我很愤怒的说这时leetcode上的原题,我共享屏幕看着我在上面做,看看结果对不对。然后面试官不知道是怎么了,一改之前的执拗,让我换道题做,换道简单的。新的题目是求大数之和(字符串表示结果)。
       当时我心态早就爆炸了,满脑子都是愤怒,强行控制自己的情绪,硬着头皮写下去。结果可想而知,我只写出来了一个大概,进位的问题没有考虑清晰,存在着问题。他看时间用的很多了,强行让我停下来,说了他发现的问题。讽刺的是他指出的问题仍然驴唇不对马嘴,我真的是无语了,心情极度复杂,又想怼上去,但是又觉得又是一通唇枪舌剑。当时已经10:30了,白天实习的工作忙了一天,晚上又面试了2个多小时,真的是有心无力,就附和了他。最后面试官问有什么问题,我早就想结束了这面试了,说没有问题。然后面试就结束了。
       大概的经过就是这样的,现在还没有结果,但可想而知,肯定凉凉。先说一下自己的问题:自己的情绪控制能力可能真的有问题,特别容易上头,尤其面试时间一长。之前腾讯实习的面试就是,最后有一些不愉快,当时是我写的代码有个小错误,然后就被说程序能力不行。当时有点不服,但是终究是自己的代码有问题,我也承认。这次发生了更加严重的情况,连续发生这种问题,自己的情绪控制能力(特别是长时间的面试之后)确实有待提高,是该收收这暴脾气了。还有就是表达能力可能确实不好,特别是一旦开始急躁,更加的表达不清,这是我的老问题,必须提高。
       不过我真正想说的是,一个顶级互联网公司的技术面试官竟然不会较为基础的算法题(我觉得我说的不过分),这个问题的背后的深层次究竟是什么。第一,我确实可以理解面试官对算法题很生疏,尤其是视频编码,很多基本的算法在工作中真的不常用,长时间不接触感到陌生真的很正常,但是可不可以在面试前抽出十分钟研究一下,我相信作为业内资深人员,学习起来应该很快。可能这对于技术人员来说这时耽误时间,但是本着对应聘着负责的态度,我觉得对面试官提出这一点要求不过分。
       第二,现在有些互联网公司的面试早就已经变味了。很多公司依仗高薪资+高福利+年轻人对于公司产品的热爱,大量的人才往里挤破头的往里冲,大肆加大面试/笔试的难度。面试造火箭,工作拧螺丝的情况屡见不鲜。同时逐渐向应试化发展,反正算法题就是那些,网上刷题啊;不同岗位的常见面试问题就那些,看面经相关的知识学,实在不会背啊。为了高薪挤破了头,我们最不缺做题家。更不用说项目经验没有,网上找,同学借,无中生有这种严重不诚信的行为了。你看视频编码从业多年的人都不会二叉树这种问题,是因为二叉树在工作中真的不需要,面试却依然要手写代码。我不是反对手写代码,手写代码是编程能力一个很好的考核方式。我在面快手同样岗位的时候,手写代码题就是写一个i宏块的镇内预测,非常与工作相关。而不是这种对着某些书上的题随便找一道,可能工作了永远用不到。相信这样专业的题目,面试官一定也是得心应手。
       不知不觉写了好多,很多都是自己的主观看法,大家见笑了。我的经历没有任何夸张的成分,想想可能一个非常好的岗位竟然以这样的一种方式离我而去,真是自己的修行不够呢。希望大家引以为鉴吧。