给Android程序员的一些面试建议,附带学习经验

我,来自大山。
我,不甘平凡。

笔者80后,出生在江西一个偏远的山村。虽然出生时已经不是那个温饱都是问题的年代,但是也谈不上有个幸福的童年。家里很穷。幼儿园并没有读,因为家里觉得花那个钱没有必要,小学才开始学拼音字母。我的童年,就是和我的姐姐弟弟在山中的梯田里放牛,抓泥鳅,割鱼草。

父亲在广东打工,母亲一个人在家里带着我们三个孩子。种种原因,在我从小学开始到高中毕业,我的学习一直很差。

直到我高考成绩出来的那一天。我妈看着我不堪入目的成绩哭成了泪人。我心都要碎了。也是从那一天开始,我决心要改变这种现状。我要走出这个山窝窝。

为什么想去字节跳动

实际上,这次的工作变动并不在我计划中。只是在四月份的时候偶然得知字节跳动上海要搬到合川路地铁站附近,我就忽然心动了。为什么呢,因为我家距离合川路地铁站步行只要十分钟。本身宇宙条待遇高名声在外,也就是说,只要我能来这里的话,人生最美满的钱多事少离家近的不可能三角我能拿俩。所以在五月份的时候我就开始悄摸摸地准备面试头条了。为的就是以后可以过上早上八点半起床,然后慢慢悠悠走到公司还不迟到(可能还是很早来的人之一)的生活。

当然,这是我为什么想去字节跳动的原因。换算到你们自己的时候,你们也要想一想是因为什么想要换一份工作、想要去某个公司。为了薪资?环境?平台?还是大公司的名头?记住,不管是为了哪一个,都OK的。谈钱不伤感情,目标明确,心智坚定以后,才好围绕着这个目标做一系列的准备。面试的过程中每次面试官问我为什么想来字节跳动,我都是直截了当地说离家近,还说假如这次面不上,准备准备,过段时间再面试好了。反正你们公司就在我家旁边,三年五载的可能都跑不掉,哈哈。

因为这种面上OK,面不上也没事的心态,所以感觉面试的时候我的发挥也好一些。本身就是一个互相选择的过程,而且这个过程中,公司方相对来说固定一些,因为他的招人标准不太可能会有太大的变化。拿我经常用来怼人的一个例子来打比方:我常常和别人说,搞技术开发,英语很重要。你需要英语来看最新的技术文档,并且有些翻译并不准确,你可能需要看原文才能理解什么意思。有的人当时就会和我说,哎,可惜我英语不太好。这个时候我会回,没事,你现在英语不好不是你的错,但是如果我一年以后,甚至两年三年以后再来问你英语怎么样,要是你还和我说你英文不好的话,那你就得查一下自己的问题了。你根本就不想着学英语,英语怎么可能会好?

类比下来,如果你根本不想去这个公司,那你怎么可能来到这个公司?如果你真的想去一个公司,可能现在这个时候你暂时不满足要求,但是没事,只要咱知道别人是啥要求,咱认真学习,好好准备,一年以后再面试,两年以后再面试,甚至三年、五年以后再来试试,都可以的。人最怕的不是没有达成目标,而是没有一个真正的目标。所以,换工作之前,你要想清楚为什么,并且提前开始准备。

我准备了些啥?

其实我有好长一段时间没有正规地面试过了。三年前从数云换到GIO的时候,因为简历上的相关技术太过于匹配,所以基本上就和CTO聊了聊就确定过去了;后来再回数云的时候,也就和总监喝了一下咖啡就回来了。也就是大约5年的时间里面,我没有正规地接受过面试。所以在准备投字节跳动之前,我投了几个公司做了一下热身活动。记住,这个时候其实不需要有啥心理包袱。因为本身候选人面试成功的可能性比较低,一个合适的可以面试的人选他们也很乐意看看,而且万一你确实想换工作,但是心仪的公司面不上,而热身活动的公司拿到了offer,你也可以考虑考虑去看下。并且这个时候你没有任何的心理包袱,因为反正你也就是来面试看看的,所以面试时候的发挥可能也会更好点,因此说不定最终拿的offer会比最后想去的那家更好呢?

当然这里面不包括我。我第一次面试的时候就被血虐了T-T。参加中间件比赛的时候,我用的netty做的实现。个人感觉对netty还算有所了解的,结果面试官让我直接写出netty的源码结构,包括哪几个主要的类以及名称还有互相之间的关系……工作的项目里面我使用了kafka来做消息队列,来缓冲流量,保护系统,结果直接让我描述kafka的存储结构……比赛的时候我通过各种手段让程序无GC,结果直接就要我说出各种GC算法的原理和应用场景……PolarDB比赛我们自己写了KV,对标的是RocksDB,结果让我描述RocksDB的索引结构……

当然,虽然基本上他问的东西我都有所了解,并且清楚应用场景在哪里,但是到了细节里面的时候,就稍微有点蒙圈了。虽然每个细节我确认我稍微看一下就能搞定的,但是架不住面试的时候无法张口就来呀。这个时候,感觉仿佛我变成了年轻时候的杨过,忽然身边出现了一个金轮法王对我说:“杨兄弟,你的武功花样甚多,不过我倚老卖老说一句,博采众家固然甚妙,但也不免驳而不纯。你最擅长的到底是哪一门功夫?要用什么武功去对付郭靖夫妇?”。对呀,我的知识面很广,各种应用框架新技术可能都有所耳闻,但是我最擅长的是哪一个呢?虽然我深深地知道我最擅长的是Scala和Akka、Play、Lagom等,但是架不住没有人会问呀T-T。

事已至此,虽然我帅如杨过,但是此时也不得不考虑一下整理一下平生所学,找出强点和弱点,然后在面试的时候有的放矢。所以第一次热身面试之后的一个星期,我基本就在整理我的知识结构了。我大致按照如下结构做了一份思维导图:

  1. JVM相关
    1. 运行时结构
    2. GC算法
    3. JVM调优
  2. 编程语言
    1. Scala
    2. Java
  3. 数据结构与算法
    1. 表、栈、队列
    2. 散列
    3. 优先队列
    4. 排序
    5. 高级数据结构
  4. 并发编程
    1. Java内存模型
    2. 基本工具
    3. 无锁并发
    4. 反应式工具
  5. 微服务
    1. 微服务设计
    2. 服务治理
  6. 中间件
    1. 分布式缓存
    2. 消息队列
    3. RPC
  7. 数据库
    1. 关系型数据库
    2. NoSQL
    3. NewSQL
  8. 机器学习算法
    1. 推荐算法

其中JVM、Scala相关、并发编程、消息队列什么的,我都仔细写了一下;Java语言太简单就没弄,数据结构稍微看了一下感觉脑海里面尘封很久的记忆忽然就被唤醒了,所以也没咋做笔记,微服务相关的太熟没弄,推荐算法太难了也没有弄;数据库相关的内容太多了,也没弄。但是大体来说索引结构在这里,拿到xmind之后,你可以按照自己的知识结构体系将其补全或者修改,然后学而时习之,甚至在面试之前也可以稍微看看加深一下记忆。(想要获得我的索引笔记,关注我的公众号,后台回复"知识索引"即可。)

这之后我就进行了第二次面试。第二次面试技术相关的问题其实就没啥太大的问题了,主要考验我的是说话技巧相关的事情。我这人有点毛病,想的太多,想要做的事情太多。这些其实没啥大问题,但是我不确定的事情我也喜欢和人说,还不分场合地就和人说了。比如,我面的是中间件团队,但是我终面面试的时候却说我因为之前搞推荐算法对深度学习产生了兴趣,想要今年考个在职研究生学一下深度学习。可其实,这个时候我说这个干嘛呢?脑袋有点抽抽的吗?并且他问了我一个手写代码的题,我想了半天没有想出来。问题是如何去算根号2的值。我的第一反应很快,牛顿迭代法嘛!但是他说让我在纸上把代码写出来的时候,我就一直在想办法回忆牛顿迭代法是个什么鬼,应该怎么用来算根号2。然后一直在纸上推演导数啊什么鬼的……直到他提示我这个不是一个数学问题,二分查找就能算出来的时候,我才心不甘情不愿地开始弄二分查找的写法(内心OS:牛顿迭代法肯定比二分查找好的呀!为什么不给我时间回忆一下牛顿迭代!)。这个时候又暴露了我一个问题,我好久没有手写代码了。没有IDE的时候,我基本上啥都不是……写了半天勉勉强强地弄了个版本出来,估计也不是bug free的。所以,最终这个公司的offer也没拿到。辛苦为我推荐的普架了。

这之后我又知道了我出来面试的几个缺点。首先就是要合适地说话,与面试无关的话题不要扯;其次就是我得练习一下手写代码了。不至于要刷题,但是问到什么必须能至少写出个大概吧。所以我就登录了我好友邱嘉和个人制作的网站 AlgoCasts, 看了一下他精心录制的小视频。然后跟着敲了一下代码。这之后,我就开始找人帮我推字节跳动了。

字节跳动面试体验

字节其实我面试了两个职位。第一个职位的一面感觉挺好的,面试官很亲和,问的问题也蛮到位的,然后留给我的发挥空间也蛮大的,所以顺利过了。二面的时候就有点聊不来了,而且越聊越感觉职位不合适。所以后来朋友帮我重新推了一个职位,就是我现在所在的数据平台部门。一面的面试官又年轻又高大又帅气,而且基本上是针对我的简历问的问题。当然,第一个问题让我讲Akka的时候,我是真的呆了。完全不按套路出牌呀!我从来没有遇到过有人会问我Akka的!!!怎么会有人问我Akka!!!内心一阵狂喜和激动之后,我先收拾了一下心情,慢慢整理了一下自己脑海中一直在跳着举手喊着"讲我讲我"的Akka特性。于是先从线程模型开始讲起,讲了它的M:N实质,Actor模型依赖的消息传递模式,层级结构划分的监督职责,让它垮的失败处理,Akka集群支撑起的横向扩展,等等等等。然后围绕着Akka又问了一些小问题,基本很顺利的过去了。后来又问了一下缓存相关的内容,其中讲了一个缓存雪崩的问题我一时半会儿没有反应过来。问题其实很简单,就是忽然有一堆请求访问同一个key,而这个key在缓存中不存在。如此所有请求就会同时去访问数据库然后又同时去更新缓存。这样的缓存雪崩效应应该如何解决?这个问题听起来其实很熟很熟很熟的,但是当时我脑袋短路了没有想起来。后来想起来原来Akka-Http-Caching(以前的Spray-Caching)就是专门为这种情况服务的。老外给的说法是这种问题叫做惊群效应,讲的是很多请求在第一个请求完成之前,一起访问同一个键(This approach has the advantage of taking care of the thundering herds problem where many requests to a particular cache key (e.g. a resource URI) arrive before the first one could be completed.)。文档上说的This approach指的是缓存的时候,不要缓存一个值,而是一个Future[T]。这样,第一个请求获取值的过程也被缓存下了。后续的请求就会访问到这个Future,然后可以向其注册回调,等待缓存动作完成再完成回调。当然,这个没有答得特别好也没事,后续又问了我一下关于JVM相关的一些东西,最后手写了一个算法题。然后一面顺利地就过了。

之后二面的话基本也是围绕我的简历来问的,讲了一下当时做的推荐算法的原理,讲了一下Spark的基本原理,然后最后做了一个算法题,然后也顺利过了(其实还有一些其他问题,但是我忘了问的是什么了……)。当然这个算法题的实现并不是最好的。题目内容是26进制的加法,其实要涉及单个字符的加减和进位的处理的,这样实现下来细节就要处理好多东西,还很有可能出错。所以我取了个巧,我先把字符数字都转化成了整型,然后整型加减得到结果,然后再把结果转化成了26进制字符。虽然结果不是最优的,因为数字大了肯定会溢出的嘛。但是起码还是做出来了,所以二面也顺利过了。

三面的时候也是先围绕着我的项目问了一些相关的问题,所以答得蛮平淡的,但是也还行。然后他问了一下我如何做流量控制。问我流量控制哎!!!然后,我又强行按捺下了内心的喜悦,将《反应式设计模式》的第十六章流量控制的内容大致讲了一遍。也许就是给了这样一个我发挥的空间,所以我第三面也很顺利地过了。没多久就是HR面试大致谈了一些技术之外的问题。

HR面我就中规中矩了。当时面完感觉就稳了,但是等了好久好久还没有跟我沟通offer的事情,等的我有点难受了……之后HR联系我说,还要给我加面试,说团队老大要面我一下。原本字节面试一般3+1就OK了,然后突如其来地加面试让我感觉有点忐忑,所以后面的面试发挥没有前面好了。其实后来回想一下,我可能是以为前面面试表现不好,不能给我确定offer,才会有后来多的面试的。所以当时心态不好,答的感觉也没有之前果断。后来第五面完了以后,团队老大还是不确定,还要加一面交叉面试,这个时候我就豁出去了。无所谓,面上面不上没关系,反正字节跳动在我家旁边,只要庙不搬,我就进得去。所以最后一面跟隔壁leader聊的时候相对来说还好一些。问题没有问啥特别的,就是仔细问了下我最近做的一个项目,优点在哪里,缺点在哪里,难点在哪里。然后顺着难点来进行扩展,为什么是难点,怎么解决,有哪些方案,这些方案有哪些优缺点。幸好我平时工作还是有思考的,所以最终答的还不错。于是终于到了6月10号左右,HR和我确定要发offer了。

最后

简历首选内推方式,速度快,效率高啊!然后可以在拉钩,boss,脉脉,大街上看看。简历上写道熟悉什么技术就一定要去熟悉它,不然被问到不会很尴尬!做过什么项目,即使项目体量不大,但也一定要熟悉实现原理!不是你负责的部分,也可以看看同事是怎么实现的,换你来做你会怎么做?做过什么,会什么是广度问题,取决于项目内容。但做过什么,达到怎样一个境界,这是深度问题,和个人学习能力和解决问题的态度有关了。大公司看深度,小公司看广度。大公司面试你会的,小公司面试他们用到的你会不会,也就是岗位匹配度。

面试过程一定要有礼貌!即使你觉得面试官不尊重你,经常打断你的讲解,或者你觉得他不如你,问的问题缺乏专业水平,你也一定要尊重他,谁叫现在是他选择你,等你拿到offer后就是你选择他了。

另外,描述问题一定要慢!不要一下子讲一大堆,慢显得你沉稳、自信,而且你还有时间反应思路接下来怎么讲更好。现在开发过多依赖ide,所以会有个弊端,当我们在面试讲解很容易不知道某个方法怎么读,这是一个硬伤…所以一定要对常见的关键性的类名、方法名、关键字读准,有些面试官不耐烦会说“你到底说的是哪个?”这时我们会容易乱了阵脚。正确的发音+沉稳的描述+好听的嗓音决对是一个加分项!

最重要的是心态!心态!心态!重要事情说三遍!面试时间很短,在短时间内对方要摸清你的底子还是比较不现实的,所以,有时也是看眼缘,这还是个看脸的时代。

希望大家都能找到合适自己满意的工作!
如果需要PDF版本可以在腾讯文档中自行领取!

进阶学习视频

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

d基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-XFo3yNuZ-1621071300425)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HBase查询速度慢原因排查

问题:通过HBase访问服务在HBase中查询 ASSET_NORMAL 表速度很慢 如下,查询一条数据需要2.970s时间: 如下,统计总条数需要14.675s时间: HBase访问服务部署了3个节点: HBase部署了3个节点: 表 ASS…

网易云的朋友给我这份339页的Android面经,持续更新中

程序员职业生涯真的很短吗? 不短,我就是明证!我今年44岁,世界500强公司,编程20年,软件技术专家,一直都在编程一线,从来离开过。技术上,我深入的使用过Java、.net、Js等等。也许吧&…

PIE SDK主成分变换

1.算法功能简介 主成分变换(Principal Component Analysis,PCA)又称K-L(Karhunen-Loeve)变换或霍特林(Hotelling)变换,是基于变量之间的相关关系,在尽量不丢失信息前提下的一种线性变换的方法&a…

网络优化软件apk,金九银十怎么从中小企业挤进一线大厂?我先收藏为敬

前言 从毕业到现在面试也就那么几家公司,单前几次都比较顺利,在面到第三家时都给到了我offer!前面两次找工作,没考虑到以后需要什么,自己的对未来的规划是什么,只要有份工作,工资符合自己的要求…

渣本毕业两年经验,大厂面试题汇总

开头 最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班&#xf…

渣本毕业两年经验,看这一篇就够了!

最近跟我的一些读者交流,有一位读者的经历让我记忆深刻: “有一次和大学同学聚会,和几个在BAT的同学聊了聊技术,发现自己在创业公司这几年,完全是吃老本的状态,没有什么机会精进技术,同样是工作…

温故而知新!微信小程序的事件处理,吊打面试官系列!

前言 现实就是,99%的职业,年龄增大后都没前途。没前途是绝大多数普通人的宿命,有前途的人也用不着等到老。有没有前途已然不重要,无论做哪一行,健康的心态永远是首位。 从我个人的角度写写30多岁码工的感受&#xff…

温故而知新!这篇文章可以满足你80%日常工作!面试真题解析

前言 程序员这个行业,日新月异,技术体系更新速度快,新技术新框架层出不穷,所有的技术都像是一个无底洞,当你学得越多就会发现不懂的越多,不懂的越多,需要学习的就更多。 因此,一旦…

我的MarkDown入门

目录 0.前言1.软件准备2.基本语法2.1斜体&加粗2.2分级标题2.3分割线2.4超链接2.5列表2.6引用2.7插入代码2.8插入图像2.9插入表格2.10目录2.11注脚2.12LaTex公式3.Tepora主题4.结语0.前言 最近学习了最基础的MarkDown的使用,MarkDown真的很好上手,大概…

漫谈MySQL权限安全,威力加强版

缘起 经过近十年的发展,Android技术优化日新月异,如今Android 10.0 已经发布,Android系统性能也已经非常流畅,可以在体验上完全媲美iOS。到了各大厂商手里,改源码、自定义系统,使得Android原生系统变得鱼龙…

漫谈MySQL权限安全,跳槽薪资翻倍

前言 很多公司在招人这件事情上都会面临一个问题; “我们的招聘要求又不高,能做项目就行,但为什么就是招不到人?” 很多公司还面临一个问题,招聘的时候这人各方面都不错,但上岗了就是不出活,绩…

灵魂一问-如何彻底防止APK反编译?成功定级腾讯T3-2

前言 这次去腾讯面试的是我大学同学,我们大学都是一学习,一起吃饭,一起洗脚,一起。。。 他们公司最近也裁员了,不过他是裁员前去的腾讯,不知道谁捞到他简历了,莫名就走了流程,他莫…

asp.net core 系列 6 MVC框架路由(下)

一.URL 生成 接着上篇讲MVC的路由,MVC 应用程序可以使用路由的 URL 生成功能,生成指向操作的 URL 链接。 生成 URL 可消除硬编码 URL,使代码更稳定、更易维护。 此部分重点介绍 MVC 提供的 URL 生成功能,并且仅涵盖 URL 生成工作原…

Jenkins 中定时任务构建

一般,在Jenkins中搭建项目完成后,项目可正常运行,基本都会进行定时任务的构建。特别是重要的接口,进行关键接口自动化的日常巡检 时,基本都会设置成定时任务,以方便每天,接口的自动化&#xff0…

爆赞!Jetpack-MVVM-高频提问和解答,满满干货指导

前言 今天我给大家再次分享一下,我最近的一些读书的感想,思考起来,确实能够给自己带来一些真实的帮助和启发,希望大家在平时的工作学习中,也能够认清楚学习的一些本质。 如果我们的学习是在不断掌握应对具体工作场景…

牛笔了!Android面试真题解析火爆全网,面试必备

开头 最近有粉丝反应,不想做安卓了,有朋友转到前端了,安卓不行了,问我怎么办? 自从RN,Weex这种跨平台编程语言出来以后,安卓将死的言论总是不绝于耳。随着颇有摧枯拉朽之势Flutter的出现&…

腾讯,字节等大厂面试真题汇总,深夜思考

前言 最近经常被朋友问到的两个问题。 问题一: “从事IT工作3年了,做技术好累啊,是不是做到30岁就不能继续往下做啊?”问题二: “我已经30岁了,还能不能学编程?” 我给出的答案是&#xff1a…

腾讯,字节等大厂面试真题汇总,进阶学习资料!

前言 找工作还是需要大家不要紧张,有我们干这一行的接触人本来就不多 难免看到面试官会紧张,主要是因为怕面试官问的问题到不上来,那时候不要着急 ,答不上了的千万不然胡扯一些,直接就给面试官说这块我还没接触到&…

【题解】鱼塘钓鱼

题目描述 有N个鱼塘排成一排(N<100),每个鱼塘中有一定数量的鱼,例如:N5时,如下表: 即:在第1个鱼塘中钓鱼第1分钟内可钓到10条鱼,第2分钟内只能钓到8条鱼&…

腾讯,字节,阿里,小米,京东大厂Offer拿到手软!分享一点面试小经验

(一)简介 Handler机制是一套Android消息传递机制。在Android开发多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 UI主线程,从而实现 工作线程对UI的更新处理,最终实现异步消息的处理。 在Android开发中&a…