【23届内推】实习面经 Java后端 阿里 字节 腾讯 HW
HI, 看到这个帖子的老哥老姐老弟老妹们,我目前在阿里巴巴-阿里妈妈-淘宝联盟,目前招聘23届暑期实习生, 大家有兴趣来我们部门的话,欢迎投递和加我微信咨询。 fjl-61585
联系方式: jinlu.fjl@alibaba-inc.com. 或者直接微信发我也行。WX: fjl-61585
部门简介:
我们是做什么的?
帮助淘宝APP内的商品/店铺/活动页 在淘宝APP之外的场景进行营销。
我们的盈利模式?
推广者将淘宝内的商品推广给商家,成交后商家支付佣金给推广者,平台对佣金进行抽成。
小组优势:
1. 广告部门,上一级的阿里妈妈事业群是集团广告收入的大头,年终奖丰厚。
2. 我所在的小组有大流量 高并发的c端 b端业务场景 ,有3个小队,分别专注于技术建设,数据赋能,生态开放业务,所以来这边可以选择的方向会更多,场景也更有挑战。
3. 团队加班不多,非618 双11期间,基本7-8点就都回去了。 周五6点左右。
Job Description:
部门:阿里妈妈
工作地点:杭州、北京
招聘岗位:JAVA研发工程师
面试流程:线上笔试+电话面试
面向群体:2021年毕业的应届生
投递方式:邮箱 jinlu.fjl@alibaba-inc.com. 或者直接微信发我也行。WX: fjl-61585 也可二维码自助投递
命名格式:秋招_姓名_学校_联系方式_岗位
自助内推,可全程反馈进度。
(常见问题与回答、具体职位描述信息: https://www.yuque.com/docs/share/a6c0c21b-a54f-4ca9-9c25-0e9aa5712a53?#)
-========================= 原贴 ========================================
感觉面试还是主要围绕简历来问的,所以不熟悉的东西最好不要随便写上去。 项目和基础都很重要,整体的基础知识的框架可以参考GitHub 上 CYC2018的博客,分类很全,但是深入的学习还是要自己去看书,写demo。
项目中最好有难点,能够体现自己解决问题的过程和思路。 算法方面剑指offer + LeetCode 200左右吧。
投了10+公司,进行面试大概就这几家,其他没结果或者笔试被刷了。
最后求比较一下offer, 杭州阿里B端业务部门 和 深圳的字节 头条主端部门, 还请大家提提建议。
(后面会补充一下自己学习过程和路线,书籍等,给自学的同学一点参考)
腾讯:
一面:
- 讲一讲异常, throwable, exception, error
- try- catch
- 手写单例模式——很生疏,GG
- volatile ,作用,底层, lock 前缀的指令, 多CPU的嗅探机制,多处理器下的缓存一致性协议
- synchronized
- JVM 内存划分, 堆内存分代
- redis, 源码,
- spring bean的实例化过程。 ——不熟悉的地方不要写上去。
- AOP
- 使用redis来实现单点登录,那么当单个redis节点内存不够的时候,怎么办? 集群化,redis-Cluster
- 比较偏底层
华为:
一面:
- 自我介绍
- 项目中的可用性,性能,扩展性 如何提升
- nginx是如何实现反向***的,哪一层的方向***? 应用层
- 如何向外提供HTTPS协议的服务, 在内网使用http协议, 通过nginx配置来进行实现
- 设计一个网络的时候,需要考虑的因素
- 虚拟网络
字节跳动
- 自我介绍
- 单点登录
- JVM内存划分, 堆内存为什么要进行分代回收, 生命周期不同
- redis,主从,哨兵,集群,分布式锁。
- redis的对象类型, 每种对象类型对应的底层的数据结构,参考redis设计与实现。
- string, list, hash, set, sortedset.
- 每种对象都至少有2中数据结构, SDS, linkedlist, ziplist, intset, ziplist, skiplist
- ISN, TCP协议为什么要随机初始化一个序列号——安全性, 防止和上一次会话滞留的报文冲突
-
手撕算法:
- 把九亿三千零五万五千三百 转化为 对应的数字,
- 给了一个长度为n的 值的范围为0 到 n-1的数组,然后判断是否有重复的元素出现的问题。
- leetcode 42 雨水收集问题
拼多多:
一面:
- 自我介绍,redis,分布式锁, redlock算法,zookeeper分布式锁,分布式锁的问题
- 手写一个随机选择算法的变种
二面:
- 说明一下缺页中断, 虚拟内存
- JVM中的内存区域划分,堆的分代,为什么分代, 垃圾回收算法,垃圾回收器
- Linux进程间的通信方式, 管道,有名管道,socket,共享内存,消息队列
- 如何实现进程间特定场景下的高效通信, 问了存储相关的问题。
- MySQL索引类型, 底层的数据结构
- 手写一个双链表的插入和删除,查找方法
HR:
- 为什么换专业
- 有没有其他公司的offer,
- 职业规划
- 你认为自己转专业和科班出身相比差距在哪里,我们为什么要录用你 555
- 学习的过程, 如何去学习
招银
电话简历面:
- 自我介绍
- 事务的特性 ACID , 数据库的死锁发生的情景
- 死锁的四个必要特性, 非共享, 持有并等待, 非抢占, 循环等待
- 死锁避免 死锁预防
- 线程的状态 , 新建,就绪,running, wait, blocked, terminated
- sleep 和 wait 的区别, 类的不同,是否会释放持有的锁,monitor
- JDK 可重入锁, 读写锁 , 底层 AQS,抽象队列同步器的机制
- 悲观锁和乐观锁, 概念上,JDK 中的类, CAS的缺点, 空转,ABA问题。使用pause指令, AtomicStampedReference
- 讲一讲Servlet, web.xml 配置路径到servlet的映射, init, service, destroy
- 可以看一看Tomcat容器的过程 ,Connector和 Context容器两大部分。 完成从socket到 request和Response对象的构造
- SpringMVC的 dispatcher-servlet的请求解析过程
- redis介绍, 系统中的角色,作为缓存, 分布式session服务器
- redis的 性能,可用性,主从复制+哨兵, redis缓存访问有网络上的消耗。
- redis事务, 分布式事务, 2PC, 本地消息表等, 3PC
阿里:
一面:
- 自我介绍, 项目
- 收获最大的一个项目, 着重介绍, 项目的演进过程, 从提高系统可用性的来进行演进,例如redis的可用性,
- 分布式锁(项目), redlock,持久化机制,主从复制过程, redis知道的都说出来
- redis解决分布式Session问题, 单点登录, Session一致性问题,描述,如何实现
- IOC 的实例化过程,原理,
- AOP, JDK***, Proxy, InvocationHandler
- 一个循环链表进行是否为空判断
- 树的遍历, 层序,先、中、后的递归非递归实现
- 操作系统 P/V Semaphore类,
- CAS, AQS 实现
- 看哪些书, 论坛,如何学习Java
- 智力题 喝汽水问题, 2个空瓶换一瓶汽水,1元1瓶,可以买多少瓶汽水 问题,(刚好看过,通过借一瓶来最后再多喝一瓶)
二面:
- 自我介绍
- 在校,学习情况,参与项目(介绍一下业务方面,架构方面的过程)
- hosts文件
- 乐观锁, 悲观锁, 举例, 可以顺便说一下, CAS,volatile, synchronized
- 事务,分布式事务, 如何实现分布式事务, 两阶段提交,(过程)
- JVM堆划分,方法区,
- 执行了 system.gc()触发的GC机制,FGC, 如何进行回收的, 分代回收
- 系统周期性卡顿,如何定位问题,结合GC日志, YGC,FGC, 调整分代的大小, 减小FGC时间
- 产生FGC的原因
三面:
40+
- 自我介绍,学习过程,项目中的难点,如何解决,
- 如何去提升系统的可用性,性能,扩展性,伸缩性,等等, LVS,反向***,集群,异步,缓存等等
- 开放性的系统设计,一个车票查询系统,对最短时间,最短开销进行求解,类似于12306的火车票购票系统,。
- 亿万流量网站架构和新技术, 这本书可以参考一下
四面:
- 自我介绍
- 学习过程, 难点——
- synchronized关键字作用与静态方法和普通方法的区别,通过不同的对象的监视器来进行并发控制,monitorenter, monitorexit
- 服务器CPU使用率很高,如何排查, top 定位进程, 如果是Java,通过jstack进行线程快照分析,jmap,jhat 等等,
- 智力题
- 红黑树的优缺点
- AOP 动态***
- HR面:
- 自我介绍 学习过程
- 为什么选择转专业
- 项目中遇到的难点,
- 对部门的理解
- 个人的职业发展,城市的选择,职业方向,有没有其他公司的offer
=========================================================
下面是自己的一点自学和准备面试的过程,希望可以对其他人转行的人有帮助
自学过程:
首先对于Java后端开发的岗位而言,自己一开始也是从0开始学习的。最开始也只是知道有前端、后端、移动端、测试、算法等这些岗位,但是并不清楚这些岗位都是做什么工作的,在网上也没有找到对应的学习路线,就去知乎,或者别人的博客看看Java后端都需要学习那些知识。
刚开始学习的时候从Java基础知识入手,先看了一下《Head First Java》,然后《Java编程思想》看了不到一半就放弃了,基本看不懂。然后看了一下黑马的视频,看了一下大致的基础知识和web基础的部分,然后就可以开始学习框架和简单的开发了,刚开始自己可以在网上找一个Demo,跟着做一做,熟悉一下后端开发。(可以去牛客网或者慕课网找一个Demo项目跟着做一下)。在熟悉了基本的开发过程之后,可以进行深入做一些web项目。然后自己有针对性的进行学习,比方Redis,消息队列等。
大致就是下面这几个方面要进行学习:
- 计算机基础:计网,OS,算法和数据结构必须熟悉;组成原理,编译原理等等看了更好
- 语言基础:Java的一些语言特性,多线程,JVM
- 数据库:基础概念,SQL,数据库的设计等
- web基础:Servlet,JSP, HTTP协议, Cookie, Session等进行一下了解,可以自己用servlet写个demo
- web框架:SpringMVC, Spring, Mybatis, 在项目实践中学习,先会用,然后深入。 SpringCloud, SpringBoot等也可以进行学习
- 中间件:Redis, 消息队列这些也可以了解一下
- 开发工具: Maven ,Git等等
- 系统设计:如何提升系统并发,保证可用性,伸缩性,扩展性,安全性这几个方面的考虑。
自己在学习的大致就是上述的过程,也不是很有计划性,基本都是边学习边修改自己的计划。我在网上发现有一个博客讲解的Java后端的学习路线比较清晰。 博客地址:http://objcoding.com/2018/02/07/javaweb-learning/ 。 按照这个大纲进行学习我觉得会更清晰一点。
面试准备和阅读书籍:
大体的建议还是平时多coding,多看书,多思考,多总结,不要在面试前依赖面经总结,或者背面试问题这种途径,因为需要做到的是真正对某个问题理解了,知道解决方案,而不只是背过了答案。面经总结应该看成一种对自己进行查漏补缺的测验,而不是背诵的题库,功夫积累还是在平时。
面经总结可以 看一下CYC2018的博客,当然还有别人总结的面经,多多益善。
自己准备的过程就是先去看对应的书籍,基本理解之后再去看面经进行查漏补缺,自我检验,然后不断迭代反复的过程。所以我准备的各个方面进行一下总结。
- 计算机基础:
- 计网《计算机网络》谢希仁版,视频看了MOOC上的 哈工大视频;
- 操作系统 《操作系统概念》,MOOC上哈工大的视频, B站的清华大学一个老师讲的操作系统视频, 也很好; 《深入理解计算机系统》也推荐,但我还没有看完。
- 算法和数据结构,浙大的数据结构教材,然后看了MOOC上陈越姥姥和何钦铭老师的视频, 刷了一点PAT, 然后就是剑指offer和LeetCode。 之后看了《算法》(第四版), 《算法笔记》本来打算看的,但是后来放弃了。
- C语言, 刚开始学的时候看了 MOOC上翁凯老师的视频,然后找了本C语言教材看了下
- 计算机组成:简单看了下MOOC上的视频,过了一遍
- 编译原理:没学,但感觉有必要学一下,对实践OS的一些实验和其他地方很有帮助
- 语言基础
- 基础:《Head First java》, 然后熟悉依稀Java基础的一下API,看一些基础知识的博客,我看的黑马视频,对API熟悉了点。
- 深入:《effective Java》挑选一些章节阅读,《Java编程思想》(建议有一定的基础再进行阅读);或者 《Java编程核心技术》(第二卷) 和《Java编程思想》选一本读一下就行。
- 多线程:《Java并发编程的艺术》, 可以结合一些网上相关的博客。 《Java编程思想》里面多线程部分。 想要继续深入可以看一下《Java并发编程实战》,内容更加复杂。
- JVM:《深入理解JVM虚拟街》,内存分配, 类加载, 内存模型和多线程部分。这三部分可以重点看。
- 源码阅读:JUC,集合类,常见类(String等),
- 设计模式:
- 菜鸟教程的 设计模式。(后来发现其实是直接翻译的国外的一个网站内容)。更多的还是平时的分析和使用。
- 数据库:
- SQL基础语法:《MySQL必知必会》
- 数据库基础知识:《数据库系统概念》,只看了前面一点基础知识
- MySQL:《高性能MySQL》 重点看了前面几章。
- web基础:
- 看的黑马的视频,主要是了解了HTTP,Cookie,Session,Servlet,Filter,JSP等基础知识,用servlet写了个demo
- 框架 SSM, 主要是在项目中使用了一下,然后搜索了一些常见的问题,看了看文档。
- web深入:
- Spring框架:了解一下IOC,AOP的原理,自己尝试简单实现,书籍可以看一下《Spring实战》(我还没看)
- SpringMVC,Mybatis, SpringBoot:这些感觉还是用到了看下文档,然后边用边学
- Redis:了解一下基本的语法就可以使用,深入了解可以看一下《Redis设计与实现》
- 消息队列:没怎么用
- 微服务,SpringCloud,之类的也可以进行了解
- 系统设计,架构:
- 《大型网站技术架构:核心原理与案例分析+李智慧》, 《淘宝技术这十年》,《深入分析Javaweb技术内幕》
- 其他书籍:
- 《码出高效:Java开发手册》,对开发所涉及到的知识都可以有一个比较系统的了解
- 《浪潮之巅》、《数学之美》只看了一点点
看书的一点小建议:
如果在某个阶段看书看不进去的时候,可能是自己其他方面的积累还不够,也可能是要自己静下心去深入分析,判断是哪种就需要自己去感觉了。例如我看完《Head First Java》直接开始看《Java编程思想》,就感到十分痛苦,大部分都不懂,不知所云。但是在使用Java进行一定程度的编码之后,对Java多线程有一定了解之后,再开始看《Java编程思想》的时候,就比之前好多了。
但是在看《Java并发编程的艺术》的时候,看不懂,就需要啃着硬骨头,静心看下去。
最重要的感觉就是不断地实践,看书,看博客,总结。不断反复。