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

Недавно я разместил в своем Твиттере небольшую иллюстрацию, которая проливает свет на эту проблему и дает наводку, на каких аспектах следует сосредоточиться прежде всего, и назвал ее «Пирамида инспекции кода». Ее назначение – помочь держать в приоритете составляющие инспекции кода, имеющие первостепенную важность (по крайней мере, на мой взгляд), а так же указать, какие составляющие можно и нужно автоматизировать.

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




В нижней части располагаются аспекты, которые сложнее будет корректировать в будущем, в верхней части – те, которые корректировать будет проще. Сосредоточить усилия лучше на трех нижних ярусах. Два верхних яруса подходят для автоматизации.

Ярусы перечисляются от верхнего к нижнему.

Стиль


Какие вопросы задавать:

  • Применяется ли принятый для проекта стиль форматирования?
  • Соблюдаются ли договоренности относительно названий?
  • Следует ли код принципу DRY (Don’t Repeat Yourself – Не повторяйтесь)?
  • Достаточно ли «читабелен» код (с точки зрения длины методов и так далее)?

Тесты


Какие вопросы задавать:

  • Благополучно ли пройдены все тесты?
  • В достаточной ли степени протестирована новая функциональность?
  • Протестированы ли граничные случаи?
  • Применяется ли модульное тестирование по возможности и интеграционное тестирование при необходимости?
  • Представлено ли нефункциональное тестирование (например, производительности)?

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


Какие вопросы задавать:

  • Достаточно ли документации для новой функциональности?
  • Все ли актуальные документы представлены (README, API-документация, руководство пользователя, справочная документация и так далее)?
  • Все ли документы доступны для понимания – без опечаток и серьезных грамматических ошибок?

Семантика имплементации


Какие вопросы задавать:

  • Соответствует ли семантика исходным требованиям?
  • Нет ли ошибок в логике?
  • Нет ли переусложненности?
  • Как обстоят дела с надежностью (нет ли проблем с конкурентностью, налажена ли должным образом обработка ошибок)?
  • Как обстоят дела с производительностью?
  • Как обстоят дела с безопасностью (в плане внедрения SQL-кода и других проблем)?
  • Как обстоят дела с отслеживанием (например, метрики, логирование, трассировка)?
  • Выполняют ли свежедобавленные зависимости свою работу? Всё ли у них в порядке с лицензиями?

Семантика API


Какие вопросы задавать:

  • Размер API достаточен и в то же время не избыточен?
  • Каждая операция выполняется одним способом, а не несколькими?
  • Выдерживается ли согласованность и принцип «минимум сюрпризов»?
  • Четко ли разделены внутренний и внешний API, не подтекает ли внутренний во внешний?
  • Нет ли каких-то изменений, вызывающих неисправности в частях приложения, обращенных к пользователю (классы API, конфигурация, форматы логов и так далее)?
  • Можно ли в целом назвать API полезным и не слишком узконаправленным?

FAQ


А почему пирамида?

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

Так это же треугольник!

Вам так только кажется. Это пирамида, вид сбоку.

Какими инструментами ты пользовался, когда создавал это изображение?

Excalidraw.

Комментарии (6)


  1. artem_larin
    06.05.2022 10:48
    +1

    Раскройте смысл это мантры:

    >>Применяется ли модульное тестирование по возможности и интеграционное тестирование при необходимости?


  1. Pab10
    06.05.2022 10:51

    Надо скинуть нашему лиду. Вдруг дойдет что код можно читать и на код стайле мир клином не сошелся. Хотя исправление комментов и переносы строк генерируют так много активности в гитхабе... Не, не дойдет ;[


    1. kruglikov94
      06.05.2022 14:15

      Вы можете использовать автоматическое форматирование. Один раз настройте и пишите сразу с включенным автоформаттером.


  1. amarao
    06.05.2022 11:46

    Я надеялся на хорошую пирамиду. Увы, оно странное (что такое API semantics как базовый слой? А если я пишу не api сервер?).

    Самые сложные вопросы ревью, ответы на которые я пытаюсь понять:

    • Какие связи привносятся в проект?

    • Конфликтует ли предложенный подход с уже существующими в проекте? Есть ли существующая подсистема, которую можно переиспользовать?

    • Как это будет ломаться? Будет ли ошибка локализована или заденет неожиданные компоненты?

    • Достаточно ли хорошо обобщена задача? Нет ли тривиальных изменений, которые бы сделали решение более универсальным без увеличения сложности?

    • Как называются новые сущности? Есть ли у них название? Понятно ли оно?


    1. AnthonyMikh
      06.05.2022 19:41

      • Можно это переписать на Rust?


      1. amarao
        07.05.2022 10:17

        Приносить Rust в проект/компанию, которая не коммитилась - создавать проблемы с кадрами. Порог вхождения большой.