小米训练营攻略
该训练营全名为小米集团就业实践训练营
,应该是面向华东地区高校的计算机专业的学生。
训练营作业仓库已上线:XiaoMiHWRepo
我们大概有 250+人参加,最终大约 40 人战到最后。很多人在第一周退出或被筛掉。
准备工作
分组
总分为两大组,每个大组会分小组,每小组配备一个班主任。班主任和讲师都是小米员工,有什么问题直接问,可以找他们聊天,提前一步了解小米的工作生活。
- C++:重点实现后台逻辑实现,主要培训内容有
多线程
,交叉编译
,操作系统
等。 - Android:重点写一个安卓 app。最后要实现一个类微博的 app。
选择 C++方向的可以完全跟着我的教程,安卓可参考。
其实,最终内容都是归于安卓,C++组
大作业是给你一个写好页面和接口的 app,你需要使用JNI+Cpp
实现相关功能。安卓组
是需要独立开发一个类微博 app,包括界面和功能,小米会提供他们自己的类微博 API。
下面主要说C++
组的准备工作。
虚拟机
小米会提供他们的配置好的虚拟机,需要使用Virtual Box
,VM
不能正常识别。后面内容一定会使用这个虚拟机,而且很多内容是配好的,尽量不要使用自己的。
安卓组不需要虚拟机,只需要Android Studio
。
使用软件(本机)
IDE
两组都会使用到Android Studio
,提前下好在本机,不要下在虚拟机。
C++组可以先配置VSCode
,把编译器配好,至少能运行c++11
。如果习惯 Clion 或者 VS 也可以。
版本管理(居然好多人都不会)
Git
必装,最好会使用GitHub
,小米会使用GitLab
来管理作业。操作是一样的。
至少熟练上传命令。如果你都熟练,那么第一天早上内容你已经掌握。
1 | git add . |
小米老师可能会要求在虚拟机内创建仓库,没有必要,直接在本机就可以。
编译器
最好本机和虚拟机都装三大编译器g++
、llvm
和clang
。
小但必要
markdown
语法必学,写得好的README
非常加分。- 记得做的内容截图,增加你的可信度,老师不一定有时间运行所有人的代码,所以一定要写好
README
。 - 提前了解
(c)makefile
。 - 提前了解线程
std::thread
,不管最后大作业是否和我们相同,但一定会用到线程。
思想准备
我认为既然有这个机会,就尽量把他搞完,不管最后有没有 offer,就当这是一个项目需要完成。
既然都看到这里,告诉大家:
- 完成并结课一个月后,通过的同学发的是正式 offer,在你毕业后会和你签三方。
大三的实习可去可不去,不影响正式 offer。实习也是要筛选人去的,不是报名就能去。
如果不喜欢小米、不想工作、有其他安排,可以在第一星期结束后离开。
有关于课程问题可以问我,仅邮箱memechs33@outlook.com
概况
下面我们跟随列表走完这 14 天
Day | Course | 备注 |
---|---|---|
Day01 | 虚拟机,git 操作 | ✅ |
Day02 | cpp 基础,类操作 | ✅ |
Day03 | 指针,数组,I/O | ✅ |
Day04 | STL | ✅ |
Day05 | 线程 | ✅ |
Day06 | 网络 | 🛠️ |
Day07 | Android | ✅ |
Day08 | OS | 🛠️ |
Day09 | 性能优化 | ✅ |
Day10 | 编译 | 🛠️ |
Day11 | FFmpeg 编译 | ✅ |
Day12 | 无 | 🥰 |
Day13 | BigHW(编译 ff 的 so 库,保存本地视频为 yuv) | 🤡 |
Day14 | BigHW(实现播放/暂停视频,播放音频) | 🤡 |
Day15 | BigHW | 🥳 |
小米讲师会提问,回答问题可得记分牌,每节课后会计分,分高能得礼物。
这个分数不作为最终评价。
Day01
Git
配置、小米仓库(GitLab)配置makefile
编译gdb
调试
给班主任最容易留下好印象的就是第一天,很多人会配一天的Git
,当你熟练使用Git
,并且完美提交仓库,老师可能会根据你的目录结构风格让大家都参考你的。
特别一题的是 README 和截图,一定要让班主任很容易就看到你的思路和结果,前面就说到,班主任、讲师都是员工,他们也是打工仔,每天上课工作都比较累,可能都不会细看你的代码,所以,写好 README 和提供截图,能让你在第一天就脱颖而出。当然后面也要天天写 README。
然后关于作业部分,需要你早点准备好编译环境,想我在上文提及的编译器,请准备好,在本机和虚拟机(小米提供的会配好)都要配置,Windows 环境下编译可能不太方便,可以先自己搞个Ubuntu
来试一下,当然,像博主我双持 Win 和 Mac,前期的一些编译,我直接交给 Mac 做,只是后面交叉编译对环境和 CPU 有要求,我才启用 Win 游戏本。
第一天总体非常轻松。
Day02/03/04
这几天都是有关
C++
基本操作,不必理会。
如果很熟练了,我建议你用这几天时间,把后面的std::thread
好好学一下,这是整个训练营的重点,这个不管是训练营还是工作还是项目,线程管理都非常重要。
然后推荐了解一下Morden C++
,了解一下C++17,C++20
新标准,我们这组的班主任就很看重这点,以后工作也可能用上。但是Android
最高只支持到C++17
(NDK15)(2024.5),后续可能会支持更新标准。
前面几天都会非常轻松。
Day05
正式开始学习
std::thread
,请认真学习这部分内容。
RAII
:资源获取即初始化,使用thread
构造初始化线程,阻塞线程mutex
互斥锁- 子线程,
std::future
,std::future
,std::promise
等操作
这是整个训练营中最重要的课,老师可能讲的会比较浅。如有不懂,问老师或速查文档、GPT。要在这节课训练手写线程代码的实现。
线程管理是现在非常重要的项目,在后端,测试端,甚至机器学习类的工作中都一定会遇到相关问题。
Day06
学习网络编程相关操作,这块要看老师安排,可能会要求在训练营最后实现。
这算是第二重要的内容,基本上 C++方向的工作都要和网络打交道。也要训练这类代码,但是我们最后并未要求实现网络内容。
Day07
这天的内容直接和大作业挂钩,必须认真跟着操作最后的动态链接库的部分。
Android Studio
相关操作- ❗ 交叉编译 重点
JNI
我们学校是开的有 Android 课程,所以基本操作我们都会,如果你并没学过Android Studio
,请你认真学习这一天的所有内容。
交叉编译一定要好好搞,自己亲自在虚拟机中编译,建议不要用自己的系统。学一学怎么写shell批处理脚本
。
JNI
可以多了解一下,反正最后也要用到,在大作业的答辩里,我的班主任问了我JNI
的作用性质等问题。
第一周结束
在第七天,也就是安卓课下课的时候,负责人会发一个问卷,主要是了解你的就业意向,如果你认为小米工作很适合你,或者你有其他安排但你也想继续完成的,请你所有都填想就业
有关的,如果不想玩了,想放个 7 天小长假,直接就填其他的就好了。但是不要侥幸,不要么棱两可,有同学又填就业又填考研的,直接被刷下来了。
Day08
有关操作系统的内容,课上老师应该会带大家编译 Linux0.1 版本。作业可能让你重写内核,当时我们没人做出来。
在这天老登就要开始给你上强度了,前面听老师讲操作系统历史还挺好玩的,后面开始让你改内核代码,就开始爽起来了。
Day09
今天主要玩玩性能优化工具和一些网络工具,后期最轻松的一天。
没什么说的,好好玩下这些工具。
Day10
学习编译工具,写 makefile 和 cmakefile。
留意一下cmakefile
,后面编译大作业使用到JNI
也是要写滴。多编译几个项目试下。
Day11
今天要开始起飞了,开始介绍 FFmpeg。
好好学,对大作业很有帮助。锻炼使用 FF 的 API。从现在开始,你可能会遇到全班一起陷入无法运行的情况,加油,希望你是第一个跑起来的。
Day12-Day14
最折磨人的来了。
- 将
FFmpeg4
交叉编译成一个独立的动态链接库。- 不用写
Java
和xml
任何安卓代码,小米会给你一个写好的简陋的框架。- 使用
JNI
,这里有个大坑。- 编写你的
C++
代码。请不要吝啬你的才华,注意安卓支持的 C++版本哦,别太新了
Day12
这一天基本上都在搞编译,尝试自己去写下shell
脚本,我们整个组基本到第 13 天下才差不多全员编译通过,这时候你都没多少时间去搞真正的代码了。
Tips:不要一味去复制粘贴别人的脚本代码,修改并尝试自己搞通。
Day13
如果你到了第 13 天都还没编译好,我这里还有小秘籍,请你自行寻找,找到了记得点个:heart:。
代码部分我就爱莫能助了,请你自己去写吧,我的实现并不完整而且可能有很多 bug,我自己复盘下来,我觉得应该这样优化更好:
- 可以引入线程库管理线程
- 将
Player
封装成类,没封装的看得很难受 - 先搞视频操作,再搞音频
Day14
在晚上 8 点前提交你的代码。恭喜你!这天晚上会有一个小答辩,给你的班主任描述你的项目,他会给你这 2 周来的作业打分,像我的大作业虽然很多都没实现,但是前面小作业拿了很多分,有可能老师还会问你一些八股文,可以提前准备一下。(像个小面试,但是没有那么紧张)
小面试可能涉及到的问题
1 | TCP/UDP |
完结撒花
希望大家多多赞赏 。🤩