HR 面角色扮演话术
个人评价
我是一个注重责任心和执行力的人,具备较强的学习能力和适应能力。在技术方面,我擅长运用现代化工具提升工作效率,具备扎实的编程基础和系统性思维。通过参与开源项目和多人协作开发,我积累了丰富的团队合作经验,能够在复杂项目中承担相应职责。在学生时代担任社团主席的经历,培养了我的组织管理能力和服务意识。我相信凭借踏实的工作态度和持续学习的精神,能够在银行信息科技岗位上稳步发展,为金融科技建设贡献自己的力量。
优点与缺点
笔者具有下列优点与缺点:
优点:
执行力强,当天给自己规划的任务,即使熬夜要完成
擅长使用大模型辅助编程,掌握大模型工作流编程,对大模型有比较深刻的理解
有两段开源经历,与开源社区有过密切的接触,深入参与过多人协作开发的企业级项目
善于自我反思与自我改善,追求自我实现
缺点:
有时对细枝末节过分在意导致拖慢项目整体进度
在团队协作时,会想着自己多考虑一些场景但有时会忘记与团队中其他人对齐信息导致白白做了无用功
特长
爱好唱歌和编程。
社会及校园活动经历
简略版:
在本科阶段担任了数统学院科学与技术协会的主席一职,组织举办了华中科技大学数学建模大赛 ...
数据库适配迁移方案设计
Gorm
gorm 身为 orm 框架,本身提供相当多的数据库操作函数,并会在底层自动将它们转成符合相应数据库 SQL 格式的 SQL。
gorm 重写(或者说转译)SQL 的类称为 Dialector。在具体执行方面可以复用 mysql 和 postgresql 的 Dialector,但是 mysql 语法转成 postgresql 语法这部分工作需要自行完成。
clause.OnConflict
mysql 与 pg 的 UPSERT 操作语法不一致:
1234-- MySQLINSERT INTO `users` *** ON DUPLICATE KEY UPDATE `name`=VALUES(name),`age`=VALUES(age); -- PostgreSQLINSERT INTO "users" *** ON CONFLICT ("id") DO UPDATE SET "name"="excluded"."name", "age"=" ...
为面试疯狂,C++ 面试手写数据结构大全
前言
校招 C++ 大概学习到什么程度
写明白下面这几个代码 +能讲明白几个 C++11/14/17 的特性
MyString
MyVector
MyLRU
MySingleton
MyHashTable
MySharedPtr
MyUniquePtr
MyWeakPtr
MyThreadPool
MyRingbuffer
MyReadWriteMutex
MyForward
MyMove
MyString
展开代码
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465class MyString {private: char* data; size_t len;public: // 默认构造函数 MyString() : data(nullptr), len(0) {} // 构造函数 MyString(const ...
The Difference Between B-Tree, B+Tree, Red-Black Tree, LSM Tree and SkipList
人们总会争论 B-Tree 族、红黑树与跳表的互换性,已知 Java 与 C++ 的 Map 都使用了红黑树作为底层结构,围绕此问题,人们总会在一个缓存结构出现后问道:那为什么不使用跳表/B树呢?
rust 的 TreeMap 为什么采用 B-tree 而不是红黑树?
为啥 redis 使用跳表 (skiplist) 而不是使用 red-black?
抛开明明最有可能的个人作者喜好不谈(参与过开源的人都知道,项目最开始的走向极大概率取决于维护者个人喜好与品味,而后续的更改却需要拿出一个完善的 PR 与相当多的证据证明优越性才可能被维护者合入,简言之维护者乐意怎么写就怎么写,用哪个都有理,毕竟哪个都没有绝对优势),笔者在此总结一下这些 Tree 的特点。
名字
缓存友好性
调参友好性
并发友好性
实现 scan 操作友好性
insert/delete 实现难度
AVL Tree
不太友好,每个节点都 new 一遍太伤了
无参可调
不甚友好,旋转操作发生很频繁,要锁的节点太多
中序遍历,没 B+Tree 和 SkipList 友好
easy,谁都写过吧
Red-Bla ...
智能指针之说
RAII 与 unique_ptr
资源取得时机就是初始化时机(Resource Acquisition Is Intiallization,RAII)是 C++ 内存管理的第一课。
auto_ptr 自 C98 提出,直到 C17 被标准抛弃。后续被 unique_ptr 代替。auto_ptr 是历史遗留问题,是 C++ 的一处败笔,当然现在也已经被摈弃。
auto_ptr 对拷贝的处理方式是:隐式转移所有权。这不好,C++ 又不是有 GC 的语言,这种隐式容易导致程序员丧失对资源生命周期的掌控。
unique_ptr 自 C++11 提出,代替 auto_ptr,有效解决隐式转移所有权导致悬空的问题。对拷贝的处理方式是:不允许隐式转移所有权,必须显式移动语句才能转移所有权。
unique_ptr 在现代编译器的优化下基本是零开销(Zero Cost)的,换言之使用 unique_ptr 不仅可以享受到编译器单一所有权检查的功能,使用开销更是与裸指针无异。
unique_ptr 有什么特性,底层实现是怎样的,是怎么保证无法赋值构造的
shared_ptr 与 weak_ptr ...
如何假装自己是 GDB 糕手
GDB 是好的,笔者偶尔使用 GDB 调试大部分时间使用 Vscode/Clion 的按钮调试也是好的,只有说你平时用GDB吗?用IDE自带的?你基础不扎实啊。的面试官是坏的。
几句牢骚:抛开少数编译和启动时间就老长的大型项目不谈,校招生常见项目运行环境用个图形化界面怎么了?图形化界面本来每个按钮就和 gdb 命令一一对应,用熟了不是半斤八两?会个 gdb attach 就高贵了?
下面笔者尝试伪装自己平时对 vim 与 GDB 爱不释手,日常工作都是在没有图像化界面的 ArchLinux 上完成的,喜欢用萌萌哒语气,twitter 账号头像是粉蓝旗。
GDB 多线程调试小连招
命令
描述
示例
info threads
查看所有线程及状态
info threads
thread <线程ID> / t <ID>
切换到目标线程
thread 3
thread apply all bt
所有线程打印堆栈(排查死锁)
thread apply all bt
set scheduler-locking on
锁定当前线程,其他线程暂停
...
OS 与 PL Mutex 之三两事
仍然是面试速记。
死锁的 408 八股
考研 408 必背八股,谁都会问,但笔者全都以举例的方式逃过去了,不过还是记一下。
死锁的四大条件与预防死锁的四大方法(一一对应)
资源互斥,最不可能取消的条件,不互斥的资源自然也不会有同步需求,各管各的就好
持有并等待,反义词是检测到死锁就回退并重新获取锁,抛开极端情况不谈(时机恰恰好到无论怎么回退,两个资源争夺方都会以相同的顺序抢夺资源然后失败),这种方式比较好实现
不可剥夺,反义词是按某种规则检测到死锁后就老杀新或者新杀老,这样能保证同一时间一定有一个任务能被推进下去,被杀死的任务自动回退即可
环路等待,反义词是保持资源申请顺序一致,比如数据库给数据加行锁,无论是给哪条数据加,都要从第一条数据开始加,然后给每条数据依次加,不如直接加个大表锁,性能肯定更好,因此实践中其实比较难保证资源申请顺序一致。当然也有 B-tree 的 crabbing 协议这样的精巧的数据结构上锁方式。这个条件是基于持有并等待与不可剥夺才能成立的条件,一般来说无论是不满足持有并等待还是不满足不可剥夺,环路等待都将不成立。
避免死锁
预防死锁是设计静态的系统规 ...
设计模式速记
笔者是从所谓 组合优于继承 的 Golang、Rust 以及 Modern C++ 学起的,因此在不知不觉中跳过了 OOP 的相当部分学习,导致笔者在 OOP 的基础几乎不如刚经过期末考的大二学生,比如 OOP 的三大特性笔者就说不上来。
设计模式作为 OOP 的良好实践,笔者在没有学习之前已经看过了不少大型项目代码,因此也许能触类旁通罢。虽然从菜鸟教程来看,设计模式有多达数十种之多,但大家都知道 CS 最会造生词以增加初学者的学习门槛,常用的设计模式不超过十种。
对于 Javaer 的普遍技术水平不能报以太多期望,笔者在此对常用设计模式归纳总结一番以防 SB 面试官偷袭。
六大原则
开闭原则(Open Closed Principle,OCP),不要想着用子类修改父类,要改就用子类继承一套然后重写方法
单⼀职责原则(Single Responsibility Principle, SRP),一个类里写所有逻辑直接梦回面向过程
⾥⽒替换原则(Liskov Substitution Principle,LSP),保守的鸭子类型思想
依赖倒置原则(Dependency Inversio ...
操作系统串记
进程间通信方式
IPC Benchmark
Method
100 Byte Messages
1 Kilo Byte Messages
Unix Signals
–broken–
–broken–
ZeroMQ (TCP)
24,901 msg/s
22,679 msg/s
Internet sockets (TCP)
70,221 msg/s
67,901 msg/s
Domain sockets
130,372 msg/s
127,582 msg/s
Pipes
162,441 msg/s
155,404 msg/s
Message Queues
232,253 msg/s
213,796 msg/s
FIFOs (named pipes)
265,823 msg/s
254,880 msg/s
Shared Memory
4,702,557 msg/s
1,659,291 msg/s
Memory-Mapped Files
5,338,860 msg/s
1,701,759 msg/s
goldsborough/ipc-b ...
分布式唯一 ID 生成算法笔记
雪花算法
格式(64bit)
1bit 不用:因为二进制中最高位是符号位,1 表示负数,0 表示正数,生成的 id 一般都是用整数,所以最高位固定为 0
41bit 时间戳:这里采用的就是当前系统的具体时间,单位为毫秒
10bit 工作机器 ID(workerId):每台机器分配一个 id,这样可以标示不同的机器,但是上限为 1024,标示一个集群某个业务最多部署的机器个数上限
12bit 序列号(自增域):表示在某一毫秒下,这个自增域最大可以分配的 bit 个数,在当前这种配置下,每一毫秒可以分配 2^12 = 4096 个数据
特点
全局唯一性:雪花算法可以保证集群系统的 ID 全局唯一
趋势递增:由于强依赖时间戳,所以整体趋势会随着时间递增
单调递增(×):不满足单调递增,在不考虑时间回拨的情况下,虽然在单机中可以保持单调递增,但在分布式集群中无法做到单调递增,只能保证总体趋势递增
信息安全指的是 ID 生成不规则,无法猜测下一个
时间回拨
简单说就是时间被调整回到了之前的时间,由于雪花算法重度依赖机器的当前时间,所以一旦发生时间回拨,将有可能导致生成的 ID ...