首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >说说真实Java项目的开发流程,以及面试前的项目准备说辞

说说真实Java项目的开发流程,以及面试前的项目准备说辞

作者头像
用户1153489
发布2022-12-13 16:50:29
6740
发布2022-12-13 16:50:29
举报

    介绍项目是必不可少的Java面试环节,求职者需要借此证明自己真实Java项目的经验,如果再做的好的话,需要借此展开自己的亮点说辞。

    不过之前如果只有学习项目经验,比如是自己跑通一个项目,或者是在培训班里通过一个Spring Boot项目入门Java,那么这些学习项目的开发流程其实和公司里真实Java项目,是有一定差距的。在转行之类需要真实项目的场景里,如果仅仅介绍学习项目里的开发流程和开发细节,那么真可能被认定之前缺乏商业项目经验。

    由于商业项目是用于挣钱的,而且商业项目正是因为要从客户那边收钱,所以其在确定需求,开发,测试,部署和问题排查等方面,和学习项目存在很大的差异。下文就将详细讲述真实java项目的开发流程,并针对性地说明学习项目和商业项目的差异,这样一些零项目经验想入行或转行的Java求职者,一定能从中获得收益。

1 先说说真实项目的敏捷开发流程和常用的项目管理工具。

    学习项目一般是从零跑通一个项目,只要能从前端发请求看到预期的效果,这个项目就算成了,但真实的项目一般会采用敏捷开发模式,哪怕是有些公司的田园敏捷开发模式,一般也是采用“迭代”开发的流程。

    比如一个项目从开始做,到真实完成,假设需要半年,包含大概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面试的角度,向大家讲述真实项目的各种细节,从中大家能知道阐述项目真实性的方式,这样一定能帮助零项目经验的求职者更好地过面试。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-12-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 先说说真实项目的敏捷开发流程和常用的项目管理工具。
  • 2 在商业项目里,开发者未必是全栈都做,而是只做后端开发,而且后端开发一定要加入很多细节。
  • 3 在真实项目里,一定会遇到线上问题,你可以说下监控和排查分析线上问题的细节。
  • 4 可以说下项目编译打包部署乃至上线之类的话,因为学习项目一定不包含这些。
  • 6 再说下零项目经验求职者java技术层面的上限。
  • 7 总结
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档