八月到十一月
自八月底实习结束,可以说经历了各种事情,现在回想起实习甚至有点陌生
这篇文章我想向各位读者讲述一下从八月到十一月,从实习离职、秋招、oceanbase 比赛发生的许多有意义的事情,顺便也记录一下我对这些事情的观点。同时这篇博客应该也是我的第一篇非纯技术分享的文章
不过在回顾之前,我想先宣布一件最近发生的事情
买了新域名!
最近买了一个特别喜欢的域名 z2z63.dev,并将博客也迁移到blog.z2z63.dev。z2z63是我常用的一个 ID,也是我 github 的用户名,这个 ID 看起来就是一个随机字符串,来源也是非常随便,若干年前注册 steam 时由于只能用英文用户名,就在键盘上随便乱敲敲出了这个 ID,字面意义上的随机字符串
实习离职了
实习开始时,我就在犹豫要不要转正,一方面因为想做后台,另一方面因为自己实习时间比较短,担心能不能转正。就这样犹豫到了八月中旬,加上学校那边也是不得不回,终于下定决心离职然后秋招找后台的工作
这里非常感谢我的一位 gal 游戏搭子,听了我倾诉一大堆东西,最后帮助我下定决心。最后我想请他吃饭表示感谢时
同时也感谢一位同学,实习期间我们经常分享彼此的日常
我的实习简单来说就是在腾讯参与一个全国许多人都用过的一个软件的客户端开发。实习总体来说很开心,公司对实习生要求也不多,上手的项目规模非常庞大,总体来说是一个又轻松又有挑战的一个工作
这里我还想感谢我的 mentor,一位三十多岁的 C++老兵(小组长如是评价,笑),论水平和经验一定是远超 刚满 20岁,还没到大四的我,却能和我维持一个很好的朋友关系,每天散步时,我总是能和他谈很多技术上的话题(在学校根本找不到这样的机会!),而且能让我感觉在谈论技术话题时,虽然他水平远超我,但仍然是以平等的地位参与讨论。
因为这么好的一位 mentor,我离职时还感觉有点对不起他,于是安慰自己秋招试试能不能再进腾讯。离职当天我来到他工位,算是比较郑重又比较轻松的说了谢谢。希望有一天我还能和 mentor 共事
不得不说腾讯给的是真的多,加上我还有住房补贴和交通补贴,到手的实习工资非常可观。于是我拿人生中的第一桶金请父母和姐姐吃了一顿饭。
提到这件事,我就想说这份实习工作还是挺自由的。当时吃饭的时间定在晚上 6 点后,这个时间下班比较早,我本来打算请假。我询问了 mentor 后,他告诉我说“你有事就可以早点走”,不用告知小组长,也不需要申请什么东西走什么流程,非常自由
后面又了解到其他同事基本也是这样,公司要求的工作时间比较弹性,只要满足部门和项目的要求,是可以提前下班的。比如每周五大家都是晚上 6 点后就走了
公司给的福利相当好,上下班有班车接送,几乎全深圳都能坐到班车,比挤高峰期的地铁好多了!
公司也有早中晚餐,其中只有午餐收费,价格大概在 21-28
不过网上也有吐槽,比如提供免费早餐和班车送上班是吸引员工早点来公司干活。我认为这说的很有道理,因为在我家附近的上班班车出发时间是早上七点多,而公司平均上班时间是早上 10 点。同时下班班车是晚上 9 点(不同班车的出发时间不一样,只是到我家附近的班车恰好这个点),导致我想早点下班都比较麻烦(自己坐地铁要花更多时间)
提到班车我想再扯一下通勤。由于我家地理位置不好,离互联网公司都远,每天上下班都是横穿大半个深圳。各位读者未来工作一定要选离公司近的地方住,这是非常简单的提升辛福指数的方法
实习有什么感想?
第一点就是互联网大厂加班是真的严重,虽然腾讯条文上给出的工作时间非常人性化而且轻松,但由于部门或者项目永远缺人力(至少我所在的部门是这样的),加班非常严重
一般加班都有加班费,但在腾讯,首先在工作日干 24h 都不算加班,只有在休息日(例如周末,法定节假日)来上班才是加班。其次,在休息日加班没有加班费,而是增加一天的调休假期。到这里还是很美好,看起来是再怎么加班假期也不会少。但公司还有一个规定,调休假期需要在两个月(或者三个月,大概是这个数字)内休完。如果项目长期很忙,调休假期就可能没来得及休。没来得及休的假期也许有补偿,但我直到离职也不知道补偿是什么
第二点就是了解了大公司的思维模式。大公司不差钱,所以工作环境就能比其他公司好的多。例如我实习第一天报道时,就发了一个 4K 屏,一个主机,有一个性能不错的 Intel 芯片,32G 内存。虽然 4K 屏和 32G 内存是有点贵,但对大公司来说这点钱算不了什么,但要影响到工作效率那就不值得了。
此外,茶水间的配置非常全,因为对大公司来说,提升员工幸福度和工作意愿,或者说员工福利,是一个影响公司名誉,影响员工满意度和忠诚度的事情。而茶水间虽然配置很全要多花钱,但一层楼也就两个茶水间,整个大厦的茶水间都用上咖啡机制冰机,也花不了多少钱,比起增加假期、提供覆盖全深圳的班车来说,是花钱最少、性价比最高的方法
一句话总结,大厂不仅仅是很有钱,而且在该花钱的地方绝不含糊
第三点就是实践真的很重要。在参与了那么大规模的软件的开发流程后,我才意识到之前在学校里写的东西都是玩具。计算机科学中的很多问题只有在参与到广泛的实践与生产中才能领悟,也是实习后我才真正认同了计算机学科是工科。在学校写个玩具只要求实现功能,在公司做产品要考虑很多方面,比如如何规避合规风险,如何服务残障人士,如何保护用户隐私,如何保护公司的企业形象等等。合规成本对大公司来说非常高,所以能规避都会尽量规避,例如防止内部工作人员看到用户隐私信息,在国内版本屏蔽某些功能等,都是首先为了规避合规风险,其次才是符合社会责任
买了 mac
早在实习前就在网上或者在显示中看到别人的 mac 多么漂亮,实习时有位实习生同事(还是他,接下来还会提到他)也用 mac(做mac端的客户端开发)也给我狠狠普及了一波 mac。实习修 bug 时,遇到了一些 bug 在 windows 上怎么都无法复现,后来 mentor 告诉我 mac 的渲染速度比 windows 快的多(至少对于我们这个产品这样的)。加上实习时用惯了 4K,回到宿舍看着 1K 23.8 英寸的屏幕已经看不下去了,感觉网页上的字体肉眼可见的模糊。加上实习也拿到了一笔“巨款”,于是在 9 月买了macbookpro加上一个 4K 显示器。刚刚用上 mac 的那段时间非常惊艳,特别漂亮
mac 的漂亮是有两个层面的,第一个层面是桌面环境大量使用透明、毛玻璃、圆角,加上 mac 内置屏幕素质非常高,相比 windows 的兼容低 dpi,mac 的字体的渲染策略更倾向还原印刷效果,再加上苹方字体比微软雅黑好看太多,三个因素叠加,导致 mac 的字体比 windows 的好看太多(实际原因很复杂,我目前理解的比较浅,希望以后深入理解后能专门写一篇文章来讲)
第二个层面是第三方应用的开发时,设计师往往使用 mac,设计稿也是按照 mac 端的效果来设计(至少我实习时参与开发的产品是这样的),我的 mentor 说,mac 端的效果不能在 windows 端完全还原,首先是两个平台的默认字体的字形有差异,显示文字时总会差几个像素。其次是微软雅黑的字重没有苹方丰富,很多时候只能选择用相似的字重而牺牲了和原型图的一致性。
我的体验是,腾讯很多软件的 mac 端更好用,例如 windows 端的微信,在实习时就有所耳闻,给我的印象是“积重难反“,虽然很多地方做的不好但是改动成本很高(微信 4.0 要出了,大概率是推翻了以前那套方案从头干起),而微信 mac 端,有圆角,有毛玻璃,有深色模式还支持跟随系统,支持调整字体大小
日常用起来很漂亮,唯一的缺点是简单粗暴的拿系统默认语言作为微信默认显示的语言,不能单独设置语言
除了很漂亮,还有其他点我也很喜欢,例如
- 续航很强,终于可以随心所欲的自习而不用担心电量了
使用场景:刷题,写单文件C++,读书 - 触摸板很好用,完全可以扔掉鼠标只用触控板,外出时完全不用带鼠标
而且微调设置,装上better touch后,可以解锁更强大的功能。我最常用三指拖拽,二指轻按=右键,二指横扫前进后退,还有我使用 better touch 定制的切换浏览器标签页的手势。
此外,使用触控板浏览网页并滑动时,能清晰的感受到触控板的滑动非常细腻,而且有滑动惯性,体验很好,而我的鼠标滚动则像齿轮一样能明显的感受到存在一个滑动的单位长度。总的来说,使用触控板滑动就像使用手机屏幕滑动那样细腻 - 硬件配置很高
内置的屏幕分辨率高达 3024 x 1964,而我的 4K屏也就3840 x 2160,14 英寸的屏幕分辨率直追 4K 屏,加上有 P3 色域(P3色域非常高,是专业影视的水平),屏幕素质已经高的离谱了
内置的键盘打字手感不错,虽然肯定不如机械键盘,但在这么短的键程已经是非常优秀的手感了
充电头是磁吸的,线的材质就像尼龙绳一样。加上充电头磁力非常大,直接拔下来要很大力,但从侧面掰出来比较轻松,这点设计我很喜欢
上面夸了那么多 mac,但我还是很想吐槽一下 mac,
8G 内存 \ 256G 硬盘的配置是什么垃圾,这种配置难道不是生产电子垃圾?- 没有内置剪贴板历史,很难想象剪贴板历史都要第三方 app 去做,而且还能订阅制收费,
怎么不去抢劫 - 我需要用蓝牙共享网络,但这个功能在高版本的系统里被砍掉了
- 早就听说了homebrew,但真正用的时候才发现homebrew 不是官方的,使用体验完全不如 linux 的包管理器
mac 的逻辑比较像移动系统,比如台前调度侧面的窗口,mac 会自作主张的根据屏幕尺寸帮你设置最大窗口数量,比如在我的 4K 屏上在stage下最多只能有 6 个窗口
mac适合开发吗?
首先我需要强调以下只是我的观点,如果有不一致,欢迎在下方评论区讨论
这个问题需要先排除 macos 开发,因为 macos 开发只能用 mac
在我看来,论开发的方便程度 linux > mac > windows,论日常使用的方便程度 mac ~= windows > linux。原因如下
首先考虑java,python 这样的跨平台的语言,使用 mac 确实没有太大的影响。但很多时候我们面临更多复杂的场景,比如说使用 java 开发,往往使用spring boot,而安装数据库,中间件等操作很明显在 linux 更方便。例如:
- 如果需要使用 postgresql,在 archlinux 一行命令轻松搞定,如果不想安装在本机,使用 docker 也是一行命令搞定。而在其他平台,如果使用installer 安装,会被带上全家桶(pgAdmin, StackBuilder)
- 如果需要使用 redis,在 windows 就只能安装到 docker 容器里或者安装到 wsl 中,因为 redis 不支持 windows
- 如果需要使用 docker,虽然各个平台都有 docker desktop ,但 linux host 的性能是最好的
其次考虑 C/C++,C/C++开发中一个很重要的领域就是和系统交互,而这里指的系统往往是 linux。加上我对操作系统的熟悉程度为linux > windows > macos,在 mac 开发时遇到和操作系统交互的场景就比较头疼
当然 macos 基于 freeBSD,而且是 POSIX-certified,同时也符合Single Unix Specification,所以在操作系统接口层面很多地方和 linux 非常相似
然而遵守 POSIX 和 Single Unix Specification 标准只是听起来很美好。现实情况是,POSIX 和 Single Unix Specification 标准有许多版本,而且有各自的标准扩展。但一个系统只需要符合其中若干版本就能够被称为是符合标准。例如 macos 实际上只遵守 Single Unix Specification 的 UNIX 03版本
正是 mac 像 linux,但有些地方又有所差异,导致我在尝试调用 macos 系统能力时总是畏手畏脚,这点反而不如 windows
而且 freeBSD 跟 linux 不是一家,加上 apple 又给 mac 加上了很多 apple 专有部分,导致有些地方看起来像 linux 实际上不是,例如rm
也许是来源于 freeBSD,参数风格和 linux 的 gnu coreutils 有所不同
最后,linux 发行版的包管理器也是一个非常强大的工具。C/C++开发总是少不了第三方库,在依赖不是很严格的情况下,可以直接使用包管理器安装一些 C++第三方库。例如我使用的发行版archlinux,由于许多软件包都依赖一些比较基础的 C/C++ 库,而且 arch 在发行这些库时,会带上头文件和文档,大部分情况下直接写好 cmake,就能直接用第三方库
例如我想引入 zlib 压缩一些东西,可以使用pacman -Qs zlib
查询到我已经安装了zlib
local/zlib 1:1.3.1-2
Compression library implementing the deflate compression method found in gzip and PKZIP
然后查询zlib这个包有什么文件
➜ pacman -Ql zlib | tree --fromfile
.
└── zlib
└── usr
├── include
│ ├── zconf.h
│ └── zlib.h
├── lib
│ ├── libz.a
│ ├── libz.so
│ ├── libz.so.1
│ ├── libz.so.1.3.1
│ └── pkgconfig
│ └── zlib.pc
└── share
├── licenses
│ └── zlib
│ └── LICENSE
└── man
└── man3
└── zlib.3.gz
可以轻松看出,我有zlib的库和头文件,这已经足够调用zlib 了。同时还有zlib.pc
,所以如何链接到zlib已经不成问题了,将pkg-config --libs zlib
的输出作为编译参数传递给编译器即可。了解了 pkg-config的工作原理后,如何写 cmake 链接到 zlib,也化解为「找到 cmake 对 linux 的 pkg-config 的包装」这样一个随手 Google 就能解决的问题
解决了 zlib 引入的问题后,如果对某个参数不了解,可以随手man查看文档,比打开浏览器更方便
当然以上顺畅的工作流还需要一个适合开发的 linux 发行版。例如某些发行版的软件包不带头文件,有的不带静态库,有的版本太旧等等。
从上文可以看出我更倾向在 linux 开发,于是我采取了一个折衷方案,即日常使用 macos,开发远程到 linux,主要使用的工具有 VSCode, Jetbrains Gateway, Windows Remote Desktop(windows 开发不得不用 windows)
秋招
8 月底我提出离职后,总监和我谈话时说:“你秋招很难再找到更好的岗位“,当时我的想法是想经历一次秋招,多一次磨练的机会,因为我拿到实习 offer 的历程太轻松了,甚至连技术笔试都没有,就这样迷迷糊糊的拿到了大厂体验券
准备秋招,首先是确定自己的就业意向,我的意向就是 C++,后台/系统/数据库内核开发。当然系统开发和数据库内核开发是偏技术研究的岗位,本科生基本不可能找到。所以我投的大部分都是C++后台
说实话这个赛道比较窄,因为现在很少有公司会拿 C++ 做后台了,或者说互联网公司用 C++ 的都不多。腾讯我所知的C++用的比较多的公司,腾讯会议是 C++做的,微信客户端是 C++做的,微信后台也是 C++做的。但除了腾讯,大概很少有互联网公司选择 C++ 了
秋招是怎么准备的?
我准备秋招的过程包括刷题,复习计算机网络、操作系统、数据库,看八股文,加深对 C++的理解。刷题可以说是进大厂的敲门砖,很遗憾的是我题刷的还是不够多,或者说我根本就没有耐心刷几个月的题。而且我也没有提前刷题,导致秋招刚投的几家直接在笔试被筛了;
计网,操作系统,数据库可以说是科班课程中非常重要的几个了。面试题大部分都跟这几个有关,幸运的是这方面我掌握的还算不错,复习起来很快
看八股文对我来说也就是看常见的面试题。很多面试题的意图是考察面试者对计算机某个领域的理解程度,而这个理解程度就是一个人水平的表现。看八股文不可能快速提升水平,加深理解程度也是需要很多平时的积累,所以在网上经常能看到背八股文的人。我的评价是背八股文没用,以下展开说明
- 八股文大多是中文表述的,所以找到的八股文资料往往是 CSDN、稀土掘金等社区的文章,质量好点的就是一些个人博客,再好一点的就是一些小书
- 简中互联网的技术内容不太好,许多文章要么太浅要么有错误
- 所以有些八股文是不太准确的
我的方法是:八股文只能作为常见面试问题的参考,真正的答案还需要自己思考,需要大胆否定八股文的一些内容。思考常见面试题的答案的过程,也就是练习如何应用计算机基础知识,思路清晰的回答面试题的过程,我认为这才是看八股文最大的意义。
对于面试题,我还是非常有自信的,只要是我擅长的领域基本回答的挺好,举几个我在面试中被问过的题(口语化表述,没有抠细节)
- C++的static关键字在局部变量,全局变量,函数,成员函数,成员变量上使用时的效果分别是什么
static 修饰局部变量,表示这个变量的生存期和程序的生存期相同,他会在第一次执行局部变量所在的函数时完成初始化,在 C++11后,保证了并发执行时不会重复初始化,这是通过编译器在初始化前后插入代码保证互斥执行实现的。这个变量一般在数据段,效果近似于全局变量
static 修饰成员函数,表示这个成员函数参数没有隐含的this指针,效果近似于普通函数
static 修饰成员变量,表示这个成员变量属于类而不属于这个类的对象他只有一个实例,效果近似于全局变量。如果类使用了模板,那么这个模板类每实例化一次就有一个与之关联的静态成员变量
static 修饰全局变量和函数的效果是修改 object 的 linkage,即链接属性。这里的 object 指的是需要占据一块内存的 object,可以是变量的二进制表示或者函数编译后的二进制输出。static 修改 linkage 为 internal linkage,在参与链接时,即使两个.cpp文件有同名的符号,也不会产生链接错误,而是分别嵌入各自的 ELF 中 - 类的构造函数可以是虚拟的吗,类的析构函数可以是虚拟的吗
C++的运行时多态有两个特点:运行时类型不等于编译期类型,多态只能通过指针或引用访问对象才能生效
在创建对象时必须知道这个类具体是哪个类,即必须知道运行时类型是什么,所以这里不能有多态,也就不能被virtual关键字修饰
在拿到一个基类指针时,如果需要销毁这个对象,需要按成员变量的声明顺序逆序逐个析构,也就是析构的顺序和构造的顺序相反。不同类型的析构函数不同,需要正确的调用运行时类型对应的析构函数,所以需要基类的析构函数是虚拟的
以上两个例子可以看出,虽然这些面试题都算比较经典的八股文,但背后涉及到两个比较深的知识,第一个问题是 C/C++的编译链接过程,第二个问题是 C++的对象模型、对象内存布局和多态。而这些内容很明显是看八股文不可能学会的
除了八股文,我还推荐看一些比较经典的书来加深对一些领域的理解,比如编译链接过程可以看《程序员的自我修养——编译、链接与库》,C++的对象内存布局和多态可以参考《C++ primer》
不过秋招来啃这些书我个人认为还是不太合适,只是对我来说,想要深入的理解某个领域只有靠看书。除此之外,看书还能练习站在底层考虑问题的能力、练习深入思考的能力、练习逻辑清晰的组织回答的能力,这些能力对回答面试题都是非常有帮助的
秋招难吗?
非常难,我投的后台岗位竞争非常激烈。我基本投遍了国内所有大厂,大部分都被筛掉。后续拿到的面试机会基本是调剂或者中厂
其中最遗憾的也许就是腾讯给的一次面试机会,面试时两道题没做出来,但事后来看是非常简单完全应该做对的。这次机会可以说是拿到的最好的机会,因为其他大厂基本没有给后台的面试机会
其中还有一些流程也许因为技能不太匹配而被挂了,例如荣耀的 java 后台和字节的 java android 客户端、
甚至还有一些公司在投递后迟迟不发笔试,我干脆当作这些公司把我挂了,一个月后他们的笔试邀请姗姗来迟时,我也不太想做了,其中包括小米(小米单论互联网体量在我心中只算中厂,但没想到中厂不要我)和京东(我在投递京东后,发生了一些事件导致京东风评不好,我当时也很犹豫要不要做笔试)
我以前从来没有用过上岸这样的词,但经历了秋招时不时翻一下邮箱期待某个大厂邀请面试、每天打开许多大厂的校招网站点击如同安慰剂的“刷新简历”按钮、投了许多大厂却没有任何回音、面试几轮自以为表现不错却被挂,我就不知不觉的想“赶紧上岸”。朋友说”难道你在水里吗,老是说上岸“,我回答说”不,我在海里”
我想我的劣势就是学历和实习经历不够,首先学校只是一个 211,而且我只是本科生。同时正因为我是本科生,自然没有多少实习经历。这样的简历自然是比不过有多段实习经验的 985 的硕士,简历被筛也是很正常了
而且最近几年本科毕业直接工作的人越来越少了,越来越多的同学选择考研,根据我的估计我所在的学院大约 50%~70%的同学都在考研/保研/考公/出国,这个比例已经非常夸张了,甚至到了 11月,我所在的学院也只有 9 个同学签了三方。
由于秋招的竞争激烈,我甚至有段时间觉得 211 学历都含金量不高了。拿到 offer 后的某一天我突然看到一项数据,2024年高校毕业生人数为1179万。而全国大学生中只有 5% 是 985 或 211, 2%是 985(数据来源1,2. 所以说相比大多数人,我参加秋招的优势已经是非常大了,但这也反映出了现在就业市场竞争是多么激烈
秋招有什么马后炮?
- 刷题很重要,许多公司对一些岗位会限制笔试成绩,成绩低于某个线就和该岗位无缘。最好提前2个月刷,甚至提前 5 个月都是可以的
- 金九银十是骗人的,现在越来越多的大厂在八月中旬已经开始提前批了,最好八月就开始投递。投递得晚可能遇到目标岗位 hc 已满,或者好的岗位 hc 已满,只能选下一梯队的岗位的情况。有些岗位 10 月就会招满,有些公司 11 月就会招满
- 做好打持久战的准备(如果你是大佬当我没说),可能长达两三个月 0 offer
- 不要想着秋招的时候做准备然后参加明年春招,秋招虽然竞争很激烈但 offer 也是最多的,春招只会更难
- 秋招前尽量多几段实习经历
- 秋招当年的3月投大厂目标岗位的实习(比秋招简单多了),进去后再转正,可以比较轻松的拿到 offer,不用卷秋招!
- 找个搭子互相分享秋招进度,能极大的缓解焦虑
很幸运我在实习时遇到的实习生同学 @214也参加了秋招,我们经常分享流程进度、面试内容,甚至还有于角色扮演一般的对话
append
近期对博客有许多计划,我想分享一些我看过而且评价很高的书,想分享我常听的音乐(我的编程时长约等于听音乐时长),想分享一些 C/C++的基础、经典、核心的库,也想将博客同步发到知乎、博客园等网站,敬请期待!
最后,附上最近打比赛常听的音乐,感谢愿意耐心读完这篇快 9k 字的文章的你