有 gap 期的话,找工作是比较被动的,哪怕教育背景很不错,比如 985 本。
星球里就有这样一位 23 届的球友,985 本,在 xx 工作过一年,做的是 Java 开发,因为公司想让他转 PHP 开发,就索性裸辞了。
24 年10 月份拿到了两份 offer,一个是华为 od,另外一个暂时先保密,薪资待遇比华为 OD 这个低一些。
可能很多小伙伴看到这里会觉得 985 本去华为 OD 太亏了吧?
但现实情况摆在面前,当你第一份工作的内容很 low,技术发展受限,再加上一小段 gap 期,再找工作的时候就会非常难受。
小厂看不上,大厂够不着。
唯有华为 OD 这种大厂外包,是一个相对说的过去的选择。
第一,华为 OD 的面试相对容易一些,我们来看一下往期《Java 面试指南》里收录的面试题感受一下。
基本上都是比较常见的题目,比如说 MySQL 用过哪些函数,容易吧?
Linux 使用过的命令、chmod 参数,不难吧?
多线程、线程池也属于常规题目。
HTTP、OSI 七层模型、了解哪些设计模式、Docker 也都是面渣逆袭上强烈要求大家掌握的内容。
剩下的 Redis 了解多少,队列和栈的区别,引用类型的变量有什么特点,都很 easy。
第二,华为 OD 比较不在乎你以往的工作经历,只要你学历是 985 本、211 本,都会给机会。
第三,华为 OD 的薪资待遇相对来说,比很多中小厂给的都要靠谱的多。
像我之前统计的这份华为 OD 薪资一览表,其实就很能说明问题。
拿济南 OD 的 16K 来说,虽然没办法和大厂动辄 20-30k 的薪资比,但如果比较的对象是当地的企业,那真的要赢麻了。
找工作最忌讳的是,别人说垃圾你也觉得是垃圾。
就比如说很多人羡慕华为的工作,但喷华为的人可不在少数。
就比如说大厂的外包很多人连门槛都摸不到,但是依然会 diss 几句,外包不如狗,OD=our dog。
很多事情,喷几句是会舒服,但与事无益。
我现在遇到黑子的标准做法是,不回应不反驳,默默拉黑。
就拿 985 本去华为 OD 这件事来说,亏不亏?
如果你没有更好的 offer,肯定不亏。
如果你腾讯、阿里、百度、字节、京东、美团的 offer 都拿了个遍,你去华为 OD 干什么,亏麻了呀。
适可而止。
给自己和解吧,别背着沉重的包袱前行。
华为 OD 面试题一道
JOIN操作为什么要小表驱动大表?
第一,如果大表的 JOIN 字段有索引,那么小表的每一行都可以通过索引快速匹配大表。
时间复杂度为小表行数 N 乘以大表索引查找复杂度 log(大表行数 M),总复杂度为 N*log(M)。
显然小表做驱动表比大表做驱动表的时间复杂度 M*log(N) 更低。
第二,如果大表没有索引,需要将小表的数据加载到内存,再全表扫描大表进行匹配。
时间复杂度为小表分段数 K 乘以大表行数 M,其中 K = 小表行数 N / 内存大小 join_buffer_size。
显然小表做驱动表的时候 K 的值更小,大表做驱动表的时候需要多次分段。
sql
-- 小表驱动(高效)
SELECT * FROM small_table s
JOIN large_table l ON s.id = l.id; -- l.id有索引
-- 大表驱动(低效)
SELECT * FROM large_table l
JOIN small_table s ON l.id = s.id; -- s.id无索引
- 当使用 left join 时,左表是驱动表,右表是被驱动表。
- 当使用 right join 时,刚好相反。
- 当使用 join 时,MySQL 会选择数据量比较小的表作为驱动表,大表作为被驱动表。
----这部分是帮助大家理解 start,面试中可不背----
为了验证这一点,我特意新建了两个表 departments 和 employees。
插入测试数据:
sql
-- 插入测试数据
INSERT INTO departments VALUES
(1, '研发部'),
(2, '市场部'),
(3, '人事部');
-- 插入更多数据到员工表
INSERT INTO employees VALUES
(1, '张三', 1),
(2, '李四', 1),
(3, '王二', 2),
(4, '赵六', 2),
(5, '钱七', 3),
(6, '孙八', NULL),
(7, '周九', 1),
(8, '吴十', 2);
然后用 explain 查看执行计划:
当使用 left join 的时候,第一行是 employees 表,说明左表是驱动表;当使用 right join 的时候,第一行是 departments 表,说明右表是驱动表;当使用 join 的时候,第一行是 departments 表,说明 MySQL 默认选择了小表作为驱动表。
----这部分是帮助大家理解 end,面试中可不背----
这里的小表指实际参与 JOIN 的数据量,而不是表的总行数。大表经过 where 条件过滤后也可能成为逻辑小表。
sql
-- 实际参与JOIN的数据量决定小表
SELECT * FROM large_table l
JOIN small_table s ON l.id = s.id
WHERE l.created_at > '2025-01-01'; -- l经过过滤后可能成为小表
也可以强制通过 STRAIGHT_JOIN 提示 MySQL 使用指定的驱动表。
sql
explain select table_1.col1, table_2.col2, table_3.col2
from table_1
straight_join table_2 on table_1.col1=table_2.col1
straight_join table_3 on table_1.col1 = table_3.col1;
explain select straight_join table_1.col1, table_2.col2, table_3.col2
from table_1
join table_2 on table_1.col1=table_2.col1
join table_3 on table_1.col1 = table_3.col1;