27届_落花随雨
技术栈测试(C++版)
**1、C 语言看的哪个资料?:学校学的,没看过别的资料
- 指针懂吗?知道什么是地址吗?都知道
-
懂内存分配吗?了解
- 结构体是否学过?学过
**2、C++看的哪个资料?C++PrimerPlus,深度探索C++对象模型,STL源码剖析
- 继承,重写,多态懂吗?都了解
-
STL这些容器学过了不?大致底层实现懂不?用的还算熟练,底层就只了解,没写过代码
- 智能指针了解吗?只了解,不知道咋实现的
**3、数据结构与算法看的哪个资料:代码随想录
- 链表,栈,队列,二叉树能自己手写吗:可以
- 堆,AVL树,红黑树学过吗:只学过,没自己实现过
- 冒泡,快速,归并排序能手写吗:可以
- 递归,二分,贪心,回溯,动规这几种算法学过哪几种:四种
- LeetCode 大概刷了多少题:200多道
4、计算机网络与操作系统看过哪些书籍:操作系统导论(刚入门)计算机网络自顶向下(基本忘没了)
- HTTP、TCP、IP、ICMP、UDP、DNS、ARP这些协议了解过吗:
- HTTPS安全相关的:数字签名、数字证书、TLS了解过吗?
- 进程线程通信机制了解吗?
- 内存管理了解吗?比如置换算法啥的:
5、网络编程了解吗?看过哪些资料?
- IO模型懂吗,阻塞非阻塞,同步异步这些概念懂吗?:
- IO 复用机制:epoll、select、poll懂吗?:
6、MySQL与Redis看过哪些资料?:
- sql 熟练吗:
- 索引底层原理懂吗:
- 锁和事务了解吗?幻读了解吗?
- redis主从,集群了解过吗?
7、C++/Linux项目做过哪些?:
8、其他你们自己补充:
图形学的话看过虎书,跟着LearnOpenGL做过小的渲染器
做过一个基于组件模型的2d小游戏
学习规划(2025.1.14)
一些链接入口
课程大纲: 所有课程大纲入口
你的大致情况分析与规划
你C++和算法基础还是很不错,总体已经强过很多人了,接下来只需要补充下网络编程的知识,做点网络编程的项目,然后补充了数据库这些知识,那么C++开发层面就差不多了,考虑到你也要学习游戏开发,那么可以补充一些引擎的知识,然后做个简单的游戏项目,就可以的了。你暑假实习或者秋招,两种岗位都可以投递的了。
所以呢,接下来我们主要补充 网络编程知识 + Linux系统编程知识 + 算法 + 项目 + 中间件的知识,这块学的差不多了,再来补充分布式高并发的一些知识。
目标:冲年明年暑假中大厂实习了。
具体安排(第一阶段)
现在主要以八股文+项目 + 算法为主,具体如下
1、做个项目入门网络编程:项目需要做两个,入门看看牛客网这个web服务器就行:C++网络编程入门与实战,注意,这个教程主要是用来入门各种知识,以后可能不写进简历。
做完了第一个项目,做第二个项目,第二个项目有点大,可以说是第一个项目的升级版,会用到比较多的技术栈,是我们以后面试的重点:0. C++工业气象台实战项目说明
时间:第一个入门 10 天,第二个15天。
2、深入理解C++:C++ 的话,你其实掌握的挺不错的,看过几本书,就不知道你具体掌握的如何,这块你想继续学也可以,不学后面直接看面经也可以,当然,如果你想看视频的话,就看下侯捷讲的超经典视频:百度云下载 提取码: 61l6
时间推荐:不用马上看,兴致来了看即可。
3、算法:你算法刷过200多道题,应该挺不错啦,目标就是搞定这个高频题库:算法高频题库,一般需要刷两三遍。
时间推荐:每周刷15+道。保证里面的题会做即可。
4、网络 + 数据库 + Redis:八股文除了语言层面,其他就是网络+数据库 + Redis,所以咱们需要先学习
(1)、计算机网络:推荐看一下这篇文章:如果让你来设计网络(必看),如果看不懂,以后再来看一次,这是我看过写的最好的文章了。你也可以二刷自顶向下这本书。
之后的话,直接参考面试来学习即可,你学习网络编程也会持续复习到。
(2)数据库:这是非常重点,看 MySQL原理剖析课程说明 就行,有点难度,不过里面也提供了视频版本的入门哦,主要看我标🌟的那些。
(3)Redis:C++很多项目都没有设计redis,所以redis学习会比较尴尬,没有应用过,可以先去刷《redis开发与运维》:《Redis开发与运维》怎么看 + 重点章节,对应的电子书这里下载:书籍推荐。之后再看深入学习的专栏。
时间安排:(1)+(2)可以先学,(3)晚点学,因为这块你用的少,容易忘记,可以你感兴趣的时候学习。
5、八股文复习:八股文是我们的核心,不过你其实很多都学过了,咱们先快速复习下核心的吧,之后有时间在系统学习下。
(1)C++:目前C++八股文可以先看下这里的:https://www.iamshuaidi.com/mianshi 关于C++部分的,后续会整理一些突击的版本。
(2)mysql+redis+计算机基础部分:先跟着 八股文高频题库(必看) 进行第一轮复习,里面有Java的,别理即可,之后按 面试突击专题学习指南(必看) 进行第二轮复习,Java的不理即可。
时间:20天。
学习顺序
你先把C++开发技术栈,中大厂基本必考的内容过一下吧,后面再做个游戏,可能你还需要再学习一下C#,不过按照我往届学员的经验,你学了这些+有图形学的只是,也是可以直接找游戏实习岗位滴。
可以先学 1 + 4,同时学,然后算法的话,每周有空刷一刷,保持手感,至于2,也可以晚点学,最后学完5,就可以去面中大厂了。
先给你安排这么多,然后记得来每周打卡学习进度哈,比如像他们这样:23与22届做的比较好的成员示例,
有什么问题记得随时私聊帅地
每周学习进度
2025.1.14-2024.1.19
一,Linux基本IO,基本标识符文件描述符fd,运用fd的函数open(),write(),close(),获取文件状态的stat(),重定位文件读写指针lseek()(还可以扩展文件,获取文件长度),重置文件描述符对应的文件dub(),文件多功能操作fcntl()。
目录操作函数,mkdir(),chdir(),opendir()。
二,Linux进程知识,不同进程有不同的虚拟内存空间(分用户区域和内核区域),父进程可以派生出子进程,子进程结束时必须由父进程回收占用的资源,若父进程因为某些原因被占用,无法回收子进程,会导致子进程变成僵尸进程
三,Linux进程操作函数:从当前进程派生子进程fork(),更改子进程运行的函数exa(),让父进程等待子进程结束wait()
四,Linux进程之间通信方式:
1管道,只能用于有公共祖先的进程
有名管道,可以在任意两个管道中使用,可以用读写文件的那一系列函数操作,但是读写顺序必须遵守先进先出(FIFO),所以不能用lseek调整读写位置
2内存映射,将磁盘里存储的文件映射到内存里,修改内存就能修改文件
3信号,有未决信号集,阻塞信号集共同决定进程能收到的信号
4共享内存,进程之间共同占用一块虚拟内存
五,Linux多线程
这块内容之前看过C++并发编程(没看明白,看一半就放弃了),操作系统导论(看明白了,但是没记住),这回又复习了一遍,但是还是感觉很模糊,不会写并发的代码
2025.1.20-2025.1.26
linux系统IO多路复用:select,poll,epoll
select和poll差不多,都需要把所有要监控的文件从内核态传回用户态,再由用户自己便历所有文件,查看那个文件准备好了。poll比select好的地方在于它自定义的结构体有event和revent,把初态和现态分开。而select是用数组存储,初态和现态都在一个位里,每次用完都要重置。
epoll只把准备好的文件描述符穿回用户态,不用用户再便历,直接能使用。epoll有两种工作模式ET(边沿触发)在文件状态有变化时才会通知进程,LT(水平触发),只要有文件准备好了但还未处理就会一直向进程发消息。
速通了一下数据库基本概念
索引,底层一般用B+树实现。分为主键索引B+树里直接存一行的所有数据,和二级索引存主键值
事务,事务隔离级别:读未提交,读提交,可重复读,串行化。
日志:binlog,redolog两个日志的不同 ,两阶段提交
2025.1.27-2025.2.2
继续看数据库
MySQL有三种锁,全局锁,表锁,行锁。
InnoDB对三种锁都支持,因此多并发性能很好。实际上在事务运行的时候,InnoDB对搜索范围里的索引会逐行添加next-key lock(是一种间隙锁和行锁的复合体),再遇到唯一索引等条件时,就会退化为行锁或间隙锁。
日志的两阶段提交具体指的是redo log写入分为prepare阶段和commit阶段,这么做是为了保证redo log和binlog一致。
执行join语句是驱动表全表遍历,而被驱动表可以用上索引。想要提升join的性能,可以尽量用小表做驱动表,或者使用临时表。
自增主键不一定是连续的,当出现唯一键冲突,事务回滚,批量插入时都会出现主键不连续的问题。
做C++气象台项目
多进程管理:1调度进程:周期性启动其他进程,2守护进程:检查所有运行的进程是否有心跳,没有就将其杀死 3进程心跳:防止其被其他进程杀死
文件传输:FTP虽然简陋,但很适用于项目内部传输数据
数据管理:数据抽取,数据入库,数据同步(分批,不分批,增量同步)
一点小感想:相对于我以前做的项目而言,这个项目就很不面对对象(想起我在课设答辩上和我们老师辩论多态的恐怖回忆了),而且由于是用多进程,所以直接用栈空间,也不用考虑什么内存泄露
2025.2.2-2025.2.9
一,复习(重新学习)了一下网络安全基本知识:
1,加密方法大方向上分非对称加密和对称加密,非对称加密里有一个非常著名的RAS加密,RAS加密一方有公钥,一方有私钥,先用公钥加密传输,再用私钥解密。这种算法需要用模除所以比较费时,所以可以用RAS加密一个对称密钥,用这个对称密钥加密报文。
2,数字签名,用私钥加密报文,传输后用公钥解开报文。因为私钥和公钥的对应性,就能验证该报文的发出者的身份。
3数字证书,由认证中心(CA)颁发的将身份和公钥绑定起来的证书,也可以核验报文发出者的身份。
4,MAC(报文鉴别码),用来验证报文完整性的。是用散列函数由 报文和 只由双方知道的鉴别密钥 内容计算来的。他和报文一起传输,接收方用散列函数计算报文内容,和这个收到的报文鉴别码对比。
ssl协议,建立在tcp协议上的有加密,验证发送者身份,验证报文完整性的协议。https协议也主要使用这个协议。
二,路由算法
1,基本思想主要有两种:链路状态算法(先得出路由器的总体状态,再算最短路径),距离向量算法
2,ICMP协议,在其上的协议有ping,Traceroute
三,http协议
速通了一下《图解HTTP协议》,看了一下常见http请求方法,http状态码,http报文首部字段。
四,尝试自己写了一个简单web服务器,生产消费模型
最后还是没写出来,看答案了。
2025.2.10-2.16
一,速通redis
redis基本数据类型:string,set,sortset,list,hash。每种类型都有两种内部编码,应对数据量大小不同的情况。
redis持久化:给数据做快照RDB,存储每条命令的AOF。都是子进程写入的,很少影响父进程工作。为了缩小文件大小,AOF有重写机制
redis集群:一主多从,主库写数据,从库只读。第一次建立时,从库主动连接主库,从库清空数据接收主库发来的RDB,之后做增量同步。若主库崩溃,则由哨兵集群找出能够胜任主库任务的从库。
redis缓存:缓存雪崩:突然大量缓存过期或者缓存实例崩溃,可以限制服务请求,或者建立redis缓存集群。缓存击穿:访问非常频繁的热点数据过期,可以不给热点数据设立过期数据。缓存穿透:访问数据库和缓存中都不存在的数据,可以让数据库返回缺省值或者设置布隆过滤器
redis事务的ACID:一致性,隔离性,原子性都能基本实现,但是无法保证持久性
redis分布式:redis本身提供原子操作(我理解大该类似一种乐观锁),也可以用redlock实现可靠的分布式锁
二,尝试深入理解linux
看了一本实现linux操作的书(略过其中写代码的部分,但是理论也挺难的)
分段:CPU硬件决定的(有这个寄存器的计算流程),但是要由操作系统维护全局段描述符表
分页:为了提高内存碎片的的利用率(和利用磁盘扩大内存),又提出了虚拟内存,由页目录表和页表维护。制造了每个进程享用独立的地址空间的假象
进程和线程:进程=线程+资源。
中断:分硬中断和软中断(操作系统就是建立在中断上的)
2025.3.3-2025.3.9
学Qt(要是我上学期做课设的时候看到这个教程就好了,那课设就不会做的那么费劲)
1,Qt基础控件:pushButton(按钮),lineEidt(输入文本框),布局管理器,分割器
2,信号槽:信号可以connect到另一个信号上,connect三种方式,宏,函数指针,Lambda表达式。函数指针最常用,但是如果有重载函数就得用宏。
3,怎么切换登录窗口和主窗口:Qt里自带的QDialog的exec函数能够设置模态窗口(不会被覆盖的窗口),并发出信号accept和reject,将这两种信号绑定到槽函数上就可以实现登录成功和登录失败。
看Redis设计与实现:
1,字符串(SDS):在C字符串基础上多分配了空余空间以减少溢出,定义了C字符串本来就有的一些功能。
2,链表:双向链表,list结构含有一个指向链表头的指针和链表尾的指针
3,字典:dict含有两个哈希表,当扩展和收缩时,就把一个表中的键值对分批移到另一个表中(在对字典的数据进行操作的时候移动数据)。用开链法解决哈希冲突。
4,跳跃表:节点的层高是1至32的随机数,节点的分值相同时,按成员对象的大小排序
5,整数集合:就是数组,由于各个节点是连续存储的所以只能升级(扩大每个节点的存储空间),不能降级。
6,压缩链表(ziplist):其实也是数组,但由于每个节点的长度不同,所以每个节点要存储前一个节点的长度和本节点的长度。扩大某一个节点的长度时会波及后一个节点,被称为连锁更新。
7,对象对应的存储类型:
(1)字符串可以是int,raw(SDS),embstr(短字符)
(2)链表可以是linkedlist,ziplist
(3)哈希hashtable(底层用dict字典),ziplist
(4)集合inset(整数集合),hashtable
(5)有序集合skiplist(跳跃表和字典),ziplist
8,Redis的过期键删除策略:采取惰性删除和定时删除,有主从库时只有主库发出命令时从库才可删除过期键
2025.3.10-2025.3.17
继续学qt(不小心把做了一半项目文件删了,又得重新做一遍)
1,qt的MVC模型:(model:存储数据的格式,view:向用户展示数据的形式,delegate:用户通过代理可以修改数据)Qt中有model作用的类主要就是QStandardItemModel,有view作用的有QAbstractItemView。
2,qt连接数据库:打开数据库就用QsqlDatabase,执行SQL就用QSqlQuery
3,qt对象模型:qt的单例模式写法,用QSignalMapper管理信号槽,动态增删类的属性
2025.3.18-2025.3.24
学qt(企业级对象存储浏览器)
腾讯云对象存储的SDK的C++接口(底层是用HTTP报文传送数据)
实现创建存储桶,删除存储桶,查找存储桶位置
在存储桶里创建对象,删除对象,异步上传下载对象
2025.3.25-2025.3.31
这周一直在做数据结构课设,学了个什么蒙特卡洛搜索。
看了游戏引擎的知识
2025.4.1-2025.4.7
qt项目做完了,感觉除了qt的基本知识外,还学到了软件开发的基本知识。
qt的一些高级用法还是没太掌握,感觉只是跟着视频敲代码,没啥思考的感觉
2025.4.8-2025.4.14
复习(再学一遍)图形学,MVP矩阵,渲染管线,blinn-phong模型