ITPub博客

首页 > 数据库 > 数据库开发技术 > 400人通过华为面试,最终只有10+ offer发出

400人通过华为面试,最终只有10+ offer发出

原创 数据库开发技术 作者:拓跋阿秀 时间:2024-08-22 10:00:00 0 删除 编辑

校招八股文学习网站:https://interviewguide.cn
这是阿秀的第「426」篇原创

大家好,我是阿秀。

如果评选近几年的网络十大热词,那遥遥领先大概率要入选,这几年华为背靠手机、通讯、新能源、芯片等行业发展迅速,确实可以称得上某种意义上的遥遥领先。

如果你的专业是通信、电信、计算机等传统工科专业,那华为绝对是你求职路上绕不过去的一家公司,事实上华为近几年招的应届生数量堪称恐怖,每年九十月份网上都会出现大量的"华孝子",这也造成了很多人都选择 all in 华为这家公司。

前段时间写过一篇文章:关于所谓的"华为最新招聘目标院校表",简单辟个谣,辟谣了下很火的"华为最新招聘目标院校表"是虚假信息。其中也提到了华为 offer 发放制度,并建议应届生朋友们不要all in 华为,因为很容易让自己变的非常被动,没有任何回旋余地的那种被动。

结果评论区就出现某位华为在职员工,直言"某部门面试通过400+人,最后offer发出去10+封,90%的人都淹死在池子里了",如下图:

这里也是再次奉劝那些想要all in华为的人,可能真的会被"淹死"在offer池中。

这里分享一份 24 届同学的华为秋招面经,他面试的是华为 2012 部门,并最终拿到了offer,这里分享一下他的一面面经,其中的我代表这位学弟本人。


1、做个自我介绍?

你好,面试管,我是xxx,我就读于xxx,balabalbalba

2、看你是C++和Golang都会,那你说下这两门语言的区别?

当时我只说了并发、难易程度、跨平台这些,后来自己回去补了其余区别,做了汇总,下面是C++和Go的主要区别:

  1. 语法复杂性:
  • C++: 语法相对复杂,支持多种编程范式,有模板、多重继承等高级特性。
  • Go: 语法简洁,易于学习,避免了一些复杂的特性,如类继承。
  • 性能:
    • C++: 通常提供接近硬件级别的性能,适合需要高性能计算的场合。
    • Go: 性能虽然不如C++,但对于大多数应用来说已经足够,特别是在并发和网络服务方面。
  • 内存管理:
    • C++: 手动内存管理,使用new和delete操作符,或智能指针来管理内存。
    • Go: 自动垃圾回收,简化了内存管理,但不支持传统的指针算术。
  • 并发编程:
    • C++: 从C++11开始支持线程和并发,但并发编程相对复杂。
    • Go: 原生支持并发,使用Goroutines和Channels,使得并发编程更加简单和安全。
  • 编译速度:
    • C++: 编译速度通常较慢,尤其是大型项目。
    • Go: 编译速度快,有助于快速迭代开发。
  • 错误处理:
    • C++: 使用异常处理错误,但也可以使用返回码。
    • Go: 不使用异常,而是通过返回错误值来处理错误。
  • 跨平台支持:
    • C++: 跨平台支持良好,但可能需要针对不同平台进行优化。
    • Go: 原生支持跨平台编译,易于在不同环境下部署。

    3、Linux和Windows下的线程通信方法有哪些?

    名称及含义
    Linux:
    信号:类似进程间的信号处理
    锁机制:互斥锁、读写锁和自旋锁
    条件变量:使用通知的方式解锁,与互斥锁配合使用
    信号量:包括无名线程信号量和命名线程信号量
    Windows:
    全局变量:需要有多个线程来访问一个全局变量时,通常我们会在这个全局变量前加上volatile声明,以防编译器对此变量进行优化
    Message消息机制:常用的Message通信的接口主要有两个:PostMessage和PostThreadMessage,PostMessage为线程向主窗口发送消息。而PostThreadMessage是任意两个线程之间的通信接口。
    CEvent对象:CEvent为MFC中的一个对象,可以通过对CEvent的触发状态进行改变,从而实现线程间的通信和同步,这个主要是实现线程直接同步的一种方法。

    4、堆和栈的区别

    申请方式不同

    • 栈由系统自动分配。
    • 堆是自己申请和释放的。

    申请大小限制不同

    • 栈顶和栈底是之前预设好的,栈是向栈底扩展,大小固定,可以通过ulimit -a查看,由ulimit -s修改。
    • 堆向高地址扩展,是不连续的内存区域,大小可以灵活调整。

    申请效率不同

    • 栈由系统分配,速度快,不会有碎片。
    • 堆由程序员分配,速度慢,且会有碎片。

    栈空间默认是4M, 堆区一般是 1G - 4G

    5、孤儿进程是什么?

    如果父进程先退出,子进程还没退出,那么子进程的父进程将变为init进程。(注:任何一个进程都必须有父进程)。

    一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

    6、读写锁?

    • 多个读者可以同时进行读
    • 写者必须互斥(只允许一个写者写,也不能读者写者同时进行)
    • 写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)

    7、为什么Goroutine支持高并发?

    相比于线程来说,它所占用的资源更小的。一个线程可以有多个协程;线程进程可以看作是同步机制,而协程非阻塞模式。

    和channel的组合能让开发的过程中不会太过于去考虑事物的并发控制,因为通过 channel 可以进行控制,它们其实共享了一些资源,所以他们其实可以通过共享内存的方式去进行相关的交互。相对比起线程的加锁机制来说,协程的效率会更高一些。

    补充

    协程大小相对于线程来说更小,大小只有2k,内存中可以允许有更多的携程来处理并发任务

    协程的上下文切换不哦那个由用户态切换到内核态,且保存的寄存器值更少,所以切成切换的开销更小,效率更高

    go语言在语言层面go语言的的runtime内置了协程调度器,整体通过gmp模型高效的调度goroutine的运行

    8、go defer用过吗?

    用过,defer是Go语言中的一个关键字,它用于注册延迟调用。这些调用直到return前才被执行,它可以用来做资源清理。如果多个defer语句,按先进后出的方式执行 。

    有时候也会被用到并发和锁场景下,具体如下:

    1. 并发同步控制:在并发编程中,可以使用defer来确保某个函数在所有子协程都退出后再执行。
    2. 锁场景:在锁场景下,可以使用defer来确保锁释放,防止死锁等问题。

    在Go语言中,数组和切片都是用来存储一组相同类型的数据的。

    9、切片和数组的区别?

    区别:它们的区别主要有两点:

    1. 数组的长度是固定的,而切片的长度是可变的。
    2. 数组是值类型,而切片是引用类型。

    具体来说,数组中的每个元素都有一个固定的内存地址,而切片则是由数组实现的,它只是对原始数组进行了封装。

    因此,当使用切片时,我们可以通过修改切片来改变原始数组的内容。

    另外,由于数组是值类型,所以函数调用时传递数组时会创建一个新的切片副本,而传递切片则会传递指针或引用。

    补充:下面是一个使用切片的示例,演示了如何向切片中添加元素:

    package main

    import "fmt"
    func main() {
     // 创建一个切片
     numbers := []int{1, 2, 3, 4, 5}

     // 向切片中添加元素
     numbers = append(numbers, 6)
     numbers = append(numbers, 7, 8, 9)

     // 打印切片的内容
     fmt.Println(numbers)
    }

    在上述代码中,我们使用[]int语法创建了一个切片numbers,并初始化了一些整数,然后,我们使用append函数向切片中添加元素。通过使用切片,我们可以动态地添加和删除元素,而不需要事先指定切片的长度。

    需要注意的是,切片是基于数组的一种封装,它提供了更便捷的操作和灵活性。切片的底层是一个指向数组的指针,它包含了切片的长度和容量信息。

    10、说下TCP建立连接的过程?

    三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

    进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。

    初始状态:客户端处于 closed(关闭)状态,服务器处于 listen(监听) 状态。

    第一次握手:客户端发送请求报文将 SYN = 1同步序列号和初始化序列号seq = x发送给服务端,发送完之后客户端处于SYN_Send状态。(验证了客户端的发送能力和服务端的接收能力)

    第二次握手:服务端受到 SYN 请求报文之后,如果同意连接,会以自己的同步序列号SYN(服务端) = 1、初始化序列号 seq = y和确认序列号(期望下次收到的数据包)ack = x+ 1 以及确认号ACK = 1报文作为应答,服务器为SYN_Receive状态。

    那么问题来了,两次握手之后,站在客户端角度上思考:我发送和接收都ok,服务端的发送和接收也都ok。但是站在服务端的角度思考:哎呀,我服务端接收ok,但是我不清楚我的发送ok不ok呀,而且我还不知道你接受能力如何呢?所以老哥,你需要给我三次握手来传个话告诉我一声。

    你要是不告诉我,万一我认为你跑了,然后我可能出于安全性的考虑继续给你发一次,看看你回不回我。

    第三次握手:客户端接收到服务端的 SYN + ACK之后,知道可以下次可以发送了下一序列的数据包了,然后发送同步序列号 ack = y + 1和数据包的序列号 seq = x + 1以及确认号ACK = 1确认包作为应答,客户端转为established状态。(分别站在双方的角度上思考,各自ok)

    11、写一个SQL

    场景为一个班级成绩表,将sex为male何female的区分开来,要用 group by

    SELECT sex, COUNT(*) as total_students, AVG(score) as average_score
    FROM grades
    WHERE sex IN ('male', 'female')
    GROUP BY sex;

    12、为什么想来华为?

    这里划重点!!!

    我 tm 直接表忠心,表示认可华为的狼性文化,希望能通过努力奋斗实现自己的价值2333

    你好,我是阿秀,普通学校毕业,校招时拿到字节跳动SP、百度、华为、农业银行等6个互联网中大厂offer,毕业后先于抖音部门担任全栈开发工程师,目前在上海某外企带领团队继续从事全栈开发,负责的项目顺利盈利 300w+。

    研三快毕业那年就组建了一个阿秀的学习圈,一直持续分享校招/社招跳槽找工作的经验,都是自己一路走过来的经验,目前已经累计服务超过 3800 +人,欢迎点此了解一二。

    原文作者:拓跋阿秀;如有侵权,请联系管理员删除。

    请登录后发表评论 登录
    全部评论

    注册时间:2020-11-28

    • 博文量
      429
    • 访问量
      181388