在2022年10月前后,有感于自己在算法上成长不大,就想转开发岗以延长职业年龄,我选了C/C++这个偏底层语言,希望能从此开始重塑自己的计算机技能。虽然自己是计算机专业出身的普通硕士,但重新把知识都捡起来是需要较长时间的。怕自己犯不专心的老毛病,特别是在现在还要带娃,时间非常宝贵,我就选了某内教育,交了三万多开始进班学习。如下是整体学习的课程表:
标C (10月31日) | Linux基础与命令、vim编辑器 | web服务器项目 (12月25日) | 项目概述与编码实现(一) |
第一个C语言程序、gcc编译器 | 编码实现(二) |
变量、数据类型 | CPP (12月29日) | 命名空间、C++数据类型 |
运算符 | 重载、缺省、哑元、内联 |
分支结构 | 动态内存分配、引用、类型转换 |
循环结构 | 类、对象、this指针、构造函数 |
数组 | string使用、缺省构造、拷贝构造 |
函数 | 类型转换构造、初始化表、析构、深拷贝 |
指针 | 静态成员、单例模式、操作符重载1 |
字符串 | 操作符重载2、继承、子类构造 |
预处理和大型程序 | 多重继承、钻石继承、虚继承 |
结构体 | 多态 |
高级指针 | 运行时类型信息 |
动态内存分配和文件操作 | 异常处理 |
数据结构和算法 (11月19日) | 栈 | IO流 |
队列 | 类型推断、类型计算、初始化列表 |
单链表 | lambda表达式、转移构造 |
双链表 | 模板起源、函数模板 |
二叉树 | 类模板、模板技巧、模板实战 |
排序和查找算法 | 类模板、模板技巧、自定义链表 |
UC (11月29日) | 环境变量与错误处理 | 向量、队列、优先队列、映射 |
静态库与动态库 | 多重映射、集合、多重集合、哈希散列 |
虚拟地址空间与内存映射 | QT框架库 (2月26日) | QT父窗口 QT信号和槽 |
文件结构 | 面向对象的QT编程、设计师、创造器的使用 |
文本读写 | QT事件机制、QT定时器事件、鼠标事件、键盘事件 |
文件锁 | 绘图事件、绘图、坐标系统和坐标变换 |
进程的创建 | 混合UI设计、主窗口、菜单栏、工具栏、状态栏 |
进程的回收1 | 基本控件 |
进程的回收2 | QListWidget、QToolButton等控件 |
信号处理 | Model/View模型1 |
信号集与信号屏蔽 | Model/View模型2 |
管道 | 对话框 |
共享内存与消息队列 | Qt sql模块 |
计算机网络基础 | 线程和线程同步 |
TCP与HTTP | 网络编程1 |
UDP | 网络编程2 |
线程 | 智能监控系统项目 (3月18日) | 概要设计、详细设计、网络视频服务器搭建 |
互斥锁与条件变量 | 视频、快照抓取、opencv人脸监测 |
大项目实站 (3月19日) | 项目概述、总体架构、报文规约、数据库设计 |
宏、数据类型、报文规约 |
跟踪服务器:全局变量、缓存类、数据库访问类 |
跟踪服务器:业务服务类 |
跟踪服务器:存储服务器状态检查类、服务器类 |
ID服务器:全局变量、数据库访问类、业务服务类 |
ID服务器:构建脚本、配置文件、建表脚本 |
存储服务器:全局变量、缓存类、数据库访问类 |
存储服务器:文件操作类、ID客户机类、业务服务类 |
存储服务器:跟踪客户机类、服务器类 |
客户机:连接类、连接池类 |
HTTP服务器:响应状态码、全局变量、业务服务类 |
测试调试:获取组列表、上传文件、下载文件、删除文件 |
媒体播放器客户机 |
媒体播放器客户机(二) |
除了最后的大项目实战外,可以发现前面的小项目基本就一两天时间,非常水。整体学完是在4月9日,期间由于春节假期等因为,延长到了5个月的时间。这一段时间,我都是在娃睡觉之后,或者娃出去玩时挤时间来学,能坚持下来算是有些不容易,最终算是顺利毕业,也为我接下来在猿某码上学习并行编程打下了基础。我是在B站学习计算机底层原理时看到的高性能计算的视频,看着这样一个底层的需要时间积累且工作又不卷的方向,我通过评论区的联系方式主动找了猿某码相关课程的员工,交了一万多开始学习并行编程,课程内容大纲如下:
一级模块名称 | 二级模块名称 | 二级模块名称 |
超算平台开发环境与基础优化技术 | 超级计算机平台简介 | 超级计算机体系结构 |
天河超算平台登录使用 |
Linux操作系统开发环境 | Linux常用命令 |
编辑器VIM/编译器GCC/工程构建工具Make/调试器GDB入门 |
超算平台任务管理系统slurm |
高性能算法 | 稀疏矩阵压缩存储格式 |
稀疏矩阵向量乘算法SpMV优化 |
基础性能分析 | 静态分析工具understand |
动态分析工具gprof |
计时函数辅助方式 |
基础性能优化 | 流水线 |
循环展开 |
循环分块 |
连续访存 |
并行编程模型简介 | 分布式并行模型-MPI |
共享内存式并行模型-OpenMP |
单指令多数据并行模型-SIMD |
MPI | MPI基本概念 | 进程与MPI程序基本编程方式、编译、运行 |
MPI四个基本接口 |
并行模式 |
点对点通信(阻塞式) | 发送MPI_Send与接收MPI_Recv |
消息标签tag及MPI_ANY_TAG和MPI_ANY_SOURCE |
jacobi并行化-阻塞消息通信版本 |
组织进程通信避免死锁 |
接口MPI_Sendrecv |
jacobi并行化-基于捆绑消息发送接收版本 |
点对点通信(非阻塞式) | 接口MPI_Isend与MPI_Irecv |
非阻塞通信的等候与检测 |
jacobi并行化-非阻塞消息通信版本 |
重复非阻塞通信 |
jacobi并行化-重复非阻塞消息通信版本 |
集合通信 | 广播bcast |
分散scatter |
收集gather |
规约reduce |
全互换alltoall |
路障barrier |
通信模式和虚拟进程拓扑 | 四类通信模式 |
虚拟进程拓扑 |
OpenMP | OpenMP基本概念 | 线程概念 |
OpenMP基本编程方式、编译、运行 |
OpenMP并行程序基础设计 | openMP并行域与指令parallel |
变量作用域与私有、共享属性 |
线程竞争、临界区和指令critical |
OpenMP的循环体for结构 | 循环迭代并行和指令for |
循环调度策略与子句schedule |
变量作用域属性与子句private、shared、default |
变量规约属性与子句reduction |
嵌套循环与子句collapse |
OpenMP的分段section与task结构 | 代码段并行和指令section |
任务池并行和指令task |
OpenMP的其他指令 | 单线程指令single、master |
路障指令barrier |
原子指令atomic |
缓存一致性 | 缓存、缓存一致性与伪共享 |
SIMD | SIMD基本概念及编程入门 | SIMD与向量化概念 |
程序向量化思路与编程基础方式 |
向量寄存器、ARM架构与NEON |
自动向量化 | 编译选项自动向量化 |
编译指导语句自动向量化 |
NEON-intrinsic指令集(命名规则及存取操作) | intrinsic的向量数据类型和函数命名规范 |
向量寄存器初始化函数 |
交叉存取技术-以RGB转换为例 |
存储、加载操作函数 |
NEON-intrinsic指令集(算术、比较、逻辑及其他操作) | 算术操作函数 |
比较操作函数 |
逻辑操作函数 |
其他操作函数 |
SVE指令集简介(选修) | Z、P寄存器 |
命名规则及常见intrinsic函数 |
聚集加载和分散存储 |
《CPU并行程序性能优化》课程大纲
我从3月28日左右开始学习,6月4日模拟考试,6月11日正式考试。无论是模拟考试,还是正式考试,都给定6小时的时间进行编程,应该说比上面某内的毕业选择题考试的含金量高了N倍。通过各种项目的锻炼,可以明确地了解到计算机对科学家的作用。
培训班的优缺点
培养习惯
连续两段培训课程的时间超过7个月,长时间地学习确实培养了我一些好习惯:一是学习的习惯,由之前带娃“躺”过渡到“卷”学习的状态。每天睡觉前不学习下就有点难受。二是记笔记的习惯,培训课程的视频不可能一直存着,也不可能花时间重新看来复习,所以重要的知识点要记录。三是定期复习,大脑是懒惰的,重要的知识点要记在脑子里,能不费力地拿出来用,才能在这之上进一步思考。
教学方式守旧
现在的培训还是通过直播的形式来教授计算机知识,是我觉得不应该的。事实上,我基本是先看讲义,有不懂的地方,直接看对应的回放,学习的效率比直播高出不少。其它同学老老实实地听三小时,我三小时不仅学完了知识点,还动手实践巩固了知识。此外,培训的时间安排也有问题,周一、周三、周五和周六晚上,周日上午和下午,这样的安排使得周五、周六、周日和周一连续学习,几乎没多少时间复习。
不包就业
很多培训班会开课前或教授前给学员们看一些就业的案例,增强学员的信心。我个人认为不能对号入座,因为一个培训机构培训了这么多人,总是能有几个好苗子,但更多的人可能是原地踏步,甚至是无法毕业。就目前我接触到的培训内容来看,主要是强调操作性质,原理等更深入的知识较少涉及。某内的就业推荐基本是外包,但看岗位要求就会发现,只要是计算机毕业的,你在B站自学都能进,根本就不需要来培训。达某内的培训说到底是更适合非IT专业转行的人。猿某码的就业推荐会稍微靠谱那么一些,但也是需要多试试,但也不包就业。这里提一下的是,培训时做的项目能当作工作经历么?可以但要深入理解项目,稍微仔细一点的面试官都会问一些细节,答不上来反而是减分项。
小结
如何判断一门培训课程是否适合自己?最简单的就是通过课程表的知识点比对招聘岗位描述,如果基本能覆盖,才可能在学完时应聘成功,当然也只是可能,千万不要被培训机构的热情的小姐姐忽悠了。计算机知识非常广阔又艰深还强调操作性,是需要终生学习的专业,培训课程可能只是一个开始。
原文章发布于2023年7月27日