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

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

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

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

    我去年 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   ·   实用小工具   ·   5755 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 02:49 · PVG 10:49 · LAX 18:49 · JFK 21:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.