前期面试准备

  • 算法
  • 基础知识
  • 项目经验
  • 场景分析

1.整体流程

一般三轮技术面和一轮hr面
第一轮
一般是你同时或者比你级别稍微高一点的。
主要问你一些基础或项目。同时会让你写个算法题
第二轮
一般就是你后期的leader
会问你一些业务场景解决方案和项目中的经验,也会有一部分的基础
会让你写算法题
各种解决方案(偏技术)
第三轮
项目部的技术负责人或者CTO这类的。
会问你项目,各种解决方案。
第四轮
一般hr面试
会问你工作经历
为啥出来看机会
薪资要求
选择我们的原因是什么?一定要表达出强烈想去它们公司的意图,就是死命舔( = = |||)
最后一轮
就是给薪资方案了。发offer
发offer后,就接就行,可以后期拒掉

2.自我介绍

每次都会让你做自我介绍,可以从下面角度说:

  • 从之前公司是干什么的
  • 你是哪个部门的
  • 你们这个部门是做什么的
  • 你负责什么
  • 擅长哪些技能
  • 负责过哪些业务难或者技术难的业务
  • 你的性格
  • 平日是否爱学习、爱思考(需要有证据)
  • 是否有自己的博客、git或项目

    3.算法

    大厂面试主要喜欢考察动态规划、链表、字符串排序,难度一般简单到中等之间
    代码行数在10-30行之间(如果解法太长的题目优先级降低)

    3.1刷题推荐

  1. leetcode前100道简单和中等难度的
  2. 牛客网高频200到题中的前100道(前30道简单和中等必刷)

    3.2突击题目

  3. 数组

    1. 两数之和
    2. 盛水最多的容器
    3. 三数之和
    4. 删除有序数组中的重复项
    5. 下一个排列
    6. 搜索旋转排序数组
    7. 移动零
  4. 链表
    1. 两数相加
    2. 删除链表的倒数第N个结点
    3. 合并两个有序链表
    4. 合并K个升序链表
    5. 两两交换链表中的结点
    6. 环形链表
    7. 环形链表2
    8. 反转链表
    1. 二叉树的前中后遍历
    2. 二叉树的层序遍历
    3. 平衡二叉树
    4. 对称二叉树
    5. 剑指Offer 二叉搜索树的第K大结点
  5. 动态规划
    1. 接雨水
    2. 最大子序和
    3. 乘积最大子数组
    4. 最小路径和
    5. 最长递增子序列
    6. 爬楼梯
    7. 买卖股票的最佳时机
    8. 买卖股票的最佳时机2
    9. 打家劫舍
    10. 最长递增子序列
    11. 零钱兑换
  6. 其他
    1. 排序
    2. 设计LRU缓存结构
  7. 合并类题目:合并有序数组、链表、多个链表或者数组的。并排序
  8. 必看:冒泡排序和快速排序

    4.基础知识(因为是java的总结 从中挑出几个go也有的)

  9. go基础

    1. 线程
    2. 同步异步
    3. 实现一个死锁
    4. 什么是公平锁和非公平锁
    5. 垃圾回收
  10. 基础网络部分
    1. udp和tcp的区别
    2. 三次握手和四次握手
    3. tcp头的结构
    4. http头的结构
    5. https的接口
    6. cdn是什么东西
    7. 什么是先后端分离,你们项目中怎么实现的
    8. 讲述一下一次完整的网络请求是什么步骤
  11. IO
    1. bio nio aio是什么
    2. 底层是怎么实现的
  12. mysql
    1. 事务的基本要素
    2. 事务的隔离级别
    3. 如何解决事务的并发问题(脏读幻读)(必考)
    4. mvcc多版本并发控制,底层实现(必考)
    5. binlog、redolog、undolog都是什么,起什么作用
    6. 给定隔离级别下,加锁的过程,表锁、行锁、间隙锁、排他锁、共享锁
    7. innodb和myisam的区别和优缺点
    8. 为什么选择b+树作为索引结构(必考)
    9. 查询在什么时候不走(预期中的)索引(必考)
    10. sql如何优化
    11. sql的执行顺序?或者order by的原理
    12. 让你写个sql,一般是join子查询居多(必考)
  13. redis(必问)
    1. redis的底层数据结构是啥,晋升条件、最大容量是啥
    2. 它为什么这么快,应用场景
    3. 它是单线程的吗?单进程的吗?
    4. redis的持久化机制,参数、流程(必考)
    5. 主从同步是怎么做的?同步失败了怎么办?还是失败怎么办?
    6. 热点key、大key是怎么发现和解决的
    7. 缓存穿透、缓存击穿、缓存失效都是啥
    8. 淘汰策略都有啥。内存满了还处理请求吗(必考)
    9. 了解bitmap 布隆表达式 lua 吗
    10. 分布式锁是怎么实现的?续期和安全性是怎么保证的?
    11. 他和memcache的区别
    12. 集群或者哨兵模式下是怎么工作的
    13. 怎么保持原子性
  14. kafka
    1. kafka的整体架构是啥,都有哪些部分促成的,作用是啥
    2. 怎么保证消息的不丢失
    3. 怎么保证消息的有序性
    4. 怎么提高kafka的并发,生产和消费都说一下
    5. 为什么kafka这么快
  15. 项目
    1. 项目里职责
      1. 会问你部门里有几个人,组成状态
      2. 这个项目多少人
      3. 这个项目你负责了啥,占了啥地位或者比重,工期啥的
    2. 项目细节
      1. 让你介绍一下项目整体流程
        1. 一定要有套路,先说架构或者整体,再说细节
      2. 会提问你难点和亮点,怎么优化或解决的
        1. 并发大?
        2. 技术难度大?
        3. bug或者坑太多?
        4. 你是怎么发现或者解决的?
        5. 如果你实际没有用过,但是直到如果用了哪个技术栈会提高并发啥的,可以尽管直接说,还可以怎么怎么优化就行。
        6. 核心思路:面试官其实不是想问你项目curd,而是你在项目中的亮点和难点
        7. 你需要让面试官认为你这个项目很难,技术挑战很高,然后你是怎么克服的
      3. 项目实践
        1. 如果你的项目实在平平无奇,可以融入下面几个亮点
          1. 分布式ID是啥?
            1. 分布式ID一般是解决数据库主键自增的。或者解决异步落库订单重复
            2. 雪花ID、redis自增、自制ID(时间+外键+随机 拼接的),分布式ID中间件(tiID)
            3. ID单个获取还是分批获取
          2. 分布式事务有哪几种
            1. 你们怎么用的,会问你XA TCC
          3. 分布式锁
            1. redis锁、zk
            2. 是怎么续约的
            3. 是怎么保证安全的
            4. 优化点:内存锁+分布式锁,用来降低分布式锁的压力和竞争
          4. 限流器都有哪些实现方式
            1. 内存 guava的RateLimiter
            2. redis自增ID或者lua脚本
            3. 快速失败还是超时失败,推荐快速
          5. 多级缓存
            1. 内存缓存+外置缓存
            2. 内存缓存:guavaCache Ehcache Caffeine
            3. 外置缓存:redis memcache
            4. 你们缓存是怎么更新的:永不失效,异步加锁更新
          6. 内存泄漏怎么解决的
            1. 线程、cpu、内存多方面考虑
      4. 方案规划
        1. 面试官会给出各种场景题,有的会给你出智商题,目的是:看看你真没真的用过,你的工作经验
        2. 场景题:
          1. 查询类问题
            1. 上N亿个数,找出其中最大的或者出现最多的前M个数
              1. 分而治之,先将N个数取hashcode取余,分到多个文件中,然后挨个文件取最值,然后聚合
          2. 存储类问题
            1. 我在群里发了一条聊天记录,怎么将所有查看过的人记录下来。并且要快速查询
              1. 有可能群里的人很多,或者群里变动很频繁
                1. 方案1:打印log日志,导入ELK里,借助ES的能力查询
                2. 方案2:使用redis的set或者map,value就是用户ID
                3. 方案3:使用bitmap,如果有500人,那么只需要500个位即可
                4. 方案4:使用布隆表达式,有很小概率误判,查询单个可以快速查询,如果多个的话,就从redis拿来下,自己在内存遍历一遍即可
          3. 并发类问题
            1. 高并发系统的限流如何实现
            2. 高并发秒杀系统的设计
            3. 负载均衡如何设计
          4. 智商类问题
            1. 就是一些类似于数学类的概率或者脑筋急转弯等
              1. 不要急,自己用几个简单的数模拟一下,应该就能答上来。能否打上来就看运气
                1. 数学题:随机在一个圆周上选择3个点,构成锐角三角形的概率
                2. 算法题:
                  1. 在一堆数里找一个方法随机选择一个最大的数
                  2. 一大堆黑兔子还有一些白兔子,所有的黑兔子都喜欢白兔子,白兔子不喜欢任何一只兔子,黑兔子之间可能喜欢或不喜欢,给了一个函数,里面有两个参数A和B,这个函数能判断A是不是喜欢B,让你设计一个算法,最快找出喜欢的兔子
                  3. 有一个整型数组,长度是N,取值范围是1~N,数组里的原数有的出现1次,有的出现2次,让你设计一个算法找出出现2次的;后来又改成了有的出现1次,有的出现2次,有的出现3次,让你找出出现2次的原数
      5. 面试结束提问
        1. 不要直接说“我没有问题了”
          1. “你有什么问题要问我”的潜台词是,“你还想了解一些什么?帮助你更好的留在这里?”,换句话说,“你有多想留在这里”
          2. 很多求职者觉得双方沟通的差不多了,往往会直接回答:我没有问题了,这样的回答有2个负面影响
            1. 你居然不想知道详细的、切身利益相关的、在公司网站和媒体无法获知的情况?这可能会让面试官认为你对这个职位的兴趣不大。
            2. 很多公司都非常注重员工的个性和创新能力,回答“没问题”,可能让面试官认为你是一个没有想法的人,给你贴上否定的标签
          3. 一定不要问很容易在网上搜到答案的问题,如业务、产品
            1. 提问也是有学问的,千万不要问通过互联网搜索就可以了解的答案,比如公司的主营业务、产品名称、行业地位等,否则会让面试官觉得你信息闭塞,对公司的了解不够,对此次面试准备不足
            2. 薪酬、加班等问题,不建议上来就问,可以放在提问的最后
              1. 很多求职者非常关注薪酬福利,第一个问题会问薪资待遇,第二个问题会问是否会加班,这非常不妥
          4. 像这样问,表现你是一个非常上进的人
            1. 为了更好的胜任这个岗位,我还需要补充哪些技能?入职之后是否会有产品培训和技能培训?这个职位在公司的发展前景怎么样?晋升机制?在什么条件下会或者晋升机会呢
            2. 赢得这个岗位需要几轮面试?接下来的流程是什么?开发团队有多少人?大家怎么分工?目前的核心工作是哪些
            3. 如果我来到公司后,每天的日常工作是什么?公司对我这个职位的期望是什么?如何评估员工在试用期的表现?考核标准是什么?
          5. 如果沟通的比较顺利,你可以这样提问,加深面试官的印象
            1. “请问面试官,你为什么会愿意留在这家公司?”这样拉近彼此的距离,面试官不是高高在上的。而是像朋友一样和你分享他的一段经历
            2. 如果沟通的比较愉快,求职者也可以在最后这样说:我没有其他问题了,与您交流非常愉快,能留您一张名片/方面加一下您的微信吗?
            3. 在前面沟通的比较好的基础上,面试官一般不会拒绝你的要求。这样做可以和面试官建立长线联系,后续不仅可以咨询面试结果,还可以请教其他问题。无论是否入职这家公司,都可以把面试官当成朋友来相处