Обновить
1117.89

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

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

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

Нескучное программирование. Иерархия концептов

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

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

Как компилятор выбирает лучшую перегрузку, если подходящих вариантов несколько? Интуитивно мы ожидаем, что более «точная» функция должна иметь приоритет над более общей и часто это ожидание мы переносим в правила для компилятора при написании шаблонов и ограничений. Общая идея здесь следующая: перегрузки можно не просто перечислять, а выстраивать в иерархию по степени специфичности, тогда одни функции будут описывать широкий класс типов, другие его подмножество, и, когда тип аргумента известен, компилятор должен выбрать ту функцию, чьи требования наиболее точно соответствуют этому типу. Эта логика заложена прямо в стандарте C++ и называется partial ordering, то есть частичный порядок, потому что не все перегрузки обязательно сравнимы между собой.

Немножко сложности...

Как удаление сорока строк увеличило производительность в 400 раз

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

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

На прошлой неделе моё внимание привлёк этот коммит:

858d2e434dd 8372584: [Linux]: Замена чтения proc для получения CPUtime потока на clock_gettime

diffstat выглядел интересно: +96 вставок, -54 удалений. В changeset был добавлен бенчмарк JMH из 55 строк, что означало реальное уменьшение кода продакшена.

Читать далее

Project Panama: как Java научилась говорить на C! (Часть 1)

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

Как безопасно и эффективно вызывать C-функции из Java? Благодаря Project Panama — новому API из OpenJDK — это стало возможно без использования JNI. 

В новом переводе от команды Spring АйО познакомимся с основами FFM API, посмотрим на запуск Hello World на C, роль jextract, и на то, как управлять памятью вне кучи JVM.

Читать далее

Проснулся 1-го января и переписал библиотеку: релиз async_yookassa 1.0.0

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

Всем привет!

Вчера я выпустил крупное обновление 1.0.0 для своей библиотеки async_yookassa — неофициального клиента для асинхронного взаимодействия с API ЮKassa. О том, что изменилось, зачем я вообще взялся её писать и почему официальный SDK может "убить" вашего бота — в этой статье.

Читать далее

Почему ваш проект не замечают: разбор репозитория на практике

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

Open Source проект может быть технически отличным и при этом оставаться неизвестным. Всё прекрасно работает, но репозиторий не привлекает ни пользователей, ни контрибьюторов. Причина чаще всего не в качестве кода, а в томкак проект представлен на GitHub.

Сегодня я хочу разобрать проект Tgin (инфраструктурная прослойка для Telegram-ботов на Rust). На его примере я покажу, какие элементы репозитория реально влияют на интерес к проекту, где чаще всего теряются пользователи и контрибьюторы.

Читать далее

Как я перестал слушать «Unknown Artist — Track 01» и написал свой распознаватель музыки

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

12 000 MP3 без тегов, 15 лет прокрастинации, один выходной на код. Асинхронный распознаватель на Python + Shazam: как обойти rate limiting, починить кривые кодировки и не съесть всю память. Код открыт.

Читать далее

Langium — инструмент для языкового моделирования

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

Разработка собственных языков и языковых серверов может быть сложной и рутинной задачей. Langium — инструмент на TypeScript, который упрощает создание предметно‑ориентированных языков (DSL) с готовым LSP‑сервером.

Меня зовут Денис Маматин, я работаю в R&D‑отделе СберТеха. В ходе разработки одного из наших проектов мы столкнулись с необходимостью создания собственного DSL, и в этом нам существенно помог Langium. В этой статье я рассмотрю, как устроена грамматика Langium, как создать первый проект и какие преимущества он даёт разработчику.

Читать далее

Javascript: прощай, Date, здравствуй, Temporal

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

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

Мне нравится, когда можно увидеть обратную сторону; какой бы формальной и железобетонной ни казалась спецификация ES-262, мы всё равно замечаем (если знать, куда смотреть) в ней все хорошие и плохие решения, принятые сотнями людей, разрабатывавших язык. У JavaScript есть характер. Да, он не всегда делает всё в точности так, как можно ожидать, но на мой взгляд, JavaScript обладает настоящим очарованием, которое можно оценить, если глубоко его изучить.

Впрочем, существует одна часть языка, которая мне кажется совершенно нелогичной: это конструктор Date.

Читать далее

Решение задач по программированию с помощью нейросети: сравниваем лучшие ИИ

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

Лучшая нейросеть для решения задач по программированию: обзор Кэмп, сравнение с ChatGPT и Claude. Разбор кейсов на Python и C++, пошаговые инструкции и лайфхаки для учебы в 2026 году.

Читать далее

Как проходить Leetcode-интервью: ритуал, который работает

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

Решил 434 задачи на Leetcode и прошёл все кодинг-интервью за последние 4 года — X, Google, Careem, TrustWallet, Yandex. Делюсь тем, что понял: какие мифы уже не работают, как готовиться, и главное — ритуал решения задачи, который оценивают интервьюеры.

Читать далее

Следующие два года в разработке программного обеспечения

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

Эта статья была вдохновлена статьей https://addyosmani.com/blog/next-two-years/. Постить на Хабре просто очередной перевод выполненный LLM, на мой взгляд, не имеет смысла и ценности не несет. Плюс разработка в России ≠ разработка в США, у нас много своих нюансов и специфики. При этом я заимствовал вопросы, и части текста автора , потому что полностью разделяю его мнение в некоторых вопросах, а в некоторых вопросах наши мнения расходятся (да, да, можете считать, что это с одной стороны урезанный, а с другой дополненный перевод статьи).

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

Читать далее

Флаг вам в руки: внедряем feature flags в Django

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

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

Сегодня поговорим о том, как включать и выключать функциональность в Django, не разворачивая каждый раз новый деплой. В больших проектах эту задачу решают через feature flags, такие условные флажки , которые позволяют запускать скрытые возможности лишь для части пользователей или откатывать фичи, не выкатывая заново весь код. Если вы хотите поэтапно раскатать новую функцию, сделать A/B тест или просто спрятать недоделанный модуль за переключателем, вам сюда.

Читать далее

Как работать с legacy-системами и не ломать бизнес: опыт MANGO OFFICE

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

Почему нельзя просто взять и переписать всё с нуля, когда пора прощаться с системой и как защитить бюджет на миграцию

Читать далее

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

std::move ничего никуда не двигает: подробный рассказ о категориях значений в C++

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

Проблема: когда из-за «оптимизации» код замедляется

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

Читать далее

Полезные ресурсы для тестировщиков: подборка от специалистов Selectel

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

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

Вместе со специалистами Selectel мы собрали полезные материалы для тестировщиков. В список вошли ресурсы, которые помогают развивать практические навыки, системное мышление и уверенно расти в профессии — от начального уровня до Middle.

В подборке собрано то, что действительно помогает в работе и может служить ориентиром для самостоятельного обучения. Подробности под катом!

Читать далее

Ненормальные непотребства, трюки, хаки и алгоритмы на C

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

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

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

Если вы видите на экране эту шестую часть нашей бесконечной саги о ненормальном программировании на C, значит, мы с вами прошли уже немало: от конвертации миль в километры через Фибоначчи до ГПСЧ и быстрых вычислений.

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

Добро пожаловать в шестую часть. Прошу под кат — там будет жарко, быстро и очень, очень интересно.

Читать далее

Black-White Array: новая структура данных с O(log N) аллокаций

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

Black-White Array (BWA) — это упорядоченная структура данных с амортизированным временем операций вставки/поиска/удаления O(\log N) и O(\log N) используемых участков памяти. Преимущества:

• Амортизированное время вставки/удаления/поиска сравнимое с реализацией BTree от Google;
• Низкое количество аллокаций памяти при операциях вставки O(\log N) - меньше давления на сборщик мусора, ниже фрагментация памяти;
• Массивы под капотом: данные лежат рядом, что улучшает кэшируемость процессором и скорость обхода/доступа к данным;
• Позволяет хранить элементы с одинаковыми ключами - не нужно использовать дополнительные структуры для группировки таких элементов;
• Низкий оверхед на хранение служебной информации - экономия памяти по сравнению с другими структурами данных;
• Удобен для вставки батчами;
• Простая сериализация и десериализация;

Подробности

Формат CHM, структурность, локальность, скорость и около-научная лирика

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

Не знаю как у вас, а у меня браузер позволяет иногда сохранить всю веб-страницу в этом формате для локального просмотра. И это удобнее — иметь один файл на страницу вместо html‑портянки с кучей разбросанных картинок и скриптов.

Но вообще‑то, CHM — это многостраничный формат, html‑версия и наследник стандартного файла справки HLP Windows 90-х — 00-х годов. И он может хранить в структурированном виде целый сайт или даже портал, с перекрёстными ссылками внутри.

Памятуя успешное использование локальной версии портала cppreference.com, я решил, почему бы не попробовать использовать такой же метод: упаковать доку в формате chm.

Читать далее

CTE (Common Table Expression) / Django CTE

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

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

Поэтому в этой статье я расскажу:

1. что такое CTE

2. зачем оно нужно 

3. что такое рекурсивные СТЕ

4. чем СТЕ отличается от временных таблиц, представлений и подзапросов

5. как СТЕ может плохо сказаться на производительности 

6. как использовать СTE в самом народном фреймворке Django

Использует SELECT со звёздочкой Макс - Lead Backend и автор YouTube-канала PyLounge. Поехали! 

Читать далее

Архитектурный подход к контролю согласованности в LLM

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

1.1. Контекст и вызов Современные большие языковые модели(LLM) совершили рывок в обработке естественного языка, приблизившись к человеческому уровню в задачах генерации и понимания текста. Однако за внешней убедительностью ответов скрывается одна большая и существенная проблема: LLM по своей природе всё также остаются «предсказателями» следующего токена, а не системами, построенными на формальной логике или чётких онтологических моделях. Это порождает парадокс: модели, способные вести глубокие дискуссии по сложным темам, могут формировать ложные выводы или выдавать противоречивые утверждения в одном ответе.

1.2. Суть проблемы: смешение абстракций и отсутствие внутренней дисциплины
Галлюцинация не являются основной проблемой, они лишь следствие. Основная причина в
систематическом нарушении согласованности между различными уровнями обработки информации. Это проявляется в нескольких ключевых типах логических сбоев, скрывающихся в архитектуре LLM:

· Фактическая несогласованность: Ответы модели противоречат проверяемым данным или её же собственным предыдущим утверждениям в рамках диалога.
· Логическая несогласованность: Нарушение базовых правил дедукции (например, признание истинности утверждений «А → Б» и «А», но отрицание «Б») или последовательности в цепочках рассуждений.
· Контекстуальная несогласованность: Неспособность сохранять все выводы и факты при генерации сложного ответа, что приводит к искажению или полной замене исходных условий.

Эти сбои — прямое следствие того, что в процессе генерации модель не различает в своей внутренней работе этапы извлечения и верификации сырых данных (факты), построения интерпретаций на их основе (анализ) и формирования окончательных выводов (синтез).

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

Читать далее