四次面试经历,足以让我客观地看清自己的能力
看似简单的2019年,不只是政治大年,对我而言更是一个充斥着破折与痛苦,机遇与挑战,当然还有懒惰与懈怠,但更多的还是对于未来无限可能的希望…因为可能,所以会有希望;因为可能,所以也免不了选择与纠结。
关于读研还是就业,直到现在,也没有明确的答案,就像辅导员说的那样,或许我根本没必要去思考这个问题。但经历更多的挑战,总会让人的生活变得丰富多彩而充满无限可能。
第一次面试
第一次面试是广州某小公司,方向可以说和我想发展的方向完全对口,golang 后端开发。回想起来,这可能是我最值得去尝试的面试,但可惜的是第一次面试没有丝毫的经验。
原本以为,自己的表达能力、项目经历、包括专业对口以及简历上的各种内容都是十分出彩的,心里想的是面试官舍我其谁。但到后来完全是打脸。面试官面得问题让我感觉天昏地暗…
- redis 基本数据结构和底层实现
- golang chan 阻塞问题
- 链表存在环路怎么办
- golang map 的底层实现
- cin cout 和printf的区别
- grpc stream 和 普通使用的区别
- 前端图片显示
- 以及常见的计网操统问题
面得一脸懵逼…好像还回怼了面试官几句…为什么要问这些没意思的问题
最终,当然是没有通过…
原本信心满满的面试,却最终有种灰头土脸的感觉,还感觉十分委屈。我渐渐明白了面试的套路…
第二次面试
同样是广州某公司,方向选的后台测试,当时各种相关的实习岗位都投递了实习简历。
之前接触过一点测试的工作,也多少有一些个人的想法和思路。但由于对于自动化测试还是十分陌生,并没有专门学习了解而试验过,只有之前项目中有一些零碎的思路。这次被邀约到公司当面进行面试。
有了第一次的挫折,并没有抱太大的希望,只希望面完试可以不那么难过。约面试时间的时候还出了点小问题,但最终还是成功到达了公司进行面试。
HR小姐姐真的是好人…对我真的特别好,那种感觉是电话里感觉不到的。
是一个帅气的哥哥面试的我,问了些
- 基础的计网、网络安全问题
有了第一次的经验,多少还是可以回答上来。之后又仔细查看了我的简历,问了关于
- 项目的一些问题,以及我自己之前的测试思路
- 并了解了我对于测试工具以及后台架构的了解
后来换了另一个技术人员简单面试,最终是HR面试。
- 关于工作时间、工作薪酬以及内容、公司情况
整个过程无比轻松,甚至面试官会给我台阶下:”这个问题不常见,你不知道也没关系“。能感觉到面试官小哥哥两眼放光地看着我…当时心里无比的开心。可能这种感觉不是电话面能感受到的,我感觉当面进行面试反而会轻松很多,可以通过眼神、肢体语言进行交流。
第二次当天就成功拿到了offer,还受到了夸奖,心里很开心
第三次面试
第三次本应该是Tencent…但由于给我打电话时刚好在上课,挂掉后便被通知,没被通过面试…
或许这就是大厂吧…真的不缺人才。
于是第三次面试成为了视源…C++开发,讲真的这个岗位并不是很适合我,面试的过程中也并没有准备多少C++的内容,更多还是关于算法。
为了熟悉年底的Bytedance面试,我面视源的时候,选在了Bytedance面试场地,想熟悉一下这个氛围。那天晚上吃了饭就登上网站做题。
- 入栈出栈顺序
- linux 启动过程
- linux conf文件
- GET和POST参数的问题
- C++ 虚函数、多态
- 最终考了两道算法题,都不难。一道链表翻转+排序。一道贪心算法。
由于并没有准备linux方面问题,对于C++的理论知识也极度欠佳,重视程度也不够,虽然感觉算法题并不难,但前面的多项选择题彻底把我搞死了…
又成功收到了未通过面试的消息。
心里堵了一段时间,但很快就过去了。希望最后一次面试能有一个好的结果。
第四次面试
不敢打开那个文件,感觉自己仿佛做了一个愚蠢的梦…
字节跳动——我衷心希望能拥有实习offer
1. 可能面试问题
1.1 常见面试题
- 计算机网络:传输层
-
TCP和UDP的区别和联系
联系:都是传输层的协议。都可以满足进程之间进行通信。
区别
- TCP是拥有链接的协议,UDP没有连接。
- UDP由于没有连接,传输速度会快很多。
- TCP可以保证传输的可靠性。拥有拥塞控制机制——慢启动、滑动窗口
TCP容易被攻击,因为需要建立连接。
TCP对系统的需求更好。
TCP是流模式,UDP是数据报模式。
-
TCP报文包括哪些部分?UDP报文包括哪些部分?
TCP包括:源端口号(16位)、目的端口号、没有版本号、校验和、SYN、SEQ(16位)、ACK、FIN等标志位
首部长度(4位)、保留位(6)、窗口大小、时间戳
- 同步SYN ,置为1表示这是一个链接报文。
在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在相应的报文段中使用SYN=1和ACK=1。因此,SYN置为1就表示这是一个连接请求或连接接受报文。 - 终止FIN
用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接 - 窗口 占2字节。窗口值是【0,2^16-1]之间的整数。窗口指的是发送本报文段的一方的接收窗口(而不是自己的发送窗口)。窗口值告诉对方:
从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。并且窗口值是经常在动态变化着。
UDP包括:源端口号、目的端口号、校验和、长度(都各占16位)
伪首部(32位源IP地址、32位目标IP地址、8位协议、16位UDP长度)的作用?
- 为了计算校验和 2. 为了通过协议字段检验协议 3. 是否确认IP正确。
- 同步SYN ,置为1表示这是一个链接报文。
-
TCP的三次握手和四次挥手
TCP在建立连接之前需要进行三次握手,首先由客户端向服务器提出请求。SYN = 1、SEQ = x;客户端回复SYN = 1 ACK = 1, seq = y, ack = X + 1;。客户端向服务器发送ACK = 1,ack = y+1 seq = x + 1。之后建立连接。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IwxfsvrL-1578917559646)(C:\Users\38267\AppData\Roaming\Typora\typora-user-images\1577690743355.png)]
四次挥手:由客户端向服务端发送FIN = 1 seq = x, 表示期望终止。 服务端返回ACK= 1, ack = x + 1,seq = y。之后服务端进行closewait。发送FIN, ACK= 1 seq = w, ack = x + 1.客户端返回ack = w + 1;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xGMlWgvU-1578917559649)(C:\Users\38267\AppData\Roaming\Typora\typora-user-images\1577690730421.png)]
-
为什么要进行三次握手和四次挥手。
- 因为避免耗费服务端资源。如果只有两次握手。客户端向服务端发送消息后,服务端没有及时收到,客户端关闭了,客户端返回服务端,服务端认为是垃圾报文,不予理会,服务端会一直等待客户端的保温传输,但是这个客户端是不存在的,会造成服务端时间浪费。
- 四次挥手是因为,在客户端请求关闭链接的时候,客户端已经没有报文要发送了,但是服务端还可以继续接受之前客户端发送的报文。收到客户端的FIN请求之后,服务端还需要继续处理客户端的报文,处理完毕之后再发送FIN给客户端。
-
为什么有2MSL的TIME-wait ?
1.为了保证客户端发送的最后一个ACK报文段可以到达服务器,如果这个报文丢失了,客户端还有机会重传,重启计时器。
2.经过2个MSL可以保证这次链接所产生的所有报文段都从网络中消失,不会对接下来其他的链接造成影响
-
使用TCP的协议有哪些?使用UDP协议有哪些?
TCP:HTTp、SMTP、
POP3/HTTPS/SSH/FTP
UDP:ARP、DNCP、DNS
-
什么是套接字?
套接字是操作系统为应用程序提供的接口,能够实现线程之间的通信,以及跨网络的通信。
套接字是支持TCP、IP协议的网络通信的基本操作单元,是网络通信过程中端点的抽象表示。套接字的实现部分,就是系统的协议栈部分,包含网络层、传输层等。包含:源IP地址、源端口、目的IP地址、目的端口、协议。
- 计算机网络:网络层
-
IP协议头有哪些字段?
源IP地址、目的IP地址、头部长度4位(一单位代表一个字)、报文长度、协议号、版本号、时间、TTL、
服务类型TOS(8位)、3位标志(是否分片)、13位片偏移(对于原始IP报文的偏移)
-
DHCP协议是如何运行的?
DHCP客户端发送IP地址租用申请,广播方式发出。
网络中的DHCP服务器回应一个IP地址租用提供,客户端选择第一个DHCP返回的包的DHCP服务器。广播发送DHCPREQUEST消息,通知其他的DHCP服务器放弃,同时通知选中的DHCP服务器,包含申请IP地址。
最后DHCP服务器会送DHCPACK消息,返回客户端可以使用这个IP地址。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N33tVfyd-1578917559650)(C:\Users\38267\AppData\Roaming\Typora\typora-user-images\1577693680962.png)]
- 计算机网络:应用层
-
HTTP头
cookies、状态码(1开头是不存在、2开头是正确、3开头是重定向、4开头是客户端错误、5开头是服务器错误)
好多啊
-
cookie和session的异同
cookie和session都是用于保存客户状态的,使得客户端每一次访问服务端,服务端都能知道客户端当前所处的事务状态是什么。
cookie内容主要保存在浏览器中,session主要保存在服务端。
Cookies以文本的格式存储在浏览器上,存储量有限(4k),而Session存储在服务端,可以无限量存储多个变量,并且比cookie更加安全。
我们可以轻松访问cookie的内容,也可以在http协议中获取到cookie部分字段
设置cookie的时间可以使得cookie过期,但是还是用session-destory()可以使得对话销毁。
-
DNS是什么?
DNS是域名解析系统,在DNS服务器中保存域名到IP地址的映射。
当用户在浏览器中输入网址的时候,需要发送DNS数据包进行IP地址的查询。查询的过程包括两种方式:递归查询和迭代查询。递归查询是,先查询本地服务器,本地服务器如果不保存映射,则查询根服务器,再由本地服务器根据根服务器的响应结果IP地址,查询TLD服务器,再根据返回结果,查询权威服务器。
递归方式,是通过根服务器访问TLD,再由TLD服务器访问权威服务器。
- 计算机网络:数据链路层**
-
ARP表是如何建立起里的,跨网段ARP表如何建立起来
首先拿到IP地址,获取对应ip地址的mac地址。广播ARP请求报文ff-ff-ff-ff,如果有知道这个IP -》 mac映射的,就返还自己的mac地址给请求方,请求方更新自己的ARP表,写入映射。
跨网段:在本地网络内发送ARP请求报文,IP地址为目的ip,但mac地址为网关mac地址。网关路由器收到之后,建立一个mac帧,并查询转发表,转发给目的主机所在的网段,目的主机收到后,返回自己的mac地址给请求方。
-
ARP报文包括
硬件类型、协议类型、发送方MAC、发送方IP、目标MAC、目标IP、协议长度
- 操作系统原理:线程进程
-
线程和进程的区别
线程是CPU调度基本单位,是进程的一个可调用实体。一个进程可以包含多个线程。线程之间不共享栈区、CPU上下文,共享代码段,堆区,静态区。
进程是程序的一次执行过程。包含五种基本状态。
进程是操作系统分配资源的基本单位。
进程切换要比线程切换开销大很多。线程占用资源比进程占用资源小很多。
线程之间存在同步、互斥、共享进程的所有资源、进程的创建时fork、线程的创建时pthread_cereate
操作系统最多运行多少线程?一个线程的栈预留1M个线程,同时运行的线程需要取决CPU核的个数,可以开启8 G / 1 M 个线程。
-
并行和并发
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GTecXhH0-1578917559652)(C:\Users\38267\AppData\Roaming\Typora\typora-user-images\1578395866675.png)]
-
进程之间如何通讯?
共享内存:两个进程的页表指向物理内存的同一个地址。作为临界区,需要使用信号量来进行临界区数据访问。
消息传递:管道,不同进程之间使用read、write方式进行通信。unix提供系统调用pipe -》 联想到golang
1.管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在有血缘关系的进程间使用,进程的血缘关系通常是指父子进程关系。
2.命名管道(named pipe):也是半双工的通信方式,但是它允许无亲缘关系关系进程间通信。3.信号(signal):是一种比较复杂的通信方式,用于通知接收进程某一事件已经发生。
4.信号量(semophere):信号量是一个计数器,可用来控制多个进程对共享资源的访问。它通常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。5.消息队列(message queue):消息队列是由消息组成的链表,存放在内核中,并由消息队列标识符标识。消息队列克服了信号传递消息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
6.共享内存(shared memory):就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问,共享内存是最快的IPC方式,它是针对其他进程间的通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量等配合使用,来实现进程间的同步和通信。
7.套接字(socket):套接口也是进程间的通信机制,与其他通信机制不同的是它可用于不同及其间的进程通信。 -
线程之间如何通讯?
线程之间,使用wait()、signal()进行通信、signal
确保wait的时候已经拿到了锁,不然会死锁。
- 信号量机制:wait();signal
- 锁机制。
-
用户态和内核态怎么通信?
内核态使用printk可以直接将消息传递到用户态。
用户态通过系统调用,kill、open、write等,与用户态进程通信。
- 系统调用
通过调用c库里的pritnf,使用syscall的形式来进行系统调用。
- 虚拟文件系统
在proc/文件目录下,保存内核的所有信息。
输出只读目录。
- sysctl接口
proc/sys
大部分是可写的。
- netlink
本质上是一种socket
-
写一个生产者、消费者模式。
信号量empty和full
使用mutex互斥信号量、加锁
//生产者 empty.value == 队列长度。 have.value == 0 mutex.value == 1 互斥信号量。 void wait(s * Sem){ s.value --; if(s.value < 0){ //增加当前线程到等待队列 block();//阻塞 } } void signal(s * Sem){ s.value ++; if(s.value <= 0){//有人等着 //唤醒队列头 wakeUp(P); } } //生产者 void produce(){ while(true){ wait(empty); //如果等于0,表示没位置,需要阻塞。 wait(mutex); queue.push(value);//访问临界区 signal(mutex); signal(have); } } //消费者 void consume(){ while(true){ wait(have); wait(mutex); queue.pop(value);//访问临界区 wait(mutex); signal(empty); } }
-
读者写者问题:
对于读者优先:每次需要记录下来当前读者数目。当前读者数目!=0时,读者无需等待。当前读者数目==0时,写者才能被释放。
-
阻塞和忙等待
忙等待则没有上下文的切换,一直进行轮询,非常消耗CPU。
阻塞需要切换上下文,消耗时间。
当任务较难、停留时间长的时候,使用阻塞较好,节省CPU。
当任务较简单、等待时间短的时候,使用忙等待可以提高速度,避免CPU上下文频繁切换。。
-
同步和互斥
互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。
同步其实已经实现了互斥,所以同步是一种更为复杂的互斥。
互斥是一种特殊的同步。
-
死锁相关
-
定义:占有并等待 + 循环等待叙述
-
四个条件:占有并等待、循环等待、资源互斥、不可抢占
-
解除方法:破坏掉四个中的一个资源
- 破坏1:一次申请完所有资源:会很浪费
- 破坏2:编号pid,必须占有比自己大的或者小的。
- 破坏3:全都可以访问,全都可以共享:不可实现
- 破坏4:得不到满足就立刻释放:较为复杂。
-
死锁检测:资源分配图是否出现环路。有可能有死锁
-
死锁解除:
- 资源剥夺
- 杀死撤销进程
- 进程回退
-
死锁避免:
银行家算法,每次分配之前先计算这样操作会不会影响安全性。
-
-
B/S和C/S 的区别
浏览器/服务器:前端交互在浏览器、事务处理和数据操作都是在服务端。效率低下,但耦合性低,容易维护。一般网页服务器都是这种架构,服务端有两层:逻辑层和数据层。
C/S:客户端服务器:客户端需要用户界面交互、处理事务。服务端主要进行数据的存储。
- 后端素养
-
SQL语句
create database basename drop database base name use master create table tabneame create table new like tableold alter table tablename create view as 索引创建 create index name_index on user(username, userage);
-
事务隔离
事务隔离的四种层次和他们的优缺点
- 读未提交
- 脏读
- 读提交
- 只能读别人提交之后的,一个事务范围内查询会出现不同结果。
- 重复读
- 不能insert但看可以update,会出现幻读问题。
- 序列化
- 完全序列化事务,效率低。
- 读未提交
-
ACID
原子性、一致性、隔离性、持久性。
-
索引是什么
对一列或者多列值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息。索引建立后不能修改原始字段,否则索引无效。
- 系统分析
-
MVC架构
模型(Model):负责存储系统的中心数据。
视图(View):将信息显示给用户(可以定义多个视图)。
控制器(Controller):处理用户输入的信息。负责从视图读取数据,控制用户输入,并向模型发送数据,是应用程序中处理用户交互的部分。负责管理与用户交互交互控制。
模型和数据共同构成用户接口。
MVC重要特点就是两种分离:
视图和数据模型的分离:使用不同的视图对相同的数据进行展示;分离可视和不可视的组件,能够对模型进行独立测试。因为分离了可视组件减少了外部依赖利于测试。(数据库也是一种外部组件)
视图和表现逻辑(Controller)的分离:Controller是一个表现逻辑的组件,并非一个业务逻辑组件。MVC可以作为表现模式也可以作为建构模式,意味这Controller也可以是业务逻辑。分离逻辑和具体展示,能够对逻辑进行独立测试。
- golang实践
-
redis
消息队列:直接使用list pop push
分布式锁:setnx lock.id指令可以获取锁,但有可能因为网络原因出现死锁。
需要设定一个超时时间,再设置一个时间戳=当前时间+1,每次获取锁都判断是否超时,如果超时再判断时间戳是否小于当前,如果小于当前再delete锁并获取。getset函数
-
grpc
-
MAP
-
MPG架构
-
channel
-
关键字:defer/select、
- 程序设计
-
面向对象和面向过程的区别
面向过程是按照解决问题的步骤一步步编写代码,然后一步一步执行解决问题
面向对象是将构成问题的事务抽象成一个个对象,描述事务做某个事情的行为。
-
面向对象的三个特征
封装、继承、多态
1.2 算法内容
- 排序算法
- 快速排序
- 归并排序
- 堆排序
- 搜索算法
- 搜索树
- 动态规划
- 技巧
- 判断链表存在环
- 交换链表方向
- 用栈实现队列
押题
思路引领
-
操作系统
- 进程、线程:
- …
-
计算机网络
- 网络通信:
- …
-
分布式系统
…
学科:
计网、操统、算法导论、数据结构、信安、数据库
实操:
C++算法、golang基础语法、掌握WEB后端开发技术: 协议、架构、存储、缓存、安全等;
面试题型:说说tcp和udp的区别。线程和进程的区别http和https的区别(和信安结合)。打一个深度优先遍历。
开拓思路:什么好、什么不好、编程习惯。
学习方法:
- 复习笔记、ppt
- 打一打C++的基本算法题目
- 牛客网刷题、看面试经验。
- GoOnline后台IDE代码读一遍
- GIN框架、Docker相关、Grpc相关。
岗位描述:
1、协助设计和开发企业级办公协同及创作工具类产品运行的核心系统;
2、负责协助高质量的设计和编码;
3、主要语言为Python/Golang。
岗位要求:
1、良好的设计和编码品味,热爱写代码;
2、较好的产品意识,愿意将产品效果做为工作最重要的驱动因素;
3、掌握WEB后端开发技术: 协议、架构、存储、缓存、安全等;
4、积极乐观,认真负责,乐于协作。
http协议头、TCP、UDP、IP
docker调试
redis底层架构、常见数据类型
如何判断链表中有环
图片如何在前端展示。
grpc:stream和简单模式的区别、grpc的优点、grpc底层
cin cout 和 printf 的区别
golang的后端框架
go程之间通信
channel:什么时候会阻塞?
哈希的底层
go语言 分片和list的区别
linux文件系统?
谁知道呢,过去了终究是过去了。事实是准备的问题几乎没考,考的就算我会做,在当时的情况下,我大脑一片空白…
面试官敲键盘的声音真的好大,面试官说话的声音真的好小。我把声音开到最大还是听不清,只能听清他在哒哒哒敲键盘。
-
函数完善:C++
题目并不难,但我有问题,询问了面试官之后,他说的话我一句都没听清
再次询问,很多次之后,我渐渐放弃了…我感觉很绝望,我真的听不清要求
他只好把题目打在屏幕上…
-
TCP小报文优化,我真的不会做
-
golang 实现map,我死了,我一直以为他让我用golang写算法…我错了,要怪就怪自己基础知识不扎实吧
-
TCP拥塞控制:这个还好,回答上来了。
-
sql题目…我看都看不懂。听他说也听不清, 我死了…
-
dbq触及到我知识盲区和认知盲区了。
-
然后…网莫名其妙断开了…再连上,面试官已经离开了…
-
…
考的几乎都是我没有任何准备的东西,加上听不清面试官说的话,全程发呆…
意识到自己凉了,突然不想继续面试了,但也要装作思考的样子…面试官在干自己的事情,也并没有在乎我有没有思路…
关于项目经历没有丝毫提及,尽管我死命拿回讲话权,但奈何能力不足,无法获得话语权,全程被面试官拖着走…努力往我的实际经历上面靠拢,而面试官对我的经历丝毫不感兴趣,甚至可能根本没有看过我的简历…或许大厂就会这样吧,小公司会更看重项目经历以及软实力,会认真读我的简历的每个细节问我,而大公司可能只看重硬实力,像我这样半瓶子醋的肯定过不了的…
想知道这段时间自己究竟在干什么,才会有这样难以启齿的结果,也想知道究竟怎样才能成为市场真正需要的“人才”,想知道,自己是差在哪里,差在才智?差在基础?差在实践?我相信时间会给予我答案。
以下是几点感慨:
- 从小到大,相信有很多人也和我一样,一路顺风顺水,没遇到过什么困难挫折,没吃过什么苦,一路都是赞许、鲜花、掌声,反而没有任何准备地跌倒在将要步入社会的第一个门槛。
- 高考真的很不错。高考,有高考大纲,有历届考题,有老师,有共同奋斗的同时,连高考的考场,都是那么统一化,尽可能把不确定性降到最低,而面试呢,谁会在意你能不能听清面试官的考题,也没有人会在意当时你是不是在上课。
- 我有时总会自负地想,如果我都做不出来,能有多少人做出来,公司难道能找到这样的人才么…然而我的想法太过可笑了。“阿里每年向社会输出一千名工作十年以上的优秀人才”,如此真实的,就是我们将要面对的竞争与压力。
- 这个学期强忍住三次眼泪,一次给了繁重的课程,一次给了未来的生活,一次给了社会给予我的挫折。而我真心希望,自己能