1 of 31

Software Engineering

Лекция 11: Дефекты и что с ними делать

Тимофей Брыксин

timofey.bryksin@gmail.com

2 of 31

Ошибка, дефект, сбой

3 of 31

4 of 31

Системы управления дефектами (bug/issue/task/... trackers)

  • Хранят и предоставляют доступ к БД дефектов
  • Управляют правами доступа
  • Отправляют нужные нотификации
    • изменение ЖЦ дефекта
    • почта/IM/SMS
  • Собирают статистику и формируют отчёты

5 of 31

Характеристики дефектов

  • Идентификатор дефекта
  • Заголовок
  • Описание дефекта (включая шаги воспроизведения)
  • Контекст
  • Тип
  • Серьёзность (severity)
  • Приоритет (priority)
  • Статус
  • Автор
  • Ответственный за исправление, ответственный за проверку
  • Зависимость
  • Временные параметры устранения дефекта
  • ...

6 of 31

Идентификатор дефекта

  • Уникальный в рамках всего проекта
  • Может кодировать в себе доп. информацию о дефекте
  • Создаётся один раз и не меняется
    • чтобы не ломать ссылки

7 of 31

Заголовок

  • Короткий и ёмкий, описывающий суть проблемы

8 of 31

Описание дефекта

  • Полный, но краткий отчёт о проблеме
  • Шаги по воспроизведению
  • Ожидаемый и фактический результат
  • Один дефект -- одна проблема
  • Дополнительная информация
    • логи, дампы памяти
    • ссылки
    • скриншоты
    • видео

9 of 31

Контекст

  • Проект/программа/задача
  • Номер версии, ревизии
  • Модуль, компонент

10 of 31

Тип дефекта

  • Ошибка функционирования
  • Ошибка документации
  • Предложение по усовершенствованию
  • Предложение по изменению
  • Новая функциональность
  • ...

11 of 31

Серьёзность (severity)

  • Косметический дефект
  • Обычный дефект
  • Серьёзная ошибка
    • зависание
    • аварийное завершение
    • потеря данных
    • ...
  • Showstopper
  • ...

12 of 31

Приоритет дефекта

  • Показывает срочность исправления
    • Низкая
    • Средняя
    • Высокая
    • Срочная

13 of 31

Статус дефекта

  • Отражает состояние жизненного цикла дефекта
    • Новый
    • Взятый на исправление
    • Исправленный
    • Закрытый (исправленный и проверенный)
    • Незакрытый (исправленный, но проваливший проверку)
    • Отклоненный
    • Дубликат
    • Заново открытый
    • Временно приостановленный
    • Требующий пояснения
    • Не проявляющийся
    • “Не баг, а фича”

14 of 31

15 of 31

И другие характеристики

  • Зависимость
  • Автор
    • возможно, нужно несколько багтрекеров
  • Ответственный за исправление, ответственный за проверку
  • Временные параметры устранения дефекта
  • ...

16 of 31

Отладка

  • Процесс воспроизведения, локализации и устранения ошибок
  • Синтаксическая и семантическая отладка

17 of 31

Воспроизведение дефекта

  • Невоспроизводимую ошибку невозможно по-настоящему исправить
  • Может занять значительное время
    • стабильная воспроизводимость -- 90% исправления
  • Непредвзятость и внимательность
  • Минимизация числа шагов и автоматизация их
    • минимум один автотест

18 of 31

Локализация ошибки

  • Виды локализации
    • аналитический
    • экспериментальный
      • отладчик
      • трассировка, отладочная печать
      • профайлеры
  • Место проявления дефекта != место ошибки
  • Беспристрастность и “замыливание”
  • Формирование гипотезы
    • метод индукции (от частного к общему)
    • метод дедукции (от общего к частному)
    • обратное движение по алгоритму

19 of 31

Вредные советы по отладке

  • Cargo cult programming
  • Shotgun programming
  • Programming by accident
  • Least effort programming
  • Surgical programming

20 of 31

Исправление ошибки

  • Там, где есть одна ошибка, скорее всего есть и другие
  • Исправлена ли ошибка?
    • исправлена ли она нашим исправлением?
  • А та ли ошибка исправлена?
  • Не появились ли от этого другие ошибки?
  • Лечим болезнь, а не симптомы

21 of 31

"Плавающие баги"

  • Неинициализированные переменные
  • Ошибки синхронизации процессов/потоков
  • Программно-аппаратные ошибки
  • Различия между debug и release сборками

22 of 31

David J. Agans. Debugging: ...

  1. Understand the System
  2. Make It Fail
  3. Quit Thinking and Look
  4. Divide and Conquer
  5. Change One Thing at a Time
  6. Keep an Audit Trail
  7. Check the Plug
  8. Get a Fresh View
  9. If You Didn't Fix It, It Ain't Fixed

23 of 31

Хороший код

  • Надёжный
  • Эффективный
  • Понятный
  • Правильный
    • делает то, что должен
    • не делает того, чего не должен
    • не боится непредвиденных ситуаций
      • не делает предположений относительно окружения
      • готов всегда и ко всему
      • способен пережить некорректные ситуации

24 of 31

Защитное программирование

  • Применение анализа рисков в программировании
    • в противовес отладке преимущественно профилактический метод
  • Минусы
    • нужно писать больше кода, тратим больше времени
    • снижается эффективность кода
    • снижается читаемость кода
  • Плюсы
    • раннее предупреждение дефектов
      • защита от дураков и злоумышленников
    • сокращается время отладки
    • чуть менее эффективный, зато правильно работающий код
      • проверки можно убрать в release-версии

25 of 31

Общие принципы

  • Хороший стиль кодирования
  • Дисциплина, отсутствие спешки
    • “чем больше спешки, тем меньше скорость”
  • Недоверие ко всему
  • Ясность превыше краткости
  • Ясность превыше крутости
  • Максимальная закрытость
  • Отсутствие предупреждений компилятора
  • Использование статических анализаторов
  • Логирование и прочая диагностика
  • Проверка входных данных, аргументов методов и возвращаемых значений

26 of 31

Ограничения (assertions)

  • Назначение
    • проверка пред- и постусловий
    • проверка инвариантов
    • обработка ошибок для ожидаемых событий
    • assert’ы на события, которые происходить не должны
    • выполняемая документация
  • Полезные рекомендации
    • не помещайте выполняемый код внутрь assert’ов
    • напишите assert, а потом всё равно обработайте ошибки

27 of 31

Стратегия реакции на ошибку

  • Вернуть нейтральное значение
  • Заменить следующим корректным блоком данных
  • Вернуть тот же результат, что и в предыдущий раз
  • Подставить ближайшее допустимое значение
  • Сообщить об ошибке
  • Прекратить выполнение
  • Добавить запись в лог
  • Устойчивость vs Корректность

28 of 31

Изоляция ошибок

29 of 31

А как же release версия?

  • Проверяем существенные ошибки, несущественные игнорируем
  • Убираем код, завершающий выполнение программы
  • Регистрируем все ошибки
  • Делаем сообщения об ошибках понятными и дружелюбными :)

30 of 31

31 of 31

Вопросы к зачёту

  • Понятие ошибки, сбоя и дефекта ПО. Характеристики дефектов
  • Отладка ПО: воспроизведение дефектов
  • Отладка ПО: локализация ошибки
  • Отладка ПО: исправление ошибки
  • Понятие защитного программирования
  • Общие принципы защитного программирования
  • Стратегии реакции на ошибку в программе
  • Использование барьеров для изоляции ошибок в ПО