随着互联网和移动互联网的快速发展,各类应用软件(app)如雨后春笋般涌现,许多应用程序甚至成为超级app,一些活跃用户过亿的应用程序成为国民app,这些app的兴起与程序员这个群体密不可分。快速发展的行业、互联网巨头的光环、国民级的应用程序带来的成就感、远超出普通行业的薪水,每年都在吸引着大量的程序员。竞争变得越来越激烈,程序员的35岁门槛已常年成为社交媒体热议的话题,程序员的中年焦虑已成为常态,作为程序员,我们应该建立怎样的核心能力圈,让使自己摆脱焦虑并在漫长的职场道路上不掉队呢?
今天就来聊一聊我在十多年的程序员生涯中总结出的一点感悟。
从基础到高级,我将从三个方面进行概括:通用能力、专业能力和进阶能力。
01通用能力
通用能力是作为一个职场人员都需要具备的基础能力。
通用能力包括学习能力、沟通能力、执行力。
学习能力在互联网行业,技术日新月异,并且不断升级;3G和4G在10年内逐渐普及,5G也即将踏浪而至,随之带来对IT相关技术要求也越来越高。从我们每天在使用的编程语言、技术框架等,到更复杂的通信协议、音视频编解码、网络数据传输等等,各项技术都在持续的更新与进步。作为一个程序员,我们还会在不同的子行业、公司之间辗转,接触不同的业务和产品,快速学习和理解不同业务及产品背后的逻辑和本质,是一项必备的素质。这些都要求至少及格往上的学习能力,不断的学习、研磨技术,丰富自身技能,以适应时代的快速变化带来的技术更新和挑战。
沟通能力作为程序员,大部分时间是和机器在打交道,但并不意味着程序员就可以和外界完全隔离,良好的沟通技巧,能够让工作事半功倍。许多程序员会排斥与人沟通,总是希望通过代码、做出来的产品来展示和表达自己,在某些时候也许行的通;但在大部分工作中,我们还是要与其他人沟通与交流,比如需求评审需要和产品同学沟通,bug需要和测试人员沟通,即使是代码也需要做出良好的技术架构设计,通过文字、图形或语言表达出来。沟通首先需要具备沟通意愿。其次要掌握好沟通技巧,学会换位思考,避免无谓的冲突。随着90后、千禧一代迈入职场,社会也越来越包容倡导多元、自由的文化,这带来的一个问题是越来越多的人会走向自我、封闭甚至极端,直接的体现是他们在社交、职场上与人沟通经常出现冲突,团队合作愈发困难。因此掌握良好的沟通技巧,学会共情也是沟通能力的一种体现。
执行力任何一个团队和组织,都会在目标明确后要求每个人能够全力以赴,不折不扣的执行既定的计划,高质量高效率的完成任务,因此良好的执行力也是程序员在一个团队中必备的基础能力。
以上是作为程序员在职场中所需要具备的几项基础能力。除此之外,我认为程序员还需要构建以下几项专业能力。
02专业能力
专业能力是程序员能够进入IT行业从事软件开发的关键。专业能力的不同也意味着可以达到不同的职业高度。
专业能力包括基本的技术能力、架构设计能力和项目管理能力。
基本的技术能力基本的技术能力是一个程序员在工作中赖以生存的基础。
对于一个java程序员,需要深入的理解java的语法知识、jvm的原理和调优、java的高级特性等等;需要了解常见的数据结构和算法;需要熟悉主流的应用框架,如spring、springcloud、springboot等;需要对常见的中间件有实践经验,如缓存、消息队列、NoSQL数据库等等;另外还需要对数据库、运维等领域技术有一定的研究。如果能够对基本的技术能力有了较深入的掌握,基本就可以拿到一份工作的offer。
架构设计能力架构设计能力是一个程序员突破自我所需要迈过的第一个坎。技术、框架不断更新进步带来的一个新的问题是,许多程序员在日常工作中通过简单的复制粘贴,已经可以完成大部分工作,也有一个名词叫“CrudBoy”,泛指那些每天最多做的事情就是简单的增删改查的程序员。重复的复制粘贴或Crud让程序员的思维逐步退化,不愿意思考,随着时间的推移面临被淘汰的困局。如果在工作中,能够多思考总结,逐步积累起架构设计能力,那结果可能是另外一种境遇。
架构设计能力首先包括最简单的设计模式。在写代码的时候,是否考虑过对代码进行有效的组织,按照GoF所倡导的23种设计模型进行重构,让代码更易读、易维护,这些都是架构设计能力的体现。
其次需要掌握对系统进行分层设计的思想。前后端分离,表现层、控制层、模型层各司其职,无论你是从事后端开发还是前端开发,观察那些主流的框架如springMVC、Vue等,无不在告诉我们分层设计的重要性。同样当你在设计一个大用户量产品的系统架构,有必要将系统合理的划分为接入层、接口转发层、服务控制层、服务执行层、缓存层、数据访问层等。
再次,对于具有高并发大流量的系统,还需要掌握如何做服务划分和模块拆分,识别领域边界,做到高耦合低内聚的同时支持水平扩展和垂直扩展。这个时候需要对分布式服务、微服务、RPC、数据库分库分表等技术有更深入的研究。
一个简单的系统分层架构图最后,还要了解一些容灾备份解决方案。当应用系统所在机房或云存储网络故障了怎么办?当数据库数据被误删了怎么办?当某些区域发生了不可抗力的自然灾害又该如何应对?这些都是在系统的访问量级、用户量级、数据量级等达到一定规模后必须要考虑到的点。
架构设计能力可以再不断的细分和扩展,例如随着抖音、快手等视屏和直播类应用的崛起,对于超大流量下的视频、图形图像类系统架构如何设计,随着5G和AIoT时代的到来,如何设计系统来支撑大规模和超大规模的物联网硬件终端接入及其产生的数据等等。
以上这些架构设计能力在每一个维度都有可以深入研究挖掘的技术点,如果你有时间并且希望不断突破,应该深入到每一个领域中去,通过不断研究和实践积累经验,直到有一天你能够根据不同的业务、应用场景、用户等,自己设计出一套合理的架构。
项目管理能力专业能力中的另外一项是项目管理能力。项目管理能力是一项综合能力。
许多人对项目管理能力都有误解,认为它是一项很简单的能力,或者不认为是程序员所需要具备的核心能力。在一些互联网大厂,也有专门的项目管理人员或类似PMO的组织去推动和完成项目管理工作,但这不意味着对于一个程序员就不需要掌握项目管理能力。
项目管理是任何一个组织能够完成产品、项目成功上线,都必须要做好的一件事。对于一个程序员来说,能否主导或负责完成一个中大型项目的项目管理工作或者在项目的某一个细分领域完成项目相关的管理工作,更是综合能力的体现。最近几年,无论是百度、快手的春晚营销技术支撑团队,还是京东、淘宝每年双十一的技术保障支撑团队,无不是大规模、跨团队、跨地域的大型项目,在这些项目中,从上到下都需要各个不同领域、不同组织、横向、纵向的项目管理人员,而这些项目管理人员往往都是资深的程序员、技术专家成长起来的。他们需要对项目的目标、战略意义理解的很透彻,组织做好项目细分的目标对齐、任务分解和计划落地,协调项目的各项资源突破各项技术瓶颈和项目难点,做好项目的风险管理,同时统筹兼顾做好项目组的氛围,形成项目组的团队合力,最终为项目的目标达成负责。
如果你已经具备和掌握了上述所有这些专业技能,则可以从一个程序员菜鸟成长为技术专家,大部分工作中遇到的技术问题已经可以自行研究解决。如果这时你仍不满足想进一步提升自己,就需要修炼以下几项进阶能力。
03进阶能力
进阶能力是程序员能够迈入更高层级突破职场天花板的必要条件。
进阶能力包括技术的广度、系统化的思考能力、团队管理能力、组织协调能力和业务理解能力。
技术的广度每个人的精力和时间都是有限的,当我们对自己专业领域有足够深入的了解时,我们还需要拓展自己的知识。作为程序员,除了要完成架构设计和编码之外,还会接触到更专业的技术领域,例如安全、大数据、算法和AI等。一方面,扩展这些专业技术领域可以促进对程序员所具备的基本专业技能更深刻理解,同时也可以获得其它技术领域的新知识和突破点。
系统化的思考能力在具备一定的知识深度和广度后,从单纯的某一项具体技术细节中跳出来,做系统化的思考和总结,以领域视野、全局角度,举一反三,梳理和建立自己的技术知识体系,形成自己的解决问题的方法论。当具备系统化的思考能力,技术或知识犹如滚雪球一般,快速识别、提取、学习、积累,循环往复,建立一套不断更新迭代的技术知识体系,无论市场、业务、技术如何变化已经可以及时的适应,甚至抓住新技术红利,去引领新技术的发展。
团队管理能力当程序员成长到一定阶段,必然会面临着成为管理者的可能。有些人会成为一个3到5人小组的组长,有些人会带领几十人甚至上百人的团队,不排除有一心只想写程序而拒绝走上管理岗位的同学,但这并不意味着不需要