Как стать автором
Поиск
Написать публикацию
Обновить
1069.6

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

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

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

Как работает @Lazy в Spring — и когда он полезен

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

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

Если вы хоть раз писали хоть что‑то сложнее REST‑контроллера в Spring, вы наверняка ловили больную ситуацию: два бина зависят друг от друга, инициализация идёт по кругу, и вот он — BeanCurrentlyInCreationException. И если в этот момент вы вспомнили про @Lazy — вы молодцы.

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

Читать далее

Как спроектировать потокобезопасный класс в Java

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

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

Читать далее

@TestInstance(PER_CLASS) в JUnit 5: как и зачем переопределять жизненный цикл

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

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

Сегодня рассмотрим JUnit 5 и разберёмся, чем дышит аннотация @TestInstance(PER_CLASS), — зачем переопределять жизненный цикл тестового инстанса и когда это может помочь.

Читать далее

Карты, Java, 2 null'а. XMage edition

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

Компьютерная игра на Java — вещь довольно редкая, но всегда интересная. Поэтому мы не упустили возможность проверить статическим анализатором проект XMage и поделиться результатами. Посмотрим, что нашёл PVS-Studio в исходном коде проекта.

Читать далее

Настройка Jest и React Testing Library: пошаговое руководство для React и Next.js проектов

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

В данной статье мы подробно рассмотрим процесс настройки среды unit-тестирования веб-приложений на базе React и Next.js с использованием Jest и React Testing Library. Мы расскажем об установке необходимых зависимостей, создании конфигурационных файлов, настройке Babel и TypeScript, подключении SCSS и SVG, а также организации структуры проекта. Особое внимание уделено специфике настройки Jest в среде Next.js. Материал будет полезен для frontend-разработчиков и команд разработки, которые работают с React или Next.js проектами и хотят внедрить качественное unit-тестирование. 

Читать далее

Headless и API-First: как ускорить e-commerce и не утонуть в монолите

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

Привет, хабровчане! Я Алиса, тимлид в e-commerce агентстве KISLOROD.

Сегодня расскажу, как мы вырвались из цепких лап монолита с помощью Headless и API-First архитектуры, ускорили разработку и дали бизнесу крылья. Это не просто про технологии, а про то, как не сойти с ума от бесконечных правок и при этом ускорить запуск фич. Мы все еще на PHP, под капотом Bitrix, но перестали латать шаблоны и начали строить настоящую платформу. Погнали разбираться: что это, зачем и как не облажаться.

Читать далее

Глупые фокусы: преобразование 32-битного значения в 64-битное, когда неважен мусор в старших битах

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

Предположим — у вас имеется функция, которая передаёт 32-битное значение другой функции, принимающей 64-битные значения. Вам совершенно неважно то, что попадёт в 32 старших бита, так как это значение функция, принимающая его, напрямую не обрабатывает. Его просто передают функции обратного вызова, которая обрезает его, преобразуя в 32-битное значение. При этом, по некоей причине, вас беспокоит влияние на производительность той единственной инструкции, которую компилятор обычно генерирует для расширения 32-битных значений до 64-битных.

Первое, что я по этому поводу подумал, выглядело так: «Да зачем об этом беспокоиться, если пока ничего особенного не произошло». Подозреваю, что одна единственная инструкция не превратится в узкое место некоей программы.

Но, несмотря на это, я, просто из интереса, решил попробовать решить эту хитрую задачку.

Я решил использовать встроенный ассемблер gcc/clang и написать код, который сообщает системе: «Я могу создать 64-битное значение из 32-битного, не выполнив ни одной инструкции».

Читать далее

Преодоление сложности в самом сердце Анемичной Модели

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

Доброго времени суток, Хабр!

Сегодня хотел бы поговорить об анемичной модели — одном из самых дискуссионных топиков (особенно для приверженцев DDD) и о том, как, по моему мнению, правильно её готовить. Для кого-то анемичная модель — это антипаттерн, тогда как для других это единственный правильный способ реализации приложений. Многие использовали её годами и даже не знали, как она называется, и что кем-то она считается антипаттерном. Реальность же такова, что анемичная модель — это инструмент, который может подходить или не подходить в зависимости от ситуации, но при этом является очень популярным и, по факту, «стандартом де-факто» для многих программистов и организаций. Хотя в последние годы я и вижу тенденцию к тому, что DDD и, соответственно, богатая доменная модель становятся всё популярнее, пока что, по моему мнению, им далеко до популярности анемичной модели.

Читать далее

Тестирование производительности c PHPBench: что и как?

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

PHPBench - это, кажется, крайне не популярный фреймворк для тестирования производительности кода на PHP. По крайней мере за 18 лет он мне ни разу нигде не встретился, а услышал об нём примерно года назад. Фреймворк PHPUnit-подобный, где бенчмарки, как и тесты из PHPUnit объединяются в классы, группы и т.д. и т.п. Чтобы много не болтать, давайте напишем чуть кода и отбенчмаркаем его.

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

Читать далее

Тестируемый код в Golang

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

Когда я вижу очередную статью или видеоурок про тестирование кода, я почти уверен, что мне опять расскажут про моки.

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

Читать далее

Конфигурация с поздним связыванием и шаблонизацией в Python

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

Расскажу про Python-библиотеку для гибкого чтения конфигураций с возможность переиспользования и переопределения элементов

Читать далее

Базовый обзор @TempDir в Java

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

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

Сегодня разберемся с @TempDir — мощным, но часто недооценённым инструментом JUnit 5 для работы с временными файлами и директориями в тестах.

Читать далее

Как Cursor устроен изнутри. Часть 2

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

Полная версия платной статьи, публикуется с разрешения автора. Первая часть здесь.

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

5. Инженерные вызовы

Рост нагрузки и его влияние на выбор технологий

Тип технологических решений, которые принимает команда, диктуется в первую очередь паттернами чтения и записи (Cursor всю дорогу синхронизирует струкутру проектов от миллионов пользователей без перерыва, об этом говорили в первой части. Прим. пер.):

Работа с кодом: транзакции с низкой задержкой. Для фичей, связанных с кодом (дополнения по tab'у, индексация, пересчет хеш-деревьев), рабочая нагрузка представляет собой череду чтений и записи. Задержка для этих операций должна быть как можно ниже. Изначально Cursor использовал Pinecone для семантической индексации и поиска, но затем перешел на Turbopuffer.

Также важно иметь серверы поближе к пользователю. Рабочие нагрузки распределены по нескольким регионам, таким как западное и восточное побережье США, Великобритания, Европа, Япония.

Читать далее

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

Круговой импорт в Python: как он ломает проекты и как его победить

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

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

Сегодня говорим о том, что в какой‑то момент словит почти каждый разработчик, особенно если вы не просто пишете скрипты, а строите проекты — будь то Django, Flask или кастомная архитектура с бизнес‑логикой в отдельных слоях. Речь про круговые импорты: они не объявляют о себе заранее, не фейлят весь проект громко и сразу, но подкрадываются исподтишка. И вот вы уже сидите с ошибкой ImportError: cannot import name ... или AttributeError, гуглите часами, тасуете импорты туда‑сюда и ловите дежавю — кажется, это уже было, но где?

Читать далее

Самый быстрый способ нахождения гласной в строке

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

Недавно меня заинтересовала такая задача: как лучше всего определить, что в строке есть гласная?

Казалось бы, тривиальный вопрос, правда?

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

В этом посте я рассмотрю 11 способов обнаружения гласных, алгоритмический анализ, дизассемблирование байт-кода Python, реализацию CPython и даже исследую опкоды скомпилированного регулярного выражения. Поехали!

Читать далее

Spring AI: retrieval augmented generation

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

Spring AI, который только недавно получил первую стабильную версию, уже предоставляет довольно много возможностей для работы с RAG (retrieval augmented generation).

Благодаря этому подходу нейросеть перед тем, как дать ответ на запрос пользователя, выполнит поиск подходящей информации в векторном хранилище. Причём каждый документ хранится не в виде текста, а в виде массива чисел (т.н. «векторов»).

Процесс преобразования различных документов в такой векторный формат выполняется опять же с помощью LLM и называется embedding («встраивание»). Хорошая новость заключается в том, что всё это можно легко сделать с помощью Spring AI.

Читать далее

Чистый код: с чего начать

Время на прочтение4 мин
Количество просмотров4.5K
В статье The Life Changing Magic of Tidying Up Code я (Кент Бек) пошагово описал, как приучить себя к повседневной гигиене при создании кода. Код обычно приходит в беспорядок. В этом нет ничего постыдного. Если вам кажется, что код запутался — значит, вы чему-то научились. Чтобы код стал чистым, в нём надо хоть немного прибраться.

В статье о TLCMOTUC описан этот процесс: немного поправить код, остановиться на безопасной стадии, отпраздновать. Ниже я опишу, как именно выглядят некоторые приёмы такой уборки:

Имена


Со временем в коде может меняться тот смысл, который изначально вкладывался в выбранные имена. Команда работает, её словарь развивается. Вчерашние термины сегодня могут восприниматься уже иначе.
Читать дальше →

Анатомия безопасности XMPP

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

Решал я таски на Root-Me и попалась таска XMPP - authentication. Основная цель таски состояла в том, чтобы по захвату пакетов вытащить пароль, который использовался при аунтефикации и я начал искать документацию к тому, как работает аунтефикация клиента.

Читать далее

Создание Chessort: игра для сортировки шахматных головоломок

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

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

Читать далее

Оптимизация асинхронного сервиса на Python

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

Всем привет! Сегодня хочу поделиться с вами нашим опытом ускорения асинхронного микросервиса на Python примерно на 25%. Я расскажу, какие действия мы предпринимали с командой, что помогло, а что оказалось не особенно полезно с точки зрения ускорения сервиса.

Небольшое предисловие: мы в Иви постоянно работаем над тем, чтобы наши сервисы отвечали быстро и их максимальная предельная нагрузка повышалась. В процессе очередного анализа сервисов, мы выяснили, что один из них, о котором пойдет речь в статье, отвечает довольно медленно, учитывая его особенности. И мы решили его ускорять.

Читать далее

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