algorithm-base/animation-simulation/写写水文/秋招心得.md

12 KiB
Raw Blame History

背景

某中上985传统工科本硕本科期间只上过大学生程序设计和微机原理两门计算机相关的公共基础课研一开始准备转行恰好研一暑假因为疫情无法返校遂背着老师投递了华为中央软件院的暑期实习非应届投递暑期实习是有风险的华为对计算机基础要求比较低对学历背景较好的非科班同学比较友好。研二暑假通过了百度字节阿里腾讯美团携程的后端开发岗实习去了阿里淘系实习秋招目前收获阿里字节拼多多美团网易意向书腾讯华为米哈游录用排序中。在春秋招的面试基本没有挂过。

个人心得

基础知识:

  • 基础知识是非科班和科班区别很大的一部分。科班有一整套系统的计算机学科培养体系。我在准备基础的时候是按照考研课程进行系统学习的。考研的基础课程能让你很大程度地接近科班学生的基础。推荐b站的王道考研课程可以二倍速快速过一遍配合讲义标注一些重点日后可以反复观看。这些基础不仅能方便日后学习编程语言和扩展知识时的理解在秋招面试中也经常会涉及。
  • 这里重点提一下算法 算法和数据结构课程中涉及的知识都是非常基础的一定要熟稔于心。在这个基础上可以刷leetcode题来提升自己的能力。通常刚开始刷会有一些曲折比如遇到的题经常不会然后一道题写大半天。我一般遇到不会的题超过10分钟没思路就会看题解然后按题解的思路再尝试自己写出来。如果实在写不出来就照着题解自己敲一遍仔细领会每一句代码的意图。然后再做标记第二天或者过几天我会再尝试自己写一遍。重复几遍就会了这样至少能保证你刷到过的题你都能掌握。刷题顺序的话推荐按分类刷。我个人用的大力出奇迹直接按题号顺序刷但是一开始刷的会有点吃力。另外的话可以刷一刷每日一题和周赛。春招前我大概刷了600+的题周赛全国排名3000+。

编程语言

C++和C语言其实很像。上述算法与数据结构课程的或者说理工科学校应该都会有的程序设计类的基础课都会教一些C语言的基础。在这些基础上看下列书应该就足够了。下面的书我基本上都看过一遍或者挑章节看过受益匪浅。当然语言还是要多用多写可以通过刷题和项目来反复巩固和记忆。

书籍推荐
  • 《C++primier》第五版比较厚但是很全面可以慢慢看
  • 《STL源码剖析》可以配合b站侯捷的视频一起食用讲得非常好。
  • 《深入理解C++对象模型》,看前几章应该就够了
  • 《Effective C++》,个人感觉书上的知识点有些陈旧
  • 《Modern Effective C++》有C++11新特性
  • 《C++并发编程实战》学习并发的基础知识就够了书在实现上用的C++11多线程但在实际的开发中使用的大多是posix多线程。
C++岗位的选择

C++的岗位相比与java会相对少一些的。java拥有更好的生态使得它在业务开发上可以更灵活和方便不过校招一般不会对语言做限制。如果大家在秋招中想继续从事c++相关的开发那可以留意一下以下C++岗位。可以去看看官网对应的JD然后对自己感兴趣的岗位做针对性的查漏补缺

  • 游戏服务端和客户端网易互娱和雷火、米哈游、腾讯IEG
  • 推荐和搜索引擎阿里和pdd两家java为主的大厂在这块用的都是C++
  • 机器人、自动驾驶开发无人驾驶企业华为车BU
  • 音视频流开发比如B站
  • 用C++比较多的互联网企业:腾讯和百度

扩展知识

这个部分我就介绍以下自己看得一些视频和书,给大家做参考。

linux

linux是后端开发工程师必知必会的操作系统而且要对底层原理有详细的了解。

  • 《深入理解Linux内核》可以结合操作系统课程对照着来看有些部分在实际实现上和操作系统课程所讲的有些出入。
  • 《UNIX环境高级编程》 堪称圣经的APUE介绍的是unix系统的基本原理和系统调用可以说是必看。觉得书太厚了看不下的推荐一个B站的课程,讲得非常好,可以跳过前面数据结构的部分直接看后面的。
  • 《UNIX网络编程》介绍了UNIX网络方面的原理和调用方法是对APUE的扩充。如果这本书看不下去的可以直接看下面这本。
  • 《Linux多线程服务端编程:使用muduo C++网络库》介绍了如何使用C++开发高性能服务器,这本书个人认为写的非常好,我也是照着这本书写了自己的服务器的项目。
  • man手册可以直接在命令行查看系统调用的使用方法
数据库
  • 数据库基本原理B站有很多类似的课程我看的是东南大学的数据库原理及应用
  • 《Mysql必知必会》讲mysql的用法也可以去看B站狂神的视频
  • 《MySQL技术内幕 InnoDB存储引擎》这本书写得非常不错有很多面试常见的知识点
Nosql
  • 《Redis设计与实现》介绍了redis的源码设计redis有很多设计非常巧妙的数据结构以及它在时间和空间上的高性能是怎么做的。总之里面有很多让人印象深刻的点。另外redis本身是用c语言写的所以感兴趣的话还可以直接去看源码。
  • b站狂神讲redis使用讲的也挺好的
GCC+GDB

这部分都是C++开发和调试的辅助工具有些面试比较喜欢问这个b站也有类似视频都大同小异我这部分准备地也不好

  • 常见编译选项
  • GDB原理
  • GDB常用命令
  • 线上进程如何调试
设计模式
  • 常见的设计模式用途和优缺点
  • b站上有设计模式的课程我看的是李建忠的课程,感觉讲得挺好的
分布式系统设计
  • 这部分知道CAP/BASE是啥应该就够了我看了一遍这个,感觉和没看一样哈哈
docker

这部分的话只是自己感兴趣所以看的,面试一般不会问

  • b站狂神的docker教程教你如何使用docker
  • 《自己动手写docker》教你如何实现一个docker以及docker底层的原理。docker是用go写的还可以顺带学一下go照着敲一遍最后写出来还是蛮有成就感的。

关于项目

C++一般都是用来造轮子所以在项目上大多都是偏底层的一些工具。和java选手对比起来在面试中会吃亏一些java选手对高并发实际的业务场景中的问题和解决方法会有更深刻的认识。下面举一些常见的项目

  • 网络库/web服务器基本C++的人手一个牛客也有卖类似的课程我也是参考muduo写的。这个的话最好测一测QPS来体现那能达到的效果
  • 数据库写一个简易数据库这个部分可以看MIT的数据库课程里面的作业就是写一个数据库。除此之外前面提到redis就是用C写的所以也可以用C++写一个类似的简易版非关系型数据库。
  • tinySTL实现STL常用的容器和函数能够对底层数据结构有更清晰的认识。
  • rpcrpc是分布式系统中最重要的一环可以参考Dubbo和grpc实现一个简易RPC
  • flamingo如果时间充裕的话推荐这个写一个类似QQ的软件。github上搜一下就有感觉比较牛逼而且资料和教程都很全。

关于笔试

  • 笔试通常都是ACM模式需要自己处理输入和输出对C++其实不太友好
  • 输入的处理,未给定行数的情况,不知道行数,可以用
	string s;
	while(cin>>s) {
		...
	}//可以读到EOF
  • 万能头文件
#include<bits/stdc++.h>//包含了所有常用的头文件
//牛客和赛马都能用,有些编译器不支持
  • 学点python前面提到笔试对C++其实不太友好比如笔试经常会用到字符分割字符串和数字转换C++可能要写for分割用atoi或者to_string做转换用python就会很方便。再比如一些大数相加用C++只能用字符串或者链表来做加法python就不用考虑溢出
  • 选择合适的数据结构比如之前的笔试题如果按题目的意图可能你要建立链表节点的结构然后针对输入去解析数字构建链表写翻转链表的函数再遍历链表输出。但实际上这题只需要用字符串就可以对整个输入的字符串做reverse再针对每一个数进行一次reverse就可以了。
  • 取巧对于一些输出true/false或者数字的题实在写不出来随便打印一个答案可能就能拿几十分。
//翻转链表
//输入1,23,456,78
//输出78,456,23,1
  • 其他一些辅助手段 一些ACM选手喜欢加一些这样的操作提高码字速度和IO速度但个人感觉对于一般的笔试而言提升效果有限。
//1、cin的效率不如scanfcin会有缓冲区。可以参考ACM比赛时用到的优化方法
//2、用宏定义比如#define pair<int, int> PII这样每次敲定义的时候只要敲PII就够了

#include <bits/stdc++.h>
using namespace std;
//#define ACM_LOCAL
#define fi first
#define se second
#define il inline
#define re register
const int N = 1e5 + 10;
const int M = 5e5 + 10;
const int INF = 0x3f3f3f3f;
const double eps = 1e-5;
const int MOD = 1e9;
typedef long long ll;
typedef pair<int, int> PII;
typedef unsigned long long ull;
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	//solve
}

关于面试

  • 面经非常重要,面试中一半的问题都可以在牛客面经中找到。因此可以找牛客上相关高质量的面经自己做整理然后过一遍。
  • 面试一般分为基础知识项目经历两部分,如果项目经历比较少就会着重问基础,如果面试官对项目经历感兴趣可能全部都会问项目。
  • 项目上每一个点,都要问自己:除了这样做还能怎么做,你为什么选择这样做,这样做的优点是什么,以及这样做的底层是怎么实现的。比如我做的网络库最常见的问题selectpollepoll优缺点选择的原因底层原理。当你回答完之后再往下挖可能就会问epoll为什么用红黑树红黑树的底层原理和优缺点。知识点要学会发散。比如问完红黑树面试官可能会问你其他的树和数据结构比如avl树和红黑树的区别红黑树和快表的区别。再发散问可能问redis为什么用快表不用红黑树。总之在准备面试时也要学会发散地思考
  • 很多时候面试官可能不了解C++或者说投递的岗位不是用的C++所以面试官不会问很多C++的知识,而是会问一些操作系统或者网络或者数据库等通用的知识,因此这些通用的基础知识一定要扎实,否则怎么能比得过那些语言对口的竞争者呢
  • 掌握主动权面试官的问题很多都是从你的角度来问的比如你的简历提到了xxx那么你讲一下xxx吧。再比如你刚刚回答里面提到了xxx那么你讲一下xxx。所以自己是能够掌握一些面试中的主动权的。因此自己掌握的知识点和看过的书都可以在简历上有所体现在简历中的每一个点都足够熟悉不熟悉的不放上去。然后在回答问题中也要尽量回答自己熟悉的点对于不熟悉的点可以快速带过对熟悉的点可以适当展开。
  • 面试过程中要适当反问面试官,了解面试官提问的意图,可也以让他给你做适当的提示。比如一个很泛的问题可能你觉得有好几个方面,所以要了解面试官想让你深入哪个方面。

总结

  • 以上是个人的一点心得,仅供参考,不一定适合所有人。因为自己导师比较放养,给了我很多空闲的时间可以去学习自己感兴趣的东西,也真的非常感谢我的导师,希望能让我顺利毕业哈哈哈。后续我也会整理一些面经,希望能帮助到大家。