- 浏览: 499850 次
- 性别:
- 来自: 沈阳
文章分类
- 全部博客 (437)
- Windows设置 (2)
- oracle数据库 (39)
- bug--jsp (4)
- j2se (13)
- js (40)
- bug-tomcat不能启动程序 (1)
- Hibernate (29)
- eclipse (20)
- java (65)
- 设计模式 (6)
- bug (18)
- PL/SQL (11)
- 前台 (5)
- 杂谈 (25)
- UML (1)
- jdbc编程 (2)
- 技术调研 (1)
- 数据通信 (2)
- ios (1)
- servlet自学笔记 (10)
- tomcat (9)
- SQL学习笔记 (6)
- java工具 (1)
- 数据库设计 (4)
- javascript (10)
- jsp (11)
- struts (17)
- ajax (7)
- linix/Unix (6)
- 资源 (3)
- spring (14)
- 算法 (5)
- 计算机网络 (2)
- http (5)
- c++ (2)
- web应用 (3)
- jvm (5)
- java中的字符编码 (14)
- java代码库 (2)
- classloader (1)
- 读书笔记 (1)
- c (1)
- 开源软件 (1)
- svn (1)
- AOP (1)
- java序列化 (1)
- 多线程 (4)
- The legendary programmers (1)
- Apache http Server (1)
- html tag (3)
- struts1.X学习笔记 (5)
- buffalo (1)
- 自己收藏 (0)
- TOEFL(IBT) (1)
- 网络翻墙 (0)
- 编译原理 (1)
- 书籍推荐 (1)
- css (10)
- javaee环境搭建资料 (1)
- 开源工具 (1)
- 美国生活 (1)
- spring自学 (3)
- log4j (3)
- 算法与数据结构 (5)
- 病毒,插件处理大全 (1)
- flex (2)
- webservice (1)
- git (7)
- cs (1)
- html (4)
- javaee (6)
- 开车 (0)
- springmvc (3)
- 互联网架构 (2)
- intellij idea (18)
- maven (15)
- mongodb (2)
- nginx (1)
- react (3)
- java基础例子 (2)
- springboot (2)
- 培训 (5)
- mysql (3)
- 数据库 (3)
- 生活 (2)
- intellij (3)
- linux (2)
- os (3)
最新评论
-
潇洒天涯:
[color=blue][color=cyan] ...
oracle 通过 nvl( )函数sql 查询时为 空值 赋默认值 -
hekai1990:
受教了..
oracle中的varchar2
【IT168 技术】 假如你是一名Java开发者,正在开发和维护包含2000个类并使用了很多框架的应用程序。你要如何理解这些代码呢?在典型的Java企业项目小组中,大部分能够帮你的高级工程师看起来都很忙,文档也很少。你需要尽快交付成果,并向项目组证明自己的能力。你会如何处理这种状况呢?这篇文章为开始开发新项目的Java开发者提供了一些建议。 1. 不要试图一下子搞懂整个项目 仔细考虑一下,为什么你会想要先理解项目代码呢?大部分情况是有人要求你修复一个bug,或者增强系统已有功能。你要做的第一件事情不是理解整个项目的架构。当对项目进行维护时,这样做(理解整个项目架构)可能会对你造成巨大的压力。 即便是有10年编程经验的Java开发者,也无法理解项目的核心工作机制,尽管他们可能已经在这个项目工作超过一年(假设他们并非最初的开发人员)。比如,对于认证机制或事务管理机制还是缺乏确切的认识。 他们是怎么做的呢?他们对于自己负责的部分非常了解,并且能够交付价值给小组。每天的交付价值远比了解一些以后还不确定有没有的东西重要的多。 2. 关注于尽快交付价值 那我是要打消你对于理解项目架构的热情吗?完全不是。我只是要求你尽早地交付价值,一旦你开始一个项目,搭建了开发环境,你就不应该花一两周时间才交付内容,无论它的规模大小如何。假如你是一位有经验的程序员,却两周都没有任何交付,你的经理怎么会知道你是真的在工作,还是在看新闻呢?。 所以交付能够将事情变得简单。不要认为在做有价值的交付前,你必须理解整个项目。这是完全错误的。加一段javascript的验证代码对业务就很有价值,经理能够通过你的交付对你更加信任。这样能够向上级领导证明你的贡献以及员工价值。 日复一日,在不断修复bug及增强功能之后,你就能够慢慢开始理解项目架构。不要低估对系统方方面面理解时需要花费的时间。花3到4天理解认证机制,2到3天理解事务管理。这些都是依靠之前的相似项目的经历,但关键还是要花时间才能透彻的理解。要在日常工作中挤出时间,不要向经理要求特定的时间来做这些。 找找项目是否有一些有效维护的单元测试用例。有效的单元测试用例是理解大型项目代码很好的途径。单元测试能够帮助你理解代码片段,包括一个单元的外部接口(单元如何被调用以及返回内容)及其内部实现(调试单元测试比调试整个实际用例简单许多)。 你如果能够很好的理解一些内容,那么就写些笔记,或者画些类图、时序图、数据模型图等,以便你或日后其他的开发者可以进行维护。 3. 维护大型项目所必须的技能 你能从事当前的工作,必然已经具有良好的java技术。我们来谈谈能够让你在新项目中良好表现的其他技能。大部分时间里,你在项目中的任务是修复bug和增强功能。 有两项很重要的技能能够在你维护大型项目代码起到帮助。 3.1 能够迅速发现需要的类 在任何维护活动中,无论是修复bug或增强功能,第一件事情就是识别出当前修复或增强的用例中调用的类。当你定位到需要修复或增强的类/方法,就已经完工了一半。 3.2 能够分析变更的影响 当你在完成必要的修改或增强工作后,最重要的就是要确认你的修改没有破坏代码的其他部分。你要用你的java技术及对其他框架的理解找出变更可能影响的部分。下面两个简单的例子详细描述了最后提及的情况: 当类A的equals()方法变更后,调用保存A实例的List的contains()方法时就会受到影响。若Java知识不够,就很难考虑到这样的影响。 在web项目中,我们假设“user id”保存在session中。新加入的程序员可能在“user id”中加入一些信息来修复bug,但是却不知道那会影响到 与“user id”关联的用例。 因此,既要深入了解Java语言,又要深入了解你在应用中使用的框架,这样才能分析出一个改变的影响。 当你提高了如上两个技能,尽管你对项目不是非常了解,但大部分的维护任务会变得简单很多。如果你想要修复一个bug,就会定位并修复这个bug,并且保证变更不会破坏项目的其他部分。如果你想要增强或加入特性,基本上你只需要模仿现有的特性,使用类似的设计。 在一个在线银行项目中,为什么“查看账户摘要”和“查看交易历史”的设计要有巨大的差别呢?如果你理解了“查看账户摘要”的设计,完全可以模仿开发出“查看交易历史”的功能。 就修复bug和增强来说,你不必完全理解所有2000个类的工作内容和代码驱动系统运行的原理。只要有上面的技能,你就能很快定位需要修改的代码,使用良好的java和框架技能修复,保证变更不会破坏项目的其他部分,然后交付,尽管你可能只知道一小部分项目的设计。 4. 使用工具找到所需变更内容以及变更产生的影响 继续我们尽快交付的主题,你应该寻找工具作为辅助,只需要对项目又很少理解,就能帮助你尽快实施交付。 4.1 迅速发现所需变更内容的工具 无论是修复bug还是增强系统,首先你都要找到该用例调用且需要修改的类及方法。基本上有两种方式理解用例的工作方式,静态代码分析和运行时分析。 源码分析统计会扫描所有代码并且展现类之间的关系。市场上有很多工具。比如:Architexa、AgileJ、UModel、Poseidon等。 所有静态代码分析工具的缺点在于,它们无法确切展现 用例中类或方法的运行时调用情况。因此Java新加入了一些特性,如回调机制(callback patterns)。比方说,静态分析工具无法推断出当前页面提交按钮被点击时,会调用哪个Servlet。 运行时分析工具能够展现类和方法在用例运行时的状态。这样的工具包括:MaintainJ、Diver、jSonde、Java Call Tracer等。这些工具可以捕获运行时的堆栈状态,并以此为用例生成序列图和类图。 序列图会展现该用例在运行时所有调用的方法。如果你在修复bug,那么这个bug很可能就是这些被调用的方法之一。 如果你在增强已有功能,可能是新增验证,修改DAO等,那么就可以利用序列图理解调用流程然后再修改。 如果你在新增功能,那么就可以找到一些相似的特性,利用序列图理解调用流程,然后模仿开发新功能。 要仔细地挑选运行时分析工具。信息过多是这类工具的主要问题。选择一些工具,能够提供简单的信息,过滤掉无效信息,并能够方便的查看各种视图。 4.2 迅速发现所需变更内容的工具 若单元测试有效,你就可以通过运行单元测试发现变更有没有破坏其他测试用例。有效维护并且覆盖大型企业应用的单元测试还是比较少的。下面有一些针对该情况的工具。 在此,仍然是有两种技术——静态代码分析和运行时分析——可以使用。市场中有很多静态代码分析工具可用。如:Lattix、Structure101、Coverity、nWire和IntelliJ's DSM。 对于变更后的类,上述工具均可识别对该类存在依赖的类的集合。开发者需要根据这些信息“猜测”可能产生影响的用例,因为这些工具无法展示运行时类之间的调用关系。 市场上可以用于运行时影响分析的工具并不多,可能只有MaintainJ。MaintainJ先会捕获在用例中调用的所有类和方法。当所有用例的上述信息都被捕获之后,就很容易发现类的变更对用例的影响。MaintainJ能够有效工作的前提条件就是项目的所有用例都应当先运行一遍,以便能够获得运行时的依赖关系。 总之,目前你在迅速准确分析变更影响方面,还是可以从工具中获得有限的帮助。首先根据需要实施一些影响分析,然后根据自己或小组其他高级成员评审来判断变更的影响。你可能需要使用上述工具对你的判断进行反复确认。 5. 对上述内容的两个忠告 5.1 不要降低代码质量 为了快速交付,可以不全盘理解架构,但绝不能以降低代码质量为条件。下面是一些你可能因为只考虑快速交付而引发的代码质量问题。 因为修改代码涉及到很多的依赖关系,所以新增代码相对而言风险较小。例如,有五个用例都调用了某个方法。为了改进某个用例,你需要修改这个方法的实现。最简单的做法就是复制这个方法,重命名,然后在改进的用例中调用新方法。千万不要这么做。代码冗余绝对是非常有害的。你要尝试对方法进行包装或者重写,甚至是直接修改,然后重新测试所有用例,通常停下来想一想,然后亲手去实施,是一种不错的方式。 另一个例子是将“private”方法改为“public”,让别的类也可以调用。尽量不要将非必须的部分暴露出来。假如是为了更好的设计而需要重构,那么就应当着手去做。 大部分应用都有确定的结构和模式来实施。修复或增强程序时,你要确保不会偏离这样的模式。如果对规约不确定,那么就请其他高级开发者来审核你的变更。如果你必须做一些违背规约的动作,那么就尽量放置于规模较小的类中(一个200行代码的类中的私有函数应当不会影响应用的整体设计) 5.2 不要停止深入理解项目架构 按照文章列出的方式,假设你能够在对项目了解较少的情况下进行交付,并持续这样下去,可能就会停止对项目架构的深入了解。这从长远角度来说对你的职业生涯没有帮助。当你的经验增加时,就会承担比较大的模块任务。如构建一个完整的新特性,或者修改项目的一些基础设计等较大的改进。当能够做这些改进时,你对项目的整体架构应该相当了解。文中列举的方法只是让你在最短的时间内提升自己,而不是阻止你完整理解整个项目。 6. 结论 整篇文章的重点在于,对项目进行必要了解,然后进行快速交付。你可以在不降低代码质量的前提下做到这一点。 如果要修复bug,那么迅速定位并修复。可以在必要的时候使用运行时分析工具。如果要新增特性,那么就可以寻找类似特性,理解流程(在必要的时候使用工具)并编写。 或许这些听起来很简单,但是实用吗?当然。前提是你有良好的Java技术,以及对框架足够了解,然后才能先修改代码,再分析变更所产生的影响。分析变更所产生的影响比实施变需要更多技巧。你可能需要高级开发人员协助你分析变更影响。 大约有50%的IT可操作预算用于简单的bug修复和功能增强。文中的建议对于在维护活动中节省经费应当还是很有帮助的。 作者Choudary Kothapalli 也是MaintainJ项目的创立者。
发表评论
-
【转】JAVA泛型通配符(PECS)
2018-07-29 10:43 510在JAVA的泛型集合中,默认都可以添加null,除此以外, ... -
Differences between notify() and notifyAll()
2018-07-16 09:01 517Notification to number of th ... -
【转】深度解析Java多线程的内存模型
2018-07-16 09:00 481https://www.jianshu.com/p/a3f ... -
【转】java rmi
2018-01-03 18:57 392此处讲的是Java中的RMI ... -
Java Annotation认知(包括框架图、详细介绍、示例说明)
2017-10-09 19:49 385摘要 Java Annotation是JDK5.0引入的 ... -
【转】web.xml 配置404和500错误的自定义页面
2016-01-03 15:16 1304web.xml Xml代码 &l ... -
关于java的binding
2013-06-16 22:51 655//file: MyMain.class class B ... -
【转】web.xml 中的listener、 filter、servlet 加载顺序及其详解
2012-08-23 11:09 783在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过 ... -
【转】web.xml中listener的作用及使用(转)
2012-08-23 11:07 843概述: Servlet监听器用于监听一些重要事件的发生, ... -
html中get和post的区别
2012-06-06 09:48 9811. get是从服务器上获取数据,post是向服务器传送数据。 ... -
【转】Request的getParameter和getAttribute方法的区别
2012-05-29 15:42 847HttpServletRequest.getParameter ... -
try-catch-finally与return的执行顺序
2011-11-16 17:30 1992写java程序经常碰到异常,try-catch-f ...
相关推荐
我整理生成的CHM格式文件 JAVA程序员必读:基础篇.chm 因为最近在搞这个所以整理了一些资料和大家分享 并非本人原创,郑重感谢原作者!
JAVA程序员必读:基础篇
10. **Java应用服务器**:如Tomcat、Jetty、Glassfish和WildFly等,它们是运行J2EE应用的平台。了解如何配置、部署和管理应用服务器是每个Java开发者必备的技能。 通过阅读《JAVA程序员必读:提高篇》,你不仅能...
这本书涵盖了从安装Java开发环境到编写、编译和运行第一个Java程序的所有步骤,是入门Java编程的理想选择。 在Java的世界里,了解基本语法是至关重要的。Java是一种强类型的语言,这意味着每种数据都需要特定的数据...
JAVA程序员必读:基础篇(4)类和继承-JSP教程,Java技巧及代码
JAVA程序员必读:基础篇(2)面向对象编程概念-JSP教程,Java技巧及代码
Java程序员在日常开发中,经常会接触到多种技术,包括前端的JavaScript、CSS2、HTML等,这些技术对于构建交互式Web应用至关重要。本压缩包提供的"Java程序员必备手册"包含了这四方面的详细参考资料,旨在帮助Java ...
8. **多线程编程**:Java内置对多线程的支持,理解Thread类和Runnable接口,以及并发工具类如Semaphore、CyclicBarrier、CountDownLatch等,对于开发高性能的并发程序至关重要。 9. **Java.IO和NIO**:Java.IO提供...
Java 程序员简历模板 以下是 Java 程序员简历模板的知识点总结: 一、 HR 如何刷简历 * 定位准确:个性鲜明,一眼看上去就能贴上技术精英、管理岗‘专家的标签 * 内部一致:内容聚焦,不能出现前后不符 * 简明...
因学生在学校里开发的软件是学习和学术性的软件,本书也能帮助毕业生们能尽快地从学习型的软件开发转换为商业性的软件开发,尽早形成实际生产力,这对毕业生和企业都是有好处的。 本书并不想成为面试宝典之类的书;...
Java程序员面试资料及简历模版 Java程序员面试资料及简历模版 Java程序员面试资料及简历模版 Java程序员面试资料及简历模版 Java程序员面试资料及简历模版 Java程序员面试资料及简历模版 Java程序员面试资料及简历...
【一周学会C#——java程序员转.NET必看】 C#是一种由微软开发的面向对象的编程语言,设计用于.NET Framework上。对于从Java转到.NET平台的程序员来说,理解C#的基本概念和语法是非常重要的。以下是一些关键知识点:...
根据提供的文件信息,我们可以提炼出以下相关知识点,主要聚焦于Java程序员在开发过程中经历的转正答辩准备,包括个人简介、工作回顾、项目流程分析、工作体会等方面。 ### 一、个人简介与工作回顾 #### 1.1 入职...
《Java EE企业级应用开发教程(Spring Spring MVC MyBatis)》是一本专注于Java企业级应用开发的专业教程,由黑马程序员编著。本书的核心在于深入浅出地介绍如何使用Java EE技术栈,特别是Spring、Spring MVC和...
【Java程序员转正知识点】 1. **自我介绍**: 在转正答辩中,自我介绍是展示个人背景和技能的关键环节。作为一名Java程序员,应当包括自己的教育背景、编程经验、项目经历以及对Java语言的理解。 2. **技术成长**...
- 技能名称:Java - 一般 **项目经验** 列出你参与过的项目,包括软件环境、硬件环境、开发工具,以及你在项目中的具体职责。每个项目可以写2-3点关键内容: - 项目描述:(项目简介,如开发一款电商网站) - ...
1. **Java概述**:Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems开发,后来被Oracle公司收购。Java设计为具有可移植性、安全性、健壮性和平台无关性的特点。 2. **数据类型**:Java中的数据类型分为...