Диагностика .NET Legacy - PullRequest
       41

Диагностика .NET Legacy

15 голосов
/ 21 апреля 2010

Предположим, вы переходите на устаревшее приложение .NET. написано в C #

Какие 5 основных диагностических мер, профилирование или иным образом вы бы использовали для оценки работоспособности приложения?

Я смотрю не только на "ЧТО" часть диагноза, но и на "КАК". Например, Действительно необходимо оценить быстрое / оптимальное время отклика приложения. ... но есть ли способ установить / измерить его путем технической диагностики кодовой базы вместо того, чтобы просто получать отзывы пользователей?

альтернативный текст http://chhs.gmu.edu/images_files/office_of_academic_outreach/images/s07-assessment-image.jpg

И да, обязательно найдутся потрясающие инструменты, которые вы используете для этой цели ... было бы здорово, если бы вы их тоже перечислили.

Ответы [ 5 ]

21 голосов
/ 22 апреля 2010

1. Восприятие пользователя

Очень Первое, что я хотел бы сделать, это просто опросить пользователей. Помните, что именно для них мы и делаем это. Как бы ужасно приложение ни заглядывало внутрь, если пользователям оно нравится (или, по крайней мере, оно ему не нравится), вы не хотите сразу же начинать его разрывать.

Я бы хотел задать такие вопросы, как:

  • Работает ли он гладко?
  • Легко ли пользоваться?
  • Когда вы используете его, чувствуете ли вы уверенный , что он делает то, что вы ожидаете?
  • Это БМВ, Цивик или Пинто?

Ответы будут субъективными. Это нормально. На данный момент мы просто ищем широкие тренды. Если подавляющее число пользователей говорят, что они все время терпят крах или что они боятся выполнять основные задачи, то у вас проблемы.

Если приложение порождает суеверие , и вы слышите такие вещи, как «кажется, что он выпадает по утрам в четверг» или «Я не знаю, что делает эта кнопка, но она не работает, если я не сначала нажми ", беги за холмы.

2. Документация

Отсутствие документации или документации, которая ужасно устарела, является верным признаком больного приложения. Отсутствие документации означает, что сотрудники по разработке срезали углы или были настолько перегружены постоянным маршем смерти, что просто не могли найти время для такой «ненужной» работы.

Я не говорю о руководствах пользователя - хорошо разработанное приложение не должно нуждаться в них - я имею в виду техническую документацию, как выглядит архитектура, что делают компоненты, зависимости от среды, параметры конфигурации, требования / истории пользователей, контрольные примеры / планы испытаний, форматы файлов, вы поняли. Система отслеживания дефектов также является важной частью документации.

Разработчики в конечном итоге делают (неверные) предположения при отсутствии надлежащей документации. Я говорил с несколькими людьми в отрасли, которые думают, что это необязательно, но каждая система, которую я когда-либо видел или работал, с небольшим количеством документации или вообще без нее, заканчивалась ошибками и недостатками дизайна.

3. Тесты

Нет лучшего способа оценить работоспособность приложения, чем его собственные тесты, если они доступны. Модульные тесты, покрытие кода, интеграционные тесты, даже ручные тесты - все работает здесь. Чем полнее набор тестов, тем выше вероятность исправности системы.

Успешные тесты вовсе не гарантируют , за исключением того, что тестируемые специфические функции работают так, как того ожидают люди, написавшие тесты. Но множество неудачных тестов, тестов, которые не обновлялись годами, или тестов вообще нет - это красные флаги.

Я не могу указать на конкретные инструменты здесь, потому что каждая команда использует различные инструменты для тестирования. Работайте с тем, что уже находится в производстве.

4. Статический анализ

Некоторые из вас, вероятно, сразу подумали "FxCop". Еще нет. Первое, что я сделаю, это прорвусь NDepend .

Просто быстрый взгляд на дерево зависимостей приложения даст вам огромное количества информации о том, как хорошо разработано приложение. Большинство наихудших анти-паттернов дизайна - Большой шарик грязи , Круговые зависимости , Код спагетти , Объекты Бога - будут видно почти сразу с высоты птичьего полета зависимостей.

Далее я запустил бы полную сборку, включив параметр «обрабатывать предупреждения как ошибки». Игнорирование определенных предупреждений с помощью директив или флагов компилятора в большинстве случаев нормально, но буквально игнорирование предупреждений приводит к проблемам. Опять же, это не гарантирует, что все в порядке или что что-то сломано, но это очень полезная эвристика в определении уровня обслуживания, которое вошло в фактическую фазу кодирования .

После Я удовлетворен тем, что общий дизайн / архитектура не является полным мусором, , затем Я бы посмотрел на FxCop .Я не воспринимаю его как евангелие, но меня особенно интересуют Предупреждения о дизайне и Предупреждения об использовании (предупреждения о безопасности также имеют красный флаг, но очень редко).

5.Анализ времени выполнения

На данный момент я уже удовлетворен тем, что приложение на высоком уровне не является огромной кучей отстой.Эта фаза может немного отличаться в зависимости от конкретного приложения под микроскопом, но есть несколько хороших вещей:

  • Записать все исключения первого шанса при нормальном запуске.Это поможет измерить надежность приложения, чтобы увидеть, глотается ли слишком много исключений или используются ли исключения в качестве управления потоком.Если вы видите много Exception экземпляров верхнего уровня или производных SystemException, опасайтесь.

  • Запустите его через профилировщик, такой как EQATEC .Это должно помочь вам довольно легко выявить любые серьезные проблемы с производительностью.Если приложение использует серверную часть SQL, используйте инструмент профилирования SQL для просмотра запросов.(Действительно, существуют отдельные этапы для проверки работоспособности базы данных, которая является критической частью тестирования приложения, основанного на ней, но я не хочу слишком зацикливаться на этом).

  • Наблюдайте за несколькими пользователями - ищите особенно "ритуалы", вещи, которые они делают по-видимому без причины.Это, как правило, признак длительных ошибок и тикающих бомб замедленного действия.Также посмотрите, генерирует ли он много сообщений об ошибках, блокирует ли пользовательский интерфейс на длительные периоды, пока «думает», и так далее.По сути, все, что вы лично не хотели бы видеть в качестве пользователя.

  • Стресс-тесты.Опять же, конкретные инструменты зависят от приложения, но это особенно применимо к серверным приложениям.Посмотрите, может ли приложение по-прежнему работать под большой нагрузкой.Если он начинает отсчитывать время около предела, это нормально;если он начинает выдавать странное сообщение об ошибке или, что еще хуже, повреждает данные или состояние, это очень плохой признак .


И это все, что я могуподумай пока.Я буду обновлять, если что-нибудь еще придет в голову.

1 голос
/ 22 апреля 2010

Я бы предложил написать тесты вокруг определенных областей. Я не большой поклонник юнит-тестов - хотя в итоге я написал немало. Я предпочитаю системные тесты, которые проверяют части системы - таким образом, из-за отсутствия домена, обслуживания, презентатора и т. Д. Не обязательно всей системы, а ее частей. Если вы ищете эффективность, то эти тесты могут запустить StopWatch вокруг кода и завершиться неудачей, если это займет слишком много времени.

Еще одна приятная вещь - запускать стандартные задачи через ANTs Profiler из RedGate или dotTrace из Jetbrains. Он расскажет вам, что отнимает время и сколько раз он был запущен, а это означает, что вы можете увидеть, где можно оптимизировать / кэшировать.

Если вы используете NHibernate, то NHProf отлично (или я думаю, что Ayende уже выпустила UberProf , который охватывает больше стратегий доступа к БД.) Это предупредит вас о любых глупостях. Доступ к БД продолжается. Если этого не сделать, просто с помощью SQL Server profiler может показаться, что вы запрашиваете одни и те же данные снова и снова, но потребуется больше усилий для фильтрации мусора. Если вы в конечном итоге используете это, то можете сохранить его в таблице БД, к которой затем можно запросить более интеллектуальным способом.

Если вы ищете надежность, хорошо использовать стратегию ведения журнала - перехватывать все исключения и регистрировать их. Это достаточно просто настроить с помощью log4net . Также войдите, если вы попали в определенные моменты, которые вы слегка подозрительно. Затем запустите сервер (я использую сервер системного журнала kiwi , который прост в настройке и достаточно мощный), который может записывать в БД, и вы можете выполнить анализ результатов. Я бы рекомендовал использовать приложение ADO.NET для log4net, так как оно не асинхронно и замедляет работу вашего приложения.

Наконец, в зависимости от приложения, если вы действительно хотите потратить некоторое время на проверку его работоспособности, вы можете использовать WaTIN или Winforms эквивалент для тестирования внешнего интерфейса. , Это может быть даже длительный тест, отслеживающий использование памяти / процессора приложением во время его использования. Если вас это не беспокоит, то анализатор производительности Windows позволит вам во время использования взглянуть на различные аспекты приложения. Всегда полезно, но вы должны по-настоящему ковыряться, чтобы получить полезные метрики.

Надеюсь, это поможет.

1 голос
/ 21 апреля 2010

Это не советы по кодированию или профилированию, а общий способ оценки работоспособности программы на любом языке. В порядке важности

  1. Доволен ли конечный пользователь?
  2. стабильно ли?
  3. Это надежно?
  4. Это быстро?
  5. Является ли объем памяти стабильным в течение длительных периодов и что я ожидаю?

Если ответ на все 5 из этих вопросов положительный, значит, у вас здоровое приложение. Я бы сказал, что 1-3 действительно важнее всего. Он может быть не очень красивым внутри, и, возможно, прямо внизу, но он полезен, если он соответствует этим спецификациям и должен всегда оставаться в устаревшем режиме (то есть небольшие исправления)

0 голосов
/ 01 мая 2010

Если это взаимодействует с базой данных, вы должны почувствовать дисковый ввод-вывод и степень фрагментации дискового массива / жесткого диска. Для MS SQL проанализируйте все хранимые процедуры и просмотрите индексы и первичные ключи в таблицах.

Вам действительно не нужны инструменты для этого, только тяжелая работа по анализу счетчиков и разговорам с администратором базы данных.

0 голосов
/ 22 апреля 2010

Первые два больших предмета, на которые я хотел бы взглянуть, были бы:

  1. Добавление глобальной обработки исключений с ведением журнала, а также поиск любой обработки исключений, которая может «проглотить» исключения, скрыть проблемы с вашим приложением (я думаю, что есть также счетчик производительности Windows, который будет отображать количество исключений в секунду). которые выбрасываются вашим заявлением). Это может помочь выявить любые потенциальные проблемы согласованности данных в вашем приложении.
  2. Добавьте некоторый мониторинг производительности и ведение журнала для любых зависимостей сохранения данных и / или внешних сетевых служб, которые может использовать приложение, таких как ведение журнала запросов к базе данных или вызовов веб-служб, выполнение которых занимает более X времени.
...