程序员面试,面试官更注重代码量项目经验

北京白癜风到底能治好吗 http://m.39.net/baidianfeng/a_4218834.html

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

先交代下背景:坐标上海,做技术开发,我本人求职的职位是linux服务器开发,最倾向的职位是服务器开发主程或技术经理。

我本人也是上几家公司的面试官,因为接下来几年面临着成家养小孩,技术上也到了瓶颈期,虽然拿了不少offer,但是想综合比对一下再做决定。于是投递了很多家公司。

我先后去了如下一些公司:腾讯、百度、阿里的蚂蚁金服和国际支付宝部门(两个部门,两次面试)、饿了么、爱奇艺、、携程网、京东、华为、bilibili、上海黄金交易所、东方财富网、zilliz、掌门集团(做无线万能钥匙的那一家)、喜马拉雅听书、UCLOUD、峰果网络、华尔街见闻、万得财经、汇正财经、逗屋网络、朝阳永续,还有数家小规模的公司或创业公司吧。

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

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

1.快速排序(包括算法步骤、平均算法复杂度、最好和最坏的情形),有人说校招要把算法写出来,我是社招,所以描述一下算法过程即可。2.写二分查找算法,这个尽管是社招,但是一般也不难,所以要求面试者写出来。但是很多公司,比如不会直接让你写算法,而是结合一个具体场景来提问,然后让你自己联想到二分查找,比如求一个数的平方根。3.链表,常见的面试题有写一个链表中删除一个节点的算法、单链表倒转、两个链表找相交的部分,这个一般必须得完全无误的情况下写出来;4.自己实现一些基础的函数,例如strcpy/memcpy/memmov/atoi,同样的道理,这些必须完全无误且高效地写出来,比如你的实现中有动态分配堆内存,那么这道题目就算答错。

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

5.哈希表,对哈希表的细节要求很高,比如哈希表的冲突检测、哈希函数常用实现、算法复杂度;比如百度二面就让我写一个哈希表插入元素算法,元素类型是任意类型。6.AVL树和B树的概念、细节,比如会问mysql数据库的索引的实现原理,基本上就等于问你B树了。7.红黑树,这个基本上必问的一个数据结构,包括红黑树的概念、平均算法复杂度、最好最坏情况下的算法复杂度、、左右旋转、颜色变换。面试官常见的算法套路有:你熟悉C++的stl吗?你说熟悉,ok,stl的map用过吧?用过,ok,那map是如何实现的?红黑树,ok,那什么是红黑树?这样提问,红黑树就开始了。Java的也类似。

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

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一样在类成员变量定义处给出初始化值。

2.网络通信问题,比如协议栈的层级关系,三次握手和四次挥手的,注意我说的是细节,比如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://www.aierlanlan.com/rzfs/4151.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了