Обновить
1034.54

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

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

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

Metalama: праовца, аспекты приносящая

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

Метод программирования, именуемый аспектно-ориентированным, впервые явился миру в конце девяностых годов прошлого века, когда группа исследователей из Xerox PARC под руководством Грегора Кичалеса решила, что объектно-ориентированного подхода человечеству недостаточно. Они создали AspectJ — расширение для Java, призванное разрешить проблему, которую окрестили «сквозной функциональностью». Суть проблемы проста до безобразия: код логирования, обработки ошибок, проверки прав доступа и прочих служебных радостей размазывается по всему приложению, как масло по по́лу, превращая элегантную бизнес-логику в свалку повторяющихся конструкций.

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

Встречайте Metalama →

Новости

ChatGPT 5.2 Pro vs Claude Opus 4.5 vs Gemini 3 Pro: битва титанов в программировании

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

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

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

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

Сегодня мы сравним ChatGPT 5.2 Pro, Claude Opus 4.5 и Gemini 3 Pro в области программирования. Мне не интересно оценивать лишь написание программ под конкретные задачи, поэтому модели попробуют выявить ошибки в готовых вариантах решений. Принимайте стратегически удобное положение, ну а я приступаю к сравнению.

Читать далее

Может ли устареть инкремент: обзор выполнения оператора на современных вычислительных платформах

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

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

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

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

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

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

Рассмотрим «простой» пример цикла, выполняющего сложение двух массивов. Слово «простой» взято в кавычки не случайно. Даже тезисное обсуждение эффективных методов сложения массивов на GPU (NVIDIA или AMD) с коллегами занимает несколько часов. Полноценно раскрыть эту тему в одной статье невозможно.
Поэтому сосредоточимся лишь на части примера – операции инкремента «i++» в управляющей части цикла.

Для анализа обратимся к книгам, рекомендованным на профильных it-ресурсах: Хабр, Яндекс.Практикум, Proglib и др.

Чтобы уточнить информацию, рассмотрим официальные руководства следующих производителей вычислительных устройств: CISC (Intel, AMD), VLIW (МЦСТ, Texas Instruments), RISC (Apple, Qualcomm, MediaTek и др.) и GPU (NVIDIA, AMD).

Читать далее

Украсили ASCII-елочку. Как прошел Т-Адвент

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

Хабр, привет! На связи разработчик направления Digital Interview в Т-Банке Анжела Большакова. Совсем недавно мы выпустили статью о нашей внешней платформе для проведения собеседований — Enterly, а теперь расскажем об онлайн-активности, которую мы провели на ней.

Декабрь — сезон адвентов на любой вкус и цвет. Вот и мы решили сделать свой, с ИТ-задачами и призами. Правила простые: в определенные даты мы открывали и присылали в телеграм-канал «Код Желтый» ссылки, по которым нужно было решить задачку на написание кода. Решения принимались на любом из 16 языков программирования — от JavaScript и Python до Kotlin и Go. Под конец года уже не хотелось обычных задач по программированию, поэтому взяли шуточные, на находчивость. Рассказываем, о чем просили участников и какие интересные решения увидели.

Читать далее

Фитнес в VR? Добавляем свою музыку в BeatSaber

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

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

Игра Beat Saber — это впечатляющий источник домашней физической нагрузки под музыку. В этой статье разберем, как играть на треках из пользовательской библиотеки, и попытаемся создать свою карту c любимой музыкой. Спойлер: инструменты не так страшны.

Отработать салатики

Структуры данных на практике. Глава 1: Разрыв в производительности

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

Часть I: Основы

«В теории теория и практика одинаковы. На практике это не так». — авторство приписывается разными специалистам по computer science

Загадка

Два часа утра. Я смотрю на совершенно нелогичные данные профилирования.

В процессе работы над загрузчиком для SoC RISC-V у нас возникла проблема с производительностью. Загрузчик должен был искать конфигурации устройств в таблице: примерно пятьсот элементов, каждый с 32-битным ID устройства и указателем на данные конфигурации. Всё просто.

Мой коллега реализовал эту систему с помощью хэш-таблицы. «Поиск за O(1), — сказал он уверенно, — лучше уже некуда».

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

Я попробовал использовать очевидную оптимизацию: заменить хэш-таблицу двоичным поиском по отсортированному массиву. Двоичный поиск занимает O(log n), что теоретически хуже, чем O(1). Так написано в учебниках. Мой преподаватель алгоритмов был бы разочарован.

Но в результате загрузчик оказался на 40% быстрее.

Как O(log n) смогло победить O(1)? Что происходит?

Читать далее

Сколько нужно парадигм, чтобы вкрутить лампочку?

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

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

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

Я список парадигм прочёл до середины

Достаточно надёжный и научно обоснованный алгоритм проверки текста на AI

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

Кажется, я изобрёл алгоритм, при помощи которого можно достаточно надёжно отличить авторский текст от AI‑текста.
Помимо надёжности, алгоритм очень нетребователен к вычислительным ресурсам и способен эффективно работать даже на 8‑битных микроконтроллерах в связке с W5100.

Суть его в следующем. Ваше вычислительное устройство открывает web‑страницу и ищет на ней четырёхзначные числа. Если таких чисел нет или если на странице попадается хотя бы одно число, большее чем 2023, такая web‑страница с вероятностью 50% AI‑сгенерирована.
Если же все найденные четырёхзначные числа меньше, либо равны 2022, то вероятность AI‑генерации данной страницы равна 1%.

Ниже я расскажу, как мне пришла в голову идея столь простого, но в тоже время эффективного алгоритма.

распознать AI с первого взгляда

Карьерный потолок в IT: почему я перестал стремиться в менеджмент и начал делать свой продукт

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

Каждый разработчик в начале пути видит перед собой ясную лестницу: Junior → Middle → Senior. Рост компетенций сопровождается ощутимым ростом зарплаты, и это даёт мощный заряд мотивации. Но что происходит, когда вы достигаете уровня Senior? Зарплата упирается в «стеклянный потолок», задачи становятся однотипными, а привычный драйв исчезает.

Читать далее

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

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

История концептов в C++ – один из самых показательных примеров того, как язык развивается не линейно, а через десятилетия экспериментов, откатов и переосмыслений. Первые идеи, которые мы сегодня называем концептами, появились ещё в конце 1990-х, когда стало очевидно, что шаблоны C++ имеют колоссальную выразительность, но практически не дают средств для описания намерений программиста. Шаблон можно было инстанцировать почти с любым типом, но ошибка проявлялась либо в виде километров сообщений компилятора, либо в виде неожиданного поведения в рантайме. Уже тогда Страуструп сформулировал проблему как «отсутствие контрактов для шаблонов», когда программист знает, что от типа требуется оператор + или ==, но язык этого не выражает.

Ранние предложения концептов были чрезвычайно амбициозными и стремились описывать не только синтаксис, но и семантику. Например, концепт EqualityComparable должен был означать не просто наличие operator==, но и выполнение математических свойств эквивалентности: рефлексивности, симметричности и транзитивности. Аналогично, концепты для упорядоченных типов предполагали строгую слабую упорядоченность, а для итераторов корректное поведение при многократном проходе. Это отражало академический взгляд на обобщённое программирование, сильно вдохновленный функциональными языками и работами Степанова.

Читать далее

Легкий способ развить свой TG-Канал. Как развивать личный бренд и зачем он IT-шнику?

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

Девять месяцев назад я начал вести свой канал t.me/siliconchannel. Писал статьи для Хабра на свою профессиональную тему - Go-разработку - и задумался: а могут ли эти статьи и вложенный в них труд приносить кратно больше пользы и мне, и Хабру? В итоге это привело к блогу на 4000 подписчиков с 0 рублей вложений.

Читать далее

Оптимизация и запуск нейронных сетей на React Native: кейс с травой

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

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

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

Читать далее

Кто умнее: программист, или берёзовое полено?

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

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

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

Уж точно, не программисты

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

Нечёткое тестирование свойств

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

Есть две категории программистов. Первая пишет тесты, вторая работает. Шутейка, конечно, на троечку, но в каждой байке, застрявшей в пабликах мёртвых заархивированных форумов, под пылью и нафталином, — можно нащупать слой гранита настоящей правды. Модное ныне «покрытие кода тестами» напоминает попытку оклеить айсберг новогодней мишурой — вроде и весело, но Титаник все равно пойдет на дно.

Я собираюсь рассказать о том, как правильно тестировать код в изоляции (интеграционные тесты — зверь из соседнего вольера, и о нем — в другой раз). Для этого нам потребуется пара определений. Фаззинг (от английского fuzzing) — это способ тестирования, при котором программе скармливают огромные объемы случайных, полуслучайных или вообще намеренно испорченных данных, с надеждой выявить уязвимости или баги. Изначально этот метод применялся в академической среде для поиска дыр в безопасности, но быстро перекочевал в руки здравомыслящих разработчиков. Property-based testing, в свою очередь, представляет собой подход к тестированию, где вместо проверки конкретных примеров типа «дважды два — четыре» мы формулируем общие свойства системы. Например: «если функция принимает список и возвращает список, то длина результата не должна превышать длину входа». А дальше уже инструмент генерирует тысячи, миллионы вариантов входных данных и проверяет, соблюдается ли это условие.

Taste it!

Встречайте Gas Town

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

С Новым Годом и добро пожаловать в Gas Town!

Gas Town - это новый взгляд на IDE для 2026 года. Gas Town помогает вам справиться с рутиной запуска множества экземпляров Claude Code. Вещи теряются, трудно отследить, кто чем занимается, и так далее. Gas Town помогает со всей этой рутиной и позволяет вам сосредоточиться на том, над чем работают ваши Claude Code.

В этом посте "Claude Code" означает "Claude Code и все его идентичные конкуренты", то есть Codex, Gemini CLI, Amp, Amazon Q-developer CLI, бла-бла-бла, потому что именно этим они и являются. Клоны. Индустрия - это постыдная детская футбольная команда, гоняющаяся за форм-фактором CLI Claude Code образца 2025 года, вместо того чтобы создавать то, что будет дальше.

Я пошел вперед и создал то, что будет дальше. Сначала я предсказал это еще в марте в статье Месть начинающего разработчика. Я предсказал, что кто-то свяжет верблюдов Claude Code вместе в колесницы, и это именно то, что я сделал с Gas Town. Я приручил их настолько, что вы можете продуктивно использовать 20–30 штук одновременно на постоянной основе.

Gas Town имеет свое мнение - во многом как Kubernetes или Temporal, на которые Gas Town похож, по крайней мере, если прищуриться так сильно, что глаза почти полностью закроются. Я включу сравнения как с k8s, так и с Temporal в конце этого поста. Немного удивительно, насколько они похожи, несмотря на радикально разные основы.

Но сравнение должно служить предупреждением: Gas Town сложен. Не потому, что я этого хотел, а потому, что мне приходилось добавлять компоненты до тех пор, пока он не стал самодостаточной машиной. И те части, которые у него теперь есть, ну, они выглядят так, как будто Kubernetes спарился с Temporal, и у них родился очень уродливый ребенок.

Но это работает! Gas Town решает проблему MAKER (Ханойская башня из 20 дисков) вообще элементарно. Просто генерируешь по формуле "цепочку" на миллион шагов - и готово. Вчера ради интереса прогнал 10 дисков за несколько минут: доказал, что тысяча шагов для нас - это не проблема, хотя в статье MAKER говорится, что нейронки ломаются уже через несколько сотен. На 20 дисков закладываю часов 30. На этом мой импровизированный TED Talk окончен.

Все это обретет полный смысл, если вы дочитаете до конца следующих 23 страниц.

Читать далее

Лучшие практики Beads

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

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

Beads занимает совершенно уникальную нишу. Все сосредоточены на создании инструментов планирования, в то время как Beads - это инструмент исполнения. Это всё равно что поставить вашего ИИ-агента на отлично смазанные лыжи. Возможно, лучшим названием было бы Agents on Rails («Агенты на рельсах»). Но название «Beads» (Бусины) хорошо передает идею того, что инструмент сфокусирован исключительно на отслеживании (трекинге) и ни на чем другом: маленькое имя для маленькой системы.

Сейчас, спустя почти 6 недель своего пути, Beads стал намного, намного стабильнее. Это была безумная гонка, порой менялось по 50 тысяч строк кода в день. И никто из нас, контрибьюторов, даже не просматривает этот код. Он на 100% написан ИИ («vibe coded»), сейчас в нем 130 тысяч строк на Go, и примерно половина - это тесты. Десятки тысяч людей используют его в своих повседневных рабочих процессах. Люди говорят мне, что им это так нравится, что они используют его даже для личных списков дел (TODO). А другие направо и налево встраивают его в более крупные оркестраторы. Это также потрясающий строительный блок.

Мы сохранили небольшой объем функционала. Прислушиваясь к мнению сообщества, я отвергаю всё, что не должно быть частью ядра Beads. Поэтому у Beads нет пользовательского интерфейса (UI), но есть множество примеров UI, которые люди создали как проекты «для души» (passion projects). У нас их уже как минимум четыре или пять. Мой приятель и соавтор Джин Ким даже создал свой собственный UI для Beads на Java Swing! Он был так взволнован, когда показывал мне его. И это действительно было очень круто.

Итак, никакого UI, и у Beads также нет системы планирования. Он не для этого. Но он отлично интегрируется с любой системой планирования - просто составьте план, а затем попросите агента создать в Beads эпики и задачи (issues) для этой работы. После того как эпики будут готовы, вы можете натравить на них любое количество агентов, чтобы они их «разгребли».

Последняя большая категория, которую люди постоянно пытаются втиснуть в Beads, - это оркестрация. Мы знаем, что оркестрация неизбежна. И есть соблазн сделать Beads более активным; сегодня он довольно пассивен и ожидает, что Агент будет использовать его как инструмент. Но люди хотят большего. И я их понимаю. Однако этому не место в Beads.

Читать далее

Представляем Beads: система памяти для кодинг-агентов

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

Я занимался вайб-кодингом (vibe coding) как одержимый сорок дней и сорок ночей. Это долгая история, поэтому я резюмирую её в этих трех картинках.

Слева, 3 недели назад: я вайб-кожу на пляже за ужином в Кабо-Сан-Лукас, Мексика, с неподражаемым Торстеном Боллом, нашим приятелем Мэттом Манелой и другими коллегами из Sourcegraph на корпоративном выезде. Кто-то сделал это фото, потому что я отказывался убрать компьютер.

В центре, 2 недели назад: фотография, на которой я фотографирую сам себя, пока еду на скорости 100 км/ч (60 миль/ч) по шоссе в Беллингем, чтобы забрать гитары, занимаясь голосовым вайб-кодингом всю дорогу туда и обратно. Глупо и чертовски опасно. Мне было плевать. Застрял в пробке на несколько часов. Всё равно плевать. Я упоминал, что это вызывает привыкание? Вайб-кодинг вызывает привыкание.

На последнем кадре: мы с женой в торговом центре на прошлой неделе, наслаждаемся приятным днем с кофе, наблюдаем за людьми и вайб-кодим вместе с Моцартом (на фото он в своей любимой сумке). Лин прячется за компьютером - так я получил разрешение руководства на публикацию снимка.

Я никуда не хожу и не делаю ничего, даже не сплю, без своего ноутбука. Ну, разве что когда бегаю - там я ещё не совсем раскусил, как вайб-кодить. Но я близок. Это тема для отдельного поста, но у меня наконец-то работают агенты на GCP с Terraform и Tailscale. Так что скоро я смогу вайб-кодить и с телефона.

Агенты никогда не должны отдыхать.

Читать далее

Компиляторы нового поколения: Искусственный интеллект на службе у кода

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

Автор: Денис Аветисян

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

Читать далее

Современный C# для начинающих и джунов. Часть 1

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

Большинство гайдов по C# в Интернете или давно утратили актуальность, или содержат лишь небольшие вкрапления новых возможностей, но лишены последовательности. Есть и другая крайность - ИИ простыни сгенерированного текста под видом статей, которые очень тяжело читать. Я хочу сделать свою попытку изменить ситуацию.

Читать далее

Избавляемся от ошибок Segmentation fault из-за переполнения стека в С++

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

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

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

Существует ли хотя бы теоретическая возможность защититься от ошибок переполнения стека и сделать из нее обычную ошибку (исключение), которую можно поймать (обработать) в самом приложении, чтобы была возможность продолжить выполнение программы без боязни последующей ошибки сегментации (segmentation fault) или повреждения стека (stack smashing)?

Читать далее

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