客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长提高软件质量的利器Valgrind2010-12-24视讯产品线/监控业务开发部行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长2PurifyPlus投资回报分析•花费更少的时间修补BUG,每位开发人员每年节约2.6周时间•研究表明假设一个中等工作团队为5人,则每个团队每月出现3次关键的内存访问错误。也就是每位开发人员每月0.6个错误。使用常规工具发现一个内存访问错误平均花费16小时。•0.6个错误/月/开发人员×16小时/错误=9.6小时/月用来修补内存错误•百分之六十的被调查者认为,使用PurifyPlus发现运行时错误带来的生产率系数大约是10倍,这就意味着过去用十小时发现并纠正的错误可以在不到一小时内得以纠正。即:使用常规的工具9.6小时×1/10(Purify生产率系数)=0.96小时/月。这说明每位开发人员每月节省8.64小时(9.6-0.96=8.64)。按这样的方法计算一年,8.64小时/月×12月=103.7小时/年。每周40小时,这样就可以换算成每年节省2.6周(103.7小时/40小时=2.6周)行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长3PurifyPlus投资回报分析•花费更少的时间解决性能每位开发人员每年节省1.96周•研究表明每位程序员花费大约5%的时间用于优化/改进程序性能。这样计算的话,不使用PurifyPlus,程序员每年花费2.4周改进程序性能:0.05×48周/年=2.4周/年。当使用了PurifyPlus解决性能问题后,生产率增益的系数估计为5倍,这就意味着以前花费5小时纠正的错误现在仅需要1小时。•在赢得这个5倍的量化的生产率系数后,每位开发人员每年将仅仅使用0.48周来解决性能问题:使用常规工具需要2.4小时×1/5(量化的生产率因子)=0.48周/年。这表明每位开发人员每年节省将近两周的时间(2.4-0.48=1.92)行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长4PurifyPlus投资回报分析•提早发现BUG每年节省7000美元•PurifyPlus通过突出显示没有完全通过测试并且可能仍旧包含BUG或性能问题的代码段,从而改进错误检测。通过提早发现BUG,PurifyPlus带来了显著的费用节省。公认的行业标准表明在软件交付前修补BUG的花费小于10倍。使用PurifyPlus的开发人员与不使用PurifyPlus的开发人员相比,每年平均多发现10个BUG•在软件交付后修补一个BUG的开销估计是700美元,而在交付前修补一个BUG的开销仅为70美元。对于每位开发人员来说,使用PurifyPlus提前发现BUG节省的成本每年就是7000美元:•10BUG×700美元交付后成本=7000美元行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长5好的工具可以帮助开发人员每年多活一个月行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长6BUG的危害•增加产品的开发时间、可能会把产品挂掉•增加研发人员的劳动、经常加班可能会把人挂掉•不断的消耗公司的利润•严重影响研发人员的自信心和学习机会•导致与家人团聚的时间减少,降低幸福指数•影响寿命•影响同事间感情•致命的BUG可能会把公司挂掉行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长7软件BUG分类行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长8如何降低软件的BUG•使用成熟的代码和框架少直接使用裸API多使用自己积累的开发代码使用CBB,COTS使用成熟的开源框架ACE,ICE,BOOST,STL•技术代码与业务代码解耦技术代码+业务代码=产品代码抽象技术代码-好的设计模式-形成框架-通用中间件抽象业务代码-好的设计模式-形成框架-领域中间件行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长9如何降低软件的BUG•对句柄资源在应用层进行资源使用统计文件,SOCKET,内存等系统资源•不直接使用系统的内存管理,在应用层开发自己的内存池可以提高运行效率,减少频繁内存分配内存的分配释放可以自己控制,避免内存泄露行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长10如何降低软件的BUG•编写代码尽量符合OCP原则面对变化优先考虑不增加代码面对变化优先考虑增加新的模块面对变化优先考虑增加新的文件面对变化优先考虑增加新的类面对变化优先考虑增加新的函数•模块对外接口要保持宽进严出原则行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长11如何降低软件的BUG•尽量少用锁,用锁的最高境界是不用锁•禁止使用递归锁、交叉锁、嵌套锁•建议多使用ScopedLocking避免忘记释放锁•对外接口采用Thread-SafeInterface避免自死锁•采用成熟的网络I/O模型、少用SELECT模型•单线程能解决问题就少使用多线程、多线程下优先采用静态多线程•能用数组就不用堆•进程间通信优先使用文本协议行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长12如何降低软件的BUG•养成好的编码习惯•使用简单的语法少使用多重继承、多级继承、嵌套、友元•编写简单的类功能单一、接口清晰、函数不要过多•编写简单的函数输入参数[0,3]个、输出参数[0,1]、少用**、少用递归行数[0,20]=20%,(20,50]=70%,(50,100]=10%,(100,+~)=0%•编写简单的指令行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长13如何降低软件的BUG•开发做好单元测试,需要有单元测试代码•长时间在Valgrind环境运行,发现潜在BUG•每个模块确保代码执行覆盖率在90%以上•关键代码要Review行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长14如何降低软件的BUG•SE要充分理解用户需求、对需求负责•开发代码要确保设计符合需求、对设计负责•测试代表要在产品各个阶段进行测试、对产品质量负责•开发人员对代码负责•项目经理对进度、质量负责•做好配置管理行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长15如何降低软件的性能从小处想从大处想字节对齐较少内存拷贝减少跨进程调用采用多线程或openMP采用资源池(内存池线程池对象池)代码重构分布式计算并行计算多核、多网卡集群网格计算云计算行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长16如何定位软件BUG•LOG日志做到内部模块区别时间精确到毫秒异步调用可重定向到网络行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长17如何定位软件BUG•Telnet诊断通过标准的Telnet客户端实现远程控制通过命令可以查看程序内部状态通过命令可以修改程序内部状态Telnet客户端目标程序TelnetService接收命令响应发送命令请求命令1命令2…命令n行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长18如何定位软件BUG•加入捕获代码LONGWINAPICocaUnhandledFilter(struct_EXCEPTION_POINTERS*lpExceptionInfo){HANDLEhFile=::CreateFile(szFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);if(hFile!=INVALID_HANDLE_VALUE){MINIDUMP_EXCEPTION_INFORMATIONExInfo;ExInfo.ThreadId=::GetCurrentThreadId();ExInfo.ExceptionPointers=lpExceptionInfo;ExInfo.ClientPointers=false;BOOLbOK=MiniDumpWriteDump(GetCurrentProcess(),GetCurrentProcessId(),hFile,MiniDumpNormal,&ExInfo,NULL,NULL);if(bOK)printf(CreateDumpFile=%sSuccess!\n,szFileName);elseprintf(MiniDumpWriteDumpFailed:%d\n,GetLastError());::CloseHandle(hFile);}returnret;}行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长19如何定位软件BUG•诊断工具行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长20IBMRationalPurifyPlus•PurifyPlus是一套测试工具集合,拥有三个工具PureCoverage、Quantifyis和Purify,您可以用这套工具完成对代码覆盖率、性能和内存分析的运行时分析。它可以加强自动化测试工作,改善产品性能和质量•PureCoverage用来进行代码覆盖率分析:它测量在所有测试用例中多少代码运行了,多少代码没有运行•Quantify用来进行性能分析:分析应用程序的性能瓶颈•Purify用来进行内存分析:它帮助寻找应用程序的内存泄漏和错误的内存使用,这些有可能导致应用程序崩溃•支持Windows&Linux,C/C++,Java•要钱的行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长21WinDbg•微软提供的基于源码级的免费调试工具•功能上类似Linux下的GDB•支持Kernel模式调试和User模式调试•支持DMP文件分析•支持二次开发行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长22WinDbg-如何定位程序崩溃行为准则:尊重·简单·重用·检查·并行·勇气·反馈·改善·认真·责任价值观:客户第一|艰苦奋斗|阳光沟通|团队协作|拥抱变化|学习成长23Valgrind•Valgrind是一款动态分析工具,能自动检测内存管理和线程错误,以及发现