写点什么

C/C++ 后台开发需要点亮哪些技能树||(鹅厂为例) Linux 百里

用户头像
赖猫
关注
发布于: 2021 年 02 月 03 日
C/C++后台开发需要点亮哪些技能树||(鹅厂为例) Linux百里

前言

首先一般公司分为前端和后端,前端就是和用户打交道的,负责用良好的视觉效果将数据呈现给用户,广义的前端包括客户端(安卓、IOS)、Web 前端、小程序等。


而与之对应的后端则是负责业务逻辑处理,比如下单、支付等,重在业务流程的处理。


后台一般和后端是一个意思,而服务器开发则稍微广义一点,不仅包含了后台开发,而且也包括支撑整个后台应用的基础开发,比如搜索引擎、微服务、RPC 框架、KV、存储、MQ 等。


后台/后端重在业务处理,是偏向应用层开发,而服务器开发不仅包括应用层开发,更是囊括了整个支撑后台业务的相关组件的开发。


那 Linux C/C++ 服务器/后台开发指的什么呢,其实就是基于 Linux 上 的 C++ 编程。


但是相比 Java 系更强调 Linux 系统编程、网络编程能力,有的还会涉及到服务端底层协议和网络框架开发。


传统的 Java 、Go 后台开发偏向 Web 开发,也就是接收前端请求,通过微服务互相调用,完成业务逻辑处理,然后返回给前端。


实际上在腾讯这边的 C++ 后台开发,也是类似的,本身有非常成熟的基于 C++ 的微服务体系,大多数开发也只需要关注业务逻辑就好,不过还是会要求 Linux 系统编程、网络编程等能力。


后台开发都考察哪些?


什么技术水平,才能腾讯T9(原T3.1)offer?


一般来说 Linux C/C++ 后台开发方向涉及以下这些基础知识:


C/C++ 语言特性和实现原理

计算机网络

网络编程 和 Linux 系统编程

操作系统原理

部分 Linux 内核原理,如内存管理、文件系统、虚拟内存等

Linux 常见命令使用

算法与数据结构

数据库使用及原理

常见 NoSQL 组件,如 Redis、Memcached

版本控制 Git

非必选加分项:


分布式相关,如一致性协议比如 Raft 算法、分布式存储等

docker、k8s 等虚拟化和云计算相关的

系统设计能力,如短链服务、评论服务、Feed 流系统、抢红包、秒杀等



常遇面试考察知识点:


c/c++相关


  • c++虚函数原理

  • 智能指针

  • c 语言如何实现 c++对象以及私有成员

  • c++多态实现

  • new 和 malloc 的区别以及底层实现原理

  • STL 中的 vector 怎么扩容

  • 虚函数指针的初始化过程

  • c++11 原子变量介绍

  • c++11 特性有哪些,说用过的

  • 怎么理解重载与重写

  • 怎么理解 c++中的 static 关键字

  • vector 和 list 的区别

  • c++的内存分配

  • map 与 set 的底层实现

  • 类静态变量的初始化

  • 析构函数可以是虚函数?为什么

  • 深拷贝与浅拷贝

  • 指针常量,常量指针的区别


c 语言语法推荐书籍: 《c 专家编程》《c 与指针》


c++语言语言推荐书籍:《c++ primer》《effect c++》


c++语言 stl 底层原理:《STL 源码剖析》


计算机网络


  • 介绍下 proactor 和 reactor

  • reactor 的组成

  • TIME_WAIT 危害

  • TIME_WAIT 时长,为什么?

  • IP 为什么要分片

  • 项目中说用到线程池,开多大,为什么运用线程池?

  • select 和 epoll 区别

  • select 什么情况返回 0

  • epoll 可读情况有哪些

  • 什么时候需要 TCP 四次挥手?

  • 如何设置非阻塞

  • 什么是零拷贝?

  • tcp 与 udp 的区别以及应用场景

  • 如何设计一个可靠的 udp

  • 粘包如何解决

  • 讲一下拥塞控制和流量控制

  • http 和 https 区别

  • 是否了解中间人劫持原理

  • http 协议格式,几种方法,功能是什么

  • chunk 块了解?介绍下

  • 有 chunk 的时候 contentlength 是什么样子

  • 半连接在哪个阶段

  • 三次握手四次握手详细过程,越详细越好

  • libevent 结构,内部实现

  • tcp 的可靠性体现在哪里

  • ARP 协议工作流程

  • epoll 中的 ET 和 LT 模式

  • 介绍下滑动窗口

  • 指针与引用的区别

  • Accept 发生在三次握手哪个阶段

  • Udp 的接收缓冲区和发送缓冲区和 tcp 的区别

  • http 长连接与短连接的区别

  • udp 包长度

  • 一次 url 访问会经历哪些过程

  • 数据包乱序会处理?

  • seq 为 1000,发送了 1000 个数据,下一个 seq 是多少?

  • syn 如果丢了,重传多少次


tcp/ip 相关推荐书籍:《tcp/详解:1》


熟悉使用 wireshark 捕包工具,加深印象可以使用 python 的一个库,scapy/dpkt.


数据结构相关


  • hash 处理冲突的方法

  • 二分查找及其变种

  • 数组与链表的区别

  • redis 数据结构用过哪些,了解跳表?

  • 红黑树比平衡二叉树有哪些优点

  • 二叉树,b+树,hash,二叉查找树区别

  • 说说红黑树的特性

  • 各种树,排序的时间复杂度

  • 数据库索引,事务,事务级别

  • 不考虑事务的隔离性会出现什么问题

  • 事务隔离级别

  • 索引的类型

  • AC 自动机时间复杂度


数据结构书籍《大话数据结构》


数据库相关


  • 如何提高查询速度?

  • 加了索引就快了?

  • 数据库索引底层结构

  • mysql 与 memcache 的区别

  • mysql 常见三种存储引擎的

  • MySQL B+Tree 索引和 Hash 索引的区别?

  • B+树索引和哈希索引的明显区

  • 非关系型数据库和关系型数据库区别,优势比较?

  • mysql 常见查询优化方案

  • mysql 书籍推荐:《mysql 必知必会》,《高性能 Mysql》


操作系统


  • 进程与线程的区别

  • 多进程与多线程区别,应用场景

  • volatile 和原子变量的区别

  • proc 文件系统

  • 自旋锁与普通锁的区别

  • 虚拟内存

  • 进程的内存分布

  • 栈内存为什么由系统自动分配和释放

  • 守护进程如何创建

  • 进程间的通信方式及其区别,应用场景

  • 死锁条件和解除

  • 进程调度方式

  • 对编译连接的理解

  • 共享内存实现原理

  • 僵尸进程是什么,如何处理

  • 自旋锁在单 cpu 与多 cpu 下的使用

  • 用户态与内核态


操作系统推荐书籍:《深入理解操作系统》,《Linux 内核设计与实现》


Linux 基础知识及应用编程(后台必备!)


  • 如何查看进程打开的文件

  • 介绍下 nm 与 ldd 命令

  • shell 命令查内存,端口 ,io 访问量,读写速率

  • awk grep 具体应用

  • 硬链接与软连接,目录可不可以用硬链接

  • 常见命令 netstat iptable tcpdump top

  • makefile 介绍下(cmake 介绍下)

  • gdb 查看堆栈中所有遍历

  • gdb 查看 shared_ptr 指向的内容

  • gdb 如何调试多进程多线程

  • g++和 gcc 编译出来有什么区别

  • 死锁怎么调试

  • core 文件中是什么,gdb 调试 core 文件

  • 如何读取一个 10G 文件,cat 一个 10g 文件会发生什么


Linux 基础命令推荐书籍:《Linux 就该这么学》


Linux 应用编程推荐书籍《后台开发应用与实践》《Linux 多线程服务端编程》


补充资料:gdb 手册和 makefile 详解


大数问题


有 200 亿 qq,但实际只有 25 亿用户,找到重复的 qq

25 亿 qq 占用内存多大

1-100 万,计算找出所有的质数(计算密集型任务),用单线程与多线程怎么处理

1 个 G 的文件写程序,从 A 机器发送到 B 机器,怎么发?

100G 的文本,每行 80k 还是 80 字符,提示用多个机器,多进程,多线程,求出重复最多的行。一个机器内存 8G,计算每个机器大概分多少?能读取 100G 的文本吗?找重复率前十的文本

三个有序的序列,查找公共的部分,第一次我说用哈希表,他说序列太大,空间复杂度要低点,我说了二分查找,他问三个序列查找的顺序和时间复杂度。(时间复杂度为 N*logN

*logN)

100WURL,如何存储

10 台服务器,100w 用户,如何进行负载均衡,如何有个服务器挂掉了咋办

10000 个数据查找最小的 100 个?时间复杂度?

场景题:QQ 的服务器会保存登录用户的 QQ 号,只要有登录,文件里面就会有记录,现在需要统计哪些 QQ 号登录过,怎么做?(先说了分治用小文件,他说除了这个了,我说 bit 数组,他就问需要多大内存?)


大数问题通常的套路是 hash,分治,布隆,bitmap,如果推荐的话还是上面数据结构相关资料.当然如果能了解下比如 hdfs 文件系统,mapreduce,spark/flink 流式计算最佳哈


手撕算法(递归非递归)


  • 链表有无环判断

  • 实现一个单例模式

  • 给一个字符串判断单词数

  • 开方算法

  • 青蛙跳台阶

  • 常用排序(快排和归并要写吐)

  • 反转链表

  • 两个链表,寻找公共节点

  • 查找字符串中不重复的最长子串

  • LRU

  • 手写求树的深度的代码

  • 手写生产者消费者

  • 编程实现 string 类

  • 两个数组 A,B,A 有的 B 都有,求 B-A;

  • 输入一个字符串,输出它的全排列

  • 统计完全二叉树多少个节点

  • memcpy 实现


算法学习书籍推荐《剑指 offer》,建议三遍哈。


leetcode 分专栏练习几题,不在多,在于精。


针对项目相关


  • 介绍一个你做的比较的项目,几个人做的,担任什么角色

  • 项目的技术点在哪里

  • 项目不足在哪里


你在项目中学到了什么

让你优化项目中的一点,如何做

项目什么架构

测过系统性能吗,挂掉怎么办?

最好是自己做过的项目,即时不是也需要弄明白其架构,为什么这么做,有什么优点,什么优化方案?


场景题


  • 给一个场景,设计一下定时对 url 进行爬虫,比如对新浪 1 个小时爬虫 n 次,然后某些博客可能 1 个星期爬虫 1 次。

  • 给一个场景,设计服务器实现爬虫的 url 去重,如何让多个服务器对一个 url 爬虫指定次数

  • 好多小文件,设计一个服务器来实现如何存储

  • 设计两地高效传文件


这部分


架构/分布式/中间件相关


  • 常用负载均衡策略

  • 一致性 hash 原理

  • 缓存容灾中数据一致性问题

  • 了解 cap 理论吗

  • 介绍下高可用,高性能,可伸缩基本概念。

  • 了解微服务?docker?k8s?

  • Nginx 了解到什么程度,nginx 配置更新实现,事件模型


推荐书籍:《redis 设计与实现》《从 0 开始学架构》《docker 入门到实践》《大型网站技术架构-核心原理与案例分析》


疑惑


还有一个很多选择 C++ 方向同学都存在的疑惑,在这里我也想解释一下:


C++ 语言特性多,又难学,很多都是底层开发才会用到,C++ 就是个坑,是否应该转 Java、Go 呢?


当然不是的,的确在头条、美团、阿里这种业务部门使用 Go、Java 系更多,首先还是那个观点,校招生对于企业来说都是一张白纸,面试官考察的是你的基础知识和聪明度,来决定是否有培养潜力,语言确实不重要。


那你可能会说,明明各种面经上常常出现 ConcurrentHashMap、虚表、虚函数实现机制这样和语言强相关的问题。


在我看来啊,面试深入问一些语言实现细节,其实不是在考你语言,而是看你是否有主动钻研的意识,是不是只停留在应用的层面,同时也借语言考察一些数据结构、操作系统方面的基础知识。


所以呢,我觉得 C/C++、Java、Go 你深入学习哪一个都可以,关键还是找对相应的学习路线,一直坚持学下去,不要每天都停留在我到底是学 Java 好还是 C++ 好这样无解的问题。


而且也有不少 Java 进腾讯需要转 C++,C++ 进阿里、美团需要转 Java 的,这都不是事儿。


那 C++ 目前应用场景有哪些呢?


一句话,对性能或者执行效率要求比较高的应用,比如游戏引擎、infra、推荐引擎、存储等,当然也能拿来写业务(没错说的就是鹅厂),也有做 C++ 客户端开发的,主要是 MFC、QT 等。


说实话,像游戏引擎、infra 这类都是门槛比较高的,并且招聘的数量也有限,一般人很难进,而且目前互联网公司的业务部门大多使用的是 Java、Go 这类语言。


所以 C++ 的需求量是相比 Java、Go 这类少很多的,但是同时学习 C++ 也没 Java 那么多,所以相对来说竞争还没那么大,并且 C++ 学的不错,你同样可以去面阿里、美团这种 Java 技术栈的公司,大厂基本不会限制语言的。


腾讯 T9 职级对应技术能力



Linux、C/C++技术交流群:【960994558】整理了一些个人觉得比较好的学习书籍、大厂面试题、有趣的项目和热门技术教学视频资料共享在里面(包括 C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK 等等.),有需要的可以自行添加哦!~


用户头像

赖猫

关注

还未添加个人签名 2020.11.28 加入

纸上得来终觉浅,绝知此事要躬行

评论

发布
暂无评论
C/C++后台开发需要点亮哪些技能树||(鹅厂为例) Linux百里