Пульс индустрии
Как меняется активность вокруг языков программирования.
Изменение за 8 недель
Сюжеты
Большая тема, разложенная на цепочку материалов. Читается по порядку — или с любого места.
Материалы
Фильтр по тому, кому материал полезнее в первую очередь. Показаны все 134.
Цикл событий в JavaScript простыми словами
Как избежать ошибок при работе с асинхронным кодом и оптимизировать выполнение задач в JavaScript
Домен не открывается: как проверить DNS по шагам
Как настроить DNS-записи и избежать ошибок при смене серверов или домена
GraphQL или REST: что выбрать для своего API
Чем отличаются подходы REST и GraphQL и какие компромиссы ждут при выборе каждого из них
SSH отклоняет ключ: где искать причину
Как правильно настроить права на файлы и каталоги, чтобы SSH-сервер не игнорировал ключи
Нормализация: до какой степени и когда отступать
Как избежать дублирования данных и упростить обновление информации в базе с помощью нормализации
ORM или запросы руками: где проходит граница
Как избежать типичных ошибок ORM и когда лучше отказаться от неё в пользу SQL
Core Web Vitals: что действительно двигает оценку
Как устранить задержки при взаимодействии со страницей и сделать её отзывчивой для пользователей
HTTPS с нуля: сертификат, перенаправление, проверка
Как настроить HTTPS без ошибок и обеспечить безопасное соединение для всех пользователей сайта
REST API: что решить до первого маршрута
Как правильно структурировать данные в API, чтобы избежать дублирования и упростить поддержку
С каких тестов начинать, если их нет совсем
Как превратить баги в тесты и защититься от их повторного появления
Ответ модели плохой: что менять в запросе
Как получить от модели точный и полезный ответ вместо общих фраз и неструктурированных данных
CSRF: как чужой сайт действует от вашего имени
Как распознать уязвимость и защитить свой сайт от атак через браузер пользователя
XSS: как чужой скрипт оказывается на вашей странице
Как правильно защищать приложения от XSS-уязвимостей в разных контекстах и почему фильтрация не решает проблему
Отладка: как искать причину, а не симптом
Как задавать правильные вопросы системе, чтобы быстро находить корень проблемы
Постраничная выдача: смещение против курсора
Как избежать проблем с пагинацией и ускорить запросы к большим наборам данных
Задачи по расписанию тихо перестают выполняться
Как обеспечить надёжность задач по расписанию и избежать тихих сбоев в работе
Разбор инцидента: как написать так, чтобы его прочитали
Как написать постмортем, который действительно помогает избежать повторения ошибок и экономит время команде
Инвалидация кеша: почему это трудно и что делать
Как выбрать стратегию инвалидации кеша и избежать типичных ошибок при балансе скорости и актуальности данных
UUID или автоинкремент: чем платят за каждый
Как выбрать первичный ключ для базы данных и избежать проблем с производительностью и масштабированием
Уровни изоляции: что выбрать и чем за это платят
Как уровни изоляции транзакций защищают данные и почему выбор между скоростью и корректностью критичен для приложений
Валидация форм: на клиенте, на сервере или везде
Как сделать валидацию удобной для пользователя и безопасной для системы без лишних ошибок и путаницы
Картинки на сайте: форматы, размеры и ленивая загрузка
Как уменьшить вес изображений на сайте и ускорить загрузку страниц без потери качества
Сервер тормозит: команды первой минуты
Как быстро определить нехватку ресурсов и найти причину тормозов сервера за минуту
SOLID: что из этого работает, а что мешает
Как избежать ошибок при применении SOLID и когда эти принципы приносят больше вреда чем пользы
Почему модель выдумывает и что с этим делать
Как распознать и снизить риск выдуманных ответов нейросети при работе с фактами
SQL-инъекция: как она работает и чем закрывается
Как защитить приложения от SQL-инъекций и почему классические методы не работают
Docker простыми словами: что он решает и чего не решает
Как упаковать программу так, чтобы она работала на любом компьютере без дополнительных настроек
Индексы в базе: какие ставить и когда они не спасают
Как индексы ускоряют запросы и почему иногда не работают несмотря на все усилия
Postgres или документная база: как выбрать и не переехать дважды
Как выбрать между гибкостью схемы в коде и надёжностью реляционной модели для ваших данных
Резервные копии: проверяем восстановление, а не наличие
Как настроить резервное копирование, чтобы данные всегда восстанавливались быстро и без потерь
Мониторинг с нуля: что включить в первую неделю
Как медленные ответы делают сервис непригодным и как вовремя заметить проблему до жалоб клиентов
Domain-driven design: что он даёт инженеру и что — руководителю
Как писать код, который проще поддерживать и адаптировать под изменения бизнеса
С каких метрик начинать: четыре сигнала и их пределы
Как использовать четыре ключевые метрики для быстрого обнаружения проблем в работе сервисов до жалоб пользователей
dev и stage в большой команде: что показывает замер
Как крупные команды выбирают схемы ветвления и почему классические подходы часто не справляются
Заголовки безопасности: какие ставить и что они ломают
Что ломается при неправильной настройке заголовков безопасности и как этого избежать
JWT: что это на самом деле и где он не подходит
Как реализовать мгновенный отзыв JWT без потери производительности и безопасности в распределённых системах
Сборка идёт долго: что ускорять и в каком порядке
Как определить узкие места сборки и сократить время ожидания без лишних затрат
Ревью кода: что смотреть и чего не писать в комментариях
Как проводить эффективное ревью кода и на что обращать внимание, чтобы улучшить систему, а не искать баги
Срочный фикс в master, когда в dev лежит несделанное
Как выкатить срочный фикс в продакшен без риска сломать систему незавершённым кодом
Когда dev, stage и master разошлись: как выкатывать фичи
Как выбрать между ветками и фичами, чтобы избежать конфликтов и упростить релизы
Миграции базы без простоя: порядок, который работает
Как сделать так, чтобы приложение работало с базой во время любых изменений схемы
CORS: почему браузер блокирует запрос и что менять на сервере
Как браузер проверяет безопасность запросов и почему сервер должен правильно настраивать CORS
502 и 504: кто именно не ответил и что чинить
Как диагностировать и устранять ошибки 502 и 504, чтобы восстановить работу серверной инфраструктуры
Уровни логирования: что писать, а что выключить
Как правильно выбирать уровни логирования и что писать в логах, чтобы быстро находить причины сбоев
Пароли пользователей: как хранить и что проверить сегодня
Как определить уязвимости в хранении паролей и быстро исправить их в своём проекте
Протокол вместо фреймворка: что изменилось в сборке агентов
Где проходит граница между вашим кодом и чужими системами и что протокол не решает
Мультиагентность: зачем её пробуют и где она рассыпается
Роли по образцу команды не работают: где схема теряет смысл на каждой передаче
JSON как контракт: где он подводит
Формат, который читается без описания, обычно и передают без описания. Что записать отдельно от кода, чтобы обмен пережил расхождение версий.
Поиск по своим данным: когда нужен отдельный движок
Отдельный движок окупается, когда поиск — основной способ добраться до данных. Модель расчёта в часах, куда подставляются свои значения.
Соединения таблиц: почему строк больше, чем ожидали
Число строк результата определяется кратностью связи, а не таблицами. Одна проверка до запроса ловит почти все завышенные суммы в отчётах.
Слой трансформаций: движок в процессе против конвейера
Почему вычисление переезжает внутрь процесса и где эта схема ломается
Кеширование по HTTP: заголовки, которые действительно работают
Срок годности и проверка — разные механизмы, и путают их чаще всего
Очередь между сервисами: когда она окупается
Модель расчёта в часах: когда очередь окупается, а когда никогда
Обратный прокси: что он решает и что ломает
Что он действительно снимает с приложения и что ломает молча
Асинхронность: что она ускоряет, а что нет
Асинхронность не ускоряет вычисления — она позволяет не простаивать в ожидании. Как понять, поможет ли она, до того как переписывать код.
Память течёт: как найти и чем мерить
Порядок действий, который доводит до причины, и порядок, который нет
Инструменты переписывают на Rust: считаем, стоит ли переезжать
Считаем переезд в часах: окупается то, чего ждёт человек, а не фоновый прогон
Время в приложении: где оно ломается
Под одним словом прячутся момент, местное время и намерение на будущее. Путаница между ними двигает встречи и ломает суточные отчёты.
Векторная база: когда она окупается, а когда хватит обычного поиска
Модель расчёта в часах: когда векторный поиск окупается, а когда только мешает
Что растёт и что сдувается в экосистемах
Наш замер реестров: что команды сейчас кладут в сборки, а что перестали
Доля языков: кто теряет, а кто набирает
Наш замер долей: полезное в таблице — не порядок лидеров, а изменение малых величин
Где чаще всего остаются без ответа
Наш замер: без ответа остаётся то, что нельзя воспроизвести у себя
Сертификат истёк: почему это повторяется
Почему напоминание в календаре не спасает и чем его заменить
Токен в браузере: где его хранить
Вопрос о месте хранения решается моделью угрозы, а не удобством. Две популярные ответа защищают от разных вещей, и одно хранилище не даёт обоих свойств.
Браузерные тесты: что автоматизировать, а что оставить руками
Что проверять браузером, что оставить глазам и как пережить с этим полгода
Почему текст превращается в кракозябры
Испорченный текст почти никогда не испорчен: его читают не той таблицей, какой записали. Что делать и чего не делать ни в коем случае.
Конфликт слияния: почему он ваш и что с ним делать
Конфликт означает не «код сломан», а «два намерения пересеклись». Почему выбор стороны — это потеря, и как разрешать, ничего не теряя.
Регулярное выражение, которое можно поддерживать
Выражение пишут один раз, а читают годами. Что делает его поддерживаемым и где регулярные выражения — неправильный инструмент.
Скрипт на shell, который не сломается
Shell по умолчанию продолжает работу после ошибки. Четыре строки в начале файла переводят скрипт из режима «молча делает не то» в режим «останавливается и говорит».
Почему инструменты разработчика вдруг стали быстрее
Без терминов: три причины, почему ожидание у разработчиков сократилось
Медленный запрос в PostgreSQL: с чего начинать
Порядок действий, который дешевле наугад повешенного индекса: статистика, план выполнения, условие — и только потом индекс.
Состояние в React: когда нужна библиотека, а когда нет
Состояние бывает четырёх видов, и библиотека нужна только для одного. Как понять, для какого именно, и когда решение вообще пора принимать.
Образ, который собирается минуту вместо десяти
Время сборки определяется не объёмом работы, а тем, какая её часть выполняется заново. Одна перестановка строк даёт больше, чем подбор базового образа.
Java никуда не делась: где она осталась и почему
Решение о языке принимает не мода, а тот, кто платит за содержание системы десять лет. Что стоит считать, прежде чем спорить о синтаксисе.
Python тормозит: что действительно ускоряет
Под «медленно» прячутся три разные ситуации, и лечатся они по-разному. Как понять, в какой вы, прежде чем переписывать код на другом языке.
Новые инструменты живут без вопросов
У инструмента, о котором все говорят, может не быть ни одного публичного ответа о себе. Разрыв между массовыми и новыми темами — в четыре порядка.
Куда делись вопросы разработчиков
Публичный архив ответов по программированию перестал пополняться: по пяти крупнейшим темам поток вопросов упал в двадцать раз. Что это меняет в оценке задач.
Доступность как инженерная задача, а не как галочка
Почему чек-листы и оверлеи не делают сайт доступным, где на самом деле живут барьеры и как найти их обычной клавиатурой
Что современный CSS убрал из вашего JS
Почему JavaScript-наблюдатели за внешним видом опаздывают на кадр, какие механизмы CSS решают эти задачи внутри конвейера рендеринга и где скрипты остаются обязательными
Длинный контекст: когда он экономит, а когда просто дорожает
Как на самом деле считается стоимость длинного контекста, за что вы платите при каждом запросе и когда кэш префикса даёт реальную экономию
Дообучение или поиск по документам: как выбрать
Почему дообучение и поиск по документам лечат разные отказы, и как понять, какой именно мешает вашей модели
Промпт как код: почему он гниёт быстрее
Разбираем, почему промпт портится быстрее кода, какие привычные приёмы разработки его не спасают и при каком условии мы ошибаемся
Бюджет времени в многошаговом агенте
Почему лимит шагов и таймаут страхуют агентный цикл от разных отказов и как выбирать бюджеты, которые ограничивают именно то, что вы думаете
Оценка качества агента до релиза
Почему один успешный прогон агента ничего не доказывает и как выстроить оценку, которая до релиза покажет форму распределения и характерные отказы
Дежурство по агенту: порядок действий
Как дежурному по агенту отличить жёсткий отказ от мягкого, не тратить время на рестарт и откат и найти причину по трассе одного эпизода
Агенты в продакшене: что отказывает на второй неделе
Сбои многошаговых агентов почти никогда не начинаются с модели. Они выводятся из арифметики шагов — и поэтому предсказуемы до запуска.
Поиск решает меньше, чем принято считать
Почему агент отвечает мимо при хорошем поиске, как за вечер найти настоящее слабое звено и что крутить вместо ретривера
Что агент не делает: список, который пишут заранее
Почему перечисление действий и запреты в инструкции не задают границу ответственности агента и как провести её снаружи списком из трёх колонок
Что такое ИИ-агент и почему о нём все спорят
Чем ИИ-агент отличается от ассистента, почему дело не в уме модели, и где на самом деле проходит настоящий спор вокруг таких систем
Контракты данных: как перестать чинить отчёты
Чем настоящий контракт данных отличается от страницы в вики, из каких четырёх частей состоит и с какого отчёта начинать внедрение
Lakehouse без хайпа: что реально поменялось
Разбираем, чем плоха связка озера и склада, почему внешние таблицы не спасают, как лейкхаус даёт транзакции поверх открытых файлов и во что это обходится
Схема поехала: пять способов узнать об этом первым
Почему дрейф схемы первым замечает потребитель, почему процессные договорённости и красные джобы его пропускают и как устроены пять автоматических проверок на пути данных
Что компании знают о вас и зачем им это
Как без микрофона лента угадывает ваши желания: что сервисы записывают о каждом шаге и как из этих строчек складывается портрет человека
Стоимость хранения: три сценария на 100 ТБ
Почему нельзя просто умножить цену за терабайт на сто и как собрать модель из пяти слоёв, чтобы честно сравнить свои диски, выделенный сервер и облако
Где проходит граница клиент — сервер
Почему границу между клиентом и сервером нужно проводить не по типам компонентов, а по моменту, когда становятся известны входные данные
Размер бандла больше не главная метрика
Почему война с общим весом сборки не ускоряет приложение и при каких условиях размер бандла всё-таки важен
Серверные компоненты: год в продакшене
Вы узнаете, как серверные компоненты пересылают дерево по проводам, почему проп через границу становится частью сетевого контракта и какие поломки модели предсказуемы заранее
Почему сайты стали такими тяжёлыми
Почему сайты превратились из документов в программы, отчего пустой экран стал нормой и кто на самом деле платит за сборку страницы
WebAssembly: где он уже окупается
Откуда у WebAssembly берётся скорость, какой ценой она достаётся и почему переписать самую тяжёлую функцию — не решение, а тупик
Деплой без кластера: что осталось живым
Что кластер даёт на самом деле, почему однонодовый вариант — тупик и как выкатывать сервисы через релиз-каталоги, атомарный симлинк и systemd
Golden path вместо документации
Почему документация гниёт, почему её нельзя спасти процессами и ревью, и как golden path делает стандартные операции исполняемыми
Своё железо под инференс: расчёт на три сценария
Пошаговая модель расчёта, которая покажет, когда свой сервер для инференса дешевле облака, если подставить ваш профиль нагрузки и тариф на электричество
Kubernetes на команду из двенадцати человек
Как на своих числах решить, нужен ли команде Kubernetes: сравниваем часы нынешней эксплуатации с налогом на обслуживание кластера
Стоимость владения кодом: что считать и что игнорировать
Как посчитать в часах, сколько труда съедает уже написанный код, — по горячим модулям и следам, которые система и команда оставляют сами
Платформенная команда: когда её заводить
Как посчитать на ваших числах, когда платформенная команда окупается, почему стандарты и одиночный инфра-инженер не спасают, и что проверить перед стартом
Как мерить производительность, чтобы себе не соврать
Почему типовой прогон на стенде расходится с продакшеном и как собрать протокол замера: от решения через модель нагрузки до кривой вместо точки
Скучные решения: монолит, который не стыдно
Что микросервисы покупают на самом деле, какой налог берёт граница по сети и почему структуру кода в итоге определяет структура команд
Почему Go стал платформенным дефолтом
Почему горутины, планировщик и статическая линковка делают Go дефолтом для микросервисных платформ — и где те же свойства начинают вредить
Найм под редкий язык: сколько это стоит на самом деле
Почему найм на редкий язык дорожает временем, часами интервьюеров и простоем, и как посчитать это по своей воронке
Куда сместился Python за два года
Как за два года изменилась роль Python в архитектуре бэкенда и как измерить, какая доля времени вашего запроса уходит на сам язык
Rust в сервисах: где окупается, а где нет
Спор давно идёт не о скорости. Решающими оказываются два фактора, и ни один из них не технический.
TypeScript в рантайме: что типы не проверяют
Разбираемся, почему типы не защищают внешние данные, где проходит граница процесса и как проверять всё, что её пересекает
Как объяснить совету директоров затраты на ИИ
Почему обещанная окупаемость превращает защиту бюджета в допрос и как сменить форму заявки на измеримую цену одной задачи
Откуда берётся счёт за искусственный интеллект
Почему у нейросети нет готовых ответов, за что вы платите на самом деле и как ваш разговор меняет итоговый счёт
Что мерить у модели кроме точности
Почему одна цифра не отражает качество языковой модели и как измерять калибровку и отдельные режимы отказа, чтобы понять, стало ли лучше
Сколько стоит инференс: считаем до счёта, а не после
Модель расчёта, которую можно заполнить своими числами за час. Главный множитель — не размер модели, а доля повторов.
Локальный инференс: когда он дешевле облака
Как построить модель расчёта, которая по вашей нагрузке, планке качества и тарифам покажет, когда локальный запуск LLM дешевле облачного API, а когда дороже
Повторы, которые удваивают счёт
Разбираемся, почему счёт за API языковых моделей растёт при неизменном продукте, как повторные попытки превращаются в умножение затрат и что чинить на самом деле
Алерты, на которые перестали смотреть
Почему дежурные рационально перестают читать канал алертов и почему подстройка порогов меняет частоту алертов, а не их применимость
OpenTelemetry: что стало стандартом, а что ещё нет
Разберёмся, какие слои OpenTelemetry действительно стали стандартами, а какие остаются удобным клеем, и почему граница проходит именно между ними
Как вообще узнают, что сайт сломался
Почему владелец узнаёт о поломке сайта последним, почему ручные проверки не помогают и как работает робот, который следит за сайтом вместо человека
Трассировка шагов вместо логов
Как заменить ленту логов на дерево шагов, чтобы видеть не только где упало, но и почему агент решил именно так
Что писать в трассировку, а что нет
Как проектировать трассировку под дежурного: какие поля писать в спанах, а какие выносить в архив, чтобы трейс сразу показывал, где сломался запрос
Секреты в CI: пять типовых утечек
Разберём, почему хранение секретов в хранилище и маскирование логов не спасают от утечки, и покажем пять мест, где конвейер CI теряет ключи
Политика обновления зависимостей, которую соблюдают
Разбираемся, почему матрицы дедлайнов и дни обновлений не работают и как построить политику, в которой обновлять зависимости дешевле, чем откладывать
Безопасность как метрика команды
Почему счётчик уязвимостей портит работу команды и какую метрику безопасности выбрать, чтобы измерять её собственное поведение, а не чужой труд
Что о вашей компании видно снаружи
Как бесплатно проверить, что о вашей компании видно постороннему: DNS, публичные журналы сертификатов и другие открытые источники, которые выдают забытые активы
Почему приложение просит столько разрешений
Почему внимательное чтение списка разрешений не спасает: он показывает, что приложение возьмёт, но не говорит, зачем ему это нужно
Цепочка поставок: перечень, который кто-то читает
Почему перечень состава после генерации не читает никто и какие шаги превращают файл в индекс, отвечающий на запросы по всем сборкам
ИИ в редакторе: что реально ускорилось
Почему ассистент ускоряет набор кода, но не сроки задачи: как посчитать свой выигрыш по закону Амдала и когда вычитка подсказок его съедает
Git-приёмы, которые перестают быть страшными
Как на самом деле git хранит историю, почему опасные команды почти ничего не удаляют, когда работа теряется безвозвратно и как вернуть её через reflog
Self-hosted вместо подписок: честный расчёт
Почему деление цены подписки на цену сервера ничего не доказывает и как честно посчитать полную стоимость подписки и собственной инфраструктуры
Чем программисты пользуются каждый день
Разберём пять ролей, которые инструменты играют в рабочем дне разработчика, и способ искать нужные программы, который не устаревает
Терминал, который экономит часы, а не минуты
Почему быстрые эмуляторы и алиасы не экономят время, где теряются настоящие часы и как проверить это на своём рабочем дне