一天被艾特@48次!35岁Android程序员处境堪比生产队的驴!
缘起
随着互联网和移动互联网的快速发展,各类应用软件(app)如雨后春笋般涌现,许多应用程序甚至成为超级app,一些活跃用户过亿的应用程序成为国民app,这些app的兴起与程序员这个群体密不可分。快速发展的行业、互联网巨头的光环、国民级的应用程序带来的成就感、远超出普通行业的薪水,每年都在吸引着大量的程序员。
竞争变得越来越激烈,程序员的35岁门槛已常年成为社交媒体热议的话题,程序员的中年焦虑已成为常态,作为程序员,我们应该建立怎样的核心能力,让使自己摆脱焦虑并在漫长的职场道路上不掉队呢?
今天就来聊一聊我在十多年的程序员生涯中总结出的一点感悟。
从基础到高级,我将从三个方面进行概括:通用能力、专业能力和进阶能力。
01 通用能力
通用能力是作为一个职场人员都需要具备的基础能力。
通用能力包括学习能力、沟通能力、执行力。
- 学习能力
在互联网行业,技术日新月异,并且不断升级;3G和4G在10年内逐渐普及,5G也即将踏浪而至,随之带来对IT相关技术要求也越来越高。从我们每天在使用的编程语言、技术框架等,到更复杂的通信协议、音视频编解码、网络数据传输等等,各项技术都在持续的更新与进步。作为一个程序员,我们还会在不同的子行业、公司之间辗转,接触不同的业务和产品,快速学习和理解不同业务及产品背后的逻辑和本质,是一项必备的素质。这些都要求至少及格往上的学习能力,不断的学习、研磨技术,丰富自身技能,以适应时代的快速变化带来的技术更新和挑战。
- 沟通能力
作为程序员,大部分时间是和机器在打交道,但并不意味着程序员就可以和外界完全隔离,良好的沟通技巧,能够让工作事半功倍。许多程序员会排斥与人沟通,总是希望通过代码、做出来的产品来展示和表达自己,在某些时候也许行的通;但在大部分工作中,我们还是要与其他人沟通与交流,比如需求评审需要和产品同学沟通,bug需要和测试人员沟通,即使是代码也需要做出良好的技术架构设计,通过文字、图形或语言表达出来。沟通首先需要具备沟通意愿。
其次要掌握好沟通技巧,学会换位思考,避免无谓的冲突。随着90后、千禧一代迈入职场,社会也越来越包容倡导多元、自由的文化,这带来的一个问题是越来越多的人会走向自我、封闭甚至极端,直接的体现是他们在社交、职场上与人沟通经常出现冲突,团队合作愈发困难。因此掌握良好的沟通技巧,学会共情也是沟通能力的一种体现。
- 执行力
任何一个团队和组织,都会在目标明确后要求每个人能够全力以赴,不折不扣的执行既定的计划,高质量高效率的完成任务,因此良好的执行力也是程序员在一个团队中必备的基础能力。
以上是作为程序员在职场中所需要具备的几项基础能力。除此之外,我认为程序员还需要构建以下几项专业能力。
02 专业能力
专业能力是程序员能够进入IT行业从事软件开发的关键。专业能力的不同也意味着可以达到不同的职业高度。
专业能力包括基本的技术能力、架构设计能力和项目管理能力。
- 基本的技术能力
基本的技术能力是一个程序员在工作中赖以生存的基础。以一个初中级Android程序员为例,你需要掌握的基本技能有:
1、对各种系统版本和机器适配有充分的经验
2、熟练掌握UI控件,包括自绘控件和动画;可以独立解决日常UI的开发问题
3、有一定的性能调优能力,崩溃处理能力
4、理解框架和背后的设计,而不是简单的API堆砌
5、熟练掌握Java语言(注解、泛型、反射、容器、JVM)
6、学习能力和分析解决问题能力
- 架构设计能力
架构设计能力是一个程序员突破自我所需要迈过的第一个坎。
技术、框架不断更新进步带来的一个新的问题是,许多程序员在日常工作中通过简单的复制粘贴,已经可以完成大部分工作,故也有了一个戏称“CV程序员”。重复的复制粘贴让程序员的思维逐步退化,不愿意思考,随着时间的推移面临被淘汰的困局。如果在工作中,能够多思考总结,逐步积累起架构设计能力,那结果可能是另外一种境遇。
架构设计能力首先包括最简单的设计模式。在写代码的时候,是否考虑过对代码进行有效的组织,按照GoF所倡导的23种设计模型进行重构,让代码更易读、易维护,这些都是架构设计能力的体现。
其次需要掌握Android热修复框架、插件化框架、组件化框架、图片加载框架、网络访问框架、RxJava响应式编程框架、IOC依赖注入框架、最近架构组件Jetpack等等Android第三方开源框架的设计思想以及底层实现原理。
Android的系统架构从上往下依次为应用层(System Apps)、应用框架层(Java API Framework)、运行层(系统Native库和Android运行时环境)、硬件抽象层(HAL)、Liunx 内核(Marco Kernel)。每一层都有对应的进程、系统库。
架构设计能力可以再不断的细分和扩展,例如随着抖音、快手等视屏和直播类应用的崛起,对于超大流量下的视频、图形图像类系统架构如何设计,随着5G和AIoT时代的到来,如何设计系统来支撑大规模和超大规模的物联网硬件终端接入及其产生的数据等等。以上这些架构设计能力在每一个维度都有可以深入研究挖掘的技术点,如果你有时间并且希望不断突破,应该深入到每一个领域中去,通过不断研究和实践积累经验,直到有一天你能够根据不同的业务、应用场景、用户等,自己设计出一套合理的架构。
- 项目管理能力
专业能力中的另外一项是项目管理能力。
项目管理能力是一项综合能力。
许多人对项目管理能力都有误解,认为它是一项很简单的能力,或者不认为是程序员所需要具备的核心能力。在一些互联网大厂,也有专门的项目管理人员或类似PMO的组织去推动和完成项目管理工作,但这不意味着对于一个程序员就不需要掌握项目管理能力。项目管理是任何一个组织能够完成产品、项目成功上线,都必须要做好的一件事。对于一个程序员来说,能否主导或负责完成一个中大型项目的项目管理工作或者在项目的某一个细分领域完成项目相关的管理工作,更是综合能力的体现。最近几年,无论是百度、快手的春晚营销技术支撑团队,还是京东、淘宝每年双十一的技术保障支撑团队,无不是大规模、跨团队、跨地域的大型项目,在这些项目中,从上到下都需要各个不同领域、不同组织、横向、纵向的项目管理人员,而这些项目管理人员往往都是资深的程序员、技术专家成长起来的。他们需要对项目的目标、战略意义理解的很透彻,组织做好项目细分的目标对齐、任务分解和计划落地,协调项目的各项资源突破各项技术瓶颈和项目难点,做好项目的风险管理,同时统筹兼顾做好项目组的氛围,形成项目组的团队合力,最终为项目的目标达成负责。
如果你已经具备和掌握了上述所有这些专业技能,则可以从一个程序员菜鸟成长为技术专家,大部分工作中遇到的技术问题已经可以自行研究解决。如果这时你仍不满足想进一步提升自己,就需要修炼以下几项进阶能力。
03 进阶能力
进阶能力是程序员能够迈入更高层级突破职场天花板的必要条件。
进阶能力包括技术的广度、系统化的思考能力、团队管理能力、组织协调能力和业务理解能力。
- 技术的广度
每个人的精力和时间都是有限的,当我们对自己专业领域有足够深入的了解时,我们还需要拓展自己的知识。作为程序员,除了要完成架构设计和编码之外,还会接触到更专业的技术领域,例如安全、大数据、算法和AI等。一方面,扩展这些专业技术领域可以促进对程序员所具备的基本专业技能更深刻理解,同时也可以获得其它技术领域的新知识和突破点。
- 系统化的思考能力
在具备一定的知识深度和广度后,从单纯的某一项具体技术细节中跳出来,做系统化的思考和总结,以领域视野、全局角度,举一反三,梳理和建立自己的技术知识体系,形成自己的解决问题的方法论。当具备系统化的思考能力,技术或知识犹如滚雪球一般,快速识别、提取、学习、积累,循环往复,建立一套不断更新迭代的技术知识体系,无论市场、业务、技术如何变化已经可以及时的适应,甚至抓住新技术红利,去引领新技术的发展。
- 团队管理能力
当程序员成长到一定阶段,必然会面临着成为管理者的可能。有些人会成为一个3到5人小组的组长,有些人会带领几十人甚至上百人的团队,不排除有一心只想写程序而拒绝走上管理岗位的同学,但这并不意味着不需要关注团队管理能力的提升。每一个人都是团队管理的参与者和受影响者,通过良好的团队管理能力发挥出团队的价值,能够让程序员的工作更有意义。
团队管理能力的建设包括管理方法论的沉淀和管理动作的落地,这两个方面相辅相成,互相促进。
管理方法论的沉淀,第一需要进行领导力的培养。领导力应该成为你管理团队的指导思想。
不同的企业组织会构建自己的领导力模型。在我曾经学习和实践过的一种领导力模型中,把领导力按照三个维度六个领域进行了解释,这里做下分享。
领导力主要目标是为了组织协同,发挥团队的力量以达成绩效结果。领导力需要关注哪些方面呢?
1,管理者需要理解公司战略和方向,根据公司战略和方向制定团队的目标。任何组织都需要明确的方向指引。当年成为团队管理者后,对于你所在的公司,既需要去理解公司远期的目标我们称之为愿景,还要理解公司的近期目标;用公司愿景指导团队长期努力的方向,按照公司近期目标分解并制定自己团队的短期目标,来指导团队接下来半年度、季度或月度的工作。我们可以借助不同的目标管理方式如OKR等来管理团队的目标。
2,需要做好良好的激励措施。激励能够让团队成员产生更强的工作动力。短期的激励可以通过日常工作中的奖励、表扬或称赞来实现,而长期的激励还需要通过对团队成员预期的管理和工作授权来实现。
3,需要做好团队成员的指导工作。通过对团队成员日常的辅导提供指导和帮助,通过树立典范来指明团队成员未来所需要学习的目标员工画像。领导力最终通过行动计划来落地,而不能只停留在口号和文字总结中,这将在后面进行解释。
领导力是一个很大的课题,每个感兴趣的人都可以去深入研究,找到和建立适合自己的领导力模型。
第二,有了领导力模型的指导,我们还需要做好团队人才盘点和梯队建设,识别团队中的明星、潜力、骨干和后进人员,在做到对团队人员了如指掌的同时,通过目标和绩效促进团队成员不断提升和进步。
第三,做好团队流程与机制沉淀。一个团队能够高效的运转下去,需要依赖合理的流程和机制。关于这一点,我曾经看到过一个很精炼的总结:将复杂的的事情简单化,将简单的事情标准化,将标准的事情流程化,将流程的事情自动化。它阐述的道理即是不断的做流程、机制的沉淀,最终能够实现效率的极大化。
第四,需要做好向上管理。了解你的上级对你和团队的预期,懂得通过上级协调资源寻求帮助,同时能够站在上级的角度考虑问题,替上级分担解忧。
最后,建立有特色的团队氛围和团队文化。一个好的团队与良好的团队氛围和团队文化密不可分,团队文化也能够吸引和过滤志同道合的人一起,促进团队氛围的不断发展。
有了管理方法论的沉淀,并不意味着一定能够做好管理,如何在日常的工作中通过管理动作的落地去影响团队更为重要。
我们需要针对工作中的每一个环境和每个动作细化管理方法和管理手段。
例如,年度、季度、月度的目标设定和定期的复盘,提升团队人员的目标感和团队凝聚力。定期的one-one沟通,了解团队人员的想法和困惑,给予他们辅导和帮助。组织项目和需求迭代的复盘总结,发现需求迭代过程中的问题,找到流程可以优化的点并形成可复制可复用的方法论。定期的团队绩效复盘和团队成员绩效反馈,让大家知道如何提升改进。组织团队技术分享,参与行业的技术交流构建团队和个人技术影响力,打造团队的极客文化等等。
在管理动作的落地的过程中,通过实践得来的知识,又可以丰富管理手段和管理工具箱,进而总结成新的管理方法论,指导下一阶段的团队管理工作。
- 组织协调能力
组织协调能力和项目管理能力既有相似处,又有差异。相似的地方在于它们都强调团队合作的重要性,注重通过团队的力量达成既定目标。不同的地方是,项目管理能力更强调项目,一切围绕项目的目标去努力。而组织协调能力强调的是组织和人,相比项目管理能力,组织协调能力是更高的一个层级。当你在组织协调能力上具备一定的积累后,任何项目或任务将不再是问题。组织协调能力需要你了解组织及组织的部门、人员,快速识别关键人物和核心目标,建立自己在组织内的连接,提升自己在组织内的影响力。可以很好的理解和倾听他人,产生共鸣和共情。当你需要完成一项任务时,发挥自身的组织协调能力优势,把握关键点,找到关键人,成功也就随之而来。
- 业务理解能力
技术本身不产生价值,只有将技术应用到业务和产品中,通过产品解决用户的需求才能产生价值。作为掌握技术的程序员,站在业务的角度去思考问题,解决业务的痛点永远是第一位的。程序员不能仅仅满足于被动的完成业务需求,更需要通过主动对业务的理解和思考,洞察业务的核心和本质,把业务问题转化为技术问题。在业务的开始阶段,快速的构建MVP版本产品,支撑业务发展,在业务步入高速发展或稳定阶段,通过不断的抽象、模块化,打造服务化、平台化的技术体系,支撑业务的规模化扩张,让技术真正发挥出支撑业务甚至驱动业务的转型。最后,通过一幅图对以上的解释做个总结。
通过我多年的实践经验证明,程序员的这些核心能力在工作中相互交织而又层层递进,每天我们都在使用、学习和积累这些能力。通过在工作中不断的总结和回顾,接受项目和产品的历练,相信每一个人都可以突破自我,迈上新的台阶。
当然程序员的核心能力在不同人的眼中会有不同,正如一百个读者眼中就有一百个哈姆雷特。重要的是每个人在工作中不断总结,找到适合自己的能力圈。
Android开发全栈进阶学习笔记
以下完整学习笔记PDF,可以点赞+评论支持下博主,点击这里免费自取!
- 架构师筑基必备技能
目前Android APP开发主流语言就是Java语言,Java语言最大的特性就是提高了软件的交互可能性,可以说安卓手机几乎所有应用程序都是利用Java语言来进行编写的。
知识要点:
1、深入理解Java泛型
2、注解深入浅出
3、并发编程
4、数据传输与序列化
5、Java虚拟机原理
6、高效IO
- 设计思想解读开源框架
随着互联网企业的不断发展,产品项目中的模块越来越多,用户体验要求也越来越高,想实现小步快跑、快速迭代的目的越来越难,插件化技术应用而生。如果没有插件化技术,美团、淘宝这些集成了大量“app”的应用,可能会有几个g那么大。
所以,当今的Android移动开发,不会热修复、插件化、组件化,80%以上的面试都过不了。
知识要点:
1、热修复设计
2、插件化框架设计
3、组件化框架设计
4、图片加载框架
5、网络访问框架设计
6、RXJava响应式编程框架设计
- 360°全方位性能调优
在不同层次的开发工程师手里,因为技术水平的参差不齐,即使很多手机在跑分软件性能非常高,打开应用依然存在卡顿现象。
另外,随着产品内容迭代,功能越来越复杂,UI页面也越来越丰富,也成为流畅运行的一种阻碍。综上所述,对APP进行性能优化已成为开发者该有的一种综合素质,也是开发者能够完成高质量应用程序作品的保证。
1、设计思想与代码质量优化
2、程序性能优化
- 启动速度与执行效率优化
- 布局检测与优化
- 内存优化
- 耗电优化
- 网络传输与数据储存优化
- APK大小优化
3、开发效率优化
- 分布式版本控制系统Git
- 自动化构建系统Gradle
4、项目实战
- 启动速度
- 流畅度
- 抖音在APK包大小资源优化的实践
- 优酷响应式布局技术全解析
- 网络优化
- 手机淘宝双十一性能优化项目揭秘
- 高德APP全链路源码依赖分析
- 彻底干掉OOM的实战经验分享
- 微信Android终端内存优化实践
- Android框架体系架构
Android框架体系架构(高级UI+FrameWork源码) 这块知识是现今使用者最多的,我们称之Android2013~2016年的技术。
Android开发者也往往因为网上Copy代码习惯了而导致对这块经常“使用”的代码熟悉而又陌生:熟悉的是几乎天天在和它们打交道, 天天在复制这些代码 ;陌生的是虽然天天和这些代码打交道,但是并没有深入研究过这些代码的原理,代码深处的内涵。
本篇知识要点:
1、高级UI晋升
2、Android内核组件
3、大型项目必备IPC
4、数据持久与序列化
5、Framework内核解析
- NDK模块开发(音视频系列)
NDK(Native Development Kit缩写)一种基于原生程序接口的软件开发工具包,可以让您在 Android 应用中利用 C 和 C++ 代码的工具。通过此工具开发的程序直接在本地运行,而不是虚拟机。
在Android中,NDK是一系列工具的集合,主要用于扩展Android SDK。NDK提供了一系列的工具可以帮助开发者快速的开发C或C++的动态库,并能自动将so和Java应用一起打包成apk。
本篇知识要点:
1、NDK开发之C/C++入门
2、JNI模块开发
3、Linux编程
4、底层图片处理
5、音视频开发
6、机器学习
- Flutter学习进阶
2019 年无疑是 Flutter 技术如火如荼发展的一年。
每一个移动开发者都在为 Flutter 带来的“快速开发、富有表现力和灵活的 UI、原生性能”的特色和理念而痴狂,从超级 App 到独立应用,从纯 Flutter 到混合栈,开发者们在不同的场景下乐此不疲的探索和应用着 Flutter 技术,也在面临着各种各样不同的挑战。
本篇知识要点:
1、Flutter跨平台开发概述
2、Windows中Flutter开发环境搭建
3、编写你的第一个Flutter APP
4、Flutter Dart语言系统入门
…
- 微信小程序开发
微信小程序作为现在比较火的编程开发应用场景之一,深受市场的青睐,这让不少开发者眼馋不已。但是对于初学者来说,就完全摸不着头脑了,不知道微信小程序开发制作需要学习那些知识,有需要的朋友可以参考本篇。
本篇知识要点:
1、小程序概述及入门
2、小程序UI开发
3、API操作
4、购物商场项目实战
- Android相关源码解读
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。