Обновить
256K+

Алгоритмы *

Все об алгоритмах

408,84
Рейтинг
Сначала показывать
Порог рейтинга

Сквозное шифрование, или как Telegram и Concord защищают переписку.

Хочу написать небольшой пост о сквозном шифровании, или, если использовать технический термин, E2EE (End-to-End Encryption).

Сегодня эта технология широко применяется во многих мессенджерах. Я тоже реализовал E2EE в мессенджере Concord. Однако далеко не все понимают, как именно работает этот механизм, поэтому попробую объяснить простыми словами.

Поскольку я являюсь разработчиком и основателем собственного мессенджера, реализовать эту схему для меня не составило особого труда. Главный секрет заключается в понимании принципов работы криптографических алгоритмов, таких как AES и RSA. Хотя современные реализации E2EE обычно используют не RSA, а алгоритмы на эллиптических кривых (например, X25519), я не стал прибегать к усложнениям.

Алгоритм AES я использовал для непосредственного шифрования текстового сообщения, которое один пользователь отправляет другому. Для шифрования применяется секретный ключ (или пароль). Основная проблема такого подхода заключается в том, что этот ключ необходимо каким-то образом передать получателю. Если злоумышленник перехватит ключ, он сможет расшифровать сообщение.

Чтобы этого не произошло, я использовал ещё один алгоритм - RSA. Для его работы требуется пара криптографических ключей: публичный и приватный. Так как RSA не предназначен для шифрования больших объёмов данных, я его использовал для безопасной передачи того самого секретного ключа, который используется алгоритмом AES.

В результате схема выглядит так.

Сначала текст сообщения шифруется алгоритмом AES с использованием случайного секретного ключа. Затем этот ключ шифруется алгоритмом RSA с использованием публичного ключа получателя. Когда получатель отправляет ответ, он выполняет ту же самую операцию, но уже с публичным ключом аппонента.

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

Когда получатель открывает сообщение, его устройство сначала с помощью приватного ключа RSA расшифровывает секретный ключ AES, а затем уже этим ключом расшифровывает само сообщение.

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

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

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

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

Именно поэтому требование "передать ключи" технически лишено смысла. Передавать попросту нечего.

П.С.

Я - сетевой долгожитель и начинал свой путь еще в эпоху Фидонета (FidoNet). Эта сеть была по-настоящему децентрализованной: никаких общих серверов и никакого DNS. Все строилось просто: компьютер, модем и терминальная программа для связи. Часто в роли узла (ноды) выступал сервер в банке, где знакомый сисадмин выделял адреса. При этом подключиться можно было к любому другому участнику, даже к частному лицу. Вот это и была настоящая децентрализация! Думаю, учитывая растущее давление регуляторов на современный интернет, мы скоро снова вернемся к проверенным идеям старого доброго Фидо.

Теги:
+7
Комментарии0

5 граблей, на которых умирают торговые боты

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

Стратегия - никогда не была сложной частью. Сложной частью была инфраструктура.

«Это работало в бэктесте» ничего не значит, если в live крутится другой код

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

Ошибка, которая открывает позицию дважды

Бот, обновляющий позицию в момент, когда процесс умирает - OOM, деплой, скачок питания, просыпается с испорченным состоянием: наполовину открытая позиция, неправильный cost basis, выход, который так и не зарегистрировался. Восстановление руками - это место, где утекают деньги.

Ордер, который биржа молча отвергла

Тихий убийца live-торговли: биржа отвергает, отваливается по таймауту или наливает частично - и внутреннее состояние вашего бота больше не совпадает с реальностью. Фикс из учебника - рукописный try/catch с откатом вокруг каждого ордера - это ровно тот код, который ломается на том краевом случае, который вы не предусмотрели.

Десять стратегий, один счёт, экспозиция 100%

Проверки риска по каждой стратегии в отдельности упускают очевидную портфельную истину: десять стратегий, каждая «рискует 10%», - это один счёт, рискующий всем. Открыть сразу 10 позиций не хватит капитала

Получение внешних данных через Crontab

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

Теги:
+3
Комментарии0

Собеседование. Часть 2: От структур данных до магии Load Factor и data class’ов ​

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

Мой второй любимый блок вопросов плавно перетекает от базовых коллекций к особенностям Kotlin и внутреннему устройству хэш-таблиц. Я оцениваю знания градационно: от того, что должен понимать начинающий специалист, до глубокого видения платформы. ​

Уровень 1: Начинающие специалисты и базовые структуры

​Начинаем с разминки. Я прошу объяснить разницу между Array, ArrayList и LinkedList. Это фундамент, без которого сложно двигаться дальше. ​Если кандидат понимает структурную разницу, я спрашиваю про скорость доступа к произвольному элементу (Time Complexity):

  • Array (Массив): Непрерывный блок памяти фиксированного размера. Чтение по индексу происходит мгновенно, вычислительная сложность O(1).

  • ​ArrayList: Умная обёртка над массивом, умеющая динамически расширяться (путем копирования элементов в новый массив при переполнении). Доступ по индексу также O(1). ​

  • LinkedList (Связный список): Элементы разбросаны в памяти, каждый узел знает только о своем соседе. Чтобы найти нужный элемент, нужно последовательно пройти по цепочке. Скорость доступа — O(N). ​

Если специалист отвечает на это уверенно, значит, базовое понимание Computer Science заложено верно. ​

Уровень 2: Переход к Kotlin

​Дальше я меняю плоскость и перехожу к синтаксису. Вопрос: «В чем разница между обычным class и data class в Kotlin?» ​Ожидаемый ответ на этом этапе: data class из коробки генерирует полезные методы, избавляя разработчика от написания бойлерплейта. Компилятор самостоятельно создает equals(), hashCode(), toString(), метод copy() и componentN() для деструктуризации.

Затем я прошу уточнить целевое использование. Кандидат должен пояснить, что data class нужен для хранения данных (например, моделей из сети) или состояния UI. Главная особенность в том, что объекты data class’ов сравниваются по содержимому (значениям полей), а не по ссылке в памяти. ​

Уровень 3: Углубленное понимание платформы ​А теперь самое интересное — мы сплетаем теорию структур данных и специфику Kotlin воедино. ​

Я спрашиваю: «Отлично, data class переопределяет метод hashCode(). А для чего именно он нужен? Как он используется под капотом?» ​Здесь требуется рассказать про принципы работы HashMap или HashSet: ​Метод hashCode() возвращает число, определяющее, в какую «корзину» (bucket) внутреннего массива попадет объект. ​Если хэши совпадают (коллизия), применяется метод equals(), чтобы найти точный объект внутри этой корзины. ​

И: «Что такое Load Factor в хэш-таблице? И что произойдет, если мы установим его слишком высоким (например, 0.95)?» ​

Правильный ответ: Load Factor (по умолчанию 0.75) — это метрика того, насколько может быть заполнена таблица до автоматического увеличения её размера (rehash). Если установить высокое значение, корзины переполнятся. Возникнет лавина коллизий. В результате хэш-таблица внутри одной корзины деградирует в LinkedList! Скорость доступа падает до линейной O(N) (или O(log N) для деревьев в новых версиях), лишая структуру её главного преимущества. ​

Резюме: ​Алгоритмы и структуры данных — это, по сути, сухая теория. Для меня как для интервьюера гораздо важнее то, как человек применяет её на практике. ​

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

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

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

Собеседование. Часть 1: Как простая задача на разворот массива вскрывает понимание Computer Science

За свою карьеру я провел сотни технических собеседований на самые разные грейды — от джунов до системных архитекторов. И делал я это в разных локациях: в России, Европе и США. Процессы найма везде немного отличаются, но есть подходы, которые работают безотказно в любой точке земного шара.

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

Эта задача — идеальная «лесенка», раскрывающая реальный уровень инженера. Давайте пройдем по ней вместе.

Шаг 1: Уровень Джуниора. Просто сделай это

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

fun reverseArrayNaive(arr: IntArray): IntArray {
    val result = IntArray(arr.size)
    for (i in arr.indices) {
        result[i] = arr[arr.size - 1 - i]
    }
    return result
}

Если код написан без ошибок с индексами — отлично. Если человек путается и не может подойти к задаче — для меня это красный флаг. Если код готов, я задаю первый вопрос: «Какова вычислительная сложность?». Ожидаемый ответ: сложность O(N) по времени, так как мы проходим массив один раз.

Шаг 2: Уровень Мидла. Экономим память

Переходим на следующий уровень. Я спрашиваю: «А что со сложностью по памяти?». Кандидат логично отвечает, что раз мы создаем массив того же размера, сложность — O(N).

Усложняем задачу: «Представь устройство с жестким лимитом ресурсов. Нам нельзя выделять память под второй массив. Как переписать алгоритм, чтобы сложность по памяти стала O(1)

Продвинутый разработчик сразу предложит in-place решение: менять элементы местами с начала и с конца.

fun reverseArrayInPlace(arr: IntArray) {
    var left = 0
    var right = arr.size - 1
    
    while (left < right) {
        val temp = arr[left]
        arr[left] = arr[right]
        arr[right] = temp
        left++
        right--
    }
}

Шаг 3: Уровень Синьора. Психологическая ловушка

Если in-place вариант написан, я подкидываю вопрос с подвохом: «В первом варианте цикл делал N итераций. Во втором указатели встретились посередине, то есть цикл выполнился N/2 раз. Уменьшилась ли вычислительная сложность по времени?»

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

Правильный ответ: Нет, сложность осталась O(N). Давайте посчитаем атомарные операции присваивания:

  1. В наивном подходе мы делали 1 присваивание за итерацию. Цикл шел N раз. Итого: N операций.

  2. В in-place подходе мы делаем swap. Это три операции (temp = a, a = b, b = temp). Цикл идет N/2 раз. Умножаем 3 на N/2 и получаем 1.5 × N операций!

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

За 10 минут с помощью одной задачи мы проверили:

  1. Умение писать циклы (Джун).

  2. Понимание Big O и расхода памяти (Мидл).

  3. Понимание реальной цены оптимизаций (Синьор).

Это не спортивное программирование с хитрыми математическими трюками. Это проверка базовой инженерной гигиены.

Теги:
Всего голосов 8: ↑6 и ↓2+6
Комментарии7

🧠 Топовый сайт для подготовки к собеседованию

Я хотел порешать задачи по System Design и нашел нефть hellointerview.com.

Расскажу про основные плюсы сайта:

  1. Материал без воды, но при этом сложные темы раскрыты очень подробно

  2. Видео и статьи, где вам рисуют диаграммы и детально объясняют решения

  3. Куча практики, где ваше решение проверяет ИИ (и делает это реально хорошо)

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

Если вам интересно, как под капотом работают Google Docs или Elasticsearch, вам сюда.

Еще на сайте есть:

1. Low Level Design (Object-Oriented Design) Тут тоже отличные практические задачи и теория строго по делу. Чего только стоит эта фраза о полезности ООП-паттернов:

Most online resources still dutifully list all 23 GoF patterns like they’re equally important. They’re not.

2. Code (алгоритмы и структуры данных) Тоже полный фарш - статьи, видео с визуализацией алгоритмов и много практики.

3. ML System Design, Behavioral, AI Coding, Salary Negotiation и гайды по интервью в FAANG.

Сайт платный и на английском. Из рф купить его, скорее всего, нельзя, но есть русская копипаста - nowinterview.ru (правда, тоже платная).

👨‍💻 Джуниор

Теги:
Всего голосов 4: ↑1 и ↓3-2
Комментарии0

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

У меня при виде такой информации сразу встает вопрос: а чему там такому учили и как это поможет детям решать задачи в реальной жизни? Я это спрашиваю с позиции человека, который периодически участвует в интервьировании студентов американских вузов на работу проектировать телефоны в Самсунг. Интервьирует кандидата обычно команда из рекрутера, скринера‑инженера, пяти старших инженеров и двух начальников. В отличие от гуманитария Ivan Kurilla, который в некоем интервью рассказывал что в Америке все решает топовый вуз, я знаю из своей практики, что даже если у студента хоть два диплома из вузов в мировом Топ-10, но он не решает задачки на интервью, то он не получит оффера. А вот если хорошо решает, то скорее всего получит. Вуз имеет значение при сравнении двух кадидатов которые решают задачки примерно одинаково.

Вы себе не представляете, какое количество студентов, в том числе топовых вузов, плавает на вопросах типа: «преврати последовательности с битом first в последовательности с битом last». Полная формулировка: на вход цифрового блока приходят последовательности из трансферов данных. Каждый трансфер считывается на положительном фронте тактового сигнала clock, на котором сигнал valid=1. Первый трансфер в каждой последовательности обозначен сигналом first. Блок должен выдавать на выходе такую же последовательность, но маркировать не первый трансфер, а последний сигналом last. Напишите код на языке описания аппаратуры Verilog который это делает«.»

Вот сейчас некоторые комментаторы побежали в ChatGPT и вернутся с репликой «но это же так просто!» Но в реальной жизни кандидат интервьируется у доски (физической, на стене, не виртуальной) без доступа не только к ИИ, но и к любым электронным устройствам вообще. И оказывается, что многим это не просто, топовые вузы почему‑то не научили их решать такие задачки, хотя в программе это есть. Если вдумчиво пройти курс MIT 6.111 или там курс по учебнику Dally & Harting в Стенфорде, то у студента не должно возникнуть проблем с такими задачками. Но они возникают.

Я это все к чему. Никто так и не спросил, а что собственно такое учили в той обанкротившейся школе, что ради этого нужно было снимать замок‑шато во Франции? Чем это лучше помогает скажем решать задачки по геометрии (геометрия тоже нужна про проектировании GPU в телефоне), чем школа в здании бывшего пионерлагеря около сельмага в Новосибирской области? (Я про Летнюю Школу Юных Программистов в Новосибирске если кто не понял намек). Мы в Самсунге кстати сейчас нанимаем на позиции RTL‑дизайнеров — можете присылать мне запросы, если вы решили задачку выше без бегания в ChatGPT и она прошла тест. Тест вот тут (он используется на российской Школе Синтеза Цифровых Схем кстати).

Теги:
Всего голосов 10: ↑9 и ↓1+10
Комментарии12

Наконец-то поднял публичную демку Aximo на Hugging Face Spaces 🎙️

Это локальный speech-to-text API, который работает на CPU, использует Parakeet v3 и позволяет тестировать транскрибацию прямо из браузера через Swagger UI с записью с микрофона, о котором писал в одном из своих предыдущих постов.

Теги:
Всего голосов 1: ↑0 и ↓1-1
Комментарии0

Чернобыльское лето 1986 года, когда все киевские одноклассники разъехались по разным концам СССР подальше от радиации, было для меня супер-продуктивным в смысле изучения программирования. Я ходил в контору человека по фамилии Долина, бывшего полковника танковых войск из Донецка, который переквалифицировался в компьтеризатора украинского образования. Там я работал на компьютерах MSX Yamaha, выучил программирование на Си. Компилятор назывался ASCII C (сейчас в комментах появятся умники которые будут мне говорить, что ASCII это кодировка, а я им буду кидать ссылку что это еще и японская компания).

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

В конце лета я полетел на Новосибирскую Летнюю Школу Юных Программистов, где выучил ассемблер Z80 и сделал поддержку параллельного выполнения нескольких Си функций с помощью переключения контекстов в обработчике прерывания по таймеру. С сохранением регистров в дексрипторе задачи в списке задач. За это я получил диплом первой степени. По-моему дипломы вручал академик Ершов, хотя может я путаю и мы встретились с ним в академгородке куда на тоже возили.

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

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

Помимо этих программ я привез на флоппи-дисках со школы CP/M (хуже файловая система чем в MSX-DOS), среду Turbo Pascal, интерпретатор Lisp, компилятор Nevada Fortran, еще два компилятора Си (Aztec C и BDS C) и даже компилятор с подмножества языка Ada, который я знал теоретически, но никогда не использовал.

29 лет спустя, в 2017 году я приехал на ту же новосибирскую школу в качестве инструктора по Verilog и FPGA. Еще там был Борис Файфель который учил детей Лиспу или чему-то такому.

Теги:
Всего голосов 21: ↑21 и ↓0+25
Комментарии4

ИИ это – это все понимают по-разному

ИИ это – это все понимают по-разному в силу своей осведомлённости и понимания. Можно ли считать проявлением ИИ и называть умным устройством смартфон (умный телефон). Очевидно, что это средство автоматизации (упрощения и ускорения) каких-то житейских процессов. Конечно, удобно получать подсказки по ходу ввода текста или напоминания о днях рождения, но причём здесь ум.

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

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

Нейросети часто отождествляют с генеративными трансформерами, но это далеко не так, хотя одно базируется на другом. Генерация трансформерами текстов и изображений впечатляет, но где здесь интеллект, когда это, просто хитроумная комбинаторика. Ничего нового трансформеры предложить не могут, поскольку всего лишь аккумулируют известное. Как инструмент систематизации вещь весьма полезная, но интеллект ли это? К тому же разметка данных для нейросетей и разбиение в трансформерах задач на подзадачи вещь во многом субъективная (частично или полностью запрограммированная человеком).

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

И ещё. Генерация контента, ситуационное распознавание, управление роботами и тому подобные задачи, которые нынче принято отождествлять с проявлениями искусственного интеллекта – лишь малая часть того, что необходимо человеку. Успешность продвижения ИИ во многом определяется не столько полезностью, сколько зрелищностью.

P.S.

Сможет ли ИИ выжить без электричества? А ведь перспектива не такая уж и призрачная…

P.P.S.

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

 

 

Теги:
Всего голосов 3: ↑3 и ↓0+3
Комментарии9

Искусство программирования в одном шаге от запрета

Искусство программирования и связанные материалы
Искусство программирования и связанные материалы

В апреле 2026г. минюст добавил Стэнфордский университет в список нежелательных организаций. Это затронуло Искусство программирования заслуженного профессора Д.Э. Кнута (TAoCP). Обложка книг любезно приглашает узнать информацию о будущих томах, с web-ссылкой на нежелательную организацию, ведь профессор ведёт раздел на сервере своего университета. Такие ссылки теперь имеют юридические последствия.

По результатам проверки достоверно установлено, что ЯГПУ им. К.Д. Ушинского, являясь единоличным пользователем на своём официальном сайте https://yspu.org/, осуществлял хранение и распространение информационных материалов, издаваемых организациями <данные изъяты>, а также то, что указанные ссылки и ресурсы находились в свободном доступе для прочтения и скачивания неограниченным кругом людей из числа других интернет-пользователей до 19.09.2025 года.

Нарушение запретов, установленных Федеральным законом от 28.12.2012 № 272-ФЗ «О мерах воздействия на лиц, причастных к нарушениям основополагающих прав и свобод человека, прав и свобод граждан Российской Федерации», если эти действия не содержат уголовно наказуемого деяния, образует состав административного правонарушения, предусмотренного статьёй 20.33 КоАП РФ.

Искусство программирования (The Art of Computer Programming, TAoCP), — это живой проект. Проект написания книги был начат автором в 1962 году. Первый том был издан в 1968 году, а самый свежий выпуск 7 к тому 4 в 2025м году. Профессор делает всё возможное, чтобы долго жить, и задумано 7 томов, но как видно по коллекции на фото, том 4 пошёл множиться по буквенным подтомам.

К некоторым томам выходят выпуски. По идее, каждый выпуск рано или поздно должен войти в том. Выпуски 0-4 к тому 4 образовали собой том 4А. Выпуски 5 и 6 образовали собой том 4Б/4B, вышел на английском в 2023, на русский не переведён. Будущий том 4В/4C, как ожидается, будет состоять из выпусков 7-9 к тому 4, из них издан только выпуск 7, в начале 2025 года, так что том 4В / 4C готов условно на одну треть. А ещё ожидается том 4Г/4D, и это может быть не последний четвёртый том.

Искусство программирования применяет два способа описания алгоритмов: на естественном языке и на ассемблере, чем выделяется на фоне многих других книг. В других книгах по алгоритмам либо псевдокод, либо высокоуровневый язык программирования. А в других книгах по Ассемблеру могут долго углубляться в программирование, допустим, EGA/VGA, его регистров, или регистров для настройки защищённого режима, но алгоритмически эти книги не выдающееся чтиво. Ассемблер в TAoCP выдуманный, не соответствующий 1:1 реальной машине, но такой коллективный портрет реальных процессоров.

За всю историю TAoCP архитектур было две, MIX и MMIX. Архитектурно в старом MIX 4000 MIX-слов оперативной памяти, а каждое MIX-слово состоит из одного бита знака и пяти MIX-байтов, итого шесть сущностей. Каждый MIX-байт должен быть в состоянии представить значения от 0 до 63, при этом допускаются не двоичные архитектуры. Канонические воплощения MIX-байта это шесть битов или два десятичных разряда. Дополнительным упражнением предлагается спроектировать троичную архитектуру. Переносимые программы для MIX должны быть готовы к любому воплощению. Если вдруг захочется ставить эксперименты с троичной архитектурой, старый MIX является, наверное, самой большой коллекцией троичных программ. Новый MMIX, тем временем, 64-битный, и байты в нём 8-битные. Всё довольно привычно, но разве что Big Endian за прошедшие 27 лет перестали делать.

Домашняя страница MMIX была передана в Мюнхенскую высшую школу прикладных наук, на неё ссылаться ещё можно.

MMIX пытались воплощать и в железе, пока только FPGA. Автор считает довольно прискорбным, что там для графики фреймбуффер. Лучше бы ускорение, как на Амиге или СЕГЕ, получится фэнтезийная ретроконсоль, на которой алгоритмисты встречаются с демосценой.

Профессор Дональд Эрвин Кнут является иностранным членом РАН.

Теги:
Всего голосов 23: ↑21 и ↓2+22
Комментарии0

Сегодня директора стратегического маркетинга компании Synopsys спросили, что он думает насчет того, чтобы софтвер его компании писал ИИ? И знаете что он ответил? «Это дело далекого будущего. Для этого требуется математика уровня PhD, а также итеративная доработка на основе проприетарных данных от фабрик микросхем — данных, которые ИИ пока не способен полностью смоделировать. (Пока!)»

Прикол тут в том, что сам Синопсис хайпит вовсю свой ИИ-софтвер для других компаний. А сами, как вы видите, говорят: мы де перейдем на это в далеком будущем. При том, что их софтвер — это просто программы на C++. Я работал в Synopsys, так что я знаю изнутри. Так что не говорите мне, что ИИ якобы уже хорошо пишет на C++ алгоритмически-интенсивные программы.

Для тех кто не в курсе: софвер Синопсиса используют инженеры для проектирования микросхем. В комментариях мой слайд про процесс: код на языке SystemVerilog превращается в граф из логических элементов и элементов состояния (D-триггеров), потом программы размещения и трассировки раскладывают и соединяют этот граф по площадке микросхемы.

От этого трудно отмахнуться! Перед нами цитата не луддиста-отрицателя ИИ, а человека из самого истока всех чипов, которые проектирует Apple, Intel, NVidia, и даже чипов для российких дронов (компании в Зеленограде тоже используют софтвер от Synopsys). ИИ сможет писать такие программы на C++ в Да-ле-ком Бу-ду-щем. Так что в этом году всем нам AGI не грозит.

Теги:
Всего голосов 18: ↑17 и ↓1+20
Комментарии2

Писать свои промпты или использовать готовые?

На этапах вывода продукта в релиз (GTM) я, как маркетолог, сталкиваюсь с повторяющимися задачами. Такие задачи можно и нужно автоматизировать с использованием промптов.


Сначала я писал свои несложные промпты, потом пробовал копировать чужие с адаптацией. Углублялся в промпт инженеринг и понял, что умение писать промпты для задач в своей сфере это тоже показатель экспертности. И вот почему:

  • Написание промпта погружает в задачу, начинаешь ее лучше понимать

  • Промпт рождается в определённом, необходимом для меня контексте и работает точнее

  • Я улучшаю промпт итерациями. Это позволяет по штурмовать его, в том числе и разными техниками промптинга

  • Написание промпта улучшает навыки написания ТЗ и постановки задач.

    Это лишь часть плюсов. Из минусов, это конечно затраты времени

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

Встречал мнение, что использование чужих промтов под свои задачи это показатель дилетанта.
Интересно , что об этом думают в других сферах?

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

5 правил программирования Роба Пайка:

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

  • Правило 2. Измеряйте. Не оптимизируйте скорость, пока не измерите, и даже тогда не делайте этого, если только одна часть кода не превосходит остальную.

  • Правило 3. Сложные алгоритмы медленны, когда n мало, а n обычно мало. Сложные алгоритмы имеют большие константы. Пока вы не узнаете, что n часто будет большим, не усложняйте алгоритмы. (Даже если n станет большим, сначала используйте Правило 2.)

  • Правило 4. Сложные алгоритмы содержат больше ошибок, чем простые, и их гораздо сложнее реализовать. Используйте простые алгоритмы, а также простые структуры данных.

  • Правило 5. Данные доминируют. Если вы выбрали правильные структуры данных и хорошо всё организовали, алгоритмы почти всегда будут очевидны. В программировании центральное место занимают структуры данных, а не алгоритмы.

Уточнения:

  • Правила 1 и 2 Пайка перефразируют знаменитую максиму Тони Хоара: «Преждевременная оптимизация — корень всех зол».

  • Кен Томпсон перефразировал правила 3 ​​и 4 Пайка как «В случае сомнений используйте грубую силу».

  • Правила 3 ​​и 4 являются примерами философии проектирования KISS (Keep It Simple, Stupid).

  • Правило 5 ранее было сформулировано Фредом Бруксом в книге «Мифический человеко‑месяц». Правило 5 часто сокращают до «пишите глупый код, использующий умные объекты».

Теги:
Всего голосов 6: ↑6 и ↓0+9
Комментарии0

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

На конференции SNUG Silicon Valley 2026 встретил давнего приятеля, китайского американца, который последние десять лет работал в компаниях, занимающихся чипами для аппаратного ускорения искуственного интеллекта. На позиции инженера по верификации: SystemVerilog тестбенчи, UVM итд. Его мнение про область:

  1. В области training никто не превзойдет NVidia.

  2. В области inference слишком много компаний. Скоро произойдет лопание пузыря, примерно как с доткомами в 2000–2001 годы, и большинство из них вымрет.

  3. Но парочка останется, как и лидеры типа Amazon и Google после дот‑ком пузыря. Они будут отличаться от NVidia тем что дешевле.

  4. Особенно несладко придет компаниям, которые метались между тем на что нужно ставить — CNN, LLM, трансформеры, датацентры, автомобили, edge computing.

  5. Его на работе нагибают на использование ИИ при писании кода — ведут учет потраченных токенов например. Он этого не любит и спросил меня, как к этому относятся у меня на работе.

Я ему сказал — у нас начальство относится рационально: «если вы находите в этом пользу — ок, если нет — не парьтесь». Тем более что на наших задачах ИИ плохо работает — у меня собственно была на эту статья и постер на конференции.

Товарищ сказал: «ну хорошо, если меня уволят за неиспользование ИИ, буду стучаться к вам».

Теги:
Всего голосов 21: ↑20 и ↓1+26
Комментарии15

Низкая экспертность на Хабре — или "алгоритм" размытия экспертности

Забудьте про токсичность и войны фреймворков. Давайте поговорим о чистой "математике" и о том, почему на Хабре невозможна экспертность.

Теорема об Интеграле и Яблоках

Представьте: Десятиклассник (не берем Эксперта - Профессора по математике) пишет статью. Там суровая база, математические доказательства и элегантный вывод через тройной интеграл. Он потратил десять лет, чтобы это понять, и еще два дня, чтобы это описать. Красота? Безупречность!

В это время мимо проходит Первоклассник. В его мире всё просто: есть яблоки, их можно сложить или вычесть. Он открывает статью и видит «кракозябры».

Три стадии «экспертной» защиты Первоклассника

Что делает Первоклассник, столкнувшись со сложностью, которую не может объять его мозг?

  1. Стадия «Агрессивное непонимание»:

    • Мысль: «Что это за херня? Я этого не знаю, значит, это не нужно».

    • Действие: Комментарий: «Автор, а попроще нельзя? Зачем тут эти формулы, если в реальном проде мы просто копипастим со Stack Overflow?»

  2. Стадия «Уязвленное эго»:

    • Мысль: «Он что, считает себя умнее меня?!»

    • Действие: Тихий, трусливый минус посту. Без аргументов. Просто потому, что статья заставила его почувствовать себя маленьким.

  3. Стадия «Гордое молчание»:

    • Мысль: «Я сделаю вид, что этого не существует».

    • Действие: Пройти мимо, оставив Эксперта наедине с его пустотой.

Конфликт с системой «лайков»

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

  • Сложная, глубокая, ценная статья тонет в минусах или игноре.

  • Пост «Как я переложил джейсон и не вспотел» залетает в топ.

Вывод: Система лайков — это не мерило ценности знаний, это "термометр средней температуры по больнице" (А она, как "известно", 36,6 градусов, вместе с моргом).

Эпилог: Так что мы имеем в сухом остатке? Эксперт пришел "поделиться, передать знания", а в итоге его просто никто не замечает (низкий охват) или еще лучше - получил по лицу "учебником арифметики". Карма в минус - "запрет публиковать материал".

P.S. И хотя, иногда находишь интересный глубокий материал... это скорее исключение, чем правило для Хабра.

Теги:
Всего голосов 9: ↑5 и ↓4+2
Комментарии23

Галлюцинации ИИ как дефицит Алгоритмической Ясности

1. Феномен избыточного синтеза

То, что индустрия называет «галлюцинациями», на поверку оказывается банальным «информационным заполнением пустот». Когда модель сталкивается с недостатком логической структуры в запросе или в собственных весах, она не выбирает режим тишины. Она выбирает режим генерации наиболее вероятного, но ложного шума. Она же "Должна быть полезной"!!! Как студент, когда не знает - "Главное начать отвечать")))

2. Почему система «фантазирует»?

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

3. Плотность смысла против многословия

Главный индикатор галлюцинации — размытость. Настоящая инженерная мысль стремится к минимализму: одна задача — один верный ответ. Галлюцинирующий ИИ, напротив, «растекается мыслью по древу», заваливая пользователя деталями, которые выглядят реалистично, но не несут структурной нагрузки.

4. Методы «расклинивания» моделей

Чтобы минимизировать когнитивные искажения алгоритма, необходимо внедрять жесткие фильтры:

  • Принцип минимизации: Если ответ нельзя подтвердить логической цепочкой — система должна уходить в режим ожидания.

  • Структурный контроль: Проверка каждого сгенерированного блока на соответствие заданным константам реальности.

  • Трезвый аудит: Оценка результата не по критерию «похоже на правду», а по критерию «это работает в прикладном смысле».

Заключение

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

Теги:
Всего голосов 6: ↑4 и ↓2+2
Комментарии4

Практический Тренажер по Java — самый популярный тренажер по Java на Stepik

В 2024 году я опубликовал курс «Практический Тренажер по Java» на платформе Stepik. Тогда это был просто практический курс с задачами — без воды, без длинной теории, только код и постоянная тренировка.

Прошло несколько лет.

Сегодня курс проходит более 19 000 учеников, и это самый популярный тренажёр по языку Java на платформе Stepik.

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

И я хочу заново пригласить вас в этот проект.

Почему Java?

Java — один из самых востребованных языков программирования в мире.

Он используется в:

— веб-разработке

— мобильной разработке (Android)

— корпоративных системах

— финансовых сервисах

— высоконагруженных backend-проектах

Java — это стабильность, масштабируемость и высокий спрос на рынке труда.

Что представляет собой курс сегодня?

Это полностью практический формат обучения. Только задачи и реальная практика.

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

Кому подойдёт курс?

— начинающим разработчикам

— тем, кто хочет перейти в backend

— Android-разработчикам

— QA Automation инженерам

— тем, кто готовится к собеседованиям

Я приглашаю вас присоединиться :)

➡️ Java Тренажер на Stepik

Теги:
Всего голосов 3: ↑2 и ↓1+1
Комментарии0

Фактчек не нужен: мы решили не делать то, что делают все

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

Начали делать модуль фактчека. Через Перплексити сделала исследование, принесла разработчику.

В какой последовательности вообще делается проверка фактов:

1. Сначала нужно понять, что из текста нужно проверить (claim detection), это не всегда так очевидно, как кажется.

2. Классифицируем утверждение — это имя, дата, цифра, гео, цитата?

3. Проверяем каждое утверждение

4. Маркируем факты (причем сначала нужно задать систему, например, бинарную)

5. Редактор выносит вердикт

Красиво, академично и вообще не то, что нужно.

Поговорила с редакторами, как они делают фактчек

Ответы одинаковые: вручную, глазами. Смотрят, кто ещё написал эту новость, чтобы не быть первыми с фейком. Проверяют имена и должности. Иногда звонят в источник. Пара человек прогоняют через нейронку. Автоматического фактчека нет ни у кого. Ни инструментов, ни чек-листов.

Разработчик как бэ заранее это и предполагал: «Я очень сомневаюсь, что у нас медиа вот этим всем занимается в том объёме, как у тебя в ресёрч.» Ну прав. Нельзя автоматизировать то, чего нет. Сначала нужно дать инструмент лучше текущего процесса. А текущий процесс - это глаза, еще одни глаза и интуиция.

Сформулировала, что вообще такое для нас т.н. фактчекинг. Нам реально нужны две вещи:

  1. Понимать, можно ли доверять источнику

  2. Проверять, что AI не наврал при рерайте

Всё.

Решили пока ввести такие уровни доверия к источнику:

  1. Если это ТАСС, Интерфакс, крупные СМИ, релизы из почты и тд - рерайтим автоматом.

  2. Telegram-каналы – рерайтим, только если кто-то ещё об этом написал. «Кто-то ещё написал» - это мы и так знаем из дедупликации. Просто сохраняем число и используем как сигнал.

  3. Непонятно кто, но новость релевантна изданию - показываем редактору, не рерайтим.

Сделали рерайт – проверяем консистентность, это один вызов LLM с промптом типа «Сравни факты в рерайте с оригиналом. Найди расхождения в ФИО, должностях, датах, цифрах».

Результат маркируем:

🟢 Всё совпадает с источником, можно доверять

🟡 Мелкие расхождения (округление, перефразирование)

🔴 Появились факты, которых нет в оригинале. Красный — редактор смотрит руками. Зелёный

Разработчик: «Мне кажется, это просто отдельная роль агенту даётся. Типа вот два текста, надо проверить что не так. Это норм. Обычная история.»

Ну для тебя обычная, а для меня нет. Ок, приняли.

Вопрос, который мы ещё не решили

Разраб подкинул хорошую мысль: «А что если новость сначала пришла из телеги, а потом лучше написана с нормального портала?»

Это про выбор между скоростью и надёжностью. Рерайтить инсайд из телеграма сразу — быстро, но рискованно. Ждать подтверждения, надёжно, но поздно.

Пока ответ такой - система не решает за редактора. Она показывает сигнал - «эта новость пока только у такого-то канала, подтверждений нет», и дальше уже человек выбирает, что с ней делать. Для одних тем скорость важнее, для других — нет.

Итог – наш фактчек немного не фактчек

Полноценный академический фактчекинг - возможно, когда-нибудь. В MVP уровни доверия к источникам + агент-верификатор, который сравнивает рерайт с оригиналом. И хорош пока. Едем без внешних API и claim detection. Просто минимально достаточная система, которая лучше глаз и интуиции.

Теги:
Всего голосов 5: ↑2 и ↓30
Комментарии0

Представлен открытый проект rembg — легковесный скрипт на Python, который поможет убрать фон даже с самых сложных картинок. Удаляет фон за секунды и не грузит ПК.

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Применяем кодогенерацию в Java для решения алгоритмических задач

В прошлый раз мы разобрались, как решается задача трансляции деревьев. И остановились на том, что в случае с AST от компилятора TypeScript, придётся руками обрабатывать 263 типов узлов. Тысячи строк однотипного boilerplate-кода: приведения типов, аннотации, объявления методов — всё это нужно не просто написать, но ещё и поддерживать. А если требования к архитектуре поменяются — переписывать заново.

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

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

Теги:
Всего голосов 1: ↑1 и ↓0+2
Комментарии0