如何提高产品开发品质ppt课件.ppt_第1页
如何提高产品开发品质ppt课件.ppt_第2页
如何提高产品开发品质ppt课件.ppt_第3页
如何提高产品开发品质ppt课件.ppt_第4页
如何提高产品开发品质ppt课件.ppt_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、如何提高产品开发品质,1,讲解内容,2,一、目前开发过程存在的问题,没有完善的品质保障流程 质量低下的代码 不重视测试,3,产品开发流程现状,开发人员编写代码,调试, 肉眼观察,有问题,没问题(自认为),可交付的代码,编译,修正编译错误,登记到JIRA上,客户提出需求或 现场发现bug,4,产品品质管理严重缺失,该流程的最终目标和工作重心都是完成产品功能开发,品质管理严重缺失。产品的开发质量完全靠开发人员的个人责任心以及工作经验来保障,缺乏一个稳定可靠的质量保障流程。这种流程开发出来的产品往往是质量不可靠,需要经常返工的劣质产品。,5,质量低下的代码是导致产品品质不好的根本原因,质量低下的代码

2、体现在以下几个方面: 重复的代码 过长的函数 过大类 过长的参数列表 过度复杂的逻辑判断 数据泥团,6,没有专职测试人员来进行功能性测试工作,在目前的开发流程中,开发出来的代码只经过开发人员自己简单的测试,没有专职的测试人员来进行详细的功能性测试。这样导致的结果往往是提交到现场的代码会带有不少BUG,一定要经过多次返工才能达到较高的品质。而且这样做的另一个后果是把客户当作测试人员,会给客户留下产品品质不稳定这样一种非常不好的客户体验。,7,开发人员在开发过程中不重视单元测试,单元测试是提高产品品质非常重要的一个方法,而我们的开发人员往往会忽视这一点。如果没有单元测试,仅仅依靠测试人员的功能性测

3、试,那么这样的测试工作量会非常大,每次修改一个功能,可能会影响到的其他功能都要一一测试,不仅测试时间会非常长,而且效果也不好,很多细节不一定每次都能测到,这些都是产生BUG的隐患。同时由于我们业务需求都非常复杂多变的,没有一个完善自动化测试流程,而仅仅依靠人工测试,对产品品质的影响是不言而喻的。,8,我们的目标!,编写出逻辑清晰、结构简洁、扩展性良好、可测试性高的优秀代码。 强化单元测试工作,提高单元测试覆盖率,搭建自动单元测试集,通过日构建来持续集成,对产品质量进行全面控制。 通过严格的产品质量管理流程,强化质量管理工作,将所有BUG消灭在公司内部。,9,二、产品开发品质保障流程,10,开发

4、质量管理,本开发流程的目标是开发出质量优良的产品,流程的重心在于质量管控,通过质量保障人员对产品质量进行全面把关。 对于没有编写单元测试的代码直接打回! 质量保障人员负责进行功能性测试,并对提交出去的代码负责。 质量保障人员另一个职责是思考如何持续改进产品质量。,11,需求管控,对每个需求进行分级评审,最大程度的降低需求变更的频度。 所有需求开发前都经过内部评审,对于一些复杂需求把握更加准确,不至于在开发时候产生较大偏差。 所有需求的开发工作都有经过客户签字的开发工作量评估,为商务工作开展创造有利条件。 所有需求都有详细开发计划,片区人员可以安排相应的测试计划。,12,全过程管控,所有缺陷和经

5、过评审的需求都必须在JIRA上登记,否则不予开发。 开发计划通过JIRA进行精确体现。 片区人员可以通过JIRA实时跟踪产品开发进度。 方便后续各类工作量的统计。,13,三、利用代码重构来提高代码质量,重构(Refactoring):是对软件内部结构的一种调整,目的是在不改变外部行为的前提下,提高其可理解性,降低其修改成本,14,为什么重构(1),改进软件的设计。 程序员对代码所做的为了满足短期利益代码改动,或再没有完全清楚增个架构下的改动,都很容易是代码失去它的清晰结构,偏离需求或设计。而这些改动的积累很容易使代码偏离它原先设计的初衷而变得不可立即和无法维护。 重构则帮助重新组织代码,重新清

6、晰的体现结构和进一步改进设计。,15,为什么重构(2),提高代码质量,更易被理解 容易理解的代码可以很容易的维护和做进一步的开发。即使对写这些代码的程序员本身,容易理解代码也可以帮助容易地做修改。程序代码也是文档。而代码首先是写给人看的,让后才是给计算机看的。 重构帮助尽早的发现错(Bugs) 重构是一个code review和反馈的过程。在另一个时段重新审视自己或别人代码,可以更容易的发现问题和加深对代码的理解。 重构是一个良好的软件开发习惯。,16,为什么重构(3),重构可以提高开发速度 重构对设计和代码的改进,都可以有效的提高开发速度。好的设计和代码质量实体提高开发速度的关键。在一个有缺

7、陷的设计和混乱代码基础上的开发,即使表面上进度较快,但本质是试延后对设计缺陷的发现和对错误的修改,也就是延后了开发风险,最终要在开发的后期付出更多的时间和代价。 项目的维护成本远高于开发成本.,17,何时重构?,添加或者修改功能时一并重构 为了增加一个新的功能或者修改原有的功能,程序员需要首先读懂现有的代码。 修补错误时一并重构 为了修复一个Bug,程序员需要读懂现有的代码。 Code Review时一并重构,18,何时不该重构?,代码太混乱,设计完全错误。与其Refactor,不如重写。 明天是DeadLine 永远不要做Last-Minute-Change。推迟重构,但不可以忽略,即使进入

8、产品期的代码都正确的运行。,19,重构方法介绍:提取函数(1),String name = request.getParameter(Name); if( name != null if( age != null if( !isNullOrEmpty( name ) ) . String age = request.getParameter(Age); if( !isNullOrEmpty( age ) ) . private boolean isNullOrEmpty( final String string ) if( string != null ,20,重构方法介绍:提取函数(2),提

9、取函数是我最常用的重构手法之一。当我看见一个过长的函数或者一段需要注释才能让人理解用途的代码,我就会将这段代码放进一个独立的函数中。 有数个原因造成我喜欢简短而有良好命名的函数。首先,如果每个函数的粒度都很小,那么函数之间彼此复用的机会就更大;其次,这会使高层函数读起来就像一系列注释;再者,如果函数都是细粒度,那么函数的覆写(override )也会更容易些: 的确,如果你习惯了看大型函数,恐怕需要一段时问才能适应达种新风格,而且只有当你能给小型函数很好地命名时,它们才能真正起作用,所以你需要在函数名称下点功夫,一个函数多长才算合适?在我看来.长度不是问题,关键在于函数名称和函数本体之间的语义

10、距离,如果提炼动作可以强化代码的清晰度,那就去做,就是函数名称比提炼出来的代码还长也无所谓。,21,重构方法介绍:去除临时变量(1),22,重构方法介绍:去除临时变量(2),我喜欢尽量除去函数内的临时变量。临时变量往往形成问题,它们会导致大量参数被传来传去,而其实完全没有这种必要。你很容易失去它们的踪迹,尤其在长长的函数之中更是如此。而且,临时变量的存在,往往会阻碍提取函数等其他重构手法的进行。,23,重构方法介绍:重新命名函数(1),public String getItemName (int itemSort,String itemName) return +itemSort+、+item

11、Name; ,public String formatItemName (int itemSort,String itemName) return +itemSort+、+itemName; ,24,重构方法介绍:重新命名函数(2),我极力提倡的一种编程风格就是:将复杂的处理过程分解成小函数。但是,如果做得不好,这会使你费尽周折却弄不清楚这些小函数各白的用途、.要避免这种麻烦,关键就在于给函数起一个好名称;函数的名称应该准确表达它的用途;给函数命名有一个好办法。首先考虑应该给这个函数写上一句怎样的注释,然后想办法将注释变成函数名称。 人生不如意十之八九:你常常无法第一次就给函数起一个好名称,这

12、时候你可能会想,就这样将就着吧,毕竟只是一个名称而已。当心!这是恶魔的召唤,是通向混乱之路,千万不要被它诱惑!如果你看到一个函数名称不能很好地表达它的用途,应该马上加以修改。记住,你的代码首先是为人写的,其次才是为计算器写的。而人需要良好名称的函数。想想过去曾经浪费的无数时间吧,如果给每个函数都起一个良好的名称,也许你可以节约好多时间。取一个好名称并不容易,需要经验,要想成为一个真正的编程高手,取名称的水平是至关重要的。,25,重构方法介绍:以多态取代条件表达式(1),public class PlanUtil public void setPlanState(int planYear,int

13、 itemId,int dataType) switch dataType case 1:setPrePlanState(planYear,itemId); case 2:setColPlanState(planYear,itemId); case 3:setAftPlanState(planYear,itemId); default: throw new RuntimeException(不正确的计划类型:+dataType); /.更新建议计划状态 public void setPrePlanState /.更新综合计划状态 public void setColPlanState. /.更

14、新开工计划状态 public void setAftPlanState.,public class PlanUtil public static PlanUtil create (int dataType) switch (dataType) case 1:return new PrePlanUtil(); case 2:return new ColPlanUtil(); case 3:return new AftPlanUtil(); default:throw new RuntimeException(不正确的计划类型:+dataType); public abstract void se

15、tPlanState (int planYear,int itemId,int dataType); public abstract void savePlan (int planYear,int itemId,int dataType); ,26,重构方法介绍:以多态取代条件表达式(2),/保存计划数据 public void savePlan(int planYear,int itemId,int dataType) switch dataType case 1:savePrePlan(planYear,itemId); case 2:saveColPlan(planYear,itemId

16、); case 3:saveAftPlan(planYear,itemId); default: throw new RuntimeException(不正确的计划类型:+dataType); /.保存建议计划数据 public void savePrePlan /.保存综合计划数据 public void saveColPlan /.保存开工计划数据 public void saveAftPlan,public class PrePlanUtil extends PlanUtil public void setPlanState (int planYear,int itemId,int da

17、taType) . 更新建议计划状态方法 public void savePlan (int planYear,int itemId,int dataType) 保存建议计划数据方法 public class ColPlanUtil extends PlanUtil public void setPlanState (int planYear,int itemId,int dataType) . 更新综合计划状态方法 public void savePlan (int planYear,int itemId,int dataType) 保存综合计划数据方法 ,27,重构方法介绍:以多态取代条件

18、表达式(3),/调用更新计划状态的方法 planUtil.setPlanState(year,itemId,dataType); /调用保存计划数据的方法 planUtil.savePlanyear,itemId,dataType);,public class AftPlanUtil extends PlanUtil public void setPlanState (int planYear,int itemId,int dataType) . 更新开工计划状态方法 public void savePlan (int planYear,int itemId,int dataType) 保存开工计划数据方法 /调用 PlanUtil planUtil = PlanUtil .create(dataType); /调用更新计划状态的方法 planUtil.setPlanState(year,itemId,dataType); /调用保存计划数据的方法 planUtil.savePlan (year,itemId,dataType);,28,重构方法介绍:以多态取代条件表达式(4),多态最根本的好处就是:如果你需要根据对象的不同型别而采取不同的行为,多态使你不必编写明显的条件式。正因为有了多态,所以你会发现:针对type code(型

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论