假设您正在接管旧版 .NET 应用程序。用 C# 编写

您用来评估应用程序运行状况的前 5 名诊断措施、分析或其他措施是什么?

我不仅关注诊断的“什么”部分,还关注“如何”。例如确实有必要评估应用程序的快速/最佳响应时间。...但是有没有办法通过代码库的技术诊断来建立/衡量它,而不是仅仅获得用户体验反馈?

alt text
(来源: gmu.edu)

是的,肯定会有一些 惊人的 您用于此目的的工具...如果您也列出它们,那就太好了。

有帮助吗?

解决方案

1.用户感知

非常 我要做的第一件事就是简单地调查用户。请记住,他们是我们为此做的。无论用户喜欢它(或至少不主动不喜欢它),您的应用程序可能会恐怖,因此您不想立即开始将其拆开。

我想问以下问题:

  • 它运行顺利吗?
  • 这个容易用吗?
  • 当您使用它时,您会感觉到吗 自信的 它正在做您期望的?
  • 是宝马,公民还是pinto?

答案将是主观的。没关系。在这一点上,我们只是在寻找广泛的趋势。如果有大量的用户说它一直崩溃,或者他们害怕执行基本任务,那么您会遇到麻烦。

如果应用程序繁殖 迷信, ,您会听到诸如“它似乎在星期四早上剥落”或“我不知道此按钮的作用,但是除非我先单击它,否则它不起作用”。

2.文档

缺乏可怕的文档或文档是生病申请的肯定迹象。没有任何文件意味着开发人员削减了拐角处,或者对不断的死亡游行感到过分劳累,以至于他们无法找到这种“不必要”工作的时间。

我不是在谈论用户手册 - 一个精心设计的应用不需要它们 - 我的意思是技术文档,架构外观,组件的外观,环境依赖性,配置设置,需求/用户故事,测试案例/测试计划,文件格式,您会明白。缺陷跟踪系统也是文档的重要组成部分。

在没有适当文档的情况下,开发人员最终会做出(不正确)假设。我已经与行业中的几个人进行了交谈,他们认为这是可选的,但是我见过或没有使用过的每一个几乎没有文档的系统最终都被错误和设计缺陷所困扰。

3.测试

没有比通过其自身测试(如果可用的话)更好的方法来判断申请的健康。单元测试,代码覆盖范围,集成测试,甚至手动测试,在这里有效。测试套件越完整,系统健康的机会就越好。

成功的测试没有 保证 除此之外,除此之外,要按照撰写测试的人们的方式进行了测试的特定功能。但是很多失败的测试或几年没有更新的测试或根本没有测试 - 这些是危险信号。

我不能指出这里的特定工具,因为每个团队都使用不同的工具进行测试。与已经生产中的任何东西一起工作。

4.静态分析

你们中有些人可能立即认为“ fxcop”。还没有。我要做的第一件事是突发 ndection.

快速查看应用程序的依赖关系,将为您提供 巨大的 有关应用程序的设计程度的大量信息。大多数最糟糕的设计反版社 - 大泥球, 循环依赖性, 意大利面条代码, 上帝反对 - 几乎可以看到 立即地 从鸟眼的看法来看。

接下来,我将运行完整的构建,打开“治疗警告作为错误”设置。在大多数情况下,通过编译器指令或标志忽略特定警告是可以的,但是 字面上地 忽略警告拼写麻烦。同样,这不能保证您一切正常或任何东西都破裂了,但是在确定实际护理水平时,这是非常有用的启发式方法 编码 阶段。

我很满意总体设计/架构不是完整的垃圾, 然后 我会看 fxcop. 。我不将其输出作为福音,但我特别感兴趣 设计警告用法警告 (安全警告也是一个危险信号,但非常罕见)。

5.运行时分析

在这一点上,我已经满足于高水平的应用程序并不是一个巨大的吮吸土墩。对于显微镜下的特定应用程序,此阶段会有很大差异,但是要做的好事是:

  • 在正常运行中记录所有第一次偶然例外。这将有助于衡量应用程序的鲁棒性,以查看是否吞噬了过多的例外,或者是否将异常用作流量控制。如果您看到很多顶级 Exception 实例或 SystemException 衍生物出现,害怕。

  • 通过诸如 eqatec. 。这应该可以帮助您相当轻松地确定任何严重的绩效问题。如果应用程序使用SQL后端,请使用SQL分析工具观看查询。 (实际上,有单独的步骤来测试数据库的健康,这是测试基于一个的应用程序的关键部分,但我不想过分提高主题)。

  • 观看一些用户 - 尤其是“仪式”,他们显然没有理由做的事情。这些通常是挥之不去的虫子和滴答时间炸弹的迹象。还要查看它是否会生成大量错误消息,在“思考”时长时间将UI锁定,等等。基本上,您个人讨厌作为用户看到的任何东西。

  • 压力测试。同样,特定工具取决于应用程序,但这特别适用于基于服务器的应用程序。查看该应用程序是否仍然可以在重负载下运行。如果它开始在断裂点附近的时间安装,那没关系。如果它开始生成奇异的错误消息或更糟,似乎会破坏数据或状态,那是一个 非常 坏迹象。


这就是我现在能想到的。如果想到更多,我会更新。

其他提示

这些不是编码技巧或分析建议,而是评估任何语言程序运行状况的通用方法。按重要性排序

  1. 最终用户对此满意吗?
  2. 稳定吗?
  3. 它坚固吗?
  4. 快吗?
  5. 内存占用是否长期稳定以及我所期望的?

如果这 5 个问题的答案都是肯定的,那么您就有了一个健康的应用程序。我认为 1-3 确实是最重要的。它的内部可能不漂亮,而且可能丑陋,但如果它满足这些规范,它是健康的,并且应该永远保持在传统模式(即。小错误修复)

我建议写作 测试 在某些地区。我不是单位测试的忠实拥护者 - 尽管我最终写了很多。我更喜欢测试系统部分的系统测试 - 因此,从域向下,服务向下,演示者等,而不是必需的整个系统,而是部分系统。如果您正在寻找效率,那么这些测试可能会在代码周围运行秒表,如果花费太长,则会失败。

另一个不错的事情是运行标准任务 蚂蚁分析师 来自Redgate或 Dottrace 从喷气桥。它会告诉您花时间和运行多少次,这意味着您可以在哪里进行优化/缓存。

如果您使用的是nhibrenate,则 NHPROF 很棒(或者我认为Ayende现在已经发布了 Uberprof 它涵盖了更多DB访问策略。)这将警告您任何愚蠢的DB访问。仅使用 SQL Server Profiler 可能会一次又一次地要求您要求相同的数据,但需要更多的努力来过滤垃圾。如果您最终使用它,则可以将其保存到DB表中,然后您可以以更智能的方式查询。

如果您正在寻找健壮性,那么使用的好处是记录策略 - 捕获所有例外并记录它们。这很容易使用 log4net. 。还要记录一下您有点怀疑的某些点。然后将此运行到服务器中(我使用 猕猴桃syslog服务器 它易于设置并且非常强大)可以写入DB,您可以对结果进行分析。我建议反对log4net的ado.net appender,因为它不是异步,因此会减慢您的应用程序。

终于取决于该应用程序是什么,如果您真的很想花一些时间来测试其健康 沃丁 或者 Winforms等效 测试前端。这甚至可能是一个长时间的测试,观察应用程序使用时的内存/处理器使用情况。如果您不太担心 Windows性能分析仪 在使用应用程序时,您可以查看应用程序的各个方面。总是有用的,但是您必须真正戳四周才能获得有用的指标。

希望这可以帮助。

我要看的前两个大项目将是:

  1. 通过记录添加全局异常处理,以及搜索可能“吞咽”例外的任何异常处理,隐藏了您的应用程序问题(我认为还有一个Windows Performance Counter可以暴露每秒的例外数量由您的申请抛出)。这可以帮助发现应用程序中的任何潜在数据一致性问题。
  2. 将某些性能监视和记录添加到应用程序可能使用的任何数据持久性和/或外部网络服务依赖项中,例如记录数据库查询或Web服务调用,这些呼叫的时间超过X的时间长。

如果这与数据库相互作用,则应该感觉到磁盘I / O以及磁盘阵列 /硬盘驱动器的碎片程度。对于MS SQL,请分析任何存储程序,并查看表上的索引和主要键。

您真的不需要工具,只是审查柜台和与DBA交谈的咕unt味。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top