1。用户感知
非常我要做的第一件事就是简单地调查用户。请记住,他们是我们这样做的对象。无论应用程序内部看起来多么糟糕,如果用户喜欢它(或者至少不主动不喜欢它),那么您就不想立即开始将其拆开。
我想问以下问题:
- 运行流畅吗?
- 使用方便吗?
- 当您使用它时,您是否有信心相信它正在按照您的预期做事?
- 是宝马、思域还是平托?
答案将是主观的。没关系。在这一点上,我们只是在寻找广泛的趋势。如果绝大多数用户说它总是崩溃,或者他们害怕执行基本任务,那么你就有麻烦了。
如果应用程序滋生迷信,并且您听到诸如“它似乎在星期四早上脱落”或“我不知道这个按钮有什么作用,但它不起作用,除非我先点击它”,奔向山丘。
2。文档
缺少文档或文档严重过时,是应用程序出现问题的明确迹象。没有文档意味着开发人员偷工减料,或者在不断的死亡行军中过度劳累,以至于他们无法找到时间进行这种“不必要的”工作。
我说的不是用户手册——一个设计良好的应用程序不应该需要它们——我指的是技术文档、架构的外观、组件的作用、环境依赖关系、配置设置、需求/用户故事、测试用例/test 计划,文件格式,你懂的。缺陷跟踪系统也是文档的重要组成部分。
在没有适当文档的情况下,开发人员最终会做出(不正确的)假设。我与业内的一些人交谈过,他们认为这是可选的,但我所见过或使用过的每一个几乎没有文档或没有文档的系统最终都充满了错误和设计缺陷。
3。测试
判断应用程序运行状况的最佳方法是通过其自身的测试(如果可用)。单元测试、代码覆盖率、集成测试,甚至手动测试,任何东西都可以在这里工作。测试套件越完整,系统健康的机会就越大。
成功的测试根本不能保证,除了被测试的特定功能按照编写测试的人所期望的方式工作之外。但是很多失败的测试,或者多年没有更新的测试,或者根本没有测试——这些都是危险信号。
我不能在这里指出具体的工具,因为每个团队都使用不同的工具进行测试。使用任何已经在生产中的东西。
4。静态分析
你们中的一些人可能会立即想到“FxCop”。还没有。我要做的第一件事就是突破NDepend。
只要快速浏览一下应用程序的依赖关系树,您就会大量了解应用程序的设计情况。大多数最糟糕的设计反模式 - Big Ball of Mud、Circular Dependencies、Spaghetti Code、God Objects - 几乎立即从依赖项的鸟瞰图可见。
接下来,我将运行完整的构建,打开“将警告视为错误”设置。大多数时候通过编译器指令或标志忽略特定警告是可以的,但字面上忽略警告会带来麻烦。同样,这并不能保证一切正常或任何东西都损坏了,但它是确定进入实际编码阶段的注意程度的非常有用的启发式方法。
之后我对整体设计/架构不是完全垃圾感到满意,然后我会看看FxCop。我不认为它的输出是福音,但我对Design Warnings 和Usage Warnings 特别感兴趣(安全警告也是一个危险信号,但非常罕见)。
5。运行时分析
在这一点上,我已经很满意该应用程序,在高层次上,不是一个巨大的垃圾堆。这个阶段在显微镜下的具体应用会有很大的不同,但一些好的事情是:
在正常运行下记录所有第一次机会异常。这将有助于衡量应用程序的健壮性,查看是否有太多异常被吞下,或者异常是否被用作流量控制。如果您看到很多顶级的Exception 实例或SystemException 派生类出现,请害怕。
通过诸如EQATEC 之类的分析器运行它。这应该可以帮助您相当容易地识别任何严重的性能问题。如果应用程序使用 SQL 后端,请使用 SQL 分析工具来观察查询。 (确实有单独的步骤来测试数据库的健康状况,这是测试基于数据库的应用程序的关键部分,但我不想离题太远)。
观察一些用户 - 特别注意“仪式”,他们显然无缘无故地做这些事情。这些通常是挥之不去的错误和定时炸弹的标志。还要看看它是否会产生很多错误消息,在“思考”时长时间锁定 UI,等等。基本上,任何你个人讨厌作为用户看到的东西。
压力测试。同样,具体工具取决于应用程序,但这尤其适用于基于服务器的应用程序。看看应用程序在重负载下是否仍然可以运行。如果它在断点附近开始超时,那没关系;如果它开始生成奇怪的错误消息或更糟,似乎损坏了数据或状态,那是一个非常不好的迹象。
这就是我现在能想到的。如果有更多的想法,我会更新。