Pytex — Школа Python разработки
870 subscribers
48 photos
1 video
20 links
Онлайн-школа Python разработки Pytex
https://pytex.school
Download Telegram
Всем привет! На связи Артём Шумейко👋🏻

Я 3 года преподаю Python, еще дольше снимаю обучающие видеоролики на YouTube, и за это время вокруг меня собрались сильные, увлечённые своим делом ребята, которые впоследствии стали частью моей команды.

В том числе благодаря этим людям, со временем мой небольшой курс вырос в полноценную школу подготовки сильных инженеров на Python, в которой программирование объясняют "простым языком и на понятных примерах".

Я запустил этот канал, чтобы рассказывать о школе, делиться опытом, новостями и полезными материалами по Python. Здесь будет место для практики, полезной информации и историй наших выпускников.

Спасибо за поддержку. Дальше будет ещё интереснее.
🔥3996🎉2👍1
Большинство собеседований, особенно в крупных компаниях, включают хотя бы один вопрос, связанный с ООП, для специалистов любого направления, и неважно, кто ты: джун, мидл или сеньор.

Через вопросы по этой теме оценивают, как разработчик думает о системе:
• как структурировать модули
• как управлять зависимостями
• какие принципы из SOLID он применяет на практике

Хотя Python позволяет использовать различные парадигмы программирования, архитектура большинства реальных проектов строится именно на ООП.

Многие разработчики видят функциональный подход в документации библиотек и фреймворков (FastAPI, SQLAlchemy, requests) и думают, что это единственный вариант реализации кода. Но такие примеры пишутся для упрощения, чтобы продемонстрировать работу части приложения или какую-то отдельную идею.

Крупные проекты, где важны надёжность и масштабируемость, всегда строятся на принципах ООП.
И, несмотря на то, что ООП — один из базовых инструментов Python-разработчика, именно он чаще всего вызывает вопросы.

Какие темы в ООП вызывают у тебя трудности? О чем ты много читал, но до сих пор не понял?
👍13🔥72
Базовая задача по ООП — проверь себя

Такого типа задачи часто встречаются на собеседованиях на Python-разработчика. Попробуй разобраться, какие значения b_.check_activity() выведутся на экран? А может, вообще выдаст ошибку?
class ClientA:

is_active = False

def check_activity(self) -> bool:
return self.is_active


class ClientB(ClientA):

def __init__(self, is_active: bool):
self.is_active = is_active

a_ = ClientA()
b_ = ClientB(is_active=True)
print(b_.check_activity())
a_.is_active = False
print(b_.check_activity())
b_.is_active = False
print(b_.check_activity())

Выбирай свой ответ ниже👇🏻

🔥 – решил верно
👍 – решил неверно
🔥46👍231
48% участников ошиблись во вчерашней задаче по ООП

Правильный ответ:
True  
True
False

Разберем, почему так👆🏻
is_active в ClientA — это атрибут класса, а при создании ClientB через __init__ мы создаём одноимённый атрибут экземпляра. Когда мы обращаемся к self.is_active, Python сначала ищет в экземпляре, а уже потом — в классе. Поэтому изменения в a_.is_active (атрибуте класса) не влияют на b_, у которого уже есть собственный атрибут.

Сегодня вечером выложим ещё одну задачу, она будет не менее интересная
17👍12
Новая задача по ООП — проверь себя

Сегодня задача посложнее. Попробуй разобраться, что выведет код?
class Collection:

def __init__(self, *items):
self.collection = []
for item in items:
if isinstance(item, (list, tuple)):
self.collection.extend(item)
else:
self.collection.append(item)

def map(self, fn: Callable) -> Self:
return self.__class__(*map(fn, self.collection))

def filter(self, fn: Callable) -> Self:
return self.__class__(*[x for x in self.collection if fn(x)])

def __repr__(self) -> str:
return f"{self.__class__.__name__}:{self.collection}"


coll = Collection(1, 2, -3, 4, 5)
result = coll.map(lambda x: x * 2).filter(lambda x: x >= 6)
print(result)

Выбирай свой ответ ниже👇🏻

👍 – решил
🤝 – не решил
👍23🤝19
🥳Релиз нового курса «Продвинутое ООП в Python»

Мы собрали в нём всё, что действительно нужно, чтобы мыслить архитектурно: понимать, как проектировать систему, выстраивать зависимости и писать код, который не ломается при первых изменениях.

В программе курса — полный набор тем, которые нужны разработчику, чтобы уверенно работать с объектно-ориентированным подходом в Python:
• работа с атрибутами и методами
• свойства объектов (@property)
• использование декораторов @classmethod и @staticmethod
• магические методы и переопределение поведения объектов
• итерируемые объекты и последовательности
• контекстные менеджеры и декоратор @contextmanager
• дескрипторы
• наследование, композиция и полиморфизм
• использование __slots__ для оптимизации классов
Enum
• декораторы классов
• модуль dataclasses


Отдельные блоки посвящены архитектурным принципам:
SOLID
• паттерны проектирования
• абстрактные классы
• интерфейсы и композиция

🔥В курсе предусмотрено создание 2 проектов: по базе ООП и по SOLID.

После курса ты будешь писать производительный код на Python так, чтобы он был масштабируем и удобен для других разработчиков.

Смотри программу на сайте и начинай обучение.
6👍6🔥6🎉2
Совет от нашего наставника, который должен услышать каждый начинающий разработчик

На курсе Backend-разработки на Python у нас есть замечательный наставник — Полина. Она делится советом со всеми начинающими разработчиками:

Мониторьте бесплатные митапы и IT-мероприятия от крупных компаний, и обязательно ходите на них оффлайн.

Не спорим, что онлайн удобно, но присутствие оффлайн намного эффективнее и вот почему:

Нетворкинг, который открывает двери, поскольку на мероприятиях можно послушать интересные доклады опытных специалистов, узнать о проблемах в реальных проектах, а также подойти и познакомиться, задать любые вопросы, даже если это кажется страшным. Полина делится своим опытом:
Буквально на прошлой неделе была на митапе PostgreSQL в Екатеринбурге. После официальной части осталась на неформальную, и в итоге завязала разговор с разработчиками из Тинькофф и ЯндексCloud. Тут чуть информации, там, и в конце вечера меня уже добавили в закрытый телеграм-канал с анонсами будущих митапов в городе. Я туда бы никогда сама не попала.


Прямой контакт с HR-ами из бигтеха. Иногда один факт, что ты проявил интерес, уже работает в твою пользу.
Однажды я записалась на конференцию Сбербанка, но прийти не смогла. Через пару дней мне написала HR и спросила, ищу ли я работу, и можно ли ей отправить моё резюме коллегам. И все просто потому что я была в списке зарегистрированных.


Скрытый бонус
После таких мероприятий остается мерч, который приятно использовать. Например, на этом митапе подарили книжку😉


Если ты хочешь обучиться backend-разработке на Python, получать офферы и расти по карьере, сейчас самое время воспользоваться скидками черной пятницы и начать обучение.
👍54🔥2🎉1
Изменения рынка труда Python разработки за полгода

Мы каждые полгода смотрим на актуальность основных фреймворков и делимся с вами.

Главные изменения

🟢Кол-во вакансий по Django упало на 15%. Компании постепенно переходят от "тяжелого" Django, делая выбор в сторону более легковесных фреймворков. Однако Django по-прежнему занимает уверенную вторую позицию. За год падение составило 20%.

🟢Flask на том же уровне. За полгода Flask потерял лишь 5%, однако если сравнить с позапрошлым ноябрем, падение составило 20%

🟢FastAPI закрепил позиции самого популярного фреймворка. Количество вакансий увеличилось на 12% за полгода, на 5% за год. Уже более года FastAPI является самым востребованным фреймворком в коммерческой Python разработке.

Мысли и выводы

Рынок медленно переходит к решениям на базе FastAPI. Рано говорить о полном доминировании какого-либо из фреймворков. Это больше похоже на спокойную адаптацию рынка к новым реалиям.

💬 Что думаешь об этом? Замечал изменения? Напиши в комментарии

Прошлые посты: Полгода назад (Май 2025) | Год назад (Ноябрь 2024)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍5👏3💯1
Проблемы разработчиков, которые мы решаем на обучении

Многие наши ученики приходили к нам после попыток разобраться в backend’е самостоятельно. Кто-то не мог пройти собеседования, кто-то застревал на тестовых заданиях, а кто-то просто не понимал, что именно нужно учить, чтобы получить первую работу.

Чтобы решить эти проблемы, мы создали понятную систему обучения. В Pytex курсы создают Senior-разработчики для разработчиков. После каждого модуля ученики проходят тесты и на практических заданиях закрепляют материал.

Как итог, к концу курса у каждого из них есть собственные проекты и понимание, как применять полученные знания и навыки в работе.

Наши выпускники проходят собеседования, устраиваются в компании и чувствуют себя уверенно в командной работе, о чем пишут в многочисленных отзывах.
👍32🤝2
Что должен уметь backend-разработчик в 2026 году

Как и в любой IT-специальности, требования к специалистам отличаются от компании к компании. Где-то разработчик с опытом 2 лет считается middle, где-то всё ещё junior. Рассмотрим усредненный набор знаний и навыков, по которым обычно определяют грейд:

Junior
На этом уровне от разработчика ждут точного выполнения задач по ТЗ, аккуратного кода и умения учиться. Пространства для архитектурных решений ещё мало — важнее скорость, внимательность и понимание основ.
Что нужно знать:
Python на уровне уверенного написания простых сервисов
Основы ООП, понимание принципов SOLID на базовом уровне
Асинхронность (async/await) — базовые представления
FastAPI — базовые CRUD-эндпоинты, роутинг, обработка ошибок
PostgreSQL: JOIN, GROUP BY, индексы, транзакции
SQLAlchemy или Django ORM — базовые запросы
Понимание NoSQL (Redis, MongoDB) на уровне базовых операций
Docker: запуск простого контейнера, базовый Dockerfile
Понимание, что такое REST API, HTTP, статусы ответов
Git: ветки, merge request, code review, конфликты
Логирование, работа с зависимостями, структура проекта


Middle
Middle-разработчик уже не ждёт подробного ТЗ. Он предлагает решения, оптимизирует архитектуру, умеет разбираться в чужом коде и общается с аналитиками, менеджерами, QA.
Что нужно знать:
Глубокое понимание Python: генераторы, контекстные менеджеры, async/await, типизация
Понимание паттернов проектирования
FastAPI: асинхронные приложения, middleware, фоновые задачи
PostgreSQL: планы выполнения, оптимизация запросов, индексы, триггеры
Проектирование API, контрактов, интеграций
Использование Redis для кэша, rate-limit, очередей
Работа с SQLAlchemy ORM на продвинутом уровне
Docker: мультистейдж сборка, оптимизация образов
CI/CD (GitHub Actions/GitLab CI/Yandex Cloud)
Базовые знания Kubernetes (часто встречается в 2025)
Pytest: фикстуры, моки, тестирование API
Опыт с брокерами сообщений: Kafka, RabbitMQ
Линтеры: ruff, black, mypy
Умение писать документацию
Участие в планировании, декомпозиции задач


Senior
Senior-бэкендер понимает архитектуру не на уровне отдельного приложения. Он влияет на технические решения, менторит команду, ведёт сложные проекты и отвечает за процесс разработки.
Что нужно знать:
Проектирование высоконагруженных систем
Микросервисная архитектура, событийный подход
Domain-Driven Design (DDD) на практическом уровне
Продвинутый Kubernetes (Helm, Operators)
Балансировка нагрузки
Мониторинг: Prometheus, Grafana, Sentry
Оптимизация на уровне схемы, репликация, шардинг
Redis для сложных задач: очереди, pub/sub
Code review, менторинг, постановка задач
Ведение технических дорожных карт
Понимание влияния архитектурных решений на продукт
Оценка рисков, сроков
Качество SLA, отказоустойчивость систем


Подробнее о разнице в задачах и росте в backend’е расскажем в следующих постах.
1710🔥62💯1
Различия между грейдами backend-разработчиков.

Разбор на реальном кейсе
Разница между Junior, Middle и Senior проявляется не только в навыках, но и в том, как каждый уровень решает одну и ту же задачу. Рассмотрим на примере из практики.

Кейс
Сервис электронных уведомлений столкнулся с проблемой: пользователи жалуются, что письма и push-уведомления приходят с задержкой. В пиковые часы очередь задач растёт, а система не справляется. Нужно понять, что происходит и как стабилизировать работу сервиса.

Junior
Начинающему backend-разработчику нужно поставить чёткое ТЗ: проверить один конкретный модуль или часть очереди. Он сможет:
— Посмотреть логи и найти явные ошибки.
— Открыть код эндпоинта, проверить простые проблемы: блокирующие операции, отсутствие таймаутов.
— Перезапустить сервис, обновить зависимости, протестировать простой случай.
— Написать небольшой скрипт для замера времени ответа.
— Сделать фикс под руководством ментора: вынести тяжёлую операцию в фон, добавить кэш, поправить обработчик ошибок.

Middle
Middle-разработчик уже сам исследует проблему, формулирует гипотезы и предлагает варианты решения. Он сможет:
— Проанализировать узкие места: медленные запросы в PostgreSQL, блокировки, неэффективные ORM-операции.
— Проверить, не упирается ли сервис в ограничение Redis, очередь, лимиты CPU.
— Переписать критичный участок на асинхронный FastAPI, вынести операции в Celery или другой брокер задач.
— Оптимизировать SQL: добавить индексы, CTE, изменить схему таблиц.
— Настроить метрики и алерты: время ответа, длину очереди, ошибки 5xx.
— Внедрить rate-limit, чтобы ни один канал не перегружался.
— Предложить архитектурное улучшение: разделить сервис на два модуля, вынести тяжёлые задачи в отдельный worker.


Senior
Senior-разработчик смотрит системно: он решает не только текущую проблему, но и предотвращает будущие. В этом кейсе он сможет:
— Спроектировать высоконагруженную архитектуру для отправки уведомлений: очереди, ретраи, шардирование, отдельные сервисы под каждый канал.
— Выстроить систему observability: логирование, трассировка, метрики, алерты, дашборды в Grafana.
— Переписать критичные части на устойчивую схему: worker-пул, механизм backpressure.
— Настроить CI/CD, автотесты, нагрузочное тестирование, чтобы проблем не возникало после релизов.

Важно: как и в любой IT-специальности, требования к специалистам отличаются от компании к компании.
252👎1
Рубрика #проверь_себя

Сегодня предлагаем тебе решить задачу по SOLID 🔥

Класс ReportService отвечает только за подготовку отчёта, а конкретный формат вывода передаётся через абстракцию. Какие два принципа SOLID демонстрирует этот код?

class ReportExporter(ABC):
@abstractmethod
def export(self, data):
pass


class PDFExporter(ReportExporter):
def export(self, data):
print("Export to PDF")


class ExcelExporter(ReportExporter):
def export(self, data):
print("Export to Excel")


class ReportService:
def __init__(self, exporter: ReportExporter):
self.exporter = exporter

def generate(self, data):
self.exporter.export(data)
Please open Telegram to view this post
VIEW IN TELEGRAM
54
Какие принципы демонстрирует код?
Anonymous Quiz
13%
I, L
13%
O, D
47%
S, D
9%
O, L
18%
S, I
Пояснение ко вчерашней задаче

Почему же правильный ответ — S, D

Single Responsibility Principle (S):
ReportService отвечает только за подготовку отчёта, Он не знает, куда и в каком формате происходит экспорт. Экспорт отчёта вынесен в отдельные классы (PDFExporter, ExcelExporter).
Если меняется логика формирования отчёта, необходимо изменить ReportService. Если меняется способ экспорта, тогда достаточно выбрать другой exporter.


Dependency Inversion Principle (D):
модули верхнего уровня не должны зависеть от модулей нижнего уровня, оба уровня должны зависеть от абстракций. Класс ReportService в `__init__` принимает абстракцию ReportExporter, не создавая внутри себя экземпляры PDFExporter или ExcelExporter, можно легко подменить одну реализацию другой. Для добавления новых вариантов ReportExporter менять логику в ReportService не требуется.


💬Ну что, стало понятнее? Или вы сразу решили задачу верно?)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍85🤝21
Планировал прокачаться в backend-разработке в 2025 году?
У нас для тебя отличные новости!

Если ты только начинаешь путь в бэкенде или уже работаешь, но чувствуешь, что знаний или практики где-то не хватает — мы подготовили для тебя два мощных практических вебинара от Senior-разработчика Артёма Шумейко. Минимум теории, максимум практики, и, как всегда, простым языком на реальных примерах. 

 💎 16 декабря в 18:00 МСК — «Пишем систему аутентификации и авторизации: сессии vs JWT токены»
На вебинар ты:
— разберёшься в ключевых принципах аутентификации и авторизации через сессии и токены
— вместе с Артёмом Шумейко напишешь приложение, в котором реализуешь оба подхода.
После такого пошагового практикума ты будешь понимать, как строить безопасную систему входа в приложение.  

ЗАРЕГИСТРИРОВАТЬСЯ

 💎 18 декабря в 18:00 МСК — «5 слоёв кэширования в веб-приложениях»
На вебинаре ты:
— разберёшь теорию кэширования: уровни, механизмы, типы хранилищ;
— поймёшь, где и зачем применять разные виды кэша;
— разберешься, как бэкендер может снизить нагрузку на бэк в десятки раз через кэширование на уровне браузера;
— на практике внедришь 5 уровней кэширования в реальное приложение.
Это тот навык, который отличает джуна от мидла и который особенно ценят работодатели.

ЗАРЕГИСТРИРОВАТЬСЯ

🎉 Всех участников вебинаров ждут подарки.

Обо всём расскажем уже скоро! А пока регистрируйся и следи за новостями канала, чтобы ничего не пропустить
Please open Telegram to view this post
VIEW IN TELEGRAM
54🔥3👏1🤝1
Рубрика #проверь_себя

Класс UserRepository является репозиторием с генератором для постраничной загрузки данных пользователей. Какой результат вернет ручка get_users, если отправить запрос
GET /users?batch_size=2&limit=3?


from fastapi import FastAPI, Query


app = FastAPI()
USERS = ['alice', 'bob', 'carol', 'dave', 'mia']


class UserRepository:
def __init__(self, rows):
self.rows = rows

def paginated_fetch(self, batch_size: int):
for i in range(0, len(self.rows), batch_size):
batch = self.rows[i:i + batch_size]
yield from (row.upper() for row in batch)


@app.get('/users')
def get_users(batch_size: int = Query(gt=0), limit: int = Query(gt=0)):
data = UserRepository(rows=USERS).paginated_fetch(batch_size=batch_size)
return [next(data) for _ in range(limit)]


🔥 — решил
🤝 — не решил
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝195