当前位置: 首页 > 科技观察

一个普通码农如何“C位出道”闯入BAT?

时间:2023-03-13 22:30:25 科技观察

这篇文章,我将和大家聊聊很多很多很多人问过我的一个问题:中小型公司的Java工程师在跳槽互联网一线前应该如何规划和准备像BAT这样的公司?80%的Java工程师都感到困惑。我之所以用三个“多”来形容这个问题,是因为这个问题太普遍了,因为在中国至少有几十万的Java工程师,但他们都在国内的大型互联网公司工作。前编码员的比例可能是十分之一,或五分之一。所以,其实这也符合28法则,小部分人在大厂工作过,发展的很好。但大部分人还是在中小型公司,或者传统的外包IT公司工作。这些学生可能会对自己的技术成长和职业发展感到非常困惑。他们有一点追求,想去大厂,但是不知道怎么规划。我个人在国内几家大型互联网公司有超过十年的工作经验,面试和招聘了大量不同层次的开发者。包括初级、中级、高级开发,技术专家,高级技术专家,全部面试。同样,我也指导过很多学生的职业发展规划,也看到过很多学生的职业发展并不顺利,所以我打算从个人的角度来谈谈这个问题:从小到大的学生应该如何中型企业实现逆袭,一步步进入BAT。下面这种情况相信很多同学应该都有过类似的经历:一直在各个中小型公司徘徊,开发一些没有技术难度的Java系统,主要是CRUD。即使用MQ、缓存、分库分表,也没有并发,数据量也不是特别大,自己的技术增长极其缓慢。然后三五年,七八年,甚至十几年,职业发展和技术水平都停滞在这种状态,没有进一步的发展。现在冬天来了,到处裁员,中年码农陷入危机,无法加班,体力越来越差,孩子压力越来越大,很迷茫不知道该何去何从。有同学在中小型互联网公司遇到过以上情况,也有同学在一些IT外包公司遇到过以上情况。为什么你的技术十年八年就提不上来了?我们先搞清楚一个问题,为什么你的技术十年八年就提不上来?拆解一下,你的能力集中在哪里:技术广度,对MQ、缓存、NoSQL、大数据、高并发、高可用、微服务等一系列相关技术有一定的了解,熟悉常用的功能我都用过在自己的项目中,有一定的技术使用经验,可以理解为技术的广度。你有没有深入阅读过Kafka的底层源码?你对消息中间件的架构设计思想有深刻的理解吗?有没有研究过分布式事务框架/中间件的架构设计?有没有在百万并发场景下对底层系统做过深度优化和故障处理?如果你有类似的东西,那么你可以说你有一定的技术深度。项目经历曾负责过一个注册用户数亿、日活数千万的大型、高并发、分布式、高可用、高复杂度的系统架构设计?或者一直在负责公司内部几十个人使用的OA系统和CRM系统?这些是您的项目经验。团队管理你在互联网公司领导过20人的团队吗?或者你曾经在传统的IT公司领导过3人的团队吗?这完全取决于您的团队管理经验。拆解之后,我们再来看看。如果你在一些小的互联网公司或者做一些传统的软件开发,为什么技术不能提高呢?其实原因很简单。可能你的公司推出了一个APP,但是很遗憾,总用户数只有100万,日活跃用户数只有10万。那么您是否觉得您的系统存在技术挑战?没有。既然没有技术上的挑战,为什么要把系统搞得这么复杂呢?或者为什么你的架构师这么复杂?不必要。简单点吧,主要是CRUD写函数。顶多现在SpringCloud流行了,拆分成微服务就够了。那么这个系统就会稳定的支撑你公司的业务,你就不会面临重大的技术挑战,所以技术会停滞不前,这不是很正常吗?或者你做一些传统的软件开发,比如建筑软件,办公自动化软件之类的。一共几十个人用一个系统,或者几百个人,那你更是如此。可能不需要SpringCloud,直接用单块系统,单机部署,把业务代码填在里面就行了。所以根本原因是很多同学在平时的工作环境中通常没有技术上的挑战,所以只要把系统技术做的简单一些,就可以低成本支撑公司的业务。当然,在这种情况下,技术进步是非常缓慢的。那可能你工作八年、十年了,技术广度还不错。看过一些流行技术的书,简单使用过,玩过demo。你积累了很多项目经验,但都是各个传统领域的系统,对业务理解比较深,没有技术挑战极高的项目经验。有的人工作时间长,可能领导过一些人,有一些带团队的经验,会管人。大概是这样的。每次换工作,还是要换一家类似的公司,做类似的技术,但是还是没有进步,还是有类似的项目经历。那么我们先梳理一下,混乱的根源在哪里。自己设置技术挑战一般来说,站在公司的角度,我是非常反对过度设计架构的,因为浪费了很多时间,很多架构过于复杂,没有必要。但如果是从个人职业发展的角度出发,那么你的Leader一定有追求技术卓越的思维。或者如果你是Leader,你的团队的技术一定要有追求卓越的品质。什么是追求卓越?比如你现在开发了一个办公自动化系统,服务于某公司,上百人使用,技术一般,属于单体系统,直接用SpringMVC+Spring+MyBatis就可以搞定。每个人都在做无聊的事。好吧,现在Leader为了大家的幸福和未来,咬牙说道:Leader:兄弟们,现在体制满足公司的发展,但我们还是大胆追求卓越吧。兄弟:你说的领导力是什么意思??领队:这样一来,首先为了提高系统的开发效率,避免30兄弟开发单块系统的低效率,我们来实践一下流行的微服务架构。我们一起把系统改造成微服务架构,使用整套的SpringCloud。兄弟们:(仔细听)领导:我们先做技术研究吧。小A你来研究SpringCloud的核心技术组件,小B你来研究配置中心,小C你来研究服务链路跟踪等等。大家分头学习新技术。然而,我们已经很忙了。如果我们占用工作时间做这件事,老板会骂人的。看,每个人每天加班2小时一起做。这个怎么样?兄弟:领导,为了大家的幸福,我们必须尽快采用新技术,大家应该学习新的东西。最后大家努力了2个月,将系统重构成了一套完整的微服务架构。大家都学到了东西,领导也学会了设计微服务整体架构的能力。领队:兄弟们,为了以后的幸福,你们还要继续努力吗?兄弟:一切看领导安排。领队:现在这个破系统有几百人在用。这很无聊。让我们大胆想象。如果将来这个系统要做一个SaaS云产品,那么会有几百家,几万人,甚至几十个人。数千人同时使用一个后台系统。大家想一想,那会怎样呢?兄弟:贫穷限制了我的想象力。...领导:那小A,你可以根据目前的系统访问量来估算一下。如果几十万人用,系统每天的并发量是多少,数据库能不能支撑,需要用什么高并发技术来支撑?小B,去研究一下吧。如果几十万人用,我们要存储多少数据,性能会差到什么程度,如何支撑海量数据存储?然后看是用什么技术来支撑的?兄弟们:好吧,我们就听首领一句话,上剑山下火海。几个月后,我们开发了一个系统并完成了测试。系统集成了缓存集群、MQ集群、分库分表技术等等。这时,领导正在想办法。能不能建议老板我们把产品做成SaaS的云模型?那么是否可以将这个系统部署到生产环境中呢?至此,通过一个例子,给大家讲解如何想办法在公司不断追求系统的优秀,提高研发效率,支持可能存在的更高的并发量,更多的数据量,尝试做出系统更好。多想想如何尽可能多地学习一些业界常用的技术,以解决一些你想象中的技术挑战,比如缓存、消息、分布式、微服务、大数据等等。然后尽可能的进行相关的实践,积累相关的项目经验。其实每个人在走落地的过程中,走的路一定不一样:有的人可能是心轻,只能想象自己负责的模块有一些技术上的挑战,然后只能拉一个公司代码在本地分支并尝试在这些分支中添加一些技巧并练习自己的思考。有的人可能是小领导,不能影响公司的产品开发方向,但可以尽可能多地与上级沟通,说明自己在系统架构上追求卓越的想法。然后,争取一些时间,把尽可能多的技术融入系统,做得更好。每个人都有自己的路,但归根结底,如果自己的工作没有技术上的挑战,那就尽可能给自己设置一些挑战,多学习技术,多尝试,多实践。这总能在一定程度上帮助你提高技能,尽可能地扩展你的技术知识。在这个阶段,我看到大多数人犯的错误之一是:我觉得像这样摆弄一些技术是没有用的,而且我没有实际的真实体验。于是他们慌张、浮躁、自怜,总想着一定要晋升到好公司,才能提高技能。其实,这是一个很浮躁的想法。要想进入好的公司锻炼,首先要打磨自己的技能,才有资本去更好的公司。幻想着一步登天?那只是你的美梦。很多人技能多了,经验多了,就容易有点肿,总想着一步登天,一下子进入BAT。对此,其实也有一些类似的成功经验。例如,有些人拥有大学学位。他们通过自己的努力和一些巧合,直接从一家中小型公司跳槽到了BAT。但就现实而言,并不是每个人都能一步登天,复制这种体验。当你学会了一些技巧,多做了一些尝试,积累了一定的经验之后,这时候你应该做的是:坏打算,好希望。可以试试BAT面试,TMD面试,尽量去争取机会,但是不要脸也没关系。只要您将自己与自己进行比较,您就可以降低期望。比如,如果你目前在一家小型传统外包软件公司工作,那么如果你能加入一家拥有数百万用户、数十万日活跃用户的小型创业型互联网公司,将会比之前的公司面临更多的技术挑战。使用更多的技术,你就可以开始了。只要每一步跳槽,比以前更好,让自己有所提高,那么总体的大方向就是正确的。可能你先进入一家创业型互联网公司,然后你可以进入一个几十亿市值的上市互联网公司,然后你可以在下一步进入BAT。在这个阶段,我看到很多人犯了一个最大的错误:总觉得自己刚学了东西,马上就要进大公司了。这些学生往往匆匆忙忙,忽视了自己的学历、背景、经验,导致起点低。能马上进入BAT当然很好,但有时候缘分不是偶然的,进不去也是正常的。这个阶段最需要做的是和自己比,而不是和别人比,只要每次跳槽都比上次好,公司越大,薪资越高,职位越高,技术挑战就越大更大。不断提升自己,进入BAT。一旦你开始跳槽,进入一家比以前更好,技术挑战更高的公司,那么公司本身的技术挑战就会促使你快速成长。让我举一个例子。举个例子,如果你是做传统的软件开发,你是在使用单体系统涉及到的一些技术,也就是简单的SpringMVC、Spring、MyBatis等技术进行CRUD业务开发。但是,通过追求卓越,你在业余时间不断学习技术,然后针对你负责的一些模块设置一些技术挑战。当你构想出很多场景,挑战更高的时候,什么更高层次的技术。然后你带着自己学到的一些技术,以及积累的一些实践经验和思考,进入了一家创业的互联网公司。这家公司的优势是互联网公司有比较好的技术氛围,比如ZooKeeper、Redis、RocketMQ、Sharding-jdbc等技术,都在公司的生产环境系统中实现和使用。那么这个时候,是不是不需要停留在一些有技术挑战的想法上,可以开始真正去做一些有技术挑战的工作了。不过这个时候还是需要继续学习技术,多学习架构所需要的技术,深入学习技术,同时积累实践经验。然后有了这段工作经历,再加上你不断加强技术学习,你进入了一家估值30亿的独角兽公司。这家公司有2000万用户,日活跃用户100万,峰值并发量可以超过10000,数据库数据量每天增加几十万。这时你开始真正接触到所谓的:高并发、高可用、高性能,海量数据的实际处理。基于自己开发的业务系统,开始更多的实践,同时对涉及到的各种技术也有了更深入的学习,比如在源码层面阅读和研究了一些核心的中间件系统。终于,你终于等到了一个机会。BAT的一家公司让你去面试。经过四五轮面试,对方给了你一份offer,是高级Java工程师,年薪40万。然后你进去之后,可以在互联网公司学习开发流程、规范、架构,接触海量用户,每天都有无穷无尽的技术挑战。在这个过程中,你可以不断成长。最终再跳槽,可以进入其中一个TMD,拿到技术达人的offer,坐上大公司技术达人的职位,带领团队,走上人生巅峰。然后你跳槽了,说不定有些创业公司会开始挖你做一些技术管理。不要以为这只是作者编造的故事。在我辅导过的学生中,确实有一些学生走上了这条路,实现了人生的逆袭!上一条留言最后送大家一句话:九层楼,始于土基;千里之行,始于足下。这里面最难的就是第一步,就是当大量的人卡在一些没有太多技术含量的技术岗位上的时候,这个时候是最难的。其实,只要你能踏好第一步,拼命积累技术,努力与其他工程师竞争,并且你的技术远超与你相同情况下的其他工程师,那么你就有机会成为先走出这个困境,开始慢慢迈出第二步,第三步。最后,让公司的技术挑战推动你继续努力和提升,最终进入BAT这样的一线互联网公司。中华石山:十余年BAT架构经验,一线互联网公司技术总监。带领数百人团队开发过亿级大流量高并发系统。多年工作积累的研究手稿和经验总结,现整理成文,一一传授。微信公众号:石山的建筑笔记(ID:shishan100)。