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

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

Количественный

Это вещи, которые можно измерить или сравнить с чем-то объективным (число, как в покрытии кода, ответ «да/нет», четко определенные передовые практики в отрасли, соглашения о кодировании, согласованные командой и т. д.).

  • Делает ли код то, что должен делать? — это легко проверить, просмотрев заявку в вашем инструменте управления заявками. Убедитесь, что вы четко понимаете требование и критерии приемки, прежде чем смотреть код.
  • Проверено ли это? — несмотря на некоторую субъективность в отношении модульных или интеграционных тестов, тестирования фиктивных и реальных данных, вы можете получить "уровень комфорта" тестирования, посмотрев на испытаниях. Всегда сначала ищите тесты, прежде чем смотреть код.
  • NFR (нефункциональные требования) — хорошо ли он работает, безопасен ли он, достаточно ли журналов и мониторинга? Есть много очевидных ловушек, которые вы можете найти — вложенные циклы, ненужные итерации, слишком много вызовов ввода-вывода, запросы без предложений where или неправильные соединения — все это можно проверить невооруженным глазом, не запуская код. Если у вас есть автоматизированные тесты производительности, вы, вероятно, входите в 1% лучших компаний.
  • Делает ли он одну и только одну вещь? бывают случаи, когда люди добавляют две незначительные ошибки в один PR, потому что это удобно. В достаточно небольшой кодовой базе и достаточно небольшой команде это может быть нормально. При этом есть несколько неудобств — увеличивает когнитивную нагрузку рецензента, усложняет автоматизацию закрытия заявок, в одном развертывании есть две вещи для тестирования, и если один тест проходит, а другой имеет проблемы, нам придется повторно посетить объединенный Пиаритесь и ищите отдельные коммиты (надеюсь, они охватываются 2-мя коммитами).

Качественный

Это вещи, которые субъективны и не имеют четкого правильного/неправильного.

  • Действительно ли нам нужно делать это таким образом? Есть ли какой-либо другой способ удовлетворить потребности пользователя и, желательно, без написания кода — путем разработки, устранения взаимодействия, которое могло бы привести к ошибке, предварительная проверка ввода формы?
  • Соответствует ли код/дизайн тому, что мы уже сделали или согласовали ранее? Соглашения об именах, шаблоны проектирования, правила, подобные eslint, объем тестирования, вид тестирования, документация?
  • Поддается ли это сопровождению? Сопровождаемость частично зависит от удобочитаемости, а другая — от расширяемости.
  • Достаточно ли это просто, чтобы люди могли понять его без объяснений? Организация кода, простые для понимания имена переменных, упрощенная логика, отсутствие кода черной магии или «не надо». изменить эту логику.
  • Можно ли это импровизировать итеративно или это попытка сделать все правильно с первого раза?Это сложно, так как вы просматриваете PR только после того, как он отправлен, на этом этапе разработчик уже, возможно, потратил много времени. Это полезно в упражнении по взаимному программированию.
  • Может ли этот код использоваться другим разработчиком для выполнения того, для чего он не предназначен? Сделали ли мы его достаточно простым, чтобы он выполнял только одну функцию? Если мы перегружаемся в первую очередь, кто-то перегрузит его снова через несколько недель, и вскоре вы получите чудовище, которое трудно даже рефакторить.

В конце концов, я верю в два руководящих принципа (помимо того, что обычно считается хорошим кодом):

  • Лучший код — это вообще отсутствие кода — https://blog.codinghorror.com/the-best-code-is-no-code-at-all/ — Джефф Этвуд
  • Сложность сложной части кода со временем возрастает в геометрической прогрессии — возможно, это я так говорю. Каждый раз, когда я вижу действительно сложный фрагмент кода, несколько месяцев спустя вокруг него происходит так много всего, что его становится безумно трудно отлаживать/рефакторить.

Обязательная оговорка: как и любое обобщение, это субъективная и моя точка зрения. Могут быть обстоятельства, когда я могу выбросить их из окна и что-то объединить. Но это для другого разговора.