后端面经(已收到腾讯实习offer)

大家好,这篇博客是我博客生涯的第一篇博客,所以想先和大家分享一下春招过程中的收获和感受。由于博主是新手,如有需要改进的地方或者不明白的地方,请在评论区留言,博主将在第一时间赶赴现场与君讨论和请教。谢谢大家!!!


下面将知识点做个总结:

数据结构

 - 链表和数组的区别(内存上的分布、增删查的时间复杂度)
 - 树的先根、中根、后根遍历(延伸出来波兰序列和逆波兰序列)
 - 双链表的增删查
 - 图的深度优先搜索(延伸出回溯法)和广度优先搜索(延伸出分支界限法)
 - 掌握几颗树:AVL(平衡二叉树),BST(二叉排序树),红黑树,B树,B+树
 - 排序一定要掌握:堆排、基排、快排、冒泡(时间复杂度、空间复杂度、应用场景)

算法

 - 常用算法一定要有印象:
	 - 贪心算法(每次都取最优)
	 - 动态规划(笔试和面试经常出现,建议看下经典的背包问题)
	 - 递归算法(斐波列序列、快排、二叉树的遍历、求阶乘),递归一般不能达到最优解,但面试过程中用递归可以使代码更加简短。
	 - 分治(快排、归并都利用了分治思想)
	 - 分支界限法(对应广度优先算法)
	 - 回溯法(对应深度优先算法)
 - 典型的算法案例:
	 - 存储10亿个INT型的QQ号,但给的内存只有1GB。(明显,一个int型占用4个字节,10亿个QQ号就需要4GB的存储空间,直接存储内存不足。)解决方法是利用哈希存储,使用位图(每个QQ号只用一位进行存储,这样一个int型32位就能存储32个QQ号了)
	 - 在1亿个数中找出前1000个大的数(用int存储),只分配4KB的存储空间。解决这种问题(找出前n个最大或者最小的数),一般使用堆排。前n个最大的数使用最小堆,前n个最小的数使用最大堆
	 - 找出第k大的数,利用快排(快排的思想就是每次找到一个数在整个序列中的具体位置)
	 - 大整数乘法,使用分治思想
	 - 字符串匹配(判断回文串、找出最长回文子串、找出最长回文子序列、判断字符串A是否为字符串B的字序列)
	 - KMP算法(找出字符串A在字符串B的位置,不存在返回-1)
 - 必须会手写的算法
	 - 快速排序
	 - 折半查找
	 - 归并排序
	 - 链表的逆序
	 - 链表的生成、查找、删除、添加
 - 要掌握写算法的工具,博主练习算法一般使用C++,原因是网上参考例程多,而且执行起来相对高效。
	 - 要掌握C++的STL库,里面包含了队列、集合、栈等各种数据结构的容器,使用STL可以快速便捷的进行排序、去重、删除、插入、修改、统计大小、逆序(分配的是动态的内存,不像C++的数组一样是固定的)。
	 - 字符串的常见操作,博主发现很多笔试题喜欢考察字符串相关的题目,所以对字符串的逆序、统计大小、遍历等要重点掌握。
	 - 这里推荐一本书和一款视频教程,牛客网左大神写的[程序员算法面试指南](https://book.douban.com/subject/26638586/)和哈工大男神郭炜老师的[中国mooc大学程序设计与算法](https://www.icourse163.org/course/PKU-1001894005)

计算机网络

 - 三次握手、四次挥手(掌握其原理、以及为什么是这个次数、socket是怎么建立连接的)
 - 了解TCP连接的11种状态变迁
 - TCP和UDP的区别(报文头部的区别、可靠性?、面向连接?、应用场景)
 - 滑动窗口(整个流程、接收窗口和发送窗口是如何移动的、序列和确认号)
 - 防拥塞控制(掌握三个阶段:慢启动、拥塞避免、超时重传/快速恢复)
 - 七层模型(了解每一层的用途)
 - IP地址的分类、私有地址的划分、子网掩码的作用、一些特殊地址的用途(0.0.0.0,127.0.0.1,255.255.255.255)
 - 长连接、短连接、长轮询、短轮询
 - 常见的应用层协议和相对端口号(FTP,SSH,TELNET,HTTP,DNS)
 - 掌握ICMP协议(是网络层协议,应用场景?)
 - 推荐两篇计算机网络的博客:[TCP的那些事儿(上)](https://coolshell.cn/articles/11564.html),[TCP的那些事儿(下)](https://coolshell.cn/articles/11609.html)
 - 如果服务器用nginx,后端语言为PHP,掌握从用户进行域名访问一个网站到返回页面的过程中经历过的一些活动:(博主这道题答的不太完整)
	 - DNS域名解析(掌握DNS的轮询机制)
	 - TCP三次握手建立连接
	 - 客户端发送HTTP请求报文(在数据包的移动过程中,可能涉及到ARP协议来解析MAC地址---这点博主当时被问的一点懵逼)
	 - nginx维持连接,并将报文主体发送给php-fpm进行解析并执行
	 - 服务端发回响应报文
	 - 服务端或者客户端四次挥手结束会话(注意握手是客户端发起的,挥手是客户端/服务端都能发起)

HTTP协议

 - 一些常见的状态码:301,302,304,403,404,502,503,504(并且掌握以1、2、3、4、5开头分别表示什么类型的状态)
 - HTTP请求报文和响应报文的格式和内容(HTTP报文的4要素、常见的请求首部和响应首部)
 - 请求方法:PUT,DELETE,POST,GET,HEAD,TRACE的区别(前4个对应增删改查,重点掌握GET和POST的区别)
 - HTTP的缓存首部:如cache-control,max-age,if-modify-since,last-modify
 - 会话:SESSION和COOKIE的区别,如何提高COOKIE的安全性(这里可能会涉及到WEB攻击,如CSRF和XSS)

操作系统

 - 进程和线程
	 - 进程与线程的联系和区别,顺便了解一下创建进程和线程的方法
	 - 进程的调度算法
	 - 进程的通信机制:管道、有名管道、消息队列、共享内存、socket(要掌握这几种通信方法的区别)
	 - 死锁产生的原因、如何检测死锁、如何解决死锁
	 - 线程的同步机制:临界区、互斥量、信号量、条件变量
	 - 用户态和内核态的区别(博主一般是从特权级考虑的)
	 - 并发和并行的区别
 - 内存
	 - 内存的分页机制、页表以及多级页表
	 - 内存碎片(外碎片和内碎片)
	 - 段页结合(实现机制、为什么要使用这种机制?)
		 - 缺页错误
		 - 虚拟内存
		 - 页面调度算法
 - 磁盘:了解磁道和扇区的概念
 - 编译和链接
	 - 了解基本的编译流程(词法分析、语法分析、语义分析)
	 - 了解链接器的作用

C++

 - 32位机和64位机中数据类型的区别(long和指针所占字节不一致)
 - **多态-----虚函数**:[浅谈C++虚函数](https://www.cnblogs.com/malecrab/p/5572730.html)
	 - 虚函数的实现原理
	 - 加了虚函数后,调用构造函数和虚构函数的区别
 - 类和结构体:
	 - **占用内存**(要考虑内存对齐的问题)
	 - 类和结构体的区别(博主一般以类是引用类型,结构体是值类型入手)
 - C++的分段机制(代码段、数据段、BSS、堆、栈)以及每个段的作用
 - 动态分配内存(堆):了解new/malloc,delete/free的区别
 - 掌握strlen和sizeof的区别
 - 内联函数和宏定义的区别

数据库

 - 三大范式+BCNF范式
 - 数据库的索引(B树索引、哈希索引、位图索引)
 - INNODB和MYIASM的区别
 - 查询优化
	 - 合理建立索引:[MYSQL索引背后的数据结构](https://www.cnblogs.com/tgycoder/p/5410057.html)
	 - 优化SQL语句
		 - IN、EXTISTS、JOIN的区别和应用场景
		 - 防止索引失效
 - 事务的四大特性:原子性、隔离性、永久性、一致性
	 - 隔离性解决的问题:污渎、不可重读、幻读(理解这三者的区别)
 - 防止SQL注入的方法
	 - 危险字符的转义
	 - 对SQL预编译
 - Redis缓存机制
	 - 应用场景和优点
	 - 与memcache的区别
	 - 如何实现持久性
	 - 主从模式

设计模式(21种设计模式)

 - 7种结构模式以及应用场景:桥接模式、适配器模式、代理模式、享元模式、组合模式、门面模式、装饰模式
 - 重点掌握单例模式和MVC模式(应用场景、优缺点)
 - 了解UML图,能看懂各种不同箭头表示的意思。[详解UML类图](http://www.uml.org.cn/oobject/201610282.asp)

Linux系统

 - linux的文件系统:[详见linux文件系统](http://www.cnblogs.com/bellkosmos/p/detail_of_linux_file_system.html)
 - 常见的命令
	 - vim的基本使用:掌握三种模式(命令模式,插入模式和底行模式)
	 - 查询进程的相关指令:ps -aux/ps -ef
	 - 查询相关端口的指令:netstat -ntl
	 - 查询内存使用状态:free -h
	 - 基本的操作:复制,删除,重命名,移动
	 - 设置开启自启动
	 - 设计定时执行
 - 防火墙的设置:[linux中iptables的设置](http://blog.chinaunix.net/uid-25885064-id-3351852.html)
 - 看得懂nginx的配置文件,并了解如何配置域名/端口重定向,以及如何负载均衡
 - 了解IO复用技术:poll/select,epoll的区别

PHP

 - 说明:由于博主主要掌握的后端语言为PHP,所以后端语言为JAVA/C的请略过此小节。
 - include和require的区别
 -  PHP常见的魔方方法:__toString,__autoload,__isset,__call等
 -  PHP七个超全局变量:_GET,_POST,_REQUEST,_SERVER,_COOKIE,_SESSION,_FILES
 - isset和empty的区别
 - 弱类型语言是如何标识类型的,以及垃圾回收机制
 - PHP作为一种解释型语言,是如何执行的
 - PHP7相对于PHP5的优点,[强烈推荐鸟哥的博客](http://www.laruence.com/)
 - 了解php_module、fast-cgi和php-fpm的区别
 - 掌握正则表达式的相关语法,并可以手写简单正则表达式,如手机号码、邮箱等

华丽的分割线过后,下面博主给大家带来的一些面试的小问题。

  • 项目:面试IT行业一定要有拿得出手的项目,不然真的很尬,面试官一般会从以下几个角度发难

    • 简单介绍一下项目,博主一般从两个方面入手,实现的功能+用到的知识(语言、框架)
    • 你任务项目中有什么难点,你是怎么解决的(这个真的问的频率太高了)
    • 你的项目有什么亮点吗(博主回答这个问题一般从设计模式入手,还有一些比较先进的工具,如redis缓存等)
    • 你在团队中具体负责哪些内容
  • 面试过程:

    • 保持自信的心态,别怂。。展现出应有的自信。博主当时提前批面试腾讯时,经历了所谓的压力面,面试官差点把脚放桌子上了。基本上你说的每个回答都能给你挑出毛病来(博主当时就怂了,说话一点底气都没有,结果直接rejected)。当压力面时,一定要自信,当面试官挑你毛病时,要试着去和他探讨,发表自己的观点。一怂面试官可能就觉得可能是实力不足。
    • 别过于自信,可能死于话多。你要时刻的清楚,面试官的知识阅历可能是你的n次方,所以其实你的每次装逼面试官都看在眼里,记在心里。所以一定要展现出谦虚、热爱学习、求知欲强的一面。
    • 如果真的有能力的话,请回答的时候尽量地从底层去回答。其实博主感觉面试官在你回答的深度上就已经能大概知道你的底细了。比如面试官问你数组是如何实现的,这时候如果你能提到段页结合的问题的话是相当不错的。(当时博主面试奇虎360时,虽然很多问题答的不理想。当时面试官问了PHP7和PHP5的区别,博主从底层的数据结构还有解析器等方面入手,虽然回答的不是很完整,但自那以后,面试官就觉得你是到达这个深度的人。之后,他很基础的东西基本不问,比如三次握手四次挥手之类,问的都是一些实现的原理,比如swoole为什么效率高、IO复用技术的实现。虽然博主只能答出6-7成的问题,但还是过了,而且和面试官谈的很开心)这种做法的前提是认为自己底层基础够扎实,不然就别坑害自己啦。
    • 不管你是拿应聘的公司当备胎或者其他原因,既然你面试了,那你就要展现出非常热爱这家公司、非常想要加入这家公司的决心。不要犹豫,要充满激情,这样给面试官的印象相对来说更好一点。
  • 简历:

    • 虽说简历写得漂亮很容易就能过笔试直通面试,但还是不要写的太夸张,尤其是技术面,面试官其实只要一深挖就知道自己简历的真假,别试图蒙骗。简历尽量写实再渲染,这样的话只要面试官捞起你的简历,就代表你的能力和面试官的要求是匹配的,这样也不会太虚。
    • 简历贴不贴头像看个人哈哈,记得某论坛说过,不贴无所谓,要贴就要展现出认真的一面,不要随便拿张自拍。(只针对技术岗)
  • 心态

    • 心态真的超级重要的,尤其是在准备面试的前一个月。遭受着身体和心灵的双重折磨,瞬间就崩溃。我非常能体会那种,拼死拼活啥都没。我觉得春招真的是一场没有终点的战争,遥遥无期,所以日子真的很难熬。博主的建议是每天早上规划一下今天的计划,既然在offer上得不到收获,那我也在知识上得到收获,这样也能达到一定的成就感和满足感。
    • 分享一下博主曾经崩溃的心态:
      • 从2018年春节过完一个星期,我就飞奔回学校准备春招,真的是整整一个3月份,都躲在自习室,用手机热点给电脑提供的wifi。由于博主是非科班出身,所以这个过程真的很痛苦,每天看面经、刷数据结构和算法、计算机网络、操作系统、C++、数据库。真的是日复一日,真的是要吐了。与此同时,还在疯狂地投递简历,由于博主使用的后端语言是PHP(PHP是最好的语言嘛),但众所皆知,后端语言除了PHP,还有C和JAVA,所以真的是投简历的时候并没有像前端一样,只要是互联网公司就能投。差不多投了15来家公司吧。但结果,在整个3月份,颗粒无收!,这是让我最心寒的。博主抗压能力一般,当遭受着心灵和身体的双重折磨的时候,心里防线瞬间崩塌。
  • 其他

    • 刷题: 其实博主的的刷题时间2个月左右,属于菜鸟级别的。刷题集中在两个网站:牛客网,leetcode。大家没事在牛客网上面刷刷公司真题,在leetcode上刷刷算法,其实挺好玩的,也能获得成就感。
    • 关注:平时多关注一些和自己行业相关的新技术,面试官偶尔会问。其实这个问题恰恰体现你到底是真的对自己所做的事情感兴趣,还是应付性或者被动式地完成。
    • hr面试:一般hr会显得自己很“专业”,然后问你一些技术上的问题。这个时候,请不要忽悠他,即使是对牛弹琴也好,请认真仔细地回答他,表现地和技术面一样。这个其实在一定程度上体现你的认真程度以及人品。

###华丽的分割线后,感谢各大网站给我如此方便的刷题和答疑解惑环境

知乎
CSDN
博客园
牛客网
leetcode

你可能感兴趣的:(面经)