作者 | 凌敏
后端开发很“卷”吗?学习路线是什么样的?就业前景如何?展望 2023 年,后端研发工程师需要提升哪些技能,做好哪些准备?1 月 4 日,微财数科资深工程师周正杭做客 InfoQ 视频号,畅聊后端研发工程师的技术成长路线与职业发展路径等话题。以下根据直播内容整理,有不改变原意的删减,完整内容可点击查看回放视频。
如何从普通工程师成长为资深工程师?
InfoQ:您当初为什么会选择后端研发这个职业方向?可以分享一下您的技术成长经历吗?
周正杭:我的职业选择其实与学校期间所学的方向、擅长的技术有关。我毕业后的第一份工作是在一家做第三方支付的公司中负责内部管理平台的后端开发,在工作一年后也接触到了公司的通用化支付产品。在这期间,我对复杂的业务流程、高并发处理,以及流量激增的应对方式产生了浓厚的兴趣,并在接下来的近十年时间中一直专注于后端研发的工作。
InfoQ:您是如何一步步地从普通工程师成长为资深工程师的呢?在这个过程中付出了哪些努力?
周正杭:其实毕业生们在刚进入职场时,常常会感到迷茫和挫败。由于理论学习环境与实际工作间的差异,我们很难将学到的点状知识应用到公司长久积累下的技术框架和业务系统中。但这很正常,学校学习的内容很难追赶上互联网的发展速度。不过,既然能加入公司,说明公司是看重我们的能力和未来发展潜力的。因此,我们要抛出这种可能的挫败感,用最短的时间做最多的事,尽量让自己熟悉工作实战的经历。
我在当时花费了两年的时间才逐渐熟悉工作中的单体应用及后期的 Kafka 使用,夯实自己技术能力的同时,也在理论设计模式和基础数据结构的实际应用中,提高了自己工作的信心。在工作两年后,我作为公司的研发主力,进入了个人工作的上升期,也遭遇了工作之中的瓶颈。在面对诸如大流量下如何对服务降级、高并发中如何进行压力处理等情况时,我们会学习开源代码中的优秀思路、设计模式、代码风格以及深层技术,并将其应用到工作中,解决类似问题。比如,我们会将学习到的 sentinel 窗口算法应用到金融领域中的支付系统中,处理资金系统中业务异常的兼容、成功率调控等场景。这种学习也能快速帮助个人实现成长。
在工作五年后,我遇到了互联网金融的快速发展时期,并加入了一家创业公司。和其他公司的工作模式不同,创业公司没有较为健全的部门体系和职能划分,常常会有一人身担研发、测试、产品、需求数职的情况。我们需要从基础技术实现层面中跳出来,关注产品的规划,明白产品功能的存在意义。虽然很累,对个人也颇具挑战,但却能得到很全面的发展。当然我并不是建议大家都进入创业公司,这里只是提供一个思路,希望大家能多关注其他职能部门同事的工作内容,这会帮你更为出色地完成自己的工作。
在这一阶段,我作为公司技术的负责人之一,组建并带领团队在两周时间完成了一个初版金融产品的上线,并在后续的多年间无数次的快速迭代。期间也遇到了许多初创公司在技术开发工作中常见的配合问题,如项目质量及进度管理等,我们通过研究学习敏捷开发方式,引入多维度管理方式丰富日常工作经历,让项目进展更为顺畅。这段时间对我来说也是快速横向发展的时间。
离开初创公司后,我加入了现在的微财数科公司,担任资深工程师,负责公司核心的账务系统内容。从初创公司的乱战节奏转回到正规的开发模式,整体工作风格再次发生转变,与众多职能部门重新建立合作,这种差异化的工作内容也丰富了我自身的经历。
InfoQ:您在从小公司到大公司的过程中,是否会有不适应呢?
周正杭:这是肯定的,大小公司的主要差异在于其规范性。举例来说,小公司中的需求改版,只需要大家想清楚怎么做,开发自测没什么问题就可以上线,但大公司中却还是需要遵守一定的流程避免出错。除此之外,二者的技术深度与体量也必然是不同的。小公司的金融产品每月放贷量峰值可能只有 6000 万,这在大公司看来可能连一天的量都不够。因此,无论是流量激增还是服务架构的调整升级,大小公司的差异化都是非常大的。
InfoQ:您之前提到,从学校到职场的转变过程中可能会面临很多挑战。可以分享一个您之前面临过的挑战,以及您的解决方法吗?
周正杭:后端技术架构方向的主要工作内容,是向上承接后端业务研发,向下协调基础运维部门。我们既要服务后端业务系统稳定运行(监控组件日常运行、处理极端问题等),又要协调运维等部门多关注机器运行的状况。我认为我们最大的挑战是基础架构,我们不仅要关注纯技术方面的工作内容,也要特别考虑如何服务好业务。
我们先前做的内部云服务发布系统在初期阶段,利用容器化技术进行更稳定、更快速的轻量级发布。底层的 Kubernetes 最初虽然只支持 Rolling Update 的发布模式,但因为其通用化,我们并没有觉得有什么不好。在后期,因为用户及内部维度的多元化,我们对稳定性及发布策略的多样化有了更多的需求。先前单节点的 Rolling Update 在循环滚动发布时会终止老节点,导致在途流量的不稳定以及断连接异常,对于频繁为 C 端提供服务的后台服务而言影响较大。因此,我们基于 Kubernetes 特性,考虑业务对稳定发布、平台上线的需求,研发了类似蓝绿发布、金丝雀等小流量验证发布的功能,从原先纯后台的工作走向了前台业务场景,充分考虑业务需求而进行的优化。
InfoQ:现在新兴技术非常多,我们要如何保持自己的技术敏感度呢?
周正杭:在建立知识体系的基础上,我们可以上网浏览资料、现场参加活动等等。其次,我们也可以在 InfoQ 等渠道上收获他人对新技术及其应用的见解分享。我们今年也与 InfoQ 合作,陆续发布了许多文章,交流见解与思路。在遇到性能瓶颈等问题上,也会从 InfoQ 等网站高效地搜寻适合的解决思路。
后端研发工程师的硬实力和软实力
InfoQ:后端研发给人的第一感觉就是很“高大上”,需要掌握很多种技术,基础架构方向的后端研发工程师最需要掌握哪几项技术?
周正杭:很多像是分布式操作系统之类的经典理论和架构均是建立在存储、计算、通讯等后端底层上,这些协助涉及了底层文件系统进程的 RTC,并以此为基础进行同步调度。只要计算机依旧作为资源存在,这些问题就会以不同的尺度反复出现、反复被解决。
在初期阶段,我们需要了解的有:
- 网络基础通信:TCP/IP 协议、HTTP 协议等;
- Linux 基础操作指令:grep 模糊匹配、kill 杀进程等;
- 操作系统运行原理;
- 进程与线程的关系及其在高并发场景中的应用;
- 列表、数等数据结构;
- 排查找等常用算法。
在掌握一定技术基础后,我们要更深入地解决更多技术问题:
- 框架类问题:Spring Boot、网络框架、.NET 框架等;
- 持久化层:MyBaits、Hibernate 的实现原理,要如何防止 SQL 注入等攻击;
- 应对大流量,系统的削峰策略;
- Kafka、RabbitMQ 的应用场景及各自特性。
而当大家最终成长为技术专家、CTO 级别时,我们就需要关注更高层面的技术,比如 Service Mesh、配置中心等原理。
InfoQ:除了您所提到的这些技术硬实力,优秀的后端研发工程师还需要具备哪些特质呢?
周正杭:后端研发最重要的是细心。如果我们的代码进入了死循环,或引发内存泄漏,都有可能导致线上服务崩溃。
在我毕业后加入的第一家公司中,身为初级工程师的我接触到了公司的核心支付业务。因为一个错误的金额传值,线上出现了发售金额异常的错误,直接导致公司受到了损失。在后续的工作中,我会自我要求不断精进,培养自测试的习惯,严格要求自己做事做到极致。在接手公司的全国通用款产品时,我提前找测试组沟通可能涉及的测试点、异常以及风险点,自己编写了一些测试用例,并提前进行了一周左右的自测时间。在实际进入测试阶段时,我在近 200 个测试用例中没有遇到任何 bug。希望能通过我的这次血淋淋的教训,能让大家牢记后端研发中最基础的要求——细心。
其次,我认为后端研发不仅需要关注技术,也要周全考虑如何能在满足公司业务需求的情况下设计优秀的架构。程序员们或许大多只关注如何将自己的代码写好,而不愿与人交流,但其实一段代码是否符合业务目标才是我们最大的痛点。有时我们常常会发现代码并不能做到自己想做的事,因此我们一定要多思考业务,思考我们是否能对服务起支撑作用。
InfoQ:对于技术人员而言,是所有岗位都需要具备业务思维吗?还是只针对某些岗位而言?
周正杭:我认为所有的技术架构精进都应该以服务为目标。以基础架构为例,我们从单体应用到分布式应用,再到微服务的发展,不仅仅是因为代码会更高级、系统吞吐量处理更强,而是因为这种发展解决了我们对业务稳定性支撑的需求。基础架构中,借由 Kubernetes 的单节点滚动发布确实可以解决现有的发布工作,但由于我们的业务、内部服务对系统稳定性有要求,因此才需要做更多的工作以满足需求。
我认为对后端研发来说,业务思维是尤为重要的,我们要明白代码、流程背后的原因其实都是业务,只有满足了业务才能体现出技术的价值。
InfoQ:有用户提问,您认为最好的编程语言是什么?
周正杭:仁者见仁智者见智,编程语言没有好坏之分,区别只在于适用场景。
InfoQ:您认为后端是否很“卷”呢?
周正杭:我认为“卷”其实并不恰当。技术人最关注的常常是自己的技术是否高超,所用工具是否新潮,这可能也是导致外界会认为后端研发非常“卷”的原因。技术人对自己的要求,对自己于公司的发展、对未来技术规划等等都与之密切相关。人人都希望在最短的时间做最多的事,接触更多的技术。
如何做好职业规划?
InfoQ:后端研发工程师如何做好职业规划?职业发展路径是什么样的?
周正杭:有的时候我们带着兴趣工作,会更容易达成自己的目标。后端工程师的职业发展大致分为两个方向:
- 希望深挖技术。可以通过大量实战,对基础组件研究深挖,从初级工程师、高级工程师、资深工程师,一路发展到架构师、技术专家、CTO 等职位。对公司的技术方向进行把控,对较低级别工程师进行技术上培训,从而让员工迅速提升,保证整体技术产出。
- 对复杂业务流程感兴趣。可以沿着技术管理、项目管理方向,从工程师晋升至项目经理、技术经理、技术总监等岗位,日常工作中仅一半的时间在编码,另外一半则需要游走在各个部门,负责资源协调、规范制定、资源编排、工期监督等工作。
- 其他方向。售前架构师、技术培训讲师等等。
我们需要尽快制定自己未来发展的目标,并为之努力。任何一个职位都能有自己独当一面的机会。
InfoQ:后端适合转岗到哪个岗位呢?
周正杭:这大概也是很多程序员在工作压力下辗转反侧、夜不能寐时常常思考的问题,问题的答案取决于我们所处的阶段及我们擅长的事。的确,产品经理是个不错的转型方向,但前提是我们不仅需要懂技术,也要对现有业务知识、产品流程有深入的理解,能够与其他团队进行沟通。另外像售前工程师,虽然日常编码工作不多,但却需要对公司已有技术产品有足够的了解,配合公司销售、推销产品,根据用户需求痛点进行定制化推荐。
InfoQ:您在面试后端研发工程师时,会注重求职者的哪方面能力?有哪些是加分项?
周正杭:在面试时我一般会关注三个点:
- 基础知识。初级工程师需要掌握牢固的基础知识能力,中级、高级工程师则需要对中间件使用、高性能场景下对性能瓶颈排查、微服务及分布式系统架构的使用场景、通过深层次源码解释不同注册中心的区别、一致性及高可用性的保障方式等等。
- 产品思维。这点在互联网非纯技术类公司中非常重要,优秀的产品思维不仅可以减少沟通成本、快速传达项目目标,也能在做技术的同时主动思考产品化缺陷。
- 沟通能力。这是程序员普遍的薄弱点,也是我认为的加分项。没有良好的沟通能力,外界无法得知你的想法,真正需要表达的时候又因为没有与他人足够高的默契度而难以传达自身想法。
InfoQ:很多技术人在日常生活中不擅长或不喜沟通,这种情况下要如何提升自己的沟通能力呢?
周正杭:称不上经验,只能说是实战小技巧,但有了这项技能我们才能更全面地提升自己。我先前提到看重沟通能力其实也有我本身经历问题的影响。我刚到公司时,在项目评审、需求评审等场合都不怎么说话,导致沟通成本过高。但沟通能力也不是一夜之间就能练好的,我们要先学着做一个“捧哏”,才能成为一个合格的“逗哏”。我们只有强迫自己走出舒适区开始说话,才能逐渐建立与他人沟通的默契,分享交流技术、业务知识。除此之外,沟通能力在跨部门协作时也非常重要。我在协调产品与研发之间合作时,曾遇到过因为需求沟通不明确而导致的双方不断发生矛盾,作为研发部门负责人,我需要主动打破沟通壁垒、跨部门进行问题剖析。在多轮沟通后,我们才输出了合作的规范化流程,让大家的配合更加顺畅。
InfoQ:有用户提问,“我已经 35 岁了还是一线职员,该怎么办”?
周正杭:这是一个很现实的问题。能够思考这个问题,说明你已经确定了目标,但可能还做不到。但如果你连目标都不确定,那么可能真的需要仔细想想了。我们应当确定自己的远大目标,通过持续努力,培养自己的沟通能力、产品思维,深挖组件原理、源代码等等,通过这些积累才能确定自己未来的方向。
InfoQ:技术架构与技术管理是否均需要全栈方向的发展?
周正杭:只有对自己所用的技术非常了解时,才能去进行技术框架、管理类工作。技术管理人员需要对团队与产品的稳定性负责,要有足够的知识储备,才能应付如 MQ 突然到达水位线,导致堵塞夯死情况的触发及快速恢复方式等日常的异常情况。
技术架构也是如此。公司自有架构的设计、内部效率的提升、分布式事务解决手段、分库分表时 MyCat 中间件还是 JDBC 的选择,等等,在拥有足够的基础知识储备后,我们才能在全面分析后针对应用场景给出最合适的匹配。
像是大数据方向知识目前对架构设计而言可能用不上,因此我们也可以针对自己未来的发展和技术方向,提前做出预言。
2023 年,值得关注的后端技术趋势
InfoQ:2023 年,后端领域有哪些值得关注的技术方向?
周正杭:这主要与公司所处环境相关,而公司的发展则是影响个人技术发展方向的重要因素之一。在新的一年里,我们会更多地关注效率提升,无论是云原生、Serverless、低代码化技术等等都应该提上日程。我们要通过更少量的资源投入、应用的精细化管理、快速迭代,维护或突破现有业务,从而达到更大产出。
InfoQ:您认为后端学习是否很困难呢?
周正杭:“后端难学”的主要原因是知识发展体系的匮乏。只有建立了技术框架的认知,建立了应用场景,才能明白技术究竟为什么实用。理解了操作系统对线上应用的影响,才明白操作系统为什么有用;理解了分布式缓存时如何抵挡大流量,从而保护数据库、提高相应速度,才明白缓存有什么用。我们在看书时也可以从目录的标题看起,目录的编排路径一定是由浅入深的技术介绍。
InfoQ:有用户提问,重构代码要如何打开思路?
周正杭:我们首先要确定驱动代码重构的原因,以及代码重构后能达成的结果。对于十年来一直保持 Spring MVC 单体应用基础架构的公司而言,代码复杂度不言而喻,业务逻辑全部都在一个服务节点内,那么这种情况下重构是必然的。重构可以为我们解决服务稳定性、维护性,降低内部服务通讯成本。但我们不能盲目进行重构,新框架的应用会带来技术成本投入,未知技术会带来未知异常,从而导致业务事故、生产事故问题。我们也不应直接进行根本性重构,可以从业务逻辑代码重构开始。在重构过程中我们要实时关注业务导向,确保重构不会偏离对业务的支撑。
以我们的低代码改造为例,我们的目的是提高渠道对接效率。在重构过程中,我们前期投入成本非常高,梳理了上千种不同业务流程中的共同点并界定抽象方法,但后期成功后使用非常顺畅。
InfoQ:您认为对于后端研发工程师来说,2023 年可能面临的最大挑战是什么?
周正杭:整体发展方向取决于业务,但个人而言,我们可以自我驱动,向 Serverless、云原生应用、低代码化改造等方向发展;也可以自我确立中短期发展的里程碑,比如学习一门新编程语言,完全了解并实际应用卡夫卡等等。通过连续可触达的发展规划,我们能够持续地自我激励,以高昂的情绪继续寻求发展。
InfoQ:对于希望成为后端开发工程师的年轻人,您会有什么建议或忠告呢?
周正杭:我的建议可以分为三点:
- 编程语言基础。无论是 C、C#、C 、Java、Go、PHP 等语言,掌握了语言才能掌握工作的工具,才能与同行进行交流。
- 知识体系的建立。
- 工具、技术方法学习。利用业余实践多学习,只有这样才能提前适应工作。
InfoQ:一位合格的研发工程师需要懂几种语言呢?
周正杭:这个问题也是见仁见智。应用场景不同,语言的需求也各异。大部分公司为减少多语言技术投入,会组件化统一技术栈,因此如果只是为了工作,那么一门语言足矣。但如果目标是全栈或创业工作,那么安卓、iOS 客户端的编程语言必然不同,服务后端选择 PHP 或 Java 也是不同,再加上数据库与大数据层面,都需要不同基础。我们可以在学习新的一门编程语言后,思考对比其与已知语言的差异并分析其优劣,更好地交付应用。如果在学习新语言后发现旧语言的缺陷确实很大,那么我们旧需要投入成本去学习另一种语言从而完成应用投产。
InfoQ:请您给大家推荐几本书籍吧。
周正杭:我会从两个方向进行推荐。底层操作系统方向我推荐《深入理解计算机系统》。这本书出版时间较早,从程序员的角度深入讲解操作系统对应用的影响,在每个章节均有实战经验帮我们更好地理解操作系统。后端开发有时会忽视操作系统、JVM 调优方向,只会在 OM 问题、CPU 占用量剧增导致生产问题出现时,才会现场研究操作系统方面知识。
第二本则是经典的《人月神话》。这本书针对技术研发、项目管理等方面提供了很多参考案例。在项目进度不如意时,我们常倾向于投入大量人力追赶进度。但大面积地引入新人会带来大量工作交接及培训成本,浪费了时间也降低了效率,我们应当维持现有团队,通过合理化结构调整,正常进度内追赶上工期。
InfoQ:站在 2023 年伊始,您能为后端研发工程师们送上一句祝福吗?
周正杭:希望大家能保持对自己未来发展方向的渴望,就和乔布斯所说“stay hungry, stay foolish”,时刻清楚自己的成长目标,每天都要学习,让自己进步,积极的情绪能帮助大家快速成长。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。