# Java项目开发流程,面试项目说辞

  • 介绍项目是必不可少的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命令启动,启动后开发和测试人员发现没问题后,本次发布就算成功,然后再开始下个为期一个月的开发周期,这样一直到本项目全部完成。

# 真实项目准备说辞

我们项目是用敏捷开发模式,然后大致叙述下开发周期,同时加一句,我们项目组,会每天开会讨论进度,如果有阻塞性的问题,或者技术问题,得赶紧提出来

我们项目组用到了git和maven来管理代码和依赖包,同时看些git拉分支,合并代码和处理冲突的细节,也可以看下用maven打包以及创建公司私有仓库的做法

我们项目是用jira来管理任务和bug,真实项目一般都用jira,所以哪怕是零基础的,jira未必要搭建,未必要实践,但需要了解下通过jira创建任务和创建bug的细节

我接到开发任务后,一定会在开发分支,比如202210dev分支,在此基础上再创建一个我自己用的任务分支,比如202210dev001,其中001是任务号,在此分支上开发功能点。开发好以后,我会用junit写单元测试案例,也会用postman发请求,这个属于程序员自己要做的测试,当测试通过后,再提交到202210dev001分支上

我自己做好我的业务模块后,会用junit写测试案例,如果junit不熟悉可以不说,但一定要说用postman发请求测试。在版本发布的时候,我会留守在公司,遇到问题我会排查和解决

# 商业项目中的后端研发

在学习项目和培训班项目里,开发者其实是全包的,从前端react到后端spring boot,再到建数据表,这些工作都要做。但在真实项目中,如果你的职责是后端代码,那么其实是无需关注前端的

而且在项目组里,你其实真未必是从零开始做。比如你入职被分配到一个财务系统里,这个系统一定是开发到一定程度了, 所以你其实是无需参与表设计的工作,也无需参与搭建前端后端框架的事。你的事情其实就是用spring boot开发业务

  • 我只负责用后端开发,即用spring boot开发控制器,service和mapper层,我这个接口是用@requestmapping来匹配前端请求,前端是vue构建的
  • 我开发的api需要用swagger来展示接口,swagger其实不难,大家可以看下。在我开发的api里,要用logback写日志,以便排查线上问题。对应的,我每开发好一个接口后,要用junit来写单元测试案例,这里强烈建议大家学下junit,这不难,而且了解一下其中mock数据的动作
  • 我们的环境分测试环境和生产环境,其中生产环境就是对外提供服务的,但我们的代码开发好以后,会部署到测试环境,测试环境也是linux。一般学习项目甚至只在windows上开发,但真实项目一般分测试和生产两个环境
  • 我开发的时候,如果需要其它组提供接口,比如支付系统里要调用对账模块的api,那么我会和其它组的人沟通,对应地,对方组开发好以后,会用swagger来展示接口。这里你可以展示在项目开发中必不可少的沟通技能,相比之下在学习项目,一定没这个流程

出于培训效果,培训班项目大多是让学员全栈开发,但事实上,有项目经验的开发者,大多是只从事一个方向的工作,比如java后端。所以如果你是要去找java后端工作,一定得优先证明后端经验,这样哪怕前端说不上也不要紧,但相反,如果两者都会,但后端只能说出学习项目里的一些低层次的技术,那么面试真就可能过不了

# 项目监控和排查分析

真实项目上线后,对应的服务器大概率会有监控组件,比如zabbix。如果遇到慢SQL查询,或者是系统部署所在的服务器,内存或cpu用量过高,zabbix会根据之前的设置,向程序员通过邮件或消息之类的方式告警,而且,根据之前的设置,当系统日志里,5分钟内exception或error关键字出现频率超过10个,zabbix也可以告警

程序员在收到告警信息后,可以通过vi命令,去观察linux上的系统日志,如果再有必要,可以通过执行计划观察慢查询的sql语句,或者通过dump文件观察OOM问题,当然如果是业务问题,比如是参数不对,那么能根据日志上的告警信息,定位到具体的类和代码行,然后解决

相比之下,在学习项目里,一般日志只是输出到控制台,而不是文件,当接口做好以后,用postman发请求时,是通过控制台的日志排查问题,如果在面试中只表达出这层意思,那么面试官就能轻易确定你只有学习项目经验

对应的,面试中或面试前,Java或其它IT求职者可以怎么准备呢

  • 准备些输出日志的方式,比如java项目里是用logback,然后看下怎么用logback输出info,warn或debug级别的日志,这些不难,零项目经验的小白也能轻易看懂
  • 就准备些linux上用vi或tail命令观察日志文件的方式,如果有条件,去看下索引等方面的细节,如果再有条件,去看些解决redis或kafka等中间件问题的细节
  • 监控设置的事情是运维或项目经理做的,但一旦有系统问题,比如慢sql查询,或者日志里大量出现exception,我会收到告警邮件,手机上也能提示。出了问题后,我登到linux,用vi命令观察异常日志,然后解决过业务参数问题,也解决过索引等问题
  • 再准备些细节,比如索引问题的八股文,或者是vi命令打开搜索文件的方式,甚至redis缓存穿透和kafka消息积累问题的细节,找些资料也能看也能说。当然你说你知道zabbix等组件等配置方式,那就更好了

# 项目编译打包部署或上线

比如Java项目,一般是用jenkins或pipelines,以流水线的方式完成打包部署上线之类的或,相关技能大家可以看下CI/CD,不过对于零基础的求职者来说,要看熟这块所需要的代价比较大,可能真得用2周甚至更长时间,这似乎有些不值当,所以在面试前倒可以用如下的方式来准备

  • 就熟悉下上文提到的git,maven等工具,以及git的提交,合并,处理冲突等方式
  • 大致了解下jenkins工具,看看jenkins长什么样,能干什么,然后就说jenkins是项目经理设置的,代码提交到开发分支或master或dev等主分支后,jenkins脚本能自动从git分支上拉代码,然后用maven或gradle等命令把项目打成jar或war包,然后再做必要的代码扫描,比如用sonar,sonar工具会看代码单元测试覆盖率,以及代码是否有方法过长等不规范,sonar这块如果不想讲也不要紧。然后jenkins会把jar或war包复制粘贴到指定的linux路径里,然后再启动,这样就实现了自动化打包部署的事情了

  • 上线之前,你们组会把你们本次上线要用的配置参数,比如决定某个功能是否要运行的参数告诉运维,会把增加字段和增加索引的sql语句告诉运维或dba,当然这些细节你们已经在测试环境上测过。上线时,运维会在全局配置文件上加入你们新加的内容,再具体些可以说在nacos全局配置上加,会在生产数据库上加加入你们的更改。这里如果你面的是比较低级的岗位 ,不要说那么细,就说上线前会提交本次上线的配置和数据库变更文件

相比之下,如果是培训班项目,顶多实践过在linux上打包部署,但培训班项目没有上线这个过程,如果是自学项目,估计都在windows上跑,上述说辞估计都没听说过。所以如果你准备过上述说辞,哪怕有些点你推说细节说不清,那么大概率能证明你的商业项目经验

# 分布式组件

分布式组件,比如redis或kafka,或者spring cloud alibaba系列的nacos或gateway,这块由于能解决高并发分布式层面的问题,所以非常值钱,这也是架构师面试的必问点,但很多培训班项目或自学项目,仅仅是为了使用而用,所以会不切合场景地使用,这反而会暴露求职者“其实没做过真实项目”的底细,这还比如不说

但有些有经验的面试官,就从应用场景来问,比如你说用过sentinel来限流,面试官就问你是否有限流的需求,你们业务流量多少,从这个角度,一定会问出项目是学习项目。所以分布式或微服务组件这块,虽然值钱,但零项目经验的求职者由于没在项目里开发过,这块别贪,因为过度了反而会露馅

# 零项目经验求职上限

零项目经验求职者在分布式组件层面的上限,下面再说说在java技术方面其他层面的上限,即过了这个线,你再学的技术,由于无法证明在项目里用过,所以顶多只能证明你看过了解过,与其把精力大量用在这方面,还不如熟悉下上文提到的证明项目真实性等说辞

  • spring boot框架层面,看熟增删改查,logback,swagger等组件可以看,但别看对应的源码
  • 数据库层面,顶多看些单机版外带redis的技能,比如索引,事务,执行计划,单机版redis,这块可以落实到项目里,但redis集群或mysql集群,你可以说你是用项目经理搭建的,但你自己没搭建过,再进一步,比如数据库底层或数据库或缓存集群,别看
  • docker容器部署和k8s,别看
  • 分布式组件或微服务组件,量力而行,重要的是要结合业务讲
  • linux层面,看到能通过vi或tail命令打开和搜索日志文件这个层面就行,像shell脚本可以别看,比shell更复杂的 ,也别看
  • 前端,大致了解下vue或react框架或关键步骤即可,不用深入看
  • 多说一下,spring boot业务,通过若干个增删改查流程,看熟从控制器到service再到repo操作数据库的流程和关键代码即可,看熟悉以后,再多跑业务就属于重复劳动,没意义

不过事实上,有些培训班为了突出自己项目技术的优势,会讲docker等值钱技术,还是这句话,零项目经验求职者在找工作时,以说清楚项目经验为主,像docker之类的技术,本身确实值钱,但零项目经验的求职者由于无法结合项目证明自己用过,所以过度学没太大意思

# 总结

初级Java求职者,其实不是单纯靠技术找到工作,找工作时更要证明自己的项目经验,预祝各位都能找到满意且合适的工作。