草庐IT

c# - 诊断 .NET 遗留问题

coder 2024-05-21 原文

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

您将采用哪些前 5 项诊断措施、分析或其他方式来评估应用程序的健康状况?

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


(来源:gmu.edu)

是的,肯定会有一些 真棒您为此目的使用的工具……如果您也列出它们,那就太好了。

最佳答案

1. 用户感知

我要做的第一件事就是简单地调查用户。请记住,他们是我们这样做的对象。不管一个应用程序的内部看起来多么可怕,如果用户喜欢它(或者至少不主动不喜欢它),那么你就不想立即开始拆散它。

我想问以下问题:

  • 运行顺畅吗?
  • 这个容易用吗?
  • 当您使用它时,您是否确信它正在按照您的预期运行?
  • 它是宝马、思域还是平托?

  • 答案将是主观的。没关系。在这一点上,我们只是在寻找广泛的趋势。如果绝大多数用户说它总是崩溃,或者他们害怕执行基本任务,那么你就有麻烦了。

    如果该应用程序滋生迷信,并且您听到诸如“它似乎在星期四早上脱落”或“我不知道此按钮的作用,但除非我先单击它才能起作用”之类的话,请跑向山丘.

    2. 文档

    缺乏文件,或过时的文件,肯定是申请有问题的迹象。没有文档意味着开发人员会偷工减料,或者在不断的死亡行军中过度工作,以至于他们找不到时间进行这种“不必要的”工作。

    我不是在谈论用户手册——一个设计良好的应用程序不应该需要它们——我的意思是技术文档、架构的外观、组件的作用、环境依赖性、配置设置、需求/用户故事、测试用例/测试计划, 文件格式,你懂的。缺陷跟踪系统也是文档的重要组成部分。

    在没有适当的文档的情况下,开发人员最终会做出(不正确的)假设。我曾与业内一些人交谈过,他们认为这是可选的,但我见过或使用过的每个系统都很少或没有文档,最终都充满了错误和设计缺陷。

    3. 测试

    判断应用程序健康状况的最佳方式莫过于通过自己的测试(如果可用)。单元测试、代码覆盖率、集成测试,甚至手动测试,这里都可以使用。测试套件越完整,系统健康的机会就越大。

    成功的测试并不能保证太多,除了被测试的特定功能按照编写测试的人期望的方式工作之外。但是很多失败的测试,或者多年没有更新的测试,或者根本没有测试——这些都是危险信号。

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

    4. 静态分析

    你们中的一些人可能会立即想到“FxCop”。还没有。我要做的第一件事就是突破 NDepend .

    只需快速查看应用程序的依赖关系树,您就会获得大量有关应用程序设计情况的信息。大多数最糟糕的设计反模式 - Big Ball of Mud , Circular Dependencies , Spaghetti Code , God Objects - 几乎可以立即从依赖项的鸟瞰 View 中看到。

    接下来,我将运行一个完整的构建,打开“将警告视为错误”设置。大多数时候通过编译器指令或标志忽略特定警告是可以的,但从字面上忽略警告会带来麻烦。同样,这并不能保证一切正常或任何东西都损坏了,但它是确定进入实际编码阶段的小心程度的非常有用的启发式方法。

    在我满意整体设计/架构不是完全垃圾之后,我再看看FxCop .我不把它的输出当作福音,但我对 Design Warnings 特别感兴趣和 Usage Warnings (安全警告也是一个危险信号,但非常罕见)。

    5. 运行时分析

    在这一点上,我已经很满意该应用程序,在高层次上,并不是一个巨大的垃圾堆。这个阶段会因显微镜下的特定应用而有很大差异,但一些好的做法是:
  • 记录正常运行下的所有第一次机会异常。这将有助于衡量应用程序的健壮性,看看是否有太多的异常被吞下,或者异常是否被用作流量控制。如果你看到很多顶级Exception实例或 SystemException衍生品出现,害怕。
  • 通过诸如 EQATEC 之类的分析器运行它.这应该可以帮助您轻松识别任何严重的性能问题。如果应用程序使用 SQL 后端,请使用 SQL 分析工具来观察查询。 (确实有单独的步骤来测试数据库的健康状况,这是测试基于一个的应用程序的关键部分,但我不想太离题)。
  • 观察一些用户——特别注意“仪式”,他们做的事情显然是没有理由的。这些通常是挥之不去的错误和定时炸弹的迹象。还要查看它是否会生成大量错误消息,是否在“思考”时长时间锁定 UI,等等。基本上,您个人不喜欢作为用户看到的任何内容。
  • 压力测试。同样,特定工具取决于应用程序,但这尤其适用于基于服务器的应用程序。查看应用程序在重负载下是否仍然可以运行。如果它在断点附近开始超时,那没关系;如果它开始生成奇怪的错误消息或更糟,似乎损坏了数据或状态,这是一个非常糟糕的迹象。


  • 这就是我现在能想到的所有内容。如果想到更多,我会更新。

    关于c# - 诊断 .NET 遗留问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2680458/

    有关c# - 诊断 .NET 遗留问题的更多相关文章

    1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

      作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

    2. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

      我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

    3. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

      尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

    4. ruby - 如何模拟 Net::HTTP::Post? - 2

      是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

    5. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

      我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

    6. ruby - Fast-stemmer 安装问题 - 2

      由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

    7. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

      当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

    8. c# - 如何在 ruby​​ 中调用 C# dll? - 2

      如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

    9. C# 到 Ruby sha1 base64 编码 - 2

      我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

    10. java - 从 JRuby 调用 Java 类的问题 - 2

      我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

    随机推荐