介绍项目是必不可少的Java面试环节,求职者需要借此证明自己真实Java项目的经验,如果再做的好的话,需要借此展开自己的亮点说辞。
不过之前如果只有学习项目经验,比如是自己跑通一个项目,或者是在培训班里通过一个Spring Boot项目入门Java,那么这些学习项目的开发流程其实和公司里真实Java项目,是有一定差距的。在转行之类需要真实项目的场景里,如果仅仅介绍学习项目里的开发流程和开发细节,那么真可能被认定之前缺乏商业项目经验。
由于商业项目是用于挣钱的,而且商业项目正是因为要从客户那边收钱,所以其在确定需求,开发,测试,部署和问题排查等方面,和学习项目存在很大的差异。下文就将详细讲述真实java项目的开发流程,并针对性地说明学习项目和商业项目的差异,这样一些零项目经验想入行或转行的Java求职者,一定能从中获得收益。
学习项目一般是从零跑通一个项目,只要能从前端发请求看到预期的效果,这个项目就算成了,但真实的项目一般会采用敏捷开发模式,哪怕是有些公司的田园敏捷开发模式,一般也是采用“迭代”开发的流程。
比如一个项目从开始做,到真实完成,假设需要半年,包含大概50个功能点,那么就会把这些功能点,均摊到6个开发周期,每个周期大概是一个月,这样每个月发布一次,把本月需要完成的功能点和本月修改掉的bug一起发布上线。具体的,比如一个月有4周,会在第一周的前半周,和产品方或客户方谈好需求,一般这是项目经理主导做的,谈好以后分配任务给诸多程序员,分配任务时一般用jira来记录,当然如果发现bug了,也会用jira来记录bug。
开发前,一般会基于git的主分支(master或dev或current)上创建一个新分支,比如202210dev分支,诸多程序员在这个分支上开发,然后约定个开发结束时间,这样到了这个月的第三周结束后,这个开发分支上就包含了本次发布所需要的的代码,然后这个发布版本就会冻结住,冻结的意思是,发布的版本需要稳定,不能随便再向里面提交并合并代码,在此基础上测试人员就开始测试。
一旦测试人员测出问题,项目经理会做个评估,如果不影响本次发布,就会在下个周期里修改掉,如果影响很大,那么需要走“解封”流程,解开本次已经冻结住的git分支,修改后再冻结住。
这样到了本次迭代周期的发布日,一般是业务量比较少的时间点,比如周末凌晨,运维人员会把从git上拉下待发布的分支,用maven或各种工具打成jar包,然后通过jenkins工具,或干脆手动复制粘贴,放到linux环境上,再用java -jar命令启动,启动后开发和测试人员发现没问题后,本次发布就算成功,然后再开始下个为期一个月的开发周期,这样一直到本项目全部完成。
所以求职者如果要证明自己的项目是真实项目,可以从如下若干个角度来准备说辞。
1 我们项目是用敏捷开发模式,然后大致叙述下开发周期,同时加一句,我们项目组,会每天开会讨论进度,如果有阻塞性的问题,或者技术问题,得赶紧提出来。
2 我们项目组用到了git和maven来管理代码和依赖包,同时看些git拉分支,合并代码和处理冲突的细节,也可以看下用maven打包以及创建公司私有仓库的做法。
3 我们项目是用jira来管理任务和bug,真实项目一般都用jira,所以哪怕是零基础的,jira未必要搭建,未必要实践,但需要了解下通过jira创建任务和创建bug的细节。
4 我接到开发任务后,一定会在开发分支,比如202210dev分支,在此基础上再创建一个我自己用的任务分支,比如202210dev001,其中001是任务号,在此分支上开发功能点。开发好以后,我会用junit写单元测试案例,也会用postman发请求,这个属于程序员自己要做的测试,当测试通过后,再提交到202210dev001分支上。
5 这里请注意,得说下代码review。我在202210dev001分支上的代码,得合并到202210dev这个发布分支,合并前,项目经理会指定其它开发者review我的代码,如果有功能或代码规范的问题,我会修改掉。测试人员如果发现我做的模块有功能问题后,会给我开个bug,一般也是用jira开,我会修,当然我把修改掉bug后的代码合并到发布分支前,依然需要经过code review这个过程。
6 我自己做好我的业务模块后,会用junit写测试案例,如果junit不熟悉可以不说,但一定要说用postman发请求测试。在版本发布的时候,我会留守在公司,遇到问题我会排查和解决。
所以零项目经验或通过培训班转行的同学,一定得准备上述说辞,这些点面试官如果不问就算了,如果问,就一定能从多个维度证明自己项目的真实性。
2 在商业项目里,开发者未必是全栈都做,而是只做后端开发,而且后端开发一定要加入很多细节。
在学习项目和培训班项目里,开发者其实是全包的,从前端react到后端spring boot,再到建数据表,这些工作都要做。但在真实项目中,如果你的职责是后端代码,那么其实是无需关注前端的。
而且在项目组里,你其实真未必是从零开始做。比如你入职被分配到一个财务系统里,这个系统一定是开发到一定程度了, 所以你其实是无需参与表设计的工作,也无需参与搭建前端后端框架的事。你的事情其实就是用spring boot开发业务,在上文的基础上,你还可以用如下的说辞证明你做的是商业项目,而不是学习项目。
1 我只负责用后端开发,即用spring boot开发控制器,service和repo层,我这个接口是用@requestmapping来匹配前端请求,前端是html页面,我熟悉react,但我没系统做过。
2 我开发的api需要用swagger来展示接口,swagger其实不难,大家可以看下。在我开发的api里,要用logback写日志,以便排查线上问题。对应的,我每开发好一个接口后,要用junit来写单元测试案例,这里强烈建议大家学下junit,这不难,而且了解一下其中mock数据的动作。
3 我们的环境分测试环境和生产环境,其中生产环境就是对外提供服务的,但我们的代码开发好以后,会部署到测试环境,测试环境也是linux。一般学习项目甚至只在windows上开发,但真实项目一般分测试和生产两个环境。
4 我开发的时候,如果需要其它组提供接口,比如支付系统里要调用对账模块的api,那么我会和其它组的人沟通,对应地,对方组开发好以后,会用swagger来展示接口。这里你可以展示在项目开发中必不可少的沟通技能,相比之下在学习项目,一定没这个流程。
出于培训效果,培训班项目大多是让学员全栈开发,但事实上,有项目经验的开发者,大多是只从事一个方向的工作,比如java后端。所以如果你是要去找java后端工作,一定得优先证明后端经验,这样哪怕前端说不上也不要紧,但相反,如果两者都会,但后端只能说出学习项目里的一些低层次的技术,那么面试真就可能过不了。
3 在真实项目里,一定会遇到线上问题,你可以说下监控和排查分析线上问题的细节。
真实项目上线后,对应的服务器大概率会有监控组件,比如zabbix。如果遇到慢SQL查询,或者是系统部署所在的服务器,内存或cpu用量过高,zabbix会根据之前的设置,向程序员通过邮件或消息之类的方式告警,而且,根据之前的设置,当系统日志里,5分钟内exception或error关键字出现频率超过10个,zabbix也可以告警。
程序员在收到告警信息后,可以通过vi命令,去观察linux上的系统日志,如果再有必要,可以通过执行计划观察慢查询的sql语句,或者通过dump文件观察OOM问题,当然如果是业务问题,比如是参数不对,那么能根据日志上的告警信息,定位到具体的类和代码行,然后解决。
相比之下,在学习项目里,一般日志只是输出到控制台,而不是文件,当接口做好以后,用postman发请求时,是通过控制台的日志排查问题,如果在面试中只表达出这层意思,那么面试官就能轻易确定你只有学习项目经验。
对应的,面试中或面试前,Java或其它IT求职者可以怎么准备呢?
1 准备些输出日志的方式,比如java项目里是用logback,然后看下怎么用logback输出info,warn或debug级别的日志,这些不难,零项目经验的小白也能轻易看懂。
2 就准备些linux上用vi或tail命令观察日志文件的方式,如果有条件,去看下索引等方面的细节,如果再有条件,去看些解决redis或kafka等中间件问题的细节。
3 面试时可以说,我们项目上线后是用zabbix监控,监控设置的事情是运维或项目经理做的,但一旦有系统问题,比如慢sql查询,或者日志里大量出现exception,我会收到告警邮件,手机上也能提示。出了问题后,我登到linux,用vi命令观察异常日志,然后解决过业务参数问题,也解决过索引等问题。
4 然后再准备些细节,比如索引问题的八股文,或者是vi命令打开搜索文件的方式,甚至redis缓存穿透和kafka消息积累问题的细节,找些资料也能看也能说。当然你说你知道zabbix等组件等配置方式,那就更好了。
其实上述细节要准备的点不多,零项目经验哪怕是用个一周也能看熟相关技术,但是否解决过实际问题,绝对是学习项目和商业项目的重要差别。
4 可以说下项目编译打包部署乃至上线之类的话,因为学习项目一定不包含这些。
比如Java项目,一般是用jenkins或pipelines,以流水线的方式完成打包部署上线之类的或,相关技能大家可以看下CI/CD,不过对于零基础的求职者来说,要看熟这块所需要的代价比较大,可能真得用2周甚至更长时间,这似乎有些不值当,所以在面试前倒可以用如下的方式来准备。
1 就熟悉下上文提到的git,maven等工具,以及git的提交,合并,处理冲突等方式。
2 大致了解下jenkins工具,看看jenkins长什么样,能干什么,然后就说jenkins是项目经理设置的,代码提交到开发分支或master或dev等主分支后,jenkins脚本能自动从git分支上拉代码,然后用maven或gradle等命令把项目打成jar或war包,然后再做必要的代码扫描,比如用sonar,sonar工具会看代码单元测试覆盖率,以及代码是否有方法过长等不规范,sonar这块如果不想讲也不要紧。然后jenkins会把jar或war包复制粘贴到指定的linux路径里,然后再启动,这样就实现了自动化打包部署的事情了。
3 上线之前,你们组会把你们本次上线要用的配置参数,比如决定某个功能是否要运行的参数告诉运维,会把增加字段和增加索引的sql语句告诉运维或dba,当然这些细节你们已经在测试环境上测过。上线时,运维会在全局配置文件上加入你们新加的内容,再具体些可以说在nacos全局配置上加,会在生产数据库上加加入你们的更改。这里如果你面的是比较低级的岗位 ,不要说那么细,就说上线前会提交本次上线的配置和数据库变更文件。
4 系统上线后,你作为值班人员,会跑若干个脚本来测试,或者干脆到生产环境的html页面或app上测试,如果没问题最好,如果有问题,赶紧看日志查,如果自己搞不定就找同事或项目经理。不过上线时遇到问题不多,你说没遇到过,你参与过的上线都很顺利,问题也不大。
相比之下,如果是培训班项目,顶多实践过在linux上打包部署,但培训班项目没有上线这个过程,如果是自学项目,估计都在windows上跑,上述说辞估计都没听说过。所以如果你准备过上述说辞,哪怕有些点你推说细节说不清,那么大概率能证明你的商业项目经验。
5 再说下分布式组件和spring cloud alibaba组件方面,真实项目和学习项目的差异。
分布式组件,比如redis或kafka,或者spring cloud alibaba系列的nacos或gateway,这块由于能解决高并发分布式层面的问题,所以非常值钱,这也是架构师面试的必问点,但很多培训班项目或自学项目,仅仅是为了使用而用,所以会不切合场景地使用,这反而会暴露求职者“其实没做过真实项目”的底细,这还比如不说。
这块,零项目经验的求职者不用学太深,了解下api和配置文件即可,因为很多3年以下项目经验的java开发,也就会用个api,这方面应当结合业务需求来说。
1 比如redis或kaifa,很多培训班会说在低并发下用,这块如果要说,一定要找个业务落脚点,比如某支付系统,并发量要到2000,支付过程中会频繁调用会员名字,所以要用redis,因为支付后要短信通知,所以要用kafka,或者如果要说用过nacos之类的,你就说系统是分布式部署,所以要用。但如果你没准备过业务场景,宁可别说用过组件,或者没必要把相关组件都准备全,准备若个个就行。
2 你就去看些api,比如redis是用redisTemplate缓存和读取数据,kafka也有相应的读取和发送方法,这些api你记着一些。面试时就结合业务结合api来说。
这里千万记住,如果你单纯去背redis等组件的八股文,面试时说项目没用过,如果你面的是java初级,那问题也不大,毕竟java初级做熟spring boot等框架就行。如果你能结合业务场景和api说你项目你用过,这是零项目经验求职者能做到的最好程度。
但有些有经验的面试官,就从应用场景来问,比如你说用过sentinel来限流,面试官就问你是否有限流的需求,你们业务流量多少,从这个角度,一定会问出项目是学习项目。所以分布式或微服务组件这块,虽然值钱,但零项目经验的求职者由于没在项目里开发过,这块别贪,因为过度了反而会露馅。
6 再说下零项目经验求职者java技术层面的上限。
上文也提到了,零项目经验求职者在分布式组件层面的上限,下面再说说在java技术方面其他层面的上限,即过了这个线,你再学的技术,由于无法证明在项目里用过,所以顶多只能证明你看过了解过,与其把精力大量用在这方面,还不如熟悉下上文提到的证明项目真实性等说辞。
1 spring boot框架层面,看熟增删改查,logback,swagger等组件可以看,但别看对应的源码。
2 数据库层面,顶多看些单机版外带redis的技能,比如索引,事务,执行计划,单机版redis,这块可以落实到项目里,但redis集群或mysql集群,你可以说你是用项目经理搭建的,但你自己没搭建过,再进一步,比如数据库底层或数据库或缓存集群,别看。
3 docker容器部署和k8s,别看。
4 上文已经提到,分布式组件或微服务组件,量力而行,重要的是要结合业务讲。
5 linux层面,看到能通过vi或tail命令打开和搜索日志文件这个层面就行,像shell脚本可以别看,比shell更复杂的 ,也别看。
6 前端,大致了解下vue或react框架或关键步骤即可,不用深入看。
7 多说一下,spring boot业务,通过若干个增删改查流程,看熟从控制器到service再到repo操作数据库的流程和关键代码即可,看熟悉以后,再多跑业务就属于重复劳动,没意义。
不过事实上,有些培训班为了突出自己项目技术的优势,会讲docker等值钱技术,还是这句话,零项目经验求职者在找工作时,以说清楚项目经验为主,像docker之类的技术,本身确实值钱,但零项目经验的求职者由于无法结合项目证明自己用过,所以过度学没太大意思。
7 总结
初级java求职者,其实不是单纯靠技术找到工作,找工作时更要证明自己的项目经验。有些求职者由于不知道真实项目长什么样,所以在准备面试时会无的放矢,甚至会在无意识的过程中暴露自己零项目经验的事实。
所以本人站在准备java面试的角度,向大家讲述真实项目的各种细节,从中大家能知道阐述项目真实性的方式,这样一定能帮助零项目经验的求职者更好地过面试。