和大家分享一下我面试后端开发经理的经历 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Balloonwj
V2EX    求职

和大家分享一下我面试后端开发经理的经历

  •  4
     
  •   Balloonwj 2019-11-26 12:16:09 +08:00 7456 次点击
    这是一个创建于 2149 天前的主题,其中的信息可能已经有所发展或是发生改变。

    说下我的面试经验吧,都是亲身经历,不喜勿喷:

    我去年 12 月份从上一家公司离职,一直到今年 3 月份,基本上都在面试中度过来的。

    先交代下背景:坐标上海,做技术开发,我本人求职的职位是 linux 服务器开发,最倾向的职位是服务器开发主程或技术经理。我本人也是上几家公司的面试官,因为接下来几年面临着成家养小孩,技术上也到了瓶颈期,虽然拿了不少 offer,但是想综合比对一下再做决定。于是投递了很多家公司。我先后去了如下一些公司:腾讯、百度、阿里的蚂蚁金服和国际支付宝部门(两个部门,两次面试)、饿了么、爱奇艺、360、携程网、京东、华为、bilibili、上海黄金交易所、东方财富网、zilliz、掌门集团(做无线万能钥匙的那一家)、喜马拉雅听书、UCLOUD、峰果网络、华尔街见闻、万得财经、汇正财经、逗屋网络、朝阳永续,还有数家小规模的公司或创业公司吧。

    为了避免引起不必要的纠纷,下面我就不说具体的公司名称了。技术面试的细节我尽量写的详细一点,希望对大家有参考价值,技术面试大致有三种情形:

    一、以百度、爱奇艺等为代表的,以数据结构和算法为主,首先是简单地了解下你之前的工作经历和项目经验,然后就是算法和数据结构题目,具体涉及到以下内容:

    1. 快速排序(包括算法步骤、平均算法复杂度、最好和最坏的情形),有人说校招要把算法写出来,我是社招,所以描述一下算法过程即可。

    2. 写二分查找算法,这个尽管是社招,但是一般也不难,所以要求面试者写出来。但是很多公司,比如不会直接让你写算法,而是结合一个具体场景来提问,然后让你自己联想到二分查找,比如求一个数的平方根。

    3. 链表,常见的面试题有写一个链表中删除一个节点的算法、单链表倒转、两个链表找相交的部分,这个一般必须得完全无误的情况下写出来;

    4. 自己实现一些基础的函数,例如 strcpy / memcpy / memmov / atoi,同样的道理,这些必须完全无误且高效地写出来,比如你的实现中有动态分配堆内存,那么这道题目就算答错。

    第 3 点和第 4 点的关键点一般在于考察你的代码风格、对边界条件的处理,比如判断指针是否为空,千万不要故意不考虑这种情形,即使你知道也不行,只要你不写,一般面试官就认为你的思路不周详,容错率低;再比如,单链表的倒转,最后的返回值肯定是倒转后的链表头结点,这样才能引用一个链表,这些都是面试官想考虑的重点。

    1. 哈希表,对哈希表的细节要求很高,比如哈希表的冲突检测、哈希函数常用实现、算法复杂度;比如百度二面就让我写一个哈希表插入元素算法,元素类型是任意类型。

    2. AVL 树和 B 树的概念、细节,比如会问 mysql 数据库的索引的实现原理,基本上就等于问你 B 树了。

    3. 红黑树,这个基本上必问的一个数据结构,包括红黑树的概念、平均算法复杂度、最好最坏情况下的算法复杂度、、左右旋转、颜色变换。面试官常见的算法套路有:你熟悉 C++的 stl 吗?你说熟悉,ok,stl 的 map 用过吧?用过,ok,那 map 是如何实现的?红黑树,ok,那什么是红黑树?这样提问,红黑树就开始了。Java 的也类似。

    二、以饿了么、bilibli、喜马拉雅、360、携程等为代表的,兼顾算法数据结构和其他开发技术,算法和数据结构部分上文提过了,下面提一下其他技术,大致包括以下东西:

    1. 以 C++语言为例(不是 C++开发的朋友可以跳过这一点),第一类是基础的 C++问题,常见的有 C++的继承体系中 virtual 关键字的作用(如继承关系中析构函数为什么要申明成 virtual 函数,如果不申明为 virtual 会有什么影响)、

    在涉及到父子类时构造与析构函数的执行顺序、多重继承时类的成员列表在地址空间的排列; static 关键字的作用,static_cast / reinterpret_cast / dynamic_cast 等几个转换符的使用场景;问的最多的就是虚表的布局,尤其是菱形继承(B 和 C 继承 A,D 继承 B 和 C)时每个对象的空间结构分布,比如问 D 有几份虚表,D 中 B 和 C 的成员空间排布。

    另外,如果你应聘的职位使用 C++开发,很多公司会问你一些 C++11 的东西(或者问 boost 库,基本上都一样),这个你用过就用过,没有用过就说没用过不要装 X,常见的 C++11 需要掌握的一些技术库我也列举一下吧( JAVA 及其他语言的读者可以忽略):

    auto 关键字、for-each 循环、右值及移动构造函数 + std::forward + std::move + stl 容器新增的 emplace_back()方法、std::thread 库、std::chrono 库、智能指针系列( std::shared_ptr/std::unique_ptr/std::weak_ptr )(智能

    指针的实现原理一定要知道,最好是自己实现过)、线程库 std::thread+线程同步技术库 std::mutex/std::condition_variable/std::lock_guard 等、lamda 表达式( JAVA 中现在也常常考察 lamda 表达式的作用)、std::bind/std::function 库、

    其他的就是一些关键字的用法(override、final、delete),还有就是一些细节如可以像 JAVA 一样在类成员变量定义处给出初始化值。

    1. 网络通信问题,比如协议栈的层级关系,三次握手和四次挥手的 [细节] ,注意我说的是细节,比如 CLOSE_WAIT 和 TIME_WAIT 状态( bilibili 问了这样一个问题,你可以感受一下:A 与 B 建立了正常连接后,从未相互发过数据,这个时候 B 突然机器重启,问 A 此时的 tcp 状态处于什么状态?如何消除服务器程序中的这个状态?

    万得问过流量拥塞和控制机制、腾讯问过 tcp 和 ip 包头常见有哪些字段),东方财富网问了阻塞和非阻塞 socket 在 send、recv 函数上的行为表现,异步 connect 函数的写法,select 函数的用法,epoll 与 select 的区别,

    基本上只要问到 epoll,必问 epoll 的水平模式和边缘模式的区别;一些 socket 选项的用法,nagle / keepalive / linger 等选项的区别; tcp / udp 的区别和适用场景;

    通信协议如何设计避免粘包; http 协议的 get 和 post 方法的区别(问的比较深的会让你画出 http 协议的格式,参照这篇文章中关于 http 协议格式的讲解: http://blog.csdn.net/analogous_love/article/details/72540130 );

    Windows 用户可能会问到完成端口模型(IOCP),网络通信方面的问题,我专门开了一个知乎 live 系统地总结了一下,有兴趣的朋友可以看这里: https://www.zhihu.com/lives/922110858308485120 和 这里: https://www.zhihu.com/lives/902113324999778304。

    总之,网络通信问题能搞的多清楚就可以搞的多清楚,最起码把 tcp 应用层的各种 socket API 的用法细节搞清楚。

    1. 操作系统原理性的东西

    比如上海黄金交易所、喜马拉雅听书问了 linux 下 elf 文件的节结构,映射到进程地址空间后,分别对应哪些段,相关的问题还有,全局变量、静态存储在进程地址空间的哪里;堆和栈的区别,栈的结构,栈的细节一点要搞的特别清楚,因为一些对技术要求比较高的公司会问的比较深入,例如京东的一面是让我先写一个从 1 加到 100 的求和函数,然后让我写出这个函数的汇编代码( JAVA 开发的同学可能会让你试着去写一点 JVM 的指令),如果你对栈的结构(如函数参数入栈顺序、函数局部变量在栈中的布局、栈帧指针和栈顶指针位置)不熟悉的话,这题目就无法答对了;栈的问题,可能会以常见的函数调用方式来提问,常见的函数调用有如下__cdecl/__stdcall/__thiscall/__fastcall 的区别,比如像 printf 这样具有不定参数的函数为什么不能使用__stdcall ;

    饿了么二面问了操作系统的保护模式实模式,中断向量表,linux 下的 CAS。

    还有就是进程和线程的联系与区别,问的最多的就是线程之间的一些同步技术,如互斥体、信号量、条件变量等(Windows 上还有事件、临界区等),这些东西你必须熟悉到具体的 API 函数使用的层面上来,从另外一个角度来说,这是咱们实际工作中编码最常用的东西,如果你连这个都不能熟练使用,那么你肯定不是一个合格的开发者;这类问题还可以引申为什么是死锁、如何避免死锁;进程之间通信的常用技术也需要掌握,常用的通信方式( linux 下)有共享内存、匿名和具名管道、socket、消息队列等等,管道和 socket 是两个必须深入掌握的考察点(与上面网络通信有点重复);

    linux 系统下可能还会问什么是 daemon 进程,如何产生 daemo 进程,什么是僵尸进程,僵尸进程如何产生和消除( bilibili 问过)。

    1. 第四类就是一个使用过的开源技术,比如代表 nosql 技术的的 redis ;网络库 libevent 等等;数据库如 mysql 的一些东西。这个一般不做硬性要求,但是这里必须强调的就是 redis,熟练使用 redis 甚至研究过 redis 源码,现在一般是对做后台开发的技术硬性要求或者说不可缺少的部分,

    基于 redis 的面试题既可以聊算法与数据结构,也可以聊网络框架等等一类东西。我面试的公司中基本上百分之九十以上都问到了 redis,只是深浅不一而已,比如喜马拉雅问了 redis 的数据存储结构、rehash ; bilibili 问了 redis 的事务与集群。

    关于 JAVA 的,阿里的蚂蚁金服问了如下一些问题(我尽量列举下我能想起来的):java.lang.Object 有哪些常用的方法,改写一个类的 toString 方法需要注意哪些问题,hashCode 方法如使用,==与 equals 的区别,线程创建的几种方法,各自的使用场景,hashmap、hashtable 的数据结构实现,java 线程同步有哪些方法、各自的优缺点,jvm 的结构,java 代码优化等等。

    三、只问一些做过的业务或者项目经验,这类公司他们招人其实对技术要求不高(资深及主管级开发除外),只要你过往的项目与当前应聘职位匹配,可以过来直接上手干活就可以了,

    当然薪资也就不会给很多。比如游戏公司会关心你是否有某某类型的游戏开发经验、股票类公司会关心你是否有过证券或者交易系统的开发经验等。我的经验就是这类公司,能去的话可以去,不能去的话就当积累面试经验。

    业务开发哪里都能找到,真正的重视技术的公司,应该是广大做技术尤其是初中级开发的朋友应该值得关心的事情。

    四、不靠谱型公司

    我遇到的大致有四类:

    第一类:装 X 忽悠型,面试过程冗长繁琐,比如号称每一百份简历中才发一个面试邀请,号称每一个面试者发一个 offer,号称硅谷风格,我面试的有一家公司就是这个样子,先是一轮长长的电话面试,然后是五轮技术面试,前三轮是刷 leetcode 上原题,然后后几轮面试,面试官从基本的操作系统的

    中断、GDT、LDT、分表分页机制问到上层高并发海量数据的架构,说的不好听,真是从外太空聊到内子宫,最后问具体职位做什么时,要么遮遮掩掩要么原型毕露;或者讨论薪资时,要么面露难色要么各种画饼,但是实际就给不了多少薪水的。

    第二类:佛性公司

    面试下来,全程面试官面带微笑,问你的问题你回答的面试官也很赞同,但最后你就没通过,我猜测要么公司不是很缺人,想观望一下是否有合适的人才;要么招聘信息上开的薪资给不到。

    第三类:老奶奶裹脚布型公司

    其特点是面试周期长,往往第一轮面试通知你过了,让你回去等上十天半个月后,给你打电话通知你来第二轮面试,面试要求穿正装,带好各种证件,面试前必须先查验你的身份证、学历证学位证,甚至是四六级考试证等等,麻烦至极,即使你一路过关斩将过了终面,薪资也给不了多少。

    大家都是要养家糊口的,都是忙着找工作,谁有时间和你耗上十天半个月呢?

    第四类:不尊重人类型公司

    我这里说的不尊重人,不是指的是面试过程中对你人身攻击,而是不根据你的工作年限和经验随意安排面试官,举个例子,比如你工作十年,你去面试一个技术总监的职位,对方公司安排一个工作不满两年的部门职员作为面试官,这个面试官如果是走过场可以理解,但是非要和你纠结一个如二进制位移、现代编译器要不要在子类析构函数前加 virtual 关键字这些技术细节就没必要了。还有一类就是故意问一些刁钻的问题,或者全场都心不在焉、玩手机、漫不经心的面试官,比如问你 tcp 协议头有多少个字段,每个字段是干啥的。遇到这一类面试官我的经验就是要么婉拒,要么直接怼回去。

    下面再说下面试中需要注意的一些细节:

    第一,如果你的工作年限不长,尤其是渴望在技术方面有一定的造诣,那么你首先考虑的应该是新的单位是否能有利于你技术上的成长,而不是两份同样的工作,薪资上的上下相差的三五千、五六千。如果

    想转行的同学(比如从客户端转服务器,从 C++转 JAVA ),不要因为薪资突然变低而拒绝这种阵痛,要把目光放长远一点。

    第二,一些公司虽然招聘信息上写了最多能给到多少多少,但实际即使你全程面试下来都很完美,可能最终你也会因为薪资要求达不到不被录取。

    第三,一些根本不想去的公司,如果你有时间的话,去面试积累下经验也不是什么坏事。

    第四,面试的时候,同时也是你在考察面试官,一般面试官问你的问题,你能回答出来的在百分之八十左右,这样的公司可以考虑去入职,你进去的话可能才会在技术上有一些提升。如果你全场秒杀面试官的题目,

    你的技术天花板可能也在那里。

    第五,面试的时候聊清楚你将来的职位内容,避免进去客串一些不想做的工作。

    第六,遇到不会的面试题,不要直接就否定自己,可以尝试着去和面试官沟通一下,或者要求给点提示或者思路。

    第七,不要轻视笔试中的一些数学智力题目,认真作答,试问算法不也是数学智力题吗?

    第八,自信一点,每个人的经历和经验都是独一无二的,面试的时候,一些特定领域的问题,回答不出来也不要太在意。

    希望对阅读的朋友有所帮助。因为个人经验能力有限,所说的也可能只是一家之言,说的不妥当的地方还请温和地提出建议。

    关于 C++后台开发面试具体问哪些问题,我自己详细整理了一份资料: https://www.zhihu.com/question/34574154/answer/533440901

    关于 Java 面试具体面试题待我整理好了再放出来。

    关于技术面试如何和 HR 谈薪资以及谈薪资中的一些注意事项,我总结在这里:

    https://www.zhihu.com/question/34557602/answer/536713556

    码了这么多字不容易,欢迎温和地提出您的建议和意见。

    如果您想认识我或者与我聊一聊,欢迎关注公众号『高性能服务器开发』,本公众号推崇基础学习与原理理解,不谈大而空的架构与技术术语,分享接地气的服务器开发实战技巧与项目经验,实实在在分享可用于实际编码的编程知识。同时,您也可以加入 QQ 群 578019391 一起交流编程技术。

    第 1 条附言    2019-11-27 13:23:43 +08:00
    只收藏,不关注公众号都是耍流氓,哈哈
    17 条回复    2020-04-16 17:21:00 +08:00
    lhx2008
        1
    lhx2008  
       2019-11-26 12:29:00 +08:00 via Android   3
    看到考排序,翻到最下面,果然。。
    ZredoC
        2
    ZredoC  
       2019-11-26 13:08:30 +08:00
    好活
    dreamerlv3ex
        3
    dreamerlv3ex  
       2019-11-26 13:21:11 +08:00   2
    软文+拷贝
    webpy
        4
    webpy  
       2019-11-26 13:25:25 +08:00
    大哥,为啥把知乎答案删除了...
    fhsan
        5
    fhsan  
       2019-11-26 13:34:21 +08:00
    知道了
    szandy6
        6
    szandy6  
       2019-11-26 13:41:53 +08:00
    点个赞
    Ionstorm
        7
    Ionstorm  
       2019-11-26 13:50:01 +08:00
    我觉得 Golang 开发高性能服务器是很好的选择。开发性能高,开发效率高。
    daimubai
        8
    daimubai  
       2019-11-26 14:59:51 +08:00 via iPhone
    我建议你发知乎,谢谢,没人愿意关注你的公众号
    heiheidewo
        9
    heiheidewo  
       2019-11-26 15:27:42 +08:00
    开发经理是什么岗位,竟然面算法,难道不是看你上家的职位么
    CEBBCAT
        10
    CEBBCAT  
       2019-11-26 15:37:45 +08:00 via Android
    @daimubai 我觉得带公众号无可厚非,虽然我不看公众号,但这是他的自由。V2 讨厌的是垃圾内容
    SillyChenBrother
        11
    SillyChenBrother  
       2019-11-26 15:49:16 +08:00
    面数据结构和算法,计算组成无可厚非,但是这些大学教科书学的,面技术经理真的可以吗,经理不应该更多和人,和工程开发有关的。

    很多时候,技术是死的,人是活的,具体场景的经验更宝贵。
    LossLess
        12
    LossLess  
       2019-11-26 16:11:49 +08:00
    感谢 lz 分享,有些问题不知能否帮忙解答下:
    1. Java 开发方面现在面试已经到要求手写字节码了?
    2. 看到文中各种强调网络方面,甚至细致到 API 调用,普通的业务开发很少接触这方面,私下练手有帮助么?
    3. 关于面试不尊重这点,能否详细聊聊,对于不同年限的人,聊些什么问题才能算尊重?
    Balloonwj
        13
    Balloonwj  
    OP
       2019-11-26 16:25:36 +08:00
    @LossLess 就你三个问题来逐一回复一下你哈。
    问题一 Java 开发方面现在面试已经到要求手写字节码了?
    这个要看你面试的是什么职位,不同的职位要求不一样,我当时求职的职位是京东 XX 基础框架部的技术专家一职,对底层要求较高,所以要求了解点简单的自己码也是情理之中的。
    问题二 基础这个东西,做技术岗的核心职位都会问到,无论是哪种编程语言,你可以不用,但是一定要理解其背后的原理的。大多数人开发都是码业务代码,然后温水煮青蛙,没机会做底层和架构,这样就没有这方面的经验,只能码业务代码,这是一个恶性循环的过程。想在技术上有所实质性的提高,基础的东西要私下自己多练,单纯靠从工作中得来不现实。公司招你的目的是产出,培养你可能只是个附加项。
    问题三 不尊重人的面试也会很多,例如,和你约定好时间,你到公司了才告诉你面试改期或者取消;你面试一个高级职位如经理或者技术总监,安排一个工作不到两年的开发来和你聊,聊的时间还很长,而且净问一些无关痛痒的技术细节;面试通过了,让你等上三两个月;面试官态度不好,面试过程漫不经心等等。一般较好的面试,是双方约定好,安排合适的人给你面试,面试聊公司的需求或者相关的技术栈,尊重面试者以往的工作经历等等。
    newtype0092
        14
    newtype0092  
       2019-11-26 16:38:51 +08:00
    @dreamerlv3ex 这软文比站里 90%的帖子有内容的多。

    公众号关注了,希望多点这样的干货。
    bbao
        15
    bbao  
       2019-11-26 17:23:29 +08:00   1
    这篇文章和在知乎搜索到的各种面食 blabla 的一样, 先给你列出一堆问题,然后最下面来个链接
    链接是腾讯或者其他平台的 视频培训课程。
    然后加 qq,然后分享一些无关痛痒的资料
    然后继续推销课程。

    恩……
    yizhimamong
        16
    yizhimamong  
       2019-11-26 18:08:01 +08:00 via iPhone   1
    @dreamerlv3ex 如果对方拷贝其他文章内容进行牟利,应该违法吧
    beidounanxizi
        17
    beidounanxizi  
       2020-04-16 17:21:00 +08:00
    给爪巴
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3298 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 11:57 PVG 19:57 LAX 04:57 JFK 07:57
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86