Обновить
1024K+

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

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

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

Красная королева в Core War: как LLM сражался с 317 человеческими воинами

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

Core War — культовая игра, где коды сражаются друг с другом. С приходом LLM она получила новую жизнь: исследователи из Sakana AI и MIT создали эволюционную стратегию для ИИ-воинов. Разбираем, как это работает.

Читать далее

Отказ по квоте я записывал в журнал как попытку — и адрес выпадал из очереди на две недели

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

У нас есть скрипт, который каждый день просит Google переиндексировать свежие страницы двух сайтов через Search Console — вручную по одному URL это бы никто не тянул, а сайтов и статей достаточно, чтобы запускать это руками было бы отдельной работой. 3 сентября я посмотрел в лог и увидел: за прогон дошло 59 проверок по доставке и 4 отказа «превышена квота», а адреса avitoma, помеченные как приоритетные в gsc_pinned.txt, за сутки не отправились ни разу. Не «отправились с опозданием» — ни разу, вообще.

Читать далее

Как защитить платежный API от двойных списаний с помощью идемпотентности

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

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

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

Читать гайд

Как я превратил статус-лайн Claude Code в тренажёр ПДД за 60 строк bash

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

Строка внизу терминала Claude Code показывает модель, ветку и проценты контекста. Я на неё смотрю сотни раз в день, пока агент думает. В какой-то момент стало жалко: такое внимание, а тратится на информацию, нужную дай бог раз в час. Заменил их на билеты ПДД и очередь непрочитанных статей. Ниже, как это устроено и что ещё туда кладут люди.

Читать далее

Spring Data JDBC: Укрощение Строптивого

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

Каждый Java разработчик в том или ином виде сталкивается с проблемой выбора инструментария для работы с БД. Если говорить про ORM-ы, то выбор у нас невелик: Spring Data JDBC или Hibernate. И тут часто возникает набор вопросов:

- Когда выбирать Hibernate, а когда Spring Data JDBC?

- Как дизайнить Aggregate-ы в Spring Data JDBC?

- Что из DDD просто теория, а что реально важно на практике? и т.д.

Мы оттекстовали доклад Михаила Поливаха с прошедшего Spring I/O Barcelona. В докладе обсуждаются все эти и многие другие вопросы, с которыми часто сталкиваются люди при проектировании доменной модели в целом.

Будет полезно, если присматриваетесь к Spring Data JDBC или уже используете его и накопили вопросы.

⚠️ А если хочется глубже погрузиться в разработку реальных приложений, у нас в Академии скоро стартует новый поток «Java в продакшене». 

Читать далее

Рантайм показывает ту же память, а под убивают по OOM: пять ошибок под лимитами cgroup

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

Go показывает стабильную память, heap-профиль молчит, а Kubernetes всё равно убивает под по OOM. Разберём, откуда берётся это расхождение, как на поведение под лимитами влияют cgroup, GOMAXPROCS и GOMEMLIMIT и что изменилось в последних версиях Go.

Разобрать причины

Шаблоны против статической рефлексии в C++: пять операций, две реализации и дедупликация, которая не стоит памяти

Уровень сложностиСложный
Время на прочтение26 мин
Охват и читатели8.9K

Одна и та же операция — дедупликация списка типов — написана двумя способами: на шаблонах и на статической рефлексии из C++26. Обе реализации живут в одном дереве и проверены на идентичность результата, поэтому их можно честно вычесть друг из друга. Получилось так: шаблонная версия съедает 7,9 ГиБ памяти компилятора там, где рефлексивная не съедает ничего измеримого — ±21 МиБ на 32-кратном диапазоне размеров. А по времени обе квадратичны, и рефлексия выигрывает всего пятую часть. Разбираю, откуда берётся такая асимметрия, и заодно пять компиляторных стен, в которые упираешься по дороге, — включая sizeof…, который молча возвращает неверное число.

Читать далее

Я проанализировал 100 000 постов с Hacker News и вот что хочу сказать

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

Hacker News — это пульс мирового технологического сообщества. Тысячи разработчиков, основателей стартапов, инженеров из крупных компаний ежедневно делятся здесь инсайтами, проектами, новостями и мемами. Но есть проблема: качественный контент тонет в шуме, или интересные тебе темы тонут в неинтересных тебе темах.

Но из-за большого потока постов, качественные статьи по нужной теме теряются среди других, и если нужно найти какие-то системные тренды, увидеть как меняется отношения к Rust, AI или Open Source, а не просто “почитать что-то интересное” - это сделать сложно. Можно да, скопировать кучу ссылок и отправить в LLM, попросив отсортировать, но это занимает время и не так удобно, если нужно проанализировать большое количество тем.

И тут мне пришла идея - создать программу на Python, которая будет парсить через официальный API Hacker News, строить эмбеддинги постов с комментариями, кластеризовать посты и при помощи LLM суммаризировать этот кластер по ссылкам.

Сказано - сделано. Я смог спарсить 100 000 постов с Hacker News за последние 693 дня, получив более 1000 кластеров, более 10 миллиона апвоутов, более 27 тысячи авторов и всего 0.1% выбросов. В этой статье мы разберем, какие тренды были активны в мировом IT-сообществе последние два года.

Читать далее

Один BPF‑объект, два верификатора, разные вердикты: разбираемся, кто прав

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

eBPF‑программы проходят статический анализ до загрузки в ядро Linux. Верификатор должен доказать, что программа не выходит за границы памяти, не работает с неверными указателями и не нарушает ограничений, без которых код нельзя безопасно выполнять в ядре. Но если прогнать один объект через разные верификаторы, картина меняется. Один анализатор принимает BPF‑объект, а другой считает его небезопасным и запрещает загрузку.

Именно так и вышло...

Статья для тех, кто исследует eBPF и статический анализ. Ошибку в программе мы искать не будем — её там нет. Нас интересует другое: почему два верификатора расходятся в выводах.

Читать далее

Я не читаю свой код. Два месяца вайбкодинга большого проекта — честный отчёт

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

Сразу и без кокетства, чтобы дальше читать с правильными ожиданиями.

Код в этом проекте пишет ИИ. Целиком. Бэкенд на Go — язык, которого я не знаю: я не писал на нём ни строчки ни до, ни во время проекта. Фронт на TypeScript и Vue — тут я в теме и мог бы читать, но не читаю. В код я не смотрю вообще: ни в реализацию, ни в тесты, ни в диффы. Я пишу задачу и проверяю результат — всё.

Это не признание в лени, это условие эксперимента. Мне было интересно, где именно упрётся такой режим — и он упёрся, причём не там, где я ждал.

За два месяца у меня сложился образ, который объясняет происходящее лучше любой аналитики. ИИ-разработчик — это гениальный ленивый дед с деменцией. Он помнит наизусть всю стандартную библиотеку и напишет вам за минуту то, на что вы потратите день.

Читать далее

Как мы превратили правила команды разработки в инструкции для LLM-агента

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

Привет, Хабр! На связи команда разработки Just AI. Хотим рассказать, как мы автоматизировали часть рутинных задач вокруг разработки с помощью LLM-агента. Не генерацию функций и не написание кода — нас интересовало то, что происходит с задачей до и после написания кода: создание merge request, сборка, обновление Jira, передача задачи на тестирование и другие повторяющиеся действия.

На небольшой задаче таких шагов набирается около десяти. Нужно помнить порядок действий, договоренности команды и постоянно переключаться между разными инструментами. Мы решили передать эту рутину агенту: описали правила команды текстовыми инструкциями и подключили инструменты для работы с Jira, GitLab, Jenkins и Sentry.

В статье расскажем, как разобрали эти действия на слои, какие ограничения добавили и что в итоге изменилось в работе команды.

Читать далее

On‑device OCR для первички: как распознавать документы без отправки в облако

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

Представим обычную ситуацию: экспедитор принимает товар на складе, подписывает накладную и фотографирует документ корпоративным смартфоном. Через несколько секунд реквизиты должны оказаться в учетной системе — без ручного ввода данных, офисного сканера и ожидания, пока бумага доедет до бухгалтерии.

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

Возможно ли распознать на смартфоне многостраничный УПД со сложной таблицей, исправить перспективу, прочитать мелкий шрифт и рукописные пометки — и сделать все это без подключения к внешней инфраструктуре? Короткий ответ: да. Однако для безопасной системы распознавания первички недостаточно написать в презентации «работает локально». Нужно правильно выстроить весь маршрут документа — от камеры смартфона до 1С или ERP.

Читать далее

Как лень довела меня до написания кодогенератора

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

Лень — двигатель прогресса. Я очень ленив, поэтому прогресс должен был выйти впечатляющим. Спойлер: он и вышел, но с ленью что-то пошло не так.

Началось с того, что я предложил взять go-playground/validator — и услышал, что рефлексия нас замедлит. Бенчмарки показали единицы микросекунд на структуру: примерно столько же, сколько json.Unmarshal того же тела, и на три порядка меньше похода в базу двумя строками ниже. Решение всё равно осталось прежним.

Поэтому я убрал рантайм целиком: разбор запроса и валидация генерируются из тегов структуры на этапе сборки. Опечатка в теге стала ошибкой генерации, а не пропущенной проверкой. Транспорт и вовсе оказался ни при чём.

Ниже — как это выглядит, чего генератор делать отказывается и чем я за это заплатил.

Читать далее

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

Эти пчелы делают неправильный с++

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

В 2016 году EA закрывает свой последний оплот разработки в Питере, и народ начал разбредаться по разным студиям и командам. Тогда мировой игрострой ещё благосклонно смотрел на обладателей красных паспортов, и несколько моих бывших коллег "со связями" организовали мини-галеру и умудрились получить контракт на поддержку движка для прототипа новой игры Arkane. Причем схема взаимодействия была достаточно мутная, из-за нежелания Остинцев работать напрямую с пост-СНГ конторами, поэтому основной контракт у них был через каких-то корейцев за три рубля, которые делегировали часть работы французкой конторе за рубль, а те наняли каких-то ребят за десять копеек из восточной Европы, ну вы поняли каких:)

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

С этого момента и началось моё знакомство с идеями, которые мы внутри команды прозвали "арканутым C++", и с их реальным применением в разработке игр. Я и раньше сталкивался с жёсткими требованиями к разработке на плюсах на своей доигростростроевской работе, но за шесть лет как-то раздобрел и перестал сильно жестить с оптимизацией, так что знакомство с командой из Остина вызвало стойкое дежавю разработки начала нулевых.

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

Читать далее

«Я Сетунь 70». Эмулятор троичного компьютера на Rust

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

Здесь вас ждут код эмулятора и краткое описание характеристик и архитектуры троичного компьютера «Сетунь 70». Без выдумок.

Возможно вы слышали о троичных ЭВМ семейства «Сетунь», читали о них на Хабре или где-нибудь еще. Материал подавляющего большинства публикаций не отличается достоверностью и преследуют цель привлечения внимания. Их авторы не видят разницы между троичной системой счисления, троичной схемотехникой и трехзначной логикой. А зачем, все равно же и там и там есть что-то про «три», верно? Они не стесняются хохмить размещая в публикации фотографию здоровенной ЭВМ «Стрела», занимающей отдельный зал, поместив под ней подпись малая ЭВМ «Сетунь».

Не моргнув глазом могут написать про неведомое в то время импортозамещение, или что эти машины были построены на основе троичной логики, ссылаясь на статью англоязычных дворников в Википедии (это мнение для них куда важнее мнения автора архитектуры и конструктора машины, и здравого смысла). Они не знают что под названием «Сетунь 70» в разное время существовали две заметно разные машины, и не слышали про существование «Сетуни 72».

Читать далее

Сторис рендерились 1080×1920, а публиковались 1080×1350. Я два раза чинил не ту причину

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

У нас есть конвейер, который раз в день собирает кадр для Stories в Instagram (фото + выжженная поверх подпись) и публикует его через Graph API на два бренд-аккаунта. 2 сентября в моей ленте всплыла своя же сторис, и подпись «посчитал сколько стоит перевезти сестру в москву» была обрезана с обеих сторон — первые и последние буквы срезаны краем экрана. Я это почти сразу починил. 5 сентября мне снова написали, что сторис «кривые». Я почти сразу починил снова. Обе правки были правильными и обе не имели отношения к тому, что жаловались на самом деле.

Читать далее

Сборщик мусора в Dart. Часть 3: старое поколение

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

В первой части мы разобрали, как Dart отличает число от объекта, а во второй – как убирается молодое поколение. Там все держалось на одном приеме: живых переносим в соседнее полупространство, а всю старую половину выбрасываем целиком.

Почему в старом поколении переезд не подходит

В молодом поколении все было просто – отбрасываем мертвые объекты и забываем про них, в старом поколении все по-другому. Для старого поколения такая операция слишком дорогая. Количество живых объектов больше, чем неживых, а это значит, что нам бы пришлось копировать почти всю память с места на место. Также необходимо было бы держать вторую половину пространства запасам такого же размера как и занятую часть полупространства. Для решения этой проблемы существует mark-sweep (Пометка-очистка).

Читать далее

Задача взяла lock() и остановила весь рантайм: пять ошибок с блокировками в async Rust

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

В async Rust одна неудачно взятая блокировка может остановить весь рантайм — вместе с таймерами и задачами, которые должны были её отпустить. Разберём пять типичных ловушек с Mutex и RwLock и посмотрим, почему привычки из синхронного кода здесь дают сбой.

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

Java Digest #39: 91 CVE в Spring, Value Objects в Java и AI-native разработка

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

У Spring за один день вышел 91 CVE — больше, чем за весь прошлый год, — и нашел их в основном AI-сканер. Oracle впервые за двадцать лет выпустила патч безопасности вне квартального цикла. А еще уже совсем скоро (15 сентября) выходит JDK 27. Обо всем этом и не только рассказываем в свежем выпуске 🙂

Читать далее

Один ИИ уже не справляется. Как работают ИИ‑оркестраторы

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

Представьте себе систему, которая позволят собрать разных ИИ‑агентов в команду и дать им задачу, над которой они будут работать вместе. Каждый агент будет делать то, в чем лучше всего разбирается. Это называется ИИ‑оркестрацией.

Сегодня мы поговорим о том, что такое ИИ‑оркестратор. И чем он реально полезен.

Ответим на главные вопросы:

Чем оркестратор отличается от обычного агента? Как устроены мультиагентные системы? Где оркестраторы работают хорошо — и где не очень?

Читать далее