深信服开了个劝退价....

职场   2024-10-30 12:49   广东  



细思极恐,AI能像人一样操作手机!




大家好,我是小北。


秋招offer 开奖也进入了尾声,今天来看下深信服今年的薪资。


深信服每年在 9-10 月份都会开展线下校园招聘,不少同学经过线下面试就直接通过了所有面试,等待了几周等于开奖了。

不少211、985 硕士同学跟我反馈,深信服给了个大白菜:19k x 16(base深圳),这个薪资相比互联网中大厂是会缺少竞争力,被大多数同学称为劝退价。

其实深信服技术岗位的校招薪资也能开的很高,但是普通档的 offer 和 sp 档的 offer 差距很大.

根据其他同学的爆料, 我也总结了深信服 25 届技术岗的开奖情况:

  • 普通档:17~19k x (12~18)
  • sp 档:22~24k x (12~18) + 15w~20签字费分 3 年发
  • ssp 档位:28~29k x (12~18) +  30w签字费分 3 年发

是不是感觉每个档次差距还挺大的,sp、ssp 档属于少部分优秀的人才有机会拿到,大部分都是在普通档的区间,而且针对 sp 档以上的 offer,还会有额外的签字费,15w-30w 分三年发, 中途离职就没有了。

年终奖的话,有的部门是没有( 12 薪资),有的部门是 4 个月( 16 薪资),有的部门是 6 个月(18 薪资),最终能不能拿满也是看绩效和公司的营收情况。

深信服是会加班的,加班接受程度,周一、周二、周三晚八点半, 每个月第一周六半天。

那问题来了,深信服面试难度如何呢?

我找了一位深信服软开的校招二面的线下面经,提供给大家学习学习,主要拷打了 35 分钟,问完简历上上的项目和校园经历之后,就开始问了一些八股文,主要是计算机网络和数据库方面的知识,也需要现场手撕算法,最后还问了一个逻辑题目。

网络

网络协议为什么需要分层?

复杂的系统需要分层,因为每一层都需要专注于一类事情。我们的网络分层的原因也是一样,每一层只专注于做一类事情。分层带来的好处:

  • 「各层之间相互独立」:各层之间相互独立,各层之间不需要关心其他层是如何实现的,只需要知道自己如何调用下层提供好的功能就可以了(可以简单理解为接口调用),这个和我们对开发时系统进行分层是一个道理。
  • 「提高了整体灵活性」 :每一层都可以使用最适合的技术来实现,你只需要保证你提供的功能以及暴露的接口的规则没有改变就行了,这个和我们平时开发系统的时候要求的高内聚、低耦合的原则也是可以对应上的。
  • 「大问题化小」 :分层可以将复杂的网络间题分解为许多比较小的、界线比较清晰简单的小问题来处理和解决。这样使得复杂的计算机网络系统变得易于设计,实现和标准化。这个和我们平时开发的时候,一般会将系统功能分解,然后将复杂的问题分解为容易理解的更小的问题是相对应的,这些较小的问题具有更好的边界(目标和接口)定义。

说到计算机网络分层,我想到了计算机世界非常非常有名的一句话,这里分享一下:

「计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决,计算机整个体系从上到下都是按照严格的层次结构设计的。」

还有还有,如果一层不够那就加两层吧!

因此,网络协议需要分层主要是因为以下原因:

  • 网络不稳定:可能存在节点故障、停电、网线插头被拔等各种意外情况,导致数据传输失败,分层可以更好地处理重传等问题。
  • 数据量大:大数据需要切成块来传输,分层便于管理和控制分块传输的过程。
  • 不同应用需求:不同的应用层协议(如 HTTP、FTP、SMTP 等)对数据传输有不同的要求,分层可以将共性的功能抽取出来,提高效率和灵活性。

tcp保证可靠性的原理?

TCP协议主要通过以下几点来保证传输可靠性:连接管理、序列号、确认应答、超时重传、流量控制、拥塞控制。

  • 连接管理:即三次握手和四次挥手。连接管理机制能够建立起可靠的连接,这是保证传输可靠性的前提。
  • 序列号:TCP将每个字节的数据都进行了编号,这就是序列号。序列号的具体作用如下:能够保证可靠性,既能防止数据丢失,又能避免数据重复。能够保证有序性,按照序列号顺序进行数据包还原。能够提高效率,基于序列号可实现多次发送,一次确认。
  • 确认应答:接收方接收数据之后,会回传ACK报文,报文中带有此次确认的序列号,用于告知发送方此次接收数据的情况。在指定时间后,若发送端仍未收到确认应答,就会启动超时重传。
  • 超时重传:超时重传主要有两种场景:数据包丢失:在指定时间后,若发送端仍未收到确认应答,就会启动超时重传,向接收端重新发送数据包。确认包丢失:当接收端收到重复数据(通过序列号进行识别)时将其丢弃,并重新回传ACK报文。
  • 流量控制:接收端处理数据的速度是有限的,如果发送方发送数据的速度过快,就会导致接收端的缓冲区溢出,进而导致丢包。为了避免上述情况的发生,TCP支持根据接收端的处理能力,来决定发送端的发送速度。这就是流量控制。流量控制是通过在TCP报文段首部维护一个滑动窗口来实现的。
  • 拥塞控制:拥塞控制就是当网络拥堵严重时,发送端减少数据发送。拥塞控制是通过发送端维护一个拥塞窗口来实现的。可以得出,发送端的发送速度,受限于滑动窗口和拥塞窗口中的最小值。拥塞控制方法分为:慢开始,拥塞避免、快重传和快恢复。

拥塞控制的具体逻辑?

TCP 拥塞控制是为了防止网络过载而采取的一系列措施,这些措施能够动态调整数据传输速率以适应网络状态。TCP 的拥塞控制主要包括以下几种算法和策略:

  • 慢启动:当 TCP 连接建立或发生丢包重传时,TCP 从一个相对较小的拥塞窗口(cwnd)开始。这一窗口随着每次成功收到确认(ACK)而指数增长(每收到一个 ACK,窗口大小增加 1),目的是快速探测可用带宽。
  • 拥塞避免:当拥塞窗口达到一个阈值(ssthresh, slow start threshold)后,TCP 进入拥塞避免阶段。在这个阶段,拥塞窗口以线性增长方式增加(每经过一个轮次,增加 1,即每 RTT 增加 1),这样可以减少发生拥塞的风险。
  • 快速重传(Fast Retransmit):发送方在未收到某个数据包的 ACK 时,收到三个重复的 ACK(即接收方多次确认相同的数据包)时,发送方会立即重传缺失的数据包,而不是等待重传定时器超时。这有助于减少由于丢包导致的延迟。
  • 快速恢复(Fast Recovery):在快速重传机制之后,TCP 会进入快速恢复阶段。此时,ssthresh 被设置为当前的 cwnd 值的一半,接着 cwnd 被设置为 ssthresh 加上三个未确认的 MSS(最大段大小)。这样,TCP 在丢包后不会完全降低其传输速率,而是球立一个新的目标以便快速返回正常状态。

http状态码有哪些?

HTTP 状态码分为 5 大类

  • 1xx 类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。
  • 2xx 类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。
  • 3xx 类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向
  • 4xx 类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。
  • 5xx 类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。

其中常见的具体状态码有:

  • 200:请求成功;
  • 301:永久重定向;302:临时重定向;
  • 404:无法找到此页面;405:请求的方法类型不支持;
  • 500:服务器内部出错。

MySQL

数据库的锁有哪些锁?

在 MySQL 里,根据加锁的范围,可以分为全局锁、表级锁和行锁三类。

  • 全局锁:通过flush tables with read lock 语句会将整个数据库就处于只读状态了,这时其他线程执行以下操作,增删改或者表结构修改都会阻塞。全局锁主要应用于做全库逻辑备份,这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数据与预期的不一样。

  • 表级锁:MySQL 里面表级别的锁有这几种:

  • 表锁:通过lock tables 语句可以对表加表锁,表锁除了会限制别的线程的读写外,也会限制本线程接下来的读写操作。

  • 元数据锁:当我们对数据库表进行操作时,会自动给这个表加上 MDL,对一张表进行 CRUD 操作时,加的是 MDL 读锁;对一张表做结构变更操作的时候,加的是 MDL 写锁;MDL 是为了保证当用户对表执行 CRUD 操作时,防止其他线程对这个表结构做了变更。

  • 意向锁:当执行插入、更新、删除操作,需要先对表加上「意向独占锁」,然后对该记录加独占锁。意向锁的目的是为了快速判断表里是否有记录被加锁

  • 行级锁:InnoDB 引擎是支持行级锁的,而 MyISAM 引擎并不支持行级锁。

  • 记录锁,锁住的是一条记录。而且记录锁是有 S 锁和 X 锁之分的,满足读写互斥,写写互斥

  • 间隙锁,只存在于可重复读隔离级别,目的是为了解决可重复读隔离级别下幻读的现象。

  • Next-Key Lock 称为临键锁,是 Record Lock + Gap Lock 的组合,锁定一个范围,并且锁定记录本身。

间隙锁会不会出现死锁情况 为什么?

Gap Lock 称为间隙锁,只存在于可重复读隔离级别,目的是为了解决可重复读隔离级别下幻读的现象。

假设,表中有一个范围 id 为(3,5)间隙锁,那么其他事务就无法插入 id = 4 这条记录了,这样就有效的防止幻读现象的发生。

间隙锁虽然存在 X 型间隙锁和 S 型间隙锁,但是并没有什么区别,间隙锁之间是兼容的,即两个事务可以同时持有包含共同间隙范围的间隙锁,并不存在互斥关系,也就是一个事务如果获取了(3, 5)范围的间隙锁,那么另外的事务也能成功获取相通范围的间隙锁,因为间隙锁的目的是防止插入幻影记录而提出的。

间隙锁主要是与插入意向锁会产生冲突,说间隙锁在遇到插入意向锁的时候,是会发生死锁的问题的,比如下面的场景:

事务A和事务B 在执行 select for update 的时候,产生了间隙锁,但是在后面的 insert 过程中都阻塞了,因为插入的位置是间隙锁范围的,因此就阻塞了,两个事务都在等待双方的间隙锁释放,于是就造成了循环等待,导致死锁。

手撕

二叉树层序遍历

可以使用队列来实现,下面是一个用 C++ 编写的二叉树层序遍历的示例代码。该实现使用了标准库中的队列(std::queue)来完成层序遍历。

#include <iostream>
#include <queue>

using namespace std;

// 定义二叉树节点结构
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;

    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

// 层序遍历函数
void levelOrderTraversal(TreeNode* root) {
    if (root == nullptr) {
        return;
    }

    queue<TreeNode*> q;  // 使用 std::queue 来实现队列
    q.push(root);        // 将根节点入队

    while (!q.empty()) {
        TreeNode* current = q.front();  // 取出队列的前端节点
        q.pop();                         // 出队

        cout << current->val << " ";     // 访问当前节点

        // 将左子树和右子树入队
        if (current->left != nullptr) {
            q.push(current->left);
        }
        if (current->right != nullptr) {
            q.push(current->right);
        }
    }
}

逻辑

七个球,有一个不一样,称几次能找出来

要找出七个球中一个不一样的球(假设这个球的重量不同),可以使用天平称重的方法,称的次数取决于不一样的球是重还是轻。以下是解决方案的步骤:

第一步:分组称重

第一次称重:将七个球分为三组,分别是:

  • 组1:3个球(比如球A、B、C)
  • 组2:3个球(比如球D、E、F)
  • 组3:1个球(球G)

将组1与组2进行称重:

  • 情况1:如果两组重量相等,说明不一样的球在组3的球G中。
  • 情况2:如果两组重量不等,进一步确定哪个组中有不一样的球(我们也可以知道这个球是重还是轻,根据称重的结果)。

第二步:根据第一次称重的结果进行第二次称重

情况1:如果第一次称重重量相等(球G不一样)。

  • 第二次称重:从组G(只有1个球)中选出,直接得出球G就是不一样的球。

情况2:如果组1(A、B、C)和组2(D、E、F)有不同的重量,假设组1重于组2。那么可以进一步判断:

  • 第二次称重:将组1的两个球与组2的两个球进行称重:比如将A和B与D和E进行称重。

  • 如果A和B重于D和E,则不一样的球在A或B中,并且可以知道它是重的。

  • 如果A和B轻于D和E,则不一样的球在D或E中,并且可以知道它是轻的。

  • 如果两边重量相等,则不一样的球必在组中没有称重的那个球(C或F),并且可以知道它是重还是轻。

第三步:找到不一样的球

  • 第三次称重:根据上一步的结果,可以从两个候选球中选择一个进行称重。比如:

  • 假如上一步得知A和B中有一个球不一样,再称重一次A和B,这样可以确定出哪个是不同的球。

因此,通过这三个称重的步骤,最多只需要 3 次称重 就可以找出7个球中那个不一样的球。

推荐阅读:

后端训练营,又开卷了!!!

编程指北
大厂开发, 分享计算机、编程、科班学习经验和计算机基础知识,CS系统学习网站: csguide.cn
 最新文章