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

Automating code reviews

Automating code reviews

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