作者生涯

# ACMer

在 2020/09/20 日作者进入到大学校园,零基础刷学校的 oj 成为了一名 ACMer,并担任学校的队长。
抱着对算竞的热爱,体会训练的千姿百态与不易,在小队里面主要负责的是数学和dp,所以这两块的内容总结的比较多,不过别的算法也都有学习并且记录。
最终在打完 2022 年的 xcpc 后,于 2022/11/27 完成退役。
拿到了高不成低不就的成绩:

  • 弱省省赛双冠
  • xcpc一银三铜
  • 蓝桥杯国一

这些训练和比赛的时光几乎充斥了我的整个大学,也为了后面技术方向的学习展开了铺垫
引链:

# CPPer

退役后不能闲着,因为作者的高数非常稀碎,指定是考不上研了,于是选择找工作。
作者的 CPP 路线起步时选择的是后端网络(滑稽),一直在搞项目与看面试题,学习计划比较错乱,导致在大三下面试暑期实习的时候手里就仅有一份 C/S 聊天项目,就是那种最基本的网络通信而已...
网络编程既然不行,痛定思痛将重心放在系统编程上,结合之前网络编程学习的知识拿着 c++ 最优势的功能从零做了一份 C/S 化的数据库内核,因为当时不知道有数据库 lab 什么的,也使得项目的自定义程度非常高 主要利用到的技术是下面这些,想找工作的童鞋可以参考一下该项目的设计方式~ 项目连接 (opens new window)

项目使用到的技术
  • 存储
    • 磁盘
      • SST 组织 KV 数据
        • 以 block 为磁盘与内存交互的最小单元
        • block 内顺序存放 KV 对, 16 个为一组,设置重启点为索引存储偏移量
        • KV 对采用前缀压缩的 entry 形式存放
        • crc32 算法做脚注验证文件的完整性
      • LSM-tree 组织 SST 文件
        • SST 文件的编码与解码以及刷盘
        • LSM-tree 下对 SST 文件进行 level 分级,level 越大 SST 文件越多
        • LSM-tree 下对每层溢出的 SST 文件向下合并
      • WAL 持久化命令,保证数据安全性
    • 内存
      • LRU 缓存来减少磁盘 SST 文件的读取与写入
      • MEM-Table(跳表) 作为 LRU 尾部节点弹出与刷盘之间的缓冲区
      • 对 LRU 的存放为以内存内部利用率为主的内存池(连续分区存储管理),支持
        • 空闲节点的切割与合并
        • 空闲链表动态插入节点
        • LRU 内 {键: lru节点} 的映射容器为手写的 Trie
  • 通信
    • 任意类型数据传输
      • 数据拆分成多个字节发送
      • 收取多个字节后按类型需要的字节数进行合并
    • 主从 Reactor 分发模式下的 Epoll:ET 触发
      • 每个客户端经主Reactor监听连接后平均分配进一个subReactor中响应事件
      • 响应事件的方法为每个客户端只会在一个线程内进行 Epoll:ET 触发的 IO 多路复用
    • socket 进程通信
      • 通过字符串通信模拟报头,完成前置指令
      • 通过 uint8_t 传输完成字节信息传递(两个主机之间以大端字节序传输)
  • 权限与用户
    • mysql 连接下的用户登入信息判断
    • 手写容器模板-字典树用于存放 “[用户名] - 数据库对象”
      • 支持 string 与任意类型组成的键值对的存储
      • 支持部分 map<string, 任意类型> 的操作

暑期实习找的时候这个项目还没有做完,于是并不理想,好在最后超聚变收留了我给了我实习的机会,在里面学习开发操作系统知识。

# 后端er

这也意味着从底层、算法这样的选手转向业务,起因是暑假投的美团秋招,运气比较好问的都是我这个项目,进展十分顺利拿到了 offer ,当时就直接选择allin Java了,于是有了作者现在乱七八糟的技术栈。
由于原本一直在学习底层搭建之类的,突然进入业务方向感觉不太适应,好在抱着对前端的热爱让我度过了起步阶段,并在后面慢慢喜欢上了这门功能强大便捷的语言。
从 2023/09/01 开始学习的,将框架什么的不断进行扩充,并学些中间件什么的。

# 现状

目前作者已经到达了美团打工,公司的wiki和各种术语以及源码十分深奥,属于是边补充技术栈边干活儿吧。
目前就想到这里了...有时间了会再进行补充的~

Last Updated: 11/28/2023, 1:03:38 PM