Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Automating code reviews

Automating code reviews

Avatar for Sobolev Nikita

Sobolev Nikita

November 08, 2019
Tweet

More Decks by Sobolev Nikita

Other Decks in Programming

Transcript

  1. !2

  2. Нет Да Как критиковать? • Критиковать код • Предлагать решение

    • Критиковать людей • Высказывать претензии 4
  3. Нет Да Как критиковать? • Критиковать код • Предлагать решение

    • Критиковать людей • Высказывать претензии 5
  4. Нет Да Как критиковать? • Критиковать код • Предлагать решение

    • Критиковать людей • Высказывать претензии 6
  5. Нет Да Как критиковать? • Критиковать код • Предлагать решение

    • Критиковать людей • Высказывать претензии 7
  6. Нет Да Как критиковать? • Критиковать код • Предлагать решение

    • Критиковать людей • Высказывать претензии 8
  7. Нет Да Как критиковать? • Критиковать код • Предлагать решения

    • Критиковать людей • Высказывать претензии 9
  8. Checklist: > Удостоверьтесь, что вы строите инклюзивную культуру > Слушайте

    мнения всех людей > Мотивируйте свою команду 10
  9. Checklist: > Удостоверьтесь, что вы строите инклюзивную культуру > Слушайте

    мнения всех людей > Мотивируйте свою команду > Учитесь коммуникации 10
  10. Checklist: > Удостоверьтесь, что вы строите инклюзивную культуру > Слушайте

    мнения всех людей > Мотивируйте свою команду > Учитесь коммуникации > Be empathetic! 10
  11. 13

  12. 26

  13. Цели код ревью > Контроль выполнения > Контроль качества кода

    > Неповторение грабель > Ревью архитектуры 27
  14. Цели код ревью > Контроль выполнения > Контроль качества кода

    > Неповторение грабель > Ревью архитектуры > Ознакомление и обучение 27
  15. Цели код ревью > Контроль качества кода > Контроль выполнения

    > Неповторение грабель > Ревью архитектуры > Ознакомление и обучение 28
  16. Checklist: > CONTRIBUTING.md > Developer Docs > Architecture Decision Records

    > Wiki > Issue and PR database > Human-readable tests 37
  17. Проблемы ревью архитектуры пост-фактум > Долго ждать > Долго и

    дорого переделывать > Участвует один человек 41
  18. [importlinter] root_package = django_project include_external_packages = True [importlinter:contract:layers] name =

    Layered architecture of our linter type = layers containers = django_project layers = urls views forms models logic 46
  19. [importlinter] root_package = django_project include_external_packages = True [importlinter:contract:layers] name =

    Layered architecture of our linter type = layers containers = django_project layers = urls views forms models logic 47
  20. [importlinter] root_package = django_project include_external_packages = True [importlinter:contract:layers] name =

    Layered architecture of our linter type = layers containers = django_project layers = urls views forms models logic 48
  21. [importlinter] root_package = django_project include_external_packages = True [importlinter:contract:layers] name =

    Layered architecture of our linter type = layers containers = django_project layers = urls views forms models logic 49
  22. [importlinter] root_package = django_project include_external_packages = True [importlinter:contract:layers] name =

    Layered architecture of our linter type = layers containers = django_project layers = urls views forms models logic 50
  23. [importlinter:contract:violation-independence] name = Independence contract for violations type = independence

    modules = django_project.billing_app django_project.auth_app django_project.orders_app django_project.statistics_app 52
  24. [importlinter:contract:violation-independence] name = Independence contract for violations type = independence

    modules = django_project.billing_app django_project.auth_app django_project.orders_app django_project.statistics_app 53
  25. [importlinter:contract:violation-independence] name = Independence contract for violations type = independence

    modules = django_project.billing_app django_project.auth_app django_project.orders_app django_project.statistics_app 54
  26. [importlinter:contract:api-restrictions] name = Forbids to import anything from dependencies type

    = forbidden source_modules = django_project.logic forbidden_modules = # Important direct and indirect dependencies: django rest_framework 56
  27. [importlinter:contract:api-restrictions] name = Forbids to import anything from dependencies type

    = forbidden source_modules = django_project.logic forbidden_modules = # Important direct and indirect dependencies: django rest_framework 57
  28. [importlinter:contract:api-restrictions] name = Forbids to import anything from dependencies type

    = forbidden source_modules = django_project.logic forbidden_modules = # Important direct and indirect dependencies: django rest_framework 58
  29. [importlinter:contract:api-restrictions] name = Forbids to import anything from dependencies type

    = forbidden source_modules = django_project.logic forbidden_modules = # Important direct and indirect dependencies: django rest_framework 59
  30. def test_regression71(): """ Testing that local variables are counted correctly.

    Regression test for #74. See: wemake-services/wemake-python-styleguide/issues/74 Regression test for #247 See: wemake-services/wemake-python-styleguide/issues/247 """ assert ... 66
  31. !68

  32. !69

  33. !70

  34. Упади, все плохо import { danger, fail } from 'danger'

    if (danger.github.pr.base.ref !== 'master') { fail('We only accept PRs to `master` branch.') } if (!danger.github.pr.rebaseable) { fail('Looks like your PR cannot be merged, please fix it: reopen or rebase.') } 71
  35. Не падай, но скажи import { danger, warn } from

    'danger' if (danger.github.pr.body.length < 50) { warn('Please provide a summary, at least 50 chars') } if (!danger.github.pr.body.match(/closes #\d+/i)) { warn('MR does not close any issues. Should close one') } 72
  36. !73

  37. !77

  38. !78

  39. !79

  40. !80

  41. !80

  42. 84

  43. 84

  44. !85

  45. >_ X Контроль качества 87 Том Круз смеется над теми

    Кто думает, что может проверять качество кода глазами
  46. Проблемы контроля качества > Люди не умеют писать код >

    Сложность накапливается незаметно 88
  47. Проблемы контроля качества > Люди не умеют писать код >

    Сложность накапливается незаметно > Метрики скрыты 88
  48. Проблемы контроля качества > Люди не умеют писать код >

    Сложность накапливается незаметно > Метрики скрыты > Исправлять долго 88
  49. !91

  50. 95

  51. 96

  52. Процесс: > Пишем простые блоки кода > В какой-то момент

    сложность переполняется > Рефакторим 97
  53. Проблемы контроля выполнения > Я не умею запускать код в

    мозгу > Я не знаю, что нужно клиенту 100
  54. Проблемы контроля выполнения > Я не умею запускать код в

    мозгу > Я не знаю, что нужно клиенту > Не все ньюансы понятны из кода 100
  55. Цели код ревью > Контроль выполнения > Контроль качества кода

    > Неповторение грабель > Ревью архитектуры 109
  56. Цели код ревью > Контроль выполнения > Контроль качества кода

    > Неповторение грабель > Ревью архитектуры > Ознакомление и обучение 109
  57. Цели код ревью > Контроль качества кода > Контроль выполнения

    > Неповторение грабель > Ревью архитектуры > Ознакомление и обучение 110
  58. Инструменты код ревью > Маленькие задачи > Review Apps >

    Суровый статический анализ > Строгие архитектурные правила 112
  59. Инструменты код ревью > Маленькие задачи > Review Apps >

    Суровый статический анализ > Строгие архитектурные правила > Глаза человека 112
  60. Что осталось за кадром? > Обучение ревью > Двойной ревью:

    CODEOWNERS vs случайный человек > Ревью ревью 119
  61. Что осталось за кадром? > Обучение ревью > Двойной ревью:

    CODEOWNERS vs случайный человек > Ревью ревью > Мотивация 119
  62. Что осталось за кадром? > Обучение ревью > Двойной ревью:

    CODEOWNERS vs случайный человек > Ревью ревью > Мотивация > Аудиты 119
  63. Что осталось за кадром? > Обучение ревью > Двойной ревью:

    CODEOWNERS vs случайный человек > Ревью ревью > Мотивация > Аудиты > Создание маленьких задач 119