Веб-версияОткрыть в Telegram
ССохранёнки программиста

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

@prog_stuff · канал · Технологии · в индексе с 2026-05-20
6 515подписчиков−4 за неделю
695средний охват поста
10.7%ER — охват к подписчикам
68постов за 30 дней
Сохранёнки программиста
Фотография
нажмите — покажем
Как читать Big O и находить лишнюю сложность в коде Обстоятельная интерактивная статья объясняет Big O без секундомера: нотация показывает, как растёт время работы вместе с объёмом входа. O(1), O(log n), O(n) и O(n²) разобраны на графиках и примерах JavaScript. Карта материала: 1. сумма циклом растёт линейно, а формула (n × (n + 1)) / 2 требует постоянного числа операций; 2. пузырьковая сортировка в худшем случае проходит n элементов n раз; 3. бинарный поиск отбрасывает половину вариантов за шаг и находит число среди миллиарда не более чем за 31 попытку. Практический блок переносит теорию в код. Поиск в массиве имеет O(n), в Set: O(1), но создание new Set(items) требует O(n). Материал пригодится, чтобы оценивать алгоритмы по росту затрат и учитывать цену подготовки вместо единичных замеров.
6 · 348 ·
С
Фотография
нажмите — покажем
Как устроена машина Тьюринга и где проходит граница вычислимого Интерактивная статья ведёт от устройства машины к пределам вычислений. У неё четыре части: лента, головка, программа и состояние. Пять команд позволяют печатать символ, двигать головку, менять состояние и останавливать выполнение. Примеры запускаются в тексте и прокручиваются пошагово вперёд или назад. Сначала машина бесконечно печатает нули, затем чередует 0 и 1 и складывает 2 и 6 в двоичной записи. Дальше разбор «Turing Machines» переходит к задаче остановки: нельзя написать программу, которая по любой программе и входным данным наверняка определит, завершится вычисление или будет идти вечно. Через этот предел объясняется полнота по Тьюрингу: система полна, если может смоделировать машину Тьюринга. Читать стоит тем, кто хочет связать определение с исполняемыми примерами и понять границы алгоритмов.
6 · 389 ·
Сохранёнки программиста
Фотография
нажмите — покажем
30 паттернов распределённых систем Это карта готовых решений для систем, где узлы отказывают, сеть задерживает сообщения, а копии данных нужно синхронизировать. Материал можно читать от своей задачи: • упорядочить изменения: логические часы Лэмпорта, гибридные часы и векторы версий; • синхронизировать копии: ведущий с последователями, реплицируемый журнал и консенсус Paxos; • ускорить запросы: чтение с ведомых узлов, пакеты и конвейер запросов; • обслуживать журналы: отмечать последнюю репликацию и часть, которую уже можно удалить. Catalog of Patterns of Distributed Systems даёт краткое описание каждого решения и ссылки на главы онлайн-книги. Архитекторам и бэкенд-разработчикам стоит сопоставить сбой или узкое место своей системы с готовым механизмом, прежде чем проектировать свой протокол.
11 · 349 ·
Ссылка
нажмите — покажем
Как устроена база данных: собираем клон SQLite на C Это обстоятельная серия для тех, кому знаком SQL, но путь данных от запроса до файла скрыт за интерфейсом СУБД. Автор строит клон SQLite с нуля на C и документирует каждый слой. Всего 15 частей: маршрут идёт от цикла чтения команд и компилятора SQL к многоуровневому B-дереву. Сначала появляются цикл чтения команд, простейший компилятор SQL и виртуальная машина. Затем одна таблица в памяти получает тесты, сохранение на диск и курсор для обхода записей. Дальше автор разбирает формат узлов B-дерева, двоичный и рекурсивный поиск, разделение узлов и обновление их родителей. В серии How Does a Database Work? удобно идти по порядку и смотреть, как знакомые операции превращаются в структуры данных. Читать стоит разработчикам, которые работают с SQL и хотят разобраться в индексах, полном сканировании таблицы и границе между памятью и диском.
7 · 353 ·
С
Ссылка
нажмите — покажем
Как агенты тестируют код и почему одного промпта мало В исследовании агенты реализовывали Zstd на Rust и по указанию применяли TDD (разработку через тесты), фаззинг, тестирование свойств или формальные методы. Автор сравнил 26 вариантов промпта и 4 навыка, по 80 запусков на условие и уровень рассуждений. Режим без дополнительных инструкций оказался выше среднего. На максимальном уровне фаззинг и тестирование свойств были чуть лучше формальных методов, а рекомендованные навыки и TDD показали слабые результаты. Агенты доказывали малозначимые свойства или перебирали случайные данные, часто попадая в отбраковку. Тест с 4 одинаковыми входными потоками не замечал их перестановку. Исследование How well do agents use test/verification techniques? стоит прочитать тем, кто принимает агентный код: проверяйте, какую ошибку способен обнаружить тест, а не только зелёный результат.
4 · 359 ·
Сохранёнки программиста
Фотография
нажмите — покажем
Как Uber переписала шардирование Schemaless на Go без простоя Подробный технический разбор миграции хранилища. Материал ценен схемой перехода между реализациями: новая сначала пропускала запросы к старой, затем команда переносила по одной операции. Карта материала: 1. чтение выполняли обе реализации, после чего ответы сравнивали; 2. долю проверки меняли настройкой, поскольку она удваивала запросы к узлам хранения; 3. запись проверяли интеграционными тестами и тестовым трафиком: один запрос мог успешно выполниться лишь раз. После миграции медианная задержка всех запросов уменьшилась на 85%, 99-й перцентиль на 70%, загрузка процессора более чем на 85%. В разборе Uber Engineering стоит изучить совместимость и переключение долей трафика. Для критичного сервиса заранее разделите проверки чтения и записи.
3 · 349 ·
С
Фотография
нажмите — покажем
Go 1.27: что проверить перед обновлением сервисов Практический обзор Go 1.27 отделяет ускорение после пересборки от изменений, которые требуют проверки кода. Для типичных серверных нагрузок автор приводит прирост 3–5%, для отдельных микротестов до 10%. Причины: более точное встраивание функций компилятором и меньше расходов на выделение памяти. Отдельно разобраны сборщик мусора для сервисов с сотнями гигабайт живых данных и встроенная функция clear. Она очищает срезы и карты без нового выделения памяти, что пригодится при повторном использовании буферов. Данные DWARF помогают отладчику лучше показывать переменные, а go mod tidy оставляет меньше шума в изменениях go.mod. В практическом гайде на DEV Community можно сверить детали перед обновлением. Сохраните его, если поддерживаете Go-сервисы: пересоберите стенд и сравните скорость, паузы сборщика мусора и отладку на своей нагрузке.
2 · 330 ·
Сохранёнки программиста
Фотография
нажмите — покажем
Как отсекать партиции PostgreSQL при поиске не по ключу разбиения Таблица событий разбита по времени, но запрос по session_id обращается ко всем партициям. Локальный индекс ускоряет поиск в каждой, однако их число не сокращает: при сотне партиций это похоже на запрос к сотне таблиц. Приём применим, когда события только добавляются, ID сессий растут последовательно, а сессии обычно длятся минуты или часы. Тогда ID связан со временем: для каждой партиции можно задать его диапазон через CHECK. Оптимизатор исключит партицию, где нужного ID быть не может. В примере для ID 1000 сканируется только партиция 2025 года вместо двух. В обстоятельной статье Хаки Бениты разобраны локальные и глобальные индексы, выбросы и схема «пробелы и острова». Материал пригодится тем, кто выбирает ключ разбиения таблицы: проверьте связь данных и план через EXPLAIN, прежде чем закреплять диапазоны ограничениями.
5 · 338 ·
С
Фотография
нажмите — покажем
Почему одинаковый nvJPEG2000 даёт разные результаты в тестах Обстоятельный разбор показывает, как границы таймера и подача кадров меняют результаты nvJPEG2000 на RTX 4090. Асинхронная очередь GPU делает методику частью результата. В образце NVIDIA декодирование замеряют CUDA-событиями корректно, но разбор сжатого потока считают в целых секундах. Миллисекунды превращаются в ноль, поэтому число охватывает лишь часть работы. В подробном разборе методики авторский стенд включает оба этапа; код и логи открыты. Есть и второй подвох: восемь потоков с двумя кадрами в работе дают 16 одновременных задач, хотя пакетного вызова у библиотеки нет. Разбор пригодится разработчикам GPU-конвейеров и авторам бенчмарков: сверяйте не только кадры в секунду, но и границы таймера, синхронизацию и число активных кадров.
1 · 325 ·
Сохранёнки программиста
Фотография
нажмите — покажем
Как собрать GraphRAG для данных ServiceNow на Python и Neo4j Обстоятельная книга о пути от данных ServiceNow до ответов языковой модели. Python читает записи, Neo4j связывает их в граф, а найденные сущности становятся контекстом для ответа. На 39 заранее записанных вопросах автор сравнивает восемь методов извлечения: от ключевых слов до обхода графа. Ни один не ответил на исходный вопрос книги. Материал пригодится разработчикам поиска и внутренних баз знаний: он показывает, как заранее определить тесты, сравнить подходы и зафиксировать провалы.
5 · 317 ·
С
Фотография
нажмите — покажем
Как настроить распределённую трассировку Java-микросервисов с OpenTelemetry Обстоятельный разбор OpenTelemetry показывает, как связать путь запроса через Java-микросервисы и найти сервис, запрос к базе или внешний вызов, который добавляет задержку. Карта материала: 1. почему разрозненные логи и метрики не восстанавливают путь запроса; 2. как SDK собирает трассы, метрики и логи, а процессоры фильтруют и группируют их; 3. как подключить Maven, экспорт по OTLP, Jaeger и собственные участки трассы. Примеры рассчитаны на Spring Boot 3.x и OpenTelemetry 1.35.0: стартер автоматически охватывает HTTP, JDBC, JPA, Kafka и RabbitMQ. Локальный Jaeger запускается через Docker Compose; бизнес-операции можно размечать собственными участками трассы. Подойдёт Java-бэкендерам и SRE: на тестовом стенде проверьте сквозной идентификатор trace_id, а перед рабочей средой пересмотрите выборку в 100%.
3 · 331 ·
Сохранёнки программиста
Фотография
нажмите — покажем
Как вынести тени в отдельные проходы Custom SRP в Unity Обстоятельное продолжение серии о собственном конвейере рендеринга на Unity 6000.5.8f1. Рефакторинг ведут поэтапно: после каждого раздела тени остаются рабочими, поэтому материал читается как карта безопасного изменения архитектуры. Сначала объект Shadows уходит из LightingPass под управление CameraRenderer. Затем LightingPass получает структуру Handles и возвращает только буферы освещения. После появляется отдельный ShadowsPass: он строит списки отрисовки, запускает рендеринг теней и отдаёт их дескрипторы. Дальше код из Shadows переносят в новый проход, чтобы затем разделить обработку направленных и остальных источников света. Разбор с правками кода полезен тем, кто уже строит Custom SRP. Ориентир для рефакторинга: разделяйте владение состоянием и запись проходов небольшими шагами, проверяя тени после каждого.
1 · 302 ·
С
Фотография
нажмите — покажем
Как устроена криптография Ethereum-кошелька на Go Статья о цепочке «создать ключ, получить адрес, подписать транзакцию»: автор собирает учебный CLI-кошелёк на Go и показывает детали, от которых зависят совместимость и безопасность. В практическом разборе разбираются BIP39, путь BIP44 и соглашения для поля v, защищающего транзакции от повторного воспроизведения. Тест «зашифровали и расшифровали» не нашёл ошибку в параметрах scrypt: обе операции повторяли её. Нужен эталонный набор данных. CLI создан для обучения, не для реальных средств. Читайте, если хотите проверить реализацию Ethereum-стандартов в Go.
1 · 320 ·
Сохранёнки программиста
Фотография
нажмите — покажем
Как исследовать легаси-код с ИИ до первого рефакторинга Гайд по «археологии» незнакомой системы: странное условие или повторный расчёт могут хранить бизнес-исключение либо внешний контракт. ИИ здесь нужен для поиска вопросов, а не мгновенной переписи кода. Начните с карты репозитория и точек входа: HTTP-запросов, фоновых задач, скриптов, импортов и вебхуков. Каждый вывод модели должен ссылаться на конкретные файлы, а сомнения нужно отмечать явно. Готовые запросы к ИИ и маршрут анализа пригодятся при миграции или работе со старым проектом. До рефакторинга составьте проверяемую карту системы и список открытых вопросов.
4 · 301 ·
С
Фотография
нажмите — покажем
Как запускать асинхронное GRPO без общей машины Обстоятельный разбор рабочей системы: тренер с LoRA и серверы генерации работают в отдельных Hugging Face Jobs, без общей машины и межузлового обмена через NCCL. Тренер кладёт адаптер в объектное хранилище, которое каждый Job видит как файловую систему. Прокси добавляет авторизацию, выбирает реплику, где уже вычислено начало запроса, и сообщает всем репликам о новой версии. Адаптер ранга 1 для модели на 1,5 млрд параметров занимает несколько мегабайт против примерно 3 ГБ у полной модели. При max_staleness=4 нужны шесть слотов LoRA, иначе vLLM может вытеснить версию с незавершёнными запросами. Схема и пять последовательных прогонов показывают, где искать узкое место: 500 шагов удалось сократить с 3 часов 27 минут до 53 минут. Читать ML-инженерам, которые разносят обучение и генерацию по отдельным машинам.
1 · 302 ·
Сохранёнки программиста
Фотография
нажмите — покажем
Почему 118 зелёных тестов не спасли MQTT-брокер на Rust Обстоятельный инженерный разбор MQTT-брокера, написанного на Rust без сторонних пакетов. 118 автоматических тестов прошли, но mosquitto_pub в режиме доставки QoS 1 ждал подтверждения четыре секунды и завершался по тайм-ауту. Тесты проверяли кодирование пакета подтверждения PUBACK, однако обработчик вообще его не отправлял. После разделения реестра тем на четыре сегмента вскрылся второй сбой: подписка sensors/+/temp и публикация sensors/kitchen/temp попадали в разные сегменты. В разборе BlitzBroker есть и замер: около 495 тыс. сообщений в секунду против 402 тыс. у одного сегмента. Читать разработчикам сетевых протоколов и интеграционных тестов. Проверяйте собранный бинарник независимым клиентом: подтверждения, подписки с подстановкой и переполнение очередей.
2 · 292 ·
С
Фотография
нажмите — покажем
Как переводить целые книги с LLM и не терять контекст Практический разбор Python-пайплайна для EPUB и PDF. Книгу делят по главам, затем на фрагменты по 2 000–4 000 токенов. В новый запрос обычно добавляют два последних абзаца только как контекст и словарь имён и терминов: так связность сохраняется без повторного перевода. В разборе пайплайна есть код для подсчёта токенов и разбиения абзацев. Внутри главы запросы идут по очереди: следующий зависит от предыдущего. Параллельно обрабатывают разные книги. Для романа на 100 000 токенов авторы приводят ориентир: около 30 запросов и 4–6 минут. Сохраните разбор, если работаете с длинными документами. Инженерный вывод: перекрытие фрагментов и отдельная память о терминах улучшают связность, но зависимые части придётся обрабатывать по очереди.
10 · 297 ·
Сохранёнки программиста
Фотография
нажмите — покажем
Как ИИ меняет большие миграции: опыт Asana, Airbnb и Uber В обстоятельном разборе крупных миграций важно сравнение процессов: срок одной компании нельзя переносить в свой план. Asana начала перенос 4 000+ файлов с Enzyme на React Testing Library в 2024 году, обработала около 25%, а остаток завершила с ИИ за две недели и $12 000. Пять лет до этого были сроком низкоприоритетной миграции, а не непрерывной работы команды. Сначала спроектируйте проверку результата, затем оценивайте, сколько типовых изменений можно поручить ИИ.
1 · 275 ·
С
Фотография
нажмите — покажем
Как искать нарушения IEEE 754 в математических ядрах ИИ-ускорителей Обстоятельный разбор аудита tt-metal показывает, почему случайные тесты не заменяют таблицу особых значений. Функция ttnn.atan2 для +∞ и +0 возвращала 0 вместо π/2: конечный диапазон тестов этот случай не создавал. Карта расследования: 1. Заранее записать эталон для ±0, ±∞, NaN и значений у границ диапазона; 2. восстановить алгоритм ядра и вручную провести через него каждый случай; 3. заменить ошибочную проверку min == 0 на max == 0 во всех трёх аппаратных копиях; 4. закрепить точные входы детерминированным тестом. В полном разборе поиска и исправления ошибки ценен порядок работы: спецификация идёт раньше кода, а крайние значения становятся регрессионными тестами. Читать разработчикам вычислительных библиотек и ML-инфраструктуры, которые проверяют численную корректность ускорителей.
1 · 271 ·
Сохранёнки программиста
Фотография
нажмите — покажем
Producer-Consumer в Java, Go и Rust: как выбрать уровень решения Разбор трёх способов связать производителей и потребителей через ограниченный буфер. Выбор зависит от требований к задержке, а не от языка. В Java блокирующая очередь останавливает производителя при заполненном буфере, в Go это делает буферизированный канал, в Rust кольцевой буфер с атомарными операциями позволяет убрать блокировки. Сравнение трёх уровней решения пригодится разработчикам многопоточных систем. Начинайте со стандартной очереди, а атомарные алгоритмы выбирайте под измеренный предел задержки.
2 · 239 ·
Фотография
нажмите — покажем
Как искать баги, которые не воспроизводятся в тестах В обстоятельном разборе трёх расследований повреждение SQLite, потеря сообщений в TCP-сервисе и гонки в биллинге сводятся к одной методике: редкий сбой ищут телеметрией из рабочей среды, а не догадками. Гонка между контрольной точкой SQLite и записью прожила минимум 16 лет. В TCP-сервисе четыре счётчика показали потерю: сервер разобрал 100 000 строк, но отправил 99 987 ответов, потому что принимал вызов read() за готовое сообщение. Ставьте счётчики на границах слоёв, меняйте по одной переменной и подтверждайте исправление положительным сигналом. Читать бэкенд-разработчикам и инженерам эксплуатации, которые расследуют редкие сбои в продакшене.
4 · 230 ·
Фотография
нажмите — покажем
Отредактировал снимок билета без сброса криптографической даты В стандарте C2PA подпись связывает провенанс с содержимым, а штамп времени фиксирует создание подписи. Но спецификация позволяет исключать произвольные диапазоны байтов из расчёта хеша привязки. Дэвид Бьюкенен показал, как обойти защиту: он исключил из расчёта весь файл целиком. Хеш изображения превратился в хеш пустой строки, поэтому изменение пикселей не нарушало подпись с прежним штампом времени. Для демо автор снял лотерейный билет до тиража, а после публикации результатов вписал выигрышные числа. Сервер времени работал штатно, подпись корректна, а выигрыш остался демонстрационным. В эксперименте автора проверка подписи проходит: валидаторы принимают манифест, дата предшествует тиражу, хотя изображение подписью не защищено. Инженерный урок: исключения из хеша должны строго ограничиваться стандартом и валидаторами, иначе заверяется пустота. @prog_stuff
3 · 222 ·
С
Go расширил экспериментальный SIMD без ассемблерных вставок В Go 1.27 разработчики представили пакет simd/archsimd (включается флагом GOEXPERIMENT=simd): эксперимент для amd64 (AVX, AVX2, AVX-512) начался в 1.26, а в 1.27 добавили arm64 (NEON) и wasm (128-битный SIMD). Вместо си-интринсиков предложены методы вроде ShiftAllLeft, а выражение x.Add(y).Masked(m) на AVX-512 компилируется в одну инструкцию VPADD. Разницу платформ учли в именах: PermuteOrZero на amd64 обнуляет байт при отрицательном индексе, а LookupOrZero на arm64 и wasm обнуляет байт при любом индексе вне диапазона от 0 до 15. Пример из статьи — разворот порядка бит в байтах через матричное умножение GFNI константой 0x8040201008040201: 64 байта обрабатываются за один шаг без таблиц поиска и сдвигов. Также авторы сформулировали три правила для надежности и скорости. Инструкции требуют проверок фич CPU (archsimd.X86.AVX512() и других): иначе на неподдерживаемом процессоре программа упадет с SIGILL, а компилятор не сможет объединять операции. Границы стрид-цикла советуют писать как i < len(src)-v.Len()+1, чтобы оптимизатор убрал проверки среза. Наконец, векторы не стоит заворачивать в большие структуры или массивы: ABI Go пока выгружает крупные композитные типы из регистров в память. @prog_stuff
210 ·
Сохранёнки программиста
Фотография
нажмите — покажем
Как Apache Hudi отсекает лишние партиции и файлы Это первая часть обстоятельного разбора индексной подсистемы Hudi. Материал объясняет, как таблица метаданных ускоряет поиск записей и помогает не читать заведомо лишние данные. Таблица метаданных сама устроена как Hudi Merge-on-Read и разделена по типам индексов. В HFile ключи отсортированы, а индекс блоков помогает найти нужный блок в памяти и прочитать его с диска. По умолчанию работают индексы файлов, статистики столбцов и статистики партиций. Для условия price >= 300 Hudi сначала отбрасывает партиции по максимумам цен, затем файлы по статистике отдельных столбцов. Индексы обновляются в той же транзакции, что и данные, а уплотнение запускается после каждых 10 операций записи в таблицу метаданных. Инженерам данных стоит сверить набор индексируемых столбцов: без явной настройки Hudi берёт первые 32.
2 · 162 ·
С
Фотография
нажмите — покажем
Почему BPF LPM trie замедляется с ростом таблицы префиксов Обстоятельный разбор сбоя Cloudflare в продакшене начинается с блокировки процессора: освобождение BPF-карты с миллионами записей заняло более 10 секунд. Автор объясняет устройство trie, поиск самого длинного префикса и ограничения реализации в ядре Linux. Узлы лишь с двумя потомками заставляют плотную карту проходить цепочку однобитовых сравнений; сжатия уровней нет. Разрозненные адреса узлов дают промахи кэша L1, а примерно с 80 000 записей узким местом становятся промахи dTLB при преобразовании адресов. При миллионе записей скорость поиска падает примерно до 1,5 млн операций в секунду. Читать стоит разработчикам сетевых сервисов и тем, кто эксплуатирует BPF-карты. Прогоните поиск и освобождение карты на своей плотности ключей и объёме данных: распределение префиксов определяет эффективность сжатия путей.
1 · 125 ·

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Чего мы не делаем · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем