先说目前关于架构师的一些是实际情况。
1 要成为Java架构师,单纯靠学知识一定不行,得靠在项目里积累经验。
2 如何判断程序员是否已经成为java架构师?不是看程序员掌握的技能,更不是看程序员干的活,而是看是否拿着架构师的工资。
3 大多数小公司的项目,没有包含,或很少包含足以让程序员升级到架构师的技能点。
4 如果没架构方面的项目经验,程序员无法通过跳槽得到架构师的实践机会。但反过来,没有架构师的项目实践机会,程序员无法升级成架构师,这是个死循环,也是大多数程序员无法升级到架构师的瓶颈所在。
其实大多数的程序员是无法升级到架构师的,先说下java程序员升级到架构师的难点。
1 很多程序员在日常工作里无法接触到架构师的技能
大多数的程序员能在工作中接触到高级开发的技术,所以从初级开发升级到高级开发,难度并不大,但架构师就不同了。
比如在一些小公司里,程序员大多是做重复劳动,业务变了,但用到的技术还是增删改查。哪怕在一些技术含量比较高的互联网公司,出于业务封装的角度,一些高并发高可用的实现往往被封装在方法里,程序员仅仅是通过调用方法实现功能,未必能在代码层面,接触到架构方面的技能。
无法从项目角度接触到架构相关技能,单靠看视频看资料积累起来的说辞,在面试过程中往往会不堪一击,从而无法应聘架构师的岗位,这反过来制约了程序员向架构师发展的脚步。
作为面试官,我有时候在面试高级开发的时候,会深入问些架构方面的问题,比如我问,你们系统里,模块间的通讯用的是什么组件,甚至还没问到架构方面的技能吗,这时不少高级开发可能就是一头雾水了,或者在他们眼里,更多的是调用方法实现功能。
2 不少程序员往往会深挖单机版的技能
很多工作中得过且过的程序员,在实现的功能通过测试以后,或许就无所事事了,而且这类程序员不在少数,在小公司或外包公司里,这类程序员往往会更多,说得直接些,这些程序员的竞争力和从培训班里出来的程序员没什么两样,或许就更熟悉业务。
或者有些程序员虽然上进,但会深挖单机版的技术细节,比如JVM虚拟机调优要点和MySQL性能优化要点,而从主观上忽视架构师应当具备的技能。
再说下java架构师在工作中,除了写业务代码,其他主要是干的什么活,从中大家就能感受到Java架构师该掌握哪些技能,通过思考得出的结论,比我单纯讲结论要好很多。
1 需要搭建高可用的框架,比如就拿最简单的搭建数据库服务来说,得考虑如果一台MySQL服务器宕了,如何保证业务切换到另外一台机器上。搭建其他组件,比如redis和Nacos时,都需要考虑此类高可用的因素。
2 需要考虑高并发的因素,从这个点展开,架构师至少需要会用nginx,mycat,netty,redis,dubbo之类的工具,以及考虑搭建实现负载均衡的集群。
3 不仅得熟悉组件,更需要把设计好的架构部署上线,或者哪怕上线动作是由运维来做,但架构师至少要知道如何把nginx集群等组件部署上线的活,由此架构师需要了解必须的linux命令和脚本,以及了解jenkins之类的部署工具。
4 上述技能不是简单会用即可,如果在开发部署和运行过程中由问题,架构师得负责解决。这就要求架构师不能仅仅靠看视频知道如何搭建系统,更得具备针对netty等组件的debug能力,还得能通过看日志,知道集群的运作情况,如果集群出了问题,还得知道如何快速解决。
5 不能仅仅关注技术,更得结合业务、成本的组员的情况,把诸如抢红包之类的需求通过架构,快速地实现并上线,这就要求架构师得知道各种组件的优劣,以此能选型并设计方案。
也就是说,架构师首先得了解一些组件的api,而且还得知道用组件实现限流熔断等高并发需求的做法,这还不算,还得结合业务把架构部署到服务器上,这还不算完,系统运行出问题后,还得解决其他人无法解决的问题。
讲到这里大家能进一步感受到,要成为Java架构师,绝不能单纯靠看视频看资料背答案,通过这些手段只能了解肤浅的技能,要成为架构师,更得具备实践和排错的技能,这也是为什么架构师的工资可以上不封顶的原因。
讲完上述铺垫后,再讲下如何成为java架构师?说起来很简单,掌握架构师的实践技能,过架构师的面试。甚至再简单点,只要有本事,不掌握架构师技能也行,只要过面试就行,但这极难做到。
1 首先得熟悉spring boot框架增删改查,使用logback等组件,外带尽可能熟悉单机版的开发技能。做到这点的标准是,程序员能解决大多数线上单机版的问题。
2 先熟悉各种分布式组件的api用法,这些组件包括redis,nginx,dubbo,rabbitmq等,具体就不一一展开了,总之在实际项目中,是通过这些组件解决分布式高并发问题。
做到这点的难处是,平时项目中一般很难有机会接触到这些组件,而这些组件大多是安装在linux环境上,在自己windows操作系统上很难安装,没有运行环境,学起来就很困难。
不过在我写的书里,就给出了在windows上搭建诸多分布式组件的步骤,以及分布式组件的用法,通过这本书,至少能让大家掌握分布式组件的用法,这是升级到架构师必不可少的基础。
3 会用分布式组件,离开成为架构师还有段距离,后面就要尝试着用分布式组件解决实际问题,比如去解决熔断,高并发,缓存失效等问题。
话这样说没错,但不少朋友身处小公司,小公司的项目很少用到分布式组件,要在实际项目中实践分布式组件的技能很难。如果这样的话,一方面要尽可能多地挖掘项目里为数不多的分布式组件技能,比如缓存或分布式部署,或网关或消息队列,另一方面可以直接准备架构师的面试。
在讲架构师面试如何准备前,先讲讲面试架构师的方式。
第一层问理论和实践细节,比如Netty的序列化方式,以及Dubbo针对不同级别设置超时时间的方式,或者Redis的数据结构,这一定能通过背题准备。
第二层是结合项目需求问组件的使用方式,比如候选人说用了redis缓存,那就问,数据并发量多少?为什么要用?缓存是的键和值是什么?如果候选人的相关经验是编的,这块就答不上来了。
第三层是结合项目的必用点,问些底层细节,比如dubbo协议,Netty读写索引的细节,kafka持久化,Redis超时失效机制等方面。这方面不仅问概念,而且还会问,你们项目是怎么选的,为什么要这样选?这很能考核候选人在架构方面功底。
第四层是问组件的综合使用,比如让把项目里用到的组件串起来讲,分析下如何在数据库层面或通讯层面应对高并发,或问整体系统的日志处理框架。这些问题也能甄别出候选人的架构技能是理论层面还是真实项目里做过。
或者这样说吧,目前网上给出的一些针对架构师的面试题,其实内容上是没错的,但这些面试题仅仅是用来考核候选人在架构方面的理论知识点,除此之外,面试官一定会结合项目需求和项目里架构组件的必用点来考核候选人的架构技能。
随后再讲下关键点:如何通过架构师的面试,或者是,在零架构项目经验的前提下,通过架构师的面试。
1 结合网上诸多架构师的面试题,背架构方面的理论知识,比如dubbo线程模型等。这些点虽然多,但可以靠背,所以准备这方面的内容是体力活。
2 为每个你想在面试中讲的分布式组件,找个项目的落脚点。还以dubbo举例,你可以说,项目里的订单模块调用风控模块,用的是dubbo,dubbo采用的是zookeeper作为注册中心,采用了dubbo协议,比起http协议,dubbo性能更高,同时,还需要注意dubbo的远程调用超时问题。其他组件,以此准备。
3 单个组件准备好以后,准备集群和组件的整合,比如准备下mysql redis集群怎么搭建,应对哪些业务点,为了应对数据库高并发,我们项目组是怎么部署mysql和redis的,为了实现异步通讯,我们项目组是怎么搭建kafka的。一样道理,多准备些集群和整合方式。如果不知道怎么整合,网上一找一大堆,但同样需要落实到项目中。
4 再准备你解决过的高并发组件方面的问题,这点很能体现出架构师的能力。比如你还可以去看网上架构师的面试题,看的重点是“分布式组件常用的坑”,比如netty半包,redis穿透。准备好这些坑以后不算,你再结合下项目的业务,说下你项目里遇到过哪些问题,你是如何通过看日志排查出来的,后面怎么解决的。
5 更可以围绕一些需求点,比如围绕熔断,限流,秒杀,异步消息处理等需求点,准备下你的项目里是怎么用分布式组件实现的。
当你准备好上述说辞后,你就不用慌了,毕竟面试官只会通过面试短短的时间来确认你架构方面的能力,而你可以全面地结合项目业务很好地展示,而且还能以你解决过的项目实际问题为例来证明架构方面的能力,所以哪怕你之前没架构方面的项目技能,过架构师的面试也不是没可能。
做个总结:
1 要成为java架构师绝不能单纯靠学技能,更得靠项目实践。
2 大多数的架构师,是先通过架构师的面试得到实践机会,再提升技术点。
3 本文给出了适合零架构项目经验的程序员升级到架构师的操作建议。