老板:“欠你工资是为了让你时刻反思自己还有不足!”那我走?

Posted 陈京大帅比

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了老板:“欠你工资是为了让你时刻反思自己还有不足!”那我走?相关的知识,希望对你有一定的参考价值。

前言

今年3月份的时候,发现了一个很恐怖的事情,公司竟然从我入职到现在差不多一年的时间,每月欠发我工资500多块,原因不便细说,处理结果是等财务核算,根据公司的尿性,核算出来估计也得等下月才会补给我,所以也是时候准备着跳槽了,如果公司想找什么理由搪塞过去,等离职了那就诉诸法律吧。

结果是4月份还是一起结给我了,然后我也就果断跑路了,直接裸辞。跳就往大了跳,接下来就给大家分享一下我为期将近一个月的面经分享。简单来说对于大厂,除了对专业知识考究之外,对算法也尤为看重。

先简单的说一下情况吧,字节已经拿到offer,腾讯所有的面面试已经通过了,也应该有offer了。字节一共4面:3面技术,1面hr;腾讯5次技术面,1次hr面。其中5面是2个面试官上阵。

总的来说腾讯的面试确实强度更高更加持久。字节是分开一次1个小时面试的;而腾讯1、2面是一次一小时,而3面和4面是连续面试一口气高强度的面试2小时,5面则是2个面试官轮流提问。腾讯是持久战稍微脑子不清醒一点就可能出现大错漏。我在4面就是如此,差点出事了。请准备好糖分和水分及时补充,或者洗把脸保持清晰。

正文

面试的过程一般只有1个小时,如何在一个小时内彻底的考究你本人的水平究竟到达那种境界,也是面试官努力的方向。

而面试往往是由两部分构成:

  • 1.算法
  • 2.专业知识

关于算法

为什么把算法摆在第一点,因为算法在我看来这是大部分没有面试过大厂的朋友可能会忽视的一方面。它的重要程度不比专业知识的考究来的低。

在1-2小时内,如何能快速的看到你编码水平和思维就看这些算法的考究。

因此需要对常见的数据结构比较熟悉,如链表,树,栈,堆。需要知道遇到数组相关的题型可能需要用到如快慢指针等解题思路。还有广度深度优先算法。最后,如果还有更难一点的,会涉及到回溯,动态规划等解题思路。

前面几点都比较好处理,只要在leetcode上做到一定量的题目,都能反应过来。我本人认为我并非是聪明的人,做了300快400道题也仅仅只是摸索出了一些大致的套路。我是完全比不了那些做了100+道题就能灵活掌握算法的大神。 但是经过了系统性的训练,遇到一些常见的算法解题思路可以快速的反应过来。

而动态规划相关的问题,我看来是最难的。关键是需要判断题目是否可以分解成小问题且小问题之间不能互相影响,接着找到动态规划方程,或者是状态转移表。

在听到面试官的算法题后,先不要急着下笔。最好在下笔之前和面试官聊聊你的思路。不同面试官的要求不同,有的面试官,希望算法是原地算法,有的面试官希望时间复杂度降低,有的希望空间复杂度降低。

最好能清晰的表达你的初步思路后,面试官会知道你的算法的方向是否正确,可以一定程度上给予你方向上的指引。

记住就算你做过原题,除非你的方案能保证是从空间和时间复杂度是最优,不然我还是建议面试者多和面试官交流。在交流的过程中,面试官也能明白你的思考过程,从而判断你这个人的编程能力如何。

千万不要小看这个模块的考究,如果说面试专业知识是100分,那么算法题可以占据50分。如果你写不出,或者思路完全偏离了,那就可以说再见了。

最后,再给两点建议:

  • 一个人光看不练是不行的,一个人瞎琢磨效率偏低。

  • 最好可以买几本书或者课程指导。把基础都补充好后,可以去leetcode中对每一个数据结构专项进行训练。在这些基础上,在做一做剑指offer中经典题目也就差不多了。

关于专业知识

面试官一般会根据你的自我介绍以及简历上内容去发散提问,以及背后延伸出来的知识点,特别是在项目经历这一块,大家一定要好好琢磨琢磨,侧面的去体现自己的知识宽度去深度。当然也少不了自己平时的学习与积累,得有真才实学才行,如果一切都只是假把式,那最终的尴尬的只会是你自己。

当然也有一些老生常谈的基本考点,如Handler,多线程等,这一点建议大家可以多背背面试题,当然也要有自己的理解在里面。文末的话我也会将我的准备阶段刷的一些面经笔记分享给大家。

下面是面试情况,以及一些简答。实际上在回答的过程中,可以回答的更加详细,本文只是筛选了部分问题简单介绍了知识点的要点。

字节面试

字节面试一共4面。字节的面试风格偏向基础的内容,以及简历上知识点的扩展。

字节1面

  • 1.自我介绍,项目经历,项目上的优化项以及原因

  • 2.为什么使用mmap优化io读写,mmap和传统读写有什么区别?为什么选择它?

简答大意:mmap本质上从内核中 进程中申请了vm_area_struct虚拟内存后,把虚拟内存保存到 file结构体address_space结构体中的i_mmap中。当需要访问这段虚拟地址,就会产生却也中断,通过伙伴系统申请出物理内存绑定。如果是文件映射还会预读取文件内容,之后读取可以命中后续的缓存。项目中也有频繁进行写入,可以快速的同步到内存中。

  • 3.Object 中有什么方法?

简答:equal,wait等。

  • 4.Object 的equal实现?重写equal需要注意的方面。

简答: equal 本质上是获取Object的 hashCode。而在hotspot虚拟机中,计算方式在类markOop中,hashCode的计算是获取对象的高16位向右移动16位并且与上掩码。

equal 重写时候,需要按需求处理。一般的,为了让HashMap等需要hashCode计算正确,需要把equal中每一个成员变量。

  • 5.synchronized 原理。

简答:翻译成字节码后,本质上在虚拟机中对应两个字节码 MONITOR_ENTER 以及 MONITOR_EXIT 。通过Monitor进行临界区保护。当执行了MONITOR_ENTER后,本质上就会取出Object 中的LockWord 中的记录锁状态信息。

android 虚拟机中,存在3种锁。通过记录thread_id的偏向锁,瘦锁,胖锁。瘦锁是一种乐观锁,本质上就是不断的自旋让渡cpu资源。当64次之后获取不到,则转化为胖锁。胖锁的实现是基于futex 进行同步处理的。

  • 6.volatile原理

简答:解决三个问题。语序重拍,读时未同步,写时被修改。实现原理是基于读写栏栅处理cpu读写顺序,同时处理编译时候严格按照编码顺序处理。本质上是通过c++的atomic实现的。

  • 7.ui优化

简答:优化ui层级,activityidleHandler 处理不重要事件,提前实例化ui到缓存池子,x2c等,展开说。

  • 8.内存优化与LeakCanary的源码?以及LeakCanary的缺点和如何解决。

简答:LeakCanary 本质上是注册监听了四大组件的生命周期,当生命周期销毁时候,通过一个弱引用包裹该Activity/Fragment 等组件对象,并循环检测该对象是否销毁了。解决方案,可以通过ReferenceQueue+虚引用。当GC时候会把这些引用对象添加到引用队列中,接着通过ReferenceDeamon守护线程把数据保存在ReferenceQueue静态变量中,在ReferenceQueue的poll可以拿到。

  • 9.算法:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字(Leetcode原题)。

字节2面

  • 1.自我介绍,项目经历,项目上的优化项以及优化的原因

  • 2.Rxjava源码原理,以及项目中你是如何将Rxjava流进行复用。

简答:模仿DisposeObserver,当ObservableCreate 调用onSubscribe后就会关联从上流到下流的关系。并通过cas设置到当前执行包的全局变量中。当第二次使用同一个流调用onSubscribe关联再度关联,就会dispose当前的rxjava流。只需要处理这一步骤即可。

  • 3.你项目中高度自定义了DiskLRUCache。问LRUCache的实现?问LinkedHashMap的实现?问DiskLruCache的实现?问Glide中实现的DiskLruCache的运用。

  • 4.Handler的原理

  • 5.volatile原理

  • 6.synchronize 锁的转化流程。

简答:偏向锁转化瘦锁(owner thread id不一致且没上锁),瘦锁转化胖锁(64次获取不到锁后)。

  • 7.ReentrantLock 实现。

简答:由AQS(AbstractQueuedSynchronizer)实现。ReentrantLock 分为公平锁和非公平锁。AQS本质上是调用acquire 时候为本线程添加到同步队列中,每一个线程代表一个Node,在每个Node会自旋竞争同步队列中的状态。公平锁需要多一个判断,就是保证自己是头节点。

  • 8.ui 优化,首屏渲染时机优化

  • 9.启动优化,与AlphaManager的实现。

  • 10.插桩的原理以及运用。

    • ASM
    • Javapoet
    • 动态代理
  • 11.LiveData 和 ViewModel的源码实现

  • 12.x2c 源码实现

  • 13.DNS 原理

  • 14.https的原理

  • 15.算法:判断一个字符串是否是回文串(注意保证原字符串不可改变,可用O(n)的空间复杂度)。

方向:栈的考究。

字节3面 Leader面

  • 1.工作软技能的考核,以及团队中的定位

  • 2.如何进行io 优化,指标是什么,优化后的结果以及参数是多少?

方向:可以使用/proc/pid/stat读取cpu的idle,iowait等。使用mmap优化后的结果。

  • 3.算法:在一个单链表中,每k个节点进行反转,无法被反转的部分放在末尾。

腾讯面试

腾讯的面试风格,普遍是基于你的简历上项目经历,往细节往深处问。我是面试因算法失败了一次,后面第二次就成功了。

总结一下2次腾讯面试

腾讯第一次面试1面

  • 1.自我介绍,项目经历,项目上的优化项以及原因

  • 2.ARouter 源码实现,项目中对ARouter的扩展实现详细设计

  • 3.ui 优化,启动优化,首屏展示时机优化

  • 4.volidate 实现

  • 5.Java异常捕获

  • 13.DNS 原理

  • 14.https的原理

  • 6.jni 中JNIEnv 和线程的关系

  • 7.jni中有几种注册native方法。

  • 8.Native异常捕获

腾讯第一次面试2面

  • 1.自我介绍,项目经历,项目上的优化项以及原因

  • 2.ARouter的实现,以及自定义扩展ARouter的实现

  • 3.项目中的io 优化,以及为什么用mmap于io优化

  • 4.mmap的实现

  • 5.mmkv 中 对应 mmap 断电时候的处理机制

  • 6.mmap没调用msync时候,落盘时机。

  • 7.算法:合并三个单链表(可参考leetcode 合并多个单链表)

腾讯第二次面试1面

  • 1.自我介绍,项目经历,项目上的优化项以及原因

  • 2.ARouter 的实现,以及扩展的实现

  • 3.启动优化,以及ARouter的启动优化方式,ARouter的分区方式

  • 4.Navigation的源码解析

  • 5.基于Navigation 编写路由框架NavigationRouter 的源码实现,以及实现的优点

  • 6.Navigation 实现的路由框架中如何处理Activity和Fragment 嵌套启动的方式

  • 7.class的加载流程

  • 8.Handler的实现

  • 9.实现一个多线程下的消费者生产者模式

腾讯第二次面试2面

  • 1.自我介绍,项目经历,项目上的优化项以及原因

    1. io 优化 与 使用mmap的优势和缺点
  • 3.ARouter 的实现,以及扩展的实现

  • 4.多进程实现的路由

  • 5.如何进行多进程的同步调用,此时另一个进程还没有启动?

  • 6.数据结构中不支持多线程的数据结构,如果使用多线程操作会造成什么结构

  • 7.ArrayMap 实现

  • 8.HashMapArrayMap比较,两者的优缺点

  • 9.handler 的原理

  • 10.handler 是怎么进行postDelay 延时操作。

  • 11.当handler 只有一个延时的message时候,Looper中是如何运行。

简答:通过pollOnce 调用epoll 进行阻塞。

  • 12.volidate 原理

  • 13.当没有添加volidate 修饰属性的时候,数据什么时候从缓存行刷新到主存。

  • 14.算法题:在一个n*n的方格中。有两种方格,1代表阻塞不能经过,0代表可达。两点坐标,a和b。问a到b的最短路径。

腾讯第二次面试3面和4面

腾讯3面和4面是联系到一起的,这里一起说了

  • 1.自我介绍,项目经历,项目上的优化项以及原因

  • 2.mmap 实现原理和io优化

  • 3.View的绘制流程,从 setContentView 解析xml到View的绘制结束。

  • 4.硬件渲染流程

  • 5.SurfaceFlinger 在 View绘制流程中扮演的角色

    1. Choregrapher 的工作原理
  • 7.OOM 如何优化,内存爆满是虚拟内存容易先爆掉还是物理内存容易,一口气映射4g的内存是否会发生异常。

  • 8.Bitmap 如何优化避免OOM,为什么放在native中bitmap不容易OOM

  • 9.一个进程最多可以使用多少fd

  • 10.你研究过RN和Flutter,RN的渲染机制和Flutter的渲染机制是如何运作的?他们之间区别是什么?

  • 11.插件化你是如何实现的。

  • 12.算法1: 将一个int的数字转化成汉语说法。如10000转化为一万。

  • 13.算法2:中国下棋的马,能否吃掉另一个坐标的旗子,请找出坐标

腾讯二次面试5面

本次面试是两个面试官进行考察,考察的东西偏向网络协议。

  • 1.自我介绍,项目经历,项目上的优化项以及自己开源在GitHub上项目的特点。

  • 2.当遇到弱网络时候的优化

  • 3.当遇到弱网络时候,网络是如何进行文件重传

  • 4.当遇到弱网络时候,手机连接上了4g,但是没有数据流量时候,如何检测并恢复。

  • 5.当app在播放音视频的时候,需要注意的要点,以及相关的实现。

总结

从专业技能考察可以看到,实际上整个面试过程。腾讯面试的会相对仔细一点,技术广度更加广一点;而字节则更加偏向基础是否扎实。都是从你的简历项目,技术点开始询问,并根据你回答的问题,不断的调整询问的方向,不断的向下挖你的知识点,看能达到什么程度.

但是无论如何,你回答的层面最好足够深,从源码层级说起来。有时候面试官的对问题的看法和你的看法有分歧,此时就需要你是否可以从源码的层面上对这些问题有自己的解释。因此面试的时候只需要沉着冷静的思考,从源码的角度对面试官抛出来问题进行分析,就能比较轻松的解决。

最后的话,有需要我面试准备阶段刷题用的面经学习笔记的朋友可以点击这里自取


以上是关于老板:“欠你工资是为了让你时刻反思自己还有不足!”那我走?的主要内容,如果未能解决你的问题,请参考以下文章

与老板的最后一战(提离职)

老板的三个忠告

老板如何选择企业的核心层

软件的老板快捷键

爱生气的书店老板

如何在项目设计与实施过程中改变老板?