Обновить
1018.95

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

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

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

Go, Rust или всё же C++? Куда мы переписываем наш высоконагруженный бэкенд в 2025

Уровень сложностиСредний
Время на прочтение2 мин
Количество просмотров23K

Всем привет! Сегодня хочу зажечь настоящий холивар — но с практическим уклоном. Речь пойдет о нашем большом рефакторинге, вернее, о почти полном переписывании ядра нашего API-гейтвея.

Немного контекста: У нас классический монолит на Java (Spring Boot), который неплохо служил нам лет 5. Но с ростом нагрузки до 100k+ RPS мы уперлись в лимиты:

Читать далее

Автоматизация A/B-экспериментирования

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

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

Читать далее

ИИ и развёртка в фотонику

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

Всем очевидно: индустрия ИИ стремительно развивается. Но здесь появляется одно гигантское слоноподобное НО. В последнее десятилетие лидеры ИИ предпочли развиваться экстенсивно - то есть, например, ЛЛМ максимизируют объём моделей. Это в свою очередь тянет за собой целую цепочку гигантских затрат: от электростанций до передовых числодробилок. Из последнего - xAI готовится запустить вычислительную фабрику мощностью 1 ГВт с 500-ми тысячами видеоускорителей! Можно по разному относиться к хайпу вокруг ИИ, но очевидно одно - есть много желающих вкладываться по полной программе в эти технологии. И, возможно, впоследствии экстенсивный рост перейдёт в интенсивный, то есть количество перейдёт в качество. Проблема только в том, что на низком уровне - уровне железа - техника подходит к физическим пределам. И если не сменить парадигму и физическую основу, то поддерживать развитие индустрии никакими средствами кроме масштабирования не получится.

Читать далее

Как устроены перечисления в PHP

Уровень сложностиСредний
Время на прочтение3 мин
Количество просмотров3.5K

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

Открыть капот

Как написать нейросеть для бизнеса на Python

Время на прочтение12 мин
Количество просмотров7.7K

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

Читать далее

Мой путь в блокчейн: как доширак, теория игр и 20 кг лишнего веса привели меня к созданию собственной экономики

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

Привет, Хабр!

Хочу поделиться своим путём в блокчейн. К 2023 году за плечами было уже 7 лет строгого режима веб-разработки, и она начала казаться рутиной. Хотелось нового. В идеале — области, где можно было бы применить свою любовь к математике. Выбор стоял между датой и блокчейном. Я выбрал второе — во многом потому, что несколько моих друзей уже погрузились в этот «тёмный лес» и своими проектами пробудили во мне интерес. Это решение привело меня к неожиданным открытиям, трем разным проектам, нескольким месяцам жизни на доширак и к пониманию, что блокчейн — это идеальный полигон для любого разработчика, увлеченного математикой.

Читать далее

У JavaScript не будет прекрасного будущего

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров19K

Команда JavaScript for Devs подготовила перевод статьи о том, почему JavaScript-сообщество снова проигнорирует шанс исправить фундаментальные проблемы своей экосистемы после крупнейшей атаки на цепочку поставок. Автор предлагает здравый план — от стандартной библиотеки до новых практик управления зависимостями, — но считает, что индустрия снова ограничится символическими жестами.

Читать далее

Amplicode – идеальное дополнение к IntelliJ IDEA Ultimate. Огромный гайд для Spring-разработчика

Время на прочтение22 мин
Количество просмотров9.6K

Все уже прекрасно понимают, что Amplicode — неотъемлемая часть тулинга для разработки в OpenIDE, IntelliJ IDEA Community Edition и GigaIDE на Spring Boot. Но стоит установить Amplicode в IntelliJ IDEA Ultimate и ваша, казалось бы, идеальная IDE станет ещё мощнее и удобнее.

Читать далее

Обедающие философы на Go: как не умереть от взаимной блокировки и голодания

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

Команда Go for Devs подготовила перевод статьи, в которой автор шаг за шагом решает классическую задачу об обедающих философах на Go. Вы узнаете, почему наивный подход ведёт к взаимной блокировке, как нарушить симметрию, чтобы избежать deadlock’а, и почему даже «рабочее» решение может оставить одного философа голодать вечно.

Читать далее

Безопасные операции zero-copy на C#

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

C# — гибкий язык. На нём можно писать мобильные и десктопные приложения, игры, веб-сайты, сервисы и API. Можно писать на нём, как на Java, со всеми абстракциями и AbstractionFactoryClassProvider. Но, в отличие от Java, на нём также можно писать низкоуровневый и небезопасный код. И когда я говорю о низкоуровневом, то имею в виду отсутствие сборщика мусора и сырые указатели.

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

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

Читать далее

Пишем экспортёр данных Prometheus для ОС «Нейтрино»

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров963

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

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

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

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

Читать далее

25 блогов о веб-разработке и веб-дизайне, которые интересно читать, даже если у тебя нет сайта + бонус

Время на прочтение9 мин
Количество просмотров3.9K

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

Читать далее

Как получить и использовать бесплатную лицензию PVS-Studio на практике. Часть 3: работа с отчётом и разбор срабатываний

Время на прочтение8 мин
Количество просмотров324

Продолжаем изучать использование PVS-Studio на практике для бесплатных (и не только) проектов. В этой статье мы рассмотрим основной этап взаимодействия с инструментом — работу с отчётом! Подробно рассмотрим первый опыт разбора срабатываний, изучим интерфейс и посмотрим на ошибки в проекте osu!

Читать далее

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

Технологический скепсис: как отличить настоящие научные открытия от хайпа в IT

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

Каждый год мы слышим о «революциях» в IT: то квантовый компьютер «сломает» криптографию, то новый фреймворк «убьёт» всех конкурентов, то искусственный интеллект уже «почти человек». Но где проходит граница между настоящим научным прорывом и маркетинговым шумом? В статье попробуем разобраться, как развивать здоровый скепсис, не впадая в цинизм, и чем нам, инженерам, он может помочь в работе.

Вы тоже наверняка замечали: стоит выйти какой-нибудь громкой новости, и через пару дней LinkedIn, Telegram и даже сосед в чате подъезда уже уверены, что «это будущее, которое всё изменит». А потом проходит год — и оказывается, что «будущее» тихо растворилось, а мы продолжаем писать код на старом добром Python или Java, подкручивать пайплайны и чинить CI, который снова упал.

Я не раз ловил себя на мысли: почему нас, технарей, так тянет верить в магию? Может, потому что мы слишком хотим верить в простые решения. Новая база данных обещает вечную масштабируемость? Конечно, ставим в прод. Новый инструмент гарантирует, что тесты сами себя напишут? Берём! А потом наступает утро понедельника, и ты один на один с ошибками сегментации и багами в проде.

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

Читать далее

Redis Streams в PHP с backpressure: устойчивые consumer-группы + повторная доставка

Уровень сложностиПростой
Время на прочтение10 мин
Количество просмотров784

Привет, Хабр!

Redis Streams давно перестали быть экзотикой для любителей CLI и стали нормальным способом гонять события между сервисами. Но у PHP есть своя специфика: один код — два способа конкурентности. Либо Amp с неблокирующим I/O и семафорами, либо Swoole с корутинами. В обоих случаях хочется одного и того же: устойчивые consumer-группы, ручной ack, автоматический claim зависших сообщений, backpressure, экспоненциальные ретраи и внятный дед-леттер.

Перейти к материалу

Структура против хаоса — элегантное решение для создания форм в React.js

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

«Ну вот, опять эти формы...» — знакомая мысль? Мы постоянно ищем способ сделать их удобными и предсказуемыми, но идеальное решение все никак не находится. В этой серии статей Артем Леванов, Front Lead в WebRise, подробно разберет, с какими сложностями мы сталкиваемся, изучим разные подходы и в итоге придем к элегантному решению: как описывать все формы на сайте, используя всего по одному компоненту для каждого типа полей.

Читать далее

Движок для Arcanum: Ретро-кодинг на ПК 1995 года как акт цифровой археологии. Глава 01 — Синопсис

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

Недавно сообщество фанатов классической RPG Arcanum: Of Steamworks and Magick Obscura потрясла новость: разработчик по имени Alex завершил титанический труд по реверс-инжинирингу оригинального движка игры. Теперь у нас есть его полнофункциональные исходные коды, которые можно компилировать под Windows, Linux и macOS с использованием современной библиотеки SDL3.

Это осуществление мечты. Теперь игру можно улучшать, исправлять многолетние баги, добавлять новый контент. И я, как и многие, планирую поучаствовать в этом процессе. Но этот прорыв заставил меня задуматься: а как создавалась такая магия тогда, в середине 90-х? Каково это — строить подобный движок внутри той самой эпохи, с её железом, софтом и мировоззрением?

Так родился этот личный эксперимент. Я не буду переделывать готовый движок. Я попытаюсь с нуля написать свой движок для Arcanum так, как если бы на дворе был 1995 год.

Егог

Байткод инструментация методов в Java: когда семплирования уже мало

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

Семплирующие профили не показывают реальное число вызовов и их длительность — а значит, мимо может пролетать важная боль. В новом переводе от команды Spring АйО на примерах показано, как включить инструментальную трассировку в async-profiler и что даёт новая фича latency: от ловли неожиданного System.gc() и источников OutOfMemoryError до точного замера «долгих» вызовов с порогом и разбором в JMC через JFR-события. 

Разбираем накладные расходы, хитрости вроде interval, практичные кейсы (почему ArrayList.contains и AbstractSet.removeAll могут внезапно стать O(N*M) и как это починить), а ещё сравниваем подход async-profiler с нововведениями в рамках JDK 25 (JEP 520), где последний имеет ряд недостатков.

Если вам нужны точные пути выполнения и реальная latency без убийства продакшена — это must-read.

Читать далее

«Русскоязычных пособий по Lua катастрофически не хватает. Мы решаем эту проблему». Читаем главу о введении в стек

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

Мы в МойОфис любим Lua. И сами активно его используем: в наших редакторах с помощью Lua работают макросы и надстройки. И помогаем разработчикам лучше узнать этот язык — при нашей поддержке вышли уже два издания классного учебника по Lua от Роберту Иерузалимски (кстати, сам автор считает, что этот язык в части задач даже более хорош, чем Си!)

А летом 2025 года мы выпустили целый трёхтомник по Lua. Первый том — новое издание книги Роберту. Второй и третий — вышедшие впервые учебники от Дмитрия Шульгина, старшего тренера по продуктам Учебного центра МойОфис.

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

Читать далее

Компенсация сетевой задержки: как зародилась технология rollback netcode

Время на прочтение5 мин
Количество просмотров1.4K

Как сообщил мне GPT5, технология компенсации сетевой задержки в играх, также известная как «откат сетевого кода» (rollback netcode) впервые была применена в игре «Super Street Fighter II Turbo HD Remix» (2008). Но это не так: именно такой механизм я реализовал в «Pathway to Glory» (Nokia N-Gage, 2004) и «Warhammer 20K: Squad Command (PSP, NDS, 2007)». В этой статье кратко рассказано, как данная технология работает...

Читать далее

Вклад авторов