Sha*_*10N 15 .net c# profiling diagnostics legacy-app
假设您正在接管传统的.NET应用程序.用C#编写
您将用于评估应用程序健康状况的前五种诊断措施,概况分析或其他方面是什么?
我不仅仅关注诊断的"什么"部分,还关注"如何".例如,确实需要评估应用程序的快速/最佳响应时间....但有没有办法通过代码库的技术诊断来建立/衡量它,而不仅仅是获得用户体验反馈?
是的,你必须使用一些很棒的工具......如果你也列出它们会很棒.
Aar*_*ght 21
在很我首先要做的就是简单地调查的用户.请记住,他们就是我们为此而做的.然而,如果用户喜欢它(或者至少不主动不喜欢它),应用程序可能会看起来很可怕,那么您不希望立即开始将其拆开.
我想问一些问题,例如:
答案是主观的.没关系.在这一点上,我们只是在寻找广泛的趋势.如果绝大多数用户说它一直崩溃,或者他们害怕执行基本任务,那么你就麻烦了.
如果该应用程序滋生迷信,你会听到"它似乎在星期四早上剥落"或"我不知道这个按钮是做什么,但除非我先点击它就不起作用"之类的事情,然后跑到山上去.
缺乏文档或文档过时,这是一个生病的应用程序的确定标志.没有文件意味着开发人员偷工减料,或者因为不断的死亡游行而过度劳累,以至于他们无法找到时间进行这种"不必要的"工作.
我不是在谈论用户手册 - 设计良好的应用程序不应该需要它们 - 我的意思是技术文档,架构的外观,组件的功能,环境依赖性,配置设置,要求/用户故事,测试用例/测试计划,文件格式,你明白了.缺陷跟踪系统也是文档的重要组成部分.
在没有适当的文档的情况下,开发人员最终会做出(错误的)假设.我已经与业内几位认为这是可选的人交谈过,但是我所见过或工作过的每个系统都很少或根本没有文档,最终充斥着漏洞和设计缺陷.
如果可用的话,没有比通过自己的测试更好地判断应用程序的运行状况的方法了.单元测试,代码覆盖,集成测试,甚至手动测试,任何在这里工作.测试套件越完整,系统健康的可能性就越大.
成功的测试并不能保证很多,除了被测试的特定功能与编写测试的人期望的方式一致.但是很多失败的测试,或者多年未更新的测试,或者根本没有测试 - 这些都是危险信号.
我不能指出这里的具体工具,因为每个团队都使用不同的工具进行测试.使用已经在生产中的任何东西.
你们当中有些人可能会立刻想到"FxCop".还没.我要做的第一件事是打破NDepend.
只需快速浏览一下应用程序的依赖关系树会给你巨大的关于应用程序是如何精心设计的大量信息.大多数最糟糕的设计反模式 - 泥球大球,圆形依赖关系,意大利面条代码,神对象 - 几乎可以立即看到依赖关系的鸟瞰图.
接下来,我将运行完整版本,打开"将警告视为错误"设置.在大多数情况下,通过编译器指令或标志忽略特定警告是正常的,但实际上忽略警告会带来麻烦.同样,这并不能保证一切正常或任何事情都被破坏,但它在确定进入实际编码阶段的护理水平时是一种非常有用的启发式方法.
之后我感到满意的是整体设计/架构不完整的垃圾,然后我会看的FxCop.我不把它的输出作为福音,但我对设计警告和使用警告特别感兴趣(安全警告也是一个红旗,但非常罕见).
在这一点上,我已经很满意这个应用程序在很高的层面上并不是一个巨大的笨蛋.相对于显微镜下的具体应用,这个阶段会有很大差异,但有些好处要做:
在正常运行下记录所有第一次机会异常.这将有助于衡量应用程序的稳健性,查看是否有太多异常被吞下或者是否将异常用作流量控制.如果您看到很多顶级Exception实例或SystemException衍生品出现,请害怕.
通过EQATEC等分析器运行它.这应该可以帮助您轻松识别任何严重的性能问题.如果应用程序使用SQL后端,请使用SQL分析工具来查看查询.(实际上,有一些单独的步骤用于测试数据库的运行状况,这是测试基于一个应用程序的应用程序的关键部分,但我不想过于偏离主题).
观看一些用户 - 特别注意"仪式",他们做的事情显然没有理由.这些通常是挥之不去的错误和滴答作响的时间炸弹的标志.还要查看它是否会生成大量错误消息,在"思考"时长时间锁定UI,依此类推.基本上,任何你个人不愿意看作用户的东西.
压力测试.同样,特定工具取决于应用程序,但这尤其适用于基于服务器的应用程序.查看应用程序是否仍能在高负载下运行.如果它在断点附近开始超时,那就没关系; 如果它开始生成奇怪的错误信息或者更糟糕的是,似乎损坏了数据或状态,这是一个非常糟糕的迹象.
这就是我现在能想到的一切.如果再想到的话,我会更新.