简历上的项目描述(JAVA)怎么写想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,面试者在面试之前到底需要准备哪些东西呢?本文陈列的这些内容既可以作为个人简历中的内容,也可以作为面试的时候跟面试官聊的东西 , 你可以把这些内容写到你的简历中 , 当然更需要的是你在面试的时候向面试官展示这些专业技能 。相信此文对正在寻觅Java程序员(Java工程师)职位的freshman以及希望成为中高级Java开发者的junior都会有所帮助 。
专业技能
1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯 , 熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等 。
2.熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验 。
3.对Spring的IoC容器和AOP原理有深入了解,熟练的运用Spring框架管理各种Web组件及其依赖关系,熟练的使用Spring进行事务、日志、安全性等的管理,有使用Spring MVC作为表示层技术以及使用Spring提供的持久化支持进行Web项目开发的经验 , 熟悉Spring对其他框架的整合 。
4.熟练的使用Hibernate、MyBatis等ORM框架,熟悉Hibernate和MyBatis的核心API,对Hibernate的关联映射、继承映射、组件映射、缓存机制、事务管理以及性能调优等有深入的理解 。
5.熟练的使用HTML、CSS和JavaScript进行Web前端开发,熟悉jQuery和Bootstrap,对Ajax技术在Web项目中的应用有深入理解,有使用前端MVC框架(AngularJS)和JavaScript模板引擎(HandleBars)进行项目开发的经验 。
6.熟悉常用的关系型数据库产品(MySQL、Oracle),熟练的使用SQL和PL/SQL进行数据库编程 。
7.熟悉面向对象的设计原则,对GoF设计模式和企业应用架构模式有深入的了解和实际开发的相关经验,熟练的使用UML进行面向对象的分析和设计,有TDD(测试驱动开发)和DDD(领域驱动设计)的经验 。
8.熟悉Apache、NginX、Tomcat、WildFly、Weblogic等Web服务器和应用服务器的使用,熟悉多种服务器整合、集群和负载均衡的配置 。
9.熟练的使用产品原型工具Axure,熟练的使用设计建模工具PowerDesigner和Enterprise Architect,熟练的使用Java开发环境Eclipse和IntelliJ,熟练的使用前端开发环境WebStorm,熟练的使用软件版本控制工具SVN和Git,熟练的使用项目构建和管理工具Maven和Gradle 。
说明:上面罗列的这些东西并不是每一项你都要烂熟于心,根据企业招聘的具体要求可以做相应的有针对性的准备 。我个人觉得前6项应该是最低要求,是作为一个Java开发者必须要具备的专业技能
项目介绍 ??
本系统是X委托Y开发的用于Z的系统,系统包括A、B、C、D等模块 。系统使用了Java企业级开发的开源框架E以及前端技术F 。表示层运用了G架构 , 使用H作为视图I作为控制器并实现了REST风格的请求;业务逻辑层运用了J模式 , 并通过K实现事务、日志和安全性等功能,通过L实现缓存服务;持久层使用了M封装CRUD操作 , 底层使用N实现数据存取 。整个项目采用了P开发模型 。
说明:上面的描述中,E通常指Spring(Java企业级开发的一站式选择);F最有可能是jQuery库及其插件或者是Bootstrap框架,当然如果要构建单页应用(SPA)最佳的方案是前端MVC框架(如AngularJS)和JavaScript模板引擎(如HandleBars);G显然是MVC(模型-视图-控制),最有可能的实现框架是Spring MVC,除此之外还有Struts 2、JSF以及Apache为JSF提供的MyFaces实现,可以使用JSP作为MVC中的V , 也可使用模板引擎(如Freemarker和Velocity)来生成视图,还可以是各种文档或报表(如Excel和PDF等),而Servlet和自定义的控制器是MVC中的C,当然Spring MVC中提供了作为前端控制器的DispatcherServlet;J通常是事务脚本,K应该是AOP(面向切面编程)技术 , L目前广泛使用的有memcached和Redis;M的选择方案很多,最有可能的是Hibernate和MyBatis,也可以两种技术同时运用,但通常是将增删改交给Hibernate来处理,而复杂的查询则由MyBatis完成,此外TopLink、jOOQ也是优秀的持久层解决方案;底层的数据存取传统上是使用关系型数据库,可以是MySQL、Oracle、SQLServer、DB2等,随着大数据时代的来临,也可以采用NoSQL(如MongoDB、MemBase、BigTable等)和其他大数据存取方案(如GFS、HDFS等);项目的开发模型P可以是瀑布模型、快速原型模型、增量模型、螺旋模型、喷泉模型、RAD模型等 。
项目开发流程
1.可行性分析可行性分析报告 / 项目开发计划书
2.需求分析需求规格说明书
1.OOAD(用例图、时序图、活动图)
2.界面原型:帮助理解需求、业务层设计时推导事务脚本
3.设计概要设计说明书/详细设计说明书
1.抽取业务实体(领域对象):类图、E-R图(概念设计阶段)
2.分层架构:确定各层的技术实现方案(具体到使用的框架、数据库服务器、应用服务器等) 。业务层设计:事务脚本模式(事务:用户发送一次请求就是一个事务;脚本:一个方法或一个函数;事务脚本:把一次请求封装为一个方法或一个函数;事务脚本模式:一个事务开始于脚本的打开,终止于脚本的关闭) 。业务层涉及的对象本有三种类型:事务脚本类(封装了业务的流程)、数据访问对象(DAO,封装了持久化操作)、数据传输对象(DTO,封装了失血/贫血领域对象),三者之间的关系是事务脚本类组合(聚合)数据访问对象,这二者都依赖了数据传输对象
3.正向工程(UML类图生成Java代码)和逆向工程(Java代码生成UML类图)
4.数据库物理设计(ER图转换成表间关系图、建库和建表、使用工具插入测试数据)
4.编码 5.测试测试报告 / 缺陷报告
1.单元测试:对软件中的最小可测试单元进行检查和验证,在Java中是对类中的方法进行测试,可以使用JUnit工具来实施 。
2.集成测试:集成测试也叫组装测试或联合测试 。在单元测试的基础上,将所有模块按照设计要求组装成为子系统进行测试 。
3.系统测试:将已经确认的软件、硬件、外设、网络等元素结合在一起,进行信息系统的各种组装测试和确认测试,系统测试是针对整个产品系统进行的测试,目的是验证系统是否满足了需求规格的定义,找出与需求规格不符或与之矛盾的地方,从而提出更加完善的方案 。
4.验收测试:在软件产品完成了单元测试、集成测试和系统测试之后,产品发布之前所进行的软件测试活动 。它是技术测试的最后一个阶段,也称为交付测试 。验收测试的目的是确保软件准备就绪 , 并且可以让最终用户将其用于执行软件的既定功能和任务 。
5.交付和维护用户手册 / 操作手册
项目管理
版本控制:CVS/SVN/Git
自动构建:Ant/Maven/Ivy/Gradle
持续集成:Hudson/Jenkins
系统架构
负载均衡服务器:F5、A10
应用服务器:
HTTP服务器:Apache、NginX(HTTP、反向代理、邮件代理服务器)
Servlet容器:Tomcat、Resin
EJB容器:WildFly(JBoss Application Server)、GlassFish、Weblogic、Websphere 数据库服务器:MySQL、Oracle
第三方工具(插件)应用
【领域驱动代码Java 领域驱动编程】图表工具:基于jQuery的图表插件(如jQchart、Flot、Charted等)、Chart.js、Highcharts等 。
报表工具:Pentaho Reporting、iReport、DynamicReports等 。
文档处理:POI、iText等 。
工作流引擎:jBPM、OpenWFE、Snaker、SWAMP等 。
作业调度:Quartz、JobServer、Oddjob等 。
缓存服务:EhCache、memcached、SwarmCache等 。
消息队列:Open-MQ、ZeroMQ等 。
安全框架:Shiro、PicketBox等 。
搜索引擎:IndexTank、Lucene、ElasticSearch等 。
Ajax框架:jQuery、ExtJS、DWR等 。
UI插件:EasyUI、MiniUI等 。
富文本框:UEditor、CKEditor等 。
面试提问
项目是为哪个公司开发的?
项目的投入是多少?
有多少人参与了项目开发?
整个团队中,测试人员、开发人员、项目经理比例是多少?
项目开发了多长时间?
项目总的代码量有多少?
你的代码量有多少?
项目采用了怎样的开发模型或开发流程?
项目的架构是怎样的?
项目的技术选型是怎样的?
你在项目中承担了怎样的职责?
是否经常开会或加班?
项目完成后有哪些收获或是经验教训?
项目中最困难的部分是什么?
如何解决团队开发时遇到的各种冲突?
明:对于没有实际项目经验的,可以在前程无忧、智联招聘、拉勾网等网站上搜索招聘Java程序员的公司,找到他们的官方网站了解他们做的项目,查看项目的详细介绍 , 然后尝试完成其中一部分功能,最好请教一下高人看看自己的设计和代码是否恰当,这样相当于积累了一定的项目经验 。
面试时可以反问面试官的问题
我注意到你们使用了X技术 , 请问你们是如何解决Y问题的?
为什么你们的产品使用了X技术而不是Y技术?据我所知,X技术虽然有A、B、C等好处,但也存在D和E问题,而Y技术可以解决D和E问题 。
我对您说的X技术不是太熟悉 , 但我感觉它是一个不错的解决方案 , 您能多讲讲它的工作原理吗?
你们团队是如何进行项目规划的?一周会有几次例会?每周的代码量大概是多少?
就X问题我能想到的解决方案目前就只有Y了,请问您会怎么解决这个问题?
录用谈判
要理直气壮的提出具体的待遇要求
开出比预期稍高的价码
不要只盯着薪水(很多公司更愿意就薪水之外的条件做出让步)
使用最合适的方法(可以尝试在电话或E-mail中谈判待遇)
自我评价
学习能力(搞IT行业的人需要不断的了解新的技术、工具和方法)
团队意识(相比个人英雄主义,IT行业更倡导团队合作)
抗压能力(很多IT企业的工作强度相对来说还是比较大的)
自学编程,免费获取精品IT教程以及资料,搜索:黑马程序员
网页链接
java 为什么没有领域驱动设计领域中的分层模式(LAYERED ARCHITECTURE)
依次分为用户界面层 , 应用层,领域层,基础设施层各层主要任务
用户界面层:想用户显示信息和解释用户指令 。
应用层:定义软件要完成的任务 , 并指挥表达领域概念的对象来解决问题 。应用层应尽量简单,不包含业务规则或知识,而只是为下一层中的领域对象协调任务,分配工作,屎他们相互合作 。他没有反映业务情况的状态,但是却可以具有另外一种状态,为用户或程序显示某个任务的进度 。
领域层(模型层) :负责表达业务概念,业务状态信息以及业务规则 。尽管保存业务状态的技术细节是由基础设施层实现,但是反映业务情况的状态是由本曾控制并使用的 。此层是软件的核心 。
基础设施层: 为上面各层提供通用的技术能力,为应用层传递消息,为领域层提供持久化机制,为用户界面绘制屏幕组件,等等 。基础设施层还能通过架构框架来支持四个层间的交互模式 。
例子
为网上银行功能分层
领域驱动设计(DDD)实践之路(第二篇)在领域驱动里面领域驱动代码Java,infrastructure作为基础设施领域驱动代码Java,是提供技术细节的模块 。需要强调的是,很多人会误以为infrastructure就是传统的DAO层,其实infrastructure包括但不限于DAO层,比如文件处理,三方调用 , 使用缓存,发送异步消息等具体的技术细节实现都存在于infrastructure层 。那么技术细节是什么呢 。在领域驱动代码Java我们看来,技术细节包含以下特征
案例1:我们的实体需要持久化(存储),所以我们需要提供存储的实现 。领域层的repository.save等方法提供领域驱动代码Java了持久化接口约定,对于infrastructure来说,如何实现这个方法的代码 , 就是技术细节 。那么我们如何实现这个过程呢?自然是选择缓存,OSS存或者数据库存 。如果选择数据库,则进而需要选择orm框架,配置... , 实现repository.save的接口 , 这些都属于持久化所需的技术细节代码 。
案例2:我们的应用需要导出资产包相关的excel形式数据,那么当导出资产包数据时 , 文件领域模块提供了导出的统一接口,资产领域模块提供了资产包的适配接口,而导出excel的代码需要使用easyExcel或者POI等第三方框架,属于技术细节代码 。
案例3: 接案例2,为了实现导出时所需的excel排版格式,排版本身的格式与业务有关,比如在我们的业务场景下 , 我们导出调解明细(我们项目特定的一个领域模型)的时候,只需要按照常见的导出方式即可 , 而导出资产明细(我们项目特定的一个领域模型)则需要解析拼接所有的动态数据列,合并显示每条数据不同的动态列,而这一切是由业务决定的 。根据业务不同有不同的排版要求这一点体现了资产域需要提供文件域的导出策略,调解域也需要实现文件域的导出策略 。这些都属于描述业务信息的约定,而这些约定的具体实现比如怎么把实体的那一个属性映射到excel的哪一行哪一列,则属于技术细节 。这种区分方式显性化了业务的概念,同时又将实现放在了基础设施层,提供了一定的解耦性 。
说完了infrastructure的技术细节的定义,我们接下来聊几个在采用DDD研发模式下,infrastructure层开发过程中经常会遇到的一些问题及我们的解决方案 。
为了让业务逻辑和代码实现解耦,在repository的约定中,我们通常用“save保存”代替我们通常说的“insert(插入)“ , ”update(更新)”这样的技术术语,以屏蔽技术细节 。这样带来的一个副作用是 , 在save时就需要根据策略判断调用insert还是update,我们使用的策略是根据id是否是空决定,即我们所有的实体对象都有一个属性,类型为Id类的子类 , id对象的属性(数据库里面实际存放的id值)可能为null , 但是id对象,本身不会为null,根据这个对象可以判断当前实体id是否为空 。
对于聚合场景 , 子实体是需要知道聚合根的id的,因为在存储到数据库时可能需要以外键的方式存储对象间的映射关系 。
然而,在具体实现中,我们认为,实体之间的对象关系才是标识两个实体之间关系的方式,而不是id,所以生成实体时,先通过对象引用关联对象,表明聚合和实体之间的关系,在保存到数据库的时候,通过实体生成数据库映射类的时候就可以知道当前数据的id是否为空,同时又能知道当前数据之间的关系 。
对象之间的关系在1:1聚合保存的时候可能体现不明显 , 但是当1:N或者N:N批量保存聚合的时候,作用就比较明显了 。在我们的系统中发起调解业务就需要批量保存调解批次 。代码如下(欢迎吐槽,拥抱进步)
通过这种方式就解决了批量插入不能返回id,同时又能继续复用id.isNew()判断是否为新数据的方式(这里我们没有创建entity基类 , 所以判断放在了Id上) 。
以上方法提供了批量保存时如何区分是新增还是更新 。下面我们来谈谈我们项目内提供的插入和更新模板代码 。
对于领域来说,save是基本的保存代码 。方法传入的参数往往是一个存在于内存中的聚合根对象,有时包含全量的子实体,VO和全量的字段 , 而在插入场景,对批量请求我们希望支持批量插入,减少对数据库的IO频率,在更新场景下,我们希望减少update时的更新字段的数量(只更新需要更新的字段),这有助于减少数据库IO次数、binlog大小和mysql数据库索引变更带来的开销 , 所以是非常有必要的 。因此对于infrastructure来说,可以提供统一的定制化模板方便repository定制化更新字段的方法快速实现 。
由于我们的系统使用的是mybatisplus的ORM方案,所以我们根据api和mysql的批量语句开关提供了一个批量插入和批量更新的Mapper基类,其中insertBatchSomColumn是mybatisplus自带的,updateBatchById则是我们实现的,文档链接如下通过这种方式可以轻松地提供定制化更新某几列的sql , 减轻sql编写负担 。
这一次要讲的其实就是上面提到过的excel导入导出的案例 。对于我们的系统来说,具有资产域,文件域,调解域等 。其中资产域、调节域等三个域需要导入导出excel 。但是我们在设计的时候认为文件的操作属于文件域的概念,所以应当由文件的domain提供功能 。但是很明显,具体的导入导出的策略根据数据的不同是可以变化的 。所以针对这种情况 , 我们回归到领域驱动的实现的本质------面向对象技术来思考这个问题的优雅解法 。以导入为例
代码如下
上面4份代码是domain的,最下面的是infrastructure的,这里我们只讲infrastructure的(但是我个人认为领域分层后还是需要整体考虑的 , 所以才会贴上domain的代码) 。
这是我们对于跨域业务逻辑的处理办法 。
为了保证各领域模型间的解耦 , 我们经常通过最轻量级的领域事件的方式实现,而不是类似metaq,msgbroker这样的异步分布式消息中间件 。领域事件的发送有很多的实现方案 , 我们倾向于直接使用spring的功能,因为我们需要同步保证事务 。但是spring的event发送需要继承ApplicationEvent而领域事件我们又希望独立于spring的event体系,所以我们通过对spring的了解发现了spring已经提供了 PayloadApplicationEvent 可以实现这种功能实现上和其领域驱动代码Java他的spring的event一致,获取我们自己定义的event的方法如下
这里的getPayload()可以获取到我们放进去的领域事件TimeoutEvent
在任何系统中都会有批处理的业务 。可能是批处理聚合,可能是批处理聚合内的实体类 。这里说一下我之前遇到的一个帖子(jdon)上的讨论 。帖子上说的是有一个排班业务,一条班表数据作为聚合存在着每日排班子实体,每日排班下又存在着排班明细子实体,当日期逐渐增加时一条排班需要加载好几年的数据用于生成聚合,而实际上则仅仅只需要计算最近几周的数据 。这里存在两点问题
第一点自然不用多说,技术实现以提供业务功能为核心是我一直以来的主张 。所以当数据量可能会不断增大的情况下不用加载完整自然是必须的(哪怕内存存储的下也应当尽可能少的消耗) 。第二点来说帖子的一位回复者倾向于DomainService提供专门的适配方法,用于加载几周的数据 。
我们的系统中存在一个有一些类似的业务 。我们的系统需要每隔几分钟就运行一次批处理任务,获取所有已经过期的调解明细 , 并且设置为过期 。调解明细属于调解批次的聚合,所以我们有同样的需求 。
我们在此提供一种我们的实现,供参考 。
repository的实现根据面向对象原则,仅仅提供如何查询过滤数据库数据
迭代器的实现提供了迭代职责实现
至此实现了批处理加载聚合的逻辑,同时可以提供聚合的部分加载(需要注意业务的正确性不会因为聚合的不完全加载而产生问题) 。
最后总结一下
java 领域驱动设计怎么建表领域驱设计(Domain Driven Design)种软件发目让软件系统实现准确基于真实业务程建模并根据真实业务程调整调整
ddd领域驱动设计 java可以用吗MVC并不能算是系统设计,只能算是一种程序设计模式或程序框架,通常来说DDD的入手是以建立和分析领域模型为基础的,而不是一上来就开始分析程序的数据及行为(业务) 。DDD关注的是基于编程语言的业务实现 。这点上跟传统的系统设计不一样 。
关于领域驱动代码Java和领域驱动编程的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。
推荐阅读
- chatgpt定制时间表,chatGPT定制
- 帅芒果解说射击游戏,帅芒果解说玩恐怖视频
- 手机直播平台大全,手机直播平台大全下载
- vb.net控制线程 vb多线程实现
- 烧烤地摊如何营销,烧烤地摊宣传语
- app单机横版游戏,横版单机动作游戏
- 虚拟机硬解,虚拟机怎么解锁
- python函数的自省 python函数中的self
- 头条号如何创作热词推广,头条号热词分析怎么取标题