文章持续更新,全文首发自我的个人公众号,可以陌陌搜一搜「高性能服务器开发」第一时间阅读,后台回复【文章下载】获取C++全套学习资料。
写在上面的话
近来朋友内推了一位LinuxC/C++前端开发的朋友到我们公司笔试,我是一面的笔试官,很遗憾那位工作了三年的朋友笔试表现不是挺好。
我问了如下一些问题:
“Redis持久化机制,redis销毁方法机制,MQ实现原理,C++虚函数,hash冲突的解决,memcached一致性哈希,socket函数、select/poll/epoll模型,同步互斥,异步非阻塞,反弹的概念,innodb索引原理,双向图最短路径,动态规划算法。”
为了帮助更多的朋友领到满意的offer,我整理了一下发出来,这么LinuxC/C++岗位通常会问什么知识点呢?
C++笔试通常考察的内容1.语言基础
C++虚函数这是笔试初、中级C++职位一个机率95%以上的笔试题。通常有以下几种问法:
在有承继关系的兄妹类中,建立和析构一个子类对象时,母子构造函数和析构函数的执行次序分别是如何的?在有承继关系的类体系中linux面试常问问题,父类的构造函数和析构函数一定要声明为virtual吗?若果不声明为virtual会如何?哪些是C++多态?C++多态的实现原理是哪些?哪些是虚函数?虚函数的实现原理是哪些?哪些是虚表?虚表的显存结构布局怎样?虚表的第一项(或第二项)是哪些?矩形承继(类D同时承继B和C,B和C又承继自A)体系下,虚表在各个类中的布局怎样?假如类B和类C同时有一个成员变了m,m怎样在D对象的显存地址上分布的?是否会互相覆盖?
另外,时至今日,你一定要熟悉C++11/14/17常用的语言特点和泛型,这儿简单地列一下:
C++11/14网上的资料早已好多了,C++17的资料不多,重头戏还是C++11引入的各类实用特点,这就给读者推荐一本我读过的:
这儿网路上也有人分享下来,下载链接:
链接:
密码:mltg
建议订购正版哦。
C++11/14/17的句型似乎很实用,而且须要一定的练习能够把握,推荐几个学习C++11/14/17的开源项目:
1.filezilla
filezilla是一款开源的FTP软件,其源码下载地址如下:
/svn/FileZilla3/trunk
须要使用svn工具来下载,安装好svn工具后,在svn界面中checkout上述地址或则使用如下命令下载:
svn/svn/FileZilla3/trunkfilezilla
假如使用svn图形化工具,直接使用以下svn地址将源码checkout到指定目录即可:
/svn/FileZilla3/trunk:///svn/FileZilla3/trunkleZilla3//svn/FileZilla3/trunksvn/FileZilla3/trunk
假如你不晓得如何下载,可以私信我。
2.uWebSocket网路库
uWebSocket是一款开源的WebSocket库,最新版使用了大量C++17的句型,美中不足的是这个库代码存在不少bug,我在项目中使用了它,但更改了其大量的bug,有兴趣的同学也可以下载下来看一下:
下载地址:
/uNetworking/uWebSockets
3.TeamTalk的PC端
TeamTalk是香菇街开源的一款用于企业内部的即时通讯工具,其下载地址是:
/balloonwj/TeamTalk/tree/master/win-client
4.最后是我的开源FlamingoIM
/balloonwj/flamingo
balloonwj/flamingo2.算法与数据结构基础
说到算法和数据结构,对于社招人士和对于应届生通常是不一样的,对于大的互联网公司和通常的小的企业也是不一样的。下边按照我当笔试官笔试他人和找工作被他人笔试经验来谈一谈。
先说考察的内容,不仅一些特殊的岗位,常见的算法和数据结构笔试问题有如下:
排序(常考的排序按频度考排序为:快速排序>冒泡排序>归并排序>桶排序)
通常对于对算法基础有要求的公司,假如你是应届生或则工作经验在一至两年内,以上算法假如写不下来,给笔试官的影响会特别不好,甚至直接被pass掉。对于工作两年以上的社会人士,假如写不下来,并且能剖析出其算法复杂度、最好和最坏的情况下的复杂度,说出算法大致原理,在多数笔试官面前也可以过的。注意,假若你是中学生,写不下来或则写的不对,基本上笔试过不了。
二分查找
二分查找的算法尽量要求写下来。其实,大多数笔试官并不会直接问你二分查找,而是结合具体的场景,诸如怎么求一个数的平方根,这个时侯你要能想到是二分查找。我在2017年年末,笔试agora时,笔试官问了一个问题:怎样从所有好多的ip地址中快速找个某个ip地址。数组
无论是应届生还是工作期限不长的社会人士,琏表常见的操作一定要熟练写下来,如数组的查找、定位、反转、连接等等。还有一些精典的问题也时常被问到,如两个数组怎样判定有环(我在2017年笔试饿了么二面、上海黄金交易所一面被问过)。数组的问题通常不难,而且数组的问题存在特别多的“坑”,如好多人不注意边界检测、空数组、返回一个数组的函数应当返回数组的头表针等等。队列与栈
对于应届生来说通常这一类问的比较少,而且对于社会人士尤其是中中级岗位开发,会结合相关的问题问的比较多,比如让笔试者借助队列写一个多线程下的生产者和消费者程序,全面考察的多线程的资源同步与竞态问题(下文介绍多线程笔试题时详尽地介绍)。
栈通常对于基础要求高的笔试,会结合函数调用实现来问。即函数怎样实现的linux标准教程,包括函数的调用的几种常见调用方法、参数的入栈次序、内存栈在地址从高向低扩充、栈帧表针和栈顶表针的位置、函数内局部变量在栈中的显存分布、函数调用结束后,调用者和被调用者谁和怎样清除栈等等。某年笔试易迅一基础部门,笔试官让写从0加到100这样一个求和算法,之后写其汇编代码。哈希表
哈希表是考察最多的数据结构之一。常见的问题有哈希冲突的测量、让笔试者写一个哈希插入函数等等。基本上一场面试出来不考察黑红树基本上都会问哈希表,但是问题可浅可深。我印象比较深刻的是,当初笔试百度广告推荐部门时,二面问的一些关于哈希表的问题。当时笔试官时先问的数组,接着问的哈希冲突的解决方案,后来让写一个哈希插入算法,这儿须要注意的是,你的算法中插入的元素一定要是通用元素,所以对于C++或则Java语言,一定要使用模板这一类参数作为哈希插入算法的对象。之后,就是哈希表中多个元素冲突时,某个位置的元素使用数组往前穿成一串的方案。最终考察linux下malloc(下边的ptmalloc)函数在频繁调用引起的显存碎片问题,以及开源方案解决方案tcmalloc和jemalloc。总体出来,笔试官是一步步引导你深入。(有兴趣的读者可以自行搜索,网上有好多相关资料)树
笔试高频的树是黑红树,也有一部份是B树(B+树)。
黑红树通常的问的深浅不一,大多数笔试官只要能说出黑红树的概念、左旋右旋的方法、分析出查找和插入的平均算法复杂度和最好最坏时的算法复杂度,并不要写笔试者写出具体代码实现。通常C++笔试问stl的map,java笔试问TreeMap基本上就等于开始问你黑红树了,要有心中打算。笔者以前笔试爱奇艺被问过黑红树。
B树通常不会直接问,问的最多的方式是通过问MySQL索引实现原理(数据库知识点将在下文中讨论)。笔者笔试腾讯看点部门二面被问到过。图
图的问题就我个人笔试从来没碰到过,不过据我某位弟弟所说,他在进三星电子之前有一道笔试题就是深度优先和广度优先问题。其他的一些算法
如A*寻路、霍夫曼编码也时常会在某一个领域的公司的笔试中被问到,如宝开(《植物大战僵尸》的母公司,在广州人民广场附近有分公司)。3.编码基本功
还有一类笔试题不好分类,笔者暂且将其当做是考察编码基本功,这类问题既可以考察算法也可以考察你写代码基本素质,这种素质除了包括编码风格、计算机英文水平、调试能力等,还包括你对细节的把握和易错点理解,如有意识地对边界条件的检测和非法值的过滤。请读者看以下的代码执行结果是哪些?
for(char i = 0; i < 256; ++i) { printf("%dn", i); }
下边再列出几个常见的编码题:
(1)实现一个memmov函数
这个题目考查点在于memmov函数与memcpy函数的区别,这二者对于源地址与目标地址显存有重叠的这一情况的处理方法是不一样的。
(2)实现strcpy或strcpy函数这个函数写下来没啥难度,而且不仅边界条件须要检测以外,还有一个容易被忽略的地方即其返回值一定要是目标显存地址,以支持所谓的链式拷贝。即:
strcpy(dest3, strcpy(dest2, strcpy(dest1, src1)));
(3)实现atoi函数
这个函数的签名如下:
int atoi(const char* p);
4.多线程开发基础
现现在的多核CPU早早已是司空见惯,而多线程编程早早已是“飞入寻常百姓家”。对于大多数桌面应用(与Web开发相对),尤其是像后台开发这样的岗位,且笔试者是社会人员(有一定的工作经验)linux系统介绍,倘若笔试者不熟悉多线程编程,这么通常会被直接pass掉。
这儿说的“熟悉多线程编程”到底熟悉到哪些程度呢?通常包括:晓得何种场合下须要新建新的线程、线程怎样创建和等待、线程与进程的关系、线程局部储存(TLS或则叫threadlocal)、多线程访问资源形成竞态的缘由和解决方案等等、熟练使用所在操作系统平台提供的线程同步的各类谓词。
对于C++开发者,你须要:
5.数据库
数据库知识通常在大的互联网企业对应届生不做硬性要求,对于小的互联网企业或社会人士通常有一定的要求。其要求通常包括:
(1)熟悉基本SQL操作
包括增删改查(insert、delete、update、select句子),排序order,条件查询(where子句子),限制查询结果数目(LIMIT句子)等
(2)稍稍中级一点的SQL操作(如Groupby,in,join,leftjoin,多表联合查询,别称的使用,select子句子等)
(3)索引的概念、索引的原理、索引的创建方法
(4)数据库本身的操作,建库建表,数据的导出导入
(5)数据库用户权限控制(权限机制)
(6)MySQL的两种数据库引擎的区别
(7)SQL优化方法
以上属于对开发的基本的数据库知识要求,你可以找一本相关入门级的数据库图书学习即可。
中级开发不仅以上要求还要熟悉高可用MySQL、主从同步、读写分离、分表分库等技术,这种技术的细节一定要清楚,它们是你成为技术专家或则中级构架的必备知识。我们在实际笔试时,在讨论高可用服务服务方案时,好多笔试者也会和我们讨论到这种技术,而且不少笔试者只晓得这种技术的大致思想,细节常常说不清楚,细节不会就意味着你的高可用方案难以落地,企业须要可以落地的方案。
这种技术我首推《高性能MySQL》这本书,这本书中级开发者一定要研读的,另外还有2本特别好的图书也推荐一下:一本是《MySQL排错手册》,读完这本书之后,你会对整个“数据库世界”充满了清晰的认识;另外一本是《数据库索引设计与优化》,这本书读上去十分舒服,尤其是对于喜欢算法和数据结构的朋友来说。
网上也有朋友整理分享下来,下载链接(喜欢记得买正版哦):
密码:foqu
6.网路编程
网路编程这一块,对于应届生或则中级岗位通常只会问一些基础网路通讯原理(如三次握手和四次挥手)的socket基础API的使用,顾客端与服务器端网路通讯的流程(回答【客户端创建socket->联接server->收发数据;服务器端创建socket->绑定ip和端标语->启动侦听->接受顾客端联接->与顾客端通讯收发数据】即可)、TCP与UDP的区别等等。
对于工作经验两年以内的社会人士或则一些高级笔试者通常会问一些稍为重难点问题,如select函数的用法,非阻塞connect函数的写法,epoll的水平和边沿模式、阻塞socket与非阻塞socket的区别、send/recv函数的返回值情形、reuse_addr选项等等。Windows平台可能就会问WSAEventSelect和WSAAsyncSelect函数的用法、完成端口(IOCP模型)。
对于两年以上尤其是“号称”自己设计过服务器、看过开源网路通讯库代码的笔试者,笔试官通常会深入问一些问题,这类问题要么是实际项目中常见的困局或则网路通讯细节,按照我的经验,通常有这样一些问题:
nagle算法;keepalive选项;Linger选项;对于某一端出现大量CLOSE_WAIT或则TIME_WAIT怎么解决;通信合同怎样设计或怎样解决数据包的粘包与分片问题;脉搏机制怎样设计;(可能不会直接问问题本身,如问怎么检测死链)断线重连机制怎样设计;对IOMultiplexing技术的理解;收发数据包正确的方法,收发缓冲区怎样设计;高贵关掉;定时器怎样设计;epoll的实现原理。
举两个反例,让读者体会一下:
笔者曾去BiliBili被问过这样一个问题:假若A机器与B机器网路connect成功后未曾互发过数据,此时其中一机器忽然断电,则另外一台机器与断电的机器之间的网路联接处于哪种状态?
7.显存数据库&缓存技术
时下以NoSqlkey-value为思想的显存数据库大行其道,广泛地用于各类后台项目开发。所以熟悉一种或几种显存数据库程序早已是笔试后台开发的基本要求,而这当中以Redis为最典型代表,这儿以redis为例。
笔者以为,无论是从找工作应付笔试还是从提升技术的角度,Redis是一个十分值得学习的开源软件,希望广大读者有意识地去了解、学习它。
另外一些像分布式、RPC、MQ等技术和C++本身关系不是很紧密,这儿就不列举了。8.项目经验
不仅社会急聘和一些大型的企业,通常的小型互联网公司对应届生不会做过多的项目经验要求,而是希望她们算法与数据结构等基础扎实、动手实践能力强即可。对于通常的小公司,对于应届生会要求其起码熟练使用一门编程语言以及相应的开发工具,堪称熟悉LinuxC++开发的笔试者,不熟悉GDB调试基本上不是真正的熟悉LinuxC++开发;堪称熟悉汇编或则反汇编,不熟悉IDA或则OllyDbg,基本上也是名不符实的;堪称熟悉VC++开发linux面试常问问题,连F8、F9、F10、F11、F12等快捷键不熟悉也是无法经得起笔试官的提问的。受疫情影响,好多笔试都改成了线上笔试,当你写算法题时假如你对开发工具不熟悉,笔试官基本一下子才能看下来。这点请你们注意。
这儿给一些学历不算好,中学不是十分有名,尤其是二本以下的广大想步入IT行业的朋友一个建议,在大学期间不仅要学好计算机专业基础知识以外,一定要熟练使用一门编程语言以及相应的开发工具。
关于项目经验,许多笔试者觉得一定要是自己参与的项目,似乎也可以来始于你学习和阅读别人源码或开源软件的源码,假如你能理解并把握这种开源软件中的思想和技术,在笔试的时侯才能与笔试官侃侃而谈,笔试官也会十分满意的。
好多朋友可能苦恼学院或则研究生期间要不要跟随导师做一些项目。其实,倘若这种项目是课程要求,这么你必须得出席;若果这种项目是可以选择性的,尤其是一些仅仅拿着第三方的库进行所谓的包装和加工,这么建议可以少出席一些。
另外,大厂笔试通常还有出一些场景题综合考察笔试者的水平,这类场景题通常是多种技术的结合,可以参考我这儿写的:《来看一看两道大厂笔试场景题》。
原创不易,点赞的男子伴最终都成了年薪24万的程序员~~~
文章评论