Как стать автором
Обновить
990.09

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

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

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

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

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

Привет, хабровчане! Я Алиса, тимлид в 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.2K

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

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

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

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

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

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

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

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

Читать далее

Spring AI: retrieval augmented generation

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

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

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

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

Читать далее

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

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

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

Имена


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

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

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

Читать далее

Сам ты вайб-кодер

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

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

За последнюю неделю меня назвали вайб-кодером раз 20. Не то, чтобы меня это как-то оскорбляло, каюсь, пишу код в Cursor, но просто... Это ведь не так - просто по определению. Похожие чувства я испытывал, когда хакатонами стали называть любые мероприятия с кодингом, а их участников - хакерами. Но язык - штука живая, и писать душную статью о том, как мы все неправильно юзаем термины - точно не то, на что я хочу убить вечер воскресенья.

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

Читать далее

Математика бэкдора в Dual EC DRBG

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

Dual EC DRBG - нашумевшая схема генератора псевдослучайных чисел, который был стандартизован, несмотря на потенциальный бэкдор. Математическая часть данного бэкдора интересна и сама по себе, но особенно - как важная веха в истории современной криптографии. Статья посвящена математической части бэкдора и в деталях объясняет то, почему он работает. Для понимания потребуется хотя бы минимальное знакомство с основными понятиями алгебры и криптографии.

Читать далее

InterpolatedStringHandler: избавляемся от лишних аллокаций в логах

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

Классический ILogger.LogInformation($"User {userId}") выглядит безобидно, но на деле компилятор: формирует итоговую строку через string.Format‑like логику, боксит userId, DateTime, struct‑ы и прочее добро, а так же линкует все в object[] ради структурированных логов.

Аллокационная цена вопроса — порядка 80 Б на сообщение (плюс трансферы в LOH, если вы особо многословны).

В.NET 8 Microsoft даже вынесла отдельный раздел «high‑performance logging» и честно сказала: «Да, обычные extension‑методы логов боксят и аллоцируют»

С выходом C# 10 компилятор научился разбирать $"строка" не напрямую в string, а в handler: структуру, которая получает куски литералов и плейсхолдеры. Базовый — DefaultInterpolatedStringHandler.

Читать далее

Telegram AI Companion: веселый проект на Rust, Telegram и локальном ИИ

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

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

Недавно я собрал небольшой, но бодрый pet-проект — Telegram AI Companion. Это Telegram-бот, который умеет болтать с вами, используя локальную языковую модель через LocalAI. Без OpenAI, без облаков — всё на своём железе.

Цель проекта — не революция в AI, а именно учебное и увлекательное погружение в Rust, асинхронность, Telegram API и локальные LLM-модели. Такой себе “бот-компаньон”, но больше для разработчика, чем пользователя :)

Если вам интересно:

Читать далее

Андрей Карпатый: Swift? Не слышал! Как я iOS-приложение на чистом «пожалуйста» написал

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

Что если создать мобильное приложение, не зная ни строчки кода на Swift? Добро пожаловать в мир вайбкодинга — нового стиля программирования «по настроению», где естественный язык и LLM заменяют синтаксис и компиляторы.

Во второй части выступления Андрея Карпатого мы также поговорим о новом типе «пользователей» — LLM‑агентах («духах людей») и о том, как адаптировать нашу инфраструктуру (документацию, API, сайты) для их удобства с помощью... llms.txt. Готовы ли вы кодить «в потоке» и строить для нечеловеческих интеллектов?

Читать далее

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