怎么突出项目经验的真实性?说说真实Java项目的开发流程

参考原文:https://zhuanlan.zhihu.com/p/574240101

最近有很多同学向我咨询,我这有实习经验了呀,为什么简历还是过不了,或者走到第二轮问项目时候,感觉答的不错呀,怎么最终还是挂了?

很可能就是简历看起来是包装的,或者面试官问企业开发流程的时候说不清楚,对项目的看法还是学生思维,面试官感觉不到你在实习中有什么成长,从而断定你未来没有什么太大的潜力!

那我们来看下企业级的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来展示接口。这里你可以展示在项目开发中必不可少的沟通技能,相比之下在学习项目,一定没这个流程。

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 可以说下项目编译打包部署乃至上线之类的话,因为学习项目一定不包含这些。

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

总结

初级java求职者,其实不是单纯靠技术找到工作,找工作时更要证明自己的项目经验。有些求职者由于不知道真实项目长什么样,所以在准备面试时会无的放矢,甚至会在无意识的过程中暴露自己零项目经验的事实。

我是后端进阶博主,关注我,很值得,持续分享计算机校招技术及经验

#项目##春招##校招##简历##面试#
全部评论

相关推荐

17 93 评论
分享
牛客网
牛客企业服务