Сохранёнки программиста
前往频道在 Telegram
Заметки и ссылки на будущее, чтобы изучить когда будет время. Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Другие наши проекты: https://tprg.ru/med
显示更多6 606
订阅者
-224 小时
-37 天
-2630 天
帖子存档
На Tproger вышел обзор онлайн-магистратуры МФТИ «Технологическое предпринимательство» — глазами разработчика, который пошёл туда после 10 лет в коммерческой разработке.
О чём: почему он не стал запускать стартап без подготовки и бросал онлайн-курсы на середине; как выглядит учёба изнутри: вебинары по выходным, персональный ментор и 1000 часов работы над собственным проектом; где программа слабая (разные стадии проектов в одной группе, неровный фидбек); во сколько магистратура обойдётся в 2026 году и как проверить формат до оплаты.
Полная статья: https://tproger.ru/articles/skolko-stoit-stat-predprinimatelem-obzor-onlajn-magistratury
@prog_stuff
Баг, который 15 лет жил во всех дистрибутивах Linux
Команда VEGA разобрала use-after-free на стеке ядра (CVE-2026-43499): дефект пролежал в коде с 2011 года и присутствовал в каждом крупном дистрибутиве. Для срабатывания не нужны ни привилегии, ни специальная конфигурация ядра.
Корень — в механике futex с наследованием приоритета. Функция, снимающая поток с ожидания, чистит поле
pi_blocked_on у current. На обычном пути это корректно, но на «proxy»-ветке current — уже не тот поток, что спит в ожидании, и у спящего остаётся висячий указатель на фрейм собственного, уже свёрнутого стека.
Дальше — образцовая цепочка эксплуатации: контролируемые байты распыляются на освобождённый стек, подделывается структура ожидателя, обходится KASLR. В итоге — эскалация до root и выход из контейнера со стабильностью 97%. За это Google выплатил команде 92 337 долларов по программе kernelCTF.
Полная статья: https://nebusec.ai/research/ionstack-part-2/
Сохранять тем, кто хочет увидеть, как одно неверное допущение про «кто сейчас current» превращается в root на пятнадцать лет вперёд.
@prog_stuffRepost from Веб-страница
UI-паттерны, которые скоро можно делать без JS
Если верстаете интерфейсы каждый день, я бы сохранил этот доклад Уны Кравец с CSS Day 2026 в закладки. Она разобрала, как новые CSS-возможности убирают типичный скриптовый код: sticky-заголовок прячется через
scroll-state(stuck: top), а hover-тултипы собираются на атрибутах interesttarget и popover=hint — почти без JavaScript.
Ещё два момента: sibling-index() задаёт staggered-задержки прямо в CSS, а border-shape позволяет рисовать необычные формы границ вместо border-radius. Пока часть фич работает не везде — polyfill для invokers не тянет на мобильные, так что в прод пока не нёс бы. Но следить стоит: платформа берёт на себя то, за что мы раньше тащили библиотеки.
Видео доклада на YouTube.«Бесполезный» if ускорил цикл в четыре раза
Автор блога purplesyringa разобрала горячий цикл своего компрессора:
j = next_j[i][j], одна инструкция mov. Казалось бы, предел. На деле это pointer chasing — каждая итерация ждёт, пока из памяти придёт результат предыдущей, и весь цикл сидит на латентности, хотя вычислений почти нет.
Трюк: обернуть присваивание в if (j != next_j[i][j]). Предсказатель ветвлений считает тело маловероятным, процессор спекулятивно гонит следующие итерации параллельно, а на редком промахе сам откатывает записи. В бенчмарке 320 мкс превратились в 80.
Отдельная линия сюжета — война с компилятором: с его точки зрения такой if бессмысленен, и оптимизатор его выкидывает. Пришлось имитировать независимость условия через volatile; читатели позже нашли, что LLVM достаточно [[unlikely]]. А «правильный» рефакторинг с битовой маской вышел бы медленнее: тест бита на x86 дороже сравнения.
Полная статья: https://purplesyringa.moe/blog/quadrupling-code-performance-with-a-useless-if/
@prog_stuffНа Tproger вышел разбор о том, чем пет-проект отличается от бизнеса. Разговор с Вячеславом Чикиным — серийным предпринимателем и замзавкафедрой технологического предпринимательства МФТИ.
О чём: почему бизнес начинается с чужой проблемы, а не с технологии; почему ценность решения нельзя придумать из головы (с историей про AR-очки для сборщиков трамваев, которые отвергли сами рабочие); чем предприниматель отличается от менеджера и почему тимлид — не ступенька к фаундеру; почему продукт с первыми пользователями и выручкой — ещё не бизнес, пока всё держится на одном человеке.
https://tproger.ru/articles/pochemu-vaw-pet-proekt-eshhyo-ne-biznes-a-vy-ne-predprinimatel
@prog_stuff
Почему DuckDB обгоняет Spark на одной машине
Разбор от endjin объясняет, как встраиваемая база DuckDB превращает ноутбук в инструмент для аналитики на миллиардах строк: скорость здесь — не в масштабе, а в бережном использовании железа. Колоночное хранилище читает только нужные столбцы, векторизованное выполнение обрабатывает данные пачками по 1024–2048 значений, умещаясь в кэш процессора, а min-max-индексы пропускают целые группы строк по фильтрам. Всё параллелится на все ядра.
В тесте TPC-H DuckDB на одной машине справилась за 1 минуту 16 секунд, Spark на 32 узлах — около 8 минут. Распределённые накладные расходы дороже выигрыша от кластера.
Это не замена PostgreSQL или Kafka: один писатель, одна нода, petabyte уйдут в распределённые системы. Статья полезна тем, кто строит ETL и хочет понять, где сидит производительность.
Сохраните, если выбираете инструменты для аналитики.
Почему картинка NES дрожит, хотя кадр статичный
Если подключить NES по композитному видео, изображение заметно «плывёт» даже на неподвижной сцене. Автор блога Nicole Express разобрала по таймингам, откуда берётся эта дрожь и почему она была спроектирована намеренно.
🔘 в стандарте NTSC частота цветовой поднесущей делится на частоту строк с остатком ровно 0,5 — RCA подобрала это полуцелое число специально, чтобы телевизору было проще отделять цвет от яркости;
🔘 кварц NES на 21,47727 МГц — это ровно шесть частот поднесущей, а видеочип PPU использует оба фронта сигнала, отсюда 12 фазовых оттенков в палитре приставки;
🔘 но строка у NES длиннее стандартной: 341 точка. На строку приходится не 227,5, а 227,33 цикла цвета, поэтому фазовый узор повторяется каждые три строки, а не две — картинка и рябит иначе, чем у Apple II или PC Engine;
🔘 инженеры Ricoh намеренно «портят» одну строку кадра: она чередуется между 341 и 340 точками, из-за чего из трёх возможных фазовых выравниваний экран видит только два, сменяющихся через кадр. Автор называет это самой ленивой версией интерлейсинга;
🔘 в PAL-версии приставки этого трюка нет вовсе — там другой кварц и другие делители;
🔘 по шуму на скриншотах Battletoads виден трёхкадровый повторяющийся узор: игра каждый кадр отключает рендеринг на несколько строк ради записи в видеопамять, и «пропавшая точка» проявляется прямо в помехах.
Полная статья: https://nicole.express/2026/phase-altering-by-line.html
Сохранять тем, кто любит, когда странности старого железа объясняются до последнего такта.
@prog_stuff
Rust, Go или Zig: как не ошибиться с языком для нагруженного бэкенда
Обстоятельный разбор того, как выбирать язык для высоконагруженного бэкенда в 2026 году. Не сравнение синтаксиса, а реальные сервисы: API, шлюзы, обработка событий, парсинг под нагрузкой.
Автор разбирает три языка: Go (стандарт для микросервисов), Rust (для предельной задержки и контроля памяти, но с borrow checker и долгими сборками), Zig (для узких критичных участков и интеграции с C-кодом). У каждого своя цена, скорость разработки и сценарии, где он выигрывает.
Главный вывод — не искать победителя, а смешивать: Go для скорости разработки, Rust или Zig для горячих путей. Мигрировать стоит только после профилирования, иначе оптимизация обойдётся дороже выгоды.
Сохранить тем, кто выбирает стек для нового сервиса или думает, почему в их системе растёт задержка.
Баг, который семь лет видели только левши
Читатель пожаловался Теренсу Идену: скроллишь его блог с телефона, и вдруг посреди прокрутки открывается форма ответа на комментарий. Иден скроллит собственный сайт постоянно и ничего такого не встречал. Разгадка в пальцах: он листает правым большим пальцем, а читатель — левым. Ссылка «ответить» стоит у левого края страницы, ровно там, где ложится левый палец при прокрутке.
Причина оказалась археологической. В 2017 году в WordPress добавили обработчик touchstart на клики по ссылкам — когда-то так обходили задержку в 300 мс, которую мобильные браузеры выдерживали между тапом и кликом, чтобы отличить его от двойного тапа для зума. Браузеры избавились от этой задержки ещё к 2015-му, то есть код был бесполезен уже в момент добавления. А побочный эффект остался: касание ссылки при скролле срабатывало как клик.
Баг зарепортили семь лет назад. В итоге Иден сам закоммитил фикс — удалил пару строк, переживших свою причину на десятилетие. А в WHATWG он в шутку предложил тег meta handed="right", чтобы левши на праведные сайты вообще не заходили.
Полная статья: https://shkspr.mobi/blog/2026/07/a-bug-which-only-affected-left-handed-users/
Сохранять тем, кто подозревает, что в их проекте тоже живут обходные пути, чью причину уже никто не помнит.
@prog_stuff
Каждый, кто работал с легаси, знает это чувство: код вроде бы живой, но каждая фича даётся всё тяжелее, а на вопрос «почему так долго?» хочется ответить «потому что там всё сложно». Вот только бизнесу это ничего не объясняет — «плохой код» звучит как внутренняя боль разработчиков, а не как аргумент.
Аргументировать необходимость рефакторинга на самом деле можно. Оказывается, надо просто перевести техдолг в деньги: сколько теряется каждый месяц из-за замедлившейся разработки и багов и за какой срок рефакторинг окупится. В новом материале разбираемся, как посчитать ROI рефакторинга и с какими аргументами идти к менеджменту.
Почему банки теряют клиентов на вводе паспорта
В расчётно-кассовом обслуживании паспорт требуется почти для каждой операции: открытие счёта, обмен валюты, подтверждение личности. Пара минут на ручной перенос данных в масштабе банка превращается в очереди, ошибки операторов к вечеру и рост операционных расходов.
Авторы разбирают, как ИИ убирает это узкое место: документ распознаётся, поля заполняются автоматически, без ручного перепечатывания. Итог: быстрее обслуживание, меньше ошибок и предсказуемая нагрузка на отделение.
Автоматизация РКО влияет не только на внутреннюю эффективность, но и на лояльность клиентов. Если вы работаете с финтехом, интерфейсами крупных систем или высоконагруженными сервисами, где маленькая операция влияет на метрики, стоит сохранить.
Майк Боулер, консультант по инженерным командам, измерил уровень CO2 в переговорках портативным датчиком: на улице около 400 ppm, а в закрытой комнате с несколькими людьми показатель за первый час переваливает за 1000. Его личный рекорд на фото в статье — 2143.
Дальше цифры из исследований. В эксперименте Лаборатории Беркли при 1000 ppm результаты испытуемых упали на шести из девяти показателей качества принятия решений, при 2500 ppm — на семи, причём часть до уровня, который исследователи назвали дисфункциональным. Гарвардское исследование показало, что сильнее всего страдают стратегия, планирование и работа с информацией под давлением — ровно то, ради чего людей и собирают в переговорку.
Изнутри это не ощущается: туман в голове списывают на длину встречи или недосып, и воздух остаётся единственной переменной, которую никто не проверяет. То же относится к домашнему кабинету с закрытой дверью: прежде чем объяснять послеобеденный спад мотивацией, автор предлагает исключить комнату, которая не проветривалась с утра. Датчик CO2 стоит дешевле часа рабочего времени, открыть окно — бесплатно.
Полная статья: https://blog.mikebowler.ca/2026/07/03/co2-and-decision-making/
Сохранять тем, кто проводит долгие встречи и планирования в переговорках.
@prog_stuff
Марцин Вихари, автор большого интерактивного эссе про кнопки, разобрал свежий пример того, как одна и та же кнопка поворота фото ведёт себя по-разному. Тапаешь «повернуть на 90°» восемь раз подряд: iPhone буферизует нажатия и честно доводит все повороты до конца, а Nothing Phone даёт вибрацию-подтверждение и молча съедает тап, если анимация предыдущего поворота ещё не закончилась.
Отсюда правило: никогда не заставлять пользователя ждать конца анимации. Буферизовать нажатия при этом не единственный выход, можно ускорять или обрывать анимацию по следующему тапу.
Вторая мысль, ради которой стоит читать целиком, — «ситуативная продвинутость». Любой казуальный интерфейс при достаточно большой аудитории встретит человека, которому придётся пользоваться им всерьёз: например, поворачивать десятки отсканированных документов подряд. И тогда блокирующая анимация из милой детали превращается в стену.
Полная статья: https://unsung.aresluna.org/if-youre-a-button-you-have-one-job/
Сохранять тем, кто делает интерфейсы.
@prog_stuff
Почему ваш пет-проект ещё не бизнес, а вы — не предприниматель
У каждого второго разработчика в столе лежит проект, который «вот-вот станет бизнесом». Осталось дописать пару фич — и дальше всё поедет само. Спойлер: не поедет. Разбираемся, где заканчивается код и начинается бизнес: почему всё стартует не с технологии, а с чужой проблемы, чем фаундер отличается от тимлида и почему рабочий сервис с первыми пользователями и MRR — это не бизнес, а промежуточный результат.
Простой тест: уйдите в отпуск на две недели, и если без вас всё встало — поздравляем, у вас пока не бизнес, а вы сами и есть главный «производственный ресурс».
Внутри ещё и про AR-очки на трамвайном заводе, которые зарубили сами рабочие: история о том, как ценность решения определяете не вы.
Rust-компилятор, переписанный в 46 миллионов строк C
Rustc — самокомпилирующийся компилятор Rust — переведён в 46 миллионов строк C и собирается обычным GCC и make, без единой строчки cargo или rustc в цепочке сборки. Автор — разработчик бэкенда cilly, который компилирует Rust в C.
🔘это уже 14-я попытка автора скомпилировать Rust в C — до этого были публичные и приватные проекты вроде rustc_codegen_clr;
🔘бэкенд генерирует «witness»-программы, которые прощупывают, что поддерживает целевой C-компилятор и платформа, и подстраивает вывод под них;
🔘получившийся код собирает core, alloc и std и способен пересобрать сам себя;
🔘практической пользы для повседневной разработки в этом немного — это демонстрация переносимости, а не замена rustc.
Сохранять тем, кто интересуется внутренностями компиляторов и любит истории про перенос целого тулчейна на неожиданный бэкенд.
Полная статья: https://github.com/FractalFir/crustc
@prog_stuff
Как эмулировать inline-ассемблер в Haskell, которого там нет
Задача простая на словах: перемножить два Word64 и получить обе половины 128-битного результата через одну машинную инструкцию mulq. В GHC нет inline assembly, и разработчик под ником minoki перебрал все возможные обходные пути, от честного FFI до чёрной магии на уровне calling convention.
🔘 unsafe FFI с указателем через alloca работает, но тянет за собой IO и лишнюю память;
🔘 unsafe FFI в два вызова, отдельно для старшей и младшей половины, укладывает всё в регистры без указателей;
🔘 unsafe FFI через XMM-регистры возвращает обе половины сразу, но требует
__m128i на стороне C;
🔘 foreign import prim позволяет написать собственный PrimOp прямо на ассемблере, с ручным учётом регистров STG (%rbx, %r14, jmp *(%rbp)) и макросов LEADING_UNDERSCORE и TABLES_NEXT_TO_CODE;
🔘 отдельная ассемблерная обёртка переводит между C calling convention и GHC calling convention, чтобы дёргать C-функцию, которая возвращает unsigned __int128 структурой по значению.
На Zen4 в WSL2 встроенный timesWord2# отработал за 4 нс, foreign import prim на чистом ассемблере уложился в 4,5 нс, а unsafe FFI с указателем скатился до 19 нс. Safe FFI для такого короткого вызова вышел медленнее 60 нс, то есть медленнее чистого Haskell на Integer.
Сохранять тем, кто когда-нибудь спорил, действительно ли safe FFI в GHC настолько накладен, как все говорят.
@prog_stuffZig вынес пакетный менеджер из компилятора в систему сборки
Andrew Kelley описал редизайн Zig: вся логика пакетного менеджера переехала из компилятора в отдельный процесс сборки maker. Раньше компилятор сам тянул зависимости, теперь этим занимается build-система, а компилятор остался компилятором.
🔘 из бинарника zig вынесены fetching пакетов, HTTP-клиент, TLS/crypto, Git-протокол, распаковка xz/gzip/zstd/flate/zip и парсер build.zig.zon;
🔘 сам бинарник похудел на 4%: с 14,1 МиБ до 13,5 МиБ на сборке без LLVM в режиме ReleaseSmall;
🔘 пакетный менеджер теперь собирается в ReleaseSafe, то есть все сетевые операции работают с включёнными проверками безопасности;
🔘 crypto и хеширование файлов могут использовать редкие инструкции конкретного CPU, потому что maker компилируется прямо на машине пользователя, а не распространяется готовым бинарником;
🔘 флаг --maker-opt заменили на переменную окружения ZIG_DEBUG_MAKER, а --zig-lib-dir — на ZIG_LIB_DIR.
Это промежуточный шаг к протоколу build server, который нужен языковому серверу ZLS.
Сохранять тем, кто интересуется архитектурой компиляторов и тем, как языки постепенно выносят периферийную логику из ядра.
@prog_stuff
Что на самом деле такое database cluster в PostgreSQL
В PostgreSQL кластером баз данных называют набор баз, которыми управляет один инстанс сервера. Burak Sen прошёлся по внутренностям этого механизма и записал по шагам, из чего он реально состоит на диске.
Каждая база сама является объектом со своим OID. У встроенных баз он захардкожен: 1 у template1, 4 у template0, 5 у postgres. Пользовательские объекты стартуют с 16384. Все объекты и связи между ними хранятся в системных каталогах вроде pg_class и pg_database, устроенных как обычные таблицы.
🔘 tablespace физически реализован через symlink, поэтому файлы базы можно раскидать по разным дискам, не трогая логику выше;
🔘 heap-страница весит ровно 8192 байта, и модуль pageinspect позволяет заглянуть внутрь неё вручную;
🔘 значения длиннее 2 КиБ Postgres выносит во внешнее хранилище TOAST вместо того, чтобы впихивать их в страницу целиком;
🔘 VACUUM FULL переписывает файл и меняет relfilenode, а OID самой таблицы при этом остаётся прежним.
Сохранять тем, кто работает с Postgres каждый день и ни разу не заглядывал, что происходит на файловой системе под капотом.
Полная статья: https://www.buraksen.dev/articles/internals-of-postgresql-db-cluster-and-tables
@prog_stuff
Пассивный Ethernet-tap на бредборде за 15 евро
Чтобы посмотреть трафик в домашней сети, обычно нужен управляемый свитч с port mirroring или отдельный TAP-девайс за сотни долларов. Ata Kuyumcu собрал пассивный вариант на минибредборде: без чипов, без питания и без активной обработки пакетов.
🔘 четыре разъёма RJ45: два в разрыв рабочего кабеля, два мониторных для утекающей копии;
🔘 два конденсатора по 220 пФ на линиях мониторных портов сбрасывают Gigabit-автосогласование до 100 Mbps, чтобы приёмник видел только нужные пары;
🔘 рабочие пары идут напрямую через плату, поэтому отключение или поломка тапа не рвёт основной линк;
🔘 вся сборка обошлась примерно в 15 евро;
🔘 в тесте с телевизором за 7,5 минуты плата поймала 2769 пакетов и 877 SSDP-анонсов без единой CRC-ошибки.
Сохранять тем, кто хочет заглянуть в свою сеть, но не готов городить управляемый свитч ради разового дебага.
Полная статья: https://blog.lvmbdv.dev/posts/building-a-passive-ethernet-tap/
@prog_stuff
VPS vs VDS vs виртуальный хостинг: что выбрать в 2026
Часто сервер выбирают по цене, а потом упираются в нехватку ресурсов, гибкости или поддержки. И почти никто не знает главного: VPS и VDS — это в большинстве случаев одно и то же, разница только в названии. Реально выбор идёт между хостингом (провайдер всё настроил, но конфигурация ограничена) и изолированным сервером с root-доступом.
В подборке 6 провайдеров под разные сценарии: от старта на виртуальном хостинге за ~123 рубля в месяц до VPS с зарубежными локациями. Внутри реальные цены, лимиты, условия по бэкапам, тестовым периодам и подсказки как сделать правильный выбор для своего случая.
