首页 > 一面网易,一小时问哭了!
头像
编程指北
发布于 2021-05-23 22:30
+ 关注

一面网易,一小时问哭了!

大家好,我是小北。

本来打算今天发 Java 学习路线下期的,但是昨晚发了个朋友圈:

很多小伙伴来让我分享下,于是小北就赶紧整理了下,当然了,单纯发一篇面经也没啥意思,所以顺便分享下我对于如何去准备技术面试,以及面试时如何回答的一些思考吧。

先直接挂上我当时写的网易一面记录,当时面了整整快一个小时,我依稀记得是电话的另外一端是两个人的声音。。。他们还在商量问什么。

奇怪,为啥会有两个面试官?

也有可能是某个面试官在工位面,其它的在旁边凑热闹?

网易一面

自我介绍和项目介绍

  • 简单自我介绍下吧

    • balabala

  • 你对哪方面是最熟的,是不是Linux C++ 或者说是最感兴趣?

    • 表达自己倾向基础方向开发

  • 问下项目经历吧,能不能详细介绍下这个项目里做了哪些事情,解决了什么问题啊?

    • 详细的介绍了项目和之前准备好的一个问题(socket方向的,自己通过 netstat 等监控工具排查问题经过,讲得很详细,感觉面试官比较满意)

  • 你中间有没有去提升或者改善性能啊,比如说改参数啊或者调整什么机制,有没有这方面的努力?

    • 也是简单介绍了下自己怎么优化的,达到了什么效果(QPS)

  • 蛮多和项目相关的问题就不细说了,反正就是大家准备项目的时候提前准备一些比如遇到的困难、如何解决的、性能如何、如何优化这样子的问题。

基础

  • 你对 Linux 内核 IO 机制有没有了解,就比如说 select 和 epoll 有什么差别?

    • 哈哈哈问到这个问题我就笑了,然后就开始先说差别,比如select 有文件描述符限制,频繁的内核态和用户态拷贝、O(n)遍历这些,然后讲了 select 和epoll 都是基于文件系统中 file_operations 的 poll 调用,然后开始详细讲 epoll,大概讲到了内核用红黑树维护监听描述符,就绪队列,回调函数机制避免O(n)的遍历这些,答完面试官就说说得比较全面深入。

  • 刚才你说你用 netstat 命令去检查连接状态,你能不能说下这个命令是做什么,看到的链接状态会有哪些?

    • 就讲了ESTABLISHED、SYN_RCVED、CLOSE_WAIT、TIME_WAIT(故意最后答这个引过来)

  • 如果是你在部署某一个程序服务的时候,看到大量的TIME_WAIT连接是怎么回事?

    • 分析了 TIME_WAIT 是主动关闭一方,所以服务器应该是有大量短连接请求

  • 那么大量的 TIME_WAIT 会导致什么问题呢?

    • 大概从端口占用 2 MSL 不能使用,可能导致后续没有端口接受新连接之类方向分析

  • 那我们怎么去避免这个问题,避免大量 TIME_WAIT

    • 讲了设置 socket 选项 SO_LINGER 或者设置 SO_REUSEADDR 让端口和地址重用

  • 平时用什么语言,做什么开发?

    • C++ 一般用来和网络 Linux 相关的开发, Java 的话是偏 Web 后端, Python一般是写脚本或者爬虫也有用后端框架

  • Python的话用到过装饰器吗?

    • 嗯,然后讲了装饰器来干嘛,比如无侵入的增加函数功能(比如计时),有点类似 Java 注解,支持 AOP 编程。乱扯了一堆...

  • 那 Java 你有哪些了解得常用设计模式?

    • 讲了装饰器模式和在 jdk IO 流中的运用,单例模式

  • 那单例我们一般用来做什么?

    • 只需要一个对象的场景,比如数据库连接池、文件系统这种。。。

  • 了解过 Java 里面的线程安全问题吗?

    • 感觉不妙引到 Java 上来了,赶紧给面试官说自己 Java 不是很熟悉,讲下 C++ 中的吧,然后开始 C++ 的问题

  • 讲下 C++ 里虚函数

    • 虚函数表 虚函数表指针 函数指针 动态绑定 基类指针指向派生类对象这些,还有接口设计方面

  • 在 C++ 里面结构体和类的区别

    • 默认访问权限 + 一点其它自己的使用感觉

  • 用过智能指针吗,能不能介绍下它解决的问题和你使用的经验?

    • 首先讲了裸指针生命周期管理的困难,内存泄漏、野指针这些

    • 然后讲了智能指针是如何利用 RAII 来解决的,然后顺便提了那几个智能指针区别

    • 讲了自己项目中如何利用 shared_ptr 的,还有如何用 weak_ptr 解决环形引用的

  • 刚才你提到内存泄漏,那你是如何在 debug 发现或者是定位内存泄漏的呢?

    • 讲了下 Valgrind 套件下的 memcheck

  • 那后面用了智能指针之后你再去跑内存泄漏有减少吗?

    • 嗯,工具检测没有内存泄漏发生了

  • 可以讲下树的深度遍历和广度遍历

    • 前 中 后 用栈或者递归

    • 层次 用队列

  • 讲一下 hash 表

    • 详细讲了下 STL unordered_map 底层
  • 算法的话可以看下这个刷题笔记,能节省很多时间:https://blog.nowcoder.net/n/1a101fc1d59541dd8a7a7bf940c27483
  • 那哈希表冲突怎么解决?

    • 线性探测和平方探测,说了这两个有主聚集和次聚集缺点

    • 大多数语言 map 用的是开链法

  • 如何判断链表是否有环?

    • 说了用 set 和快慢指针两种

  • OK,我问几个操作系统方面的问题哈

OS

  • 你知道 copy on write 吗

    • 详细讲了 fork 的COW, 锁定父子进程页表只读,任何一进程写时就分配页框复制之类,顺便还提了下 C++ 中 COW 在string 上的应用

  • 实现进程间通信的方式

    • 匿名管道 有名管道 共享内存 信号量 消息队列 socket, 然后强调自己偏向使用 socket 通信,因为方便将单机多进程扩展到多机多进程

  • 你单机开发和实验用的什么 Linux 开发版啊?

    • 讲了 Ubuntu 和 deepin

  • 了解一些运维命令吗,比如你在测试的时候怎么看负载啊

    • 答了 top

  • 后面详细问了 top, 比如问我知道 Load Avg 代表什么含义,进程的 CPU 利用率会超过 100% 吗,top 还能看什么性能指标?

  • 你有什么问题问我吗

面经结束


彩蛋开始

说实话,大家看完这份面经,是不是觉得也没问什么特别难的问题?

但是这个面试我印象很深刻,因为还有一些问题没记下来,印象里就是面试官一直追问,然后各自问题轮番上阵。

从网络编程到 TCP 状态、从 C++ 虚机制到多线程、COW 这些话题,还有 Python、Java、C++ 这些语言都会问,跨度也很大。

但是我基本都能回答得上来,并且会刻意引导到我熟悉的方向。

比如问 TCP 状态的时候,我会刻意将 TIME_WAIT 回答到最后一个,然后果然面试官就顺着我,问部署服务是否遇到过大量这个状态之类....

比如我当时对 Java 多线程那块不是特别熟悉,面试官问我的时候,我直接让他问我 C++ 的,给讲 C++ 里多线程怎么做的。

这个面试官对我评价也很不错,后来网易二面这个面试官,也就没问我这个基础问题了,说一面问了很多,我的基础也很不错。

然后直接跟我聊云计算、K8s这些,但是恰好,虚拟化这块我了解不多,仅仅对 Docker 的原理有一些粗浅的认识。

然后后面就建议我不要去他们那暑期实习,两个月的时候不太够,让我明确自己到底想做什么(传说中的好人卡?不过我感觉不至于,这个面试官是真的出于对候选人负责。

和这个面试官聊了一些无关面试的话题,然后我就决定去腾讯实习了,拒掉了后面头条这些约的面试。

当时面完还加了下好友,本来打算秋招就去那面的,不过世事难料,我留在微信这里了哈哈。


春招的一个记录贴

话说回来,刚才说了面试要引导到自己熟悉的方向,能引导的前提就是你了解得足够多,不然你怎么知道该往哪引导呢?

其次就是知识要系统,比如 Copy On Write 这个话题,能从 fork 联想到 C++ 中的应用。

另外就是知识面要尽可能宽一些,我以前是很爱看各种技术文档、博客的,所以了解也很多。

还有就是编程语言,我一直说的就是,有时间的话,C -> C++/Java -> Python 都好好学一下。

并且有了 C/C++ 基础,后面两门语言都很快的,而且你很快能掌握 Python 这些底层实现机制,如果你对 C++ 对象模型这一套了解的话,这些都是换汤不换药的。

在不涉及 Java 那些 Spring 全家桶的前提下,光是语言还是比较好学。

最后就是基础知识真的要好好刷书、刷视频,不要直接看面经,今天晚上我和一个同学电话了近 20 分钟,他讲了下他目前的学习路线:

基本是刷题 + 刷面经,并且是 数据结构、计算机网络、操作系统这些都没有系统的过一遍,这样肯定是不行的啊。

面经刷得多,可能面试也能过,但是很难系统化,面经上没有刷的点,你就漏掉了。

所以我给他的建议就是:

数据结构 + 计网 + 操作系统 都采用 刷视频 + 刷书的方式系统学习一遍,并且绕过非重点内容。

系统学习后,再去看面经,提炼高频问题。

到底是知识形成系统?

在这举个例子吧,去年我学弟问了我一个面试题:

建立 TCP 连接后,主机挂了和 JVM 虚拟机挂了的区别

这种怎么分析?

三次握手、四次挥手、TCP连接状态、主机? 这些连在一起的时候怎么分析?

其实这里就是看你对 TCP 面向连接 的理解到底是什么?

本质上就是双方记录一个状态嘛,互相通信同步状态,或者做状态转换。

那么如果主机直接断掉,比如直接扒掉电源,那么其实你的主机不会发出任何的数据包,对方也不会感知到,除非对方发了探测包,或者数据包过来,然后一直超时重试,直到上限。

那么 JVM 挂了呢?

那加入是主机断电后又重启呢?

服务器主动关机呢?

这个 TCP 连接是什么状态?

大家可以思考下,也许这个问题没有标准答案,要以实验为准。

但是我觉得面试官想要考察的也是你对 TCP 连接的理解,以及在各种情况下的分析。

而不是单单去背住 TCP 面向连接,balabala....

好了,现在也挺晚了,这篇就先到这里了,小北去睡觉了。

安。


更多模拟面试

全部评论

(3) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

近期精华帖

热门推荐