成电大佬的C++面经

举报
野猪佩奇996 发表于 2022/01/23 00:45:00 2022/01/23
【摘要】 mark自牛客网上的成电大佬面经。 2020秋招应届生,非科班,无实习,准备了半年,拿到了鹅厂和菊厂的提前批开发岗offer。在此,非常感谢牛客网提供的平台和各位大佬的相助,分享一篇C++学习路线...

mark自牛客网上的成电大佬面经

2020秋招应届生,非科班,无实习,准备了半年,拿到了鹅厂和菊厂的提前批开发岗offer。在此,非常感谢牛客网提供的平台和各位大佬的相助,分享一篇C++学习路线和学习项目反馈牛客网,希望对大家有帮助。

作为非科班转行C++的大多数小伙伴来说,一开始更多的关注点是不知道怎么准备,不知道看什么想知道面试官考什么,然后有针对性的学

在牛客网潜水这么久,很多小伙伴都在求面经,其实更多的时候面经意义没有特别大。这里,结合我的秋招经历说几句实话

  • 面试官没有一成不变的提问方式,每个部门,甚至每个组对相同职位的理解和面试的难度,广度和深度都有不小的差异。
  • 面经是锦上添花,不是雪中送炭。寄希望于面经通过面试的概率比较低,这种情况只适用特别小的公司,因为面试官就那几个人,稍微有点规模就不适用。
  • 只要你不停止找工作,学习永远是无底洞,学是学不完的...不要寄希望于面试的全都会,那很难。反过来想,如果面试官问的你都能回答,那么你还有必要去这个公司吗?
  • 我还没准备好,怕面试答不上来怎么办。没有万事俱备的事情,等你全部准备好了才去面试,估计秋招都结束了。
  • 没必要把每一次面试都当做实战,给自己过大的压力。有些面试可以当做实战前的演练,大家都不认识,面试不好有什么关系呢?

去年3月份开学后,我确定了就业方向,打算找C++后台开发的相关工作,但当时基础太弱,根本不知道如何准备。经常逛知乎,牛客网,CSDN,每每看到一个学习资源和路线后就抓紧收藏,如获至宝。

资料是越存越多,如同找到了一个学习列表,但内心更多的是焦虑多过开心。一方面找到了学习方向和路线,内心狂喜;另一方面发现里面提到的知识点几乎全都不会,不知从何看起。

现在回想当时为什么焦虑,是因为不会吗?可能是,但更多的应该是,铺天盖地的知识点,一头雾水,不知道从何学起。有些知识点不会,我可以学,但没有路线,能否坚持、学习效率和学习产出都是未知数

大部分学习路线都给了推荐的书,也给了知识点,但要怎么学,先学什么,后学什么,学完有什么项目可以练手检验?这些从回答里没看到特别具体的。

去年秋招自己和同学一起慢慢摸索过来,在这里先把我秋招资源和总结链接放上,希望能对各位有用,没有密码,按需自取就好了。如果链接失效,添加个人微信:twomonkeyscluber反馈给我吧,牛客网回复消息不太及时:

下面是我自己准备C++的学习路线,只针对初学者,不是长期职业发展,不是长期职业发展,不是长期职业发展!!!

讲道理,前期可以根据某个路线看,后期很难将四部分割裂开,具体到哪段时间只看哪部分是不现实,也是不合理的,都是交叉进行。

这里分为四个部分来介绍,可以当做早期的路线进行学习,依次是C++语言,计算机基础知识,项目基础知识和项目实践


语言

语言部分,我平时做图像处理的项目有接触到C++,但大都在关注图像算法,语言特性关注很少。基本都是在用C++写C,没有用到任何面向对象的东西,全是面向过程。

所以,在备战秋招的时候,语言相当于重新学习了一遍。我不会推荐大家一上来就抱着C++ Primer看,这种大部头“字典”很难一次看下去,非常容易打击信心。建议大家从视频入手,涉及到编程细节可以翻阅一下“字典”。我个人的学习方针是视频为主,书籍为辅。

  • C++ Primer Plus
    • 集中学习该书的1~8章,涉及C语言基础语法及指针、结构体的使用。
  • C和指针
    • 该书全面深入的剖析了指针的概念与使用,是C语言的进阶。
  • C++ Primer
    • 作为C++查询的工具书,相当于新华词典,里面会涉及C++的很多技术细节,实际工程中用到的并不会太多。平时遇到问题可以查询该书,另外也可以作为面试的参考书。
  • STL源码解析
    • 涉及C++标准模板库的源码实现,其中vector、map的实现需要重点关注,比如内存分配,底层数据结构等。

下面这张思维导图,基本覆盖了我所学习的语言部分。


计算机基础知识

对于非科班转计算机的同学来说,计算机基础是最薄弱,也是最难深入理解的一部分。但,这部分知识,在实际工作中不会像语言那样,学了就立马见效,往往在语言层面所无法触及,比较棘手的地方有用。同时,也会对我们理解C++语言的底层运行机制有帮助。

坦白讲,我的水平也很弱,所学的知识,也仅仅能够应付面试和简单的项目。为了备战秋招,我所学习的基础知识主要包括数据结构,算法,操作系统,计算机网络和设计模式

  • 数据结构
    • 视频为主,书籍为辅。看小甲鱼的数据结构,该视频以大话数据结构为蓝本讲解,了解链表,栈,队列,二叉树哈希表,堆等基础的数据结构。
  • 算法
    • 推荐直接刷题,先临摹再实战。推荐书籍剑指offer,左程云大神的程序员代码面试指南;刷题网站推荐牛客网。
  • 操作系统
    • 推荐书籍学习,重点看深入理解计算机系统的6,7,9,10章。主要理解线程,进程,虚拟内存及锁机制。
  • 计算机网络
    • 推荐书籍学习。主要理解TCP/UDP/HTTP三种协议。其中TCP/UDP以谢希仁老师的计算机网络为主,HTTP以图解HTTP协议为主。
  • 设计模式
    • 推荐书籍学习,大话设计模式。设计模式可以放在所有知识的最后进行学习。

下面这张思维导图,基本覆盖了我所学习的计算机基础部分。


项目基础知识

谈到项目,大部分搞C++的同学会很头痛,不像Java那样,学完之后一堆商城啊,秒杀系统之类的项目可以练手。很多的时候,发现学完C++语言和计算机基础知识后连个练手的东西都没有,无从下手,更害怕面试的时候没有项目经验。

我想说,你不是一个人有这种感觉,这是C++偏底层语言所决定的,但同时也是因为你学习的太底层,但凡你学一点网络编程都不会有这种想法,哈哈。

如果学完了网络编程,你可能会有这种错觉,比如痴迷于即时通信,沉醉在网站后台...当然了,更多时候可能会感叹,好难,(逃。

其实,只要你有了对应的基础,学习一个有详细文档的项目,并不难。这里的项目基础知识,是所有后台开发必备的知识,分别是Linux基础命令,系统编程,网络编程和数据库。

  • Linux基本命令
    • 该部分主要以看视频为主,记住常用的即可,其余的在实际使用时即用即搜。
  • Linux系统编程
    • 在Linux下进行编程,会涉及到与系统的交互,内存访问,需要学习Linux系统API用法。
  • 网络编程
    • 视频为主,书籍为辅。书籍先看tcp/ip网络编程查漏补缺,补齐网络编程基础知识,然后看Linux高性能编程。
  • 数据库
    • 视频为主,书籍为辅。MySQL和Redis数据库是当前面试的热门,书籍先看MySQL必知必会,再看Redis设计与实现。

下面这张思维导图,基本覆盖了我所学习的项目基础知识部分。


项目实践

学C++怎么能不会网络编程呢?会网络编程怎么能没有项目呢?

刚入门C++网络编程时,我们都会学习一些基础API或者书上的回射服务器、聊天室、简单HTTP服务器实现。

学完上述基础后,大部分小伙伴都摩拳擦掌想做一个像样项目,但看来看去也不知道该怎么入手,或者不知道一个像样项目的框架是什么。

我建议刚开始不要上来就钻网络框架,也不适合入手成熟复杂的项目,最好是找一些基础开源项目,根据自己的想法在其基础上添砖加瓦或者重新写一遍,有了这些基础后,再谈精进。

其实,对于初学者来说,最难的就是找到一个容易入门的,基础的后台开发项目

这时候,很多人都会推荐推荐陈硕大佬的书和木铎,当然还有linya大佬的Webserver,我也非常推荐。

相信很多同学都看到了linya大佬的服务器和chenshuo的木铎,两个项目都是比较完善,但相对于刚刚入门网络编程想大展身手的小伙伴来说,学习曲线比游双的Linux高性能服务器编程要稍微陡峭一些。

这里,我建议,在读陈大佬的书之前,可以先看一下游双的Linux高性能服务器编程,将书上的代码和例程跑一遍,再去看muduo,肯定会更有收获。

C++后台开发,一般的是指服务器端开发,涉及的模型有C/S模型和B/S模型。其中C/S模型更多的是关注TCP协议,服务器端和客户端都需要自己完成,数据包也需要自己设计;B/S模型更多的关注HTTP协议,因为以浏览器充当客户端,并且有现成的HTTP协议,所以重点在服务器端。

我们看大多数书上的讲解目录,都是先讲C/S模型,再讲B/S模型。相对于入门来说,书上的回射服务器和聊天室程序更容易入门和理解,但要想做一个拿得出手的C/S模型项目,个人觉得还是不容易的。

从面试做项目的角度,我个人更倾向先从简易的B/S模型入手,然后再过渡到简易的C/S模型。这样我们可以跳过客户端和数据包的设计,将更多重点放在服务器端,尽快完成一个小demo,提升初学者的信心。

在这里我将去年面试秋招时候我所准备的项目分享给大家,希望对刚入门的小伙伴有所帮助,这个项目目前还在更新和维护。

我秋招的时候,读完游双的高性能Linux服务器编程后,攒了一个Linux下C++轻量级Web服务器项目点击这里直达)。

  • 使用线程池 + epoll(ET和LT均实现) + 模拟Proactor模式并发模型
  • 使用状态机解析HTTP请求报文,支持解析GET和POST请求
  • 通过访问服务器数据库实现web端用户注册、登录功能,可以请求服务器图片和视频文件
  • 实现同步/异步日志系统,记录服务器运行状态
  • 经Webbench压力测试可以实现上万的并发连接数据交换

Linux下C++轻量级Web服务器虽然是toy级别的项目,但只要你按照README中的步骤运行,经多个同学测试,一次就可以跑通,这将极大增强初学者做项目的信心。

  • 注册演示
  • 登录演示
  • 请求图片文件演示(6M)
  • 请求视频文件演示(39M)

测试结果

Webbench对服务器进行压力测试,在ET非阻塞和LT阻塞模式下均可实现上万的并发连接.

  • ET非阻塞
  • LT阻塞
  • 并发连接总数:10500
  • 访问服务器时间:5s
  • 所有访问均成功

框架

项目中所涉及的模块和知识点,我进行了整理,罗列在下面,每个模块也对前面学习的知识进行了理解和运用。

  • 线程池
    • 涉及线程,锁机制。使用一个工作队列完全解除了主线程和工作线程的耦合关系:主线程往工作队列中插入任务,工作线程通过竞争来取得任务并执行它。
  • HTTP请求与响应
    • 涉及Linux系统编程,网络编程,TCP和HTTP协议。根据状态转移,通过主从状态机封装了http连接类。其中,主状态机在内部调用从状态机,从状态机将处理状态和数据传给主状态机。
  • 注册登录
    • 涉及少许网页html知识。实现用户名和密码校验,另外通过html文件设置action实现跳转。
  • 定时器
    • 涉及Linux系统信号及数据结构的使用。由于非活跃连接占用了连接资源,严重影响服务器的性能,通过实现一个服务器定时器,处理这种非活跃连接,释放连接资源。
  • 数据库连接池
    • 涉及MySQL数据库。建立数据库连接池,通过重复使用这些已经建立的数据库连接,解决频繁建立连接的缺点,从而提高系统性能。
  • 同步/异步日志系统
    • 涉及设计模式,自定义阻塞队列。同步/异步日志系统主要涉及了两个模块,一个是日志模块,一个是阻塞队列模块,其中加入阻塞队列模块主要是解决异步写入日志做准备。
  • 压力测试
    • 阅读Webbench源码,对进程加深理解。通过Webbench创建多个进程,每个进程通过HTTP连接访问服务器,完成压力测试。

再次强调,代码大部是书上的,我只是整理成一个较为完善的项目,并加了一些功能,对所有做了一些注释和讲解。

如果对上面的项目模块原理有疑问,大家优先查阅游双的Linux高性能服务器编程,还有些模糊的话,查看系列讲解,目前周更,已更新到08定时器部分。

文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。

原文链接:andyguo.blog.csdn.net/article/details/112646629

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。