backendportal | Unsorted

Telegram-канал backendportal - Backend Portal | Программирование

15708

Присоединяйтесь к нашему каналу и погрузитесь в мир Backend-разработки Связь: @devmangx РКН: https://clck.ru/3FobxK

Subscribe to a channel

Backend Portal | Программирование

👩‍💻 Всем программистам посвящается!

Вот 14 авторских обучающих IT каналов по самым востребованным областям программирования:

Выбирай своё направление:

👩‍💻 Python — t.me/python_ready
🤔 InfoSec & Хакинг — t.me/hacking_ready
🖥 SQL & Базы Данных — t.me/sql_ready
🤖 Нейросетиt.me/neuro_ready
👩‍💻 Frontend — t.me/frontend_ready
👩‍💻 IT Новости — t.me/it_ready
👩‍💻 C/C++ — /channel/cpp_ready
👩‍💻 C# & Unity — t.me/csharp_ready
👩‍💻 Linux — t.me/linux_ready
👩‍💻 Java — t.me/java_ready
📖 IT Книги — t.me/books_ready
📱 JavaScript — t.me/javascript_ready
🖼️ DevOpst.me/devops_ready
🖥 Design — t.me/design_ready

📌 Гайды, шпаргалки, задачи, ресурсы и фишки для каждого языка программирования!

Читать полностью…

Backend Portal | Программирование

Если я говорю “горизонтальное масштабирование”, ты, скорее всего, автоматически думаешь про load balancer.

Вот 2 способа масштабироваться дальше, чем просто балансировщик.

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

Самый очевидный вариант горизонтального дублирования это как раз load balancer. Он:
• распределяет запросы
• видит, когда нода умерла, и убирает ее из пула

1. Competing Consumer Pattern

Суть паттерна в том, чтобы раскидать нагрузку и поднять throughput.

Идеально, когда у тебя есть обработчики задач. Например, система должна давать пользователям импортировать и обрабатывать большие файлы.

Ты кладешь каждый загруженный файл в очередь, и много консьюмеров “соревнуются” за то, кто заберет задачу и обработает ее.

2. Read Replicas для read-нагрузки

Чтобы разгрузить primary базу по чтениям, ты поднимаешь read replicas.

Работает отлично, если основная нагрузка на систему в основном чтение.

Пример: e-commerce. Primary база принимает все записи, а реплики обслуживают тяжелые чтения, типа карточек товара или истории заказов пользователя.

Горизонтальное дублирование обычно довольно прямолинейное.

Если вертикально масштабироваться уже нельзя, это обычно следующее, куда я бы смотрел.

Если ты можешь нормально “разрезать” работу между копиями, это очень элегантный способ разнести нагрузку и снизить конкуренцию за ресурсы.

Но есть нюанс: нужно больше инфраструктуры, и это, конечно, дороже.

Ты делал что-то из этого?

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Фан-факт: OpenAI тянет 800 млн пользователей в ChatGPT всего на одном primary PostgreSQL и 50 read-репликах 🤯

Сегодня OpenAI выкатили инженерный пост о том, как они масштабировали Postgres, чтобы обслуживать эти 800 млн пользователей: один primary и 50 мульти-региональных реплик.

Внутри разбирают свой подход к масштабированию, прокси PgBouncer, локи вокруг кэша и каскадные read-реплики. Реально выглядит аккуратно и впечатляюще.

ВОТ короткое видео на YouTube, где разбирают этот пост и раскладывают нюансы по полочкам.

Зацени, видос короткий

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Uber выложили в опенсорс свою платформу метрик M3, и пока я бегло смотрел, как она устроена, наткнулся на подход под названием LTTB downsampling. Вот о чём речь...

LTTB расшифровывается как Largest Triangle Three Buckets. Это алгоритм даунсэмплинга, который помогает эффективно запрашивать и визуализировать миллионы точек таймсерий. Идея в том, чтобы сохранить визуальную форму графика, но сильно сократить число точек, которые нужно рендерить.

За счёт этого фронтенду легче: меньше точек для отрисовки и меньше данных надо гонять по сети.

Работает так: временной ряд делится на “бакеты”, и из них выбираются точки, которые сохраняют максимальную “визуальную площадь”. То есть вместо случайной выборки или простого усреднения, LTTB оставляет точки так, чтобы на графике не потерялись пики, провалы и общий тренд.

Механика простая: берутся три точки за раз (предыдущая, текущая, следующая) и считается площадь треугольника, который они образуют. Выбирается та точка, которая даёт самый большой треугольник. В итоге важные визуальные особенности переживают даунсэмплинг.

С таким подходом можно ужать 10 000 точек до 500 и всё равно получить график, который выглядит почти так же, как исходный. Помимо M3, системы вроде Grafana, InfluxDB и Prometheus тоже взяли LTTB или похожие техники даунсэмплинга.

Забавно, что такая, казалось бы, простая штука как “какие точки оставить?” внезапно превращается в реально интересную задачу.

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Если protobuf уже компактный бинарный формат, есть ли вообще смысл дополнительно жать его Snappy? Вот что на самом деле делает Uber M3...

Uber M3 принимает больше миллиарда датапоинтов в секунду (масштаб реально дикий) и при этом принимает данные по HTTP/1.1 в виде Snappy-сжатого protobuf.

Protobuf сам по себе эффективный, да. Но у телеметрии есть особенность: она очень повторяющаяся. Одни и те же имена метрик, похожие наборы тегов, повторяющиеся hostnames, одинаковая структура полей в тысячах точек. Из-за этой избыточности такие данные отлично сжимаются даже быстрым алгоритмом вроде Snappy.

M3 использует Snappy-сжатый protobuf поверх HTTP для своего Prometheus remote write endpoint. Причина простая: на огромном масштабе тебе нужна компрессия, которая не станет узким местом.

* Snappy очень быстро сжимает и разжимает
* он ставит скорость выше коэффициента сжатия
* CPU-оверхед и на клиенте, и на коллекторе остается минимальным
* клиентам телеметрии не стоит жечь CPU на компрессию, когда они должны заниматься реальной работой

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

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

7 обязательных сложностей по времени для собесов:

1. O(1) - константное время

* Время не меняется независимо от размера входа.
* Пример: доступ к элементу массива по индексу.

2. O(log n) - логарифмическое время

* Растет медленно по мере увеличения входа. Обычно в алгоритмах, которые на каждом шаге делят задачу пополам.
* Пример: бинарный поиск в отсортированном массиве.

3. O(n) - линейное время

* Растет линейно вместе с размером входа.
* Пример: поиск элемента в массиве перебором.

4. O(n log n) - линеарифмическое время

* Растет чуть быстрее, чем линейное. Для каждого элемента входа делается логарифмическое число операций.
* Пример: сортировка массива quick sort или merge sort.

5. O(n^2) - квадратичное время

* Растет пропорционально квадрату размера входа.
* Пример: bubble sort, который сравнивает и при необходимости меняет местами каждую пару элементов.

6. O(2^n) - экспоненциальное время

* Время удваивается при добавлении каждого элемента во вход. Для больших n становится непрактично.
* Пример: генерация всех подмножеств множества.

7. O(n!) - факториальное время

* Время пропорционально факториалу размера входа.
* Пример: генерация всех перестановок множества.

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Компилируем Go в TypeScript 😂

Этот тул работает на уровне AST-дерева, позволяя переиспользовать бизнес-логику, алгоритмы и структуры данных между бэкендом и фронтом без переписывания руками

Исходный код этого чуда

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

👩‍💻 В сеть вывалилась гигантская куча курсов и книг

Держи сотни гигабайт свежих уроков, и каждую неделю мы подкидываем ещё!

• 1612 ГБ — DevOps
• 1402 ГБ — Python
• 1300 ГБ — C, C++
• 1815 ГБ — Frontend
• 1515 ГБ — Backend
• 898 ГБ — ИБ, Хакинг
• 996 ГБ — Kotlin, Swift
• 212 ГБ — JavaScript
• 315 ГБ — Flutter
• 820 ГБ — Go, PHP
• 419 ГБ — Java, Rust
• 648 ГБ — GameDev
• 517 ГБ — Windows, Linux
• 998 ГБ — Дизайн (UX/UI)
• 617 ГБ — Нейросети (ML/RL)
• 546 ГБ — БД (SQL & NoSQL)
• 687 ГБ — Аналитика данных
• 115 ГБ — QA-тестирование


Подписывайся и не плати за то, что можно получить бесплатно

Читать полностью…

Backend Portal | Программирование

Если деревья тебя пугают, графы наверняка вообще вгоняют в ужас.

Это та тема, про которую большинство молится, лишь бы не попалась на собесе.

Единственная разница между деревом и графом это цикл. всё. если ты умеешь решать на деревьях, то на графах это то же самое: просто добавь массив visited.

Я разобрал 350+ задач по графам и они все укладываются в 7 шаблонов

1. BFS (поиск в ширину)

алгоритм “кратчайшего пути”. если спрашивают shortest path в невзвешенном графе (лабиринт, соцсеть) это он.

хак: очередь. волной, слой за слоем.

2. DFS (поиск в глубину)

алгоритм “исследователь”. когда надо перебрать все варианты или проверить связность.

хак: рекурсия (или стек) + visited, чтобы не зациклиться.

3. Union Find (Disjoint Set)

самый приятный паттерн. для “группировок” и проверки, связаны ли две вершины.

хак: идеально для “number of provinces” и “redundant connection”. path compression делает почти O(1) на операцию.

4. Топологическая сортировка (алгоритм Кана)

звучит сложно, но это просто “упорядочить зависимости”.

как узнать: “course schedule”, “build order”. если A должно быть раньше B, это сюда.

5. Алгоритм Дейкстры

паттерн “google maps”. кратчайший путь во взвешенном графе (у ребер разные веса).

хак: это BFS, только вместо обычной очереди Priority Queue (min-heap).

6. Bellman-Ford

редко, но важно. если есть “отрицательные веса”.

хак: медленнее Дейкстры, зато умеет ловить отрицательные циклы.

7. Floyd-Warshall

паттерн “для ленивых”. находит кратчайшие пути между всеми парами вершин.

хак: просто 3 вложенных цикла. O(N³). юзать только на маленьких графах (N < 500).

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Деревья это точка, где 90% людей сдаются на DSA
Рекурсия ломает мозг, и на собесе ты просто виснешь
Но как и с массивами, ты просто усложняешь себе жизнь

Я разобрал больше 400 задач по деревьям
И там реально крутятся одни и те же 6 паттернов

1. Level Order Traversal (BFS)

Если задача просит пройти дерево по уровням или найти кратчайший путь в невзвешенном дереве — это оно

Хак: не пытайся всё решать рекурсией, тут нужна очередь

2. Depth First Search (DFS)

Базовая штука. Если надо идти в глубину перед тем как обходить соседей (например проверка пути от корня до листа) — бери это

Хак: выучи Pre-order, In-order и Post-order. Это покрывает процентов 70 задач

3. Path Sum

"найти путь который даёт сумму k". Выглядит страшно, но это просто DFS с накопленной суммой

Хак: вычитай значение узла из цели пока спускаешься вниз. Если на листе цель стала 0 — задача решена

4. Tree Construction

"построить дерево из двух массивов". По сути проверка логики

Хак: ищешь корень (обычно первый или последний элемент обхода), режешь массивы и рекурсишь

5. Lowest Common Ancestor (LCA)

Самый частый вопрос на собесах

Хак: если оба узла меньше текущего — иди влево. Если оба больше — вправо. Если расходятся — вот ответ

6. Serialize & Deserialize

Как сохранить дерево в файл и восстановить обратно

Хак: выбираешь любой обход (например Pre-order) и вставляешь null для пустых детей

400+ страшных задач превращаются в 6 блоков логики
Хватит гриндить 100 рандомных вопросов
Выучи эти 6 и закроешь всю категорию

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Если готовишься к system design / backend-интервью, можно прогнать этот чек-лист

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Вышел Go 1.26 Release Candidate 2!

Включает фиксы по безопасности для archive/zip (CVE-2025-61728), net/http (CVE-2025-61726), crypto/tls (CVE-2025-68121, CVE-2025-61730), cmd/go (CVE-2025-61731, CVE-2025-68119).

Скачать: https://go.dev/dl/#go1.26rc2

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Когда ты используешь ORDER BY, SQL должен решить, куда девать значения NULL.

NULL часто означает:
отсутствующие данные
неполные записи
значение неприменимо

По умолчанию:
одни СУБД ставят NULL в начале
другие ставят NULL в конце

Из-за этого один и тот же запрос может выглядеть по-разному в результатах, в зависимости от того, где он выполняется.

Но ты можешь явно указать, как сортировать NULL.

Например:

➡️ORDER BY score ASC NULLS FIRST
Значит: сортировать по score по возрастанию и показывать NULL первыми.

➡️ORDER BY score DESC NULLS LAST
Значит: сортировать по score по убыванию и показывать NULL последними.

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Подборка учебных материалов для изучения программирования на примере проектов: чекаем

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Я всегда хотел понять, как SQL-базы реально исполняют JOIN'ы. Теорию я знал, но какое-то время назад потратил пару часов на исходники MySQL, чтобы разобраться в деталях.

Оказалось, что MySQL строит join-планы инкрементально, чтобы найти оптимальный порядок соединений. Он идёт от однотабличных access paths к join'ам на 2 таблицы, затем на 3, и так далее. В качестве оптимизации он отбрасывает поддеревья, которые гарантированно дадут более высокий cost.

Интересно, что там заметны следы динамического программирования. MySQL кеширует промежуточные результаты, чтобы не считать cost заново при расширении join-плана.

Именно за это я люблю open source: если есть вопрос, можно просто зайти в код и найти ответ самому.

Если любопытно, начни с файла sql_optimizer, а в нём — с функции get_best_combination. И да, спокойно используй LLM, чтобы разбирать исходники; я делал так же.

Вот код, который находит оптимальный порядок соединения

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Колонарное хранилище vs построчное (row store) наглядно

Берем простую агрегацию и сравниваем, как она выполняется в row store и columnar store.

В row store данные лежат строками, поэтому движку приходится читать каждую строку целиком, чтобы из нее вытащить значение колонки age.

В columnar store данные лежат по колонкам, поэтому он читает сразу только значения колонки age, без трогания остальных полей и без лишнего I/O.

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Учись программированию, Cloud и DevOps через практику

Бесплатные серверы и реальные задания.

✓ Практикуй Git и Linux-серверы
✓ Создавай и тестируй ресурсы AWS без страха
✓ Kubernetes, Docker, Terraform и другое

Регистрация не нужна: вперёд

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Познакомься с Devin Review: это переосмысленный интерфейс для понимания сложных PR.

Современные инструменты для код-ревью на деле не делают чтение кода проще. Devin Review прокачивает понимание и помогает перестать пропускать слоп.

Вместо алфавитного списка файлов он группирует связанные изменения и раскладывает их в логическом порядке, плюс дает короткое описание каждой группы. Отдельно умеет находить перемещенный и скопированный код, отделяя сигнал от шума.

Еще внутри есть агент, который ловит потенциальные баги и помечает их по уверенности и критичности. Причем он подсвечивает не только прямые баги, но и спорные решения/паттерны, которые потом превращаются в техдолг. Маркировка простая: красный срочно смотреть, оранжевый стоит глянуть, серый просто к сведению.

Плюс можно обсудить PR в чате с Devin, с контекстом всего репо. ⌨️

Как зайти:

- прямо на devinreview.com (можно без аккаунта)
- или заменить github на devinreview в ссылке PR
- или дернуть из репы: npx devin-review {pr-link}

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Алгоритм ленты рекомендаций X/Twitter теперь опенсорс

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Все надоело и пропал интерес, чувствуешь себя амебой и хочется только залипать в телефоне. Бывает?

Homo Manifestans — канал для айтишников, у которых периодически опускаются руки и отключается мозг, ибо переработки и постоянная тревожность не приводят к другим исходам 🤗

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

Подписывайтесь на канал @vadimpetrovpsi и научитесь работать без упахивания, выгорания и ущерба для личной жизни!

Псс. Заходите в закреп — там много полезного, и даже бесплатный мини-курс по выходу из апатии:
👉 /channel/+LEEr5GHeBHFlMWZi

Читать полностью…

Backend Portal | Программирование

Минималистичный клиент для SQL-баз данных

Называется Outerbase Studio:

✓ Совместим с MySQL, Postgres, SQLite и MongoDB
✓ Поддерживает сервисы вроде Turso и Cloudflare D1
✓ Доступен для Web, macOS и Windows
✓ Бесплатный и open source

→ [http://github.com/outerbase/studio]

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Весь Docker в одной шпаргалке : забираем

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Хочешь хранить текст? Не используй char(n) или varchar(n).

В других базах это встречается постоянно, но для Postgres — не лучшая идея.

• фиксированная ширина работает медленнее
• TEXT — переменной длины и без лимита
• если нужен размер, ставь constraint и ограничивай полем, а не типом

В итоге TEXT почти всегда выигрывает по практичности и производительности.

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

В Postgres есть функция age() чтобы быстро посчитать возраст (разницу) между timestamp или датами

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Загружает ресурсы веб-сайта с исходной структурой каталогов: https://github.com/timf34/pagesource

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Ты открываешь репу, видишь сотни папок, пару src, пару packages, и вопрос: кто дергает этот модуль?, куда утекает эта функция?, почему тут вообще есть эта зависимость? 😁

Лови костыль который решает это: расширение для VS Code, которое рисует кодовую базу как интерактивный граф прямо в редакторе. То есть вместо бесконечного кликанья по дереву проекта ты видишь карту: файлы, функции и зависимости, и как они между собой связаны.

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Поздравляем, вы на 1 шаг ближе к работе мечты 🥳

Осталось только прочитать этот пост, подписаться на канал и откликнуться на вакансию 😉

Avito Career — место, где Авито делится актуальными вакансиями и стажировками для бэкенд-разработчиков.

Подписывайтесь, чтобы найти ту самую работу ✨

Читать полностью…

Backend Portal | Программирование

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

Сделали интерактивный гайд про то как это работает

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

9 принципов софт-дизайна, которые стоит знать каждому разработчику:

1. DRY (Don’t Repeat Yourself). Избегай дублирования кода. Логику лучше держать в одном месте, так кодовая база намного проще в обслуживании.

2. KISS (Keep It Simple, Stupid). Тянись к простоте. Не городи архитектуру без реальной необходимости и не добавляй лишние уровни.

3. YAGNI (You Aren’t Gonna Need It). Реализуй только то, что нужно сейчас. Не трать время на потенциальные фичи, до которых может так и не дойти.

4. LOD (Law of Demeter). Общайся только с ближайшими соседями. Избегай бесконечных цепочек вызовов.

SOLID принципы:

5. SRP (Single Responsibility Principle). Класс должен отвечать только за одну вещь. Компоненты должны быть узкими и целостными.

6. OCP (Open/Closed Principle). Код должен быть открыт для расширения, но закрыт для модификации. Новое добавляем через расширение, а не переписывание старого.

7. LSP (Liskov Substitution Principle). Подклассы должны нормально подменять родительские без поломок в поведении.

8. ISP (Interface Segregation Principle). Разделяй интерфейсы на небольшие и сфокусированные, вместо огромных интерфейсов на все случаи.

9. DIP (Dependency Inversion Principle). Высокоуровневые модули не должны зависеть от низкоуровневых. Оба должны зависеть от абстракций.

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Совет по Postgres: используй filter вместо case when для условных агрегатов. Читается проще, выглядит более идиоматично для SQL и часто работает быстрее.

--  не делай так: громоздко и хуже читается
select
count(case when status = 'active' then 1 end) as active_count,
count(case when status = 'archived' then 1 end) as archived_count
from projects;

-- лучше так: чище и оптимизируется Postgres
select
count(*) filter (where status = 'active') as active_count,
count(*) filter (where status = 'archived') as archived_count
from projects;


👉 @BackendPortal

Читать полностью…
Subscribe to a channel