技术分享
🚚知识星球摘录
00 min
Jul 2, 2021
Oct 17, 2023
type
status
date
slug
summary
tags
category
icon
password
文档密码
  • C++:dmsxlwb0624
  • 八股:dmsxlmt0934
  • GO:wrtsf871
  • FrontEnd:dmsxlqd437
  • NowCoder:dmsxlluntan00
资源
  1. 代码随想录 https://www.aliyundrive.com/s/x4V89htQgcB 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。
  1. 星球里经常有一些录友在询问有没有数据分析类的学习路线,但是数据分析这个岗位的工作内容比较杂,因此也没有整理出好的学习路线来,但是我找了一份课程分享给大家,可以按照这个课程来学习。 链接:
    1. 提取码: b8yk
  1. C++:
    1. 链接:
      提取码: 2w6p --来自百度网盘超级会员v6的分享 ps: 资料来源于网络,仅供学习使用,请勿商用。
  1. 【超级会员V3】通过百度网盘分享的文件:2024年王道计… 链接:https://pan.baidu.com/s/1sQxyZtkl9wkwiAMgwbz6zA?pw...  提取码:f14o 复制这段内容打开「百度网盘APP 即可获取」

学习路线

 
嵌入式经验分享
抱歉拖了很久。:(
嵌入式软件主要分两个大方向吧,一个是以arm、dsp为主的纯软件方向另一个是以FPGA为主的稍微偏硬件的方向。FPGA和IC行业有关,即使不去IC可以去做图像识别和通信,今年薪资普遍较高。以arm、dsp为主的软件方向又可以细分做linux驱动、汽车电子、图像、电机控制。

编程语言

编程语言以C为主,会C++更好,但是C语言要非常牢固,尤其对指针要有比较深入的理解,这里推荐一个视频。
https://www.bilibili.com/video/BV1oq4y117Yb?share_source=copy_web
这里出几道题,检验以下C语言功底。有些就是面试真题。
1.写一个尽可能优秀的MAX宏
2.int a[10][10] &a+1 和a+1是否相同
3.举例一个使用指向指针的指针俗称的二级指针的场合(void **)
4.int (*p)(void (*)(void *),int**);解释这个指针的含义
5. #define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
6.#define BUILD_BUG(x) (sizeof(struct {int:-!!((x))};)) 解释这两个宏
7.如何在C语言中实现接口?

基础

我认为嵌入式的两门基础课程就是计算机组成原理和操作系统
计算机组成原理建议学习CMU的CSAPP
https://www.bilibili.com/video/BV1iW411d7hd?share_source=copy_web
操作系统可以学习南京大学的操作系统概述也可以学习MIT的6.S081
https://www.bilibili.com/video/BV1Cm4y1d7Ur?share_source=copy_web
这两门如果学有余力可以学一下这一门数字系统设计和计算机体系结构
https://www.bilibili.com/video/BV1J54y1o7R5?share_source=copy_web

项目

我的简历项目一个来自于实验室的项目另一个是我学习mit的6.S081写过的实验lab.学习的时候建议大家多敲代码,csapp和6.S081的lab都可以写到简历上,含金量非常的高,面试官非常喜欢问其中的细节,我在华为和大疆的面试中就多次被问到相关的知识。如果真的想转这行的话建议买个开发板,如果时间财力都充裕的话可以买个ZYNQ开发板。既可以学arm又可以学FPGA。

方向

嵌入式包含的领域实在太庞大了,我仅谈一下我秋招面试过的方向。
1.芯片公司的嵌入式软件
这个主要做芯片配套的驱动开发和操作系统移植,所以招聘上要求有一些驱动开发经验,对计算机基础知识和linux要求比较高,
2.消费电子
活比较杂,有做配套驱动的,也有做SDK开发的,还有图像处理的。大疆嵌入式工程师就包含以上方向。
3.汽车电子
我投的方向和控制有关,这个方向有开发智能座舱的,有地盘控制的。今年比亚迪大批量打包控制和计算机就有开发智能座舱这个方向,我面过的博世就是开发车身控制软件。

学习路线

C语言+CSAPP+大概了解操作系统----->买块开发板玩一玩,尝试移植bootloader和linux操作系统,----------------------->根据感兴趣的方向深化,尝试做一做开源的项目。
C语言做到写出来CSAPP的cache实验和malloc实验就可以,刷题建议刷个leetcode热门100题足够,熟悉基本的数据结构和算法。卡哥的代码随想录刷完足够应付笔试,笔试主要是通讯协议、计组、C/C++、操作系统、计网。面试比较看重项目经验。

总结

嵌入式最好有实验室的项目做支撑,适合机械/自动化/通信有原来的专业经验然后加上一定的计算机专业知识。我本人的实力和眼界也有限,对嵌入式也能说管中窥豹,希望能帮到大家。有问题可以留言或者私信问我,一定知无不言。
运维学习路线
notion image
爱读书的二丙子2023年09月18日 12:07
网上资料良莠不齐,请认真辨别。

Linux

首先要学会使用Linux, 因为国内大部分公司使用的服务器就是 Linux
【Linux教程开源仓库,2.4kstar】https://github.com/dunwu/linux-tutorial
要掌握以下内容:
  1. 系统的安装和目录、文件使用
  1. 常见的linux命令
  1. 系统的用户和权限管理
  1. 系统的磁盘管理和进程管理
  1. 软件安装包管理工具
此外要对网络有一些认识:
  1. 网络的TCP/IP协议 -> 使用抓包工具分析
  1. 网络设备的配置 路由器、交换机、防火墙

Shell脚本编写

在学会linux命令之后,学习shell脚本的编写,可以简化运维的操作。
【Linux Shell脚本编程最全教程】 https://www.bilibili.com/video/BV1xW4y1Y7UV/?share_source=copy_web&vd_source=9bb0aa9c2c3cc1b12ca6f343a55b4e80
【shell 编程案例】 https://www.bilibili.com/video/BV1G5411b7oU/?p=32&share_source=copy_web&vd_source=9bb0aa9c2c3cc1b12ca6f343a55b4e80

常用服务

然后,要学会常见软件的部署和简单使用(mysql、redis、nginx、zookeeper等)
  1. Mysql的安装、权限、配置、数据备份、主从、SQL基础语法
  1. Tomcat的安装和常用配置
  1. Nginx的安装和常见配置
  1. Redis的安装和常见配置、哨兵模式和集群模式
  1. RabbitMQ\Zookeeper等
【黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括】 https://www.bilibili.com/video/BV1Kr4y1i7ru/?share_source=copy_web&vd_source=9bb0aa9c2c3cc1b12ca6f343a55b4e80
【比啃书效果好多了!这绝对是我在B站看过最全最详细的【Nginx服务器】核心知识点全在这了!】 https://www.bilibili.com/video/BV1c3411o7Ps/?p=10&share_source=copy_web&vd_source=9bb0aa9c2c3cc1b12ca6f343a55b4e80

自动化运维

学习使用自动化运维工具如Ansible来自动化和管理服务器配置。

CI/CD

了解CI/CD流程,包括使用工具如Jenkins、GitlabCI来自动化构建、测试和部署应用程序。

监控和日志

监控和日志采集也是运维不可缺少的一项技能(Promethues、zabbix、ELK...)
  1. 监控平台(比如Zabbbix\Promethues)的搭建和使用,来监视系统性能和应用程序日志
  1. 日志的收集、分析和处理(ELK)

Docker

云原生方向还有 docker 和 kubernetes这些,以便构建、部署和管理容器化应用程序。
  1. Docker相关容器概念
  1. Docker常用命令
  1. Dockerfile语法
  1. Docker-compose基本使用

k8s

  1. k8s基础概念
  1. 集群管理工具

参考资料

运维人员的学习路线是什么样的? - 浪里说的回答 - 知乎 https://www.zhihu.com/question/391008440/answer/3126164297
算法岗学习路线
最近考完了期末,应卡哥征稿分享一下我的算法岗学习路线,以及学习资源~
一些我用过的学习资源:
机器学习/深度学习
公开课:
  • 吴恩达 Machine Learning & deep learning(入门必看,我是Andrew小粉丝hhh)
书籍
  • 统计学习方法、西瓜书(概率图PAC条件随机场什么的,很少遇到,我没看~)
  • Hands-On Machine Learning with SkLearn and TensorFlow(实践用)
  • 百面机器学习(面试前看看)
框架
数据结构与算法
卡哥写的很完整了,写几个我用过的:
  • 书:大话数据结构、算法图解
我的大致学习顺序:
  • ML/DL:吴恩达ML → 统计学习方法、西瓜书(重点巩固一下,没有太细地看) → 机器学习实战,一些杂七杂八的实践项目 → 吴恩达DL → 一些框架 → B站机器学习白板推导、百面机器学习(复习回顾)
  • 数据结构与算法:基础知识、刷题穿插进行
  • 搜广推:实习项目、《深度学习推荐系统》、论文(我对这块其实了解不多,也没看过几篇论文)
我的找实习路线(搜广推)
初创公司算法岗日常实习(大四) → 二线大厂推荐算法日常实习(研一) → 抖音推荐算法暑期实习(研二)
个人拙见,算法岗求职的话,学校好、论文等相关研究经历、相关实习经历、算法特别厉害(如ACM等),四项中占两项或以上比较稳
有算法岗的小伙伴欢迎一起多多交流呀~

C++项目

Webserver
跳表
muduo网络库
HttpServer
KV存储

简历&面试

C++简历
面试注意事项
面试问题
 
 
自动驾驶技术栈
 
字节C++校招面经
字节跳动 C++ 后端面试过程记录:
一、自我介绍
二、C++基础
三、内存
四、STL
五、操作系统
六、网络
七、项目
八、算法题
九、反问
十、面试总结
 
1.耐心读题,2.建立模型,3.选用合适的数据结构 4.在稿纸上打草稿,写伪代码,对于初学算法的coder来说,这四步应该是要有的。四步做好之后,才上机敲代码,编写测试用例进行一步步调试。
举例
比如哈夫曼树那一小节例题1.7 Entropy(poj)(http://poj.org/problem?id=1521),我们当然能选择直接建立一棵树,但是题目只要求算出编码长度,具体怎样编码的,在这道题当中完全可以不考虑,因此问题就转换成了————知道每个字符的频次就好,使用优先队列(priority_queue)轻松解决,非常巧妙。
在上述讲的“耐心读题”当中,不只是要读懂题意,也要着眼于题目所给的数据规模。着或许是一句废话,但有时贴近题意,充分利用所给的数据范围,有时就是可以利用非常简单的方法“耍流氓”来完美AC。
在二叉树这一小节的习题当中有一题5597复读(洛谷)(https://www.luogu.com.cn/problem/P5597),先必须知道本题的二叉树的是无限延展的完全二叉树,而输入的是埋有宝藏的那棵带有根节点的子树(不一定是完全二叉树),这里必须先弄明白。
  1. 笔者的见解:既然要求命令重复执行就可以挖掘到所有的宝藏,还要求命令最短,那么我们岂不是只要找到 笔者的见解:既然要求命令重复执行就可以挖掘到所有的宝藏,还要求命令最短,那么我们岂不是只要找到宝藏子树中,结构相同的子树,并求出可以完整遍历它的命令不就可以了吗?
  1. 正确的一般思路:其实这样是不对的。因为宝藏子树形态各异,其子树也千姿百态,那如果子树间根本就没有相同树呢?更何况,就算各子树形态不一样,连根节点一起将一棵棵子树提取出来,势必会发现有重叠的部分。将它们合在一块就会得到一棵新树,这棵树囊括了所有子树的结构和特点————这就是*合并树**问题。现在我们只需要在这棵新树上,找到一个可以遍历到所有节点的最短命令就可以了。
以上的关键是通读题意,接下来我们再说说充分利用题目所给数据规模。来看P1168中位数(洛谷)(https://www.luogu.com.cn/problem/P1168
包括我在内的许多coder,都是用各式数据结构来应对(我用的是链表,但最后证明这样做不行),但仔细一看本题的数据范围竟然只有1e5,因此是可以用题解区点赞数第一的题解————vector二分查找并insert插入的方法来极限AC的,毕竟本题的测试用例也不强。这样的做法本身虽然有风险,但何不是对我们的一种启示?

3.超时TLE的情况有几种?(欢迎补充)

  1. 空指针/野指针错误:以下是笔者使用链表时犯的一个错误,没有及时的给list分配存储空间,指定list的指向,导致尽管编译通过,运行却直接崩溃了。
ListNode* list;//虚拟头结点
ListNode* head=list;
ListNode* midPtr=head;
......//省略其他算法内容
list->next=nullptr;
  1. 数组下标越界:虽然已经是老生常谈的话题了,但这个在算法竞赛中反而出现得比较少,因为静态数据结构的所使用的数组,我们一般都会开得比较大(或者在题目所给最大范围的基础上加一个小常数,例如题目给定最大范围1e6,我们给数组的容量则是1e5+5)。
但值得一说的是,每当我们想要根据当前下标,预估接下来将要发生的情况时,第一步最好是先检查下标是否越界。
这里的“越界”也可以指“超出了人为划定的边界”,指针超出了一个我们人为规定无意义的边界。以静态数组手写堆为例:
const int N =1e6+5;
int tree[N];
int len=0;
......
void pop(){
tree[1]=tree[len--];
tree[len+1]=INT_MAX;
int i=1;
while(2*i<=len){//先验收下标是否合法是最稳妥的
//尽管len!=N,只要当前节点的左孩子编号(下标)超出了堆当前的长度,我们就认为是非法的,
//因为堆是完全二叉树,其对应的静态数组实现,
//编号也一定是中间不间断的,自然最后一个节点的编号就等于堆当前的长度
int son=2*i;
if(son<len&&tree[son+1]<tree[son]) son++;
if(tree[son]<tree[i]){
swap(tree[i],tree[son]);
i=son;
}else break;
}
}
  1. 数据输入读取速度过慢:刚学习完C++基本语法的coder可能会发现,很多coder读取输入数据时不使用cin,而是使用和C一样的scanf函数。明明cin更方便,这不是自找麻烦吗?其实经验老道的coder不是傻子,cin当然方便,也符合C++的风格,但是cin在读取输入数据时要根据实际读取的数据类型和要存储该数据的变量类型,自动做出识别和变换————这势必会耗费一定的时间。数据量小,察觉不到什么,但数据量来到千万、百万级别,这样的时间耗费就很明显了,甚至导致超时TLE。
而scanf函数直接由用户指定了输入数据的类型,不需要系统去做什么识别和转换,性能会好一点。
当然,一些coder为了追求更快的读取速度,连scanf也不用了,自己手写一个快读函数(用户每键入一个字符,我就做一次转换,将其转换为整数)
inline void read(int& a)
{
int s = 0, w = 1;
char ch = getchar();
while (ch < '0' || ch>'9')
{
if (ch == '-')
w = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
s = s * 10 + ch - '0';
ch = getchar();
}
a = s * w;
}//这是最常用的一个快读函数,网络上还有其他版本,但原理都是差不多的。
  1. 正常的时间复杂度没有估算好:这是很基本的问题,不多说。

4.不要害怕使用递归

我不知道是不是只有我在使用递归的时候总是心里没底,因为常常听到说递归的代价太大了,能不用就尽量不用,但性格偏保守的我可以用递归的时候也没有用递归。事实也确实是这样,递归不仅因为动态分配栈空间而耗费时间,也因为每一层未释放的递归都会持续占用栈空间————时间空间都不划算,似乎递归就只有代码易读,好写这一个好处(尽管有时也并不易读)?
但实际上,存在即合理,递归对代码的简化、对重复过程的处理是相当直观的,在处理二叉树、DFS等问题时也是最常用的手段,它给每位coder带来的便利是值得肯定的。
那么当我们面对可能发生的TLE困境时应该怎么做————我们可以试着优化自己写的递归,好好做一做剪枝,比如这题P5018 [NOIP2018 普及组] 对称二叉树(洛谷)(https://www.luogu.com.cn/problem/P5018),这是题解区dalao的一段核心代码
const int N=1e6+5;
struct BTNode
{
/*左右孩子的编号*/
int lchild_id;
int rchild_id;
int val;//当前节点的值
};
BTNode bt[N];
......
bool isSame(int nowT1,int nowT2){
if(nowT1==-1 && nowT2==-1) return true;
if(nowT1==-1 || nowT2==-1) return false;
//左右子树都有,结构相同了。现在需要当前两节点的值要相等
if(bt[nowT1].val!=bt[nowT2].val) return false;
else return (isSame(bt[nowT1].lchild_id,bt[nowT2].rchild_id) && isSame(bt[nowT1].rchild_id,bt[nowT2].lchild_id));
//只要下标nowT1,nowT2不合理,就立刻返回上一层
//合理剪枝的递归,可以避免超时的麻烦
}
再比如根据后序遍历和中序遍历构造二叉树这题,核心代码如下:
string inorder_seq;
string postorder_seq;
char Tree[1000];
Tree[1]=MakeTree(1,0,inorder_seq.size()-1,0,postorder_seq.size()-1);
......
char MakeTree(int root ,int inStart,int inEnd,int postStart,int postEnd){
if(postStart>postEnd || inStart>inEnd) return '#';
int index=INindexmap[postorder_seq[postEnd]];
int left_sub_length=index-inStart;
Tree[root*2]=MakeTree(root*2,inStart,index-1,postStart,postStart+left_sub_length-1);
Tree[root*2+1]=MakeTree(root*2+1,index+1,inEnd,postStart+left_sub_length,postEnd-1);
return postorder_seq[postEnd];
//简单,易读,且优美
}
一般说来,适合使用递归的题目,给出的时空限制也会控制在最大的递归深度和时间耗费之内。所以当你觉得某道题用递归是最佳方案的时候,大胆去用吧,记住做好剪枝和终止条件的约束就好。

5.断环为链,将原本是闭环式的数据结构舒展成一条链

这样一个环直接处理应该还是有点麻烦的,但是如果舒展成一条链就好处理了。就比如这道单调队列问题P2629 好消息,坏消息(洛谷)(https://www.luogu.com.cn/problem/P2629),使用断环为链的方法,在一根链条上处理就方便多了。以下是核心代码之一,详细的题解可以点这里https://www.luogu.com.cn/blog/28916/solution-p2629
for(int i=1;i<=n;i++){
scanf("%d", &Mes[i]);
}
//断环为链,尝试建造链
for(int i=1;i<=n-1;i++){
Mes[n+i]=Mes[i];
}
 
一些工具:
 
 
OS Lab
我简历写的项目是MIT的6.828,写了一个简易的操作系统内核,S081比828简单一些但是也算个内核开发。面试问我的话我会和和Linux综合答,比如问我怎么设计的中断处理流程,我会答我怎么做的然后linux咋处理的,我比linux缺点在哪里。算是面试技巧吧。大疆,oppo,华为都问过我项目的细节。串起来我是通过面试官问我的时候我提到我写过malloc和模拟过cache然后面试官感兴趣就会问我 嵌入式会问你内存管理,你就可以讲malloc底层实现讲malloc lab,还可以引申回答c++里面stl的分配器用的内存池技术。csapp里有的lab 比如attack和bit就不太好讲出来。你的理解没有错就是拿csapp当辅助多谈论底层的实现原理展示你技术栈的深度。
COW Lab分享
在这两天做 MIT6.S081 的 [Lab: Copy-on-Write Fork for xv6](https://pdos.csail.mit.edu/6.828/2020/labs/cow.html)的时候,我从 Robert Tappan Morris 老师身上学到了一些十分宝贵的编程经验。我觉得这是一个很好的方法,因此写下这一个总结分享。既巩固自己的理解,同时也希望能对你有所帮助~
问题:如何实现(添加)一个功能
  1. 首先确定这个功能的核心部分
  1. 从核心部分开始解决一个子功能,让这部分工作起来,并将其调试正确
  1. 在实现子功能的时候,得清楚自己所写下来的每一行代码的意思
  1. 在写代码的时候,得做尽量多的思考,对自己所认为有可能引发错误的地方加上判断,利用一些 print 手段打印出来,比如 panic
  1. 运行这一个部分,并进行调试,确保这个部分工作起来是自己想要的结果
  1. 通过上一个过程的一些 panic 信息,进行进一步的完善。
  1. 在此就将问题推向了下一个过程,循环1,2,3,直到与测试(期待)结果一致,这样我们就实现了一个完整的功能(lab)
ps:在测试没通过的时候,可以查看测试代码,快速知道测试的目的,从而进行调整。
经验来源
能得到这个经验,主要是我这回 做 Copy-on-Write Fork 在调试上浪费了太多时间,因此去寻找新的编程方法。
这个 lab 我一开始做得很顺利,只用不到一个小时就做完了 part2 ,但是疏忽了一些具体细节,和急于求成导致我最后做得很差劲,大概有一天的时间一直在调试,直到最后我虽然通过了所有测试,但是一直没能解决 lost free page,并且代码逻辑也不清楚了,可谓是一团糟。
后面我发现是因为我对实现的理解出现了偏差,这也与 Robert Tappan Morris 老师说的 :“because I didn't fully understand the problem”完全一致,但是我是在整一个功能都实现后才发现,这时候想做修改已经十分困难。
为此我想优化我的做 lab 过程。
首先是反思我为什么会把代码逻辑搞得一团糟
我发现我在做 lab 的时候每一部分 都做得不那么仔细,主要是延迟思考(偷懒)我会先大概构造一个整体思路,然后实现一个个部分,但是我经常在具体细节上偷懒,没有想清楚这一小部门代码的一系列可能的问题,经常想推迟到后面整体调试的时候处理。并且我还是个喜欢简洁的人,但是我的方式错了,我认为过多得调试信息会让代码很丑(但其实在没有正确之前,这些都是应该去做的),所以我经常遗漏了很多关键性的 print 调试信息。
随后就是不断地调试,调试,修改,修改,这样我地程序逻辑就发生了更改,并且因为我一直没有理解透彻这个功能地具体意义,所以我一直都在做无用功!
我的这个坏习惯其实在 page tables 那个 lab 中就露出了不少破绽了,但是好在当时有足够的前置基础,才能通过。
而这回我贪快,在没有看一些前置 lecture 的情况下,就开始做 Copy-on-Write Fork for xv6 lab,结果就一直在 debug,并且解决了一部分就来了新的一部分,到最后就变成了一个垃圾代码,只能重写。
因此我开始寻找一种更好的方式
下面我是在 [lecture 12 6.S081麻省理工操作系统 - 2020 年秋季bilibili](https://www.bilibili.com/video/BV19k4y1C7kA?p=11) 这门课上摘抄 的 Robert Tappan Morris 做 lab 的语录。
03:20
Alright,so,when I'm doing the labs, I always take small steps, I may find you know some sort of next subset of the problem to solve, maybe five or ten lines of code, I programmed up and run it and try to get to working. before I go on to the next, proceeding to the next step,and this is you know as opposed to for example thinking through and writing a complete solution, before starting to test and debug, it always test and debug a little bit at a time, a lot of the reason for that is that,
even though you may, you may have sort of thought through a lot of things, a lot of the challenges, and a lot of the design, for what you're going to have to do to solve the lab, I find at least there's often surprises. And so if I implement everything first, I may find the that I've wasted a lot of time, because I didn't fully understand the problem, until I actually got into debugging it. And the way I choose the next step at each point is usually driven by whatever panic or crash a test failure I see that, sort of tells me what I need to fix next.
当我做 lab 的时候,我总是小步前进,我可能会发现要解决的问题的下一个子集,可能有5到10行代码,我编写程序并运行它,在我继续下一步之前试着让它工作起来。而不是思考和写一个完整的解决方案。在开始测试和调试之前,它总是一次测试和调试一点,这很大程度上是因为,你可能会思考很多东西,很多的挑战,很多设计,关于你要做什么才能解决 lab,但是我发现至少经常有惊喜。
所以如果我先实现所有东西,我可能会发现我浪费了很多时间,因为我没有完全理解这个问题,直到我开始调试它。我在每个点上选择下一步的方式是:通常是由测试失败引起 或 崩溃引起的 panic,来告诉我下一步需要解决的问题。
1:20
I‘m a huge believer, I'm putting print statements into the code in order to gather information or to verify hypotheses. I'll often spend time just looking at the code, just for the purpose of generating sort of brainstorming with myself, just try to generate you know things, that could possibly be going wrong at this point, and then put print statements in panic or something to try to rule in and rule out various guesses at what the problem might be.
Another possibility is that you know you've made some you know your code worked or didn't show this error or something, you know half an hour ago and you made some changes, and now you have some bug, another possibility is to if you can, you know back up to a version of the code that didn't have the bug and sort of add your changed bit by bit until the bug shows up.
我坚信,我将打印语句放入代码中,以便收集信息或验证假设。我经常会花时间看代码,只是为了给自己来点头脑风暴,试着生成一些东西,在这一点上可能出错的东西,然后将打印语句放到 panic 或者其他地方,通过猜测问题是什么,去排除各种可能的问题。
另一种可能性是你做了一些改动,让你的代码工作了,或者没有显示这个错误之类的,你知道半小时前你做了一些修改,现在你有了一些错误,另一种方法是,如果你可以,你能回到一个没有缺陷的代码版本然后一点点地添加你的修改直到缺陷出现
测试失败时的解决办法:
And you know a good step at this point is to go have a loog at the tests and figure out what it's trying to do.
最后,6.S081 / Fall 2020 (mit.edu)真的是一门很好的课~~!来一起做吧,[MIT6.S081 - 知乎 (zhihu.com)](https://www.zhihu.com/column/c_1501588134235734016)

问题:如何实现(添加)一个功能? 1. 首先确定这个功能的核心部分 2. 从核心部分开始解决一个子功能,让这部分工作起来,并将其调试正确 1. 在实现子功能的时候,得清楚自己所写下来的每一行代码的意思 2. 在写代码的时候,得做尽量多的思考,对自己所认为有可能引发错误的地方加上判断,利用一些 print 手段打印出来,比如 panic 3. 运行这一个部分,并进行调试,确保这个部分工作起来是自己想要的结果 3. 通过上一个过程的一些 panic 信息,进行进一步的完善。 4.在此就将问题推向了下一个过程,循环1,2,3,直到与测试(期待)结果一致,这样我们就实现了一个完整的功能(lab) ps:在测试没通过的时候,可以查看测试代码,快速知道测试的目的,从而进行调整。
Rigorous:老师上课总是说Baby steps。我发现看TA的题解很有帮助。还有就是不要死磕,可以先做后面的lab,等你对整个内核都熟悉了,前面的一些问题就迎刃而解了。
2022-09-22 12:00
林夕 回复 Rigorous:我是不建议因为做不出来而跳过lab的,如果如果实在想不出的,可以看老师的讲解,多看看lecture,或者是看看别人的思路其实都是好的方法。不然等以后想要回到那个上下文,其实都比较麻烦的。
2022-09-22 12:22
Rigorous 回复 林夕:我感觉内核的实现是比较灵活的,有时候会因为不了解其他部分的功能而莫名其妙的卡主。我当时做页表的时候就总是有文件系统初始化失败的错误。后来看TA题解发现那部分的entry是直接从原来内核页表拷贝的,自己去手动映射就少了初始化的步骤。当然做到文件系统的实验后就明白了,然后按照这个思路页表实验也跑通了。
2022-09-22 12:32
林夕 回复 Rigorous:嗯嗯是的,这点是这样,就这样问题而言,我也遇到过很多,对于这个pagelab 来说,其实不用了解后面的部门也是可以的,但是这个lab 确实容易出问题,我的建议是可以看 lecture 直到看完 trap,基本上就没有什么压力了,至于你说的文件系统的那部分,这个时候我是建议去带着这个问题去看看别人的题解,看看别人为什么没有出这个错误,把这个问题解决了,继续前进就行,跳过 lab 的代价是很大的,我一般不建议这么做,不单单是上下文切换代价太高了,另外就是对 自己 的信心和心态也有一定的打击,当然每个人都不同~
2022-09-22 12:49
我理解开始的第一步是行动~ 那么应该怎么行动呢?首先得有一个环境,去感受一下要做什么,可以在我的 CSAPP一键环境配置、完成8个lab总结 - 林夕丶的文章 - 知乎
看到一些方法,这会对你有帮助。 提前学基本上会C,然后有一个linux环境就够~ 我的文章会配好环境,另外就是不用这么担心前置知识,csapp前置要求不高,基本发现有缺失,再倒回去补呗,重要的是开始~
网的知识可能深也可能不深,有的做内核的地方再搞dpdk那些 bypass kernel 的场景计网应该要求比较高,不过一般重点不会在计网,还是在存储和调度,也就是文件系统、内存管理、IO协议栈,进程调度。 哈哈,6.S081是挺难的,但是其实学习的过程是可以分两步的,我理解你现在所处的应该是还不太熟悉xv6和os原理,那么在这个过程你可以多去尝试,不用管能不能独立做出来 重要的是,要从lab去倒逼自己OS知识体系的建立,可以多看些文章,多看看代码,多听听课,从多种渠道去验证总结自己的学习。你如果要做OS,那学好xv6是很有帮助的。 最多是做lab,推荐一个方法~,可以先画思维导图,先明确这个lab需要的知识点,然后按照你的推论,一步一步一个脚印coding,中间可能要做大量的搜索,但是重点是要理解深刻自己在做什么,每一步走好就行啦~
感谢林哥回复!还想问一下现在网络编程学的人很多,我反而不是很喜欢计网这个部分,可是看一些职位要求都需要这方面知识,是否应该继续磕OS深入理解,(现在正在用Linux源码注解搭配xv6学习)还是为了应付面试学一学基础的网络编程知识呢?
2023-04-11 16:46
林夕 回复 Zima:哈哈我突然意识到我们说的计网不是同一个东西,你大概说的是后端面试难度的那种网络编程的知识吧,这个其实一般来说你做一个网络编程的项目就行了,比如webserver。 第二个问题,不太好回答,因为我不知道你现在在什么程度?你对linux内存管理或进程调度理解吗?在学习的过程中要有深度是很重要的,但是OS很大,一开始得有个理论知识的广度比较好,可以顺带把计网学了,说实话面试难度的计网,一般是难不住你这种能够深入了解OS的。 总结一下,我其实不太建议你看linux kernel,如果你理解xv已经手到擒来了,那没问题,因为linux kernel,真得很不适合初学者,其实OS知识,你从xv6里面也可以抽象出很多。 我建议既然你都开始了,那就把xv6先学完吧~,或者学多几个lab,有深度一点点,这样也好在面试说,面试官是很看重深度的,一长遮百短
2023-04-12 00:18
hi~不好意思,最近有点忙,回复晚了。大二就做到这些很厉害哇~ 目前主流系统内核都是C写的,C++领域知识是指C++的语法吗?如果是指语法的话,那么在内核里面还是没多大意义的,如果是想做OS内核的话,选择Rust也比C++要好一些。 纯做内核的话还是很难的,做完这两个lab,其实已经具备学习Linux内核和自制内核的门票了,你当然可以选择继续深入下去,自研(魔改)OS和深入Linux内核,这都是很好的方向。 不过我还是不太建议你现在独自深入下去,应该补充一些别的知识,或者结伴而行~ 我理解一般大二的学生,应该还缺少别的计算机知识,比如,软件工程,网络(原理和应用),编译原理,数据库原理和应用,或者是分布式领域的知识。这些知识也是很重要的,在深入内核之前,我想你如果提前学过,软件工程,编译原理,数据库,分布式对你有所帮助,这也不会让你技能树太单一,同时这对于找工作会更有帮助。
所以我建议,可以考虑(优先级序号越小越高)
  1. 直接去参加全国大学生计算机系统能力大赛 (educg.net),建议参考内核方向的。可以多了解下这个比赛,里面很多很厉害内核方向的同龄人,参考参考他们的项目,从中找一个内核深入的方向。
  1. 补齐一些软件工程和其他基础知识。适当补齐一些现代语言和工具的使用,比如 rust,chatgpt4,autogpt....
  1. 参考一些名校的课程,看看6.828,6.824在做什么,
  1. 偶尔关注下内核发展,看看云计算和虚拟化,可信计算...... 看看这些比较前研的OS内核研发/应用在做些什么,看看信创,看看国产化替代在做什么,确定自己未来的方向。
另外,我看你在学muduo是么,你看起来是也想做C++服务端么?如果是这样的话,muduo是很好的项目,可以看看muduo的buffer处理和网络处理还是很不错的,如果是这个方向,也可以看看 1 里面的 应用层的一些项目,然后也可以学学rust,( 可以感受下rust服务端开发的高开发效率, 高运行效率
如果你是考虑本科就业的话,从1里做出一个项目来,还是很够的。做内核的话,在学习地过程中,要多注意软件开发原则的记录,调试工具的使用,多思考总结写文章,这对别的领域都也是很有帮助的。 加油~
起来你这个学习方向还是比较匹配基础架构之类的开发。算法过笔试和面试应该问题都不大了,几个项目和lab也比较完善,如果你认真做过lab的话,实力是够了的,如果有时间导师放你出去的话,其实我更推荐你现在去实习一下。至于下面的几个问题: 1)总体我建议先把 C 的 xv6-riscv 看明白,输出每一个模块的文档,然后再看 rcore,把 rcore 的好的实现般到 xv6-riscv 里去,这比用 rust 重构 xv6-riscv更有意义。另外就是如果你要用 rust 重写 xv6-riscv 话,不建议从0开始写,这不是一个好的方法,要一步一步重构,复用 xv6-riscv 的测试,另外就是 GitHub 上面实现的那两个 xv6-rust 和 xv6-riscv-rust 其实不是很好,他们的写的 rust 不够地道,而且也通过不了xv6-riscv的测试,如果你要参考的话,他们的架构是不错的,但是细节还是得靠你自己,你如果要做可以考虑做得比他们更好。 2)要输出文档或者代码,要输出自己的理解,做一件事要有思考性的输出,不要摘抄,你一般只需要记住顶层的抽象(由你自己构建),而下层的抽象都在文档或者原书里即可。举一个例子,假设你学完了C++ primer,你就应该有一个能够覆盖 C++ 的基础语法和特点的demo,这个demo分模块用到了你学到的东西,以后你有c++语法忘了,你可以参考你的demo,甚至添砖加瓦。同时你也应该有每一个模块的一句话描述(这就是你以后的记忆)。 这个过程要一个模块一个模块的做,我自己的实践是,我本性是很懒惰的,如果跳过了,那我以后可能也不想补了,只有当时做是最有可能做好的。 3)你的方向没问题,别担心,硬件大部分都可以现学,一般问题不大,主要是一些调试技巧可能有门槛,xv6可能够了,不够最好还是Linux内核源码要有概念,至少要知道各个模块的功能和思路,学会编译修改内核。
Leo:林夕您好,我是对于OS比较感兴趣,想从美国这边润回国,我之前打听到的信息是国内做纯OS目前最大的就是华为鸿蒙,所以现在也在准备鸿蒙内核组的面试,请问你认为操作系统大类里面,比较有价值和挑战性去做的是哪些部分呢,比如进程调度,内存管理,文件系统,到高层的虚拟机这些?想要走操作系统这个赛道,鸿蒙是一个很好的选择吗,还是说那些做云的部门修改Linux内核的更加实用呢? 2023-08-12 14:48 林夕 回复 Leo:首先你这里列举了两个方向,一个是移动端,一个是云计算。我理解价值和挑战更重要的是看方向上的机遇,这两个方向我没法列举完优劣,但希望能给你一些参考。 你觉得移动端OS的挑战是什么?移动端OS的关键发力点还是在进程调度模块,去做电源管理和优先级调度队列等等。更多的是打造简单易用的生态,比如华为一直主推的跨设备交互。在移动端内核方面,你可以看看鸿蒙的对比对象,其实还是把Linux当竞品的,这方面价值是不是全自研,其实不重要,重要的是看竞品。 对于云计算,我理解云计算主要聚焦的内核改动还是在虚拟化,还有就是服务器OS性能优化和bugfix。云计算OS的挑战应该会和分布式和虚拟化程度有较大关系,还有GPU虚拟化会越来越重要。另外就是看业务了,各种后端需要的OS需求,都会到云计算OS部门去承接。 我理解对个人来说,做后端OS比客户端OS价值更大一些,因为这样一致性强,面临的问题也类似,目前客户端OS也就华为在宣称全自研,而且不确定鸿蒙到底是怎么研发的,他的技术能不能对你有价值,还是看你自己的想法。但是对于云计算确定的Linux是很可以的,云计算随着市场逐渐扩大,面临的问题会越来越多,挑战也会多,并且这些挑战在自动化驾驶,嵌入式开发,后端OS也很可能会遇到。 抛开前面的讨论,我个人目前推荐去那种软硬件一体化的公司,或者有这种能力的公司,大厂一般都有,然后再看部门的安排,可以大致问一下他们的部门OKR关键是什么,看看自己的关注在哪,OS也不只有你说的方向,如果你选择权多可以多看看自动驾驶,看看英伟达那边的部门,看看红帽,回国也没必要局限于国内企业和市场。
 
 

如何看项目源码

看github上的项目,首先要学会用,要把这个项目用起来,跑起来,然后再去看代码,很多录友都反过来了,项目都没运行都没跑起来,然后就开始专研代码,那是绝对看不懂的。
所以看开源项目可以分这么几步:
  1. 运行,跑起来,用起来,知道这个项目有什么功能,满足什么需求
  1. 找到项目入口 main函数
  1. 拆解项目模块,都有哪些功能,哪些模块
  1. 一个模块一个模块去看代码,而不是 囫囵吞枣
  1. 修改部分代码,重新跑项目,看看有哪些变动
  1. 完成这个项目代码的阅读

看视频做项目

很多同学 是看视频做项目,但有担心项目重复率太高,其实这样的项目重复率一定是高的,但跟着视频学完,绝对不能 代码和视频里一样一样的,而是要有自己的理解,然后找一些可以优化的地方,不断优化,这就体现出和别人的差别了。
例如都选了web服务器的项目,但是你可以在网上项目的基础上增加自己的新意,例如对线程池,定时器,数据库,还有日志系统等等都可以自己好好设计设计。
然后把代码传到github上,简历把github地址贴出来,面试官看代码不错,都是加分项。
 
这是一个好问题,很有代表性,我好好回答一下。
配环境,改bug(线上的那种bug)是最考验一个程序员功底的。 而这种能力还很难在面试中问出来。
例如一个算法大牛,手撕红黑树撕的明明白白,但你让他配一个 nginx + php + mysql 的环境,可能他都无从下手,甚至搞半天搞不出来。
配环境这种能力,不是能系统学习的,只能自己不断的去尝试,不断地去磨自己,然后就会越来越熟练,对问题的定位越来越敏锐。
这也是为什么很多学生面试表现非常好,但进来工作之后,表现很一般,遇到一些问题磕磕绊绊的。
因为很多代码工作,其实需要的是 一种对程序的悟性
再说 配环境,需要算法知识吗,需要编程语言知识吗,需要操作系统知识吗,都不需要。
需要的是一种悟性,怎么形容这种悟性呢?
再说配置环境吧,大家使用linux系统,例如centos、unbantu,安装软件的时候,应该没少使用 yum install 或者 apt-get install 这样的命令。
但有没有想过使用这些命令安装的软件都装在哪了,配置文件在哪,bin又在哪,安装之后为什么在命令行敲软件名字回车,就可以直接运行这个软件了。
如果这个软件安装的时候,需要手动更新几个依赖包,或者说 依赖包版本过低了,要手动更新一个最新版本。这种情况大部分同学就懵了,可以一顿 apt-get install 的操作,反正也不知道都按哪里,卸载也不知道卸没卸干净。
这样一波操作之后,这个系统的配置就乱了,都是黑盒操作。
其实玩linux,下载软件,最锻炼自己的方式是 下载软件源码,自己编译,生成bin,配置上系统路径,然后启动。
这样对整个过程,软件具体在哪里,怎么运行的,依赖什么,配置在哪,自己都知道。掌控的能力自然不一样。
但很多同学会比较懒,懒得去折腾,毕竟面试也不考(事实上面试确实不考这些,也没法考)
别说在校学生懒得折腾,很多工作之后 也懒得折腾。
还有就是遇到问题 大家一般都是报错信息直接 粘到 搜索引擎上 搜 看看有没有 什么解决方法。
但有些时候,直接这么搜 是搜不出来自己想要的结果的,网上都是一片 对你没有帮助的信息。
但有的同学就能搜到自己想要的信息,这是提取关键字的能力,需要对 报错信息做进一步分析,提取相关的关键字,再去搜,可能就搜到自己想要的了。
包括“有一定英文能力”,会“翻墙”,直接google,看StackOverflow 都是一种能力。
也也是对程序的一种悟性。
这种悟性,当然不是与生俱来的。
一般都是磨出来的,遇到配置问题,遇到bug,不要怕麻烦,该查就查,该写个脚本分析日志就写脚本,逢山开路遇水搭桥。
但最后如果实在查不到,“重启试试”,这是最后的王牌,哈哈。
工作中有的同学遇到这种问题,就想着让同事帮忙快速解决一下,要不然可能不能按时完成任务了。 或者说稀里糊涂过去了,就过去了,完成任务就完事。
事后可能自己没有去研究。
但这种配置问题,bug问题就像是定时炸弹,时不时出来 阻碍你的 开发进度。然后就开始怀疑自己是不是真的适合写代码了。
最后,我的建议是,如果说长远发展的话,这种配环境,改bug的能力,该磨一磨自己,还是要磨的。
但确实对通过面试没啥帮助,特别是校招,面试很难查到这种能力。不如背一背面经,做一道算法题来的实在。
 
 
学习像 C++primer 这么厚的技术书籍,第一遍看,不要看的特别细, 因为你不知道哪些是重点,内容还特别的多。 容易陷进去 无法自拔,还耽误很多时间。
你能做到 ,了解哪些知识 大概在那个章节 就可以了,后面看 effectiveC++或者八股文 的时候,哪里不懂了,回来再去翻 primer就好
等你理论和实践能力提升到一定程度 再去细看primer会有不一样的收获, 估计那时候就是你工作一两年了。

速成

C++后端方向: * 熟悉C/C++,熟练使用C的指针应用及内存管理,C++的封装继承多态,STL常用容器,C++11常用特性(智能指针等) ,了解 Python,Gtest等。 * 熟悉常用设计模式(单例模式,工厂模式等) * 熟悉Linux下vim开发环境,了解网络编程,IO多路复用,epoll等等。 * 熟悉OSI五层网络模型,熟悉TCP/IP,UDP,HTTP/HTTPS,DNS等网络协议,熟悉TCP三次握手,四次挥手,流量控制,拥塞控制等手段。 * 熟悉操作系统的进程通信、死锁、内存管理等知识。 * 熟练使用 MySQL,熟悉 MySQL 索引、事务、存储引擎、锁机制。 * 熟悉常用的数据结构(链表、栈、队列、二叉树等),熟练使用排序,贪心,动态规划等算法。 * 熟悉使用Git,vscode工具使用。求linux系统编程吗,Pthread、Socket、进城管理、I/O等? Java后端方向: * 熟练掌握Java基础,集合等相关知识,了解常见的设计模式。 * 熟悉JVM的垃圾回收机制、类加载机制及Java的内存区域。 * 熟悉Java并发编程,掌握JUC中常用的工具类,如ConcurrentHashMap等,熟悉多线程,线程池,Java内存模型。 * 熟悉OSI七层模型和TCP/IP四层体系分层结构,掌握常见网络协议,如HTTP/HTTPS 、TCP、UDP、DNS等。 * 熟练使用 MySQL,熟悉 MySQL 索引、事务、存储引擎、锁机制。 * 熟悉操作系统的进程通信、死锁、内存管理等知识。 * 熟悉Redis数据类型使用场景和内部实现,熟悉持久化和过期淘汰策略,熟悉缓存高并发场景,比如缓存穿透、缓存击穿、缓存雪崩。 * 熟练使用Spring Boot、Spring、Mybatis等常用框架,熟悉 Spring IOC 、AOP 原理,了解 Nacos 、Zookeeper 等常见组件。 * 掌握 Linux 常用命令,如 netstat 、grep、top、chmod、find 等。 go后端方向 * 熟练掌握GO语言,了解map, struct, slice, channal,GMP模型调度器,gc垃圾回收,内存逃逸等底层原理; * 了解掌握go-micro,gin,grom, grpc,protoc等框架使用;了解Python,Java等其他编程语言 * 熟悉计算机网络原理,了解TCP,UDP,HTTP,HTTPS等网络基础知识 * 熟悉使用MySQL数据库(InnoDB,MyISAM储存引擎)及数据库管理工具Navicat,熟悉InnnoDB储存引擎 的底层框架及MVCC多版本并发控制  * 了解Redis等非关系型数据库 * 掌握操作系统进程,虚拟内存,锁,调度算法,多核缓存一致性等概念 * 掌握IO复用并发模型,Linux系统命令及云服务器项目部署算法相关。 * 熟悉基础数据结构,掌握多种排序,动态规划,二叉树等算法 * 微服务相关:了解基础微服务架构,服务网格架构 * 团队相关:熟悉使用Git以及使用Github/Gitlab仓库进行协作开发 前端方向 * 熟练掌握 HTML、CSS 并能精确还原设计稿 * 熟悉 HTML5 和 CSS3,熟练使用 CSS3 弹性布局等,能配合媒体查询实现响应式布局、自适应布局 * 了解 HTTP 协议、TCP/IP 协议、TCP 三次握手与四次挥手等计算机网络知识 * 熟练掌握 JavaScript,理解作用域、闭包、构造函数、事件委托、异步加载等 * 熟悉 ES6 基础语法、箭头函数以及 ES6 模块化语法,了解 promise * 熟悉 JQuery、Bootstrap 等前端开发框架进行前端项目开发 * 熟悉 less,熟练使用 less 语法 * 熟悉 Vue、Vuex、Vue-Router、Vue-Cli 等 vue 相关开发技术 * 熟悉使用 element-ui、vant 组件库  * 熟悉 React、React-dom、React-router、Redux 等相关开发技术,熟悉 dva 数据流方案  * 熟悉 Echarts 等可视化工具 * 了解 node.js 及 koa2 框架,能和前端实现简单数据交互  * 了解 Git 版本管理工具的基本使用 测试方向 * 熟悉 linux 常用命令,如:文件操作、权限管理、进程等 * 熟悉 c/c++、python 编程语言,了解 stl 常用容器,熟悉面向对象模式 * 熟悉 mysql 数据库,了解索引、事务、隔离级别 熟悉计算机网络知识, * 了解 tcp/udp、http\https 等基本的网络协议 * 了解 postman,fiddler 软件测试日常工具的使用 * 掌握软件测试基础理论,测试用例编写方法 * 熟悉自动化测试技术,以及自动测试工具 QTP 的使用; * 熟悉性能测试技术,以及性能测试工具 loadrunner 的使用; 安卓方向: 1.有扎实的 Android 开发基础,包括生命周期,事件传递机制,自定义 view,动画等; 2.熟练掌握 Android 消息机制 Handler,及其相关源码实现; 3.熟练掌握 Android 进程间通信的各种实现,包括Bundle、Socket、Binder、文件共享; 4.熟练掌握 Android 系统的启动过程,应用的启动过程; 5.熟练掌握 Android 系统服务,包括AMS,PMS,WMS等; 6.熟悉 EventBus、Glide、LeakCanary 等三方库的源码; 7.熟悉 Android 应用性能优化,包括内存,GPU,网络等方面; 8.熟悉 Java 数据结构的源码实现,比如ArrayList、HashMap; 9.熟悉 JVM 的 GC 机制、类加载机制及内存区域; 10.熟练掌握 TCP/IP 体系分层结构,熟悉常用网络协议,如HTTP/HTTPS,TCP,UDP 等; 11.熟练掌握 Flutter 开发,理解 Flutter 中的Widget tree、Element tree 等基础概念; 12.熟练掌握 Flutter 混合 Android 开发,有插件开发经验;
运维相关:熟悉docker镜像构建,docker容器化部署应用,熟悉gitlab—ci自动化集成部署微服务应用,了解K8S集群基本概念及应用部署流程
notion image
notion image

项目包装

关于项目的包装,我在做项目的时候就思考过,现在网上秒杀电商这种项目几乎人手一个,写的东西也大同小异,
我应该如何让面试官知道我对这个项目的参与度是不低的呢?
因此需要提前整理好一套“说辞”,包装项目的同时又能加深对项目的理解。
项目包装可以从以下几个点入手:
关键词:分布式、微服务、用户量、QPS、TPS、技术栈、设计模式
第一个点(分布式微服务)
如果没有做过分布式,可以谈谈为啥使用单体结构,后面项目达到什么程度需要做重构。
第二点(项目指标)
用户量、峰值、QPS、TPS。这四个指标在项目中分别是多少
第三点(技术栈)
使用一门技术,想好对应的说辞:
  • 为啥你要用
  • 在你项目中咋体现的
  • 不用可不可以
第四点(设计模式)
在牛客项目中,就用到了:工厂模式、单例模式、代理模式,这其实是一个很好的切入点
我们可以想想为什么要在项目用到这些设计模式?
从一个简单的业务需求,通过设计模式我们使其更具有扩展性,更解耦,它包好了你对业务的理解,对设计模式的理解等多个方面,这也是你的项目亮点之一。
 
 
 
按顺序看这几本书《C++ Primer 第5版》/ 基础不好的话建议看 《C++ primer plus》-> 《Effective C++》 ->《Effective stl》 -> 《STL源码剖析》-> 《深度探索C++对象模型》(选看) …

C++

按顺序看这几本书《C++ Primer 第5版》/ 基础不好的话建议看 《C++ primer plus》-> 《Effective C++》 ->《Effective stl》 -> 《STL源码剖析》-> 《深度探索C++对象模型》(选看)
配套电子书下载 提取码: sftd
学习网站 推荐 www.learncpp.com ,可以说是非常全面系统的介绍了C++相关知识,从编译器使用到如何运行第一行代码都介绍的非常细致。
平时看一看语法,某些函数的使用,推荐: http://www.cplusplus.com
而且相对C++ primer更简洁一下。 如果 这个网站是英文版本,如下:
notion image
如果有时间,可以自己实现一套简单的STL,既能熟悉STL,也可以作为自己的一个小项目,传到github,把链接放在在简历上是个加分项
以上推荐书籍,如果在时间紧张的情况下,可以这样看:primer 大概扫一遍就行, effective C++ 和 effective stl 重点看。 然后就多收集C++面经,对着面经复习就好。

视频推荐

这里还是推荐侯捷C++的视频

侯捷C++新标准-C++11/14系列

一共31集,看完之后可以对 C++11,有一个全新的了解,不要以为C++11 都多新的特性,现在已经C++20了,但C++11才慢慢在企业中广泛应用,面试的时候C++11也是重要考点。

侯捷-C++ STL标准库和 C++ 泛型编程

STL 标准库是C++里的利器,也是面试中的考点,至于泛型编程,模板是泛型编程的一种重要思想,STL就是采用模板实现的一个实例,所以一起学习再适合不过
不过现在在网上的C++侯杰视频,都不太全了,我收集了关于侯杰视频的资料分享给大家
视频顺序: 1. C++面向对象高级开发,2. STL和泛型编程,3. C++标准11-14,4. 内存管理
不过侯捷的视频是比较进阶的,先把我列的那几本书看了,再来看视频。
密码: fsh4
 
文件权限

Linux 文件权限

notion image
Charon2023年07月24日 00:56

Linux 文件权限

在使用 Linux 时,权限问题是一个十分常见的问题,“Permission denied(权限被拒绝)"错误是由于用户没有足够的权限来执行特定的操作所导致的。这通常涉及到对文件或者对目录的读取,写入或者执行操作。
Linux 是一个支持多用户,多任务的操作系统,想要理清文件权限上的问题,则先需要大致了解一下Linux中的用户分类。

1. 用户的分类

在 Linux 中,用户大致分为三类:
  1. 超级用户(root用户)
  1. 系统用户
  1. 普通用户
Linux 通过 uid 的范围区分对三种用户进行区分,其中,超级用户的 uid 为0,系统用户的 uid 在1 - 1000之间,普通用户的 uid 从1000开始进行分配。
超级用户(uid = 0):超级用户是Linux中的管理账户,其 UID 的为0(Linux中的管理员之所以是root,是因为root的uid为0,并不是因为它的名字叫做root),超级用户具有整个系统的最高权限。可以执行系统中的任何操作,包括对系统配置进行更改以及安装/卸载软件。因为超级用户拥有绝对的权力,并且可以绕过文件权限的限制,因此,使用超级用户时需要极其谨慎,以防止对系统造成不可挽回的伤害。
系统用户(0 < uid < 1000):系统用户是用于运行系统服务或者特定应用程序的用户账户。这些用户通常不能像普通用户那样使用用户名和密码登录到计算机,而是仅仅用于特定的系统任务或者服务。例如在安装Nginx时,系统会自动创建一个"www-data"的用户。具体来说,在使用nginx做为web服务器时,服务进程会以 www-data 的身份运行,这样服务器就能够访问网站的文件和静态资源,同时能够避免超级用户权限运行服务器进程的风险。
普通用户(uid >= 1000):普通用户则是除了超级用户以外的其他用户。普通用户具有较低的权限,不能对系统的关键部分进行修改,也不能够管理其他的账户和权限。普通用户可以创建、编辑和删除自己的文件,但是不能够影响其他的用户的文件。
使用cat /ect/passwd命令可以查看系统中的所有用户(以下结果为经过筛选的部分用户)。
root@VM-12-5-ubuntu:/home/charon# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
mysql:x:113:117:MySQL Server,,,:/nonexistent:/bin/false
charon:x:1001:1001:,,,:/home/charon:/bin/bash
clint:x:1002:1002:,,,:/home/clint:/bin/bash
以上部分结果中,拥有一个超级用户,其uid = 0。
拥有两个系统用户,分别为www-data、mysql,其uid分别为33和113。
拥有两个普通用户,分别为 charon 和 clint,其uid分别为1001和1002。

2. 用户组

为了方便的统一管理多个用户,Linux中还引入了用户组的概念。每个用户组都有一个唯一的 GID(Group IDentification)。
用户组的作用:用户组的主要作用是将多个用户组合在一起,以便于权限管理。通过将用户分配到一个用户组中,然后再为该用户组设置一定的权限,在这个用户组中的所有用户就能统一的拥有相同的权限。
默认用户组:在创建系统用户时,系统会自动的为该用户创建一个与用户名相同的用户组。例如系统创建了一个新用户 charon 时,也会同样创建一个同样叫做 charon 的用户组。并将默认将 charon 用户分配到 charon 用户组中。
附加用户组:一个用户可以同时加入多个用户组。比如 charon 用户已经被分配到 charon 组时,还能接着加入 clint 用户组,此时, charon 用户能够同时拥有 charon 用户组和 clint 用户的权限。

3. 文件权限属性

在Linux中,每个文件都有一组属性,这些属性用于定义文件的类型、权限、所有者、用户组和其他的相关信息。可以通过ls -l命令查看。
当使用ls l命令时,会得到以下结果:
charon@VM-12-5-ubuntu:~$ ls -l
total 32
-rwx--xrwx  1 charon clint  8304 Jul 19 20:48 test
-rwxr-xr--  1 clint clint   389 Jul 19 09:03 test.c
下面开始对结果进行分析。
notion image
文件类型:
第一个字符”-“表示的是该文件的文件类型。
常见的文件类型有以下几种:
  1. "-",文件
  1. ”d“,目录
  1. ”l“,链接文件
文件权限:
然后接下来的九个字符序列,每三个分为一组,每组都以rwx的形式进行排列。其中,r代表可读(read),w代表可写(write),x代表可执行(excute)。每组中的rwx中,各个字母的位置不会改变,如果字符组合中出现了对应的字符,则代表该文件拥有对应的权限,如果没有该权限,就会使用”-“进行替代。
第一组是文件拥有者对该文件的权限:上图中的test.c文件,该文件的拥有者就对该文件有可读可写可执行(rwx)的权限。
第二组是文件所属用户组对该文件的权限:上图中的test.c文件,该文件所属组中的用户对该文件拥有可读可执行(r-x)的权限。
第三组是其他人对该文件的权限:上图中的test.c文件,其他人对该文件就只有可读(r--)的权限。
链接计数:
链接计数表示指向该文件的链接数量,这里不做深入学习。
文件所属者:
该文件的主人,文件的主人拥有对文件的支配权。
文件所属组:
该文件所属的用户组。
文件大小:
文件大小指示了文件的实际字节大小。
文件修改时间:
文件内容最后一次被修改的时间。
文件名:
文件名。

4. 文件属性与权限的修改

在 Linux 中,可以使用特定的指令对文件的属性和权限进行修改。对于一个文件来说,只有这个文件的拥有者和系统的超级用户才有权修改文件的属性和权限。a
1、chgrp 指令(Change Group)
chgrp 指令是Linux系统中用于修改文件或者目录的用户组的指令。它允许超级管理员或者文件的拥有者将该文件的所属用户组更改为指定的用户组。
语法:
chgrp [options] new_group file(s)
参数:
  1. new_group:要设置的新用户组的名称或者组ID(GID)
  1. files(s):要修改用户组的文件或目录列表
常用选项:
  1. R:递归地修改目录及其子目录下的文件的用户组
示例:
将文件test.c的用户组修改为 clint用户组。
chgrp clint test.c
文件夹test下的所有子目录以及文件的用户组修改为clint用户组。
chgrp -R clint test
2、chown 指令(Change Owner)
chown 是 Linux 系统中用于修改文件或目录的所有者和用户组的指令。它允许文件拥有者或者超级管理员更改文件或者目录的所有者和用户组。
语法:
chown [options] new_owner[:new_group] file(s)
参数:
  1. new_owner:要设置的新所有者的用户名或者用户ID(UID)
  1. new_group:可选,要设置的新用户组的名称或者组ID(GID)
  1. file(s):要修改所有者和用户组的文件或目录列表
常用选项:
  1. R::递归地修改目录及其子目录下的文件的所有者和用户组
示例:
将文件 test.c 的所有者更改为 clint,用户组也更改成 clint。
chown clint:clint test.c
将目录 test 及其所有子目录以及文件的所有者更改为 clint。
chown -R clint test
3、chmod 指令(Change Mode)
chmod 是 Linux 中用于修改文件或者目录的权限的指令。它允许文件所有者或者超级管理员修改文件或者目录的访问权限,以控制谁读取、写入、和执行文件。
语法:
chmod [options] mode file(s)
参数:
  1. mode:权限设置,可以使用数字表示权限
  1. file(s):要修改权限的文件或目录列表
常用选项:
  1. R:递归地修改目录及其子目录下的文件的权限
数字表示权限:
在Linux中,文件的权限分为三种,读(read)、写(write)、执行(execute)。而不同身份的用户(文件拥有者/文件所属组成员/其他人)都分别拥有自己的一组权限。
在Linux中,可以使用权限分数(三个八进制数字)来简化的表示文件的访问权限。每个数字表示一组权限。权限分数对照表如下:
  1. r(读取权限):4
  1. w(写入权限):2
  1. x(执行权限):1
  1. (无权限):0
通过这三个数字的相加,即可得到文件的权限分数。例如,权限为(rw-r--r--)的文件的权限分数计算如下:
|owner|group|other|
|r w -|r - -|r - -|
|4+2+0|4+0+0|4+0+0| => 644
因此,权限为(rw-r--r--)的文件的权限分数为644,644就能简单的表示文件所有者能够读写,而文件所在组的用户和其他人只能读。
通过简单的权限分数,可以简单的为文件设置所需的访问权限。
示例:
将文件 test.c 的权限设置为rw-r--r--。
chmod 644 test.c
将目录 test 的所有子目录以及文件设置为所有人可读可写可执行。
chmod -R 777 test
将文件 test.c 的设置为所有人可以可执行。
chmod -x test.c
将 test 文件夹及其所有子目录和文件递归地设置可执行权限。
chmod -R -x test

5. 文件权限与目录权限

“万物皆文件” 是一个广泛流传的 Unix 和 Linux 系统的哲学思想。它意味着在 Linux 操作系统中,几乎所有的东西,无论是硬件设备、文件、目录还是进程,都被视为一个文件或者类似的对象。
这个思想的核心概念是将所有的事物抽象为文本的形式,以提供一种统一的访问和管理。
Linux 将目录也视作一个文件,但是普通的文件的权限和目录文件的权限却有一些差异。
1、文件的权限
文件是实际上存放数据的地方,包括一般的文本文件、可执行文件、配置文件等等。对于一个普通的文件,它的权限主要控制的是谁可以读取、写入和执行文件的内容。
  1. r(读取权限):如果用户拥有文件对应的读取权限,则用户可以查看文件的内容
  1. w(写入权限):如果用户拥有文件对应的写入权限,则用户可以编辑,修改,删除文件内的内容
  1. x(执行权限):对于可执行文件,如果用户拥有文件对应的执行权限,则用户可以执行该文件
2、目录的权限
目录文件是用于组织和存储其他文件和目录的特殊文件。
  1. r(读取权限):如果用户拥有目录的读取权限,则用户可以使用 ls 命令列出文件的内容
  1. w(写入权限):如果用户拥有目录写入权限,则用户可以在目录中创建、删除、重命名文件以及子目录
  1. x(执行权限):如果用户拥有目录的执行权限,则用户可以通过 cd 进入该目录
如果通过一种简化和抽象的方式来理解与文件和目录,那么可以将目录看成是一个普通的文本文件,这个普通的文本文件存储的是其他文件的索引或者是地址。那么可以将普通文件和目录文件的权限进行一个简单的类比。
  1. r(读取权限):目录文件的读取权限允许用户查看目录中包含的文件名列表(即目录项),相当于查看文本文件中的内容。
  1. w(写入权限):目录文件的写入权限允许用户在目录中添加、删除和重命名文件,相当于对文本文件的编辑操作。
当我们在目录中创建、删除或修改文件时,实际上是在修改目录文件中存储的映射关系表,从而达到管理文件的目的。
然后,需要强调的是,这种简化与类比只是为了帮助理解实际情况上,目录文件和普通文本文件在 Linux 中的区别是很大的。
在 Linux 的文件系统中,目录文件是一个特殊的数据结构,它包含了一个或者多个目录项,而每个目录项拥有两部分的信息:文件名和对应 inode 号。文件名是一个可读的字符串,inode 号则是真正的指向真正的文件数据的索引,并且每个目录项都是以二进制的方式进行存储的。目录文件还拥有特殊的操作,这些操作是文件系统内核的一部分,并不是普通文本文件可以的操作。
知识星球
notion image
notion image
扫码加入星球
查看更多优质内容

JP面经

2022.9.2-摩根士丹利-工程师项目-一面(35min) 第一次全英文面试,基础答的还可以,结果最后问了个系统设计的题,连题目都没听懂,也完全不知道该从什么方面回答。虽然知道欧美企业面试会系统设计,但没想到校招也会问。 1、introduce yourself 2、introduce LRU algorithm(LRU算法) 3、what is virtual method(虚函数) 4、explain polymorphism(多态) 5、what's the difference between virtual method and abstract method (抽象类和普通虚函数类的区别) 6、could you give an example when will you use a virtual method or abstract method (什么时候用纯虚函数,什么时候用普通函数) 7、what's the difference between stack and queue(栈和队列的区别) 8、what's the difference between TCP and UDP(TCP, UDP区别) 9、could you explain why it uses three hand shake instead of two hand shake(为什么需要三次握手) 10、what is memory leak (内存泄漏) 11、what is the difference between deadlock and starvation(死锁和饥饿的区别) 12、what is transaction (MySql事务) 13、design question : design a metting room. (系统设计题,听录音也没太听明白,大概是设计会议室管理系统,每个会议室容纳最多3个人,还有些其他限定条件,听不太清,第一次接触完全不知道从哪方面回答) 14、do you have any questions

大厂面试各个环节具体都要考察什么,侧重点在哪里?

notion image
Carl2021年08月25日 10:05
不少录友可能不知道 ,一面面完了,二面该面什么,三面又要面什么,侧重点是哪里。
所以这里给大家详细列举了一波,看完之后,就有整体性的了解了。
大型互联网企业一般通过几轮技术面试来考察大家的各项能力,一般流程如下:
  • 一面机试:一般会考选择题和编程题
  • 二面基础算法面:就是基础的算法都是该专栏要讲的
  • 三面综合技术面:会考察编程语言,计算机基础知识 ,以及了解项目经历等等
  • 四面技术boss面:会问一些比较范范的内容,考察大家解决问题和快速学习的能力
  • 最后hr面:主要了解面试者与企业文化相不相符,面试者的职业发展,offer的选择以及介绍一下企业提供的薪资待遇等等
并不是说一定是这五轮面试,不同的公司情况都不一样,甚至同一个公司不同事业群面试的流程都是不一样的
可能 一面和二面放到一起,可能三面和四面放到一起,这里尽量将各个维度拆开,让同学们了解 技术面试需要做哪方面的准备。
我们来逐一展开分析各个面试环节面试官是从哪些维度来考察大家的

一面 机试

一面的话通常是 选择题 + 编程题,还有些公司机试都是编程题。
  • 选择题:计算机基础知识涉及计算机网络,操作系统,数据库,编程语言等等
  • 编程题:一般是代码量比较大的题目
一面机试,通常校招生的话,BAT的级别的企业 都会提前发笔试题,发到邮箱里然后指定时间内做完,一定要慎重对待,机试没有过,后面就没有面试机会了
机试通常是 选择题 + 编程题,还有些公司机试都是编程题
选择题则是计算机基础知识涉及计算机网络,操作系统,数据库,编程语言等等,这里如果有些同学对计算机基础心里没有底的话,可以去牛客网上找一找 历年各大公司的机试题目找找感觉。
编程题则一般是代码量比较大的题目,图、复杂数据结构或者一些模拟类的题目,编程题目都是我们这门课程会讲述的重点
所以也给同学们也推荐一个编程学习的网站,也就是leetcode
leetcode是专门针对算法练习的题库,leetcode现在也推出了中文网站,所以更方面中国的算法爱好者在上面刷题。 这门课程也是主要在leetcode上选择经典题目。
牛客网上涉及到程序员面试的各个环节,有很多国内互联网公司历年面试的题目还是很不错的。
建议学习计算机基础知识可以在牛客网上,刷算法题可以选择leetcode。

二面 基础算法面

更注意考察的是思维方式

这一块和机试对算法的考察又不一样,机试仅仅就是要一个结果,对了就是对了不对就是不对,
而二面的算法面试面试官更想看到同学们的思考过程,而不仅仅是一个答案。
通常一面机试的题目是代码量比较大的题目,而二面而是一些基础算法
面试官会让面试者在白纸上写代码或者给面试者一台电脑来写代码,
一般面试官倾向于使用白纸,这样更好看到同学们的思考方式

应该用什么语言写算法题呢?

应该用什么语言写算法题呢? 用自己最熟悉什么语言,但最好是JAVA或者C++
如果不会JAVA或C++的话,那更建议通过做算法题,顺便学习一下。
如果想在编程的路上走得更远,掌握一门重语言是十分重要的,学好了C++或者Java在学脚本语言会非常的快,相当于降维打击
反而如果只会脚本语言,工作之后在学习高级语言会很困难,很多东西回不理解。
所以这里建议特别是应届生,大家有时间就要打好语言的基础, 不要太迷信用10行代码调用一个包解决100行代码的事,
因为这样也不会清楚省略掉的90行做了哪些工作。
这里建议大家 在打基础的时候 最好不要上来就走捷径。
简单代码一定要可以手写出来,不要过于依赖IDE的自动补全 。
例如写一个翻转二叉树的函数, 很多同学在刷了很多leetcode 上面的题目
但是leetcode上一般都把二叉树的结构已经定义好了,所以可以上来直接写函数的实现
但是面试的时候要在白纸上写代码,一些同学一下子不知道二叉树的定义应该如何写,不是结构体定义的不对,就是忘了如何写指针。
总之,错漏百出。 所以基本结构的定义以及代码一定要训练在白纸上写出来
后面我在讲解各个知识点的时候 会在给同学们在强调一遍哪些代码是一定要手写出来的

三面 综合技术面

综合技术面 一般从如下三点考察大家。

编程语言

编程语言,这里是面试官考察编程语言掌握程度,如果是C++的话, 会问STL,继承,多态,指针等等 这里还可以问很多问题。

计算机基础知识

考察计算机方面的综合知识,这里不同方向考察的侧重点不一样,如果是后台开发,Linux , TCP, 进程线程这些是一定要问的。

项目经验

在项目经验中 面试官想考察什么呢
项目经验主要从这三方面进行考察 技术原理、 技术深度、应变能力
考察技术原理, 做了一个项目,是不是仅仅调一调接口就完事,之后接口背后做了些什么么? 这些还是要了解的
考察技术深度,如果是后台开发的话,可以从系统的扩容、缓存、数据存储等多方面进行考察
考察应变能力,如果面试官针对项目问同学们一个场景,最为忌讳的回答是什么?“我没考虑过这种情况”。 这会让面试官对同学们的印象大打折扣。
这个时候,面试官最欣赏的候选人,就是尽管没考虑过,但也会思考出一个方案,然后跟面试官进行讨论。
最终讨论出一个可行的方案,这个会让面试官对同学们的好感倍增。
通常应届生没有什么项目经验,特备是本科生,其实可以自己做一些的小项目。
例如做一个 可以联机的五子棋游戏,这里就涉及到了网络知识,可以结合着自己网络知识来介绍自己的项目。
已经工作的人,就要找出自己工作项目的亮点,其实一个项目不是每一个人都有机会参与核心的开发。
也不是每个人都有解决难题的机会,这也是我们在工作中 遇到难点,要勇往直前的动力,因为这个就是自己项目经验最值钱的一部分。

四面 boss面

技术leader面试主要考察面试者两个能力, 解决问题的能力和快速学习的能力

考察解决问题的能力

面试官最喜欢问的相关问题:
  • 在项目中遇到的最大的技术挑战是什么,而你是如果解决的
  • 给出一个项目问题来让面试者分析
如果你是学生,就会问在你学习中遇到哪些挑战, 这些都是面试官经常问的问题。
面试官可能还会给出一个具体的项目场景,问同学们如何去解决。
例如微信朋友圈的后台设计,如果是你应该怎么设计,这种问题大家也不必惊慌
因为面试官也知道你没有设计过,所以大家只要大胆说出自己的设计方案就好
面试官会在进一步指引你的方案可能那里有问题,最终讨论出一个看似合理的结果。
这里面试官考察的主要是针对项目问题,同学们是如何思考的,如何解决的。

考察快速学习的能力

面试官最喜欢问的相关问题:
  • 快速学习的能力 如果快速学习一门新的技术或者语言?
  • 读研之后发现自己和本科毕业有什么差别?
在具体一点 面试官会问,如果有个项目这两天就要启动,而这个项目使用了你没有用过的语言或者技术,你将怎么完成这个项目?
换句话说,面试官会问:你如果快速学习一门新的编程语言或技术,这里同学们就要好好总结一下自己学习的技巧
如果你是研究生,面试官还喜欢问: 读研之后发现自己和本科毕业有什么差别?
这里要体现出自己思维方式和学习方法上的进步,而不是用了两三年的时间有多学了那些技术,因为互联网是不断变化的。
面试官更喜欢考察是同学们的快速学习的能力。

五面 hr面

终于到了HR面了,大家是不是感觉完事万事大吉了,这里万万不可大意,否则到手的offer就飞掉了。
要知道HR那里如果有十个名额,技术面留给通常留给HR的人数是大于十个的,也就是HR有选择权,HR会选择符合公司文化的价值观的候选人。
这里呢给大家列举一些关键问题

为什么选择我们公司?

这个大家一定要有所准备,不能被问到了之后一脸茫然,然后说 就是想找个工作,那基本就没戏了
要从技术氛围,职业发展,公司潜力等等方面来说自己为什么选择这家公司

有没有职业规划?

其实如果刚刚毕业并没有明确的职业规划,这里建议大家不要说 自己想工作几年想做项目经理,工作几年想做产品经理的
这样会被HR认为 职业规划不清晰,尽量从技术的角度规划自己。

是否接受加班?

虽然大家都不喜欢加班,但是这个问题 我还是建议如果手头没有offer的话,大家尽量选择接受了
除非是超级大牛手头N多高新offer,可以直接说不接受,然后起身潇洒离去

坚持最长的一件事情是什么?

这里大家最好之前就想好,有一些同学可能印象里自己没有坚持很长的事情,也没有好好想过这个问题,在HR面的时候被问到的时候,一脸茫然
憋了半天说出一个不痛不痒的事情。这就是一个减分项了

如果校招,直接会问:期望薪资XXX是否接受?

这里大家如果感觉自己表现的很好 给面试官留下的很好的印象,可以在这里争取 special offer,或者ssp offer
这都是可以的,但是要真的对自己信心十足。

如果社招,则会了解前一家目前公司薪水多少 ?

这里大家切记不要虚报工资,因为入职前是要查流水的,这个是比较严肃的问题。
其实HR也不会只聊很严肃的话题, 也会聊一聊家常之类的,问一问 家在哪里?在介绍一下公司薪酬福利待遇,这些就比较放松了

总结

这里面试流程就是这样了, 还是那句话 不是所有公司都按照这个流程来面试,但是如果是一线互联网公司,一般都会从我说的这几方面来考察大家
大家加油!
知识星球
notion image
notion image
扫码加入星球
查看更多优质内容
 
 
自我介绍 就是简历的 浓缩版, 3分钟左右,做完自我介绍就好。
可以大体按照时间线来介绍,本科,研究生,都学了什么技术,做了什么项目,参加了什么比赛,去了哪里实习,等等。
例如,我是XX,家在XX,本科就读于XXX,大一的时候参加了XX比赛,取了XX成绩,之后开始学习XXX技术,并尝试用XX技术来做一个项目, 同时我也 获得了XXX奖学金,平时喜欢研究XX技术,经常逛XX论坛,也经常自己写一些技术总结,经常看相关的书。 兴趣爱好是XXX。
去了XXX公司实习,做了XX事情,这段经历也让我学习了XXX 。
研究生的方向是XXX,主要解决XX环境下的XXX问题。 但自己对XXX技术更感兴趣,所以现在选择了XX方向,等等。
 

测评

看到星球里 不少录友在做 各大公司在线测评, 做在线测评 最关键的地方就是要 保持人格统一,个性统一。 例如 刚开始问:对加班排不排斥,你回答:不排斥 。后面问:你的个人生活是否丰富,你回答 :很丰富,什么琴棋书画都上来。 这就是 个性不统一的, 加班 怎么能 生活丰富呢? 对吧,会认为 你大概率是不能接受加班的,就很容易挂。 个性评测,最喜欢的就是 没有个人生活,可以拼命加班,热爱工作,对技术有执着追求。 大家可以往这个人设上来回答。 要保持前后统一!
 

实习经历

实习都做了什么。 实习中遇到了哪些问题(技术上,开发流程上,部门沟通上)。 你是如何解决这些问题的。 实习中收获了什么 技术上成长 (学习了哪些技术组件,自己有没有去深挖) 代码风格上 (如何写出易于维护的代码) 开发流程上 (单元检测,打日志,Git团队合作) 对业务理解能力上 (如果把业务场景转为系统设计转为工程代码,都考虑了哪些问题)
也可以适当把同事工作的内容写自己简历上,但前提是自己一定要研究清楚,否则就是给自己挖坑
「实习收获」模板写法:(不建议原封不动的抄,很容易重复) ,建议根据自己的实习内容,学到的具体技术来写。
模板写法一:
对团队开发的流程有了更加深刻的理解,提升了自身的技术水平,学会了技术文档的编写,锻炼了开发的思维,更加注重程序的可维护性、模块化和可读性,是自己明白了快速学习新知识并将其运动到业务的重要性。
模板写法二:
熟悉了企业项目的开发流程,提升了个人能力,其中包括但不仅限于:快速接受新事物代码规范、良好的开发习惯(如先画整体架构图)、团队协作(如及时沟通)、问题的快速定位等。 最后编辑:2023-08-18 16:07

自我评价

一般来说 「自我评价」都是写在简历最后面,如果学历不高,可以在「自我评价」上好好下功夫把「自我评价」放在最前面。
很多录友写「自我评价」是这样的:
有较强的适应能力、学习能力、抗压能力、自我管理能力。工作 态度认真负责,具有良好的团队合作精神,生活态度乐观开朗, 积极向上。爱好跑步、爬山、钓鱼、羽毛球等。喜欢做有挑战的 事,遇强则强,压力越大,激发的能力越大
或者是这样的:
具有较强的学习能力,善于发现和思考问题,对工作认真严谨;乐观向上,具有团队协作能力。
总之就是写了,和没写区别不大。
我给大家列几个点,可以从信息检索能力,动手能力,解决问题能力 等这几方面来说,例如这样:
  • 有较强的信息检索能力,擅长坚决疑难杂症,通过Google/Github/StackOverflow等国外论坛/文档解决技术问题。
  • 动手能力强,有探索精神,拆过路由器,笔记本,组装过PC,很早就用过XXC,最早的一批XXX用户。尝试使用各个云服务的产品,对象存储,云服务器,CDN 等等。
  • 在开发中对待问题具有认真求索的精神,能够在短时间内解决问题并理解知识点。并且自身非常细心,严格要求自己规范性的书写代码,这让我少写了很多 bug。
我也是看到有录友这方面写的不错,给大家分享一下, 当然以上仅仅是一个参考,可以在 「自我评价」中写一方面,写几句话,甚至不写,都是可以的,也取决于自己简历的篇幅。

项目经历

本文我给出,C++和java 以及前端项目的具体写法,其他语言的话,也可以参考:
看了一位录友的简历。
【项目经验】都堆在一起了。
notion image
建议【项目经验】分 「项目描述」「个人工作」「个人收获」这三块来写,不要堆在一起。例如这样:
notion image
或者在写一写「项目难点」例如这样:
notion image
至于「技术栈」可写可不写。例如有的同学在【项目经验】中把技术栈都写出来了,例如这样:
notion image
这样写的好处是让面试官快速了解,你这个项目的技术栈。缺点是列出一大堆技术,怕面试官详选一个细问起来,自己在回答不上来。
不写 「技术栈」的话就在 「个人收获」 写一写自己使用某一技术的心得,这样把面试问题缩小到自己可以把控的点上。
例如这样:
notion image
前端项目写法:
notion image

专业技能

简历中的【专业技能】应该这么写!

notion image
Carl2022年02月08日 21:00
给不少录友看过简历,我专门说一说简历中的【专业技能】这一栏应该怎么写。
很多同学【专业技能】这块写的很少,其实不是掌握的少,而是没有表达出来。
例如有的同学这么写:
notion image
notion image
notion image
notion image
这些【专业技能】都写的很少,其实是可以在丰富一些的。
我来给大家拓展一下、
  • 熟练C++,(列举C++的若干知识点),了解 Java,python,go (适当补充对这些语言的理解)
  • 熟悉常见设计模式(例句一些设计模式)
  • 熟悉linux操作系统vim开发环境,(列举网络编程相关知识,例如epoll,socket等等)
  • 熟悉网络,(列举网络协议相关考点,tcp/ip,http, https, 三次,四次握手,流量控制等等)
  • 数量掌握数据结构与算法(列举常用算法,最好搞透一个算法,说对该算法有独到见解)
  • 数量使用Git,等版本控制
  • 以上为公共写法,下面可以在补充自己的其他领域的内容
针对以上这个模板, 再来补充相关内容: (可以缩小面试官提问范围,把问题具体一点,你也可以有针对性的准备)
  • 熟悉C/C++,熟练使用C的指针应用及内存管理,C++的封装继承多态,STL常用容器,C++11常用特性(智能指针等) ,了解 Python,Gtest等。
  • 熟悉常用设计模式(单例模式,工厂模式等)
  • 熟悉Linux下vim开发环境,了解网络编程,IO多路复用,epoll等等。
  • 熟悉OSI五层网络模型,熟悉TCP/IP,UDP,HTTP/HTTPS,DNS等网络协议,熟悉TCP三次握手,四次挥手,流量控制,拥塞控制等手段。
  • 熟悉操作系统的进程通信、死锁、内存管理等知识。
  • 熟练使用 MySQL,熟悉 MySQL 索引、事务、存储引擎、锁机制。
  • 熟悉常用的数据结构(链表、栈、队列、二叉树等),熟练使用排序,贪心,动态规划等算法。
  • 熟悉使用Git,vscode工具使用。
但需要注意的是,这里写的点,自己一定要熟练掌握,因为简历上写的,面试官一定会问。
这样有一个好处,就是 缩小面试官的问题范围, 只要简历上写的,你都准备好了,那么简历上的知识点面试官一定会问,这样你就掌握了主动权。
举一个例子,如果简历上直写:熟悉C++。其他都没介绍,那么面试官指定围绕C++漫天遍野的问起来了,你也猜不透面试官想问啥。
如果简历写熟悉C/C++,熟练使用C的指针应用及内存管理,C++的封装继承多态,STL常用容器,C++11常用特性(智能指针等)。那么面试官基本上只会问,内存管理,多态,STL和C++11的一些特性, 这样你就把面试官的问题都圈在可控范围内,从而掌握主动权!
这一点很重要,希望大家要有这个思路,去写自己的简历。

java 版本

不少同学是java的,这里我在给出一个java的版本。
  • 熟练掌握Java基础,集合等相关知识,了解常见的设计模式。
  • 熟悉JVM的垃圾回收机制、类加载机制及Java的内存区域。
  • 熟悉Java并发编程,掌握JUC中常用的工具类,如ConcurrentHashMap等,熟悉多线程,线程池,Java内存模型。
  • 熟悉OSI七层模型和TCP/IP四层体系分层结构,掌握常见网络协议,如HTTP/HTTPS 、TCP、UDP、DNS等。
  • 熟练使用 MySQL,熟悉 MySQL 索引、事务、存储引擎、锁机制。
  • 熟悉操作系统的进程通信、死锁、内存管理等知识。
  • 熟悉Redis数据类型使用场景和内部实现,熟悉持久化和过期淘汰策略,熟悉缓存高并发场景,比如缓存穿透、缓存击穿、缓存雪崩。
  • 熟练使用Spring Boot、Spring、Mybatis等常用框架,熟悉 Spring IOC 、AOP 原理,了解 Nacos、Zookeeper 等常见组件。
  • 掌握 Linux 常用命令,如 netstat 、grep、top、chmod、find 等。

前端写法

  • 熟练掌握 HTML、CSS 并能精确还原设计稿
  • 熟悉 HTML5 和 CSS3,熟练使用 CSS3 弹性布局等,能配合媒体查询实现响应式布局、自适应布局
  • 熟练掌握 JavaScript,理解作用域、闭包、构造函数、事件委托、异步加载等
  • 熟悉 ES6 基础语法、箭头函数以及 ES6 模块化语法,了解 promise
  • 熟悉 JQuery、Bootstrap 等前端开发框架进行前端项目开发
  • 熟悉 less,熟练使用 less 语法
  • 熟悉 Vue、Vuex、Vue-Router、Vue-Cli 等 vue 相关开发技术
  • 熟悉 React、React-dom、React-router、Redux 等相关开发技术,熟悉 dva 数据流方案
  • 熟悉 Echarts 等可视化工具
  • 了解 node.js 及 koa2 框架,能和前端实现简单数据交互

go后端写法

  • 熟练掌握GO语言,了解map, struct, slice, channal,GMP模型调度器,gc垃圾回收,内存逃逸等底层原理;
  • 了解掌握go-micro,gin,grom, grpc,protoc等框架使用;了解Python,Java等其他编程语言
  • 熟悉计算机网络原理,了解TCP,UDP,HTTP,HTTPS等网络基础知识
  • 熟悉使用MySQL数据库(InnoDB,MyISAM储存引擎)及数据库管理工具Navicat,熟悉InnnoDB储存引擎 的底层框架及MVCC多版本并发控制
  • 了解Redis等非关系型数据库
  • 掌握操作系统进程,虚拟内存,锁,调度算法,多核缓存一致性等概念
  • 掌握IO复用并发模型,Linux系统命令及云服务器项目部署算法相关。
  • 熟悉基础数据结构,掌握多种排序,动态规划,二叉树等算法
  • 微服务相关:了解基础微服务架构,服务网格架构
  • 团队相关:熟悉使用Git以及使用Github/Gitlab仓库进行协作开发

算法岗

算法岗更强调的是对 机器学习那一套的学习。但如果 对计算机基础也了解的话,也好也写上,以下我就列一列 计算机学习相关的。
  • 熟悉python编程
  • 熟悉基本的机器学习算法(SVM、决策树、K均值聚类等)
  • 熟悉基本的图像处理算法、熟悉使用OpenCv的基本算法
  • 熟练掌握深度学习框架PyTorch,了解TensorFlow
  • 熟悉深度学习目标识别算法原理(Faster R-CNN、Cascade R-CNN、DetectoRS、YOLO系列)以及深度学习语义分割
  • 算法原理(UNet、DeepLabv3+系列)

测开岗

  • 熟悉 linux 常用命令,如:文件操作、权限管理、进程等
  • 熟悉 c/c++、python 编程语言,了解 stl 常用容器,熟悉面向对象模式
  • 熟悉 mysql 数据库,了解索引、事务、隔离级别 熟悉计算机网络知识,
  • 了解 tcp/udp、http\https 等基本的网络协议
  • 了解 postman,fiddler 软件测试日常工具的使用
  • 掌握软件测试基础理论,测试用例编写方法
  • 熟悉自动化测试技术,以及自动测试工具 QTP 的使用;
  • 熟悉性能测试技术,以及性能测试工具 loadrunner 的使用;

大数据

  • (Java基本技术栈和计算机基础,参考上面Java后端的写法)
  • 了解 hadoop 生态圈相关组件(hdfs、yarn、mapreduce 编程模型)。
  • 了解 kafka 消息系统,了解 kafka 架构组成、存储机制、生产者消费者相关内容。
  • 了解 spark 计算框架,熟悉 RDD 算子的使用,了解 spark shuffle 机制、数据倾斜、作业提交流程等

Android

1.有扎实的 Android 开发基础,包括生命周期,事件传递机制,自定义 view,动画等;
2.熟练掌握 Android 消息机制 Handler,及其相关源码实现;
3.熟练掌握 Android 进程间通信的各种实现,包括Bundle、Socket、Binder、文件共享;
4.熟练掌握 Android 系统的启动过程,应用的启动过程;
5.熟练掌握 Android 系统服务,包括AMS,PMS,WMS等;
6.熟悉 EventBus、Glide、LeakCanary 等三方库的源码;
7.熟悉 Android 应用性能优化,包括内存,GPU,网络等方面;
8.熟悉 Java 数据结构的源码实现,比如ArrayList、HashMap;
9.熟悉 JVM 的 GC 机制、类加载机制及内存区域;
10.熟练掌握 TCP/IP 体系分层结构,熟悉常用网络协议,如HTTP/HTTPS,TCP,UDP 等;
11.熟练掌握 Flutter 开发,理解 Flutter 中的Widget tree、Element tree 等基础概念;
12.熟练掌握 Flutter 混合 Android 开发,有插件开发经验;
 
 
 
 

Comments