2018年初面试回顾

抱着面一次学一点知识的心态写下此文,知识浅薄忘扶正。大部分的内容都有链接可以点击
面试岗位分别为:

  • 阿里巴巴-优酷-视频分发-高级开发
  • 哔哩哔哩-基础架构部
  • 饿了么-基础架构部
  • 蚂蚁金服-国际事业部
  • 阿里云-表格储存

3-5年工作经验岗位。

目录

数据库相关

  1. 关系型数据库的特性?

    这个问题其实问的是 ACID 这个特性。

  2. 数据库的索引是否了解?
    大家都听过的,之后会追问,索引如何实现的? B+树的实现 可以参考这篇文章
    我觉得一点要注意,可能和我一样忘接了B树是多路的不是二叉树,并且B+树和B树的有个很大的不一样,B+可以通过叶子结点遍历整个一层,而B只能从根节点访问,所以B+在磁盘的上表现更好,因为数据聚合在一起。(阿里的面试官反馈最想知道的其实索引在内存, 比磁盘更快)

  3. 哪些字段适合增加索引?
    这个问题在网上说的也比较的空洞,这里有一个比较好的文章可以看一下 数据索引的选择
    这个问题一定注意索引是有成本的,主要在于第一会大量的增加内存空间,之外每一次的插入,更新,删除都需要重新维护索引。

  4. 设计一个菜市场系统,每天有不同的供应商在系统上提供报价与库存,采购商会选择购买,每天需要打印报表,请设计。
    这个问题,不是很难,面试的时候紧张话可能导致思维受阻,我的回答是

    • 用户表(id, name, phone, type)
    • 库存表*(id, user_id, price, stock, category)
    • 需求表(id, user_id, quantity, category)
    • 交易表(id, buyer_id, seller_id, category, quantity)
  5. 设计一个电视剧介绍的数据库,电视剧有名称,描述等信息,考虑分多季,每季有多集?

    • 电视剧(id, name, desc….)
    • 季数(id, no,teleplay_id, author…)
    • 集(id, season_id, url, desc)
      开始回答这个问题的时候都考虑到认为是多对多的采用关联表,现在觉得其实一对多,使用外键即可。
      之后会催问,如何实现针对VIP可看最新一集,或者是使用观影卷,我的设计增加一个额外的信息表。就不展开多说了。
  6. Redis中的LRU是如何实现的?
    看过这个又忘了,我就说了一个暴力的方式,用Array实现,当然Array实现就会CopyArray的开销很慢,面试官当然会问我还有没有更好的方式?那我想了下用Tree自璇吧,面试官懂了,提醒我用 双向链表,好吧,我知道自己错了,这样就很明白LRU的实现了,面试之前还得多看看数据结构相关的。

    总结:数据库相关的内容大概就是这样的,B站在面试的过程中会考关于数据库设计,这块我觉得我们小公司出身的程序员可能占优吧,因为数据库真的是自己设计的。

  7. Redis中的zset原理
    跳跃表的实现方式。

  8. 联合索引
    联合索引的最左匹配原则。

Java相关

  1. Hashmap的实现原理?
    这个问题属于烂大街的问题,就不做描述了(Hashmap实现),但是除此之外问了一个问题,在高并发的情况下,hashmap 会导致死循环的问题,这个笔者在工作中没有遇见,这个只是在竞争的情况下才会发生,具体的原因 多线程的情况下的扩容导致 ,没回答上来的难点。

  2. Netty为什么可以提高性能?
    这个问题Netty实现原理浅析,我觉得核心在Reactor上,采用事件的方式减少了BIO的线程等待,不过面试官好像不太满意,额我还是觉得我应该回答的没错……略尴尬

  3. JavaComplier的实现原理?
    编译原理没学好,我放弃。这个问题是我说我写过JVM虚拟机因伸出来的,至于我记得部分就是抄袭 《自己动手写Java虚拟机》使用Go做了一个简陋的虚拟机。

  4. JVM的GC?
    这也是一个老生常谈的问题了,但是一时间还真是记不住,推荐一篇好文 Java 虚拟机面试题全面解析,关于GC的也推荐 GC算法 垃圾收集器,实战推荐 从实际案例聊聊Java应用的GC优化 。还是推荐大家背一背,真心会忘,实在能记得大概吧,不然就有点尴尬。补充一个CMS的细解

  5. 触发Long GC原因可能是?
    没有触发过,发个文How to Reduce Long GC Pauses,简而言之有几个原因

    1. 大量的对象创建
    2. young和old的比例失调
    3. 小内存导致使用大量的交换区
    4. IO堵塞
      这里的LongGC应该说的是经常发生GC而不是很长的GC
  6. 字节码操作会使用在哪些地方?
    笔者所能够想到了就是 Spring在实现动态代理的地方使用了 Cglib,这里有文 字节码操纵技术探秘 实际上我觉得使用的地方应该不是特别多。

  7. 设计模式的使用
    老生常谈 设计模式——开发常用的设计模式梳理

  8. 解释锁的各种特性
    推荐一个文章 java 中的锁 – 偏向锁、轻量级锁、自旋锁、重量级锁

项目相关

  1. 某项目强依赖Redis,如果Redis挂掉怎么处理?Redis连接变的高延迟怎么处理?
  2. 设计一个日志收集系统,2K终端会上传日志压缩包200KB以Gzip的方式上传,架构如何设计,最终能够做数据可视化。

算法部分

只有在阿里云的一面的时候考验了写代码的能力。

  1. 3Sum
    这是Leetcode很经典的一道题目了,leetcode-3sum 关键是会引导你去想出最优解。
  2. 最长递增子串
    动态规划的经典问题,longest-increasing-subsequence 写出转移方程还会再问你是否有更优解。

整体看来还是DP问题可能因为代码量少,思维强度大,这个应该是面试中最值得注意的题目了。可以同学学习背包九讲

杂项

  1. 你认为好代码的代码应该是怎么样的?
    关于这个问题,我觉得代码的一致性,我在这四年来的代码经验中,就像是代码大全开篇所言的(隐喻性),就像是一个房子在构建,如果有标准化的工程,那我们在参观每一个房间的时候就会很省心省力,代码如果都是一致的,那阅读的过程中就会很轻松。

  2. **你有什么想问我的? **
    这个经久不衰的问题(:-D),我每次都还是喜欢问面试官他工作的难点是什么,和自己的预期进行一个匹配。

其他

大部分的架构部门都会考虑Go,所以都会问下Go学的怎么样,大家如果立志于架构组还需要学习现在更流行的Go语言了。