Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Road to SRE culture in a small company
Search
Sobolev Nikita
February 28, 2019
Programming
190
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Road to SRE culture in a small company
Sobolev Nikita
February 28, 2019
Transcript
81 slides
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
More Decks by Sobolev Nikita
See All by Sobolev Nikita
adaptix_slides.pdf
sobolevn
0
24
Зачем программисту Twitch (что?) – Алексей Гладких, PythoNN
sobolevn
0
21
MQTT глазами BE для работы с embedded устройствами – Сергей Макаров, PythoNN
sobolevn
0
16
Я в СКРЫТОМ ПУЛЕ: выстраиваем процессы в команде без тильта – Максим Мельников, PythoNN
sobolevn
0
29
Я твой fastapi msgspec'ом ускорял – Александр Целуйко, PythoNN
sobolevn
0
29
Будущее локальных LLM – Алексей Голобурдин, PythoNN
sobolevn
0
120
Чего вы не знали о строках в Python – Василий Рябов, PythoNN
sobolevn
0
270
ИИ-Агенты в каждый дом – Алексей Порядин, PythoNN
sobolevn
0
240
Внутреннее устройство сборки мусора в CPython 3.14+ – Сергей Мирянов, PythoNN
sobolevn
0
160
Other Decks in Programming
See All in Programming
React Native에 현대적인 빌드 도구 더하기: Rollipop 구현기
leegeunhyeok
0
180
プロジェクトコードをキレイキレイしよう!暗黙的な参照を読み解く静的解析
ostk0069
0
210
地方こそサーバーレス — 10年続けた、顔が見えるチームで確かな基盤を / Serverless Matters Most in Regional Areas — 10 Years of Building Reliable Foundations with Close-Knit Teams
seike460
PRO
1
450
自作Discord音声botをLambda MicroVMsに移行した話 / Migrating My Discord Voice Bot to Lambda MicroVMs
akihisaikeda
1
330
AI Augmentation Techniques with Liberty
ivargrimstad
1
480
조합이폭발하는디자인시스템이걸눈으로도테스트하라고요
giljongyu
0
750
ローカルLLMの基本と近況 2611 / Local LLM basics and recent situation 2611
kishida
2
440
高橋メソッドでCVE解説シリーズ 〜CVE-2026-112816〜
hakkadaikon
0
260
TanStack Vue Query と Pinia Colada から学ぶ非同期状態の型設計
aoshi
0
680
AI時代のIaC入門 〜なぜインフラをコードで管理したいのか?〜 / Introduction to IaC in the AI Era
akihisaikeda
6
1.5k
AIが生成したコードは読むべきか?抽象化設計とコードの品質保証 / abstraction-design-and-quality
minodriven
16
9.2k
SFCで実現する病院・医療システムの動的組み立て式UI
koukimiura
1
180
Featured
See All Featured
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Color Theory Basics | Prateek | Gurzu
gurzu
1
520
The agentic SEO stack - context over prompts
schlessera
0
1k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
600
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
60k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
560
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.8k
Marketing to machines
jonoalderson
1
6k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3.1k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
2
3.9k