在外包公司从Java后端干到安卓开发,你醒醒吧!

这是一位网友和我分享的他的经历:

由于他的学历远达不到BAT的要求,大专毕业的他在找工作的时候发现留给自己的机会并不多,最后去了一家不知名的小公司。

他告诉我入职后才发现这家公司其实是个外包公司,里面的业务部门和制度相当混乱,负责招聘的HR同时兼管着财务和员工薪资的发放。

老板凭人脉从外面接一些项目回来给他们做。吴瑞初出校门没有经验,只能硬着头皮做下去,可他越做越窝心。

先是工作内容的问题。
当初他应聘的岗位是后端开发,可现实却是他既要写后端,也要写客户端。本着做的多做的广可以学到更多的原则,他并不是非常在意这个问题,边做边学,渐渐地也上了手。

其次是工作量的问题。

有时候为了赶项目进度,技术主管给手下的员工下了死命令:必须在某个截止日期前完成任务。

为此,他同几个和他一样新来的同事加班加点地干活,甚至买了只折叠床放在办公室,有几次他通宵,敲代码敲到睁不开眼睛,就展开折叠床凑合几个小时,天亮后继续开工。

技术主管看到他的卖力,在工作群中表扬了他,并许诺项目结束后会给他调休。

好不容易熬到了项目收尾,小A整个人瘦了一圈,他兴冲冲地向主管提调休的事,主管跟他打起马虎眼:“你看,新项目又来了,等这个项目结束给你一起休!”等下一个项目结束,他从主管那里得到了同样的回答,他对调休的事死了心。

最令他不能忍的是工资的事。

他为公司如此卖力,为的不就是每个月底公司打到银行卡上的那笔数字吗?

我出力,你出钱,好买好卖。

可他出了力,轮到公司出钱的时候却非常勉强。工资总是不能按时发放,月底拖到下个月初,月初再拖到月底,一拖再拖。

他和同事轮番去找HR兼财务,她也是一脸无奈加忧伤,“老板说项目资金还未结清,我的工资和你们一样没发呢!”

有次在一起吃午饭的时候,HR小姐姐偷偷告诉他说老板在市中心有两套房,开着宝马X6。这样的人不缺钱,体会不到他们如果两个月没领到薪水就没钱交房租甚至没钱吃饭的苦痛。

现状分析

如果你目前还年轻,但高不成低不就,只有外包offer,那请往下看。

多年的工作,接触过不少有外包背景的同事。可以确定的是,但凡有点职业理想的程序员,都对外包行业敬而远之。

不完全是因为它前途晦暗,更多是来自职业心理上的抗拒。程序员圈还是很看出身的,一般的外包人员,在有品牌独立项目的内行人眼里,就是low人一等,堪比野鸡。

但我们也不能因此把它贬得一无是处,凡事都有其两面性。

外包对于非计机系、培训转行、自学编程的程序员,可谓是最不坏的跳板。

一、放得很低阶的门槛,让教育背景、专业背景不够看的新人,有入行的机会。

二、丰富的业务场景,帮助新人快速地完成基础开发经验的积累,熟悉主流项目的全流程。

三、大厂镀金,一些自我包装精良的中小外包公司,常能接到诸如「微软」「腾讯」「阿里」「华为」的大单。虽然是外包,但往后写在简历上,至少是一流大厂的名号,比那些三四流的小公司项目经验强不知强多少个量级。

而且顶级互联网公司,就那么几家,80%的程序员简历上都是些名不见经传的公司。所以到头来,跟大多数人比,程序员的核心竞争力还是看谁的项目经验牛逼点。

再者,据做过微软外包的朋友透露,大厂对外包项目的合同条款极其苛刻,阶段性验收出点问题,都要扣款的。所以他常常被其高标准整得焦头烂额,通宵达旦,但每次完整交付项目后,都感觉自身技术水准有了质的飞跃。

之前我就提到过这个问题,在现在这个阶段,公司之间的技术鸿沟已经非常明显,开发者身在其中,也因为自身学习能力,环境,项目等等的差别,技术上的差距越拉越大,造成了工作几年之后的两级分化,并且这种差距的拉开不是靠自己的努力就能弥补的。在前段时间面试了一个在某一线手机厂商做App的同学,985出身,工作3年,目前也是公司的核心骨干,跟我说了他做的很多UI上的优化和重构工作。他们的App团队大概是4,5个人,看的出来他已经在力所能及的范围内努力做到最好,可惜,受限于团队规模,支持力度和技术储备,他的天花板来的太快,做的不够深入,技术能力也不够全面。

那面对这种情况,作为开发者,我们能做的是什么?最基本的,脱离舒适区,不停磨练自己的技术。举我自己的例子,刚进公司的时候我主要做的是UI,平时搞一些页面上的优化,解决一些小BUG和ANR,做的还算不错;因为之前做的不错,也因为方向变化,大半年之后我开始切换到做视频下载,后来又开始做视频播放,一年半多时间里跟我的导师把空间播放器和下载器推倒了重做,到现在各项指标都很不错。刚开始切换的时候很痛苦,音视频领域入门有一定门槛,项目压力非常大,之前又完全没有接触过。那段时间不知道多少次15楼南区半夜和假日只剩我跟我导师两个人在公司加班,可现在想想也确实是成长最快的时候。这块做的差不多了,今年又开始做编解码,继续在音视频这块深挖下去。所以就是这样,技术不行就深挖技术,觉得环境束缚了你就尽快跳槽,保持自己足够的竞争力。或许一次跳槽还没有办法改变什么,但这是一个量变产生质变的过程,一份不断向上的简历也能为你敲开很多公司的大门。

我在一线互联网企业工作近十年,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多程序员朋友无法获得正确的资料得到学习提升,故此将并将重要的Android性能优化、音视频开发、NDK技术、组件化插件化热修复、常见源码分析等学习路线分享出来。

希望我能够用我的力量帮助更多迷茫、困惑的朋友们,帮助大家在Android开发道路上学习和发展~

应用层开发

Android原生开发,需要重点关注的依然主要是各种性能优化,启动速度,耗电量,流畅度,网络优化再到大厂项目实战,这些都是作为一名优秀Android开发具备的基本素养。

  • 启动速度
  • 流畅度
  • 抖音在APK包大小资源优化的实践
  • 优酷响应式布局技术全解析
  • 网络优化
  • 手机淘宝双十一性能优化项目揭秘
  • 高德APP全链路源码依赖分析
  • 彻底干掉OOM的实战经验分享
  • 微信Android终端内存优化实践

以上资源均免费分享给大家,内容均放在了开源项目:【Github】,大家可以自行获取。

音视频开发

幸运的是我们生活在一个好时代,科技在这几十年得到了迅猛的发展。在疫情肆虐的当下,我们可以通过音视频会议进行远程办公;我们还有在线教育系统,对于大多数学生来说,完全可以在家进行在线学习。

从某个角度看,这次疫情虽然导致很多行业处于崩溃边缘,但也催生了新的行业发展,其中音视频会议和在线教育就是因疫而起的行业。在疫情短时间内难以结束的情况下,音视频会议和在线教育的重要性马上体现了出来,新的沟通方式和教育方式被越来越多的人所认知,所接纳。

甚至我们可以判定,在线教育行业和音视频会议行业会在今年崛起,并在未来十年得到迅猛发展。

如何学习音视频开发

一,初级入门篇:

一 绘制图片

1. ImageView 绘制图片

2. SurfaceView 绘制图片

3. 自定义 View 绘制图片

二、AudioRecord API详解

image

三、使用 AudioRecord 实现录音,并生成wav

  • 创建一个AudioRecord对象
  • 初始化一个buffer
  • 开始录音
  • 创建一个数据流,一边从AudioRecord中读取声音数据到初始化的buffer,一边将buffer中数据导入数据流。
  • 关闭数据流
  • 停止录音

四、用 AudioTrack 播放PCM音频

1.AudioTrack 基本使用

  • MODE_STATIC模式
  • MODE_STREAM模式

2.AudioTrack 详解

  • 音频流的类型
  • Buffer分配和Frame的概念
  • AudioTrack构造过程

3. AudioTrack 与 MediaPlayer 的对比

  • 区别
  • 联系
  • SoundPool

五、使用 Camera API 采集视频数据

1.预览 Camera 数据

2.取到 NV21 的数据回调

六、使用 MediaExtractor 和 MediaMuxer API 解析和封装 mp4 文件

1.MediaExtractor API介绍

2.MediaMuxer API介绍

3.使用情境

七. MediaCodec API 详解

1.MediaCodec 介绍

2.MediaCodec API 说明

3.MediaCodec 流控

  • 流控基本概念
  • Android 硬编码流控
  • Android 流控策略选择

由于文章篇幅受限,剩余内容过多,文中插图有限,下文只能截图目录展示:

二,中级进阶篇:
  • Android OpenGL ES 开发(一): OpenGL ES 介绍
  • Android OpenGL ES 开发(二): OpenGL ES 环境搭建
  • Android OpenGL ES 开发(三): OpenGL ES 定义形状
  • Android OpenGL ES 开发(四): OpenGL ES 绘制形状
  • Android OpenGL ES 开发(五): OpenGL ES 使用投影和相机视图
  • Android OpenGL ES 开发(六): OpenGL ES 添加运动效果
  • Android OpenGL ES 开发(七): OpenGL ES 响应触摸事件
  • Android OpenGL ES 开发(八): OpenGL ES 着色器语言GLSL
  • Android OpenGL ES 开发(九): OpenGL ES 纹理贴图
  • Android OpenGL ES 开发(十): 通过GLES20与着色器交互
  • 使用 OpenGL 显示一张图片
  • GLSurfaceviw 绘制 Camera 预览画面及实现拍照
  • 使用OpenGL ES 完成视频的录制,并实现视频水印效果
高级探究篇:
  • 深入学习音视频编码,如H.264,AAC,研究使用开源编解码库,如x.264,JM 等
  • 深入研究音视频相关的网络协议,如 rtmp,hls,以及封包格式,如:flv,mp4
  • 深入学习一些音视频领域的开源项目,如 webrtc,ffmpeg,ijkplayer,librtmp 等等
  • 将 ffmpeg 库移植到 Android 平台,结合上面积累的经验,编写一款简易的音视频播放器
  • 将 x264 库移植到 Android 平台,结合上面积累的经验,完成视频数据 H264 软编功能
  • 将 librtmp 库移植到 Android 平台,结合上面积累的经验,完成 Android RTMP 推流功能

音视频编解码技术

  • 音视频编解码技术(一):MPEG-4/H.264 AVC 编解码标准
  • 音视频编解码技术(二):AAC 音频编码技术

流媒体协议

  • 流媒体协议(一):HLS 协议
  • 流媒体协议(二):RTMP协议

多媒体文件格式

  • 多媒体文件格式(一):MP4 格式
  • 多媒体文件格式(二):FLV 格式
  • 多媒体文件格式(三):M3U8 格式
  • 多媒体文件格式(四):TS 格式
  • 多媒体文件格式(五):PCM / WAV 格式
    以上资源均免费分享给大家,内容均放在了开源项目:【Github】,大家可以自行获取。

插件化、组件化、热修复开发

组件化作为Android客户端技术的一个重要分支,近年来一直是业界积极探索和实践的方向。每个大厂内部的各个Android开发团队也在尝试和实践不同的组件化方案,并且在组件化通信框架上也有很多高质量的产出。

怎样实现组件化

要实现组件化需要考虑的问题主要包括下面几个:

  • 代码解耦。将一个庞大的工程拆分解耦,这是非常耗时耗力的工作,但这也是最基础最重要的一步
  • 数据传递。每个组件都有可能提供给其他组件使用,主项目与组件、组件与组件之间的数据传递
    UI跳转。
  • 组件的生命周期。组件加载、卸载和降维的生命周期
  • 集成调试。在开发阶段如何做到按需的编译组件?一次调试中可能只有一两个组件参与集成,这样编译的时间就会大大降低,提高开发效率。
  • 代码隔离。如何杜绝耦合的产生。

下面给大家介绍的是全网最全的高级Android组件化强化实战手册,覆盖了整个互联网公司,受篇幅限制不会展示所有内容,只能截图展示部分,完整内容已整理成PDF文档。

现今插件技术的使用非常普遍,比如微信、QQ、淘宝、天猫、空间、携程、大众点评、手机管家等等这些大家在熟悉不过的应用都在使用。

插件技术可以给项目开发带来巨大的好处,比如:并行高效开发、模块解耦、解除单个dex函数不能超过65535的限制、动态更新升级、按需加载等等。

掌握好插件技术,需要如下的安卓基础和相关知识,例如:

  • Android应用程序安装,加载过程

  • Android应用运行机制,生命周期调用原理

  • Android应用资源编译打包原理

  • Android应用读取资源原理

  • Android系统AMS、PMS、NMS等系统服务的运作原理

  • 增量更新

  • HOOK等技术

下面将从基础的插件化原理到Android插件化初探再到大厂架构演化实战应用,总结出了较为全面与完整的安卓插件技术与插件化对 Android开发的重要性。受篇幅限制不会展示所有内容,只能截图展示部分,完整内容已整理成PDF文档。

以上资源均免费分享给大家,内容均放在了开源项目:【Github】,大家可以自行获取。

小程序是基于微信这个亿级流量入口所衍生出来的产品,而快应用,快应用是九大手机厂商基于硬件平台共同推出的新型应用生态。用户无需下载安装,即点即用,享受原生应用的性能体验,不过个人觉得,他已经凉凉了,小程序倒是挺看好的,腾讯这座大山,微信这座凉亭,你想不凉快都难,不过看你是否刚需,比如你公司有需求,那你可以去学习。

推荐学习的新技术,Flutter和Kotlin,这两个都是Google推荐的。

Flutter

Flutter是Google在2018年2月27日,在2018世界移动大会上发布的用以帮助开发者在ios和Android两个平台开发高质量原生应用的全新移动UI框架

由于是是Google发布的,就前景来看,还是值得肯定的。

Kotlin

Kotlin 是Google推荐的官方开发语言,与Java互通,可相互转换,简洁安全等,是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,由JetBrains 设计开发并开源,

Kotlin 可以编译成Java字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。

最后

如果你的水平接近达到高级水平,有信心快速达到高级水平,那就按照高级水平的技能点和市场对灵活用工的高级要求对照靠近,一步步达到这个水平。如果你的水平还是初级入门水平,或者兴趣度不是很高,想早点转换,你可以快速转变,因为在正确方向上努力太重要了,这里也建议不要跨度太大,这里我推荐往大前端或者产品方向转变,当然前提是你有这方面的兴趣。

当然上面讲的都是技术方向上的灵活用工要求,当然对一些技术栈水平和技术积累到一定程度后你也可以往技术管理和产品方向发展,当然你也可以选择创业,如果你有足够好的idea和心理准备。

当然大部分人停留在中高级水平,然后一直停滞不前,加上外部各种环境,产生了各种焦虑,所以很矛盾,这时候你最好的状态是快速往高级水平发展,当然这里是比较难的,这个坎也是比较难迈过去的。因为Android知识体系比较庞大和复杂的,涉及到计算机知识领域的方方面面。

本文在开源项目:https://github.com/Android-Alvin/Android-LearningNotes 中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中...

推荐阅读更多精彩内容