Кодовой Барабанщик
112 subscribers
304 photos
103 videos
175 links
БлогеРОК программиста-барабанщика 👨‍💻🥁
Telegram: @GranSteL
YouTube: https://youtube.com/@granstel
ВКВидео: https://vkvideo.ru/@drummer_programmer
Download Telegram
Не отписывайся! Сейчас будет важная информация, и если ты не понимаешь, что это за канал и что ты здесь делаешь, прочти следующий пост, наверняка вспомнишь/поймёшь👇
В целом, в ближайшее время ожидается много информации, держись))
❤1
Привет! Меня зовут Степан 👋
Днём я обычный программист 👨‍💻, а вечером надеваю косуху и играю рок на барабанах 🥁
А этот канал - БлогеРОК программиста-барабанщика 👨‍💻🥁
Здесь я пишу как о своих программистских мыслях и посещении соответствующих тусовок, так и выкладываю видосы с выступлениями 📹
Мы с тобой можем быть знакомы, потому что вместе выступали, или пересекались на одной из конференций, или я поддерживал тебя на #RunIT, или нас свёл ещё какой-нибудь #движ, а может мы вообще коллеги, или играем в одной группе)) В любом случае, я рад, что ты здесь 💖

Что здесь есть:
#движ - куда иду, о том и пишу: это и выступления, и конфы, и прочий движ))
#ИИшница - заметки о трендовой на сегодня теме
#офисныеистории - истории из офиса компании, в которой работаю, и, по совместительству, подкаст о том же

Что ещё есть:
#JamBeat, #пятый_угол, #хитпоинт - выступления с группами
#rocknmob - выступления в составе уличного рок-оркестра (самый частый тег, как оказалось))
#Rammstein - моя любимая группа (хочу выступить с ними)
#летнийвайб - когда надо поделиться солнцем и теплом

И ещё всякие непромаркированные мысли и события💡

Надеюсь, ты найдёшь для себя что-нибудь интересное 🤘

P. S. Когда понадобится сессионный барабанщик - можешь обратиться ко мне 😉
👉Мой репертуар найдешь по этой ссылке👈
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🔥21
Кодовой Барабанщик pinned «Привет! Меня зовут Степан 👋 Днём я обычный программист 👨‍💻, а вечером надеваю косуху и играю рок на барабанах 🥁 А этот канал - БлогеРОК программиста-барабанщика 👨‍💻🥁 Здесь я пишу как о своих программистских мыслях и посещении соответствующих тусовок, так и…»
Собсно, #движ aka #гастрольный_график

✅ 27.03.2026 - пока самое авантюрное выступление в моей жизни со сборной имени Виолетты Орловой aka #хитпоинт )) Чуть позже расскажу о нём

✅ 12.04.2026 - выступил с молодой группой #пятый_угол, жди видосы

✅ 16.05.2026 - конфа Backend talks Яндекс 360, иду потусить, послушать, поснимать
Итоги

✅ 27.05.2026 - ещё одно выступление с группой #пятый_угол: Москва, клуб Цеппелин, Слободской переулок, 6с4, начинаем в 19:30, приходи
Итоги

✅ 30.05.2026 - выступление на юбилейной вечеринке #rocknmob: Москва, Клуб PRAVDA, Варшавское шоссе, 26с12, начинаем в 16:00, вход платный
Итоги

✅ 10.07.2026 - выступление с #хитпоинт на Dio Birthday party, клуб Цеппелин N5, Слободской переулок д6с4, вход платный
Итоги

✅ 25.07.2026 - выступление с #хитпоинт, клуб "БарЧук", Староваганьковский переулок, 19с3, вход свободный
Итоги

✅ 22.08.2026 - #ROCKNMOB 🤟
Москва, Северный речной вокзал
Итоги

✅ 04.09.2026 - выступление с #хитпоинт, NIGHT TRAIN SALOON, 1-й Угрешский проезд, 7Ас2
Итоги

#гастрольный_сезон
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6
Кодовой Барабанщик pinned «Собсно, #движ aka #гастрольный_график ✅ 27.03.2026 - пока самое авантюрное выступление в моей жизни со сборной имени Виолетты Орловой aka #хитпоинт )) Чуть позже расскажу о нём ✅ 12.04.2026 - выступил с молодой группой #пятый_угол, жди видосы ✅ 16.05.2026…»
Если ты ожидаешь здесь программистский контент: я написал, внезапно, довольно хардовый пост о физическом хранении данных в БД 🖥
Мы с Димой из C# Short posts заколлабились и сегодня выложили там хоть и короткий, но мозговзрывной пост 🤯
При этом я постарался всё объяснить максимально понятно, ещё и с живыми примерами, которые можно воспроизвести руками и увидеть "вживую" то, о чём я там пишу. В общем, сегодня довольно тяжёлая среда, мои чюваки 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Forwarded from C# Short Posts 🔞
В жизни каждого шарписта наступает момент, когда надо разобраться, наконец, как работает СУБД, которой он каждый день пользуется.
Прежде чем написать этот короткий пост, я погрузился в тему баз данных и в какой-то степени они стали для меня открытой книгой, буквально, потому что в них слишком много аналогий с книгами. Оказывается, что концепция, на которой стоит вообще всё хранение данных, одна и та же что в PostgreSQL, в MySQL, и даже в MongoDB — страницы 📄

📖 Что такое страница и зачем она
Когда ты делаешь INSERT INTO users (...), в голове картина обычно простая: «строчка просто легла куда-то в таблицу». Физически — нет. Ни одна нормальная СУБД (что реляционная, что документная) не пишет каждую строку или документ отдельно. Вместо этого данные складываются в страницы (pages) — блоки фиксированного размера.
У PostgreSQL и SQL Server страница — 8 KB, у MySQL/InnoDB — 16 KB, у MongoDB через WiredTiger — настраивается, но того же порядка. Любая операция чтения или записи — это работа с целой страницей, а не с одной строкой.
Почему так? Потому что диск и RAM физически работают блоками, а не байтами. Один поход на диск всё равно вытаскивает целый блок килобайт на восемь — хочешь ты того или нет. СУБД этим пользуется: складывает в одну страницу столько строк или документов, сколько влезет. Берёшь одну строку — получаешь рядом «соседей» бесплатно 💋

🔬 Давай потрогаем руками
Самое классное — это всё можно пощупать, если поднять, например, PostgreSQL в Docker. Полный список команд для последовательного выполнения сможешь найти 👉вот здесь👈 (а то пост получится уже не таким коротким) 🥖

На пояснительном дикпике 1 можно увидеть, где физически лежит созданная таблица и сколько весит: файл занимает ровно 409600 байт = 50 × 8192, то есть страницы ровно по 8 KB. И таких страниц в одном файле подряд — 50 штук, это и есть вся таблица.

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

📍 Где какая строка лежит
В Postgres у каждой строки есть служебный «адрес» — ctid, пара (номер страницы, номер слота на странице).

На дикпике 3 запрос, который покажет адреса выбранных строк, и там же видно, что в нулевую страницу 8 KB у нас влезла 121 строка, в первую — следующие 120, и так далее. На 6000 строк ушло 50 страниц — ровно то, что мы видели по размеру файла. Когда СУБД хочет прочитать запись с id = 5999, она не «ищет в таблице» — она поднимает с диска страницу №49 и достаёт из неё нужный слот.

🧑‍💻 Что с этим знанием делать в работе
1. Чтение одной строки = чтение целой страницы. Запросом за одной строчкой ты всё равно поднимаешь с диска 8 (или 16) KB. Если в WHERE id IN (...) много значений и они физически рядом — это почти бесплатно. Если разбросаны по таблице — каждое чтение отдельная страница.
2. Узкие таблицы — это не только про место. Чем шире строка, тем меньше их влезает в страницу. Большое поле text на килобайт-другой может уронить плотность в 20 раз — и для того же количества строк понадобится в 20 раз больше страниц.
3. shared_buffers / buffer pool — это кэш страниц, не строк. Когда тюнят память под СУБД, имеют в виду «сколько страниц влезет в RAM». И именно поэтому случайные чтения по большой таблице болят: каждая страница приходит с диска заново.
4. В Postgres UPDATE — это DELETE + INSERT. Старая версия строки помечается мёртвой и продолжает лежать на той же странице, новая дописывается рядом. Поэтому после массовых апдейтов файл таблицы пухнет, пока не пройдёт VACUUM. Та же логика — ctid после UPDATE меняется, потому что физически это уже другая запись на другом слоте.

А если в таблице миллионы записей, как БД так быстро находит нужную? Для этого нужны индексы, но о них — в другом посте👉
#бд #postgresql #инженерныештучки
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2❤1
Мой внимательный читатель заметит, что обычно я обновляю аватарку канала по сезону, а в этот раз немного поторопился. Всё потому, что тот анимешный мальчик всё-таки мне не подходит, я даже в канал перестал писать из-за него))
А ещё в последнее время #ИИшница, в частности ChatGPT, стал очень годно генерировать картинки. Обрати внимание, сколько на фоне много разных интересных деталей на обеих половинах: постеры, неоновые вывески, надписи. Особенно позабавило наличие книг Clean code на верхней полке у программиста)) И ни о чём из этого я не просил, он сам добавил их, учитывая предыдущий контекст нашего с ним общения 🤯
В общем зацени, поставь эмоджик там👆 или тут👇, напиши в комменты, насколько кринжовым я тут получился))
🔥4👏1😁1
Если вдруг не знаешь, у меня есть пет-проект Занимательные истории 💡🧸
Суть в том, что голосовые ассистенты (Алиса 🙂 или Маруся , смотря кто у тебя есть) задают тебе вопросы, а ответы встают в случайные места в тексте, и получается история: смешная, абсурдная, нелепая (всё зависит от тебя), но в целом прикольная. Проект существует уже больше пяти лет, и его MAU (кол-во активных игроков каждый месяц) достигает 90+ тысяч! И это при том, что последние три года я не добавлял в него новый контент: там было 32 шаблона историй, которые ротируются по кругу, и люди с удовольствием сочиняют истории по этим текстам 🔄
Я ничего не добавлял, потому что сочинение и добавление одного текста у меня стало занимать около 8ми часов, то есть полноценный рабочий день, а то и больше! Сочинить, формализовать, разметить, залить в Dialogflow, протестировать, запустить в ротацию, сделать всякие визуальные материалы чтоб написать посты в соцсетях 😱 В общем, тяжело найти столько времени, чтобы полностью уделить его этой задаче ⏳
С появлением ИИ-агентов я смог ускорить этот процесс. Теперь #ИИшница помогает быстро формализовать сюжет, разметить, и залить в Dialogflow. Серьёзно, она это делает за считанные минуты, а у меня уходили часы! 🎉
Эти процессы я автоматизировал с помощью Claude 😒, или Клавдий, как я его называю, а картинки генерирует ChatGPT (его я никак не назвал) 😺
И ты посмотри, как он теперь генерирует комиксы! Ещё год назад он не мог такое сделать (а я пытался), а теперь это чёткий текст без артефактов, множество забавных деталей на фоне, и всё это по промпту "Создай комикс по этой истории"! Ну и дальше текст готовой истории. И всё! А когда мне понадобилось сделать сделать комикс для истории-продолжения, я попросил "Создай комикс по этой истории с теми же персонажами"! И он великолепно перенёс персонажей!
Только видосы я ещё не научился делать с помощью агентов, но чувствую, уже близок тот день, когда такие же простые видео смогу делать за несколько минут, а не часов ☀️
Многие рассматривают ИИ-агентов как сущность, которая может встать на их место. Но это скорее инструменты, или напарники, которые берут на себя рутину и помогают делать дела намного быстрее✨
В общем, я это всё к чему: сегодня я добавил туда ещё один новый текст, так что приходи, сочиняй #занимательныеистории, и напиши в комментарии свои идеи для новых историй!👇
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Тусуюсь на конфе Backend talks Яндекс 360, и вот что я тебе скажу: пельмешки - гениальное решение для обеда на конфе. Они сытные, можно выдавать готовой порцией, и айтишникам не придётся подолгу стоять в очереди (а мы этот #движ очень любим)
❤4🔥2👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Красивого таймлапса тебе в ленту ☁️
❤5
Я тут разбирался в терминах синхронно, асинхронно, конкурентно, и параллельно. Конечно же, #ИИшница помогала мне в этом, потому что это интерактивный инструмент, которому можно сразу задать уточняющий вопрос (в отличие от статей и видосов). В какой-то момент она привела прикольную, близкую для меня аналогию:
Представь барабанщика на репетиции.
Синхронно:
отправил сообщение;
сидит и смотрит в телефон, пока не ответят.
Асинхронно:
отправил сообщение;
пока ждёт ответ, продолжает репетировать.
Конкурентно:
одновременно ведёт переписку, репетирует и слушает указания звукорежиссёра.
Параллельно:
невозможно для одного человека, но возможно для группы музыкантов, где каждый делает свою работу одновременно.
Поэтому:
Асинхронность — это про то, как не ждать.
Конкурентность — это про то, как управлять несколькими задачами.
Параллелизм — это про реальное одновременное выполнение на нескольких вычислительных ресурсах.

Забавно, что обычно при объяснении этих терминов приводят пример с поваром на кухне, потому что его поймёт более широкий круг лиц, а здесь вот для меня более персонализированный кейс👍
Пиши в комментарии, разбираешься ли в этих понятиях, и какие неточности есть на картинке👇
🔥1
Forwarded from C# Short Posts 🔞
👈 В прошлый раз мы выяснили, что обычно данные в СУБД лежат в страницах фиксированного размера. А как по этим страницам что-то быстро найти?

🔍 Если искать в лоб
Представь, что ты хочешь найти в толстой книге по базам данных упоминание слова «дерево». Если в конце нет предметного указателя — придётся листать страницу за страницей и глазами выискивать нужное слово.
СУБД без индекса делает ровно то же самое: она прочитает все страницы таблицы подряд, проверит на каждой, есть ли подходящая строка, и оставит то, что нашла. Этот режим работы называется Sequential Scan, или просто Seq Scan — последовательное чтение.
Увидеть, что СУБД делает именно так, можно через EXPLAIN — команду, которая покажет, как планируется выполнить запрос. Видишь в плане Seq Scan — значит СУБД проходит таблицу целиком.
На таблице в 10 млн строк это будет довольно долго, потому что на каждый запрос будут выполняться сотни тысяч чтений страниц с диска ради одной нужной строки 💽

📖 Предметный указатель
В книге это решается просто: там есть предметный указатель — отсортированный по алфавиту список слов с номерами страниц. Открываешь, ищешь слово, прыгаешь на нужную страницу.
В СУБД роль такого указателя играет индекс. Это отдельная структура на диске, в которой ключи (например, значения id) лежат отсортированно, а рядом с каждым — указатель на конкретную страницу таблицы 🧿
Чаще всего первый индекс появляется в таблице автоматически: когда ты добавляешь, например, в свою таблицу users PRIMARY KEY на колонку id, Postgres под капотом создаёт уникальный индекс по этой колонке — users_pkey; в psql его видно через метакоманду \d users как btree (id).

🌳 Что такое btree
В большинстве СУБД (PostgreSQL, MySQL/InnoDB, SQL Server, MongoDB через WiredTiger) индекс по умолчанию — не просто отсортированный список, а B-дерево (точнее, его вариант B+tree).
Почему не список? Главное — число чтений с диска. Бинарный поиск по отсортированному списку из миллиона страниц — это около 20 чтений. И если ключ не монотонный (email, uuid, имя автора), любая вставка в середину означает переписать целый хвост.
B-дерево — это обычное дерево из корня сверху, внутренних узлов в середине и листьев снизу. Оно устроено так:

🟢 В каждом узле много ключей — не один-два, а сотни.
🟢 Все листья на одной глубине. Любой путь от корня до листа одинаковой длины.
🟢 За счёт большого ветвления глубина дерева смешная. Для индекса по сотне миллионов записей это 3–4 уровня. Найти строку = 3–4 чтения. Не миллионы, не тысячи. Три-четыре 🎉
🟢 Листья связаны в список. Поэтому Range-запросы (>, <, BETWEEN) тоже летают: спустился до начала диапазона и пробежал листья подряд.
Аналогия — толстая энциклопедия: тома → главы → разделы. Три шага, и ты на месте 👍

📦 Как это лежит в Postgres (см. дикпик 3)
Структура B-tree один в один ложится на структуру страниц из прошлого поста:
⚪️ Один узел дерева = одна страница 8 KB.
⚪️ Внутренние узлы хранят пары (ключ, ссылка на дочернюю страницу). В одну страницу таких пар влезают сотни.
⚪️ Листья хранят пары (ключ, ctid). Помнишь ctid из прошлого поста? Это указатель «страница такая-то, позиция такая-то» — он ведёт прямо на нужную строку в куче.
⚪️ Индекс лежит отдельным файлом со своим pg_relation_filepath — это не часть таблицы, это самостоятельная сущность.

🔬 Пощупаем (см. дикпики 1 и 2)
Берём таблицу users из прошлого поста (6000 строк, без PRIMARY KEY) и ищем по id. Seq Scan ... Rows Removed by Filter: 5999: прочитали всё, отбросили 5999, оставили одну.

Добавляем первичный ключ. Тот же запрос — план сменился на Index Scan using users_pkey. Сначала Postgres прошёл по B-дереву от корня до листа, там нашёл ctid, по нему сходил в нужную страницу таблицы и достал строку.

🅰️ Что с этим знанием делать
Индекс — это отдельные страницы на диске. Каждый INSERT/UPDATE/DELETE правит и таблицу, и все её индексы. Поэтому вешать их «на всякий случай» на каждое поле — плохая идея: платишь местом на диске, замедлением записи, обслуживанием дерева. При хорошо выбранном индексе взамен этих накладных расходов получаешь быстрый поиск⚡️

#бд #postgresql #инженерныештучки
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1