复睿智行CC++开发实习面试

线上面试,HR和一位技术的面试官

  1. 自我介绍

  2. 现在研究生学习的方向是什么?

    我还去答区块链,本来就半桶水,还不如直接回答C/C++后端这个方向。

  3. 大数据分析这一块有做过吗?

    我:无

  4. 有了解过现在区块链整个架构体系是什么样的呢?

  5. 在区块链这块有没有接触过云计算的体系结构

    我:不知道

  6. 有没有自己动手尝试做过一些系统或者是编写过一些具体代码的东西呢?

    我:有用C++编写过一个简单的web服务器框架。答的不清楚,说成前面一个线程接收请求,后面一个工作线程处理请求,然后把回应的报文组织起来再发回去。目前实现的功能是客户端只能从服务器这边下载文件,然后中间有用到线程池,主要的部件是存放线程的容器和一个任务队列,一个主线程在前台进行循环检测是否有请求到来,如果有请求到来,就把请求封装成一个任务对象加入到任务队列中,后面的线程是阻塞轮询等待任务的到来,线程从任务队列中取任务的时候要进行加锁,防止冲突,导致一个任务被多个线程获取,任务到来的时候,主线程使用条件变量signal唤醒一个线程,线程池中的工作线程wait去争抢任务

    这个项目的框架总结还是要单独总结出来讲稿,因为讲和写区别还是很大的。

  7. 有没有考虑过采用无锁的方式处理线程以及任务的调度?

    我:有学过,但是忘记了,没复习,这个地方确实是可以改进的点。

  8. 有没有听过一个分扇区的方法cluster可以解决高并发对于任务分配的调度。因为你的任务和线程是1:n的关系 ,所以在调度之后可以通过cluster的隔离来分组,来实现线程高效的复用以及调度,这个有没有了解过?

    我:没有了解过。

    面试官:因为你的任务和线程是1:n的关系(多个线程争抢一个任务),线程现在还没有考虑它的优先级,所以我们对线程分扇区去处理,就是分cluster去处理。因为有执行能力高和执行能力的线程所以任务调度是不一样的,这样的话,我的任务就会出现请求和投递的过程,这样就能解决扇区内能够做无锁的操作,这样你的任务也就不需要上锁再读取。如果你的任务多线程少,那么加锁没有问题。但是如果你的任务少线程多,此时加锁就会导致效率很低。

  9. 在C++的学习过程中,你自己一直是在从事C++的编写工作吗?

    我:是的,之前实习的时候是用QT的,然后后面写服务器代码的时候,也有用到C++11的相关新特性。

  10. 能讲一下C++中是怎样运用面向对象技术的呢?以及它里面和面向对象技术之间的冲突点有没有自己的一些感悟?

注:我回答偏了,重点应该是落在面向对象技术,类怎么设计,我给答到C++新特性这方面去了,后面面试官也有和我提到这个问题。

  1. 面向对象既然是一个程序设计思想它有几个基本特性封装继承和多态,先简单说一下封装,既然是面向对象,那什么是对象。

  2. 我们封装是封装一个类还是一个对象?

    我认为:应该是封装一个类,因为万物皆对象,而类是对现实生活中一类具有共同特征的事物的抽象。所以应该是封装一个类。

  3. 类是一个抽象的概念,具有相同属性行为或者操作的对象的一个集合,是一堆实例的集合。通过实例抽象出来的一个类,怎么区分不同类的区别?

    我:通过功能上来进行区分,比如http请求类和线程池的类

    面试官:这里有点问题,你通过面向对象思想设计一个程序,可能通过对象的思维去做的。如你刚刚所说的http是一个类,那么如果我做的是ws呢,那我不是又要写一个ws(websocket)的类,这肯定是不好的。

    **类是多个具有相同属性和相似操作的控制数据的集合。**类与类之间区分就是通过属性来分界的,比如说人和动物为什么分成不同的类呢,但是它们有一个总类,除了属性以外,每一个类都有相似的行为,这个行为也是区分的参考标准之一。而在我们对类进行区分的时候不仅仅是依赖于属性和行为。有时我们对于某个实例情况来分解的时候,有的时候是以行为为主,有的时候是以属性为主。

    对于这些基本概念的话你可能后面需要去了解一下,因为我们长期用C++的话,你最后写出来的代码可能会有大量的重复或者逻辑条理不清晰的问题。

  4. (hr问) 是哪里人?

  5. (hr问) 我们这个地点上是成都,你地点上面能接受吗?

  6. (hr问) 你对于你自己的职业规划怎么考虑?

    先做好技术然后再考虑往别的职能发展。

  7. (hr问) 我看你本科是通信,硕士是计算机,这是你自己选择的吗?

  8. (hr问) 本科绩点怎么样?

    我:前10%

  9. (hr问)我看你有一段实习经历,这段实习经历对于你最大的收获是什么?

    我:主要是熟悉了软件开发的环境,并且帮助导师完成了一些测试和解bug的工作,然后就是和不同部门的人打交道。

  10. (hr问)你的导师对你的评价怎么样?

    不知道怎么回答

  11. (hr)你在接下来的时间有打算有针对性的做过一些练习或者是补充吗?

  12. (hr)后面能实习多久呢?

    3-6个月


反问

  1. 如果有机会能获得实习机会,具体做的是哪一块的内容呢?需要掌握那些技术呢?

    面试官:可能你现在还是学生,编程语言对于你们来说还是一个入门的东西,对于实际工作中只是一个工具.工具就是指针对我们不同的行业以及不同的技术应用方向我们选择对应的技术栈,像如果做机器人那么会使用ROS 系统 和 C++。像我们做自动驾驶,边缘计算平台这些C++用的比较多。但是像如果数学应用则matlab用的多一些。但是如果做敏捷开发那么JAVA、C#用的多一些,它其实没有固定的技术方向,所有的这些语言都只是提供给你的一个工具,工具只是为了解决问题。我们更多还是在边缘计算、分布式架构体系、高并发应用程序多一些,我们C++用的多一些,但我们做边缘计算,我们可能用go语言。你这边可能更需要关注对于事物的整体认知。从研究生开始,可能大部分的工作都是学习怎么样去提升我们对这个世界的认知以及我们怎么训练自己的抽象能力。你作为研究生,所以我们对你的面向对象程序设计思想有要求,目的也是为了想要了解你想在对于系统结构体系的认知水平以及你怎么看待事物的方法和思维。

  2. 我想了解一下刚刚面试下来我有哪些不足呢,以及能否请您给我提一些改进的建议吗?

    可以先在决定方向上去看一看,比如我自己要做哪个方向,然后在这个方向上去选择对应的技术,了解完这个技术之后,考虑可以用什么工具来解决我所要去面对的问题。应该是分三层去考虑,而不是我先决定我要用C语言,然后我要用C语言去做什么,这样你看到的范围就会相对较窄。这个最好是反的。因为在我们现有的系统中都是属于互联网、物联网这样的时代,我们要去了解这么一个体系,以及我们去面对产品化的东西,都不是一个孤岛,大部分都是一个相互有交互的,是一个网状的体系结构。怎么去抽象出这些体系结构才是你后面要去深入理解,如果你不理解它,你就会仅仅只限于语言本身给你带来的一点进步的过程,这个过程是没有办法应付你后期的成长需要的。

反思:

  1. 整体面试体验还是很好的,面试官提出了有建设性的改进建议,就是因为自己学的内容还浮于表面,一挖就捉襟见肘了。
  2. 对于项目的架构以及执行流程介绍,要总结出一个10-15分钟的讲稿,然后反复练习;
  3. 面试还是要背诵一些东西不然难搞
  4. 还是紧张,导致本来水平就不好,更加减分了;
  5. 讲话还是总是嘶嘶嘶,这个坏毛病要改掉;
  6. 面了两家公司,都很爱问面向对象这一块的内容,应该要去学习一下。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值