`

程序员应该如何理解新接手的项目

阅读更多
说明:本文并不只针对.net开发项目,而是对大部分企业项目都有参考价值。

假如你是一名.net开发人员,正在开发或是维护包含1000个类并使用了很多框架的项目。你会如何来理解这些代码呢?在典型的.net企业项目小组中,大部分能够帮你的高级工程师都很忙,文档也很少的情况下。你需要尽快交付成果,并向项目组证明自己的能力。你将会如何处理这种状况呢?这篇文章为开始开发新项目或对刚接手项目的.net开发者提供了一些建议。

  1. 不要想着一下子就弄明白整个项目

  仔细考虑一下,为什么你会想要先理解项目代码呢?大部分情况是有人要求你修复一个bug,或者增强系统现有功能。你要做的第一件事情不是理解整个项目的架构。当对项目进行维护时,这样做可能会对你造成巨大的压力及损耗大量的时间。

  即便是有10年编程经验的.net开发者,也无法短时间内理解项目的核心工作机制,尽管他们可能已经在这个项目工作超过一年(假设他们并非最初的开发人员)。比如,对于认证机制或事务管理机制还是缺乏确切的认识。

  他们是怎么做的呢?他们对于自己负责的部分非常了解,并且能够交付价值给小组。每天的交付价值远比了解一些以后还不确定有没有的东西重要的多。

  2. 关注于尽快交付价值

  那我是要打消你对于理解项目架构的热情吗?完全不是。我只是要求你尽早地交付价值,一旦你开始一个项目,搭建了开发环境,你就不应该花一两周时间才交付内容,无论它的规模大小如何。假如你是一位有经验的程序员,却两周都没有任何交付,你的经理怎么会知道你是真的在工作,还是在看新闻呢?。

  所以交付能够将事情变得简单。不要认为在做有价值的交付前,你必须理解整个项目。这是完全错误的。加一段.netscript的验证代码对业务就很有价值,经理能够通过你的交付对你更加信任。这样能够向上级领导证明你的贡献以及员工价值。

  日复一日,在不断修复bug及增强功能之后,你就能够慢慢开始理解项目架构。不要低估对系统方方面面理解时需要花费的时间。花3到4天理解认证机制,2到3天理解事务管理。这些都是依靠之前的相似项目的经历,但关键还是要花时间才能透彻的理解。要在日常工作中挤出时间,不要向经理要求特定的时间来做这些。

  找找项目是否有一些有效维护的单元测试用例。有效的单元测试用例是理解大型项目代码很好的途径。单元测试能够帮助你理解代码片段,包括一个单元的外部接口(单元如何被调用以及返回内容)及其内部实现(调试单元测试比调试整个实际用例简单许多)。

  你如果能够很好的理解一些内容,那么就写些笔记,或者画些类图、时序图、数据模型图等,以便你或日后其他的开发者可以进行维护。

  3. 维护大型项目所必须的技能

  你能从事当前的工作,必然已经具有良好的.net技术。我们来谈谈能够让你在新项目中良好表现的其他技能。大部分时间里,你在项目中的任务是修复bug和增强功能。

  有两项很重要的技能能够在你维护大型项目代码起到帮助。

  3. 1 能够迅速发现需要的类

  在任何维护活动中,无论是修复bug或增强功能,第一件事情就是识别出当前修复或增强的用例中调用的类。当你定位到需要修复或增强的类/方法,就已经完工了一半。

  3. 2 能够分析变更的影响

  当你在完成必要的修改或增强工作后,最重要的就是要确认你的修改没有破坏代码的其他部分。你要用你的.net技术及对其他框架的理解找出变更可能影响的部分。下面两个简单的例子详细描述了最后提及的情况:

• 当类A的equals()方法变更后,调用保存A实例的List的contains()方法时就会受到影响。若.net知识不够,就很难考虑到这样的影响。
• 在web项目中,我们假设“user id”保存在session中。新加入的程序员可能在“user id”中加入一些信息来修复bug,但是却不知道那会影响到 与“user id”关联的用例。
  因此,既要深入了解.net语言,又要深入了解你在应用中使用的框架,这样才能分析出一个改变的影响。

  当你提高了如上两个技能,尽管你对项目不是非常了解,但大部分的维护任务会变得简单很多。如果你想要修复一个bug,就会定位并修复这个bug,并且保证变更不会破坏项目的其他部分。如果你想要增强或加入特性,基本上你只需要模仿现有的特性,使用类似的设计。

  在一个在线银行项目中,为什么“查看账户摘要”和“查看交易历史”的设计要有巨大的差别呢?如果你理解了“查看账户摘要”的设计,完全可以模仿开发出“查看交易历史”的功能。

  就修复bug和增强来说,你不必完全理解所有2000个类的工作内容和代码驱动系统运行的原理。只要有上面的技能,你就能很快定位需要修改的代码,使用良好的.net和框架技能修复,保证变更不会破坏项目的其他部分,然后交付,尽管你可能只知道一小部分项目的设计。

  4. 使用工具找到所需变更内容以及变更产生的影响

  继续我们尽快交付的主题,你应该寻找工具作为辅助,只需要对项目又很少理解,就能帮助你尽快实施交付。

  4. 1 迅速发现所需变更内容的工具

  无论是修复bug还是增强系统,首先你都要找到该用例调用且需要修改的类及方法。基本上有两种方式理解用例的工作方式,静态代码分析和运行时分析。

  源码分析统计会扫描所有代码并且展现类之间的关系。市场上有很多工具。比如:Architexa、AgileJ、UModel、Poseidon等。

  所有静态代码分析工具的缺点在于,它们无法确切展现用例中类或方法的运行时调用情况。因此.net新加入了一些特性,如回调机制(callback patterns)。比方说,静态分析工具无法推断出当前页面提交按钮被点击时,会调用哪个Servlet。

  运行时分析工具能够展现类和方法在用例运行时的状态。这样的工具包括:MaintainJ、Diver、jSonde、.net 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,那么迅速定位并修复。可以在必要的时候使用运行时分析工具。如果要新增特性,那么就可以寻找类似特性,理解流程(在必要的时候使用工具)并编写。

  或许这些听起来很简单,但是实用吗?当然。前提是你有良好的.net技术,以及对框架足够了解,然后才能先修改代码,再分析变更所产生的影响。分析变更所产生的影响比实施变需要更多技巧。你可能需要高级开发人员协助你分析变更影响。

  大约有50%的IT可操作预算用于简单的bug修复和功能增强。文中的建议对于在维护活动中节省经费应当还是很有帮助的。

原文摘自:http://www.deepfisher.com/Article/Detail_86.shtml
分享到:
评论

相关推荐

    程序员如何真正的成长

    可以通过参与开源项目,或者在工作中接手复杂问题来锻炼这方面的能力。 沟通与协作能力也是现代程序员不可或缺的部分。编码不再是单兵作战,团队合作和跨部门协调成为常态。学会清晰表达自己的观点,理解他人的需求...

    程序员行为研究调查问卷

    6. **开发策略**:调查在接手新任务时,程序员如何准备,如查阅文档、API 或直接编码,这些策略可能影响代码理解和工作效率。 7. **理解代码的帮助因素**:探究程序员认为有助于理解代码的手段,如交流、文档、网络...

    系统架构设计程序员向架构师转型之路

    参与大型项目、接手技术难题、阅读和分析其他优秀架构的设计都是提升自我的途径。此外,不断反思和总结自己的工作,从失败中汲取教训,也是架构师成长的必经之路。 总的来说,系统架构设计程序员向架构师转型是一条...

    net程序员面试宝典

    理解业务通常是在项目开始前由用户传达,程序员在接手项目后逐步学习和熟悉业务。 3. **培训内容的选择** - 宽泛而丰富的培训内容更适合程序员,因为行业的快速变化要求程序员具备广泛的知识面以适应新需求和问题...

    Java程序员应该注意的编码规范

    良好的编码规范有助于新加入的成员更快地理解和接手项目,从而降低维护成本。 2. **改善可读性**:清晰的命名和恰当的注释能够显著提高代码的可读性,使得其他开发者能够更容易地理解代码的意图和功能。 3. **提高...

    2022年java程序员的转正工作总结.docx

    Java程序员在接手任务后,会进行深入的需求分析,制定相应技术方案和项目规划。他们懂得在问题出现初期及时纠正,避免问题的恶化,确保项目进程不受影响。同时,与团队和领导的沟通至关重要,对于有争议的需求或问题...

    程序员的个人述职报告.docx

    例如,从最初负责单一模块的开发,如财务模块的存货核算,到后来接手整个财务管理模块,承担更大的责任,这需要不断学习新知识和提升处理复杂问题的能力。 3. **项目经验总结**:项目验收后,根据客户需求的变化,...

    程序员转正述职报告集合8篇.docx

    - 程序员通常在入职初期会接手一些项目,如在案例中提到的xxx公司网站、B2B广告招商平台和在线咨询系统的开发。这些项目不仅锻炼了他们的编程技能,还让他们在短时间内适应了公司的开发节奏。 - 面对新的挑战,...

    程序员个人述职报告2021.docx

    随着项目的进展和公司内部变动,他逐渐接手了财务治理整个模块的开发工作。在工作中,他经历了从初入公司时的担忧到逐步适应并积极面对挑战的过程。通过参与一期项目,他认识到前期文档的重要性,并在二期开发中避免...

    程序员必须知道的书籍

    《代码整洁之道》强调了代码风格和组织的重要性,帮助程序员塑造良好的代码观,让编写出来的代码不仅运行正确,而且易于他人理解和接手。《修改代码的艺术》则为程序员提供了面对代码维护问题时的应对之策,教授他们...

    程序员年度总结范文.docx

    - 程序员在这一年中可能会负责多个项目,需要详细列出每个项目的角色和贡献,例如:完成了哪些功能模块的开发,优化了哪些代码,提升了哪些性能指标。 - 成果展示:具体阐述项目上线后的影响,如用户增长、系统...

    2021年程序员年终考核个人总结个人.docx

    6. **项目管理**:在接手新项目时,进行项目分析并合理分配任务是高效工作的前提。作者在实训中参与了这一过程,这是项目管理的重要一环。 7. **技术工具的熟悉度**:熟悉并掌握开发工具,如Java可视化开发工具,能...

    2021程序员的个人述职报告.docx

    - 项目从一期到二期的过渡,反映了业务需求的演变,程序员需要不断学习和适应变化,如财务业务知识和系统框架的理解。 - 在项目开发过程中,从原型设计到需求分析,再到数据库设计和开发,全程参与有助于深入理解...

    程序员转正述职报告.docx

    接手的第一个项目是为XXX公司开发网站,尽管初期面临较大的挑战,但通过与同事们的密切合作,我不仅在短时间内完成了项目,还提升了工作效率。在这个过程中,我学会了如何处理突发问题,增强了对.NET框架的理解,...

    精品专题(2021-2022年收藏)2018程序员述职报告范文精选范文.doc

    3. **项目管理与责任承担**:全面负责项目的环节,包括原型设计、需求分析、数据库设计、开发等,这体现了程序员对项目流程的深入理解和责任感的增强。 4. **自我提升与知识扩展**:程序员认识到仅满足当前工作需求...

    程序员辞职申请书范文.docx

    2. **项目交接**:明确列出当前负责的所有项目及其进度情况,并与接手人进行详细的沟通交流,确保项目的平稳过渡。 3. **知识产权保护**:IT行业特别注重知识产权保护,在离职前需要确认自己是否参与过公司的重要...

    程序员个人年度工作总结.doc

    - 团队管理初期:作者带领的团队规模较小,起初他凭借挑战心态接手管理,团队氛围良好但存在随意性、团队精神不强等问题。项目进度滞后,团队成员频繁加班,导致士气下降。 - 管理理念:作者意识到,有效的管理...

    java程序员转正述职报告.doc

    作为一名新入职的Java程序员,初期我主要负责财务模块的存货核算开发。随着项目进展和团队调整,我逐渐接手了财务管理整个模块的开发工作。这一变化带来了更大的责任和挑战,但我始终保持积极进取的心态,面对困难,...

    有关程序员述职报告范文.doc.doc

    【程序员述职报告范文】 在程序员的职业生涯中,定期进行述职报告是评估个人成长和技术进步的重要环节。...作为程序员,既要不断提升技术素养,也要注重团队建设和项目管理,才能在职业生涯中不断进步。

Global site tag (gtag.js) - Google Analytics