深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
另外就是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中。然后把他拉到我擅长的领域,这样就可以一定程度的掌控面试的节奏了。
面试的时长基本都是固定的,聊项目的时间越多八股文还有算法题的比重自然也就越少。
三面挂?
之前和网友聊天,有人说不知道为啥老是会三面挂掉,三面面试官问了我一个技术深度的问题,我不知道咋回答?
我其实以前在面试的时候碰到这题,我会和面试官聊一些什么特别小的技术细节。这两年经过了一次晋升答辩之后其实我貌似想通了这件事情,面试官想要的根本不是你的技术细节是啥,毕竟术业有专攻,短短的几分钟怎么能聊清楚呢。
三面面试官一般来说他的职级是比较高的,对他而言他根本就不关心你的技术细节是什么。他其实关心的是你做事的方法,就是你碰到了一个问题之后,你是如何定位如何解决这个问题,然后为了防止后续继续出现这个问题你的技术手段是啥?这个技术手段有没有可能被沿用到别的技术问题上去。
如果解决了一个技术问题,你只解决了其中的异常而没有考虑到如何做一些后续的治理工作,虽然你可能用的技术很酷,但是我建议你换个内容。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!