个人简介

本人坐标南京,16年毕业,在某一传统行业从事JavaWeb后端开发,三年工作经验。出于技术焦虑、能力成长陷入瓶颈、对体制内的文化和氛围无法适应等原因,决心换个环境和工作,进入互联网行业,继续自己的技术追求之路。19年8月应聘字节跳动公司的后端研发工程师岗位,现对经历的4轮技术面和1轮HR面做个总结。

面试经历

每轮技术面时长40min~1h不等,可能一次一轮面试,也可能两轮连续进行。每轮先以简单的自我介绍开场,然后面试官根据个人的工作经历和技术能力进行提问,最后预留20min~30min时间对一道算法题进行Coding。根据草稿和回忆,整理出不完全的四轮技术面题目如下。

面试题目

第一轮&第二轮

  1. Spring事务传播机制
  2. Spring的注解、IoC、AOP相关问题,包括:私有方法能否进行AOP增强
  3. Redis的内存失效/回收策略
  4. MQ是否存在消息重复的问题
    两道算法题目:
    1)根据用户上线、下线日志,统计最大同时在线人数
    2)根据前序和中序序列构建二叉树

第三轮

  1. 询问是否了解Big Data(由于本人以往工作内容与此完全没有交集,故据实告知没有了解,面试官便作罢转而询问其它方面问题)
  2. OS的内存碎片、内存管理策略
  3. OS的文件系统、文件访问机制
  4. 分布式缓存相关问题,包括Key分布/影射策略、Key不存在时的处理措施
  5. 布隆过滤器的原理
  6. HTTP的典型请求流程
  7. API网关(代理服务器)的功能
    算法题目:
    快速从几十亿个数中判断某个数是否存在;并讨论算法性能优化相关内容。
    备注:在最后向面试官提问环节,面试官给我一个建议,学习和了解大数据相关知识,做后端开发不能对主流/热点技术方向完全不了解,即使这些技术与工作不相关。

第四轮

  1. 谈谈Spring的优势之处
  2. 在工作项目中遇到的技术痛点和应对之策
  3. 谈谈对BlockingQueue的认识,然后实现一个简单的BlockingQueue
  4. 如何一场比赛我的胜率为0.6,那么5局3胜和3局2胜该选哪一种比赛方式?如果5局3胜的胜率为P3,3局2胜的胜率为P2那么推导出7局4胜的胜率P4
  5. 工作中是如何进行学习和技术积累的

HR面

HR面持续30min左右,主要询问了更换工作的原因和想法、目前的薪资状况等问题。

技术面总结

字节跳动的技术面试使用牛客网在线面试平台(面试链接示例:https://people.toutiaocloud.com/recruitment/interview/interviewee/27d0d9c0-aeb5-11e9-a933-98039ba25b3e) ,通过视频与面试官面对面交流,代码在面试平台的开发环境中编写,向面试官实时共享编辑的内容。
经历四轮技术技术面试,感觉字节跳动对候选人的技术要求是比较高的,候选人首先需要熟练掌握与工作经历相关的编程语言、Web框架等个人技术栈,其次对算法、数据结构、操作系统、网络原理等专业知识要有个扎实的基础,尤其是要保持对算法题动手Coding的能力。

经验总结

首先聊聊手写代码。已有几年工作经验的程序员而言往往对算法与数据结构相关基础知识日渐生疏,更何况平时工作内容大都与业务相关,如果不经过刻意的训练很难在20min左右时间快速解答和实现面试中的算法题。另外面试中的算法题以LeetCode上中等难度的算法题为基础和标准,领扣网上有字节跳动算法题库 ,当前335道题目中,111道简单级题目,中等难度的题目170道,困难题目54道。

本人利用一个月左右的工作之余时间,采用在领扣网上刷题(60道左右中等难度题目)和学习《数据结构与算法经典问题解析》(Java语言描述)一书相结合的方式,重新捡起数据结构和算法的知识,训练针对面试算法题的Coding能力并熟悉此过程。个人感觉刷题仅在于熟悉考试时的状态和节奏,关键还是在于扎实掌握数据结构与算法的知识,当然前提条件是平时工作中经常写代码、对手写代码不生疏,否则就需要更多的练习,可以做完领扣网上170道左右中等难度的算法题。
关于基础知识的学习和积累,如果为了准备面试,进行功利性学习,那么对于JavaWeb后端开发技术栈的应聘者,至少要学习和掌握以下书籍中的内容,包括Java语言基础进阶和标准库、Java8新特性、并发多线程编程、Spring框架、Redis缓存组件、Java虚拟机GC相关等知识点。
字节跳动面试总结(2019年8月)

关于知识和技能的积累,还是应该进行长期学习,最好养成终生学习的习惯。以上书籍,本人是无法做到在短短几个月的时间里利用工作之外的时间全部学习和掌握的;得益于三年前从工作开始之初持续不断的学习和点滴积累,以上书籍基本至少读过两遍,还有照片上未能列举的书目。

除了刻意学习和编码练习,个人平时习惯于结合工作内容进行技术学习,不断尝试将学到的新工具、新技术引入到工作项目中去,比如引入Lambda表达式和流处理、追求编写整洁优雅的代码、制定Java编程规范、持续进行代码重构和软件迭代、采用Redis组件等等。只有学习致用,才能积累实践经验,至少在面试时能够从容应答,有理论知识有实践经验。存在的缺陷便是,由于与工作内容无关,当面试官问到是否了解大数据相关知识时,只能尴尬地回答完全不了解,所幸字节跳动对此还是相当包容的。

附:阿里两轮技术面

字节跳动的面试前后持续了3周左右,期间还经历了阿里巴巴飞猪旅行业务部门的两轮电话技术面。
第一轮面试历时40min,遇到的问题有:

  1. 数据库的乐观锁和悲观锁
  2. JVM的垃圾回收器,实际应用中采用的类型
  3. 多线程并发,volatile关键字
  4. 一致性哈希算法
  5. Redis,集群部署
  6. JDK8相比以前版本作出的改进
  7. 如何在项目组内推动落实编码规范
  8. 平时使用哪些Java诊断工具排查问题

第二轮电话面试历时30min,问题包括消息队列;以秒杀为背景结合实际的线上问题进行提问,包括百万级的并发量、缓存服务扩容等;Linux服务器上,给定一个10G的访问日志文件,统计出访问量最大的10个IP。由于平时工作中不涉及高并发等场景,采用Windows Server部署服务,面试官最后给我的总结是由于身处传统行业与互联网一线实战脱节比较严重,故第二轮面试顺利地挂掉了。