近期面试小结

作者:究极逮虾户

最近面试了不少的公司,行情整体来说还是非常差的,如果没有必要不建议大家裸辞,另外就不总结面试的题目了。这次打算着重从项目经验上来给大家讨论下,我觉得这部分可能才是面试中得分比重比较大的部分,如果你真的是要从八股什么的得分,估摸现在也很难从池子中脱颖而出。

还有就是个人建议大家都要做好复盘工作,每一段时间定期回顾下之前的工作内容。并不是所有的工作内容都是重复劳动,要把自己工作内容中的一些难点进行总结,无论是解决了一个bug或者是解决了个技术难题,这样方便大家以后的面试中进行表述。如果都是在面试前进行回顾的话,往往之前做的很多有意思的东西会被自己忘掉,也很难很好的表述给面试官。世界上最痛苦的事情不就是你明明做了很多很好玩的事情,但是没办法和对方描述出你做的是啥吗!

聊项目

面试前一定要对自己的工作重点进行盘点,如果觉得口才不好你可以先用文字的形式进行整理,面试的时候用最少的语言让面试官能知道你之前做了什么,带来了一些什么收益,然后你的目标是什么,你是如何分析出这些问题的,最后你的解决方案是什么。你可以顺便总结下中长期规划是怎么样的,当然这个也并不是所有的工作内容都需要说的。

另外再牛逼的技术你也是需要表述给别人能听懂的,这个是非常非常重要。在面试过程中不妨多向面试官询问下他想要关注的内容是什么,面试就是一个沟通的过程,不妨多问问面试官并不会引起反感的。

还有你一定要好好的盘点下你最近的这段时间的工作内容的亮点是啥,你想要和面试官聊的是什么内容。最好也提前了解下岗位,因为不同的岗位职责你可能要准备的面试重点是不一样的,比如我的米哈游面试我要准备的面试重点内容就是支付和推送相关的sdk设计,如果我要面的是ci cd 岗位的话,我要准备的面试内容就是和编译构建,还有工程架构相关的内容。

还有一点就是面试前一定要提早准备下你们最近的数据,数据基本很难造假,用数据说服别人是一件比较容易的事情。

Gradle同步速度优化

起因就是去年初业务同学反馈Gradle同步一次需要20分钟,实在是太慢了影响到他们的开发。我们在做这个技改之前观察了工程半年的MR状况,分析之后得出了一个结论,85%以上的MR变更的内容都是针对一个模块的。所以如果我们可以提供一个更小更细碎的工作单元给到研发同学,让研发更聚焦于业务之内,之后通过桥接了整个工程的编译,能得到一个编译产物,这样就可以形成一个新的工作流。

Gradle同步提速的本质其实就是通过gradle的复合构建加上我们原来的编译提速原理,将没有变更的gradle module更换成一个gitsha值相关的aar缓存。因为复合构建的优势,每一个gradle工程都是具备通过AS直接打开的能力,所以研发同学就可以在这个更小的gradle工程内进行研发工作了。

面试的最后还要以数据对这部分内容进行收尾,这样比较有说服力。

我们原始的大仓同步模式平均一天使用70次,平均耗时18分钟。而新的同步模式平均一天使用150次,平均耗时3分钟。两者的使用比例大概是1:2,由此可证新的同步模式得到了大部分研发同学的肯定。

在我们后续的迭代过程中,我们将工程拆分成40个复合构建,之后我们发现当我们的复合构建会拆的更细碎之后,复合构建工程之间的依赖串联就会变得更复杂,所有这里我们通过DAG的模式,通过定义了一个yaml dsl文件,对于复合构建之间进行了依赖描述,比如说业务依赖了common,common依赖了framework,framework依赖了api还有三方库。

编译速度优化

因为我们做了非常多的编译数据的建设,所以我们有一个完整的数据指标来支持整个工程的构建速度优化的。编译我们会拆分成两个大的阶段,configuration以及task执行阶段。

对于前面的configuration阶段,我们会先遍历一遍工程的文件树,还有获取模块gitsha相关的操作,我们发现这部分的耗时在1分30秒左右的时间,然后我们通过了多线程并发的方式,将获取gitsha的动作放在子线程中执行,之后进行await的操作,另外就是我们在文件遍历操作中,进行了大量的无效剪枝的操作,从而把这部分的性能提升到30s的时间,而对于工程的二次编译的情况,我们采取了讲这部分数据结构json化,之后通过反序列化的形式完成,优化到了6s的时间。

另外就是task阶段,我之前的那篇编译优化其实也有说明,对于一些编译过程中的检查性质task可以采取关闭策略,这样也能做到编译提速。另外一些就是常规理论了,什么源码转化二进制啊,settings的exclude移除模块之类的。

最后因为编译大盘的缘故,所以对于后续我们的整体规划就是提供一个模块级别的编译数据支撑,然后将大模块的编译耗时拆分成更细碎的子模块。

单仓多App

这应该算是我工作十年以来最满意的作品了,我觉得我还是帮公司做到了一点点的降本增效工作的。

一家公司只要维护的app多了就会有这样的一个问题,就是工程组件的复用共享。之前我打工过的公司,都是采取的是提供aar,模块中异化的代码通过条件编译来处理,然后提供这样的组件输出给别的app使用。

我们之前设计的一个通过yaml来描述的复合构建能力,通过appkey基于上述描述的yaml dsl,然后把构建所需的最小单元描述出来。这样就能使不同的app采用不同的复合构建之后编译出他们的apk。

工程的迭代的过程也是逐步演进的一个节奏,去年初的时候先是用一个新孵化的app进行试点工作,探索中发现了原始的模式的兼容性问题,有且仅对主app模块负责,我们对这个模式进行了优化。将我们的monorepo转化成了一种pipeline检查阶段不区分appkey,而apk打包阶段筛选出最小构建单元的模式。

在这些基建工作完成之后,我们后续对于直播姬还有必剪工程进行了一次大刀阔斧的改造,包括但不局限于条件编译,基础库版本不一致,编译打包问题,flavor相关不同的代码片段等等的改造工作,最后把他们的工作流和整个大仓完全的进行了统一。

这么做的好处其实不言而喻,所有工程的工具链都统一了,所有基础库的升级都变成一致的了,还有就是所有代码的仓库的迭代节奏也是完全一致的。所有apk都是主干研发的模型也是得到了相对应的兼容。

工作流

首先我们把pipeline保障拆开三部分,第一部分是mr的准入前检查,第二部分是合入阶段的检查,最后的是每日任务。

准入前检查应该算是最多的一部分,比如说模块的lint,模块的unittest,代码cherry-pick到master进行打包,还有方法签名校验,资源文件压缩率,二进制缓存生成等等。

第二部分现在相对内容比较少,负责的内容是生成一个lock commit,还有一个就是我们的changelog周知的能力。

每日检查我们会定义一些代码质量相关的,会在一些闲时的时候进行一些耗时任务,比如每日全量的代码质量,每日全量的unittest,分层编译所有的模块资源,snoarquebe上传等等。

做这些的目的主要就是让ci侧更加健壮,很多事情都还是ci侧要先行一步的,毕竟所有代码的合并流程都是从这边开始的。

工具链支持

这部分应该算是投资回报率(ROI)最低的工作内容了,我们需要把工程内所有基础sdk还有agp,kgp等等编译工具链都完成一次统一的迭代升级操作。更多的是升级带来的风险,所以我们因此开发了一套changelog周知的能力,把这部分变更合入到mastr之后主动的告知给所有的研发同学。

你们怎么做合规?

为了保障工程的长治久安,我们是通过lint去做整个工程的后续增量检查,由于我们在mr合入阶段设置了lint的增量卡口,所以就能防止后续新增代码调用这些敏感的api相关了。

然后就是方便测试的调试工具,我们通过art hook的形式把这部分可调试能力对测试同学进行了支持,如果在这个阶段调用了敏感的api,就会直接崩溃并把堆栈进行输出。

最后自然就是asm的兜底,把所有敏感的api通过字节码框架进行统一的替换,守住整个app的下限。

因为合规相关的诉求又和启动链路息息相关,所以我们也通过DAG的形式梳理了整个启动链路,并对其进行了task化改造。

然后因此我们公司内部还在推动所有基础sdk的二次迭代,让他们具备自动编排启动的能力。

sdk设计

不是我自夸,其实这部分设计能力我真的遥遥领先。以下内容纯粹个人看法,接下来开始我的表演。

首先是针对于接口编程那一套,让业务之间的交互都是基于接口,而把实现类内聚与当前的模块中,这样就能做到里式替换原则。

另外一点很重要的就是依赖最小化,使用方会喷sdk的依赖太重导致整个包体积激增,所以依赖是要好好控制的,除非是一定是要使用,否则能不依赖的库就不依赖,能写成抽象接口的就写成抽象接口。

入口参数最小化,最好不要直接使用基础的数据类型,而建议通过构造器模式,然后构造一个对象传入sdk的入口函数中,方便后续拓展。否则频繁的增加入口参数会让业务唾弃你的sdk。

以支付作为一个栗子,将支付渠道打散之后,我们可以通过反射或者类查找器的机制获取到代码中的实现类,然后将整个sdk组装起来。

更便捷的接入方式,如果是一个平台方,就需要考虑业务的接入成本,因为你真的需要用质疑的眼光来看待你的接入方,他真的可能会给你折腾出很多奇奇怪怪的幺蛾子的。

kmp

跨端一直都是面试中的一个比较常见的问题,如果面试官有兴趣你可以用类似这样的课题主动去吸引他。

我在阿逼完成了工程的kmp的安卓端编译支持工作,让iOS和安卓工程可以共享一个kmp的工程进行打包,从而实现业务的跨端共享。

另外我们内部使用了大量的proto协议,为了支持kmp,我们新写了一个proto->kt的生成的插件,让工程能使用纯原生的kt代码,从而更简单的支持双端网络协议请求。

最后我们也把kmp完全应用到线上,相比较于其他的跨端框架,kmp的优势在于可以写一些重逻辑的双端统一逻辑,比如说类似折扣结算啊什么的,这种如果双端不一致就会出问题的业务。但是如果要拿来写一些ui相关的话,当前kmp的支持能力还是比较糟糕的。

面试技巧

面试虽然大部分情况下很讲运气,但是也还是有非常多的技巧的。

你需要掌握主动权,大部分时候自我介绍的环节就是你开始引导面试官的第一步。不要简单的介绍完时间地点人物就结束了。你要勾起面试官的注意力把你想讲给面试官听的内容先说出来,这样后面他的提问环节问你擅长问题的概率就会变大。

其次就是如果碰到了自己不太熟悉的问题,你要做的是先不要紧张,你要先去询问面试官的想法,比如说他想问你一个埋点库的设计,但是其实你并没有做过这部分的内容,但是我之前是写过支付对应的sdk的,所以我先会尝试和面试官询问他想要了解的埋点库的内容是什么,然后开始引导他说其实这部分监控能力其实同样也存在在支付sdk中。然后把他拉到我擅长的领域,这样就可以一定程度的掌控面试的节奏了。

面试的时长基本都是固定的,聊项目的时间越多八股文还有算法题的比重自然也就越少。

三面挂?

之前和网友聊天,有人说不知道为啥老是会三面挂掉,三面面试官问了我一个技术深度的问题,我不知道咋回答?

我其实以前在面试的时候碰到这题,我会和面试官聊一些什么特别小的技术细节。这两年经过了一次晋升答辩之后其实我貌似想通了这件事情,面试官想要的根本不是你的技术细节是啥,毕竟术业有专攻,短短的几分钟怎么能聊清楚呢。

三面面试官一般来说他的职级是比较高的,对他而言他根本就不关心你的技术细节是什么。他其实关心的是你做事的方法,就是你碰到了一个问题之后,你是如何定位如何解决这个问题,然后为了防止后续继续出现这个问题你的技术手段是啥?这个技术手段有没有可能被沿用到别的技术问题上去。

如果解决了一个技术问题,你只解决了其中的异常而没有考虑到如何做一些后续的治理工作,虽然你可能用的技术很酷,但是我建议你换个内容。

最好的面试内容就是给面试官画适当的饼,描绘出一幅蓝图愿景。这样我觉得通过三面的概率会大大增加,对方会觉得你是一个有长期规划的人。

最后瞎扯两句

最后点题下行情真的非常差的,尤其是对大龄开发来说,如果不是必要情况下真的不建议大家裸辞找工作的。

面试的过程中建议大家都还是提早准备下,模拟下面试环境什么的,珍惜每一次的面试机会,毕竟用一次少一次的。招人的公司就这么几家,如果错过了可能就是错过了(废话文学)。

最后知识梳理了一下前面面试中问的一些技术问题,整理了一些的电子书和面试笔记等学习文档进行参考学习,这些笔记将各个知识点进行了完美的总结(包含了很多内容:Android 基础、Java 基础、Android 源码相关分析、常见的一些原理性问题等等)。

  • Android 知识点汇总:https://qr18.cn/CyxarU
  • 面试题笔记:https://qr18.cn/CgxrRy

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

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

相关文章

C的缺陷和陷阱读书笔记

词法陷阱 1、if语句的特殊用法 1、if(x>max) maxx;2、if(x>max?x;max) //条件表达式,是执行第二个,否执行第三个3、if(x>max); //条件成立后执行——空语句4、if((fopen(arg v[i],0))>0) //open函数执行,成功返回后面的0&a…

处理大数据的基础架构,OLTP和OLAP的区别,数据库与Hadoop、Spark、Hive和Flink大数据技术

处理大数据的基础架构,OLTP和OLAP的区别,数据库与Hadoop、Spark、Hive和Flink大数据技术 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话&am…

前端的简单介绍

前端核心的分析 CSS语法不够强大,比如无法嵌套书写,倒是模块化开发中需要书写很多重复的选择器 没有变量和合理的样式复用机制,使逻辑上相关的属性值必须字面量的心事重复的输出,导致难以维护 CSS预处理器,减少代码的笨重&#…

DNS 域名解析系统

文章目录 前言什么是 DNS 域名解析系统为什么需要 DNS 域名解析DNS 是如何发展的hosts 文件维护域名和IP的映射关系DNS 系统(服务器)DNS 镜像系统 前言 前面为大家分享了关于计算机网络中应用层——自定义协议、传输层——UDP、TCP 协议、网络层——IP协…

pgsql 分组查询,每组取10条

需求: 按照表的字段分组,然后每组取10条结果,返回即可 sql 如下: SELECT* FROM (SELECT chk_id,feature_id,task_id, ROW_NUMBER () OVER (PARTITION BY chk_id ORDER BY chk_id) AS row_num FROM ics_check_report WHERE task…

肺癌不再是老年病:33岁作家的离世引发关注,有这些情况的请注意

近期,90后网络小说家七月新番和26岁男艺人蒋某某因肺癌去世,引发关注。他们都没有吸烟习惯,那么他们为什么会得肺癌呢?浙大二院呼吸内科副主任医师兰芬说,现在年轻人熬夜、加班导致身体过劳,在劳累情况下身…

Vue Router使用VueUse更改标签页名称的工具函数

进入正题 安装 npm i vueuse/core or pnpm i vueuse/core or yarn add vueuse/corerouter/helper.js import { useTitle } from vueuse/coreexport const usePageTitle (to) > {const projectTitle import.meta.env.VITE_APP_TITLE // 将可变名抽出到 .env 内配置cons…

element-plus走马灯不显示

问题描述 依赖正确&#xff0c;代码用法正确&#xff0c;但是element-plu走马灯就是不显示&#xff01;&#xff01; <div class"content"><el-carousel height"150px" width"200px"><el-carousel-item v-for"item in 4&qu…

Windows详细安装和彻底删除RabbitMQ图文流程

RabbiitMQ简介 RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff1a;Advanced Message Queue Protocol&#xff09;的开源消息代理软件&#xff08;亦称面向消息的中间件&#xff09;。RabbitMQ服务器是用Erlang语言编写的&#xff0c;而聚类和故障转移是构建在开放…

基于springboot框架的房屋租赁租房系统

功能如图所示 摘要 房屋租赁租房系统是一个基于Spring Boot框架开发的全新房地产管理平台&#xff0c;它旨在简化租房流程&#xff0c;提供房东和租户之间的高效互动&#xff0c;以满足现代社会对房屋租赁的不断增长的需求。该系统充分利用了Spring Boot的强大特性&#xff0c;…

arcpy.describe

描述 根据输入的数据&#xff0c;返回输入数据的属性 arcpy.da.Describe与arcpy.Describe返回的数据是一样的但是返回的的类型不一样&#xff0c;arcpy.da.Describe返回的是字典&#xff0c;arcpy.Describe返回的是string 如果要访问数据对象不存在的属性&#xff0c;将返回…

Yolo-Z:改进的YOLOv5用于小目标检测

目录 一、前言 二、背景 三、新思路 四、实验分析 论文地址&#xff1a;2112.11798.pdf (arxiv.org) 一、前言 随着自动驾驶汽车和自动驾驶赛车越来越受欢迎&#xff0c;对更快、更准确的检测器的需求也在增加。 虽然我们的肉眼几乎可以立即提取上下文信息&#xff0c;即…

美国人工智能政策公布

美国总统拜登 30 号上午发布了一项关于人工智能&#xff08;AI&#xff09;的行政命令&#xff08;EO&#xff09;。该行政命令最初以白宫情况说明书的形式向公众提供&#xff0c;“为人工智能安全和安保制定了新标准&#xff0c;保护美国人的隐私&#xff0c;促进公平和公民权…

【Linux】开发工具——vim多模式编辑器的入土设置sudoers白名单

个人主页点击直达&#xff1a;小白不是程序媛 Linux系列专栏&#xff1a;Linux被操作记 目录 前言&#xff1a; 基本概念 vim基本操作 [正常模式]切换至[插入模式] [插入模式]切换至[正常模式] [正常模式]切换至[末行模式] 三种模式的切换关系图 vim命令模式命令集 进…

骨传导耳机到底好用吗,到底骨传导耳机是不是噱头呢?

随着社会的飞速发展以及科技的不断提升&#xff0c;人们对健康的关注度也逐渐提高起来。而在这种背景下&#xff0c;骨传导耳机以其独特不可替代的优势&#xff0c;吸引了一大群骨传导爱好者的目光。 那么骨传导耳机是不是噱头呢&#xff1f;其实这种耳机不仅不会堵塞耳道&…

什么是接口自动化测试?接口自动化测试的目的是什么?

1、什么是接口测试 接口测试是对系统或组件之间的接口的测试。主要用于检测外部系统与系统间以及内部各个子系统间的交互点。测试重点是检查数据交换、传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 2、接口测试的目的 1> 尽早介入软件测试流程&#…

【23真题】邮电之首!扩招15倍!专业课难度骤降!

今天分享的是23年北京邮电大学804的信号与系统试题及解析。 本套试卷难度分析&#xff1a;北邮804在22年只招生6人&#xff0c;23年拟招生87人&#xff0c;扩招近15倍&#xff01;22年北京邮电大学804考研真题&#xff0c;我也发布过&#xff0c;若有需要&#xff0c;戳这里自…

墨者学院 身份认证失效漏洞实战

一、题目信息 二、漏洞利用 1.通过抓包&#xff0c;抓取test登录信息 发现card_id号以及一些回显的账号密码信息 搜索了一下这个id&#xff0c;发现是测试的头像 2.修改id号 分析请求包的逻辑&#xff0c;发现是请求了头像资源后再去请求头像id的详情包&#xff0c;所以根据…

怎么监控钉钉聊天记录内容(监控钉钉聊天记录的3种形式)

企业沟通工具的普及&#xff0c;越来越多的企业开始使用钉钉作为内部沟通工具。然而&#xff0c;对于企业管理者来说&#xff0c;如何监控钉钉聊天记录内容成为了一个重要的问题。本文将介绍几种方法&#xff0c;帮助企业管理者实现监控钉钉聊天记录内容的目的。 一、钉钉自带功…

【多线程面试题十七】、如果不使用synchronized和Lock,如何保证线程安全?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;如果不使用synchronized…