Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Road to SRE culture in a small company
Search
Sobolev Nikita
February 28, 2019
Programming
1
150
Road to SRE culture in a small company
Sobolev Nikita
February 28, 2019
Tweet
Share
More Decks by Sobolev Nikita
See All by Sobolev Nikita
Чего вы не знали о строках в Python – Василий Рябов, PythoNN
sobolevn
0
160
ИИ-Агенты в каждый дом – Алексей Порядин, PythoNN
sobolevn
0
150
Внутреннее устройство сборки мусора в CPython 3.14+ – Сергей Мирянов, PythoNN
sobolevn
0
54
Генератор байткода и байткод генератора, Михаил Ефимов, PythoNN
sobolevn
0
44
Дотянуться до кремния. HighLoad Python: SIMD, GPU – Пётр Андреев, PythoNN
sobolevn
0
50
Проектирование — это когда чувствуешь, а не какие-то там циферки, Николай Хитров, PythoNN
sobolevn
0
73
Continuous profiling, Давид Джалаев, PythoNN
sobolevn
0
70
Михаил Гурбанов – Are you NATS? @ PythoNN
sobolevn
0
64
Дмитрий Бровкин – Почему исправление опечаток сложнее, чем кажется, и как мы с этим српавляемся @ PythoNN
sobolevn
0
41
Other Decks in Programming
See All in Programming
エンジニアとして高みを目指す、 利益を生み出す設計の考え方 / design-for-profit
minodriven
23
12k
Introducing ReActionView: A new ActionView-Compatible ERB Engine @ Kaigi on Rails 2025, Tokyo, Japan
marcoroth
3
960
大規模アプリのDIフレームワーク刷新戦略 ~過去最大規模の並行開発を止めずにアプリ全体に導入するまで~
mot_techtalk
0
410
デミカツ切り抜きで面倒くさいことはPythonにやらせよう
aokswork3
0
210
開発生産性を上げるための生成AI活用術
starfish719
2
230
GitHub Actions × AWS OIDC連携の仕組みと経緯を理解する
ota1022
0
250
The Flutter Journey of Building a Live Streaming App — With a Side of Performance Tuning
u503
1
100
ネイティブ製ガントチャートUIを作って学ぶUICollectionViewLayoutの威力
jrsaruo
0
140
Goで実践するドメイン駆動開発 AIと歩み始めた新規プロダクト開発の現在地
imkaoru
4
770
GraphQL×Railsアプリのデータベース負荷分散 - 月間3,000万人利用サービスを無停止で
koxya
1
1.2k
CSC305 Lecture 02
javiergs
PRO
1
260
CSC509 Lecture 04
javiergs
PRO
0
300
Featured
See All Featured
Building an army of robots
kneath
306
46k
How to train your dragon (web standard)
notwaldorf
96
6.3k
Into the Great Unknown - MozCon
thekraken
40
2.1k
Optimizing for Happiness
mojombo
379
70k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.1k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.5k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Large-scale JavaScript Application Architecture
addyosmani
514
110k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.6k
Balancing Empowerment & Direction
lara
4
680
Why Our Code Smells
bkeepers
PRO
339
57k
4 Signs Your Business is Dying
shpigford
185
22k
Transcript
None
Никита Соболев github.com/sobolevn
У меня пока нет SRE. Как?
None
wemake.services/meta Repeatable Software Development Process
None
1. Задача 2. Контроль 3. Деньги
1. Задача 2. Контроль 3. Деньги
None
None
None
None
None
Будет ли кто–то будет хоть что–то делать?
1. Задача 2. Контроль 3. Деньги
sobolevn.me/2018/12/blameless-environment Blameless environment
К технике
Автоматизируем? •Чем строже, тем лучше •Чем чаще, тем лучше •Чем
хрупче, тем лучше
CI / CD • Блокирующий • Полный, но быстрый •
Повторяемый
ХО ХО ХО
Типы тестов • Доктесты • Юнит • Интеграционные • E2E
• Snapshots • Property-based • Мутационные • Контрактные • Регрессионные • Ручные
Required test coverage of 100% reached. Total coverage: 100.00% ===========
8408 passed, 2 skipped in 50.33 seconds =============
github.com/wemake-services/wemake-python- styleguide Линтеры!
None
Есть файл? Нужен линтер!
dotenv-linter polint dennis eslint stylelint hadolint shellcheck yamllint flake8 layer-linter
xenon doc8 markdown-lint remark-lint mypy credo commitlint gherkin-lint
И плагины! vue json html pyi typescript flow jsdoc docker-compose
И конфигурация!
None
IaC • github.com/ansible/ansible • github.com/ansible/molecule • github.com/ansible/ansible-lint
Review Apps docs.gitlab.com/ee/ci/review_apps
Runtime окружение • Одно окружение: очевидный Docker • Одни версии:
не latest • Одни настройки: 12 factor app • Один способ запустить
Dependencies • Детерминированные • Запиненные • Безопасные • Обновляемые
None
Мониторим • Ресурсы • Логи • Ошибки
Три правила Sentry • Используйте • Выкиньте все лишнее •
Интегрируйте с таск–трекером
None
None
Поговорим про код
None
Версионируйте! • Обновляйте и валидируйте спеку • Тестируйте спеку! pypi.org/project/swagger-conformance
client = Client('your.app/swagger.json') strategy_factory = StrategyFactory() operation = client.api.endpoints['/pet']['put'] strategy
= operation.strategy(strategy_factory) print(strategy.example())
{ 'body':{ 'id':110339, 'name':'\U00052ea5\x9d\ua79d\x92\x13\U000f7c436', 'photoUrls':[ '\ua9d9\U0003fb3a\x13\U00025c1c\U000974a8\u3497\n', "\U000b38a4>*\u6683'\U0002cd8f\x0f\n" ], 'tags':[ {
'id':-172930, 'name':'\U000286df\u04dc\U00033563\U00055ba8\x89H' } ] } }
Используйте commitizen
None
None
None
Угомоните хаос • Логика должна быть логичной (DDD) • Пишите
спеки (BDD)
sobolevn.me/2019/02/engineering-guide-to- user-stories
pypi.org/project/pytest-bdd
layer-linter.readthedocs.io Логика – как хороший пирог
My Domain: containers: - accounts - webhooks layers: - usecases
- services - entities
Рефакторите • Рефакторите • Думайте над дизайном (TDD) pypi.org/project/pytest-testmon
None
Типизируйте очень строго!
_ValidUser = NewType('_ValidUser', User) def validate_user(user: User) -> _ValidUser: ...
def persist(user: _ValidUser) -> None: ...
Запросы aka IO
images = Image.objects.filter( category__name='Cats', ) for image in images: print(image.category.name)
Падать на N+1 github.com/jmcarp/nplusone
requests.get('https://my.api/v1/users')
None
Уберите лишние exception'ы github.com/dry-python/returns
def fetch_user_profile(user_id: int) -> 'User': response = requests.get(f'/users/{user_id}') response.raise_for_status() return
response.json()
Таски, очереди, треды, корутины, etc
Timeout'ы и лимиты!
OperationalError: database is locked DATABASES = { 'default': { 'ENGINE':
'django.backends.postgres', 'OPTIONS': { 'timeout': 20, } } }
На тесты тоже нужны таймауты pypi.org/project/pytest-timeout
Как жить? • Мониторинг • Healthchecks • Двойной кот–ревью
None
None
None
Backward incompatible migrations • Думайте головой • Используйте несколько миграций
• Тестируйте pypi.org/project/django-migration-linter
Лайфхаки
Используйте хорошие языки
Используйте нормальную ОС nixos.org
Отдайте инфраструктуру, не нужна она вам
Вините систему, а не людей
Вывод IO
Почитать • sobolevn.me/2019/02/python-exceptions-considered-an- antipattern • sobolevn.me/2019/02/engineering-guide-to-user-stories • engineering.skybettingandgaming.com/2016/02/02/how-we- release-so-frequently/ •
amberonrails.com/move-fast-dont-break-your-api/ • 2factor.net/ru/ • github.com/conventional-changelog/conventional- changelog
Попробовать! • github.com/wemake-services/wemake-django- template • github.com/wemake-services/wemake-vue-template
Присылайте идеи! github.com/sobolevn sobolevn.me