ru
Feedback

Не попадитесь на канал ботавода! Telemetrio находит и помечает такие каналы 👉 Хотите видеть метку — оформите подписку

Сохранёнки программиста

Сохранёнки программиста

Открыть в Telegram

Заметки и ссылки на будущее, чтобы изучить когда будет время. Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Другие наши проекты: https://tprg.ru/med

Больше
6 481
Подписчики
-624 часа
-237 дней
-4830 дней
Привлечение подписчиков
окт. '26
октябрь '26
+36
в 0 каналах
сентябрь '26
+65
в 6 каналах
Get PRO
август '26
+28
в 2 каналах
Get PRO
июль '26
+26
в 3 каналах
Get PRO
июнь '26
+48
в 2 каналах
Get PRO
май '26
+70
в 0 каналах
Get PRO
апрель '26
+30
в 0 каналах
Get PRO
март '26
+47
в 5 каналах
Get PRO
февраль '26
+57
в 14 каналах
Get PRO
январь '26
+38
в 2 каналах
Get PRO
декабрь '25
+46
в 4 каналах
Get PRO
ноябрь '25
+45
в 2 каналах
Get PRO
октябрь '25
+40
в 7 каналах
Get PRO
сентябрь '25
+26
в 3 каналах
Get PRO
август '25
+41
в 1 каналах
Get PRO
июль '25
+46
в 0 каналах
Get PRO
июнь '25
+38
в 2 каналах
Get PRO
май '25
+68
в 5 каналах
Get PRO
апрель '25
+49
в 1 каналах
Get PRO
март '25
+63
в 1 каналах
Get PRO
февраль '25
+69
в 2 каналах
Get PRO
январь '25
+72
в 4 каналах
Get PRO
декабрь '24
+46
в 1 каналах
Get PRO
ноябрь '24
+104
в 6 каналах
Get PRO
октябрь '24
+73
в 4 каналах
Get PRO
сентябрь '24
+87
в 3 каналах
Get PRO
август '24
+204
в 4 каналах
Get PRO
июль '24
+86
в 4 каналах
Get PRO
июнь '24
+77
в 4 каналах
Get PRO
май '24
+75
в 4 каналах
Get PRO
апрель '24
+68
в 3 каналах
Get PRO
март '24
+65
в 4 каналах
Get PRO
февраль '24
+50
в 0 каналах
Get PRO
январь '24
+64
в 1 каналах
Get PRO
декабрь '23
+59
в 2 каналах
Get PRO
ноябрь '23
+3 534
в 33 каналах
Get PRO
октябрь '23
+55
в 1 каналах
Get PRO
сентябрь '23
+71
в 0 каналах
Get PRO
август '23
+69
в 0 каналах
Get PRO
июль '23
+57
в 0 каналах
Get PRO
июнь '23
+180
в 0 каналах
Get PRO
май '23
+73
в 0 каналах
Get PRO
апрель '23
+93
в 0 каналах
Get PRO
март '23
+65
в 0 каналах
Get PRO
февраль '23
+113
в 0 каналах
Get PRO
январь '23
+68
в 0 каналах
Get PRO
декабрь '22
+86
в 0 каналах
Get PRO
ноябрь '22
+90
в 0 каналах
Get PRO
октябрь '22
+117
в 0 каналах
Get PRO
сентябрь '22
+134
в 0 каналах
Get PRO
август '22
+787
в 0 каналах
Get PRO
июль '22
+119
в 0 каналах
Get PRO
июнь '22
+90
в 0 каналах
Get PRO
май '22
+157
в 0 каналах
Get PRO
апрель '22
+131
в 0 каналах
Get PRO
март '22
+117
в 0 каналах
Get PRO
февраль '22
+198
в 0 каналах
Get PRO
январь '22
+149
в 0 каналах
Get PRO
декабрь '21
+5 099
в 0 каналах
Get PRO
ноябрь '21
+927
в 0 каналах
Get PRO
октябрь '21
+1 849
в 0 каналах
Дата
Привлечение подписчиков
Упоминания
Каналы
26 октября+1
25 октября0
24 октября+1
23 октября+1
22 октября0
21 октября+1
20 октября0
19 октября0
18 октября0
17 октября+1
16 октября+2
15 октября+1
14 октября0
13 октября+1
12 октября+6
11 октября+3
10 октября0
09 октября+4
08 октября+2
07 октября0
06 октября0
05 октября+2
04 октября+1
03 октября0
02 октября0
01 октября+9
Посты канала
Cloudflare сократила стоимость ИИ-ревью с $2,43 до $0,77 Команда проверила, на что ревьюер расходует токены, и обнаружила, чт
Cloudflare сократила стоимость ИИ-ревью с $2,43 до $0,77 Команда проверила, на что ревьюер расходует токены, и обнаружила, что общий системный контекст плохо переиспользуется между репозиториями: рядом с ним в одном блоке находились меняющиеся дата и рабочая директория. Общую часть отделили для кеширования. Затем убрали недоступные инструменты, лишние повторные проверки и заключительный вызов модели после публикации результата. Меняли также модели и глубину рассуждений. Средняя стоимость упала на 68%, медианное время — с 4 минут 9 секунд до 1 минуты 32 секунд. Но экономия требовала проверки качества: некоторые конфигурации стали пропускать реальные замечания. Поэтому измерять стоит и расходы, и находки ревьюера. В статье эти проверки разобраны отдельно; общее сравнение затрат до и после изменений не было полностью контролируемым экспериментом. #ии #кодревью #оптимизация

2
GitHub снижает давление на общие базы и ограничивает распространение сбоев В сентябре GitHub зафиксировал два инцидента, ухуд
GitHub снижает давление на общие базы и ограничивает распространение сбоев В сентябре GitHub зафиксировал два инцидента, ухудшивших работу сервисов. В отчёте доступности инженеры описали изменения: снижение нагрузки на общие базы, защиту от перегрузки и более строгую изоляцию сбоев при работе с pull request. Параллельно продолжался перенос инфраструктуры в Azure. К 7 октября в Central US работали 120 из 160 производственных сервисов, но туда перенесли только 13 из 51 основной базы MySQL. Миграция ещё не завершена. Разбор стоит читать как список конкретных ограничений: где нагрузка нескольких сервисов сходится на общей базе, как система отсекает лишнюю работу и какие операции могут повлиять на соседние. Для своей архитектуры можно начать с общего ресурса, от которого зависит больше всего пользовательских сценариев, и проверить его поведение при перегрузке. #надёжность #базыданных
243
3
Байесовский A/B-тест тоже требует правил остановки «Будем смотреть результаты каждый день и остановимся, когда вероятность по
Байесовский A/B-тест тоже требует правил остановки «Будем смотреть результаты каждый день и остановимся, когда вероятность победы достигнет 95%». Байесовский подход сам по себе не гарантирует, что такая процедура удержит долю ложных срабатываний на нужном уровне. Spotify разбирает, от чего зависят эти гарантии. Значение имеют исходные предположения о возможном эффекте, модель данных и правило остановки. Разные настройки дают разные свойства, хотя все называются байесовскими. Компания сохраняет частотный подход: поддержка второго режима усложнила бы планирование и чтение результатов, а достаточной пользы команда пока не видит. Перед выбором инструмента определите, какие ошибки вы хотите контролировать и когда будете завершать эксперимент. Потом проверьте, обеспечивает ли выбранная настройка именно эти гарантии. #статистика #abтесты
253
4
Два Kubernetes-контроллера могут рассогласовать состояние одного приложения Uber вынес управление масштабированием в отдельны
Два Kubernetes-контроллера могут рассогласовать состояние одного приложения Uber вынес управление масштабированием в отдельный контроллер. Основной продолжил заниматься развёртыванием, а новый стал учитывать, сколько экземпляров требуется при переключении после отказа. Но оба обновляли один Kubernetes-ресурс. В сочетании с задержками кеша это приводило к расхождению метаданных и конфигурации ReplicaSet. Иногда приложение застревало до ручного вмешательства. Команда добавила обнаружение таких расхождений и автоматическое исправление. Для передачи статуса между контроллерами использовала номер поколения: прежде чем сообщить об успехе, контроллер проверяет, что видит достаточно свежую версию данных. Весь переход занял год. В статье есть разбор гонок и интеграционных тестов через kind — пригодится, если несколько контроллеров меняют связанные ресурсы. #kubernetes #распределённыесистемы
242
5
Настройки фронтенда можно менять без пересборки JavaScript Если адрес API зашит в сборку, при переносе приложения из тестовой
Настройки фронтенда можно менять без пересборки JavaScript Если адрес API зашит в сборку, при переносе приложения из тестовой среды в рабочую приходится собирать его заново. Хотя в коде ничего не изменилось. Heroku описала другой способ: при запуске веб-сервер читает переменные с префиксом PUBLIC_WEB_ и записывает их в data-атрибуты элемента <head>. Приложение получает значения через document.head.dataset. Одна проверенная сборка подходит для разных окружений. Чтобы изменить настройку, потребуется перезапустить сервер, но пересобирать JavaScript не нужно. При переходе на такую схему придётся проверить, где приложение читает параметры: они не должны сохраняться в коде на этапе сборки. И передавать через HTML можно только публичные значения — посетитель сможет их прочитать. #фронтенд #конфигурация
255
6
Отказ соседнего сервиса не всегда должен ломать весь запрос Сервис оформления заказа обращается к нескольким системам. Без од
Отказ соседнего сервиса не всегда должен ломать весь запрос Сервис оформления заказа обращается к нескольким системам. Без одной заказ не создать, а без другой можно обойтись. На схеме обе зависимости выглядят одинаково, но последствия отказа у них разные. Uber разбирает такие зависимости по деревьям вызовов. Если ошибка нижестоящего сервиса регулярно приводит к ошибке вызывающего, зависимость считают жёсткой. Если запрос продолжает выполняться — мягкой. Когда наблюдений недостаточно, вывод оставляют открытым. Так можно найти цепочки, по которым сбой доходит до пользователя, и точнее настроить оповещения. Для своего сервиса начните с одного важного сценария. Какие внешние вызовы обязательны для его завершения? Где предусмотрен запасной вариант? Затем проверьте по трассировкам, действительно ли приложение ведёт себя так, как задумано. #микросервисы #надёжность
256
7
Quick Tunnels ограничивает доступ к локальному приложению по адресам почты Показать приложение коллеге можно через временный
Quick Tunnels ограничивает доступ к локальному приложению по адресам почты Показать приложение коллеге можно через временный адрес Cloudflare. Чтобы ссылка открывалась только нужному человеку, добавьте --allowed-mail: cloudflared tunnel --url http://localhost:8080 \ --allowed-mail alice@example.com Посетитель вводит адрес и одноразовый код из письма. Cloudflare подтверждает владение почтой, а запущенный на вашей машине cloudflared сверяет адрес со списком разрешённых. В руководстве по защищённым Quick Tunnels показаны несколько адресов и маска домена. Возможность появилась в cloudflared 2026.9.3; аккаунт Cloudflare для этого сценария не нужен. Без --allowed-mail туннель остаётся публичным: приложение доступно любому, у кого есть ссылка. Чтобы изменить список, нужно остановить процесс и запустить новый туннель. Для постоянного имени и более сложных правил доступа авторы предлагают обычный Cloudflare Tunnel вместе с Cloudflare Access.
282
8
Удаление дублей из потока требует ограничить срок хранения уже встреченных ключей Чтобы распознать повторный заказ, обработчи
Удаление дублей из потока требует ограничить срок хранения уже встреченных ключей Чтобы распознать повторный заказ, обработчик должен помнить, что уже видел его идентификатор. Если помнить все ключи бесконечно, состояние будет расти вместе с потоком. В разборе Flink SQL David Anderson сравнивает DISTINCT, варианты ROW_NUMBER и собственную функцию обработки таблицы. Критерии шире, чем «дубли исчезли»: важны задержка, поздние события и наличие обновлений в выходном потоке. TTL ограничивает срок хранения состояния. После его истечения повторный ключ может снова пройти как новый. Значит, срок должен опираться на допустимый интервал повторной доставки. Есть и ловушка настройки: SQL-подсказка STATE_TTL не применяется к операторам Rank и Deduplicate. Для них автор указывает настройку TTL на уровне сессии. Перед выбором короткого SQL-запроса полезно проверить план выполнения и формат результата: поток только новых строк и поток изменений подходят разным потребителям.
271
9
Tachyon помогает найти дорогие вызовы в работающем Python-процессе В Python 3.15 появился статистический профилировщик Tachyo
Tachyon помогает найти дорогие вызовы в работающем Python-процессе В Python 3.15 появился статистический профилировщик Tachyon в модуле profiling.sampling. Он периодически снимает стек вызовов и умеет подключаться к уже запущенному приложению без изменения его кода. В примере Astral заметную долю времени занимало объединение вложенных списков перед подсчётом элементов: Counter(sum(symbols, [])) Сложение списков создаёт новые списки и повторно копирует уже накопленные элементы. По мере роста входа такая конструкция может стать дорогой. Авторы нашли её на диаграмме вызовов и заменили объединением через новый синтаксис включения списков Python 3.15. В локальном замере время снизилось примерно с 0,45 до 0,22 секунды. Это результат конкретного примера. Ценность профилировщика — в возможности сначала увидеть горячий участок своей программы, затем изменить его и повторить измерение. Доступность подключения к процессу нужно проверить для своей ОС и прав.
293
10
GitHub ускорил страницы, убрав генерацию стилей во время выполнения CSS-in-JS создавал работу и в браузере, и при серверном р
GitHub ускорил страницы, убрав генерацию стилей во время выполнения CSS-in-JS создавал работу и в браузере, и при серверном рендеринге. По мере роста числа компонентов дороже становились подготовка стилей и их обновление. Команда Primer перевела компоненты на CSS Modules: стили лежат рядом с кодом, имена классов локальны, а результат сборки отправляется обычными CSS-файлами. Выполнять JavaScript ради генерации этих стилей больше не нужно. Главной сложностью оказался переход. Старые и новые компоненты должны были работать одновременно. Пришлось разбирать динамические свойства, заменять стилизационные обёртки и отдельно переносить поддержку тем. Изменения выкатывали постепенно, под флагами. Миграция завершилась в июне 2026 года; сентябрьская статья описывает накопленный опыт. Полезный ориентир для профилирования интерфейса: учитывать не только объём загруженного кода, но и работу, которую он выполняет при каждом рендере.
300
11
Инвертированный индекс ищет документы по словам, а не просматривает каждую строку Запрос с несколькими LIKE '%слово%' может з
Инвертированный индекс ищет документы по словам, а не просматривает каждую строку Запрос с несколькими LIKE '%слово%' может заставить базу проверять длинные тексты строка за строкой. Для поиска по словам используется другая структура. Инвертированный индекс хранит словарь терминов и списки документов, в которых они встречаются. Для условия AND списки пересекаются, для OR — объединяются. Позиции слов позволяют искать фразы, частоты помогают оценивать релевантность. В разборе устройства поискового движка есть интерактивные примеры этих операций, а также объяснение BM25 и выбора лучших результатов. При этом найти совпадения и вернуть наиболее подходящие документы — разные этапы. Быстрый отбор кандидатов ещё не решает задачу ранжирования. И заменять LIKE на полнотекстовый поиск механически нельзя: поиск произвольной подстроки и поиск нормализованных слов имеют разную семантику.
298
12
Uber сократил память кеша переводов с 800 до 80–120 МБ Большинство переводов в сервисе редко запрашивали, но все они постоянн
Uber сократил память кеша переводов с 800 до 80–120 МБ Большинство переводов в сервисе редко запрашивали, но все они постоянно занимали память. При обновлении рядом со старым кешем появлялась новая копия — в приведённом примере ещё 800 МБ. В разборе Uber описана гибридная схема: востребованные значения остаются в памяти, остальные лежат на локальном диске. В памяти хранятся компактные метаданные, позволяющие быстро найти запись. Хранилище разделили на 256 частей с отдельными блокировками. Политику вытеснения тоже пришлось адаптировать: обновлять общую структуру при каждом чтении оказалось слишком дорого. При очередной загрузке кеш заранее наполняют переводами, которые использовали за последние 15 минут. Это уменьшает волну обращений к диску после обновления. В примере расход памяти составил 80–120 МБ, а для обновления понадобилось около 40 МБ дополнительных метаданных. При оптимизации кеша стоит измерять и обычное потребление, и пик во время его замены.
308
13
Как Go ускоряет небольшие выделения памяти В Go 1.27 выделения памяти размером до 80 байт ускорили с помощью специализированн
Как Go ускоряет небольшие выделения памяти В Go 1.27 выделения памяти размером до 80 байт ускорили с помощью специализированных функций. Они заранее знают класс размера и наличие указателей в объекте. В разборе команды Go объясняется, что это позволяет убрать часть вычислений и ветвлений. При известном размере компилятор может заменить вызов очистки памяти конкретными инструкциями. Редкие случаи уходят в общий путь обработки. Специализацию ограничили 80 байтами по результатам измерений. Больше вариантов означает больше машинного кода, который занимает кеш инструкций и может вытеснить код приложения. Для крупных объектов затраты на очистку памяти и так перекрывают выгоду. Сами выделения ускоряются до 20–30%, а программы с большим их количеством — до 1%. Эти цифры полезно различать: ускорение одной операции даёт выигрыш лишь в той части времени, которую программа на неё тратит. #go #производительность
340
14
Почему добавление шардов не спасает от крупного клиента База распределена по tenant_id, клиентов на шардах примерно поровну.
Почему добавление шардов не спасает от крупного клиента База распределена по tenant_id, клиентов на шардах примерно поровну. Затем один клиент вырастает в сотню раз и перегружает свой шард. Добавление серверов не разделит его данные, пока ключ распределения остаётся прежним. В разборе PlanetScale описаны три шага: увеличить ресурсы горячего шарда, изолировать крупного клиента, затем пересмотреть ключ для отдельных таблиц. Первые два дают запас, но одна большая таблица всё ещё может перерасти отдельный сервер. В приведённом примере Slack сообщения стали распределять по каналу вместо рабочего пространства. Это позволило разделить нагрузку крупного клиента и сохранить частый запрос сообщений канала в пределах одного шарда. Менять ключ сразу у всех таблиц не требуется. Сначала проверьте реальные запросы и соединения: какие данные должны оставаться рядом, а какие можно разнести без дорогих обращений ко множеству узлов. #базыданных #масштабирование
315
15
Как D1 управляет миллионами баз без задержки каждого запроса Когда платформа создаёт отдельную базу для каждого клиента или п
Как D1 управляет миллионами баз без задержки каждого запроса Когда платформа создаёт отдельную базу для каждого клиента или приложения, центральный каталог быстро становится источником лишних сетевых переходов. В разборе архитектуры D1 Cloudflare разделяет выполнение SQL, управление базами и фоновые процессы. Создание и удаление могут обращаться к центральному PostgreSQL. Путь каждого SQL-запроса стараются держать на периферии сети. Метаданные маршрутизации кешируются в Workers KV. Для обращения через привязку D1 к Worker нужные сведения уже находятся в самой привязке: отдельное разрешение идентификатора базы не требуется. Запрос проходит через прокси к Durable Object, обслуживающему базу. Учёт и аналитика работают асинхронно там, где допустима задержка согласования. При проектировании похожей платформы стоит отдельно нарисовать путь пользовательского запроса: какие центральные зависимости действительно нужны для его выполнения? #архитектура #масштабирование
319
16
Как Uber Eats сократил задержку поиска вдвое Быстрый ответ API ещё не означает, что пользователь увидел результаты. Команда U
Как Uber Eats сократил задержку поиска вдвое Быстрый ответ API ещё не означает, что пользователь увидел результаты. Команда Uber Eats стала измерять время до готовности первого экрана, включая изображения. В инженерном разборе описано, сколько лишней работы накопилось между запросом и выдачей. Ранжирование ждало загрузки цен, акций и наличия товаров, хотя эти данные нужны для отображения. Другие этапы выполнялись последовательно без реальной зависимости. Данные для ранжирования и показа разделили, независимые вычисления распараллелили. Первый ответ уменьшили до начальной страницы, остальные результаты сохранили для прокрутки. Пагинация и параллельное формирование элементов убрали более 200 мс из времени готовности первого экрана. Общее сокращение задержки вдвое получено набором изменений. Полезная точка для аудита своего сервиса: какие данные нужны прямо сейчас, а какие лишь заставляют критический путь ждать. #архитектура #производительность
295
17
Почему nextval нельзя вычислять где угодно Перенос вычисления с маршрутизатора на шард может ускорить SQL-запрос. Но с nextva
Почему nextval нельзя вычислять где угодно Перенос вычисления с маршрутизатора на шард может ускорить SQL-запрос. Но с nextval() такая оптимизация способна изменить результат. В разборе планировщика Neki показаны две сложности. Во-первых, независимые последовательности на шардах могут выдать одинаковые значения. Поэтому маршрутизатор получает новые номера через выделенный авторитетный шард. Во-вторых, важно число вызовов. Если JOIN превратил одну исходную строку в три строки результата, выражение nextval() в списке SELECT должно получить новое значение для каждой из них. Вычислить его один раз до соединения и размножить ответ нельзя. Похожее ограничение касается now(): в PostgreSQL оно связано с началом транзакции. Независимый вызов на каждом шарде может вернуть разные моменты времени. При распределении SQL по узлам приходится сохранять место, контекст и число вычислений выражения. #postgresql #архитектура
290
18
Почему одинаковое число ядер даёт разную мощность Две реплики сервиса получили одинаковый лимит CPU. На новом сервере запас е
Почему одинаковое число ядер даёт разную мощность Две реплики сервиса получили одинаковый лимит CPU. На новом сервере запас есть, на старом процессор перегружен. Для системы с лидером это особенно неприятно: после смены лидера нагрузка переезжает на более медленное железо. В разборе Uber описаны нормализованные вычислительные единицы Odin. Потребление CPU умножают на коэффициент производительности сервера, рассчитывают потребность кластера, затем переводят её обратно в ядра для конкретного хоста. Коэффициенты пришлось уточнять по реальной нагрузке: синтетических тестов оказалось недостаточно, а Kafka и Cassandra по-разному используют одни и те же серверы. Для Kafka такой подход сократил выделенное число ядер примерно на 8%. Это результат конкретного внедрения. При переносе сервиса между поколениями CPU стоит сравнивать время выполнения и запас под пиковую нагрузку, а не только число ядер. #инфраструктура #производительность
310
19
Как общий кеш выдавал пустые ответы MySQL У крупного клиента Hyperdrive примерно 0,001% запросов возвращали пустой результат,
Как общий кеш выдавал пустые ответы MySQL У крупного клиента Hyperdrive примерно 0,001% запросов возвращали пустой результат, хотя строки должны были быть. Ошибка появлялась только с включённым кешем. В расследовании Cloudflare причиной оказались разные представления ответа MySQL. Hyperdrive и пользовательский драйвер могли согласовать разные возможности протокола: в одном случае набор строк завершается пакетом OK, в другом нужен EOF. Два компонента Hyperdrive использовали общий кеш, когда находились в одном дата-центре. Один сохранял исходные байты, другой — уже преобразованные для драйвера. При чтении чужой записи ответ мог завершиться раньше времени или зависнуть. Исправление: сохранять в кеше единое представление, а преобразование выполнять при выдаче клиенту. Если несколько компонентов разделяют кеш, им нужен общий контракт формата значения, включая особенности протокола. #кеширование #разборы
297
20
Почему уменьшение ответа API не всегда ускоряет запрос Чтобы построить историю звёзд репозитория, инструменты выгружали стран
Почему уменьшение ответа API не всегда ускоряет запрос Чтобы построить историю звёзд репозитория, инструменты выгружали страницы пользователей и оставляли только даты. Для React это требовало примерно 2500 запросов. В разборе GitHub показано, почему простая замена пользователей дневными счётчиками не решала проблему. База сначала группировала все звёзды, сортировала результат и лишь затем применяла LIMIT и OFFSET. Маленький JSON всё ещё требовал большой работы. Новый API сначала переводит страницу в диапазон дат по индексу created_at, затем считает звёзды только внутри него. Один ответ покрывает до 30 недель. Для React полная выгрузка сократилась примерно до 24 запросов. При оптимизации отчётов проверьте, где именно ограничивается выборка: после агрегации или до неё. Размер ответа этого не показывает. #базыданных #производительность
298