e6cc4229428611f5a563aa0b6af507c9.png

我是在2016年6月份从iOS开发转为Java后端开发的,第二年2月份我就开始了我的支付宝面试之路,并且在最后成功入职。在进入支付宝之前,我一直在小公司工作而且只是一个普通三本的毕业生,没有大厂工作经验又没有学历加持的我是如何在短短9个月的时间里成功转型Java后端并进入支付宝的呢?

前端时间有一个移动端开发同学问了我转型后端的问题,让我萌生了写这篇文章的想法,希望能够帮到不管是想要转型还是直接进入后端开发领域的同学。

我在成为Java后端开发之前从事了两年的iOS和Mac App开发,虽然已经有了相当程度的开发工作基础,但是前后端的技术栈和思维模式还是有很大的区别的。即使是Android和Java后端同样使用Java语言开发,实质上想要转型也面临一样的困难,反倒是编程语言的差别是最容易解决的。虽然在最后得到了一个让我非常兴奋的结果,但是在我刚刚决定要转后端的时候我甚至连自己能不能在后端开发岗位上站稳脚跟都不知道。在短短9个月的时间里,我至少面临了两次重大的转折。

转型Java后端

第一次重大转折是我主动从iOS开发转型为了Java后端开发,我当时还没有在工作中真正写过Java后端程序,为了能够有机会转型后端,我差不多提前了1个多月开始学习Java后端常用的SSM框架和MySQL数据库,因为之前还在学校的时候有简单学过一段时间,所以进度会比较快一些。不过这个提前学习也没有起到太多作用,最多也就是达到了常用功能的文档看了一遍、然后自己动手搭了一遍的程度。

之后我就和当时公司技术部门的领导提了想要转为后端的愿望,小公司在这方面还是比较有优势的,一般只要技术领导同意内部转岗都是比较容易的。不过要让技术领导同意转岗的话其实也并不需要和领导关系搞得特别好,更重要的是让决策人相信自己具备能够胜任或者快速适应新的工作岗位的能力或潜力。

我认为我当时就得益于自己在平时的开发工作中不会在质量上做出随意的让步,不会因为时间紧、逻辑复杂之类的原因就“节省”代码中的细节优化,并且我在工作中主动将这点表现了出来。当我碰到写出的代码不是特别易读或易可扩展时,会主动找机会和同事分析一下有没有什么办法可以对这部分逻辑进行优化。有时候这些讨论不一定能得到特别好的优化方法,但是讨论的过程本身就表明了我对待工程细节的态度,而且对自己工程能力的提高也会有很大的帮助作用。另一方面我也是基于gitflow形式的code review的倡导者,即使在我没有能力要求其他同事提交merge request来进行code review的时候,我也会主动把自己的代码分模块提交给同事review,既能起到防止出错的作用,还能够展现自己代码中优秀的部分。这些工作中的表现都会促使转岗的决策人认为,我对新岗位是有克服困难去快速适应的能力的。

挑战开始

896938a4fbd8d6d3e83a06d4f057effb.png

等到正式开始参与后端工作以后,其实挑战才刚刚开始。头一个星期我被分配了个营销活动的页面练练手,不过因为是初次接触过程中也还是出现了不少波折,不过等到第二个项目才真的是给我带来了一个巨大的挑战。当时公司希望开展基金销售业务,虽然底层依赖的是有基金销售资质的第三方提供的接口,但是这些接口只支持单支基金的申购和赎回操作。而我当时被分配到的工作直接就是整个业务中最复杂的基金组合模块。

独立承担一个复杂的完整业务模块开发工作一下子就暴露出了我后端知识体系中的诸多弱点。我不得不边做边学,比如数据库设计、幂等实现、轮询补偿,我都是现学现卖。在碰到这些不会的知识点时,我会尽量多花时间上网找资料,寻找多种解决方案再对它们进行比较。头几个月在做一个功能时,我常常需要把这个功能的整体流程先理顺,然后把流程中还不明确的点都记录下来,然后再逐个解决。这个过程会花费我不少的时间,让我不得不花更多的时间和精力才能完成工作。但是在这个过程中我积累了很多具体的解决方案,在之后两三年的时间里不管在工作还是面试中我都会持续受益于这些积累下来的解决方案。

项目刚开始时,我曾经因为任务的难度对我当时的水平来说太困难而一度打起了退堂鼓或者心生抱怨。不过最后想要成为一个后端开发工程师的强烈愿望让我不得不以一个真正的Java后端开发的标准来要求自己。当把这些乱七八糟的情绪通过理性的分析全部屏蔽掉以后,剩下的就只有如何想方设法来让自己能够完成项目中的工作了。两三个月后,当整个业务正式上线运行时,我突然感觉我真正跨入了Java后端开发工程师的大门,之前所有付出的所有努力都有了回报。

在刚转型为Java后端开发时,我还报了在线的Java后端课程和MySQL数据库工程师课程,一边学习在线课程中的内容,一边在实际工作中进行应用。虽然总感觉每次都匆匆忙忙的,要抓紧在有限的时间里搞清楚知识点再马上应用到工作中。但是到了最后,反而觉得比单纯的“学习”对相关技术掌握得更多更好了。这让我想到我以前在学校里也尝试学过Java后端开发,但是总是在学的时候感觉自己都会了,一到真正要写代码时就傻眼了。反而是在这种边学边用的紧张状况下,我对知识点的掌握都很扎实,对难点的理解也更深入了。

目标:支付宝

1fc28e44a6bddb93ca475745e16f76d9.png

不过我还没高兴多久就被浇了一盆冷水,我的一个朋友在和我聊天时觉得后端开发领域最重要的还是高并发分布式系统的经验,小公司中的工作内容都上手了也只能算是初级开发。虽然我嘴上并不愿意承认这一点,但是心里却不得不承认这个观点很大程度上确实是一个客观规则。当时对于我希望能通过社招进入BAT的想法来讲,这确实就成了一个先有鸡还有先有蛋的问题了:不进入大公司我就没办法拥有高并发分布式系统的实际工作经验,但是没有这些我又很难进入大公司。

从这时起,我就一直在琢磨如何才能扬长避短,想办法得到一个进入BAT的机会。要想进入BAT,那首先就要有一个面试机会。当时我考虑了某直聘和找朋友内推两个渠道,因为当时我考虑的就是可以直接对接到用人部门的实际招聘需求而不是一个空挂着的职位,这样可以让成功率提高不少。

面试准备

462c291ca0ee06b3e55984db219ebcfa.png

当时因为我也知道自己在高并发分布式这块肯定是很大的弱项,而且确实看了不少资料之后也还是只能停留在理论上,没有实际的实践经验很难把整个思路搞透彻。所以在准备面试时我都是着重突出自己擅长的方面,而且把面试流程中的关键环节都做了相应的准备。

首先面试中一般都会先介绍一下自己的项目经历,因为我正好做了比较复杂的基金组合交易模块,所以就重新整理了整个模块中的几个关键业务逻辑和关键的技术优化点。因为正好简历投的是金融中台部门,所以对基金交易中的各种关键时间节点和业务处理方法都做了专门的准备。必要的地方还专门给自己画了流程图方便记忆和理解,然后自己推敲了几遍口头上如何表述会比较清晰。

面试准备这块是我目前接触到的很多面试候选人都存在的问题,常常是一开始上来对自己项目经历的描述就很磕磕绊绊,而且也没有突出关键细节,讲得都比较笼统和模糊。这样的项目经历表述并不能体现自己对业务逻辑的理解和技术水平,也没有引出自己擅长的技术点来让面试官可以继续深入。我们面试中说的话一般都是为了展现自己的优点,所以在每一个环节上重点都应该放在怎么表现出自己的优势上来。如果只是简单描述公司业务、用过的技术,但是没有自己的分析或专长,那对面试官来说其实大部分就是无效信息了。

然后,我虽然没有高并发分布式系统的经验,但是对多线程并发、数据库中的索引与锁机制这些并发的关联主题是有一定了解的。所以我在项目经历中就会着重引出我在项目中对这两块知识的应用,而且事先也专门强化了这两个方面的知识细节。因为一般高水平的面试中都会不断挖掘主题下的关键技术细节,一直往下追问来判断面试候选人的技术水平。所以对技术知识的细节准备就非常重要了,至少应该要准备2~3个知识点可以一路问到很深的层次

如果是自己比较重视的面试,我觉得花一些时间提前准备一下是值得的,特别是对面试整体节奏的把握可以对面试结果带来非常大的正面影响。一般完整的一次技术面试准备至少要准备一个项目或业务的介绍,再加上2到3个技术知识点的全面准备。这样就可以从项目经历的介绍入手,然后在其中引出自己碰到的业务难题和技术难题,这些难题引出的就是对准备好的技术知识点的一系列追问了。因为面试官和候选人重点研究的技术领域一般不会完全重合,所以高水平面试中的面试官一般会尊重候选人的引导,让候选人可以有机会展示自己钻研之后所达到的技术深度。

最后

1dee9258ab4754dc0f1a7236bfdd86a1.png

最终,在经历了四轮技术面试+一轮代码测验+一轮HR面试之后,我终于拿到了支付宝金融核心中台部门的offer,算是实现了自己职业生涯中的一个小里程碑。可以说我从转型Java后端开始,唯一的优势可能就是之前有客户端的编程经验,最后能得到让自己满意的结果其实主要靠的还是大胆去做、尽力坚持。有时候大胆去追求自己想要的就已经足够了,碰到的困难也都是暂时的,用不了多久就会突然发现这些困难已经都不复存在了。

虽然最近一直听说Java后端开发岗位寒冬了,不过现在看大部分公司的HC还是后端的最多,而且会比整个大前端的名额都多上非常多。希望这篇文章能够鼓舞正在找工作或者想要跳槽的读者自信地去得到自己期望的结果。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐