十年磨一剑:站在面试官角度聊聊现下大环境面试,“野生”程序员现阶段面试问题 & 学习误区

3. Hook

**Hook 的选择点:**静态变量和单例,因为一旦创建对象,它们不容易变化,非常容易定位。

Hook 过程:

  • 寻找 Hook 点,原则是静态变量或者单例对象,尽量 Hook public 的对象和方法。

  • 选择合适的代理方式,如果是接口可以用动态代理。

  • 偷梁换柱——用代理对象替换原始对象。

  • 多数插件化 也使用的 Hook技术

4. 内存泄漏

  • 构造单例的时候尽量别用Activity的引用;

  • 静态引用时注意应用对象的置空或者少用静态引用;

  • 使用静态内部类+软引用代替非静态内部类;

  • 及时取消广播或者观察者注册;耗时任务、属性动画在Activity销毁时记得cancel;

  • 文件流、Cursor等资源及时关闭;

  • Activity销毁时WebView的移除和销毁。

5. View

  • Window WindowManager WMS

  • View 工作流程

  • View.post

6. 动画

**帧动画 :**AnimationDrawable 实现,在资源文件中存放多张图片,占用内存多,容易OOM。

**补间动画 :**作用对象只限于 View 视觉改变,并没有改变View 的 xy 坐标,支持 平移、缩放、旋转、透明度,但是移动后,响应时间的位置还在 原处,补间动画在执行的时候,直接导致了 View 执行 onDraw() 方法。补间动画的核心本质就是在一定的持续时间内,不断改变 Matrix 变换,并且不断刷新的过程。

**属性动画 :**ObjectAnimator、ValuetAnimator、AnimatorSet 可以是任何View,动画选择也比较多,其中包含 差速器,可以控制动画速度,节奏。类型估值器 可以根据当前属性改变的百分比计算改变后的属性值 。因为ViewGroup 在 getTransformedMotionEvent方法中通过子 View 的 hasIdentityMatrix() 来判断子 View 是否经过位移之类的属性动画。调用子 View 的 getInverseMatrix() 做「反平移」操作,然后判断处理后的触摸点是否在子 View 的边界范围内。

提升动画 可以打开 硬件加速,使GPU 承担一部分CPU的工作。

7. Android 进程通讯方式

  • bundle

  • ContentProvider

  • 文件

  • Broadcast

  • AIDL

  • Messager

  • Socket

8. Android 线程通信

  • Handler线程间通信

  • Handler 同步屏障机制

  • Looper.loop 为什么不会卡死

  • Messaage复用

9. Android 和WebView 通信

  • js调用android

  • android 调用js

10. app优化 (项目中处理的一些难点)

  • 启动优化

  • 布局UI优化

  • 打包优化

11. 第三方库 源码总结

  • LeakCanary 原理

  • OkHttp

  • 同步请求流程

  • 异步请求流程

  • 责任链模式 和 拦截器

  • OkHttp 流程

  • ButterKnife

  • butterknife 实现流程

面试技巧


最近面试了很多人,但是基本上都没招到什么满意的人,是Android开发都凉了吗,其实并不是,从简历的数量上来看,金三银四的简历还是很多的,首先我们从简历上来说,面试官都希望看见什么样的简历呢?

大部分的简历,都是罗列自己的公司经历、项目经历,介绍了项目大概的情况,好一点的,罗列下项目的技术方案。

要知道,对于面试官来说,简历是很重要的一环,这是对你的第一印象评价,很大程度上决定了你的面试成败。我在面试的时候,简历发给我之后,通常会看一眼面试者的项目经历,从而决定了我的面试问题。所以,项目经历上只需要写下面几个方面:

  • 项目一句话简介,说明项目的大体情况和规模
  • 核心技术方案,介绍用到的核心技术、核心技术方案
  • 你在项目中承担的角色以及贡献等

实际上有了这些东西,我基本上可以了解你的这个项目大概是个什么规模,需要用到哪些技术点,以及你应该有的能力范围,下面我就会根据你的这些项目经历来对你提问,由浅入深,可能先问你大概的技术方案,是否有更佳方案或者现在的方案是否有什么问题等,再深入问问技术的细节,看你的技术深度和广度。

除了项目经历,你的简历上只应该出现你的亮点,切记各种废话,什么精通Java,精通设计模式、数据结构,这些根本不能体现你的特点,这些东西应该结合业务或者架构,例如利用设计模式改进了技术方案的流程,通过数据结构优化了程序的执行效率。

另外补充一点,好的开源项目、博客等等,这些都是比较好的加分项目,但是…如果你的开源项目连readme都没,你的博客全是流水账,那就不要贴了,反而容易减分。

面试实际上是一个双向的过程,所以,一场好的面试,绝不是面试官单方面的发问,面试者应该引导面试官,把面试当作是一场技术讨论,一来一回,双方都能了解对方的技术实力,我相信,这样双方都会对这次面试满意,通过面试也就是自然而然的了。

大公司和小公司该选哪个?

说完公司的面试,再说一下经常有读者私信我的一个问题,那就是A公司、B公司,我到底该选哪个公司,首先我要确认下你是不是来炫耀的。

对于这个问题,其实也是有一个个人看法的,这个看法是我的主观臆断,可能很多人也不会这样想,这里写出来,大家轻喷。

首先,如果你是刚毕业的学生,我会建议你去小公司、创业公司,但是,是技术型偏向的公司,绝不是外包或者某个公司的IT部,为啥呢,原因很简单,刚毕业这几年,是你飞速成长的几年,也是你选择方向的几年,在这些技术型小公司、小团队里,你可以非常快速的上手各种技术,没有任何外部压力,团队小,大家通讯基本靠吼,不需要走流程、发邮件、约评审,这是大公司的通病——决策链太长,同时,你对自己的技术定位,在一段时间后,也会更加清晰。

在这之后,除非有一夜暴富的机会,就不应该在继续在小公司待下去了,这时候,一定要去大公司进行历练。大公司去干什么呢?其实很多大公司的技术并不很先进,代码很可能也很烂,但是你去大公司,就好像游击队变成了正规军,你要学的是规范和流程,小公司的这几年,让你的技术突飞猛进,但是却不成章法,大公司就是让你来沉淀技术的(这句话要屏蔽老板),大公司经营多年,技术方案早已成型,很多开发者进去也是拧螺丝,但是,你需要的是了解各个系统、各个平台的流程、优劣,做到心中有术,而不是心中有码,如果你是一个可造之材,那么经过这样两轮历练,我相信你应该是一个很不错的开发者了。

学习

首先,学习这件事情,就是一个认知的过程,既然是一个认知的过程,那就不能以管窥豹,而需要站在一个全局的思想上来看,例如在学习Flutter的时候,没有必要精通所有的Widget,掌握常见的Widget之后,就应该去思考Flutter的绘制流程、刷新流程,了解这些,才能让你在全局角度上掌握Flutter的渲染过程,这比你掌握几个Widget更加有用。

更加通用的,我们平时应该尽可能的拓宽自己的知识广度,这样才能让你的眼界更加宽广。就拿Flutter来说,总有一些敏感词喷Flutter,Flutter能不能火我不知道,能不能推广我也不知道,但是我依然学了Flutter,这是为啥?因为通过Flutter我学习到了一种新的跨平台思想,一种区别于现有的命令式编程的编程范式,一种全新的改进渲染流程的方法,掌握这些,我觉得比单纯的讨论阿里是不是不再用Flutter了更加有用。

学习,永远是一个认知碾压的过程,不断接触新思想、新技术,才能让自己有更加敏锐的认知洞察力,就好像学了Flutter,你会发现Compose好像也是一样啊,SwiftUI好像也是啊,从更高的眼界上去看这些东西,其实本质上,都是一种思想,现在的社会早已不存在信息孤岛,学会将信息链接起来,才是高效的认知方法。

井底之蛙永远跳不出去井,也永远别用阿里是不是还用Flutter这样的事来限制你的认知,就好像三体人用质子封锁了地球的科技进步,可悲。

努力成为一个优秀的程序员

在大公司一定要吾日三省吾身,千万不能贪图安逸,一个技术用十年,你也只有一年工作经验。

写代码

永远不要上手就写代码。

这句话我们从小就听——不要上手就写作文,先想好提纲。编程也是如此,除非胸有成竹,否则绝不一码十行。

当我们拿到一个需求进行开发的时候,一定要先在大脑中推敲推敲,这个需求的每个方面是否都是完备的,是否有异常流程,这个需求的每个技术点,是否能够胜任这个需求,这个需求的流程,我是否完全都清楚了,这些东西都想不好,那就不是在编程,而是在「拉屎」,而且你拉的这些shit,很可能会把后面的开发者「淹没」,造成一场信任危机。

所以,写一个好代码的时间一定比烂代码花的时间更少。

不过,面对日益压榨严重的资本家们,可能经常不太会给够一个好代码的开发时间,这个时候,就需要对代码进行取舍了,或是找轮子,或是改轮子,总之,要把精力花在刀刃上,一个最佳的原则——make it work, make it right, make it fast,我认为,这是一个代码最佳的生命周期。

系统面试复习路线参考

成年人想要改变生活、逆转状态时,会不约而同做一件事,那就是再次学习。

接下来分享的系统学习资源以详解各大互联网公司的 Android 常见面试题为主线,从面试的角度带你介绍必备知识点,以及该知识点在项目中的实际应用

**帮你在现在的基础上,重新梳理和建立 Android 开发的知识体系。**无论是你短期内想提升 Android 内功实力,突破自己工作中的能力瓶颈,还是准备参加 Android 面试,都会在这份资料中有所一些收获。

从架构基础开始,分了8个模块来逐步从基础进阶到架构师的环节:

多余的话就不讲了,接下来将分享面试的一个复习路线,如果你也在准备面试但是不知道怎么高效复习,可以参考一下我的复习路线,有任何问题也欢迎一起互相交流,加油吧!

首先是超级详细得不能再详细的Android开发学习思维导图,因为图片实在是太大了,所以我就只把二级目录的内容放出来,更加详细的你们可以点击**这里**。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

我见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了5、6年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。

其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

些人的职业规划时,他们也没有太多想法。

其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!

[外链图片转存中…(img-7ItYzZPG-1713527596026)]

[外链图片转存中…(img-Jqisd93n-1713527596028)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值