Practical microtasks

Practical microtasks

8c3a2ebf7c2b84f8390d99c7bf8c8a48?s=128

Sobolev Nikita

February 10, 2020
Tweet

Transcript

  1. Никита Соболев github.com/sobolevn

  2. sobolevn.me/talks/teamleadconf-2020 2

  3. >_ X Микротаски на практике

  4. Для кого?

  5. Наверное, есть некоторая проблема

  6. Наверное, есть некоторая проблема > Теперь я - тимлид, но

    почему мне так плохо?
  7. Наверное, есть некоторая проблема > Теперь я - тимлид, но

    почему мне так плохо? > Как вырасти из разработчика в тимлида и жить с этим дальше
  8. Наверное, есть некоторая проблема > Теперь я - тимлид, но

    почему мне так плохо? > Как вырасти из разработчика в тимлида и жить с этим дальше > Как я не усидел на двух стульях и нашел третий
  9. Наверное, есть некоторая проблема > Теперь я - тимлид, но

    почему мне так плохо? > Как вырасти из разработчика в тимлида и жить с этим дальше > Как я не усидел на двух стульях и нашел третий > Кто такие тимлиды, и какова их реальная задача?
  10. Мой доклад для тех, кто вынужден управлять. Но хочет остаться

    инженером!
  11. None
  12. О чем поговорим со страдающими инженерами?

  13. О чем поговорим со страдающими инженерами? > Про основу автоматизации

    управления
  14. О чем поговорим со страдающими инженерами? > Про основу автоматизации

    управления > Слухи, скандалы, сплетни и домыслы
  15. О чем поговорим со страдающими инженерами? > Про основу автоматизации

    управления > Слухи, скандалы, сплетни и домыслы > Реальные проблемы на пути
  16. О чем поговорим со страдающими инженерами? > Про основу автоматизации

    управления > Слухи, скандалы, сплетни и домыслы > Реальные проблемы на пути > Разбор типичных ситуаций
  17. >_ X Чем занимаются инженеры?

  18. Инженеры – автоматизируют задачи, которые мешают работе

  19. Но как нам автоматизировать управление?

  20. Чтобы автоматизировать, нужно измерить

  21. None
  22. None
  23. Задача на неделю

  24. Задача на неделю Задача на час

  25. Задача на неделю

  26. Задача на неделю > Может занять две. Или три. Или

    год
  27. Задача на неделю > Может занять две. Или три. Или

    год > Будет конфликтовать с другими
  28. Задача на неделю > Может занять две. Или три. Или

    год > Будет конфликтовать с другими > Может сожрать лишние ресурсы
  29. Задача на неделю > Может занять две. Или три. Или

    год > Будет конфликтовать с другими > Может сожрать лишние ресурсы > Непрозрачна: нужен наш контроль
  30. None
  31. Задача на час

  32. Задача на час > Маловероятно займет больше

  33. Задача на час > Маловероятно займет больше > Не будет

    конфликтовать с другими
  34. Задача на час > Маловероятно займет больше > Не будет

    конфликтовать с другими > Очень скромная по ресурсам
  35. Задача на час > Маловероятно займет больше > Не будет

    конфликтовать с другими > Очень скромная по ресурсам > Прозрачна: наш контроль не нужен
  36. 1 час

  37. Прогрессивная шкала оценки

  38. 15 30 60 120 Задачи в минутах

  39. Деревья задач

  40. Task Chains

  41. Task Chains > Последовательность

  42. Task Chains > Последовательность > Блокировки

  43. Task Chains > Последовательность > Блокировки > Приоритеты и сроки

  44. Task Chains > Последовательность > Блокировки > Приоритеты и сроки

    > До-дробление
  45. Task Chains > Последовательность > Блокировки > Приоритеты и сроки

    > До-дробление > Отмены
  46. Главный плюс = прозрачность

  47. 1 час

  48. Что можно делать с прозрачностью?

  49. Что можно делать с прозрачностью? > Мотивировать людей

  50. Что можно делать с прозрачностью? > Мотивировать людей > Собирать

    статистику и предсказывать
  51. Что можно делать с прозрачностью? > Мотивировать людей > Собирать

    статистику и предсказывать > Общаться с заказчиками
  52. Что можно делать с прозрачностью? > Мотивировать людей > Собирать

    статистику и предсказывать > Общаться с заказчиками > Настраивать нотификации и быть спокойным
  53. >_ X Слухи и сплетни

  54. Слух: работа с маленькими задачами требует супер крутых менеджеров

  55. Работать с маленькими задачами – очень просто

  56. Берешь и создаешь!

  57. Исполнитель может оценить задачу лучше всех

  58. Но может потребоваться тренировка

  59. None
  60. Слух: работа с маленькими задачами на самом деле микро- менеджмент

  61. Нет, обычно в работу человека никто не вмешивается. Но каждый

    ССЗБ
  62. Слух: я могу просидеть над часовой задачей много дней из-за

    неверной оценки
  63. Definition of Ready

  64. Definition of Done

  65. Задача может и должна заканчиваться не только кодом!

  66. Задача может и должна порождать новые задачи!

  67. Слух: значит я могу ничего не делать!

  68. Прозрачность + человек = страшная сила

  69. Что на самом деле сложно?

  70. Что на самом деле сложно? > Управлять большим количеством задач

  71. Что на самом деле сложно? > Управлять большим количеством задач

    > Гонять CI, делать ревью кода
  72. Что на самом деле сложно? > Управлять большим количеством задач

    > Гонять CI, делать ревью кода > Архитектура
  73. Что на самом деле сложно? > Управлять большим количеством задач

    > Гонять CI, делать ревью кода > Архитектура > Сохранять стабильность сборки
  74. Что на самом деле сложно? > Управлять большим количеством задач

    > Гонять CI, делать ревью кода > Архитектура > Сохранять стабильность сборки > Деплоить и откатывать, мониторить
  75. >_ X Управляем задачами

  76. 44

  77. 4,5 своих продукта, которые худо-бедно умеют управлять программистами. Но все

    еще плохо!
  78. Основные требования

  79. Основные требования > Удобно создавать Task Chains

  80. Основные требования > Удобно создавать Task Chains > Выставить свой

    статус
  81. Основные требования > Удобно создавать Task Chains > Выставить свой

    статус > Отказаться от задачи
  82. Основные требования > Удобно создавать Task Chains > Выставить свой

    статус > Отказаться от задачи > Настроить напоминалки
  83. Основные требования > Удобно создавать Task Chains > Выставить свой

    статус > Отказаться от задачи > Настроить напоминалки > Настроить таймауты
  84. None
  85. TODO != задача

  86. None
  87. И целая инфраструктура вокруг! github.com/wemake-services/kira

  88. Необходимый список ботов

  89. Необходимый список ботов > Бот для релизов

  90. Необходимый список ботов > Бот для релизов > Бот для

    rebase
  91. Необходимый список ботов > Бот для релизов > Бот для

    rebase > Бот для работы с задачами
  92. Необходимый список ботов > Бот для релизов > Бот для

    rebase > Бот для работы с задачами > Бот для управления программистами
  93. Необходимый список ботов > Бот для релизов > Бот для

    rebase > Бот для работы с задачами > Бот для управления программистами > Бот для ревью кода
  94. >_ X Гоняем CI все время

  95. None
  96. None
  97. None
  98. CI становится узким местом

  99. CI становится узким местом Время 0 10 20 30 40

    Июль
  100. CI становится узким местом Время 0 10 20 30 40

    Июль Время: 15 минут
  101. CI становится узким местом Время 0 10 20 30 40

    Июль Время: 15 минут Время: 15 минут
  102. CI становится узким местом Время 0 10 20 30 40

    Июль Время: 8 минут Время: 15 минут Время: 15 минут
  103. test: script: - docker-compose run --rm web test

  104. test: script: # Building test image and saving the cache:

    - docker pull "${IMAGE_NAME}:dev" - docker tag "${IMAGE_NAME}:dev" "${PROJECT_NAME}:dev" # The logic itself: - docker-compose build - docker-compose run --rm web test # Pushing back the result for future runs: - docker tag "${PROJECT_NAME}:dev" "${IMAGE_NAME}:dev" - docker push "${IMAGE_NAME}:dev"
  105. test: script: # Building test image and saving the cache:

    - docker pull "${IMAGE_NAME}:dev" - docker tag "${IMAGE_NAME}:dev" "${PROJECT_NAME}:dev" # The logic itself: - docker-compose build - docker-compose run --rm web test # Pushing back the result for future runs: - docker tag "${PROJECT_NAME}:dev" "${IMAGE_NAME}:dev" - docker push "${IMAGE_NAME}:dev"
  106. test: script: # Building test image and saving the cache:

    - docker pull "${IMAGE_NAME}:dev" - docker tag "${IMAGE_NAME}:dev" "${PROJECT_NAME}:dev" # The logic itself: - docker-compose build - docker-compose run --rm web test # Pushing back the result for future runs: - docker tag "${PROJECT_NAME}:dev" "${IMAGE_NAME}:dev" - docker push "${IMAGE_NAME}:dev"
  107. test: script: # Building test image and saving the cache:

    - docker pull "${IMAGE_NAME}:dev" - docker tag "${IMAGE_NAME}:dev" "${PROJECT_NAME}:dev" # The logic itself: - docker-compose build - docker-compose run --rm web test # Pushing back the result for future runs: - docker tag "${PROJECT_NAME}:dev" "${IMAGE_NAME}:dev" - docker push "${IMAGE_NAME}:dev"
  108. release-image: image: wemakeservices/kira-release:latest script: - docker push "${IMAGE_NAME}:latest"

  109. release-image: image: wemakeservices/kira-release:latest before_script: - docker pull "${IMAGE_NAME}:latest" - docker

    pull "${IMAGE_NAME}:dev" - docker build -t "${IMAGE_NAME}:latest" --cache-from="${IMAGE_NAME}:latest" --cache-from="${IMAGE_NAME}:dev" --build-arg DJANGO_ENV=production -f docker/django/Dockerfile . script: - docker push "${IMAGE_NAME}:latest"
  110. release-image: image: wemakeservices/kira-release:latest before_script: - docker pull "${IMAGE_NAME}:latest" - docker

    pull "${IMAGE_NAME}:dev" - docker build -t "${IMAGE_NAME}:latest" --cache-from="${IMAGE_NAME}:latest" --cache-from="${IMAGE_NAME}:dev" --build-arg DJANGO_ENV=production -f docker/django/Dockerfile . script: - docker push "${IMAGE_NAME}:latest"
  111. release-image: image: wemakeservices/kira-release:latest before_script: - docker pull "${IMAGE_NAME}:latest" - docker

    pull "${IMAGE_NAME}:dev" - docker build -t "${IMAGE_NAME}:latest" --cache-from="${IMAGE_NAME}:latest" --cache-from="${IMAGE_NAME}:dev" --build-arg DJANGO_ENV=production -f docker/django/Dockerfile . script: - docker push "${IMAGE_NAME}:latest"
  112. release-image: image: wemakeservices/kira-release:latest before_script: - docker pull "${IMAGE_NAME}:latest" - docker

    pull "${IMAGE_NAME}:dev" - docker build -t "${IMAGE_NAME}:latest" --cache-from="${IMAGE_NAME}:latest" --cache-from="${IMAGE_NAME}:dev" --build-arg DJANGO_ENV=production -f docker/django/Dockerfile . script: - docker push "${IMAGE_NAME}:latest"
  113. None
  114. None
  115. None
  116. Уже лучше

  117. Уже лучше Время 0 10 20 30 40 Было Стало

  118. Уже лучше Время 0 10 20 30 40 Было Стало

    Время: 15 минут Время: 15 минут
  119. Уже лучше Время 0 10 20 30 40 Было Стало

    Время: 4 минут Время: 15 минут Время: 15 минут Время: 15 минут
  120. Уже лучше Время 0 10 20 30 40 Было Стало

    Время: 5 минут Время: 8 минут Время: 4 минут Время: 15 минут Время: 15 минут Время: 15 минут
  121. А что с Code Review?

  122. Он служит для контроля корректности автоматики

  123. Код-ревью за 15 минут или меньше 69 sobolevn.me/talks/dumpconf-2019

  124. Расходы против выгоды

  125. >_ X Архитектура

  126. Требования:

  127. Требования: > Атомарность

  128. Требования: > Атомарность > Гибкость и простота

  129. Требования: > Атомарность > Гибкость и простота > Одна причина

    для редактирования
  130. github.com/dry-python

  131. Enforcing Single Responsibility Principle in Python sobolevn.me/2019/03/enforcing-srp

  132. >_ X Стабильность сборки

  133. Trunk Based Development trunkbaseddevelopment.com

  134. None
  135. None
  136. + squash-rebase only

  137. Compatible migrations github.com/3YOURMIND/django-migration-linter

  138. None
  139. Что проверяем?

  140. Что проверяем? > Удаление полей

  141. Что проверяем? > Удаление полей > Переименование полей

  142. Что проверяем? > Удаление полей > Переименование полей > Создание

    новых non-null полей
  143. Compatible tasks

  144. @celery.task() def send_email(email: str) -> None: ...

  145. @celery.task() def send_email(email: str, message: str) -> None: ...

  146. @celery.task() def send_email(email: str, message: str) -> None: ...

  147. Compatible platform

  148. Хорошие абстракции

  149. Feature toggles

  150. Legacy-first tools

  151. github.com/life4/flakehell 91

  152. >_ X Деплой, откаты, мониторинг

  153. None
  154. None
  155. А у вас молоко убежало!

  156. None
  157. >_ X А теперь примеры!

  158. None
  159. Примеры из реальной жизни github.com/wemake-services/wemake-python-styleguide

  160. Простой баг или фича > Сломалось: github.com/wemake- services/wemake-python-styleguide/ issues/1127 >

    Новинка: github.com/wemake- services/wemake-python-styleguide/ issues/1111
  161. Новая фича на несколько шагов

  162. Добавляем поддержку python3.8 в большой OpenSource продукт github.com/wemake-services/wemake-python-styleguide/milestone/10

  163. class NodeVisitor(object): def visit_Num(self, node: ast.Num) -> None: ... def

    visit_Bytes(self, node: ast.Bytes) -> None: ... def visit_Str(self, node: ast.Str) -> None: ... def visit_NameConstant(self, node) -> None: ...
  164. class NodeVisitor(object): def visit_Constant(self, node: ast.Constant) -> None: ...

  165. Подзадачи 105

  166. Подзадачи 2. Новый умный слой абстракции: github.com/wemake- services/wemake-python-styleguide/issues/1135 105

  167. Подзадачи 2. Новый умный слой абстракции: github.com/wemake- services/wemake-python-styleguide/issues/1135 1. Новая

    методика подсчета покрытия: github.com/ wemake-services/coverage-conditional-plugin 105
  168. Подзадачи 2. Новый умный слой абстракции: github.com/wemake- services/wemake-python-styleguide/issues/1135 1. Новая

    методика подсчета покрытия: github.com/ wemake-services/coverage-conditional-plugin 3. Постепенный рефакторинг: https://github.com/ wemake-services/wemake-python-styleguide/issues/ 1141 105
  169. Новое большое бизнес требование к старой большой логике

  170. if user := get_user(): greet(user)

  171. Добавляем понемногу github.com/wemake-services/wemake-python-styleguide/issues/1137

  172. Проводим исследования > Понять, какие зависимости можно удалить: github.com/wemake-services/ wemake-python-styleguide/issues/1139

    > Добавить полезное из другой библиотеки: github.com/wemake- services/wemake-python-styleguide/ issues/422 > Проверить, что зависимости работают с python3.8: github.com/wemake-services/ wemake-python-styleguide/issues/1138
  173. Architecture Decision Record

  174. None
  175. None
  176. >_ X Выводы

  177. Если вы не хотите управлять (но надо), перекладывайте все на

    автоматику
  178. Чтобы автоматизировать управление, нужна единица работы

  179. Маленькие задачи – ваши лучшие друзья

  180. Полезные ссылки > Microtasks at GitHub: dev.to/mscccc/ how-we-use-ship-small-to-rapidly- build-new-features-at-github-5cl9 >

    Microtasks at Google: google.github.io/eng-practices/ review/developer/small-cls.html > Program development by stepwise refinement: dl.acm.org/doi/ 10.1145/362575.362577
  181. t.me/ opensource_findings 118

  182. sobolevn.me Вопросы? github.com/sobolevn