Обновить
512K+

Программирование *

Искусство создания компьютерных программ

885,43
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Как React не даёт несрочному рендеру потеряться: startTransition, useDeferredValue и Suspense

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели3.4K

Представьте поиск по каталогу: поле ввода, а под ним список из тысяч товаров. Перестраивать такой список долго, и если делать это на каждое нажатие, поле начнёт тормозить. Поэтому обновление списка можно пометить как несрочное: тогда React покажет символ в поле сразу, а список перестроит потом, урывками, в промежутках между нажатиями клавиш.

Но что, если пользователь печатает без остановки: список не обновится никогда? И что видит пользователь, пока новый список считается или грузится с сервера, - старый список, пустой экран или спиннер?

Читать далее

Новости

Про статью «Stop Making TUIs» и почему я с ней не согласен

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели3.3K

Привет! Меня зовут Арсен Абдусаламов, я тимлид Авито Авто. Недавно я наткнулся на статью Томаса Птачека Stop Making TUIs, и она меня зацепила настолько, что захотелось развернуть дискуссию. 

Автор рассказывает, что недавно увлёкся созданием нативных интерфейсов для macOS: написал просмотрщик Markdown (MDV.app), фронтенд для SageMath, музыкальный плеер, вики-помощника, трекер макронутриентов и пульт для Apple TV. Причём код всех этих интерфейсов был практически полностью сгенерирован AI-агентами — сам он почти не участвовал в их написании. «Создание хорошего UI — это очень тяжёлая работа: подобный код утомителен, однообразен, требует высокой точности и глубокого знания специфики платформы. Требуются годы, чтобы научиться хорошо выполнять такую работу. Именно поэтому я бы никогда не стал писать эту программу вручную», — так Птачек описывает свой опыт создания приложения MDV.app.

Далее автор проводит разграничение между CLI — интерфейсами командной строки и TUI — терминальными пользовательскими интерфейсами. Он пишет, что и первое, и второе является наследием 1970-х годов и ограничений телетайпов, но если CLI имеют незаменимые сценарии использования и их создание почти всегда оправдано, то TUI, по его мнению — это устаревшие, враждебные и ограниченные интерфейсы, которые исторически существуют только по двум причинам: из-за модемов и из-за нежелания Unix-разработчиков изучать такие фреймворки, как Motif. 

Автор считает, что сегодня, когда AI-агент может написать нативный GUI за вечер, создавать новые TUI попросту незачем. «Даже с хорошим фреймворком, таким как Ratatui, Textual или Bubbletea, вы боретесь с терминалом, чтобы приблизиться к тому, что каждый нативный фреймворк предоставляет из коробки, — говорится в статье. — Вы можете потратить время и реализовать вполне рабочие версии множества стандартных TUI-виджетов: выбор даты, поле для ввода пароля, индикатор выполнения, текстовый редактор. Но большинство из них будет уступать системным аналогам, а их интеграция в общий макет потребует дополнительных усилий».

Похоже, автор только что обнаружил, что GUI не кусается. Радость понятная. Беда в том, что от «я научился» он тут же прыгает к «а вы все зря мучились»: мол, кто десятилетиями терпел ASCII и гордился этим как настоящий сисадмин — тот сам себе враг. Берите свой голый CLI, заворачивайте в нативное приложение — и разработка откроется вам с другой стороны. И вот здесь, на мой взгляд, стоит притормозить и разобраться в деталях.

Читать далее

Чем заменить Claude или Gemini после блокировки

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели9.3K

Меня тоже заблокировали, и я пошёл разбираться, чем теперь пользоваться. Хотелось найти замену для работы с кодом и файлами и понять, сколько она будет стоить. Вот что получилось на ноябрь 2026 года.

Читать далее

Почему я выбираю Rust, даже когда код пишет ИИ

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели4.2K

Код за меня пишет агент. А читать, проверять и потом поддерживать этот код всё ещё мне. Поэтому мне не всё равно, на каком языке он написан. Расскажу, что мне нравится в Rust, что бесит и чуть-чуть набросим на Go.

Читать далее

Почему эксепшены (exception) хуже… Будут ли эксепшены хуже? Хуже чего?

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели6.8K

Мне что-то часто стал встречаться код в котором вместо обычной логики используются конструкции на основе генерации эксепшенов (exceptions). Как оценить такой код? Может нам стоит стараться использовать эксепшены как можно чаще?

Я решил проанализировать реальные примеры, вот например

https://github.com/openbmc/dbus-sensors/blob/ce706f061f2b6877e953fa0ad8f5200e99f15854/src/VariantVisitors.hpp#L53. и посмотреть на сколько код с эксепшенами лучше или хуже некоторой альтернативной версии кода. Заодно посмотрим есть ли альтернатива коду с эксепшенами.

Читать далее

Вайбкодинг кончается хаосом: 637 мест, где ИИ сделал по‑своему. Что такое архитектурный дрифт и чем я его вылечил

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели7.2K

«Создай точную копию этой картинки, ничего не меняй». Человек повторил эту просьбу ChatGPT 101 раз, и настоящее фото Дуэйна Джонсона превратилось в мультяшное месиво. С кодом то же самое: ты сказал ИИ, какие шрифты использовать, а размеры летают по всему сайту. Это архитектурный дрифт. Он лечится тремя принципами: 1. Single source of truth задаётся спеками. 2. ИИ обязан сначала прочитать спеки…

Читать далее

Как я поборол FOMO, он же «Страх упущенной выгоды»

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели8K

Некоторое время назад мой мир был прост. Каждый день учеба, работа, дом. Никаких переживаний и нововведений. Жизнь как по ровненькой дорожке.

Так было ровно до того момента, как я не попал в реальную IT команду, на свой первый коммерческий проект. На первом же созвоне коллег я понимал буквально через слово. Обсуждали какие-то новые фреймворки, интеграции, легаси, синки и деплои. Меня просто обложили новыми терминами. Было немного стыдно.

К следующему созвону решил подготовиться и добросовестно погрузиться в процесс, чтобы просто не выглядеть глупо, ну или хотя бы поверхностно понимать о чем идет речь. Открыл tg-каналы и профессиональные сообщества. Везде видел примерно одинаковые заголовки, что-то по типу «React всё? Учим новый стек за 5 минут», «Топ-10 инструментов, без которых джуна уволят завтра». А в браузере теперь было куча вкладок. Мозг постепенно превращался в кашу от огромного количества информации и глаз уже начинал дергаться.

Я расскажу вам как пытался объять необъятное, к чему это привело, и как я в итоге разработал личную систему, которая помогла мне сохранить рассудок и начать работать эффективно.

Читать далее

Полярные типы данных в Edva

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели4.6K

В большинстве языков программирования понятия «истина/ложь», «значение есть/значения нет» и «успех/ошибка» живут в разных мирах. Для первого существует примитив bool и конструкции if/else, для второго — Option<T> (Maybe a), для третьего — Result<T, E> (Either a b). У каждого из них свои конструкторы (true/false, Some/None, Ok/Err) и свой набор комбинаторов.

Системный язык программирования Edva, спроектированный без единого ключевого слова, сводит все бинарные исходы к единому примитиву на уровне системы типов — алгебраическим разветвлениям (Algebraic Ramifications, или коротко — Rams).

Погрузиться в заполярье

Релизный цикл Spring в 2026. Как AI всё сломал

Уровень сложностиПростой
Время на прочтение11 мин
Охват и читатели6.3K

Всем привет!

Меня зовут Михаил Поливаха, я технический лидер проекта Axelix. Недавно мы перешагнули отметку 10 000 загрузок в месяц. Мы сами разрабатываем инструмент для работы со Spring-приложениями, поэтому вопросы релизных циклов, поддержки версий и обновления зависимостей для меня не абстрактная теория. С ними приходится сталкиваться и в роли пользователя Spring, и в роли разработчика Open Source-проекта.

А начать я хочу с ситуации, которая, я думаю, знакома многим. Релиз уже в плане, фича написана, тесты зелёные, сборка собрана. Осталось прогнать последний пайплайн и выкатить изменения. И вот на шаге SCA всё становится красным: в одной из зависимостей нашли уязвимость.

Ну ладно, бывает. Сейчас поднимем patch-версию, заберём исправление и поедем дальше. Для того patch-релизы и существуют, верно?

Открываете Maven Central, смотрите на свою линию Spring Boot, а следующего номера там нет. И, что гораздо хуже, уже не будет.

Допустим, у Вас Spring Boot 3.5.16. Это последний открытый релиз линии 3.5, он вышел 25 июня 2026 года. Следующий номер, 3.5.17, в календаре Spring есть, но помечен как enterprise. То есть патч существует. Проблема в том, что Ваш пайплайн смотрит на Maven Central, а туда этот патч не попадёт.

В этот момент почти обязательно находится коллега, который говорит: «Так 3.5 же LTS! Как это патча не будет?»

Читать далее

Помогаем малышке стать сильной: локальная Qwen против облачных флагманов на 16 ГБ видеопамяти

Уровень сложностиСредний
Время на прочтение13 мин
Охват и читатели18K

В двух предыдущих статьях мы проверяли языковые модели на наших повседневных задачах: работе с данными в электронном лабораторном журнале и исправлении ошибок в трёх закрытых проектах на Delphi — от программы рентгеновской рефлектометрии X‑Ray Calc до нашей системы управления лабораторией.

В обоих тестах локальные модели на моей рабочей станции (одна карта RTX 5080 на 16 ГБ и 62 ГБ оперативной памяти) заметно отставали от облачных лидеров. На вопросах по журналу ранняя сборка Qwen 3.8 IQ2_XS набрала жалкие 33% (8 из 24), а gpt‑oss-20b — 40%. На задачах Delphi специализированная Qwen 3.8 Coder IQ1_M взяла 16 задач из 20 (80%). Результат уже вполне рабочий, но до Claude Sonnet 5.5 (19/20) она всё‑таки не дотянула.

Конечно, можно было на этом успокоиться и списать отставание на скромные 16 гигабайт видеопамяти. Но мне не давал покоя вопрос: модель действительно упёрлась в свой потолок или мы сами подрезали ей крылья настройками и капризными инструментами? Сели разбираться — и довольно быстро нашли узкие места. Поменяли урезанную сборку весов на полную, поправили конфигурацию сервера, научили инструменты спокойно относиться к мелким огрехам сериализации — и на том же самом железе локальная Qwen 3.8 взяла реванш!

Читать далее

Поставить LLM-шлюз, попросив агента: плагин Keystone для Claude Code

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели4.6K

Попросите агента «поставь нам LLM-шлюз», и он уверенно придумает переменные окружения, которых не существует. Поэтому у Keystone есть плагин для Claude Code: восемь скиллов, которые знают настоящие команды, флаги и поля конфига, и MCP-сервер, через который агент видит, что запущено. Ключи при этом в чат не попадают.

Keystone. The Model Switchboard. (KTMS) — self-hosted LLM-шлюз на Go: сервисы ходят в одну точку, а он хранит ключи вендоров, выбирает модель по правилам, переключается при отказах и держит лимиты расходов. Про сам шлюз была релизная статья, здесь — как его поставить за один разговор с агентом.

Читать далее

Вывод в терминал тормозит unzip: как заменить построчный буфер сбросом по дедлайну

Время на прочтение4 мин
Охват и читатели4.1K

Если в архиве много мелких файлов, unzip тратит бо́льшую часть времени на печать их имён в терминал: при построчной буферизации записей получается намного больше, чем нужно. Разбираем, как её реализуют glibc и CPython и почему вместо сброса на перевод строки хватит идеи из алгоритма Нейгла: сбрасывать буфер, если он простоял около 100 мс.

Читать далее

Три места, где Postgres отдаёт разные цифры на один и тот же отчёт

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели4.5K

Отчёт в PostgreSQL может менять результаты от запуска к запуску, даже если исходные данные остались прежними. Причина может скрываться в порядке сложения чисел с плавающей точкой, сортировке строк с одинаковым временем или разных снимках данных, которые получают запросы дашборда. В статье разбираем три таких сценария на практических экспериментах и выясняем, как сделать результаты запросов предсказуемыми.

Изучить проблему

Ближайшие события

timeout=5 в requests — не то, что кажется: connect, read, ретраи и бюджет времени

Время на прочтение6 мин
Охват и читатели4.6K

По умолчанию у requests таймаута нет: клиент может висеть часами. Разбираем, чем connect отличается от read, почему одно число в timeout — не «длина всего запроса», как настроить urllib3.Retry без шторма и POST-дублей, и как ограничить всю операцию бюджетом времени. Код прогнан на Python 3.13 и requests 2.34 / urllib3 2.8; цифры — с локального стенда.

Читать далее

Как мы приручили SIGSEGV и освободили память фоновых вкладок

Время на прочтение19 мин
Охват и читатели8.3K

Браузеры традиционно относятся к самым крупным потребителям памяти на персональных компьютерах. Иногда кажется, что разработчики просто забили на оптимизацию, но реальность куда прозаичнее: пользователи открывают всё больше вкладок, сайты обрастают медиа и JavaScript, новые веб‑стандарты требуют хранить больше данных, а ради безопасности браузер изолирует сайты в отдельных процессах.

На три последних пункта повлиять сложно. Но что делать с десятками вкладок, которые пользователь открыл, посмотрел и забыл? Не запускать процесс до первого посещения — легко. Гораздо интереснее случай, когда страница уже загрузилась и продолжает занимать память — почти как активная вкладка.

Просто так закрыть её нельзя: страница потеряет состояние, а музыка, видео или фоновая задача могут прерваться. В Chromium уже есть сборка мусора, очистка кешей и другие способы оптимизации — однако память всё равно не всегда возвращается операционной системе надолго.

Чтобы разобраться, почему так происходит, мы в команде Яндекс Браузера собрали собственный профайлер обращений к страницам памяти. Под катом — устройство виртуальной памяти, lock‑free‑структуры внутри обработчика сигнала, профилирование через управляемый SIGSEGV, борьба с kevent64, mach_msg и libdispatch, а также переход от эксперимента на macOS к оптимизации, которая сильнее всего проявила себя на Windows.

Читать далее

Сделал язык True — программа циклично читает и меняет саму себя (дайте обратную связь)

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели9.3K

True - язык программирования, где программа есть цикл, а код программы - лента кубитов (строк).

Simple - кроссплатформенный интерпретатор на Python 3 + Tkinter. Простой, без зависимостей.

Читать далее

Оркестрация ИИ‑агентов: когда нужно поправить в одном месте и не сломать всё остальное

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели9.3K

MVP с ИИ-агентом сегодня делает каждый. Сложности начинаются, когда задача меняет код сразу в нескольких модулях или репозиториях: правим в одном месте, ломаем в другом, а спецификация целиком не помещается в контекст одной сессии. Рассказываю, как устроен наш плагин pepper-orchestrator для Claude Code и Codex: цель становится программой и пакетами работ, части идут параллельно у разных агентов, а каждое "готово" проходит независимую проверку. И показываю всё это на реальном кейсе от первой команды до сдачи.

Читать далее

Сотни миллионов лишних запросов в неделю: что кодинг-агент нашёл в трейсах Sentry

Время на прочтение5 мин
Охват и читатели10K

UPDATE, который выполнялся около 10 тысяч раз в секунду, почти исчез. Выборка из истории статусов у самой загруженной группы на зеркале базы ускорилась с 274 мс при прогретом кэше до 0,4 мс. Такие места автор нашёл вместе с кодинг-агентом: подключил его к трейсам продакшена Sentry и короткими вопросами направлял поиск. Вместе правки убрали сотни миллионов запросов в неделю. В статье показано, какие подсказки давал человек, как изменения проверялись через EXPLAIN ANALYZE и какие цифры получились.

Читать далее

Торвальдс: «Не доверяете ИИ — пишите на ассемблере»

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели104K

13 октября 2026 года Линус Торвальдс ответил в рабочей переписке разработчику, который хотел ограничить ИИ в работе над ядром Linux. Ответ был довольно резким и саркастическим: Торвальдс предложил оппоненту отказаться не только от ИИ, но и от компиляторов.

Читать далее

Нашли гонку данных в Go‑коде. Исправили — и через три дня откатили фикс

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели10K

В Go обнаружили гонку данных, исправили её, а спустя три дня откатили фикс. Оказалось, что HTTP-клиент может продолжать отправлять тело запроса даже после получения ответа от сервера, и это приводит к неожиданным последствиям при повторном использовании буферов. Разбираем два реальных случая из vmagent и vmauth, в которых одна и та же проблема потребовала противоположных решений.

Читать разбор