2019年记录:java小白级程序员工作一年以来的经历,遇到的坎坷以及当时的心态

                                                            工作一年后的感想

首先说一下在入职前我对java纯血统的知识以及Spring,Mybatis,struts2、Hibernate的理解(上面的WEB框架应该不属于java纯血统的东西,当然EJB算,但是本人没有用过EJB,所以只是听别人说EJB配置复杂,笨重,从而被Hibernate淘汰,我觉的这是我的一个缺陷,尽管EJB被淘汰,如果有时间,我应该学习一下EJB,亲身感受一下在使用了EJB后,应该能进一步感受到为什么hibernate可以火起来。)。

对Spring的理解:对于Spring的IOC、DI的概念是模糊的,但是现在对它们的概念还是比较清晰的,spring就像一个巨大的对象工厂,它可以用扫描包的方式将一定域下的类注入到spring容器中,这就是IOC,DI依赖注入就是把注入的对象取出来,有按对象类型取对象,有对象名称取对象,默认在容器中每个对象都是单利的,但是可以通过修改配置改为非单利,当然还有许多配置,比如按类型注入spring容器,按名称注入spring容器,甚至在annotation里可以自己定义条件注入相应的对象到spring容器,对AOP的概念还是比较的清晰,知道AOP的好处,面向切面编程,可以大大简化代码量,内部使用的是代理类的机制,代理类指向自己的业务逻辑代码并在代码的前或后加上一些必要的处理,比如日志。当时我还愚蠢的认为Spring没有什么用处,而且没有必要在web三层框架中使用它,但是由于后面的深入学习,我明白了Spring的用处并不像Struts2、mybatis那些框架有专门领域的针对性,感觉Spring没什么用,但是它在背后做了很多事情,Spring可以用在任何应用,不只是web平台。

Hibernate的理解:其实现在Hibernate框架在新的项目中的使用量不会很高,Mybatis以更轻量级的姿态出现,但是还是会有老的项目使用者Hibernate,当时我对Hibernate的概念有一点了解,但是在使用上并不熟练,不如Mbatis,这就要返回去说EJB,由于EJB的使用繁琐导致了Hibernate的出现,由于Hibernate对于sql包装的非常严密,几乎全部以面向对象的形式操作(虽然它有hql,但是我毕竟使用sql比它熟),导致了Mybatis的兴起,我相信大部分程序员对sql的操作都是很熟练的,它可以更加精准方便,以更加复杂的方式检索到你想要的数据,如果说Hibernate是全自动,那么Mybatis就是半自动,EJB、Hibernate、Mybatis(以前的ibatis)是web开发在三层框架中数据层的框架迭代,方向是越来越轻量级,没有EJB哪有后面的Hibernate与Mybatis,所以更加坚信学习EJB是必要的。说着说着跑题了,当时还知道hibernate有一个池子,以及它的两种加载方式,以及它们的区别,还有一些Hibernate运行原理的概念,现在都记不清了,由于项目中不使用Hibernate,而且使用起来不如Mybatis,所以就淡忘了。但是有时间还是要复习一下

而Mbatis就是一个非常简单的持久层的框架,使用非常的方便,它非常的轻量级,配置也十分简单,它使用原汁原味的sql,让使用者对数据库的操作更加的精细,还有动态sql,可以做共通,可以实现sql的复用,所以用我自己的话来说,它是半自动的框架,还有Mybatis的sql语句是卸载XML文件中,而不是写在代码中,所以不会因为修改sql而让服务重启或自动重启,降低了耦合度,Mybatis还提供了对象与数据库的映射关系,可以自己配置这种映射关系,如果不配置的话表的字段与对象的属性名一致,标准的做法是一个表对应一个POJO对象。

对于Struts2有一张官方非常经典的图:

此图首先是HttpServletRequest请求进来首先获取ActionMapper中配置的内容,经过(ActionContextCleanUp,Other filters)防止主Filter自己清空了数据,导致后续的Fillter获取不到数据,从而交给ActionContextCleanUp去清除,最后到了FilterDispatcher(过滤器控制器),这是个重点,他会创建一个请求的代理对象,而这个代理对象通过配置文件读取类获取了struts配置文件里配置的内容,这个配置文件就是配置了各种各样的拦截器,以及它们的先后顺序,获取后就开始加载配置的拦截器,从配置的第一个执行到配置的最后一个,最后执行action,当action返回内容也就是action执行完后会加载很多的页面模版JSP、Freemarker,之后就会从拦截器的最后一个逐层的返回到第一个拦截器,最后响应内容给浏览器,这就是Struts2的基本工作流程。

而springmvc有取代struts的潜力(个人认为):

上图是它的基本工作流程图,这是别人画的,我只是拿来参考一下,因为我感觉它很经典,从图中看出它与struts的处理流程是不一样的,struts是把请求交给了过滤器,而springmvc把请求交给了它自己实现的servlet(DispatcherServlet)但是它不会自己亲自处理请求,他会委托给其他解析器进行处理,图中第二步DispatcherServlet调用HandlerMapping,然后映射为HandlerExcoutionChain,一个Handler与多个拦截器,然后控制器继续调用Handler将刚才返回的处理器包装为适配器(适配器它是一种设计模式),从而很容易支持很多类型的处理器,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(这块数据真正调用自己写的逻辑方法),然后ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术(如Freemarker,jsp等等),最后是把model数据渲染到页面上,最后把网页通过response响应出去。

springmvc它的使用方式非常简单,再加上和spring是一个产品线上的东西,所以当于spring进行整合时有着得天独厚的有时,几乎相当于零配置,对于struts2对比springmvc有哪些好处,我也不知道怎样用语言描绘出来,于是我在网上搜索了一些资料,其中有一篇文章我认为他写的对struts2与springmvc的理解与对比十分能代表我的内心想法,总结一下就两点。

第一、MVC框架的出现是为了将URL从HTTP的世界中映射到JAVA世界中,这是MVC框架的核心功能。而在URL这一点SpringMVC无疑更加优雅。

第二、从设计实现角度来说,我觉得SpringMVC更加清晰。即使我们去对比Struts2的原理图和SpringMVC的类图,它依然很让人困惑,远没有SpringMVC更加直观

我认为struts要依靠配置大量的配置文件,与其他的配置,而springmvc与当下最火的spring框架无缝整合,最为致命的是JDK1.5,注解出现后在开发的效率上有很大的提高,非常受开发者们的喜爱,而springmvc几乎全部利用注解开发,注解的功能提供的十分全面,大大提高了程序的优雅性,感觉整体十分的清晰。

上面就是我对web开发常用框架的基本理解,当然我认为这些对于我来说是远远不够的,在今后的一年中我要再次以更深层次的方式剖析它们的源码,对它们的印象再次的加深,巩固javaSE的相关知识,底层基础决定了上层建筑,比如我还要研究一下jdk许多关于效率的问题,并发,还有一些关于jvm优化相关的知识,甚至还要学习一下java编译后.class文件的字节码,因为在我剖析spring框架的core包时有一个ASM包而cglib就是依赖于ASM,它可以直接修改.class字节码,小巧而且运行效率特别高,但是使用它有一个致命的前提,就是对于字节码要了解,所以学习字节码对于java程序的优化还是对象的代理都是十分重要的。

下面就说一说我在工作一年来的感受,以及遇到的哪些技术上的问题。

       因为我是以实习生的身份进入的公司,当时又是公司正在改造项目的紧要关头,我是在17年底入职,有一个经验丰富的师傅带我,不怕大家笑话,我当时是没有跟项目的,因为以我当时的能力,是无法跟着项目开发的,对于业务是十分的陌生,我在年前只是学习java相关的知识,然后师傅给我出题,然后我去实现它,我记忆非常深的一道题是利用两个for循环实现一个菱形,当时可把我难住了,搞了一天也没搞出来,当时给了我们公司的一个前端程序员也来解决这道题,但是前端在半个小时就完成了,然后让我去看看人家写的,乍一看看不懂,但是仔细一看,看出来了,写的非常的有水平。我实话实说,当时的我心里是非常的浮躁的,感觉不就是写程序么,它们能写业务,我也可以,就是想着我要干活,感觉在公司不干活帮不上忙在公司很不好意思,但是见识了人家写的代码,我浮躁的心一下子虚了,这就是差别,同样是实现菱形,人家两个for循环,自己却用了四个,所以我深刻的认识到自己的能力,感觉自己什么都懂,其实自己什么都不懂。就这样我网上下载pdf资料,或网上查询技术资料,天天学习。就这样到了过年。

      年后,项目的改造工作正式开始,当时公司的人手不够,还增加了许多外来的程序员,其中两个后台一个前端,前端就坐在我身边,当时让我配置项目,为外来的程序员做准备,当时我没有接触过项目的,可以说连项目都没有下载过,当时一个资历老的同事叫教我配置,然后把其他的几台机器配置好,然后那一天就下载项目,配置项目,那一天算是我第一次下载项目,当时前端开发就在我身边,服务出了什么问题,就问我,因为我也是第一次接触项目,什么都不了解,就问别人,当时领导给了我一份电子合同的活,就是把渲染的字段留出来,因为那块是程序动态填充的,其他的全部都是文字,使用的什么技术就不说了,不方便,但是是以html、css布局的合同样板,当时就是这么简单的活我都会搞砸,当时我把写好的合同递交给别人运行后报了许多的错误,当时我还不知道,因为同事不想打击我,所以没有和我说,但是领导知道了这件事请,决定还是和我说,因为工作就是工作,错了就是错了,当时领导用工具检查我写的html有很多错误,不是技术问题,而是粗心大意,这反映了一个问题,就是工作的不上心,不细心,提交前自己都不带检查一下的,于是领导给我改了许多错误,那天我也对领导表示十分的内疚,因为当时领导很忙,还帮我检查这些琐碎的问题,然而领导并没有批评我,而是在提醒我下次不能这样了,现在想想,当时真的是不应该这样,现在想想都十分的内疚。之后领导帮我改完后交给我,让我再次检查,之后在提交就不会报错了,但是在样式上还是有错位的现象。因为每次修改样式后要生成pdf,然后查看修改后的样式,所以我找同事要到了一个单元测试的测试类,它可以生成pdf查看修改后的样式,在调整样式时遇到一些难点,当根据浏览器调整网页样式后是没问题的,但是只要生成pdf后,与网页显示的样式是不一样的,出现了错位,所以只能根据生成的pdf调整样式,经过多次调整,pdf样式才得以解决,这是我入职之后领导交给我的第一个任务。虽然简单,但是它也是一个细心的任务,虽然我完成的不是很圆满,但是在后续的开发中,我强调自己在工作中一定要严谨细心。

      之后我也就没有什么任务,那段时间我的任务就是测试,测试也可以熟悉客户的操作,进而了解业务,负责人让我测什么我就测什么,那时我也看过项目的DB定义书,由于我对业务逻辑一无所知,所以直接看DB定义书甚至表和表之间的关系都不明确,当时我想背下来,现在看来十分可笑,其实只要了解了表关系,不用背自然就明白了,之后项目改造完成,测试完成后正式上线,然后在上线期间偶尔会出现bug,但是我也帮不上忙,因为在这之前,我没有写过任何的业务逻辑,所以当运行期出现任何bug我都无能为力,当时我在全力的熟悉别人写的代码,了解公司的业务逻辑,当时我先看整个项目的架构,当了解了项目的架构后在了解具体的业务逻辑,但学习业务逻辑时很慢,现在看来很笨,当时简单的逻辑一看就明了,但是看复杂的逻辑,就一点一点看,当点了好几层调用后,自己都不知道这块的功能是什么了,不知道自己身在何处,在坚持看下去就晕了。所以复杂的逻辑一天看懂两个就已经心满意足了。

      当时我没有任务,就是学习,学的东西也是五花八门,前端也学,自己还做了两个网页,一个是模仿支付宝的首页,另一个是模仿人人贷的首页,美工当时看上了一个网页,当网页显示后文字向上生,当往下滚动后有图片从透明色逐渐像中间靠拢,并显示图片。确实好看,当时美工看我做的Demo不错,打算让我试试,我就接受了,在实现的过程中,我查阅了很多的资料,有向下滚动网页显示XY坐标,用以判断到什么位置显示动画,动画看看可以用css3实现,当时折腾了很久,效果实现了,但是在感觉上与别人的相差很大,很生硬,这次我直接查看别人的动画是怎样实现的,别人用到了Animate.css插件,里面有相当好看神奇的动画,网上查阅使用方法,最后效果与别人的效果几乎一样。虽然没有上线,但是心里还是有那么一些小小的成就感的。

      接着后来项目又开始改造了,做参与了几个非常简单的业务逻辑,当我写完后负责人还帮我检阅代码(在这里真心感谢她),虽然逻辑没有什么问题,但是在写法上还是可以优化的,指点我在写法上怎样更简洁。

      之后在聚餐时遇到了我的老师傅,他问我现在做什么,负责哪块的开发,我说主要负责测试,于是他就给我推荐了selenium这个自动化测试框架,我当时还不知道这是个什么,连听说都没有听说过,只是感觉名字挺酷的,既然师傅都让学了,那肯定就学了,当时聚餐是星期五,回到家就开始学,当我小试了一下,神奇的事情就发生了,它会自动帮你点击网页上的按钮进行功能测试,我当时就给师傅发了一个微信,说这东西是真的好用,只要写上自动测试脚本,它就可以自动操作,当时我主要就是公司里的测试,东点点,西点点,不过说实话我当时做这种重复性到操作真的很累,手指点到发麻,因为改了某些功能,其他功能的每个分支都要测到,才诱发了我做自动化测试软件的需求,说白了就是懒,其实想想,好像所有的程序员都懒,不然怎么会出现spring,怎么会出现各种各样的框架,比如为什么会出现环境变量Path,因为在DOS中要运行程序要写上程序的全路径,由于程序员的懒,才出现了Path,为什么出现spring的aop,因为可以减少很大一部分的代码量,当时我想的比较简单,我可以用selenium写一段脚本进行测试,我就不用点了,当时脑洞大开如果我能把selenium包装起来做一个软件的话,岂不是更好,当时想的第二个版本是做一个界面,当点击要测试流程的按钮后它就可以执行响应的测试脚本进行测试,然后实现到一半发现这还不是最完美的,如果能把功能的粒度做到最小的话,可以用选模块拼接一套测试流程,比如,登陆做一个,充值做一个,提现做一个,把它们拆开,当我要测试时就可以不用写很多重复的脚本了,直接选上对应的功能,然后还可以自己取名字生成一个文件,这个文件显示在软件的首页上,下次就不用在选功能了,直接选中这个文件就可以执行以前编辑的流程,在实现的过程中也遇到了一些难题,比如在编辑执行流程时有删除方法,这个内部是用一个LinkedList去维护的,当删除第一个模块怎么办,删除中间的怎么办,使用者做了任何操作,都要使LinkedList的顺序保持一致,按照顺序去加载对应的功能,LinkedList对应的显示列表更新,等等,还有当启动软件后会出现加载不全的问题,于是提供了一个按钮用于刷新界面,还有当脚本执行时如果由于前端代码的变更导致程序找不到元素,从而执行失败的话程序如何恢复,继续执行等等。。。总之在实现的过程中遇到了许多许多的难点,现在都忘记了,当遇到一个问题时就解决一个,然后继续开发,又会遇到问题,周而复始。差不多21天左右,实现了一个我自认为比较满意的作品,专门自己使用。

      有一次,我遇到了一个非常棘手的难题,任务是这样的,当使用者触发相关功能时,后台会调用selenium进行自动化操作,其中有一个难点,在自动化操作时会点击发送验证码,当使用者接收到验证码在网页上输入验证码后让刚在的自动化操作继续执行,知道完成操作,但是自动化框架只能一气呵成完成整个操作,不能中断操作,然后继续操作,于是我绞尽脑汁,网上查询了很多的资料,都不能解决这个问题,但是有幸看到了一篇文章,他解释了selenium的工作原理,并且他对这个框架做了一些修改,使框架可以实现对中断的操作继续执行,在框架启动浏览器运行时会生成一个id号,只要把这个号存在内存中,下次把这个id作为参数传入,再次运行就会使中断的操作继续操作(在这里非常感谢这个高人),通过这次问题的解决,我是深有体会,如果了解一个框架的运行原理,就可以稍微做一点小小的改动就可以实现当下非常棘手,非常困难的难题。

      还有一次,我为了升级自己的开发工具,换了一个新版本,当访问服务时渲染网页,网页就是出现一个导航条,其他的全部不显示,这是我遇到的最困难的问题,为什么说是最困难,因为这个问题没有任何的错误提示信息,后台不报错,一切正常,浏览器控制台也没有报错,于是查看元素,确实少了很多标签,与svn中的代码也都是同步的,但是网页就是渲染不出来,一般这种问题都是有经验的高手根据自己的经验推断问题出在哪里,因为在渲染时是会解析jsp为servlet并编译,然后响应到浏览器上去,当时在网上找了各种的资料,什么设置加载超时时间,设置缓存容量等等,统统不管用,搞了一天也没有搞成,玩撒谎能够睡觉做梦都是在折腾这个问题,第二天又是搞了一天,在快下班的时候解决了,原因在于tomcat的web.xml文件中有问题,这个文件配置了很多在响应时的响应格式,通过与别人tomcat配置文件的对比,发现在项目中有两种网页格式的输出,一种是html,一种是jsp,并在输出html或jsp时设置了编码,于是我在自己的tomcat上加入这个配置后,网页渲染成功。导致这个问题的原因在于更换eclipse后重新创建服务,会有一个server的文件夹,这个文件夹与tomcat的conf文件夹的配置文件对应,所以在eclipse运行tomcat后这些配置文件会覆盖tomcat中的配置文件,导致网页渲染失败。

      这就是我一年来印象比较深的难题,当然还有其他的困难,随着时间的推移许多简单的问题渐渐的淡忘了,在未来的一年中我也是希望能更加适应这个过程,跳坑,爬出来,在跳坑,再爬,周而复始,经验慢慢的积累,同时更因该改变遇到问题的心态,不是烦躁,而是高兴,因为又有东西可以学了。

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页