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