На работе предложили прочитать доклад по теме разработки. Вуаля! Далее расскажу:
-
Что такое кодревью?
-
Зачем нужен?
-
Что проверяем?
-
Типовые проблемы & решения
-
БОНУС!!! Результаты опроса: «Как вы делаете кодревью?»
Презентация доступна по ссылке.

Что такое кодревью?
Кодревью — это, внезапно, ревью кода. Разработчики пишут код, потом делают MR (merge request), другие его проверяют, устраняются замечания и заливают код в develop. Можно в принципе и сразу заливать в develop, но лучше чтобы ваше творчество кто-то перед этим посмотрел.
https://en.wikipedia.org/wiki/Code_review
https://en.wikipedia.org/wiki/Software_review
Зачем нужен кодревью?
Базовые вещи, которые обычно упоминают разработчики:
-
улучшить качество кода (стиль, понятность, поддержка)
-
найти ошибки
-
передать знания
-
повысить взаимную ответственность
-
предложить лучшее решение
-
проверить на соответствие гайдлайнам
Из доступной статистики нагуглил отчет «The State of Code Review 2017» (ссылка под VPN):

Что проверяем на кодревью?

Есть миллион статей по запросу «code review checklist»: 1 2 3 4.
Основной критерий: код должен быть вам понятным. «Пишите код так, как будто поддерживать его будет склонный к насилию психопат, который знает, где вы живёте».
В первую очередь обращайте внимание: небольшие методы с простым кодом; вынос констант, форматирование (длина строки, наименования), комментарии, освобождение ресурсов (using, unsubscribe), модификаторы доступа, проектные гайдлайны.
Круто если вы знаете код и можете подсказать, как его улучшить. Например, человек написал метод, а вы знаете похожий код в другом классе и лучше вынести общий функционал в базовый класс или утилиту.
Есть чеклисты для разных языков, например, ссылка для Питона.
https://en.wikipedia.org/wiki/Coding_best_practices
https://en.wikipedia.org/wiki/List_of_software_development_philosophies
Типовые проблемы & решения
|
1. Код с душком |
6. SOLID, DRY, KISS, YAGNI, BDUF, APO, Бритва Оккама |
|
2. Дизайн с душком |
7. Уязвимости в коде |
|
3. Рефакторинг |
8. Гниение кода |
|
4. Антипаттерны |
9. Тёмные паттерны |
|
5. Паттерны (шаблоны) проектирования |
10. Статический анализ кода |
Далее кратко рассмотрим каждый раздел без подробных комментариев. Детальнее см. ссылки в начале раздела.
Код с душком
https://ru.wikipedia.org/wiki/Код_с_запашком
|
Дублирование кода |
Ленивый класс |
|
Длинный метод |
Теоретическая общность |
|
Большой класс |
Временное поле |
|
Длинный список параметров |
Цепочка вызовов |
|
Расходящиеся модификации |
Посредник |
|
Стрельба дробью |
Неуместная близость |
|
Завистливые функции |
Альтернативные классы с разными интерфейсами |
|
Группы данных |
Неполнота библиотечного класса |
|
Одержимость элементарными типами |
Классы данных |
|
Операторы типа switch |
Отказ от наследства |
|
Параллельные иерархии наследования |
Комментарии |
2. Дизайн с душком
https://en.wikipedia.org/wiki/Design_smell
|
Отсутствие абстракции |
Нарушенная модуляризация |
|
Многогранная абстракция |
Недостаточная модульность |
|
Дублирующая абстракция |
Круговая зависимость |
|
Недостаточная инкапсуляция |
Нефакторизованная иерархия |
|
Неиспользованная инкапсуляция |
Нарушенная иерархия |
3. Рефакторинг
https://ru.wikipedia.org/wiki/Рефакторинг
|
Изменение сигнатуры метода |
Введение параметра |
|
Инкапсуляция поля |
Подъём метода |
|
Выделение класса |
Спуск метода |
|
Выделение интерфейса |
Переименование метода |
|
Выделение локальной переменной |
Перемещение метода |
|
Выделение метода |
Замена условного оператора полиморфизмом |
|
Генерализация типа |
Замена наследования делегированием |
|
Встраивание |
Замена кода типа подклассами |
|
Введение фабрики |
|
4. Антипаттерны
https://ru.wikipedia.org/wiki/Антипаттерн
|
разработки (в ООП, при написании кода, методологические, управления конфигурацией, разные) |
при повторном использовании кода |
|
архитектурные |
при человеко — компьютерном взаимодействии |
|
организационные |
сервис-ориентированной архитектуры |
|
среды |
для интеллектуальной информационной системы |
|
информационной безопасности |
|
Мои любимые антипаттерны:
-
Божественный объект (God object): Концентрация слишком большого количества функций в одной части системы (классе).
-
Ненужная сложность[en] (Accidental complexity): Внесение ненужной сложности в решение.
-
Преждевременная оптимизация (Premature optimization): Оптимизация на этапе проектирования сегмента кода, приводящая к его усложнению или искажению.
-
Грех преждевременной оптимизации. Лодочный якорь[en] (Boat anchor)[13]: Сохранение более не используемой части системы.
-
Волшебные числа (Magic numbers): Использование числовых констант без объяснения их смысла.
-
Программирование методом копирования-вставки (Copy and paste programming)[13]: Копирование (и лёгкая модификация) существующего кода вместо создания общих решений.
-
Изобретение колеса/велосипеда (Reinventing the wheel[13]): Создание с нуля вместо использования хорошего готового решения.
-
Большой комок грязи (Big ball of mud): Система с нераспознаваемой структурой.
-
Аналитический паралич (Analysis paralysis)[13]: неоправданно большие затраты на анализ и проектирование. Часто приводит к закрытию проекта до начала его реализации.
-
Раздутый улучшизм (Creeping featurism): добавление новых улучшений в ущерб суммарному качеству системы.
-
Синдром варёной лягушки (Boiling Frog Syndrome) — постепенные отрицательные изменения замечают, когда уже поздно.
https://blogs.oracle.com/javamagazine/post/five-code-review-antipatterns
5. Паттерны (шаблоны) проектирования
https://en.wikipedia.org/wiki/Software_design_pattern
https://ru.wikipedia.org/wiki/Шаблон_проектирования
|
Основные: |
Программирования гибких объектов |
|
Фундаментальные |
Выполнения задач |
|
Порождающие * |
Архитектуры системы |
|
Структурные * |
Enterprise |
|
Поведенческие * |
Проектирования потоковой обработки |
|
Частные: |
Проектирования распределенных систем |
|
Параллельного программирования |
Баз Данных |
|
Генерации объектов |
|
Три паттерна со звездочкой — это первые группы дизайн паттернов из книги Банды четырех. А далее уже придумали остальные. Как минимум, полезно их знать, т.к. неосознанно разработчики используют их в коде. Или предложить переделать код для соответствия паттерну. Хорошо бы знать эти шаблоны (для собеседований пригодится): Singleton, Observer, Template method, Prototype, Adapter.
6. Принципы SOLID, DRY, KISS, YAGNI, BDUF, APO, Бритва Оккама
Прекрасная статья на хабре о принципах и на вики о принципе Питера (проект слишком сложный для понимания даже его разработчикам).
|
YAGNI: You Aren’t Gonna Need It / Вам это не понадобится |
SOLID: |
|
DRY: Don’t Repeat Yourself / Не повторяйтесь |
S) Single-responsibility principle / Принцип единственной ответственности |
|
KISS: Keep It Simple, Stupid / Будь проще |
O) Open–closed principle / Принцип открытости-закрытости |
|
BDUF: Big Design Up Front / Глобальное проектирование прежде всего |
L) Liskov substitution principle / Принцип подстановки Лисков |
|
APO: Avoid Premature Optimization / Избегайте преждевременной оптимизации |
I) Interface segregation principle / Принцип разделения интерфейсов |
|
Бритва Оккама: не множить сущее без необходимости |
D) Dependency inversion principle / Принцип инверсии зависимостей |
7. Уязвимости в коде
Не менее прекрасная статья об уязвимостях на хабре и базовая статья на вики.
Обычно секьюрити аудит делают профи уже готового продукта, включая исходный код. Но и при кодревью должно насторожить, если передается значение текстового поля со страницы, из него склеивается SQL и напрямую выполняется запрос в БД, а не используется параметризованный запрос.
|
SQL-инъекции |
Санитайзинг опасного кода в HTML |
|
Пароли в открытом виде |
Закладки в код |
|
Незащищенность данных (html код, куки, API) |
Отсутствие или слабое шифрование |
|
Авторизация и аутентификация |
Манипуляции с логами |
|
XSS-внедрение вредоносного кода |
Небезопасная работа с куками |
|
Утечка информации |
|
8. Гниение кода: причины
https://en.wikipedia.org/wiki/Software_rot
|
Изменение окружающей среды |
Редко обновляемый код |
|
Одноразовость |
Интернет-соединение |
|
Неиспользованный код |
|
9. Тёмные паттерны
https://ru.wikipedia.org/wiki/Тёмные_паттерны
https://en.wikipedia.org/wiki/Dark_pattern
Это относится скорее к проектированию UX/UI (нельзя обманывать пользователя и выдавать одно за другое). Но если заметите такое в коде, стоит обратить внимание.
|
Вопросы с подвохом |
Скрытые платежи |
|
Подбрасывание товара |
Приманка с подменой |
|
Ловушка |
Упор на чувство вины |
|
«Сцукербергивание» личных данных |
Замаскированные баннеры |
|
Приёмы, не дающие адекватно сравнивать цены |
Принуждение к подписке |
|
Отвлечение внимания |
Спам друзьям |
10. Статический анализ кода
https://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis
Существует много инструментов для анализа кода: [фронт], а вот для [C#]. Как стандарт: Linter для Javascript/Typescript; SonarQube, ReSharper, Visual Studio для C#.

БОНУС!!! Результаты опроса: «Как вы делаете кодревью?»
Опрос доступен по ссылке.
|
1 из 7: ТОП-5 пользы от кодревью? |
5 из 7: Как вы проводите кодревью (как узнаете, делаете сразу или откладываете на вечер, как взаимодействуете с коммиттером, ваши лайфхаки и подходы). |
|
2 из 7: Что вы проверяете в процессе кодревью? |
6 из 7: Ваши предложения по улучшению кодревью? |
|
3 из 7: Сколько MR оцениваете в-среднем за день? |
7 из 7: Оставьте любую информацию (ваше имя, контакты и др) — СКРЫТО |
|
4 из 7: Сколько времени тратите на кодревью в-среднем за день? |
|
Скриншоты с результатами опроса












Презентация доступна по ссылке. Спасибо за внимание!
ссылка на оригинал статьи https://habr.com/ru/articles/741186/
Добавить комментарий