<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>Алгоритмы и структуры данных</title>
    <description>Обучающие статьи о Computer Science, оптимизации кода и использование классических алгоритмов и структур данных в решении задач.</description>
    <link>https://tproger.ru/tag/algorithms</link>
    <atom:link href="https://tproger.ru/tag/algorithms/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Fri, 25 Sep 2026 12:50:06 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>Алгоритмы и структуры данных</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Водяной знак Claude: как Anthropic тайно меняет слова в сгенерированном тексте</title>
      <link>https://tproger.ru/articles/vodyanoj-znak-claude-kak-anthropic-tajno-menyaet-slova-v-sgenerir</link>
      <comments>https://tproger.ru/articles/vodyanoj-znak-claude-kak-anthropic-tajno-menyaet-slova-v-sgenerir?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/vodyanoj-znak-claude-kak-anthropic-tajno-menyaet-slova-v-sgenerir</guid>
      <description><![CDATA[<p>Anthropic внедряет в Claude статистический водяной знак текста. Узнайте, как он работает, почему это опасно для авторов и как минимизировать риски.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/vodyanoj-znak-claude-kak-anthropic-tajno-menyaet-slova-v-sgenerir">Водяной знак Claude: как Anthropic тайно меняет слова в сгенерированном тексте</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Криптография]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 17 Aug 2026 09:29:32 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы используете Claude для черновиков, правок или переводов, знайте: с новых моделей Anthropic начинает встраивать в текст скрытый <b>статистический водяной знак</b>. Это не невидимые символы и не метаданные файла — это изменение самих слов, которые модель выбирает для вас. Критики, включая автора <a href="https://daringfireball.net/2026/08/anthropics_watermark_text_adulteration_in_claude_is_a_perversion_of_writing">Daring Fireball</a> Джона Грубера, называют это порчей письма. Разбираем, как работает технология, почему она вызывает споры и что с этим делать авторам.</p><h2>Что Anthropic сделала с текстом Claude</h2><p>2 августа 2026 года в ЕС вступили в силу обязательства по прозрачности ИИ-контента из AI Act. В июле 2026-го Anthropic, как и около 190 других организаций, подписала <a href="https://digital-strategy.ec.europa.eu/en/policies/ai-code-practice">Кодекс практики по прозрачности ИИ-контента</a>. Теперь компания заявляет, что все новые модели Claude будут «маркировать» сгенерированный текст — и делать это <b>глобально</b>, а не только для пользователей из Евросоюза.</p><p>Сначала Anthropic лишь кратко сообщила о маркировке в справочной статье «How Claude marks AI-generated content». 14 августа 2026 года появилось техническое объяснение <a href="https://www.anthropic.com/news/claude-text-watermark">«How Claude’s text watermark works»</a>. В нём компания признаёт: водяной знак не добавляет в текст никаких символов, он меняет выбор слов на основе секретного ключа.</p><p>Новые модели Claude будут встраивать статистический водяной знак во все тексты длиннее ~200 токенов (~150 слов).</p><p>Маркировка не использует невидимые символы: она смещает выбор между близкими по смыслу словами по секретному ключу.</p><p>Проверить водяной знак сможет только Anthropic; посторонние сервисы без ключа не смогут дать достоверный вердикт.</p><p>Переводы и переписывания целиком проходят через Claude, поэтому маркируются сильнее всего; обычная правка — слабее.</p><p>Чтобы снизить риск, используйте Claude как черновик, а затем переписывайте текст своими словами.</p><h2>Как работает водяной знак в тексте</h2><p>Большие языковые модели генерируют текст по одному токену. На каждом шаге у них есть список подходящих кандидатов, и иногда несколько вариантов равноправны по смыслу. Например, после фразы «погода сегодня была холодной и…» модель может выбрать «пасмурной» или «серой». Обычно выбор решает случайность. При водяном знаке случайность заменяется на псевдослучайную последовательность, выведенную из <b>секретного ключа</b> и нескольких предыдущих слов.</p><p>Anthropic использует вариант подхода <a href="https://www.nature.com/articles/s41586-024-08025-4">SynthID-Text</a>, опубликованного Google DeepMind в Nature в 2024 году. На каждом «равноправном» шаге модель получает лёгкий «подталкивающий» сигнал в сторону одних кандидатов и от других. Отдельный выбор почти незаметен, но на длине в сотни или тысячи токенов накапливается статистическая закономерность, которую может увидеть только владелец ключа.</p><p><b>Главный нюанс:</b><br />Секретный ключ есть только у Anthropic. Поэтому никакой сторонний «детектор ИИ-текстов» не сможет проверить водяной знак Claude — он либо будет искать стилистические признаки, либо угадывать.</p><h2>Почему это спорно: слова имеют значение</h2><p>Аргумент критиков прост: никакие два синонима не совпадают по оттенку, ритму и контексту. «Он ухватился за шанс» и «Он воспользовался возможностью» передают одно действие, но звучат по-разному. Если модель выбирает слово не только ради точности, но и ради скрытой метки, качество текста теоретически падает — пусть и на доли процента.</p><p>В <a href="https://www.anthropic.com/news/claude-text-watermark">документе Anthropic</a> приводится пример: выбор между «overcast» и «grey» «в большинстве случаев не сильно влияет на читателя». Джон Грубер в ответ замечает: именно это и делает идею порочной. Компания решает за автора, какое слово «достаточно хорошо», вместо того чтобы каждый раз искать лучшее.</p><blockquote>Можно было бы применить ту же логику к калькуляторам, если бы их результаты оставляли следы. К счастью, сумма, рождённая мозгом, не отличается от суммы, полученной на калькуляторе. Сделать помощь подозрительной только тогда, когда инструмент становится достаточно умён, чтобы составить целое предложение, — не принципиальная граница. Это моральная надбавка за саму сложность.</blockquote><h2>Что это меняет для пользователей</h2><p>Anthropic честно перечисляет ограничения, но именно они создают проблемы. Водяной знак не доказывает, что текст написал Claude целиком: он лишь повышает вероятность, что Claude <b>участвовал</b> в его создании. Перевод, выполненный Claude, будет маркирован полностью, потому что каждое слово выбрала модель. А вот лёгкая правка человеческого текста может оставить лишь слабый след.</p><p>Код в большинстве случаев почти не страдает: там часто есть единственно правильное продолжение. Но комментарии и документация в коде маркируются так же, как обычная проза. Кроме того,Anthropic отмечает, что водяной знак переживает копирование и вставку: он живёт в самой последовательности слов, а не в форматировании.</p><ul><li><b>Переводы:</b> полная маркировка, потому что каждый токен — выбор модели.</li><li><b>Лёгкая правка:</b> может оставить след, но не всегда достаточный для детекции.</li><li><b>Глубокий переписывание:</b> разрушает статистическую картину, но тогда результат уже сложно назвать ИИ-текстом.</li><li><b>Код:</b> функциональные части почти не меняются, комментарии — подвержены.</li></ul><h2>Почему это касается не только ЕС</h2><p>Формально инициатором маркировки стал ЕС: AI Act обязывает провайдеров ИИ маркировать синтетический контент. Но Anthropic объявила о глобальном внедрении, сославшись на отсутствие «устойчивого способа» ограничить функцию по региону. Получается, что европейское регулирование распространяется на всех пользователей Claude, включая тех, кто живёт в России, США и Азии.</p><p>При этом неясно, насколько само регулирование требует именно такого подхода. Кодекс практики применяется к текстам длиннее 200 токенов, требует запрета на удаление метки в условиях использования и устойчивости к копированию, OCR и переводам. Но он не обязывает внедрять систему глобально и не заставляет провайдера изменять слова в приватных чатах.</p><h2>Google уже делает то же самое с Gemini</h2><p>Google внедрила текстовый водяной знак <a href="https://deepmind.google/discover/blog/synthid-identifying-ai-generated-content/">SynthID</a> в Gemini раньше Anthropic. В статье Nature команда DeepMind пишет, что проанализировала около 20 млн ответов с водяным знаком и без него. Разница в оценках «палец вверх» составила 0,01%, а «палец вниз» — 0,02%; оба отличия оказались статистически незначимыми в пределах 95%-ного доверительного интервала.</p><p>Критики указывают: незначимая разница в оценках не означает, что качество не пострадало. Если модель заменяет «bananas» на «pineapple» в примере DeepMind, пользователь вряд ли поставит «дизлайк» из-за фрукта. Но именно такие микровыборы и формируют голос автора. А когда причина выбора скрыта, доверие к тексту падает.</p><h2>Что делать авторам и разработчикам</h2><p>Полностью избежать водяного знака при использовании Claude нельзя — он встроен в генерацию. Но можно снизить риск, что ваш текст будет ошибочно отнесён к категории «сгенерировано ИИ» или потеряет индивидуальность.</p><h2>FAQ</h2><h2>Выводы</h2><p>Водяной знак Claude — это не злоумышленная функция, а попытка угодить регулятору. Но её побочный эффект серьёзен: модель начинает выбирать слова ради проверяемости, а не ради смысла. Для авторов, юристов, журналистов и разработчиков это означает, что любой прогон текста через Claude может оставить след, который увидит только Anthropic.</p><p>Пока публичного детектора нет, риск ложных обвинений невелик. Но как только API проверки появится, вопрос «а не написано ли это ИИ?» станет ещё более неоднозначным. Лучшая защита — не отказываться от инструментов, а помнить: черновик от ИИ — это черновик. Финальный текст должен быть вашим.</p><blockquote>Моя письменная работа — это моя работа, а текущая стратегия Anthropic агрессивно враждебна писателям.</blockquote><h2>Источники</h2><p>— <a href="https://daringfireball.net/2026/08/anthropics_watermark_text_adulteration_in_claude_is_a_perversion_of_writing">John Gruber, «Anthropic’s ‘Watermark’ Text Adulteration in Claude Is a Perversion of Writing»</a><br />— <a href="https://www.anthropic.com/news/claude-text-watermark">Anthropic, «How Claude’s text watermark works»</a><br />— <a href="https://declaude.org/watermarking/">James Padolsey, «How AI text watermarking works»</a><br />— <a href="https://www.nature.com/articles/s41586-024-08025-4">Google DeepMind, «Scalable watermarking for identifying LLM outputs» (Nature, 2024)</a><br />— <a href="https://digital-strategy.ec.europa.eu/en/policies/ai-code-practice">EU Code of Practice on Transparency of AI-Generated Content</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Лучшие модели для генерации кода в июле 2026: как выбрать под задачу</title>
      <link>https://tproger.ru/articles/luchwie-modeli-dlya-generacii-koda-v-iyule-2026-kak-vybrat-pod-za</link>
      <comments>https://tproger.ru/articles/luchwie-modeli-dlya-generacii-koda-v-iyule-2026-kak-vybrat-pod-za?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/luchwie-modeli-dlya-generacii-koda-v-iyule-2026-kak-vybrat-pod-za</guid>
      <description><![CDATA[<p>SWE-bench Verified уперся в 96%, поэтому выбор модели теперь решают цена, доступность и SWE-bench Pro. Разбираем лидеров и аутсайдеров июля 2026.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/luchwie-modeli-dlya-generacii-koda-v-iyule-2026-kak-vybrat-pod-za">Лучшие модели для генерации кода в июле 2026: как выбрать под задачу</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 03 Aug 2026 04:10:44 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы сейчас выбираете языковую модель для написания кода, цифры на бенчмарках больше не дают прямого ответа. Лидеры показывают 95-96% на SWE-bench Verified, разница между ними укладывается в статистическую погрешность, а реальная стоимость и доступность API различаются в десятки раз.</p><p>В августе 2026 года рынок моделей для генерации кода уперся в новый потолок: Anthropic выпустила Claude Opus 5, OpenAI показала GPT-5.6 Sol в ограниченном доступе, а китайские разработчики предложили открытые веса с результатами уровня флагманов прошлого квартала. Разбираем, что из этого реально купить и как не переплатить.</p><h2>Что такое SWE-bench и почему он стал главным аргументом</h2><p>SWE-bench Verified — это набор из 500 реальных задач с GitHub: модели видят описание бага и должны сгенерировать патч, который проходит существующие тесты проекта. Не задачи из LeetCode, а настоящие репозитории с чужой архитектурой и зависимостями. Для оценки кодогенерации это ближе к продакшену, чем большинство альтернатив.</p><p>С апреля 2026 года Verified «насытился»: топ выстроился в узкий коридор 95-96%. Поэтому внимание переключилось на SWE-bench Pro — 1865 более сложных задач из 41 репозитория на нескольких языках. Именно здесь видна разница между «хорошо пишет функции» и «разбирается в большом коде».</p><p>Claude Opus 5 — лучший баланс качества, цены и доступности: 96,0% на SWE-bench Verified и $5/$25 за миллион токенов.</p><p>Claude Mythos 5 лидирует на SWE-bench Pro (80,3%), но доступен лишь ~100 партнёрам программы Glasswing.</p><p>GPT-5.6 Sol теоретически первый по Verified (96,2%), но цифра не подтверждена OpenAI, а доступ ограничен ~20 партнёрами.</p><p>GLM-5.2 — сильнейший открытый вариант: 62,1% на SWE-bench Pro под лицензией MIT, но сжигает в 2-3 раза больше выходных токенов.</p><p>Gemini 3.1 Pro и DeepSeek V4-Pro предлагают ~80% на Verified за $2-3 за миллион токенов — лучшее соотношение цена/качество для массовых задач.</p><h2>Как устроена верхушка рейтинга</h2><h3>Claude Opus 5 — практичный выбор</h3><p>Anthropic выпустила <a href="https://www.anthropic.com/">Claude Opus 5</a> 24 июля 2026 года по цене старого Opus 4.8: $5 за входящий и $25 за исходящий миллион токенов. На SWE-bench Verified модель набрала 96,0%, а на более сложном SWE-bench Pro — 79,2%. Этого хватает для большинства инженерных задач, а цена остаётся вдвое ниже, чем у Mythos-класса.</p><p>Главное ограничение Opus 5 — уступка собственным старшим собратьям на Pro. Если ваша работа связана с большими межрепозиторными изменениями, Mythos 5 и Fable 5 дают 80,0-80,3%, но вы платите $10/$50 за миллион токенов и, в случае Mythos, ещё и проходите отбор в программу Glasswing.</p><h3>Mythos 5 и Fable 5 — потолок, до которого не дотянуться</h3><p>В июне Anthropic представила <a href="https://www.anthropic.com/news/claude-fable-mythos-5">Claude Fable 5 и Claude Mythos 5</a> — первые модели, преодолевшие 90% на SWE-bench Verified. Обе показывают 95,0% Verified, а Mythos 5 держит лучший результат на Pro — 80,3%. Fable 5 доступен через обычный API любому клиенту, готовому платить Mythos-тариф.</p><p>Mythos 5 закрыт примерно для 100 партнёров в рамках программы Glasswing, в основном для исследований в области кибербезопасности и биобезопасности. Это важный нюанс для российских команд: даже если у вас есть бюджет, доступ к модели зависит от одобрения Anthropic, а не только от платёжной карты.</p><h3>GPT-5.6 Sol — красивое число, которое никто не проверил</h3><p><a href="https://openai.com/">OpenAI</a> выпустила GPT-5.6 Sol в ограниченном превью для примерно 20 партнёров, прошедших правительственную проверку. Компания не опубликовала официальных результатов SWE-bench, но сторонние трекеры, включая vals.ai, сообщают 96,2% на Verified.</p><p>Пока это не результат, на который можно ориентироваться при выборе инструмента. Цена, если доступ появится, составляет $5/$30 за миллион токенов — чуть дороже Opus 5. Для российских пользователей добавляется и стандартная проблема доступа к API OpenAI, которая уже несколько лет сильнее ограничена, чем у Anthropic или Google.</p><h3>GLM-5.2 — открытые веса с реальными цифрами</h3><p><a href="https://www.zhipu.ai/">Zhipu AI</a> выпустила GLM-5.2 под лицензией MIT. Модель показывает 62,1% на SWE-bench Pro — выше, чем GPT-5.5 (58,6%), и выше предшественника GLM-5.1 (58,4%). Контекстное окно составляет 1 млн токенов, а обучение проходило на чипах Huawei Ascend, а не NVIDIA.</p><p>Цена API — $1,40/$4,40 за миллион токенов, но на практике GLM-5.2 расходует около 43 000 выходных токенов на одну кодинговую задачу против 16 000 у GPT-5.5. Поэтому итоговая стоимость за выполненную задачу ближе к флагманам, чем кажется по прайс-листу. Главное преимущество — возможность скачать веса и развернуть модель у себя. Для команд с требованиями к локальному хранению кода это может перевесить экономию на API.</p><h3>Gemini 3.1 Pro и DeepSeek V4-Pro — флагманы за разумные деньги</h3><p><a href="https://deepseek.ai/">DeepSeek V4-Pro</a> и <a href="https://deepmind.google/technologies/gemini/">Gemini 3.1 Pro</a> показывают по 80,6% на SWE-bench Verified — ровно тот уровень, который в апреле считался потолком. DeepSeek стоит $1,74/$3,48 и работает с полностью открытыми весами. Gemini 3.1 Pro стоит $2/$12, имеет окно в 1 млн токенов и 91,7% на LiveCodeBench.</p><p>Для массовой разработки — ревью кода, генерация тестов, исправление типовых багов — этих моделей достаточно с запасом. Они не берут первое место, но разница в цене делает их удобной рабочей лошадкой, особенно в интеграциях, где не нужен последний процент качества.</p><h2>Как читать таблицу моделей</h2><p>Результаты можно свести к трём осям: качество на Verified, качество на Pro и реальная доступность. Если смотреть только на Verified, четыре модели стоят плечом к плечу в диапазоне 95,0-96,2%. Разница появляется, когда добавляешь цену, условия доступа и более жёсткий бенчмарк.</p><p><b>Как ориентироваться в ценах:</b><br />Цены указаны за 1 млн входящих / 1 млн исходящих токенов. На практике важнее стоимость за <b>завершённую задачу</b>: одна модель может быть дешевле за токен, но генерировать в 2-3 раза больше текста.</p><p>Вот как распределяются роли:</p><ul><li>Claude Opus 5 — универсальный выбор, если нужен API без листов ожидания и цена ниже Mythos.</li><li>Claude Mythos 5 — для команд с доступом к Glasswing, которые решают самые сложные многофайловые задачи.</li><li>GLM-5.2 — для self-hosted сценариев и требований к открытым весам.</li><li>DeepSeek V4-Pro и Gemini 3.1 Pro — для высоконагруженных сценариев, где важна цена за токен.</li></ul><h2>Методология: почему Verified больше не разделяет лидеров</h2><p>Авторы обзора используют три сигнала. SWE-bench Verified даёт понять, справляется ли модель с реальными багами. SWE-bench Pro проверяет, как модель работает с более крупными и разнообразными репозиториями. Третий сигнал — это статус доступа и независимость проверки: официальная цифра, сторонний трекер или собственная оценка вендора.</p><p>Важно понимать, что ни один бенчмарк не измеряет продуктивность разработчика напрямую. Модель может отлично генерировать патчи и при этом плохо объяснять архитектуру или наоборот. Поэтому цифры — это фильтр первого порядка: они отсекают явно слабые варианты, но конечный выбор зависит от вашего стека, размера репозиториев и процесса ревью.</p><h2>Историческая динамика: бенчмарки устаревают быстрее моделей</h2><p>В марте 2025 года лидером был Claude 3.5 Sonnet с около 49%. В январе 2026 четыре модели одновременно преодолели 78%. В апреле Verified «сел» на плато 76-81%, и внимание перешло на Pro. В июне Mythos-класс впервые превысил 90%, а к концу июля Opus 5 почти догнал его по цене вдвое ниже.</p><p>Этот цикл повторяется: бенчмарк насыщается, появляется более сложная версия, цена становится главным разделителем. Для команд это означает, что не нужно гнаться за каждым новым релизом. Достаточно раз в квартал пересматривать соотношение цена/качество и проверять, не появился ли модель с доступным API, который закрывает 80% ваших задач за меньшие деньги.</p><h2>Что выбрать: чек-лист для команды</h2><p>Чтобы не утонуть в таблицах, можно пройти по четырём вопросам:</p><ol><li>Есть ли у вас доступ к API Anthropic, OpenAI или Google? Если нет, открытые веса DeepSeek или GLM-5.2 остаются единственной рабочей опцией.</li><li>Решаете ли вы локальные баги в одном репозитории или межрепозиторные изменения? Для второго важнее SWE-bench Pro.</li><li>Какой бюджет на 1 млн исходящих токенов? При высоких объёмах разница между $25 и $3 за миллион ощутима уже на первой неделе.</li><li>Нужно ли хранить код внутри периметра? В этом случае self-hosted GLM-5.2 или DeepSeek выигрывают у облачных API независимо от бенчмарков.</li></ol><blockquote>Когда Verified перестаёт разделять модели, выбор сдвигается с 'кто умнее' на 'кого я могу купить и сколько это будет стоить за реальную задачу'.</blockquote><h2>FAQ</h2><h2>Выводы</h2><p>В июле 2026 года рынок моделей для генерации кода разделился на два лагеря. Первый — закрытые флагманы, которые достигли потолка Verified и теперь конкурируют по цене и доступности. Второй — открытые и полуоткрытые модели, которые отстают по верхним цифрам, но выигрывают у крупных вендоров в контроле над данными и стоимости инфраструктуры.</p><p>Для российских команд ключевой вопрос не в том, какая модель «умнее», а в том, какая из них реально доступна, не требует сложных схем оплаты и укладывается в бюджет. В этом контексте Claude Opus 5, DeepSeek V4-Pro и GLM-5.2 выглядят наиболее практичными вариантами — каждый под свои ограничения.</p><p>Источник: обзор <a href="https://awesomeagents.ai/capabilities/code-generation/">Best AI Models for Code Generation — July 2026</a> на Awesome Agents. Данные по бенчмаркам и ценам приведены по состоянию на 29 июля 2026 года.</p>]]></content:encoded>
    </item>
    <item>
      <title>Alibaba выпустила Qwen 3.8-Max — 2,4 трлн параметров и первые открытые веса серии Max</title>
      <link>https://tproger.ru/news/alibaba-vypustila-qwen-3-8-max-2-4-trln-parametrov-i-pervye-ot</link>
      <comments>https://tproger.ru/news/alibaba-vypustila-qwen-3-8-max-2-4-trln-parametrov-i-pervye-ot?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/alibaba-vypustila-qwen-3-8-max-2-4-trln-parametrov-i-pervye-ot</guid>
      <description><![CDATA[<p>Alibaba выпустила Qwen 3.8-Max: 2,4 трлн параметров, 95 млрд активных, первые открытые веса в линейке Max. Узнайте задачи модели и как подключить API.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/alibaba-vypustila-qwen-3-8-max-2-4-trln-parametrov-i-pervye-ot">Alibaba выпустила Qwen 3.8-Max — 2,4 трлн параметров и первые открытые веса серии Max</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Облачные технологии]]></category>
      <category><![CDATA[Сделано с помощью ИИ]]></category>
      <category><![CDATA[Инновации]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 03 Aug 2026 03:55:28 GMT</pubDate>
      <content:encoded><![CDATA[<p>Команда Qwen официально <a href="https://qwen.ai/blog?id=qwen3.8">выпустила</a> флагманскую модель <b>Qwen 3.8-Max</b> — самую мощную в линейке Qwen. Главное отличие от предыдущих Max-моделей: Alibaba впервые обещает выложить веса в открытый доступ. Они появятся на Hugging Face и ModelScope на следующей неделе.</p><p>Qwen 3.8-Max — флагман Alibaba с 2,4 трлн параметров (95 млрд активных).</p><p>Это первая модель линейки Max, чьи веса выложат в open source.</p><p>Модель ориентирована на долгосрочные задачи: автономный кодинг, исследования, чип-дизайн, работу с документами и видео.</p><p>Доступна через API QwenCloud с параметром reasoning_effort и интегрируется с Claude Code, Codex и Qoder.</p><h2>Что анонсировали</h2><p>Qwen 3.8-Max построена на архитектуре Qwen 3.5 и насчитывает <b>2,4 трлн параметров</b>, из которых активируются примерно <b>95 млрд</b>. Это делает её одной из крупнейших публично анонсированных моделей и первой мультимодальной системой Qwen, преодолевшей отметку в 1 трлн параметров.</p><p>По заявлению разработчиков, улучшения коснулись четырёх направлений: программирование, реальная рабочая деятельность, исследовательские задачи и долгосрочные сценарии с множеством ограничений. Модель умеет не только отвечать на сложные вопросы, но и доводить задачи до конца — от постановки до рабочего результата.</p><h2>Ключевые возможности</h2><ul><li><b>Автономный кодинг.</b> В демонстрации модель 16 дней без участия человека развивала проект oh-my-cli: 265 коммитов, 127 pull request'ов и 151 issue. Главная фишка — самообучающийся цикл: требования превращаются в задачи, которые агенты берут в работу, тестируют и сливают в main.</li><li><b>Научные исследования.</b> Qwen 3.8-Max воспроизвела эксперимент из статьи «Unified Data Selection for LLM Reasoning» с нуля — около 7 600 строк кода, 33 цикла обучения на GPU — а затем улучшила результат на 2,7 балла на бенчмарке AIME24.</li><li><b>Соревнования.</b> За 24 часа модель построила решение для конкурса WWW2025 Multimodal Dialogue Intent Recognition на платформе Tianchi и обошла 458 из 526 человеческих команд (87%).</li><li><b>Рабочие сценарии.</b> В тестах Qwen 3.8-Max проектировала интерфейсы, составляла меню ресторана с расчётом себестоимости, проверяла юридические документы и строила сейсмические модели зданий.</li><li><b>Чип-дизайн.</b> Модель самостоятельно прошла весь фронтенд-флоу цифровой схемы: от RTL до физического layout в OpenROAD, сократив площадь кристалла на 81% и добившись тактовой частоты 500 МГц.</li></ul><h2>Бенчмарки</h2><p>В опубликованной таблице Qwen 3.8-Max сравнивается с Claude Opus 4.8, Claude Fable 5, GPT 5.6 Sol и предшественником Qwen 3.7-Max. По внутренним тестам Alibaba новинка обгоняет Qwen 3.7-Max на большинстве задач и приближается к лучшим закрытым моделям в кодинге и мультимодальных бенчмарках. Отдельно отметим <b>PaperBench</b> — 93,0 балла против 90,5 у GPT 5.6 Sol и 64,8 у Qwen 3.7-Max.</p><h2>Как попробовать</h2><p>Модель уже доступна через <b>QwenCloud</b>. API совместим с OpenAI и Anthropic, поэтому подключение занимает буквально минуту. Поддерживаются три уровня глубины рассуждений: xhigh, medium и low. По умолчанию включён preserve_thinking.</p><p>Минимальный пример на Python:</p><p>Кроме прямого API, модель завели в Claude Code, Codex, Qoder CLI, Qwen Code и OpenClaw. Контекстное окно — до 1 млн токенов, максимальная длина ответа — 65 536 токенов.</p><h2>FAQ</h2><h2>Выводы</h2><p>Qwen 3.8-Max — это попытка Alibaba вывести флагманскую линейку в open source и при этом конкурировать с лучшими закрытыми моделями. Если открытые веса действительно выйдут под пермиссивной лицензией, у разработчиков появится серьёзная альтернатива для локального запуска и дообучения. Пока же модель можно протестировать через QwenCloud.</p><p>Источник: <a href="https://qwen.ai/blog?id=qwen3.8">Qwen 3.8-Max: A New Bar for Coding and Cowork</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>itertools в Python: ленивые итераторы без лишних циклов</title>
      <link>https://tproger.ru/articles/itertools-v-python-lenivye-iteratory-bez-liwnih-ciklov</link>
      <comments>https://tproger.ru/articles/itertools-v-python-lenivye-iteratory-bez-liwnih-ciklov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/itertools-v-python-lenivye-iteratory-bez-liwnih-ciklov</guid>
      <description><![CDATA[<p>Разбираем модуль itertools из стандартной библиотеки Python: как ленивые итераторы экономят память, какие функции использовать чаще всего и где поджидают подводные камни.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/itertools-v-python-lenivye-iteratory-bez-liwnih-ciklov">itertools в Python: ленивые итераторы без лишних циклов</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Функциональное программирование]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Для продолжающих]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 12 Jul 2026 17:20:36 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если ваш код регулярно превращается в пять вложенных for и огромный список, который держится в памяти только ради того, чтобы тут же быть выброшенным в мусор, — скорее всего, вам не хватает itertools. Этот модуль стандартной библиотеки Python собрал ленивые итераторы, которые превращают обработку данных в конвейер: элементы поступают, преобразуются и уходят дальше без лишних промежуточных коллекций.</p><p>itertools — это не просто набор функций, а способ мыслить о данных как о потоке. Вместо того чтобы сначала строить список, а потом его перебирать, вы описываете, что должно произойти с каждым элементом, и получаете результат по мере необходимости. В статье разберём три семейства инструментов, покажем рабочие примеры и укажем на типичные ловушки.</p><p>itertools — модуль стандартной библиотеки Python, который предоставляет ленивые итераторы для композиции цепочек обработки данных.</p><p>Ленивость означает, что элементы создаются по запросу, поэтому можно работать с большими файлами и бесконечными потоками, не загружая всё в память.</p><p>Функции разделены на три группы: бесконечные итераторы (count, cycle, repeat), конечные итераторы (chain, islice, groupby и др.) и комбинаторные (product, permutations, combinations).</p><p>Многие рутинные задачи — flatten, батчинг, скользящее окно, группировка — решаются в одну строку, если знать правильную комбинацию функций.</p><p>Подводные камни: groupby требует предварительной сортировки по тому же ключу; итераторы одноразовые; tee() может неэкономно расходовать память.</p><h2>Зачем вообще ленивые итераторы?</h2><p>Обычный подход в Python — сгенерировать список и пройтись по нему циклом. Это просто и читаемо, пока данных немного. Когда файл весит несколько гигабайт, а строки приходят из сети, список становится дорогим: он требует памяти и времени, хотя в каждый момент вам нужен лишь один текущий элемент.</p><p>Ленивый итератор не строит коллекцию целиком. Он помнит текущее состояние и умеет «добыть» следующий элемент. Поэтому itertools работает с любыми итерируемыми источниками — файлами, генераторами, сетевыми потоками — и не требует, чтобы весь объём данных поместился в оперативную память.</p><p><b>Память vs скорость:</b><br />Ленивость экономит память, но не всегда ускоряет код. Если данные всё равно нужны целиком — например, для сортировки — список может оказаться быстрее. Используйте итераторы там, где важна потоковая обработка.</p><h2>Три семейства инструментов</h2><p>Документация Python делит функции модуля на три группы. Такое разделение помогает быстро выбрать инструмент: нужна бесконечная последовательность, преобразование конечной или перебор комбинаций.</p><h3>Бесконечные итераторы: count, cycle, repeat</h3><p>count — это range без конца. Ему можно задать начальное значение и шаг, и он будет выдавать числа до тех пор, пока его не остановят снаружи. cycle бесконечно повторяет переданную последовательность, а repeat — бесконечно или заданное число раз возвращает один объект.</p><p>Классический трюк — сочетание map и count: map(f, count()) работает как математическое табулирование tabulate(f), знакомое из SML и Haskell.</p><h3>Конечные итераторы: chain, islice, groupby и другие</h3><p>Это самая многолюдная группа. Здесь есть функции для склейки последовательностей, фильтрации, нарезки, группировки и пакетной обработки. Их объединяет одно: на вход подаётся конечный или контролируемый итератор, на выходе — тоже итератор.</p><p>batched появился в Python 3.12 и сразу стал незаменимым инструментом: партии запросов к API, пакеты строк для вставки в базу, страницы данных. Последняя партия может быть короче — это поведение по умолчанию.</p><p>groupby часто путают с SQL-аналогом, но это не тот же инструмент. Python-версия группирует только подряд идущие одинаковые ключи, поэтому перед ней обычно нужна сортировка по тому же ключу. Если забыть про это, результат покажется случайным.</p><h3>Комбинаторные итераторы: product, permutations, combinations</h3><p>Эти функции генерируют декартово произведение, перестановки и сочетания. Они незаменимы в тестировании, алгоритмах на графах, задачах оптимизации и даже в простых играх. Все они ленивые, поэтому можно перебирать комбинации по одной, не строя гигантский список.</p><p>product с аргументом repeat удобен для перебора многомерных конфигураций: product([0, 1], repeat=3) даст все двоичные triples, как в таблице истинности.</p><h2>Подводные камни, за которые хватаются новички</h2><p>Несмотря на простоту отдельных функций, у модуля есть несколько особенностей, которые легко превратить в баг.</p><ul><li>groupby работает только с подряд идущими одинаковыми ключами. Перед вызовом сортируйте данные по тому же ключу, иначе группы разобьются.</li><li>Итераторы одноразовые. После list(iterator) исходный итератор опустошён, и второй проход по нему даст пустой результат.</li><li>tee копирует данные во внутренний буфер, пока все производные итераторы не прочитают их. Если один итератор сильно отстаёт, память может расти не хуже списка.</li><li>zip_longest с бесконечным итератором никогда не остановится. Ограничивайте такие комбинации islice или takewhile.</li><li>product полностью потребляет входные итераторы, чтобы построить пулы значений. С бесконечными последовательностями его использовать нельзя.</li></ul><h2>Рецепты: от простого к составному</h2><p>Документация Python включает раздел рецептов — готовые комбинации функций, которые решают частые задачи. Некоторые из них настолько удобны, что со временем превращаются в полноценные функции модуля: так появились accumulate, compress и pairwise.</p><p>Для sliding_window сейчас часто используют рецепт из документации или аналог из more-itertools, где функция уже реализована и хорошо протестирована.</p><h2>Выводы</h2><p>itertools — это не библиотека для красивых однострочников, а инструмент для правильного мышления о данных. Он помогает отказаться от лишних промежуточных списков, писать компактные конвейеры и работать с потоками, которые не помещаются в память. Главное — не гнаться за краткостью любой ценой: иногда явный цикл понятнее, чем цепочка из пяти функций.</p><blockquote>Together, they form an iterator algebra making it possible to construct specialized tools succinctly and efficiently in pure Python.</blockquote><p>Источник: <a href="https://docs.python.org/3/library/itertools.html">itertools — Functions creating iterators for efficient looping</a>. Если в вашем коде до сих пор царят вложенные циклы и огромные списки — попробуйте заменить их на поток. Скорее всего, получится короче, быстрее и понятнее.</p>]]></content:encoded>
    </item>
    <item>
      <title>Протоколы связи микроконтроллеров: проектирование и парсинг</title>
      <link>https://tproger.ru/articles/protokoly-svyazi-mikrokontrollerov-proektirovanie-i-parsing</link>
      <comments>https://tproger.ru/articles/protokoly-svyazi-mikrokontrollerov-proektirovanie-i-parsing?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/protokoly-svyazi-mikrokontrollerov-proektirovanie-i-parsing</guid>
      <description><![CDATA[<p>Разбираем структуру кадра, контрольные суммы и конечные автоматы для обмена данными между хостом и микроконтроллером. Примеры на C — читайте и внедряйте.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/protokoly-svyazi-mikrokontrollerov-proektirovanie-i-parsing">Протоколы связи микроконтроллеров: проектирование и парсинг</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Низкоуровневое программирование]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Сетевые протоколы]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 09 Jun 2026 07:25:27 GMT</pubDate>
      <content:encoded><![CDATA[<p>Протокол связи микроконтроллера — это набор правил формирования кадров поверх физического интерфейса (UART, RS-485). Если вы когда-либо писали прошивку, которой нужно «разговаривать» с компьютером, то знаете: надёжность связи важнее скорости. Один потерянный байт или сбой в синхронизации — и устройство зависает или выполняет чужую команду. В этой статье разберём, как проектировать собственные протоколы связи микроконтроллеров: от структуры кадра до парсера на конечном автомате.</p><h2>Что такое протокол передачи данных</h2><p>Под <b>протоколом передачи данных</b> здесь понимается формат пакетов (кадров), которые строятся поверх физического уровня. Физический уровень — это уже выбранный интерфейс: RS-232, RS-485, инфракрасный канал, радиомодуль или оптоволокно. От него мы получаем две базовые операции: отправить один байт и принять один байт. Всё остальное — наша задача.</p><p>Данные передаются пакетами — <b>кадрами</b>. Хороший кадр позволяет приёмнику понять: где начало сообщения, кому оно адресовано, сколько в нём полезных данных и не повредились ли они по дороге.</p><p>Кадр состоит из заголовка, адресов, типа данных, длины, полезной нагрузки, контрольной суммы и концевика.</p><p>Для защиты от случайных совпадений заголовок делают многобайтовым, а контрольную сумму считают по всей значащей части кадра.</p><p>Парсинг удобно реализовывать конечным автоматом: каждый принятый байт переводит машину в новое состояние.</p><p>На хосте данные почти всегда буферизуются; на простых МК часто выгоднее передавать напрямую, чтобы сэкономить ОЗУ.</p><h2>Структура кадра: из чего собирать пакет</h2><p>Надёжный протокол обычно включает семь логических полей. Не все обязательны — выбор зависит от задачи.</p><h3>Заголовок и концевик</h3><p><b>Заголовок</b> (frame header) и <b>концевик</b> (frame tail) отмечают границы кадра. Главное требование — минимизировать вероятность случайного совпадения этих байтов в потоке данных. Есть два подхода:</p><ul><li><b>Подбор характерных байтов.</b> Если данные предсказуемы (например, только ASCII-текст), можно выбрать заголовок из диапазона непечатаемых символов.</li><li><b>Увеличение длины.</b> Для случайных данных лучше сделать заголовок многобайтовым — например, 0x55 0xAA 0x7E. Вероятность случайного совпадения трёх конкретных байтов подряд падает экспоненциально. Даже если совпадение произойдёт, его отловит контрольная сумма.</li></ul><h3>Адресация</h3><p><b>Адрес назначения</b> нужен в системах типа «один к многим» — например, когда один хост управляет несколькими датчиками по общей шине RS-485. В сложных сетях добавляют ещё и <b>адрес источника</b>, чтобы получатель знал, от кого пришёл пакет.</p><h3>Тип, длина и данные</h3><p><b>Тип данных</b> (data type) говорит, что дальше идёт команда или полезная нагрузка. <b>Длина</b> (data length) указывает число значащих байтов в блоке данных. Вместе они образуют «тело» кадра — ту часть, которую мы действительно хотим доставить.</p><h3>Контрольная сумма</h3><p><b>Контрольная сумма</b> проверяет целостность кадра. Простейший вариант — арифметическая сумма всех байтов тела. Для более серьёзной защиты применяют CRC (циклический избыточный код): он ловит пакетные ошибки и перестановки битов, которые простая сумма пропустит. Выбор алгоритма — компромисс между скоростью вычисления на МК и требуемой надёжностью.</p><h2>Передача: хост и микроконтроллер</h2><p>На физическом уровне отправка сводится к посылке байтов один за другим. Но способ организации этой посылки сильно влияет на производительность.</p><h3>Передача с микроконтроллера</h3><p>На простых контроллерах вроде семейства 8051 часто используют <b>прямую передачу</b>: процессор загружает байт в буфер UART и ждёт флага готовности. Плюс — данные моментально оказываются на линии. Минус — процессор занят на всё время отправки.</p><p>Альтернатива — <b>передача по прерыванию</b>: байты складываются в кольцевой буфер, а прерывание UART отправляет их фоном. Экономит процессорное время, но требует ОЗУ под буфер. На 8051 с его скудной памятью прямая передача часто выигрывает.</p><h3>Передача с хоста</h3><p>На ПК данные почти всегда буферизуются операционной системой. Программист работает с тремя уровнями абстракции:</p><ol><li><b>Контролы ОС.</b> В Windows — компоненты вроде MSComm (устаревший 32-bit ActiveX, не рекомендуется для новых проектов). Просто, но нужно следить за блокировками при приёме и многопоточностью.</li><li><b>Системные API.</b> В Windows и Linux последовательный порт — это файл. Открываем через CreateFile или open(), но перед чтением и записью требуется настройка параметров порта (в Linux — termios со скоростью, чётностью и размером слова).</li><li><b>Класс-обёртка.</b> Например, CSerialPort для Windows: он инкапсулирует инициализацию, поток приёма и отправку. После открытия порта вызов WriteToPort отправляет массив байтов, а внутренний поток следит за входящими данными и шлёт сообщения родительскому окну.</li></ol><h2>Приём и парсинг на конечном автомате</h2><p>Приём данных на стороне микроконтроллера тоже бывает двух видов: <b>опрос</b> (поллинг) и <b>прерывание</b>. Опрос проще, но отнимает процессорное время. Прерывание эффективнее: байт пришёл — сработала процедура обработки прерывания (ISR, Interrupt Service Routine), процессор отвлёкся на доли миллисекунды и вернулся к задаче.</p><p>Где размещать парсер протокола? Если протокол простой, его можно держать прямо в обработчике прерывания: приняли корректный кадр — установили флаг, основной цикл реагирует. Для сложных протоколов лучше писать байты в буфер и разбирать их в главном цикле. Гибридный подход тоже возможен: в прерывании ищем только «команду подключения», а остальное парсим фоном.</p><h3>Пример: разбор кадра по состояниям</h3><p>Рассмотрим конкретный формат кадра:</p><p>Парсер реализуем через переменную state_machine. Каждое состояние соответствует ожидаемому байту. Если пришёл не тот байт — автомат сбрасывается в ноль. Это защищает от «залипания» в промежуточном состоянии при обрыве связи или помехах.</p><p><b>Совет по стабильности:</b><br />Сброс автомата при несовпадении заголовка, адресов, длины, checksum или концевика — ключевая техника. Без неё при обрыве кадра парсер застрянет в промежуточном состоянии, и следующие кадры будут отвергнуты.</p><h2>Приём на стороне хоста</h2><p>На ПК приём организуется проще: операционная система уже буферизует входящие байты. Для неблокирующего чтения запускают отдельный поток, который ждёт данных из порта и передаёт их в основной процесс через сообщения или обратный вызов. Класс CSerialPort, например, отправляет родительскому окну сообщение WM_COMM_RXCHAR с каждым новым байтом. Обработчик этого сообщения просто вызывает тот же парсер, что и на микроконтроллере.</p><p>Таким образом, логика разбора протокола <b>единая</b> для обеих сторон. Различается только способ доставки байтов в парсер: прерывание ISR на МК и поток ОС на хосте.</p><h2>Выводы</h2><p>Проектирование протокола связи для микроконтроллера — это не ракетостроение, но требует дисциплины. Хороший кадр защищает границы (заголовок + концевик), адресует получателя, указывает длину и проверяет целостность. Парсинг на конечном автомате делает код предсказуемым и устойчивым к сбоям.</p><p>Главный принцип — <b>сбрасывать автомат при любом нарушении ожидаемого шаблона</b>. Это предотвращает «залипание» и позволяет системе быстро восстановиться после помехи. На основе этой базы можно наращивать надёжность: добавлять повторные передачи, порядковые номера, шифрование — в зависимости от требований проекта.</p><blockquote>Хороший протокол — это не тот, который передаёт быстрее всех, а тот, который не ломается при помехах.</blockquote><p><b>Источник:</b> оригинальная статья Leo Liu — <a href="https://dev.to/sienovoleo/microcontroller-communication-protocol-design-1e29">Microcontroller Communication Protocol Design</a> (DEV Community).</p>]]></content:encoded>
    </item>
    <item>
      <title>Локализация через Enum, неожиданный Дзен, быстрее только телепатия</title>
      <link>https://tproger.ru/articles/lokalizaciya-cherez-enum-neozhidannyj-dzen-bystree-tolko-telepat</link>
      <comments>https://tproger.ru/articles/lokalizaciya-cherez-enum-neozhidannyj-dzen-bystree-tolko-telepat?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Самир Гёзалов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/lokalizaciya-cherez-enum-neozhidannyj-dzen-bystree-tolko-telepat</guid>
      <description><![CDATA[<p>Надоело плодить JSON/ARB файлы при локализации Flutter-приложения? Автор делился личным опытом и показал, как элегантно настроить локализацию через Enum без внешних зависимостей, генераторов кода и боли в рантайме.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/lokalizaciya-cherez-enum-neozhidannyj-dzen-bystree-tolko-telepat">Локализация через Enum, неожиданный Дзен, быстрее только телепатия</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Массивы и строки]]></category>
      <category><![CDATA[Красивый хак]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Мобильная разработка]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Flutter]]></category>
      <category><![CDATA[Dart]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 04 Jun 2026 04:45:17 GMT</pubDate>
      <content:encoded><![CDATA[<p>Решил давеча добавить локализацию в свое приложение на Flutter. Задачка-то простая: пара кнопок, пару десятков переменных. Казалось бы, делов на пять минут. Но Flutter «из коробки» сразу попытался всучить мне какую-то дичь в виде ARB и JSON файлов. Хмм, из прошлого с такими реализациями лишь печаль, так что…</p><h2>Попытка №1. Путь в лоб: Классы и интерфейсы</h2><p>Самый очевидный способ - создать родительский класс с переменными, а языки сделать его наследниками. Но это просто… фиаско. Даже если не писать from/toJson, процесс выглядит так:</p><ol><li>Объявил переменную в родителе.</li><li>Прописал её в конструкторе.</li><li>Повторил то же самое для всех дочерних классов (всех языков).</li></ol><p>Если бы я работал на аутсорсе в Индии и мне платили за количество строк кода - это был бы идеальный вариант. Но я хотел, чтобы одной строки при объявлении было достаточно.</p><h2>Попытка №2. Стандарт (ARB/JSON)</h2><p>Я поплевался, но решил попробовать - «стандарт» всё-таки. Мало ли, может чего поменялось за годы. Вроде всё завелось, но сам процесс… это боль. Бегать по разным файлам, чтобы добавить одну строчку - так себе удовольствие.</p><p>Почему я от него окончательно отказался? Когда данных становится реально много (десятки языков, тысячи строк), ты попадаешь в ловушку: тебе нужно эту махину либо целиком держать в памяти, либо постоянно подгружать и парсить. Ради смены одного слова на кнопке заставлять девайс ворочать тяжелые JSON-ы в рантайме - так себе затея для производительности.</p><h2>Попытка №3. Таблицы и костыли</h2><p>Подумал: «Окей, почему бы не подтянуть старый добрый CSV или вообще закинуть всё в табличку?». И тут официальный пакет локализации сказал: «Извини, мужик, тут наши полномочия всё».</p><p>Ну, я тоже не пальцем деланный. Решил припахать нейросеть, чтобы она написала мне собственный генератор. Флоу получился такой:</p><ol><li>Добавляю строку в таблицу.</li><li>Запускаю генератор.</li><li>Он лепит «родительский» файл.</li><li>После Freezed генерит toJson, fromJson…</li></ol><p>Короче, весело не было. Мало того, я понимал: если языков станет много, мне придется добавлять их все разом и единовременно, иначе в рантайме всё начнет плеваться ошибками. Плюс та же проблема с памятью: таблица - это структура, которую надо парсить и хранить.</p><h2>Красный флаг для программиста</h2><p>Но главная проблема даже не в этом. Необходимость запускать генератор после добавления каждой переменной - это для любого программиста красный флаг.</p><p>Что происходит на практике? Когда ты пишешь код и тебе нужно добавить одну несчастную строку, тебе лень (читать: нехочется выходить из потока творения) запускать весь этот цикл с генерацией. Ты просто её хардкодишь в надежде «потом скопом всё добавлю одним махом». А «потом» наступает тогда, когда уже весь проект завален хардкодом, и вычищать его - то еще удовольствие. Даже нейросетки с такими запросами помогают не с первого раза, и с сомнительной эффективностью.</p><p>Нутром чуял - флоу неправильный. В итоге я пришел к тому, что называю идеальной локализацией.</p><h2>Эволюция лени: почему Enum победил интерфейсы</h2><p>Я начал мучить нейросеть разными вариантами реализации. Для меня в первую очередь был важен флоу работы: мне было тупо лень писать больше одной строки кода, чтобы добавить переменную.</p><p>Моя философия проста: строку захардкодить - моментально. Добавление даже одной строки в другом файле требует доп. действий. НО, если действий минимум, то кодер поймет, что выигрыш во времени сейчас мизерный против больших потерь в будущем, и исправно добавит строку в правильное место. Этого не произойдет, если для добавления строки нужно «отчитаться» в десяти местах.</p><h2>Попытка №4. Рекорды (Records)</h2><p>Присматривался к рекордам. С ними удобно: не нужно писать конструкторы. Но есть подвох: как только ты добавил переменную в один язык, компилятор тут же сходит с ума и требует добавить её во все остальные прямо сейчас. Никакой гибкости и возможности оставить «на потом».</p><h2>Идеальный костыль: Enum</h2><p>В итоге я пришел к самому, казалось бы, «неправильному» способу, который оказался идеальным. Enum. Само название намекает на перечисления и цифры, но оказалось, что хранить в нем буквы и целые фразы - это лучший путь для локализации.</p><p>Знаете, мне моё решение так понравилось, что я пошел к нейросетям и проверил его со всех сторон. Все модели  остались в полном восторге. Под это дело я даже подготовил монументальную «нейро-статью» на полтора часа внимательного чтения, со всеми графиками, бенчмарками и анализом производительности.</p><p>Но потом я заглянул в правила Хабра, прислушался к голосу разума и понял: никто не хочет читать полтора часа сухой статистики. Лучше я просто расскажу вам свою историю «от первого лица», как я докатился до такой жизни. Ну, а если вы совсем уж фанаты цифр - просто скормите этот текст любой нейронке, она вам перескажет всё в лучших академических тонах с графиками на любой вкус.</p><p>А здесь мы будем говорить по делу.</p><p>Ниже я выкатываю сам код. Код тут не для зубрежки, а лишь чтобы указать направление / идею. Самая большая прелесть этой системы в том, что она оставляет гигантское пространство для любого типа реализации. Это архитектурный каркас, который чертовски сложно сломать. Главное — уловить принцип.</p><h2>Реализация</h2><p>Принцип разделения:</p><ul><li>enum Strings → типизированный контракт (что существует).</li><li>translator → источник данных (откуда берётся текст).</li></ul><p>Структура файлов - минимальная. Никаких внешних зависимостей:</p><h2>Ядро - strings.dart</h2><p>Весь контракт локализации в одном enum. Два режима - хардкод switch и серверный кеш - за одним и тем же</p><p>. Даже сообщения об ошибках локализации — сами локализованы:</p><h2>Список языков - languages_enum.dart</h2><p>Каждый язык - самодостаточная единица: знает свой код, название, направление текста и как себя загрузить:</p><p>Хотите грузить с сервера? Одна строка + loader. И</p><p>- тоже одна строка, потому что</p><p>уже является registry:</p><h2>Переводчик - i18n/russian.dart</h2><p>Как это выглядит в жизни (и почему я перестал хардкодить) Я намеренно не привожу здесь код оберток виджетов или конкретных стейт-менеджеров. Всё это - чистая «вкусовщина». Для работы системы нужен лишь элементарный вещатель событий (Notifier), повешенный на метод смены языка.</p><p>Но главное - это мой ежедневный флоу. Сейчас, чтобы добавить строку в UI, я просто вызываю нужный мне ключ: Strings.someKey(). Без контекста, везде.</p><p>А если ключа еще нет? Я тупо иду в Strings и добавляю одну строчку в Enum. Всё.</p><p>Благодаря дефолтному конструктору, приложению абсолютно плевать, что у меня там еще 100 языков не переведены. Оно компилируется и работает здесь и сейчас. А дальше в дело вступают гит-хуки: при комите нейросетка сама подхватывает изменения и заполняет недостающие поля в переводчиках.</p><p>Знаете, какое самое странное чувство? Мне сейчас реально проще и быстрее завести переменную в локализации, чем хардкодить строку в коде. Кажется, это и есть признак здоровой архитектуры - когда делать «правильно» становится физически удобнее, чем делать «быстро» и криво.</p><p>Собственно если в кратце это все о чем я хотел рассказать. Если тема зайдет или кто-то сам не сможет допереть, как прикрутить это к своей архитектуре - пишите в комментариях, разберемся.</p><p>Надеюсь, мой опыт сэкономит вам пару литров нервных клеток. Всех благ и чистого кода без «магических строк»!</p>]]></content:encoded>
    </item>
    <item>
      <title>Семь ошибок индексации БД, которые убивают производительность SaaS на корню</title>
      <link>https://tproger.ru/articles/sem-owibok-indeksacii-bd-kotorye-ubivayut-proizvoditelnost-sa</link>
      <comments>https://tproger.ru/articles/sem-owibok-indeksacii-bd-kotorye-ubivayut-proizvoditelnost-sa?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/sem-owibok-indeksacii-bd-kotorye-ubivayut-proizvoditelnost-sa</guid>
      <description><![CDATA[<p>Разбираем 7 типичных ошибок индексации в PostgreSQL и MySQL: переиндексация, низкая селективность, раздутие индексов, мультитенантность и внешние ключи. Проверьте свою БД перед релизом.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/sem-owibok-indeksacii-bd-kotorye-ubivayut-proizvoditelnost-sa">Семь ошибок индексации БД, которые убивают производительность SaaS на корню</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Масштабируемость и ограничения памяти]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 03 Jun 2026 05:30:09 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ваш код чист, архитектура продумана, а запросы на staging укладываются в 12 мс. Но при 500 000 записей всё встаёт: панели мониторинга тормозят, пользователи жалуются, а дежурный инженер в полночь разглядывает план выполнения запроса и не понимает, что пошло не так. В девяти случаях из десяти причина — не отсутствие индексов, а <b>неправильные индексы</b>.</p><p><b>Индекс в базе данных</b> — это вспомогательная структура (чаще всего B-дерево; хеш-индексы, GiST, GIN и другие типы применяются в узких специфических сценариях), которая ускоряет выборку строк по заданным колонкам. По аналогии с оглавлением книги: вместо перелистывания всех страниц СУБД сразу переходит к нужной главе. Но если оглавление построено плохо, пользы от него нет — а вот накладные расходы на поддержку остаются.</p><p>В этой статье разберём семь самых разрушительных ошибок индексации в production-SaaS: от параноидального создания индексов «на всякий случай» до игнорирования раздутия и особенностей мультитенантных схем. Каждая ошибка — с примерами SQL, метриками и конкретным фиксом.</p><p>Индексы — это налог на запись: каждый INSERT, UPDATE и DELETE обновляет все индексы таблицы.</p><p>Индекс на колонке с низкой селективностью (boolean, статус) почти бесполезен — используйте частичные (partial) индексы.</p><p>В составном индексе порядок колонок критичен: PostgreSQL может использовать (a, b, c) только если условие начинается с a.</p><p>Раздутые индексы на высокоизменяемых таблицах могут занимать в 8 раз больше места, чем нужно — планируйте REINDEX CONCURRENTLY.</p><p>В мультитенантных системах индекс по tenant_id один часто недостаточен: добавляйте диапазон времени или тип события.</p><p>Внешние ключи в PostgreSQL не индексируются автоматически — после каждого FOREIGN KEY создавайте индекс вручную.</p><p>Без EXPLAIN ANALYZE индексы создаются вслепую. Проверяйте реальный план выполнения перед деплоем.</p><h2>Ошибка 1. Индексировать всё подряд «на всякий случай»</h2><p>Самая распространённая ошибка — не недостаток индексов, а их избыток из тревожности. Особенно часто в неё попадают junior-разработчики: добавляют индекс на каждую колонку, которая встречается в WHERE, «на всякий случай». Кажется ответственным, но на самом деле вредно.</p><p>Каждый индекс — это налог на запись. При INSERT, UPDATE и DELETE PostgreSQL (или MySQL) вынуждена обновлять <b>все</b> индексы таблицы. На таблице с 8 индексами каждая запись трогает 8 структур данных. При низкой нагрузке это невидимо, но при 10 000 записей в минуту это становится узким местом.</p><p><b>Аудит неиспользуемых индексов в PostgreSQL:</b><br />Запрос к pg_stat_user_indexes покажет, сколько раз каждый индекс применялся с момента сброса статистики. Если idx_scan = 0 — индекс кандидат на удаление.</p><p>Не удаляйте индекс сразу — сначала убедитесь, что он не нужен для редких, но критичных отчётов. Но если он месяцами не используется, смело избавляйтесь.</p><h2>Ошибка 2. Не понимать селективность</h2><p>Индекс на булеву колонку — почти всегда бесполезен. <b>Селективность</b> измеряет, сколько различных значений содержится относительно общего числа строк. У boolean всего два значения. Если 95% строк имеют is_active = true, планировщик запросов проигнорирует индекс и сделает Seq Scan — и будет прав.</p><p>Правило большого пальца: если у колонки меньше 10–20 уникальных значений относительно размера таблицы, простой индекс по ней один не справится. Используйте частичные или составные индексы.</p><h2>Ошибка 3. Неверный порядок колонок в составном индексе</h2><p>Составные индексы мощны, но часто неправильно понимаются. PostgreSQL может использовать индекс (a, b, c) для фильтрации по a, a и b, a, b и c. Но <b>не может</b> эффективно использовать его, если запрос фильтрует только по b или c — ведущая колонка пропущена.</p><p>Решение: первыми ставьте колонки с equality-условиями, затем — по селективности, и проектируйте индексы вокруг <b>реальных паттернов запросов</b>, а не вокруг схемы таблицы. Также учитывайте ORDER BY и необходимость покрывающего индекса. Перед созданием обязательно запускайте EXPLAIN ANALYZE.</p><h2>Ошибка 4. Игнорировать раздутие индексов</h2><p>Индексы деградируют со временем. Многие инженеры воспринимают их как «поставил и забыл», но это заблуждение. В PostgreSQL при обновлении или удалении строки старые записи в индексе устаревают и накапливаются как <b>раздутие</b> (bloat); их физическое удаление происходит при выполнении VACUUM. На высокоизменяемых таблицах (заказы, события, логи, сессии) раздутие накапливается стремительно.</p><p>Таблица с 1 млн живых строк может иметь индекс, раздутый до размеров 8 млн записей. Каждый запрос через такой индекс делает в 8 раз больше работы, чем должен.</p><p><b>REINDEX CONCURRENTLY</b> — ключевое слово. Обычный REINDEX блокирует таблицу, а в production-SaaS это прямой путь к инциденту. CONCURRENTLY перестраивает индекс без блокировок, хотя и медленнее.</p><p>Также убедитесь, что autovacuum настроен под вашу реальную нагрузку на запись. Значения по умолчанию в PostgreSQL консервативны и часто недостаточны для SaaS с высокой интенсивностью записи.</p><h2>Ошибка 5. Индексы на колонках с малым числом уникальных значений в мультитенантных системах</h2><p>В мультитенантной архитектуре почти каждый запрос фильтрует по tenant_id. Естественное желание — проиндексировать эту колонку. Но для крупных тенантов индекс по tenant_id вернёт слишком много строк, и планировщик предпочтёт Seq Scan. Для маленьких тенантов отдельный индекс по tenant_id может быть полезен.</p><p>На серьёзном масштабе правильное решение — партиционирование таблиц по tenant_id, но это архитектурное решение. Практический первый шаг — составные индексы с временными диапазонами.</p><h2>Ошибка 6. Не индексировать внешние ключи</h2><p>В PostgreSQL внешние ключи <b>не индексируются автоматически</b>. При удалении родительской строки СУБД должна проверить все дочерние таблицы на наличие ссылающихся записей — и без индекса на внешнем ключе это Seq Scan по каждой дочерней таблице. На таблице orders с 50 млн строк удаление пользователя вызывает полное сканирование.</p><p>Сделайте это командным соглашением: в чек-листе миграций обязательный пункт «после каждого FOREIGN KEY — CREATE INDEX».</p><h2>Ошибка 7. Не использовать EXPLAIN ANALYZE перед деплоем</h2><p>Большинство решений об индексах принимаются интуитивно. Интуиция ошибается достаточно часто, чтобы это стало проблемой. EXPLAIN ANALYZE показывает, что именно делает планировщик: какие индексы использует, какие игнорирует, сколько строк реально прочитал против оценки, где тратится время.</p><p>На что обращать внимание:<br />• <b>Seq Scan</b> на большой таблице при выборке малой доли строк — возможно, пропущен индекс или планировщик не может использовать существующий индекс.<br />• <b>Rows Removed by Filter</b> в десятки тысяч — индекс есть, но неправильные колонки или низкая селективность.<br />• <b>Buffers: shared hit=0 read=45000</b> — данные не закэшированы (cold cache), страницы читаются с диска. Для диагностики раздутия смотрите общее число буферов и сравнивайте размер индекса с ожидаемым.<br />• Высокое <b>actual time</b> — проверьте раздутие, актуальность статистики, количество буферов, дисковую подсистему и наличие блокировок. Запустите ANALYZE tablename, чтобы обновить статистику планировщика.</p><h2>Чек-лист индексации для SaaS</h2><ul><li>У каждой колонки внешнего ключа есть индекс?</li><li>Составные индексы упорядочены по селективности, а не по удобству?</li><li>Булевы и низкокардинальные фильтры используют частичные индексы вместо полных?</li><li>Вы запускали EXPLAIN ANALYZE на 10 самых медленных запросов за неделю?</li><li>Есть процесс поиска и удаления неиспользуемых индексов?</li><li>Высокоизменяемые таблицы регулярно проходят REINDEX CONCURRENTLY?</li><li>Autovacuum настроен под реальный объём записи, а не под значения по умолчанию PostgreSQL?</li><li>В мультитенантных таблицах индексы начинаются с tenant_id и включают диапазон времени?</li></ul><h2>Выводы</h2><p>Индексы — не фича производительности, которую добавляют, когда всё начинает тормозить. Это проектное решение, которое принимается вместе со схемой, и пересматривается по мере эволюции паттернов запросов. Команды, которые уверенно масштабируются, — не те, у кого больше всего индексов, а те, кто понимает, что каждый индекс стоит, что даёт и когда его пора убирать.</p><blockquote>База данных, которая быстра на 10 000 строках и быстра на 50 миллионах, — не случайность. Это результат того, что кто-то считал планирование запросов первоклассной инженерной задачей, а не рутинным дополнением.</blockquote><p>Проверьте свои самые медленные запросы этой недели — возможно, одна из этих семи ошибок уже сидит в вашей production-базе.</p><p><b>Источник и материалы:</b><br />• <a href="https://dev.to/outworktech/database-indexing-mistakes-that-kill-saas-performance-at-scale-4j8e">Database Indexing Mistakes That Kill SaaS Performance at Scale</a> — оригинальная статья OutworkTech<br />• <a href="https://www.postgresql.org/docs/current/indexes.html">PostgreSQL Index Types</a> — официальная документация<br />• <a href="https://www.postgresql.org/docs/current/sql-reindex.html">REINDEX</a> — документация по перестроению индексов</p>]]></content:encoded>
    </item>
    <item>
      <title>MDLM против LLM: диффузионные world models для RL</title>
      <link>https://tproger.ru/articles/maskirovannye-diffuzionnye-modeli-obhodyat-llm-v-4-raza-bolwego</link>
      <comments>https://tproger.ru/articles/maskirovannye-diffuzionnye-modeli-obhodyat-llm-v-4-raza-bolwego?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/maskirovannye-diffuzionnye-modeli-obhodyat-llm-v-4-raza-bolwego</guid>
      <description><![CDATA[<p>Исследование Patronus AI: маскированные диффузионные модели превосходят авторегрессионные LLM в симуляции сред. 8B обходит 35B, GRPO даёт +47%. Проверьте выводы.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/maskirovannye-diffuzionnye-modeli-obhodyat-llm-v-4-raza-bolwego">MDLM против LLM: диффузионные world models для RL</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Инновации]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 28 May 2026 13:42:38 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы тренируете LLM-агентов для работы с инструментами, скорее всего, вы сталкиваетесь с одной и той же проблемой: среды для обучения быстро становятся слишком простыми, и агент переобучается на узкий набор сценариев. Исследователи из Patronus AI предложили необычное решение — вместо авторегрессионных языковых моделей использовать <b>маскированные диффузионные языковые модели (MDLM)</b> в качестве «воображаемых» сред. Результат: 8-миллиардная модель обыгрывает 35-миллиардную автрегрессионную LLM, а обучение агентов на синтетических траекториях даёт прирост точности до 47%.</p><p>Разбираем, почему бидирекционный денойзинг оказался эффективнее привычного лево-направо декодирования, и что это значит для разработчиков интеллектуальных агентов.</p><p>Маскированные диффузионные языковые модели (MDLM) превосходят авторегрессионные LLM как модели мира (world models) для текстовых сред благодаря бидирекционному денойзингу и учёту якорей (anchors).</p><p>8-миллиардная SDAR обходит 35-миллиардную Qwen-3.5-35B-A3B по метрике MAUVE (0,982 против 0,932) и порождает состояния большего разнообразия.</p><p>GRPO-обучение на траекториях от MDLM даёт прирост до +47% на отложенных (held-out) средах (ALFWorld, ScienceWorld, AppWorld).</p><p>Экспертная оценка подтверждает высокий реализм (4,75/5) и корректность (4,25/5) сгенерированных состояний.</p><p>Ограничения: хрупкая генерация API-ключей, pagination drift и блоковые повторы при высокой temperature.</p><p>В контексте обучения с подкреплением (RL) <b>world model</b> — это генеративная модель, которая предсказывает следующее состояние среды на основе текущего состояния и действия агента. Вместо того чтобы взаимодействовать с реальным API или базой данных на каждом шаге обучения, агент может «играть» в симуляции, созданной world model. Это дешевле, быстрее и позволяет порождать редкие или опасные сценарии, которые сложно воспроизвести в реальной системе.</p><p>Ранее для текстовых сред чаще всего использовали обычные автрегрессионные LLM: подали префикс — модель дописала продолжение. Но у этого подхода есть фундаментальное ограничение: состояния среды часто содержат <b>якоря (anchors)</b> — фиксированные поля, которые должны оставаться неизменными (например, user_id или status: "error"). Авторегрессионная модель, генерирующая текст строго слева направо, не видит эти якоря до тех пор, пока не дойдёт до них, и рискует сгенерировать противоречивое состояние.</p><h2>Почему автрегрессионные LLM плохо справляются</h2><p>Представьте, что модели нужно сгенерировать ответ API о возврате платежа. В схеме зафиксированы поля ticket_id и user_id, а также конечный статус "error". Авторегрессионная модель начинает декодирование с первого поля и не видит финальный статус до самого конца. В результате она может сгенерировать refund_processed: true, хотя статус требует ошибки — получается глобально некорректное состояние.</p><p>Этот эффект называется <b>left-to-right bias</b>: causal attention маскирует будущие токены, и модель вынуждена принимать решения без учёта глобальных ограничений. При масштабировании длины траекторий ошибки накапливаются, что приводит к mode collapse — агент видит всё меньше разнообразных ситуаций и переобучается.</p><p><b>Проблема в цифрах:</b><br />Исследователи показали, что даже 35-миллиардная авторегрессионная модель (Qwen-3.5-35B-A3B) уступает 8-миллиардной диффузионной по метрике MAUVE, измеряющей согласованность распределений сгенерированных и реальных состояний.</p><h2>Как работают маскированные диффузионные модели</h2><p>Маскированные диффузионные языковые модели (MDLM) обучаются итеративно восстанавливать замаскированные токены в последовательности. В отличие от авторегрессионных моделей, они используют <b>бидирекциональное внимание</b>: при подавлении шума каждой позиции модель видит все уже известные и все ещё замаскированные токены одновременно. Это позволяет учитывать якоря с обеих сторон последовательности.</p><p>Ключевое преимущество для world modeling — <b>any-order generation</b>. MDLM может заполнять поля состояния в произвольном порядке: сначала зафиксировать статус ошибки, потом подобрать под него корректный код ошибки, а уже затем заполнить остальные поля. Такой подход естественным образом поддерживает глобальную согласованность состояния и снижает накопление ошибок.</p><p>Ещё одно отличие — стохастичность самого порядка генерации. В авторегрессионной модели temperature влияет только на выбор токена; в MDLM она влияет ещё и на то, <b>какую позицию</b> раскрывать следующей. Это даёт дополнительную ось разнообразия и помогает избежать коллапса моды (mode collapse) на высоковероятных префиксах.</p><h2>Результаты: 8B против 35B и zero-shot transfer</h2><p>Авторы исследования собрали крупный датасет из сотен тысяч траекторий из девяти открытых сред (SWE-bench, CoderForge, TauBench, Gorilla, Toolathlon и других), сгенерированных передовыми моделями. На этих данных они дообучили несколько MDLM (SDAR-8B, SDAR-30B-A3B, WeDLM-8B, LLaDA-2.1-mini) и сравнили с авторегрессионными базовыми линиями (Qwen-3.5-27B, GPT-OSS-20B, GLM-4.7-Flash, Nemotron-3-Nano-30B, Qwen-3.5-35B-A3B).</p><h3>Генерация состояний</h3><p>На in-domain тесте SDAR-8B достиг MAUVE = 0,982, тогда как сильнейшая AR-модель (Qwen-3.5-35B-A3B) — всего 0,932. На out-of-domain наборах (API-Bank, OccuBench, Intercode-SQL) разрыв сохраняется: SDAR-8B показывает MAUVE 0,979 против 0,960 у 35-миллиардного конкурента. При этом Self-BLEU у SDAR-8B ниже (0,601 против 0,690), а Distinct-N выше (0,385 против 0,253) — это означает, что диффузионная модель порождает состояния большего разнообразия.</p><h3>Обучение агентов без дообучения среды</h3><p>Главный практический тест — можно ли использовать траектории от MDLM для обучения агентов в совершенно новых средах? Авторы применили GRPO (Group Relative Policy Optimization) с траекториями от SDAR-8B и Qwen-3.5-27B на трёх отложенных (held-out) средах: AppWorld, ScienceWorld и ALFWorld. Результаты впечатляют:</p><ul><li>LFM2.5-1.2B на ALFWorld: с 5,7% (база) до 53,6% с SDAR-WM — прирост +47,9% абсолютных пунктов.</li><li>Mistral-7B на ScienceWorld: с 3,3% до 48,4% — прирост +45,1%.</li><li>Qwen3-4B на AppWorld: с 33,3% до 62,0% — прирост +28,7%.</li><li>Во всех девяти пара модель-среда SDAR-WM превосходит Qwen-WM в среднем на +5,3 пункта.</li></ul><p>Критически важно: это <b>zero-shot transfer</b> — агенты не видели целевые среды во время обучения world model. Ранее подобные результаты требовали специфической адаптации под каждую среду.</p><h3>Оценка людьми</h3><p>Четыре независимых эксперта с опытом работы с LLM-агентами оценили 100 сгенерированных состояний по шкале Лайкера 1–5. Средние оценки SDAR: <b>4,75</b> (реализм), <b>4,25</b> (корректность исхода), <b>4,50</b> (польза для обучения). Коэффициент согласия Криппендорфа α ≥ 0,89 на всех метриках говорит о высокой межаннотаторной надёжности.</p><h2>Ограничения и подводные камни</h2><p>Несмотря на впечатляющие цифры, у MDLM как world models есть свои слабые места. Во-первых, модели испытывают трудности с генерацией структурированных полей вроде API-ключей: комбинация safety-alignment базовой Qwen и малого block size при диффузии приводит к искажённым строкам. Во-вторых, при работе с постраничным выводом (pagination) MDLM иногда теряет нумерацию страниц — эффект, который авторы назвали <b>pagination drift</b>.</p><p>Также при высоких температурах модель может зацикливаться на блоковом уровне, повторяя одни и те же фрагменты состояния. Авторы отмечают, что все три ограничения, скорее всего, ослабнут с ростом размера модели и специализированным дообучением на задачи работы с инструментами.</p><h2>Что это значит для разработчиков</h2><p>Для инженеров, строящих агентных систем, исследование открывает сразу несколько перспектив:</p><ol><li>Синтетические данные для RL. Если у вас нет доступа к реальному контуру заказчика, MDLM-модель может сгенерировать вполне реалистичные траектории для предварительного обучения агента, прежде чем вы перейдёте к дорогим реальным вызовам.</li><li>Аугментация редких сценариев. Диффузионная природа MDLM даёт естественный способ порождать редкие ошибки и пограничные случаи, которые плохо представлены в логах production.</li><li>Эффективность по параметрам. 8-миллиардная диффузионная модель может заменить 30-миллиардную автрегрессионную в задаче симуляции — это снижает требования к инфраструктуре вывода.</li><li>Управляемость. Возможность задавать якоря и направлять генерацию через маскирование упрощает создание отобранных обучающих выборок под конкретные домены.</li></ol><p>Если тема RL и агентов вам близка, загляните в наши материалы: <a href="https://tproger.ru/articles/kak-rabotaet-reinforcement-learning">как работает Reinforcement Learning</a>, <a href="https://tproger.ru/news/v-llama-cpp-smerzhili-mtp-dekoding-qwen3-6-27b-stal-v-2-4-raza">ускорение Qwen3.6 в llama.cpp</a> и <a href="https://tproger.ru/articles/personalnyj-ii--zapuskaem-llama-i-mistral-lokalno-na-mac-i-windows">локальный запуск Mistral</a>.</p><p>Важно понимать, что MDLM не заменяют полностью реальные среды: они скорее служат мостом между supervised fine-tuning и дорогим RL в production, позволяя дешево итерировать политику агента.</p><h2>Выводы</h2><p>Исследование Patronus AI демонстрирует, что архитектурный выбор важнее сырого количества параметров: 8-миллиардная маскированная диффузионная модель превосходит 35-миллиардную авторегрессионную в задаче world modeling благодаря бидирекционному денойзингу и способности учитывать якоря состояния. Для разработчиков агентных систем это открывает путь к дешёвым и разнообразным синтетическим средам для обучения.</p><blockquote>Главный вывод исследования: архитектура важнее размера. 8-миллиардная диффузионная модель обходит 35-миллиардную авторегрессионную, потому что видит всё состояние целиком, а не только префикс.</blockquote><p>Если вы планируете внедрять RL в агентные пайплайны, стоит следить за развитием MDLM: с ростом масштаба и специализации эта архитектура может стать стандартом де-факто для симуляции текстовых сред.</p><p><b>Источник:</b> <a href="https://zenodo.org/records/20219105">Deshpande D. Masked Diffusion Language Models are Strong and Steerable Text-Based World Models for Agentic RL. Zenodo, 2026. DOI: 10.5281/zenodo.20219105</a>. <i>Исследование пока доступно только в виде препринта, его выводы стоит воспринимать с осторожностью.</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Почему главные конфликты в разработке не связаны с технологиями</title>
      <link>https://tproger.ru/articles/pochemu-glavnye-konflikty-v-razrabotke-ne-svyazany-s-tehnologiyami</link>
      <comments>https://tproger.ru/articles/pochemu-glavnye-konflikty-v-razrabotke-ne-svyazany-s-tehnologiyami?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Козлов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/pochemu-glavnye-konflikty-v-razrabotke-ne-svyazany-s-tehnologiyami</guid>
      <description><![CDATA[<p>Почему конфликты в IT-командах возникают не из-за технологий, а из-за коммуникации, идентичности и инженерной культуры. Разбор споров вокруг Scala, Kotlin, архитектуры, технического долга и командной динамики в разработке.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/pochemu-glavnye-konflikty-v-razrabotke-ne-svyazany-s-tehnologiyami">Почему главные конфликты в разработке не связаны с технологиями</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Функциональное программирование]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Scala]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Kotlin]]></category>
      <category><![CDATA[Тимлид]]></category>
      <category><![CDATA[Lego]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 15 May 2026 06:19:51 GMT</pubDate>
      <content:encoded><![CDATA[<p>В первый месяц работы юный разработчик может думать, что причина конфликтов в команде скрывается в технологических нюансах. Через год он начинает подозревать: дело в чем-то другом. Десять лет спустя он с уверенностью скажет: технологии здесь вообще ни при чем.</p><h2>Инструмент как часть личности</h2><p>Возьмем типичную ситуацию: переход на новый стек или поддержка старой базы. Допустим, команда третью неделю (а иногда и третий месяц!) обсуждает, оставить Scala или перейти на Kotlin. Аргументы обеих сторон озвучиваются на первой же встрече, а затем просто повторяются от созвона к созвону. Кто-то говорит об экосистеме, кто-то — о кривой обучения. Внешне это выглядит как техническая дискуссия, но решение не принимается.</p><p>За годы работы с инженерными командами я заметил закономерность: чем дольше тянется спор, тем меньше в нем остается от сути технологий. Люди спорят о синтаксисе, но неозвученная дискуссия идет о том, чья экспертиза весит больше, чья позиция будет услышана и кто в итоге будет нести ответственность.</p><p>Программист, который пять лет пишет на Scala, не просто использует инструмент. Язык стал частью его мышления: как он декомпозирует задачи и выстраивает архитектуру. И когда кто-то предлагает перейти на Kotlin, человек слышит: «То, что ты умеешь, больше не нужно». Отсюда и высокий градус эмоций. Годы практики делают стек частью профессиональной идентичности. Оспорить выбор инструмента — значит задеть человека лично.</p><h2>Ловушка единомышленников</h2><p>Отдельная история — когда вся команда пришла из одной среды. Если вы учились в одном вузе, слушали тех же спикеров и одновременно осваивали стек — на старте это кажется преимуществом. Вы понимаете друг друга с полуслова.</p><p>Однако со временем команда перестает замечать собственные слепые пятна. Любой «человек со стороны» с его новым взглядом воспринимается как дилетант, пытающийся найти изъяны в идеальной системе. Холивары в таких коллективах особенно вязкие: все одинаково уверены, что «очевидное очевидно», а любое альтернативное мнение априори ошибочно или упоминается лишь в контексте «идея хорошая, но делать ее мы не будем».</p><h2>Скульптура против Lego: конфликт ценностей</h2><p>В инженерной культуре сложность часто путают с качеством. Из-за этого возникают одни из самых затяжных конфликтов: когда один разработчик ратует за лаконичность и скорость, а другой — за «высокую архитектуру». Scala появилась именно из этой логики: язык создавался людьми, которые хотели объединить объектно-ориентированное и функциональное программирование в одном инструменте. Получилось мощно и академически красиво, но взаправду сложно. И вопрос, а всегда ли нужно вот настолько сложно, тоже порождает споры.</p><p>Хорошая аналогия — скульптура из мрамора против фигурки из Lego. Когда мы видим работы Страцца и Бернини, которые смогли передать в камне эффект тончайшей вуали, мы застываем в восхищении посреди музея. Но создание таких статуй требовало времени, а внести “правки от заказчика” означало бы подвергнуть риску всю работу: попробуйте исправить скол на мраморной статуе, которую ваяли сильно дольше, чем планировалось. В случае с конструкцией из Lego все намного проще: вынул блок, вставил другой, и вот из фигурки кошки уже получился «Тысячелетний сокол».</p><p>Чем сложнее язык или технология, тем глубже оказываются ошибки и тем труднее их потом найти. Причем платит за это не только тот, кто писал. Автор ошибки как раз легко может к этому моменту уже уйти на повышение. Но каждый следующий человек, который начнет взаимодействовать с этим кодом, заплатит ту же цену. Технический долг в командах почти всегда описывают одинаково: «это то, что написали до меня». Мы сильно реже склонны упоминать его, имея в виду собственный код и свои планы. Сложные решения, выбранные ради красоты концепции, — один из самых надежных способов создать именно такой долг.</p><p>Сложный инструмент — не приговор. Но когда его выбирают ради престижа, а не задачи, споры вокруг него становятся особенно изматывающими.</p><h2>Конфликт как трудности перевода</h2><p>Важная вещь, которую часто пропускают: разные люди воспринимают одно и то же взаимодействие по-разному. Для одних горячий спор — нормальный способ думать вслух и нащупывать решение. Для других тот же разговор выглядит как конфликт, который нужно срочно разрядить или который надо зарепортить, тимлиду или сразу в HR.</p><p>Представьте, что два инженера увлеченно спорят об архитектуре: перебивают друг друга, говорят громко, каждый настаивает на своем. Третий коллега идет к руководителю и взволнованно сообщает, что в команде глубокий конфликт. Двое из начала абзаца искренне удивляются: какой конфликт, мы просто разговаривали. Но наблюдатель снаружи видит драку.</p><p>Проблема возникает, когда команда не договорилась, что считать нормой. Один воспринимает прямую полемику как рабочий режим, другой как личную атаку. Они будут решать разные задачи в одном разговоре и никогда не придут к общему решению, пока не поймут, что разговаривают на разных языках.</p><h2>Молчание как последствие конфликтофобии</h2><p>Если порыться в памяти, мы вспомним истории, когда инженер предлагал идею, но получил отказ — причем без объяснений, просто нет. Инженер предлагает снова, и снова получает неаргументированный отказ. В такой ситуации мало кто предложит инициативу в третий раз. Психологи называют это выученной беспомощностью — человек перестает пробовать, потому что система не воспринимает предложения. А объяснять детали система не обучена или не планирует, ведь чем больше информации она даст участникам системы, тем больше поводов для споров может возникнуть.</p><p>Проходит полгода, и руководители удивляются: почему никто не проявляет инициативы, почему все приходится тянуть самому. Получается, что боязнь конфликтов через неспособность доносить аргументы порождает дальнейшие проблемы.</p><p>А люди оптимизируют поведение под реальные условия. Те, кто уходит из команд, где их не слышали, редко называют настоящую причину даже во время exit-интервью — говорят про оффер, зарплату, должность. Такой отток не попадает ни в какой дашборд, и поэтому его не замечают.</p><p>Маленькое трение, умноженное на количество людей и рабочих дней, становится реальной проблемой производительности. Разница в том, что не всегда можно четко измерить, когда человек не доволен. Это не видно на графиках, и поэтому проще игнорировать, но трение точно ощущается человеком изо дня в день.</p><p>Команды, которые застревают в спорах о технологиях, обычно делают это не из-за недостатка экспертизы. Оказывается, что, когда нет безопасного способа не соглашаться и обсуждать разные мнения, никакие условия труда и семинары по управлению конфликтами ситуацию не улучшат. Но чтобы исправить эту проблему, сначала нужно признать, что это вообще проблема — и, главное, проблема не техническая.</p>]]></content:encoded>
    </item>
    <item>
      <title>Слово за ИИ: как речевая аналитика меняет телекоммуникации</title>
      <link>https://tproger.ru/articles/slovo-za-ii-kak-rechevaya-analitika-menyaet-telekommunikacii</link>
      <comments>https://tproger.ru/articles/slovo-za-ii-kak-rechevaya-analitika-menyaet-telekommunikacii?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Красников]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/slovo-za-ii-kak-rechevaya-analitika-menyaet-telekommunikacii</guid>
      <description><![CDATA[<p>Рассказываем, как ИИ помогает бизнесу говорить на одном языке с клиентом в поддержке и повышать продажи.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/slovo-za-ii-kak-rechevaya-analitika-menyaet-telekommunikacii">Слово за ИИ: как речевая аналитика меняет телекоммуникации</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 23 Apr 2026 06:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Бизнес активно внедряет речевую аналитику, о чем говорит быстрый рост глобального рынка подобных решений. По данным <a href="https://www.datainsightsmarket.com/reports/speech-analytics-industry-14722">отчета</a> аналитической компании Data Insight, в 2025 году он оценивался на уровне 3,13 млрд долларов, а средний годовой темп его роста составит в период с 2025-го по 2033 годы 15,6%. Эта динамика во многом объясняется быстрым развитием облачных ИИ-решений, которые становятся доступны не только крупному, но  малому и среднему бизнесу.</p><p>В России также востребована речевая аналитика прежде всего банками, поставщиками страховых услуг, медицинскими и телекоммуникационными компаниями. Интерес к таким сервисам растет, потому что бизнес уделяет все больше внимания повышению качества клиентского опыта и заинтересован в получении маркетинговой информации, которую в изобилии приносит анализ всех разговоров с клиентами.</p><p>Кроме того, росту рынка способствует развитие омниканальных решений связи, в которых также очень часто задействованы сервисы для анализа коммуникаций. Российский рынок речевой аналитики, по ранее опубликованному <a href="https://telecomdaily.ru/news/2023/11/09/iaa-telecomdaily-rossiyskiy-rynok-ra-budet-rasti-v-srednem-na-15-ezhegodno">прогнозу</a> TelecomDaily, растет схожими с мировым темпами: в 2025 году он должен был увеличиться на 16% и составить 1,56 млрд руб.</p><p>Если говорить упрощенно, то речевая аналитика — это ИИ-анализ коммуникаций, то есть любых диалогов с помощью больших языковых моделей. Нейросети переводят голос в текст и, выполняя поставленные им задачи, отслеживают соответствие речи оператора или клиента заранее настроенным параметрам.</p><p>Такие сервисы умеют выделять диалоги с повышенным, отрицательным эмоциональным фоном, оценивать уровень уверенности в речи менеджера по продажам, наличие в разговоре логики, ключевых слов, соответствия скриптам. На основе этих данных алгоритмы формируют отчеты, которые дают бизнесу представление об уровне сервиса и эффективности продаж.</p><p>Разумеется, такой анализ требуется прежде всего в отделах клиентской поддержки и продаж, чтобы контролировать качество работы менеджеров, видеть узкие места, типичные ошибки в коммуникационных сценариях. На основе речевой аналитики можно принимать решения о корректировке бизнес-процессов и даже стратегические. Использование таких сервисов нельзя сравнить с ручным анализом, ведь они достигают нужной цели на порядки быстрее человека.</p><p>Если упростить: чтобы проанализировать час разговора с клиентом, порой требуется потратить тот же час. ИИ сделает это за несколько минут.</p><h2>Речевая аналитика и предубеждения</h2><p>Сегодня не приходится говорить о том, что речевая аналитика — будущее компаний. Эти технологии уже находятся на высоком уровне развития и внедряются во многих сферах. Еще больше на них возлагается надежд, связанных с тем, что они полностью изменят бизнес и сделают его радикально эффективнее, помогут исправить все недостатки в бизнес-процессах. Однако это не совсем так: ИИ в телекоммуникациях — это условие для принятия верных решений, а не инструмент для устранения проблем.</p><p>Например: речевая аналитика способна выявить ключевые маркеры эффективности менеджеров. А вот что делать с результатами анализа, как их обратить на пользу бизнесу — отдельная задача для стратегов. Анализ действительно может показать, например, что менеджеры по продажам допускают ошибки, предлагая конкретный продукт (или не предлагают его вовсе). Однако нейросети просто предоставляют отчет, суммаризируют диалоги и оценивают их результативность, и это лишь констатация факта, с которым необходимо дальше работать.</p><p>Второй предрассудок — якобы предельно высокая стоимость внедрения речевой аналитики и похожих ИИ-решений. Какое-то время назад они действительно были доступны только крупному бизнесу, а для среднего и малого оставались далеко не всегда рациональным расходованием средств. Это было связано с высокой ценой решений на этапе их выхода на рынок. Но сейчас стоимость LLM, как и оборудования, на которых они работают, снижается.</p><p>Растут конкуренция и выбор ИИ-решений, а общая их эффективность повышается, что делает их внедрение все более оправданным для компаний любого масштаба. Даже с учетом того, что затрат требуют не только оборудование и программы, но и работа квалифицированных сотрудников, которых на рынке пока не хватает ( следовательно, их зарплаты находятся на высоком уровне и растут).</p><p>Впрочем, к оценке стоимости проектов по внедрению речевой аналитики необходимо подходить не линейно: их цена должна рассматриваться в контексте повышения эффективности работы бизнеса. Если компания благодаря внедрению ИИ получает полмиллиона дополнительной прибыли, и это стоит ей 300 тысяч на ежемесячную зарплату инженеру — выбор вполне очевиден.</p><h2>LLM становятся доступнее</h2><p>Стоимость больших языковых моделей падает, так как их становится больше. Сегодня выбор ИИ-решений в области распознавания и анализа речи на рынке достаточно широк, хотя фундаментально такие технологии разрабатывают лишь несколько крупнейших ИТ-компаний. Но предложение не ограничивается проприетарными LLM: в открытом доступе присутствуют разработки open source, например от LLaMA, Qwen и других компаний.</p><p>У моделей с открытым программным кодом есть свои преимущества. Они создаются на основе совместных исследований разработчиков ИИ-решений, обычно поддерживают несколько языков, а главное — компаниям проще кастомизировать их под свои потребности, чем в случае с проприетарными LLM.</p><p>При этом стоит отметить, что у отечественных моделей тоже есть важный плюс: они изначально лучше подходят для русскоязычных пользователей, ведь обучаются на русском языке. Это отчасти обусловливает тот факт, что российские решения нередко (но не всегда) дают более качественные ответы, чем зарубежные. Выбор модели в любом случае зависит от потребностей компании в кастомизации продукта, от масштабов и бюджета бизнеса.</p><p>То же касается и решения — разворачивать ли ИИ-сервисы в собственном контуре или в облаках. Как правило, среднему и малому бизнесу экономически невыгодно локализовывать ИИ-агентов полностью в своей инфраструктуре.</p><h2>Принцип работы моделей</h2><p>Важно понимать, что на сегодняшний день в большинстве случаев нет возможности поставить модели любую задачу и получить решение на основе свободной мысли и воли искусственного интеллекта. Большинство из них формулируют ответы, используя в работе уже загруженную в них информацию, при этом они постоянно нуждаются в обучении. Их внутреннюю базу знаний приходится периодически пополнять, а также при необходимости настраивать доступ моделей к внешним источникам информации. Ими могут быть интернет либо внутренние базы знаний в компании. При этом, если модель ищет информацию в сети, то ее ответы будет сложно верифицировать. Поэтому чаще всего в чат-боты, ИИ-ассистенты, умные помощники операторов контакт-центра встроены модели, которые используют данные только из внутренних информационных систем бизнеса. Они выделяют нужное, формулируют ответы и списки источников, которыми пользовались, а человек только проверяет результаты. Но специалист пока остается последним звеном и фильтром тех решений, которые предлагает нейросеть. Потому что галлюцинации ИИ все равно неизбежны.</p><p>Как ни странно, это связано с принципиальным устройством «мышления» моделей: на самом деле у них нет задачи ответить на вопрос верно. Они просто обязаны дать любой ответ. Насколько точным он окажется, полностью зависит от качества данных, на которых обучена модель, и умения сотрудников ставить задачи для ИИ. В этом деле самое важное — понимать, что модель не умеет видеть смыслы и у нее нет обязательного для любого человека интеллектуального бэкграунда.</p><p>Проще говоря, у нее отсутствуют априорные знания о явлениях и предметах (солнце — желтое), поэтому идеальный промпт должен быть максимально подробным: не стоит опасаться перегнуть палку с формализацией при описании задач. Может показаться, что такой промпт предназначен ребенку — что же, пока ИИ, к счастью или  сожалению, и правда не дорос до уровня человеческого осознания.</p>]]></content:encoded>
    </item>
    <item>
      <title>Интуиция за Pratt parsing: как работают приоритеты операторов</title>
      <link>https://tproger.ru/translations/intuiciya-za-pratt-parsing--kak-rabotayut-prioritety-operatorov</link>
      <comments>https://tproger.ru/translations/intuiciya-za-pratt-parsing--kak-rabotayut-prioritety-operatorov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/intuiciya-za-pratt-parsing--kak-rabotayut-prioritety-operatorov</guid>
      <description><![CDATA[<p>Понятное объяснение алгоритма Pratt parsing: как деревья разбора наклоняются по приоритету операторов, что такое binding power (LBP/RBP) и как написать корректный парсер за 10 строк на Python.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/intuiciya-za-pratt-parsing--kak-rabotayut-prioritety-operatorov">Интуиция за Pratt parsing: как работают приоритеты операторов</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Парсинг]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 30 Mar 2026 15:10:50 GMT</pubDate>
      <content:encoded><![CDATA[<p>Перевод статьи <a href="https://louis.co.nz/2026/03/26/pratt-parsing.html">Intuiting Pratt parsing</a>. Автор: Louis.</p><p>Вы знаете, что a + b * c + d вычисляется как a + (b * c) + d. Но как объяснить это машине? Как закодировать правила приоритета операторов так точно, чтобы парсер сам правильно строил дерево разбора?</p><p>Pratt parsing — элегантный алгоритм, придуманный Воном Праттом в 1973 году. Он лежит в основе парсеров многих современных языков, но его описания часто сводятся к магическим таблицам приоритетов без объяснения, почему это работает. Эта статья строит интуицию с нуля.</p><p>— AST — основная структура данных: оператор над операндами, вычисление снизу вверх.</p><p>— Приоритет операторов определяет наклон дерева: выше приоритет — глубже в дерево.</p><p>— При падении приоритета алгоритм поднимается по «хребту» дерева — это и есть суть Pratt parsing.</p><p>— Левая и правая ассоциативность задаются через LBP и RBP (left/right binding power).</p><p>— Полный парсер с поддержкой всех операторов — около 10 строк на Python.</p><h2>Абстрактное синтаксическое дерево</h2><p>Наиболее распространённое решение для разбора выражений — абстрактное синтаксическое дерево (AST, Abstract Syntax Tree). В AST каждый оператор стоит над своими операндами. Вычисление идёт снизу вверх: сначала обрабатываются дочерние узлы, затем операция над ними.</p><p>Для выражения a + b * c + d правильное AST выглядит так:</p><p>Узел * находится глубже, чем +, — это и отражает более высокий приоритет умножения. При вычислении сначала перемножаются b * c, результат складывается с a, затем прибавляется d.</p><h2>Как приоритет влияет на форму дерева</h2><p>Здесь кроется главная интуиция Pratt parsing. Приоритет операторов напрямую определяет, в какую сторону «наклоняется» дерево:</p><ul><li><b>Убывающий приоритет</b> (например, * + ==) — дерево наклонено влево: операторы с большим приоритетом оказываются глубже.</li><li><b>Возрастающий приоритет</b> (например, == + *) — дерево наклонено вправо.</li><li><b>Равный приоритет</b> — по соглашению левая ассоциативность, дерево наклоняется влево.</li></ul><p>Рассмотрим промежуточное состояние разбора. Пусть мы уже построили дерево I для выражения (a &gt; b + c * d) — это правонаклонное дерево: &gt; наверху, * в самом низу.</p><p>Теперь встречаем следующий оператор. Куда вставить новый узел? Зависит от приоритета:</p><ul><li><b>[I] * e</b> — приоритет * не меньше приоритета * в дереве, вставляем в самый глубокий узел.</li><li><b>[I] + e</b> — приоритет + ниже *, но выше &gt;, поднимаемся по хребту выше узла *.</li><li><b>[I] == e</b> — приоритет == ниже всего дерева, всё дерево I становится левым потомком.</li></ul><p><b>Ключевое наблюдение:</b> когда встречается оператор с меньшим приоритетом, мы поднимаемся по правому хребту дерева, собирая узлы с более высоким приоритетом. Это и есть Pratt parsing — алгоритм, который реализует именно этот подъём по хребту.</p><h2>От интуиции к коду</h2><p>Начнём с простого случая — правонаклонного дерева. Каждый оператор правоассоциативен, приоритет не учитывается:</p><p>Здесь leaf() читает следующий терминал (число или переменную), peek() смотрит на текущий токен без продвижения, advance() читает и сдвигает позицию.</p><p>Добавляем приоритет. Рекурсивный вызов передаёт приоритет текущего оператора как порог — это ограничивает, какие операторы следующий уровень может «захватить»:</p><p>Это уже работает для правоассоциативных операторов. Но у нас if — разобрали один оператор и вышли. Для левоассоциативных нужен цикл:</p><h3>Полный Pratt parser</h3><p>Замена if на while — это и есть процедура подъёма по хребту дерева. Цикл продолжается, пока следующий оператор имеет достаточно высокий приоритет, чтобы «захватить» левую часть. Как только приоритет падает — выходим, и текущее поддерево передаётся вверх по стеку вызовов.</p><h3>Правая ассоциативность через binding power</h3><p>До сих пор у нас одно число приоритета на оператор. Но для управления ассоциативностью нужно различать, насколько «сильно» оператор притягивает операнды слева и справа. Вводятся два понятия:</p><ul><li><b>LBP (left binding power)</b> — сила притяжения левого операнда.</li><li><b>RBP (right binding power)</b> — сила притяжения правого операнда.</li></ul><p>Правила ассоциативности через binding power:</p><ul><li><b>Левоассоциативные операторы</b> (+, *): LBP == RBP. Правый рекурсивный вызов получает тот же приоритет — следующий оператор с таким же приоритетом не захватывается, строится левое дерево.</li><li><b>Правоассоциативные операторы</b> (**, =): RBP = LBP − 1. Правый рекурсивный вызов получает чуть меньший приоритет — следующий оператор с таким же приоритетом захватывается, строится правое дерево.</li></ul><p>Это финальная версия Pratt parser. Всего 8 строк кода — и корректный разбор всех операторов с любым приоритетом и ассоциативностью.</p><h2>Итог</h2><p>Pratt parsing — не хитрый трюк, а следствие простой геометрической интуиции. Деревья разбора наклоняются влево или вправо в зависимости от приоритета операторов. Когда встречается оператор с меньшим приоритетом, алгоритм поднимается по правому хребту текущего дерева — ровно настолько, насколько нужно.</p><p>Ключевые детали реализации:</p><ul><li>while вместо if — реализует подъём по хребту для левоассоциативных операторов.</li><li>Передача приоритета в рекурсию — ограничивает, какие операторы «захватываются» на следующем уровне.</li><li>LBP / RBP — контролируют ассоциативность через разницу в единицу.</li></ul><p>Понимание этой геометрии делает Pratt parsing прозрачным: каждая строка кода отражает конкретное геометрическое действие с деревом, а не магию таблиц приоритетов.</p>]]></content:encoded>
    </item>
    <item>
      <title>Студент с искусственным интеллектом, как обезьяна с гранатой</title>
      <link>https://tproger.ru/articles/student-s-iskusstvennym-intellektom--kak-obezyana-s-granatoj</link>
      <comments>https://tproger.ru/articles/student-s-iskusstvennym-intellektom--kak-obezyana-s-granatoj?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Милена]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/student-s-iskusstvennym-intellektom--kak-obezyana-s-granatoj</guid>
      <description><![CDATA[<p>Феномен стремительного проникновения ИИ в образовательную среду и противоречивые последствия этого процесса. Как современные студенты, не обладая достаточной медиаграмотностью и критическим мышлением, используют искусственный интеллект вслепую — для написания курсовых, подготовки к экзаменам и даже для подмены собственного обучения?</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/student-s-iskusstvennym-intellektom--kak-obezyana-s-granatoj">Студент с искусственным интеллектом, как обезьяна с гранатой</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 17 Mar 2026 07:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Привет! Я отношусь именно к тому поколению, которое выросло без телефонов, мы ценим живое общение, но мы первыми освоили ВКонтакте и YouTube, мы смотрели видео на кассетах, но стали теми, кто захватил tiktok, мы достигаторы, как миллениалы, но как зуммеры умеем отстаивать личные границы, уже в подростковом возрасте стали активно использовать новые технологии, но мы помним мир без интернета. Мы застали 2 эпохи и забрали от каждой лучшее. В интернете нас зовут «Зилениалы». Технологии искусственного интеллекта появились в нашей жизни в достаточно осознанном возрасте, когда мы уже учились в ВУЗе.</p><p>Почему студент с искусственным интеллектом, как обезьяна с гранатой? Как обезьяна, случайно оказавшаяся с оружием в руках, студент без глубокого понимания принципов работы искусственного интеллекта может запустить процессы, последствия которых будут непредсказуемы и необратимы.</p><p>Главная мысль здесь не в том, что студент «глуп» или «опасен сам по себе», а в том, что мощный инструмент в руках человека без системного понимания превращает ошибку в масштабируемое событие. Если раньше незнание ограничивалось локальной неудачей — неверно решённой задачей, плохим кодом, неработающим проектом, — то с ИИ цена непонимания резко возрастает. Искусственный интеллект способен автоматизировать, ускорять, тиражировать и легитимизировать решения. Поэтому ошибка студента уже не остаётся частной: она может быть встроена в код, в продукт, в учебный процесс, в управленческое решение и потом многократно воспроизводиться, оставаясь внешне «умной» и убедительной.</p><p>Ещё глубже этот тезис можно раскрыть через проблему снятия когнитивной ответственности. ИИ удобен тем, что снимает с человека часть интеллектуальной нагрузки. Но вместе с нагрузкой он нередко снимает и привычку сомневаться. Студент начинает не исследовать, а принимать; не проверять, а компилировать; не строить понимание, а собирать правдоподобные ответы.</p><p>К сожалению не всем присущ осмысленный подход к применению технологий. Всему виной человеческая лень. Именно она толкает студентов на то, чтобы не разбираться в материале, а пытаться переложить всю работу на алгоритмы. Вместо того чтобы использовать нейросети как инструмент для анализа, проверки гипотез или поиска новых идей, многие начинают превращать его в «костыль», подменяющий собственное мышление.</p><p>Непредсказуемость последствий связана не только с техническими сбоями, но и с тем, что студент может не видеть социальных эффектов своих действий: утечки данных, дискриминационных выводов, фабрикации источников, ложных рекомендаций, академического мошенничества, автоматизации вредных практик. То есть речь не о том, что «ИИ плох», а о том, что без культуры ответственности любая умная система становится ускорителем хаоса.</p><figure><img src="https://media.tproger.ru/user-uploads/136344/2026-03-12/7d2c9ffb-1016-43a7-8d44-834d0eb8ced2.webp" alt="" /></figure><h3>Новый лучший друг каждого студента?</h3><p>С момента появления искусственного интеллекта в нашей жизни подход ко многим вопросам изменился. Я замечаю, что все реже пользуюсь поиском и все чаще задаю вопросы ChatGPT, все реже выбираю реальную фотосъемку и все чаще создаю новую аватарку в нейросети, все реже читаю длинные статьи от начала до конца и все чаще прошу нейросеть коротко пересказать их суть и выделить главное в формате саммари.Кажется, что я такая не одна, ведь по опросу коммуникационного агентства FAVES Communications, проведённому в октябре 2025 года, почти 52% россиян сегодня ориентируются на ответы искусственного интеллекта при поиске через «Яндекс» и Google, причем 43% признают, что доверяют полученной информации и советам (<a href="https://companies.rbc.ru/news/SKTSzmOrWi/42-rossiyan-doveryayut-otvetam-nejrosetej-v-poiskovikah/">РБК, Публикация компании FAVES Communications</a>)</p><p>Сложно переоценить влияние искусственного интеллекта на нашу жизнь и, конечно, это не могло не оказать воздействия на сферу образования. Сейчас школьники и студенты активно используют искусственный интеллект для своей учёбы. Теперь не нужны ни знания, ни ГДЗ, ни Google, ни Википедия. Чтобы написать доклад или сочинение нужно вбить запрос в нейросеть и сразу получить готовый документ с главами и оформлением по ГОСТ. Не нужно умеет решать примеры, можно сфоткать задачу на листке, вбить её в искусственный интеллект и за секунды получить верный ответ. Современные школьники студенты делают через искусственный интеллект практически всё задания, домашки, доклады, даже пишут курсовые и дипломы.</p><figure><img src="https://media.tproger.ru/user-uploads/136344/2026-03-12/29712b72-add3-4b0d-afcf-d1f9aa09c889.webp" alt="" /></figure><p>Конечно, в связи с ростом искусственного интеллекта меняются и появляются технологии и отслеживающие его. Сдать курсовую или диплом полностью сгенерированные нейросетью не так просто. Антиплагиат теперь не только отмечает текст который вы взяли из других источников, но и ставит красный значок на вашей работе, если находятся сгенерированные элементы. За это можно получить наказание в виде незачета или отчисления. Есть только один момент. Каким образом он это определяет пока не ясно и неоднократно были случаи того что этот «чудесный антиплагиат» ставил знак сгенерированного и подозрительного документа даже на полностью написанные человеком тексты.</p><p>Меры борьбы с искусственным интеллектом приняли и в Высшей Школы Экономики, где студент может использовать нейросети в своих работах, но ему необходимо оправдать это использование, то есть написать в каких моментах и с какой целью в данной работе был применен искусственный интеллект. А если комиссия или преподаватели посчитают текст за сгенерированным и не увидят объяснение причин, то работу аннулируют и не будут проверять.</p><p>Почему университеты вводят такие ограничения? Не потому, что боятся технологий, а потому, что защищают сам смысл образования. Для вуза важно не только то, какой текст сдал студент, но и то, кто именно произвёл мысль, аргументацию и вывод.</p><p>Генеративный ИИ разрушает эту прозрачность: работа может выглядеть сильной, хотя реальный вклад автора в неё минимален. Поэтому в ВШЭ запрещают не искусственный интеллект как таковой, а его скрытое использование. Формальное основание — академические нормы университета: ИИ можно применять, но только с обязательным раскрытием, где, как и зачем он использовался. Если же преподаватель видит признаки машинной генерации, а студент этого не указал, работа может быть аннулирована, потому что в глазах университета это уже не технологическая помощь, а нарушение принципа самостоятельности и академической честности.</p><h3>А есть ли плюсы?</h3><p>Эксперты подчеркивают, что синергия человека и искусственного интеллекта способна значительно повысить качество как принимаемых решений, так и творческой деятельности. Интеграция современных инструментов в повседневную работу человека может не только оптимизировать процессы принятия решений, но и открыть новые горизонты для решений сложных задач, тем самым увеличивая общую производительность (<a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC11515803/#:~:text=integration%20can%20enhance%20collaborative%20efforts%2C,problems%2C%20and%20enhanced%20overall%20productivity">Redefining Cognitive Domains in the Era of ChatGPT: A Comprehensive Analysis of Artificial Intelligence’s Influence and Future Implications - PMC</a>).</p><p>Есть свои плюсы и в сфере образования. При правильном подходе LLM могут стать незаменимыми персональными помощниками и наставниками. В сфере обучения и саморазвития ИИ способен адаптироваться к индивидуальному уровню каждого учащегося, оперативно предоставляя обратную связь и подбирая релевантные материалы, что способствует более эффективному усвоению знаний (<a href="https://www.mdpi.com/2075-4698/15/1/6#:~:text=nature%20of%20AI%20in%20cognitive,analyse%20and%20evaluate%20information%20effectively">AI Tools in Society: Impacts on Cognitive Offloading and the Future of Critical Thinking</a>)</p><h3>А что насчет преподавателей?</h3><p>Искусственный интеллект меняет сферу образования изнутри, меняются все процессы. Нейросети упрощают работу педагогов, избавляют их рутинных задач и бюрократии и оставляют время и ресурс на самое важное — живое взаимодействие с учениками, развитие критического мышления и творческого потенциала каждого ребёнка. Меняется и наполнение занятий, учителя и преподаватели меняют формат уроков и дополняют их интерактивными элементами при помощи нейросетей.</p><p>Нейросети действительно могут снимать часть рутины, но не в магическом режиме «нажал кнопку — и школа работает сама». По данным UNESCO, в вузах и образовании ИИ уже используют для подготовки занятий, поддержки оценивания и административных задач; Microsoft и OpenAI в своих материалах для педагогов тоже прямо называют типовые сценарии: черновики планов уроков, квизы, рубрики, варианты обратной связи, адаптацию материалов под разный уровень учеников.</p><p>Нейросети упрощают работу педагога не потому, что «учат вместо него», а потому, что берут на себя часть черновой подготовки. Учитель может за несколько минут получить не готовый идеальный продукт, а основу: план урока, варианты заданий для сильных и слабых учеников, тест с ответами, рубрикатор оценивания, шаблон письма родителям, конспект по новой теме или набор интерактивных упражнений. Меняется и само наполнение занятий: вместо одного стандартного объяснения для всех преподаватель может быстро собрать несколько версий материала — короткую, углублённую, игровую, дискуссионную или встроить в урок квиз, кейс, ролевой сценарий или симуляцию.</p><p>При этом, большинство образовательных организаций остаются консервативными в вопросах новых технологий и не готовы уступать свои рабочие задачи роботам и искусственному интеллекту.</p><figure><img src="https://media.tproger.ru/user-uploads/136344/2026-03-12/b302f0cf-92d2-4907-87d7-6bc1edcaf011.webp" alt="" /></figure><h3>Риски и опасности</h3><p>Мой младший брат освоил нейросети раньше, пока учился в школе и страшно представить какое поколение вырастет из них. Его ровесники и он сам вообще перестали делать домашнее задание и задачи на уроках сами. А зачем, если есть искусственный интеллект, который решит все за секунду?</p><p>Но вместе с удобством пришла и новая проблема — молодые люди всё меньше напрягают мозг, всё чаще доверяют машине и всё реже испытывают радость собственного открытия. Учителя жалуются, что детям трудно формулировать мысли, обосновывать ответы и рассуждать без цифровой подсказки. Замглавы администрации президента Максим Орешкин<a href="https://tass.ru/obschestvo/26295693"> отмечает</a>, что традиционные домашние задания для школьников практически утратили смысл из-за развития технологий искусственного интеллекта. Парадокс в том, что искусственный интеллект, созданный для расширения возможностей человека, постепенно лишает его практики мышления, если не научить пользоваться им осознанно и с умом.</p><p>У подрастающего поколения навыки самостоятельного решения задач не формируются: дети копируют ответы ИИ для домашних заданий, теряя практику логики и анализа. Без цифровой грамотности они слепо верят моделям, рискуя дезинформацией, а привязанность к виртуальным собеседникам тормозит эмпатию и живое общение.</p><p>10 лет назад ГДЗ были в основном складом готовых ответов. Ребёнок брал уже существующее решение, переписывал его и чаще всего оставлял следы: одинаковые формулировки, типовой ход решения, несоответствие своему обычному уровню, привязка к конкретному учебнику или номеру задания. Учитель хотя бы примерно понимал, с чем имеет дело: перед ним списанный ответ.</p><p>На уровне мотивации почти ничего не изменилось: и десять лет назад, и сейчас часть школьников хочет не понять материал, а как можно быстрее сдать работу. ИИ — это уже не склад, а машина по производству правдоподобия. Он не просто даёт готовое решение, а подстраивает его под запрос: может переписать другим стилем, упростить, усложнить, сделать «как будто писал восьмиклассник», добавить ошибки, изменить структуру, даже сымитировать рассуждение. То есть если ГДЗ помогали списать, то ИИ помогает скрыть сам факт списывания.</p><p>Вполне возможно, что массовое использование ИИ студентами и школьниками — это не столько бунт против учёбы, сколько адаптация к системе неадекватной нагрузки? Когда образование превращается в конвейер дедлайнов, отчётов, презентаций и формальных заданий, ученик начинает оптимизировать не мышление, а выживание. В этом смысле нейросеть становится не источником проблемы, а самым удобным ответом на неё. Она позволяет быстро производить тот объём учебного продукта, который система требует, но не успевает осмыслять. ИИ здесь выступает как зеркало: он показывает, сколько в современном образовании осталось настоящего понимания, а сколько — ритуальной занятости.</p><p>Пессимистический прогноз предупреждает, что в течение ближайших десяти лет неконтролируемое и чрезмерное использование LLM может привести к постепенному ослаблению некоторых когнитивных функций у людей. Основной риск – это «когнитивная лень» и утрата навыков вследствие постоянного облегчающего воздействия ИИ, когда человек привыкает получать готовые решения без усилий. Исследователи уже фиксируют тревожные тенденции: чрезмерное доверие результатам, выданным ИИ, способно притуплять критическое восприятие и аналитику,  высказывается обеспокоенность по поводу сужения кругозора и творческого мышления.</p><p>В начале 2025 года в <a href="https://time.com/7295195/ai-chatgpt-google-learning-school/">Media Lab Массачусетского технологического института было проведено исследование</a>, в рамках которого студенты были разделены на три группы и выполняли задание по написанию серии коротких эссе. Первая группа выполняла работу самостоятельно, вторая использовала поисковую систему Google, а третья – языковую модель ChatGPT. В процессе работы проводилась запись электроэнцефалограммы (ЭЭГ) каждого участника.</p><p>Анализ данных, полученных на ограниченной выборке, выявил, что участники, использовавшие ChatGPT, продемонстрировали минимальную мозговую активность, наихудшие результаты по лингвистическим и поведенческим показателям, а также выраженную тенденцию к снижению когнитивной нагрузки по мере написания каждого последующего эссе. При повторном выполнении задания без использования искусственного интеллекта, участники демонстрировали ухудшение памяти относительно ранее написанных текстов и снижение активности ритмов, что свидетельствует об ослаблении глубокой памяти.</p><p>В противоположность этому, студенты, работавшие без использования искусственного интеллекта, демонстрировали повышенную нейронную активность и удовлетворение от процесса. У них наблюдалась активация областей головного мозга, отвечающих за творческое мышление, процессы запоминания и семантическую обработку информации.</p><p>У третьей группы лиц было зафиксировано формирование так называемого когнитивного долга – накопившегося дефицита глубокого обучения, который негативно влияет на способность к критическому анализу и повышает восприимчивость к манипуляциям и поддающимся стереотипным убеждениям.</p><p>Получается, что большинство новых технологий направлены на, чтобы сделать нашу жизнь проще, но из-за этого мы становимся ленивее и страдает наш мозг, творческое мышление и когнитивные функции.</p><h3>Этические и правовые аспекты</h3><p>Технологии уже радикально меняют учебный процесс, а вот нормы, правила и культура обращения с ними заметно отстают. С одной стороны, искусственный интеллект  обещает персонализированное обучение, снижение нагрузки на преподавателей и расширение доступа к качественному контенту, с другой — обостряет старые проблемы академической честности, неравенства и защиты данных и параллельно рождает новые типы злоупотреблений, вроде «делегирования» всего процесса обучения машине.</p><p>Особое внимание следует уделить академической добросовестности и набирающей обороты тенденции «цифрового плагиата». Работы, созданные с использованием генеративных моделей, формально представляются уникальными, однако они не отражают ни трудозатрат, ни глубокого понимания автора, что обесценивает саму концепцию оценивания как способа проверки усвоения учебного материала. В ответ на это образовательные учреждения принимают различные меры: от прямых запретов и попыток обнаружения текстов, созданных искусственным интеллектом, до более продуманного подхода, при котором использование нейросетей интегрируется в учебные задания как допустимый инструмент, а критерием оценки становится не сам факт применения ИИ, а уровень критического осмысления и личный вклад обучающегося.</p><p>Правовое регулирование в данной сфере пока носит фрагментарный характер, особенно в Российской Федерации. Специального законодательства, которое бы целенаправленно регулировало использование ИИ именно в образовании, в настоящее время не существует. Поэтому применяются существующие правовые нормы: Федеральный закон «Об образовании», законодательство о персональных данных, нормы об авторском праве и отдельные нормативные акты, связанные с национальной стратегией развития искусственного интеллекта до 2030 года.</p><p>Это приводит к тому, что многие виды деятельности фактически подпадают под действие законодательства (например, сбор и анализ учебной статистики платформами ИИ или генерация учебных материалов), однако участники образовательного процесса не в полной мере осознают свои права и обязанности, особенно в случаях ошибок, допущенных алгоритмами, или утечек конфиденциальных данных.</p><p>На стыке этических и правовых аспектов постепенно формируется ключевая идея: нейросети не упраздняют роль преподавателя и обучающегося, а значительно повышают ответственность за использование технологий. Если рассматривать ИИ исключительно как инструмент для ускорения текущих процессов, система образования рискует усугубить существующие недостатки и несправедливости, просто в более автоматизированном и менее явном формате.</p><h3>Вывод</h3><p>В фокусе всей дискуссии об искусственном интеллекте в образовании — не технологии, а человек и качество обучения. Нейросети одновременно усиливают лучшие практики (персонализацию, доступность, автоматизацию рутины) и обостряют слабые места системы — неравенство, академическую нечестность, зависимость от готовых ответов и уязвимость персональных данных.</p><p>По моему мнению важно использовать искусственный интеллект с умом, не подменять им свое мышление, а использовать как новый ресурс, который помогает мыслить и обучаться быстрее. Было бы ошибкой впадать и в крайности и демонизировать инструмент. Калькулятор не убил математику, а поисковые системы не уничтожили исследовательское мышление. Искусственный интеллект — это ресурс, и, как любой ресурс, он усиливает то, что уже есть. Если есть мышление — он ускоряет его. Если мышления нет — он маскирует его отсутствие, причём временно. Настоящий вызов не в том, чтобы запретить студентам пользоваться ИИ или разрешить без ограничений. Вызов в том, чтобы научить работать с ним так, как работает хороший специалист: задавать правильные вопросы, проверять ответы, спорить с машиной, а не слепо ей доверять. Не отдавать мышление на аутсорс, а использовать новый инструмент для того, чтобы мыслить глубже и быстрее.</p><p>Главный вывод: искусственный интеллект в школе и вузе должен работать как инструмент развития мышления, а не как сервис по обходу усилий и ответственности. Главное, что надо понять — использовать новые технологии нужно осознанно, использовать искусственный интеллект, как помощник, а не замену собственным мозгам.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как мертвые языки помогают программисту лучше понимать код</title>
      <link>https://tproger.ru/news/kak-mertvye-yazyki-pomogayut-programmistu-luchwe-ponimat-kod</link>
      <comments>https://tproger.ru/news/kak-mertvye-yazyki-pomogayut-programmistu-luchwe-ponimat-kod?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/kak-mertvye-yazyki-pomogayut-programmistu-luchwe-ponimat-kod</guid>
      <description><![CDATA[<p>Мертвые языки тренируют структурное мышление: строгая морфология и формальные правила помогают программисту глубже понимать код</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/kak-mertvye-yazyki-pomogayut-programmistu-luchwe-ponimat-kod">Как мертвые языки помогают программисту лучше понимать код</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 18 Feb 2026 14:40:57 GMT</pubDate>
      <content:encoded><![CDATA[<p>Идея звучит как гуманитарный троллинг: зачем разработчику латынь или древнегреческий?</p><p>Но если убрать романтику и посмотреть на структуру, <a href="https://www.howtogeek.com/why-learning-a-dead-language-can-make-you-a-better-programmer/">становится видно</a> странное сходство. Мертвые языки могут похвастаться строгими правилами, формальными системами и дисциплиной мышления. И в этом они пугающе похожи на программирование.</p><h2>Морфология вместо порядка — как типы вместо позиций</h2><p>В английском все решает порядок слов. Поменял местами — поменял смысл. В латыни или древнегреческом важнее не позиция, а форма слова — окончание. Именно оно показывает, кто субъект, кто объект, кто инструмент действия.</p><p>Чем это похоже на код? Как минимум тем, что поведение объекта определяется его типом и свойствами, а не тем, в какой строке он стоит.</p><p>Когда вы разбираете сложное латинское предложение, вы не можете просто «прочитать слева направо». Приходится держать в голове несколько гипотез, пока финальный глагол не «закроет» всю конструкцию.</p><p>Это тренирует рабочую память и способность декомпозировать структуру.</p><h2>Санскрит как формальная грамматика</h2><p>Санскрит часто называют «инженерным языком древности». Его грамматику описал Панини — почти четыре тысячи правил, работающих как система мета-инструкций.</p><p>Там есть рекурсия. Есть правила, которые применяются к другим правилам. Есть даже строгая формальная логика вывода словоформ.</p><p>По сути, это древний DSL для генерации корректных выражений. Если вам близки алгоритмы и формальные системы, санскрит — это прекрасная «логическая тренировка». Он заставляет мыслить через правила, а не через интуицию.</p><h2>А практический смысл есть?</h2><p>Есть побочный бонус: примерно 60% английской лексики и до 90% научной терминологии имеют латинские и греческие корни. Это не делает вас лучшим разработчиком автоматически, но улучшает понимание терминов и документации.</p><p>Но главный эффект — когнитивный. Когда вы учите язык с жесткой морфологией и формальными правилами, мозг привыкает к структурному мышлению. А программирование — это и есть работа со структурами.</p>]]></content:encoded>
    </item>
    <item>
      <title>Какие навыки в IT будут решающими в 2026 году: разбор по специализациям</title>
      <link>https://tproger.ru/articles/kakie-navyki-v-it-budut-rewayushhimi-v-2026-godu--razbor-po-specializaciyam</link>
      <comments>https://tproger.ru/articles/kakie-navyki-v-it-budut-rewayushhimi-v-2026-godu--razbor-po-specializaciyam?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kakie-navyki-v-it-budut-rewayushhimi-v-2026-godu--razbor-po-specializaciyam</guid>
      <description><![CDATA[<p>Разбираем, какие скилы и знания станут обязательными в 2026 году, что будут ценить работодатели и как новичку не потеряться на входе в ИТ-индустрию
</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kakie-navyki-v-it-budut-rewayushhimi-v-2026-godu--razbor-po-specializaciyam">Какие навыки в IT будут решающими в 2026 году: разбор по специализациям</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Карьера]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Маркетинг]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 17 Dec 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Российский IT-рынок продолжает расти, но требования к специалистам меняются быстрее, чем многие успевают адаптироваться. Импортозамещение заставляет компании переходить на отечественные платформы, ИИ внедряется во все процессы, а гибридная работа стала стандартом. При этом начинающие специалисты часто совершают одну и ту же ошибку: хватаются за случайные курсы и не понимают, какие навыки реально влияют на трудоустройство и зарплату.</p><p>По данным World Economic Forum, 44% профессиональных навыков обновятся к 2027 году. Елена Соколова, Product Owner в Компьютерной Академии ТОП (ранее работала карьерным консультантом в Яндекс Практикуме и Нетологии, реализовывала проекты в Carlsberg Group, Лента, РЖД, Danone), за 850+ часов консультаций помогла специалистам устроиться в Яндекс, EPAM, МТС, Сбер и Ozon. Основная проблема, которую она видит: люди учатся хаотично, не понимая системы.</p><p>Разбираемся, какие компетенции станут обязательными в 2026 году и как они связаны между собой.</p><p>Первый блок — универсальные навыки, которые нужны всем, второй — техническая специализация по направлениям, третий — навык-усилитель для тех, кто хочет системно влиять на продукт и процессы.</p><h2>Универсальные навыки: фундамент для всех направлений</h2><p>Рынок требует не десять абсолютно разных скиллов, а три связанных блока компетенций. Первый — универсальные навыки, без которых сложно расти в любом направлении IT.</p><h3>Когнитивное лидерство</h3><p>Аналитическое и креативное мышление заняли первое и второе места в рейтинге навыков будущего по версии World Economic Forum 2024. Это способность разбирать сложные задачи на части, находить нестандартные решения и выстраивать логические цепочки. Вдобавок — устойчивость, гибкость и любознательность: качества, которые помогают адаптироваться к меняющимся требованиям рынка и осваивать новые инструменты.</p><blockquote>На консультациях часто встречаются сильные технические специалисты, которые застревают на одной позиции годами. Проблема не в недостатке знаний кода, а в неумении анализировать карьерную ситуацию и принимать решения в условиях неопределенности.</blockquote><p><b>Как развивать: </b>решайте задачи на алгоритмы на LeetCode или Codewars, участвуйте в хакатонах, разбирайте чужой код на GitHub и пытайтесь объясняйть логику решений.</p><h3>Техно-гуманитарная грамотность</h3><p>IT-специалист в 2026 году необязательно должен быть разработчиком, но должен понимать, как работают технологии и как правильно ставить им задачи. Грамотность в области ИИ и больших данных (AI &amp; Big Data Literacy) заняла седьмое место в рейтинге WEF — это умение сформулировать запрос к нейросети, оценить качество данных, выбрать подходящий инструмент для задачи.</p><p>Продакт-менеджер, который понимает принципы работы машинного обучения, может грамотно поставить задачу дата-сайентисту: объяснить, какие метрики важны, какие данные доступны и какой результат нужен бизнесу. Без этого понимания команда тратит недели на уточнения и переделки.</p><blockquote>На собеседованиях в топовые компании проверяют не только технические знания, но и умение объяснить, как технология решает бизнес-задачу. Кандидат может знать Python, но если он не понимает, зачем компании нужна автоматизация, это становится проблемой.</blockquote><p><b>Как развивать: </b>экспериментируйте с ChatGPT, Claude или Gemini, изучайте основы работы с API, читайте документацию инструментов, которыми пользуетесь ежедневно.</p><p>Для тех, кто хочет системно освоить работу с ИИ, существуют специализированные программы — например, <a href="http://top-academy.ru/education/master-neural">«Нейросети для увеличения дохода»</a> и <a href="http://top-academy.ru/education/artificial-intelligence-for-life">«Искусственный интеллект для жизни» </a>в Академии ТОП учат не просто генерировать контент, а ставить корректные задачи моделям и интегрировать их в рабочие процессы.</p><h3>Эмоциональный интеллект</h3><p>Чем больше команд работает удаленно и чем активнее ИИ забирает рутинные задачи, тем выше ценность навыков, которые невозможно автоматизировать. Эмпатия, активное слушание и лидерство социального влияния заняли восьмое и девятое места в рейтинге World Economic Forum. Эти компетенции помогают выстраивать сотрудничество, разрешать конфликты и вести команду к результату.</p><p>Тимлид замечает, что разработчик стал медленнее закрывать задачи и меньше общается в чате. Специалист с развитым эмоциональным интеллектом не отправляет формальное сообщение о несоблюдении сроков, а назначает личный созвон, выясняет причину и помогает решить проблему до того, как она повлияет на проект.</p><blockquote>В большинстве случаев решающим фактором было не только знание технологий, но и умение объяснить решение понятным языком и продемонстрировать навыки командной работы. Научить фреймворку можно за месяц, научить человека слушать и договариваться значительно сложнее.</blockquote><p>В удаленных командах эмоциональный интеллект становится критичнее: нет невербальных сигналов, сложнее считывать настроение, легче возникают недопонимания.</p><p><b>Как развивать: </b>давайте и запрашивайте обратную связь у коллег, анализируйте конфликты, наблюдайте за тем, как опытные менеджеры ведут сложные переговоры.</p><h3>Селф-менеджмент</h3><p>Мотивация и самосознание заняли четвертое место в рейтинге навыков будущего по версии World Economic Forum. Это способность управлять собственными ресурсами, удерживать фокус в условиях постоянных переключений и не выгорать при плотных дедлайнах.</p><p>Один специалист работает восемь часов, но половину времени тратит на переключения между задачами, проверку уведомлений и созвоны. Другой выделяет два часа глубокой работы утром, когда концентрация максимальна, закрывает мессенджеры и за это время делает больше. При одинаковом стеке технологий второй получает повышение быстрее, потому что стабильно выдает результат.</p><blockquote>Понимания своих триггеров выгорания и умения вовремя установить границы. Специалисты, которые работали на износ и брали все задачи подряд, часто уходили из профессии через полгода. Те, кто умел выстраивать границы, отказываться от неприоритетных задач и распределять нагрузку, строили долгосрочную карьеру.</blockquote><p><b>Как развивать:</b> отслеживайте время, которое тратите на разные типы задач, анализируйте, в какое время дня вы наиболее продуктивны, и планируйте сложные задачи на эти часы. Учитесь отказываться от задач, которые не влияют на ключевые метрики проекта.</p><h2>Специализация: что нужно знать по направлениям</h2><p>Универсальные навыки — это фундамент, но на рынке труда оценивают конкретные компетенции. Требования различаются в зависимости от направления, но общая тенденция одна: работодатели ждут не просто знания инструментов, а понимания, как эти инструменты решают бизнес-задачи.</p><h3>Программист</h3><p>В 2026 году от разработчиков по умолчанию ждут уверенной работы с вебом, API, инструментами разработки и базовой архитектурой. Вот что стало обязательным минимумом для позиции Junior:</p><ul><li>Базовое программирование: переменные, циклы, функции, основы объектно-ориентированного программирования, уверенное владение хотя бы одним языком — Python, JavaScript, Java или C#. Плюсом идут TypeScript, Go или Kotlin.</li><li>Веб и API: понимание протокола HTTP, работа с REST и JSON, базовые знания GraphQL, HTML и CSS для понимания фронтенда, SQL и основы NoSQL-баз данных. Тренд 2026 года — реактивные API и стриминг-данные в реальном времени.</li><li>Инструменты разработки: Git для контроля версий, базовое понимание CI/CD, умение работать с Docker для контейнеризации приложений, навыки деплоя в облако хотя бы на базовом уровне.</li><li>Алгоритмы и структуры данных: работа с массивами, списками, хэш-таблицами, понимание основных алгоритмов сортировки и поиска, базовое представление о сложности алгоритмов (нотация Big O).</li></ul><p>Многое зависит от направления. Во фронтенде нужны JavaScript или TypeScript и React, в бэкенде — Python, Java или Go. Важный момент: импортозамещение делает обязательным опыт работы с отечественными платформами. В вакансиях на позицию Junior Backend Developer все чаще встречается требование знания Yandex Cloud или VK Cloud — это уже не плюс в резюме, а базовое ожидание.</p><blockquote>Часто встречаю резюме, где перечислены десять языков программирования, но кандидат не может объяснить базовые принципы работы. Работодатели проверяют не количество технологий в резюме, а глубину понимания. Лучше знать один стек хорошо, чем пять поверхностно.</blockquote><p>Для тех, кто выбирает разработку как основное направление, важна структурированная база. Программы по программированию в Академии ТОП дают практический стек под востребованные языки — от <a href="http://top-academy.ru/education/python">Python</a> до <a href="http://top-academy.ru/education/java-development">Java</a> — с проектами в портфолио и помощью в трудоустройстве.</p><h3>Дизайнер</h3><p>Среди множества направлений дизайна — графического, UX/UI, 2D, 3D, motion, интерьерного — веб остается одним из самых востребованных. В 2026 году от веб-дизайнера ждут базовых умений работать с Figma, понимания технологий, данных и того, как меняется пользовательский опыт.</p><ul><li>Работа с ИИ: умение ставить задачи моделям и оценивать результат. ИИ не заменяет дизайнера, но специалист, который не умеет его использовать, проигрывает в скорости.</li><li>Адаптивный дизайн: проектирование интерфейсов под разные устройства и разрешения экрана, понимание сеток и основ HTML/CSS.</li><li>Знание UX/UI: построение удобных пользовательских сценариев, навигации, проведение базового юзабилити-тестирования.</li><li>Базовое понимание кода: не обязательно писать код самостоятельно, но понимать, как работают HTML, CSS и JavaScript, чтобы грамотно общаться с разработчиками и не предлагать решения, которые невозможно реализовать.</li><li>Интерактив и анимация: применение CSS/SVG-анимаций и простых эффектов для повышения вовлеченности пользователей.</li><li>Системное мышление: понимание связи данных, логики и поведения пользователя.</li></ul><blockquote>Дизайнеры, которые понимают, как работает код, получают офферы на 30-40% выше рынка. Они говорят с разработчиками на одном языке и экономят недели на правках.</blockquote><p>Освоить веб-дизайн с учетом требований 2026 года можно на практических программах — <a href="http://top-academy.ru/education/web-design">курс по веб-дизайну в Академии ТОП </a>обновляется под актуальные требования рынка и включает работу с адаптивностью, основами кода и UX/UI-проектированием.</p><h2>Маркетолог</h2><p>Маркетолог в IT — это связующее звено между продуктом, аудиторией и цифрами. В 2026 году нужно понимать, что стоит за данными, как работает автоматизация и где ИИ действительно помогает.</p><ul><li>Аналитика и данные: умение читать цифры (конверсии, retention, LTV), сегментировать аудиторию по поведению, работать с инструментами аналитики.</li><li>Креатив: генерировать идеи и использовать новые форматы.</li><li>Автоматизация и CRM: настройка email-цепочек, триггерных сообщений, персонализации контента в зависимости от действий пользователя.</li><li>Понимание целевой аудитории: изучение поведения пользователей, построение customer journey map, создание точных предложений на основе данных.</li><li>Личный бренд: активность в digital-среде и профессиональных сообществах.</li><li>Работа с ИИ: умение ставить задачи моделям для генерации контента и проверять результаты на фактические ошибки.</li><li>Системное мышление: понимание того, как маркетинговые решения влияют на продукт, продажи и техподдержку.</li></ul><p>Специалист должен быть с аналитическим мышлением, который сначала проверяет, куда ведет ссылка, насколько релевантно предложение сегменту аудитории и нет ли технических проблем на посадочной странице. Без этого подхода бюджет уходит на A/B-тесты, которые не дают результата.</p><p>Для системного понимания digital-маркетинга существуют программы, которые учат работать с данными, автоматизацией и ИИ — курсы по<a href="http://top-academy.ru/education/adults/marketing"> маркетингу в Академии ТОП </a>помогают собрать портфолио под реальные задачи и освоить современные инструменты аналитики.</p><h2>Системное мышление и программирование: навык-усилитель</h2><p>Программирование никуда не исчезло — оно стало глубокой специализацией. Навык критически важен для аналитиков, дата-сайентистов, продуктологов, digital-маркетологов и специалистов по автоматизации. World Economic Forum не включает его в топ-10 универсальных навыков, потому что это компетенция для конкретных ролей, но именно она дает значительное преимущество.</p><h3>Почему программирование важно в 2026 году</h3><ol><li>Основа для работы с ИИ и данными. Продвинутые промты для GPT напоминают программирование. Чтобы интегрировать модель в продукт или дообучить ее, нужно знание языков — например, Python. Дата-аналитик, который умеет писать SQL-запросы и Python-скрипты, обрабатывает данные значительно быстрее того, кто работает только в Excel.</li><li>Прямое воздействие на бизнес-метрики. Написание скрипта для автоматизации еженедельного отчета экономит восемь человеко-часов в неделю. Создание простого чат-бота на Python снижает нагрузку на службу поддержки на 30%.</li><li>Язык создания цифровых продуктов. Понимание того, как работают бэкенд и фронтенд, позволяет менеджерам, маркетологам и продуктологам ставить технически грамотные задачи и говорить на одном языке с разработчиками.</li><li>Страховка от поверхностной автоматизации. No-Code инструменты хорошо решают типовые задачи. Но когда нужна кастомизация, сложная логика или интеграция несовместимых систем, без кода не обойтись. Специалист, который знает код, решает задачи, недоступные другим.</li></ol><p>Программирование в 2026 году — это не про то, чтобы стать разработчиком мирового уровня. Это про системное мышление, возможность создавать решения и глубоко влиять на цифровую среду. Это навык для тех, кто хочет не просто адаптироваться к изменениям, а активно влиять на них.</p><h3>Частые вопросы</h3><h4>Можно ли войти в IT без технического образования?</h4><p>Да. Многие направления доступны новичкам без знания математики. Важнее базовая цифровая грамотность, аналитическое мышление и умение работать с ИИ даже на пользовательском уровне.</p><h4>Какие навыки прокачивать в первую очередь?</h4><p>Базовую цифровую грамотность, аналитическое мышление и умение работать с ИИ. Эти компетенции универсальны и применимы в любом направлении IT.</p><h4>Насколько важен английский в 2026 году?</h4><p>На старте достаточно уровня B1 для чтения документации и работы с инструментами. Для международных команд потребуется B2 и выше.</p><h4>Станут ли ИИ-инструменты угрозой для специалистов?</h4><p>Нейросети автоматизируют рутину и становятся помощниками, а не конкурентами. Специалисты, которые умеют работать с ИИ как с инструментом, получают преимущество перед теми, кто их игнорирует.</p><p>В 2026 году на рынке нужны специалисты, которые понимают IT шире своей роли и умеют сочетать технические компетенции с софт-скиллами. Сфокусируйтесь на универсальных навыках для фундамента, выберите специализацию под конкретное направление и при желании углубиться в технологии — добавьте программирование как навык-усилитель. Ваша карьера в IT зависит от того, насколько правильно вы подходите к обучению сегодня.</p><p><i>Реклама. Рекламодатель АНО ДПО «Академия Топ», ИНН 7730257499, erid: 2W5zFJ5yya8</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Почему нейросети забывают старое, когда учатся новому? Как ученые пытаются это решить</title>
      <link>https://tproger.ru/articles/pochemu-nejroseti-zabyvayut-staroe--kogda-uchatsya-novomu--kak-uchenye-pytayutsya-eto-rewit</link>
      <comments>https://tproger.ru/articles/pochemu-nejroseti-zabyvayut-staroe--kogda-uchatsya-novomu--kak-uchenye-pytayutsya-eto-rewit?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/pochemu-nejroseti-zabyvayut-staroe--kogda-uchatsya-novomu--kak-uchenye-pytayutsya-eto-rewit</guid>
      <description><![CDATA[<p>О катастрофическом забывании: почему модели теряют навыки и что делать разработчикам</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/pochemu-nejroseti-zabyvayut-staroe--kogda-uchatsya-novomu--kak-uchenye-pytayutsya-eto-rewit">Почему нейросети забывают старое, когда учатся новому? Как ученые пытаются это решить</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 26 Nov 2025 12:10:02 GMT</pubDate>
      <content:encoded><![CDATA[<p><i>Эта статья адаптация англоязычного материала The Amnesia Problem: Why Neural Networks Can’t Learn Like Humans (rewire.it)</i></p><h2>Что такое катастрофическое забывание</h2><p>Представьте пианиста, который десять лет играл классику, а потом решил освоить джаз. На первом уроке джаза он вдруг полностью забывает Баха, а уже через неделю больше не помнит простейших гамм.</p><p>В машинном обучении это явление называют <b>катастрофическим забыванием</b>. Нейросеть, когда обучается на новой задаче, стирает знания о старой, и это не сбой конкретной архитектуры или фреймворка — это особенность самого способа обучения нейросетей.</p><h2>Как выглядит забывание на практике</h2><p>Возьмём простую ситуацию. Мы обучаем нейросеть распознавать собак (Задача A) — она показывает 95% точности, потом даём ей новую задачу — классифицировать котов (Задача B). После обучения по новой выборке сеть отлично отличает котов (92%), но если снова проверить её на собаках — точность падает с 95% (как было изначально на собаках) до 10%, <b>то есть до уровня случайного угадывания.</b></p><p>Это не потому, что у сети не хватает параметров. Исследования показывают: ёмкости модели достаточно, чтобы хранить знания по обеим задачам. Проблема в другом — <b>в том, как работает градиентный спуск.</b></p><h2>Почему обучение стирает старое</h2><p><b>Градиентный спуск </b>видит только текущие ошибки и стремится минимизировать функцию потерь именно для новой задачи. То, что было важно для старой, в этот момент не учитывается.</p><p>Во время обучения сеть перемещается по пространству весов, чтобы найти минимум потерь. Для Задачи A она находит подходящее устойчивое решение. Когда приходит Задача B, алгоритм начинает с тех же весов, но дальше шаг за шагом уводит их в новое направление под новую цель. Многие параметры для старой задачи при этом переписываются.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-11-13/3fa86c56-fc84-42d6-a6a4-90fb8f188666.png" alt="" /><figcaption>Рисунок 1: Как меняются параметры сети при обучении на двух задачах. Сначала сеть находит настройки для задачи A (зелёный квадрат), потом начинает учиться задаче B и уходит к новым настройкам (синий квадрат). При этом старые знания стираются.</figcaption></figure><p>В итоге то, что помогало распознавать собак, оказывается теперь непригодным для собак, а подходит только для котов. Алгоритм не учитывает, как теперь работает старая задача — он смотрит только на текущие задачи.</p><h2>Дилемма стабильности и пластичности</h2><p>Чтобы понять, почему катастрофическое забывание вообще возникает, нужно вспомнить о главной проблеме — <b>дилемме стабильности и пластичности. </b>Это правило работает не только для нейросетей, но и для любых систем, которые учатся последовательно.</p><p><b>Пластичность</b> — это способность учиться новому. Когда сеть встречает новую задачу, ей нужно быть гибкой, менять веса и быстро подстраиваться под новые данные.</p><p><b>Стабильность</b> — противоположное качество: умение сохранять старые знания, не давая им разрушиться при каждом обновлении весов.</p><p>Проблема в том, что нельзя увеличить и стабильность, и пластичность одновременно. Если сеть слишком гибкая — она хорошо впитывает новое, но моментально забывает старое. Если наоборот — слишком стабильная, то перестаёт учиться и застывает на месте.</p><p>Это ограничение встроено в саму природу обучения через распределённые параметры. Каждый нейрон обновляет свои веса локально, исходя только из текущей ошибки. И те же механизмы, что помогают сети адаптироваться к новому, одновременно приводят к тому, что старое знание постепенно стирается.</p><h2>Потеря геометрии ландшафта: почему архитектура нужна</h2><p>Чтобы понять, почему одни нейросети подвержены катастрофическому забыванию сильнее других, нужно разобраться в процессе оптимизации. Во время обучения модель корректирует миллионы параметров, минимизируя функцию потерь. Этот процесс можно визуализировать как перемещение по многомерному ландшафту потерь (loss landscape), где каждая точка представляет уникальную конфигурацию весов.</p><p>Ландшафт потерь состоит из областей с разными значениями функции потерь:</p><ul><li><b>Локальные минимумы </b>— области с низким значением потерь, где модель показывает хорошее качество</li><li><b>Высокие области </b>— конфигурации параметров с большой ошибкой</li></ul><p>При обучении на первой задаче (например, классификация собак) модель сходится к одному минимуму. При переходе ко второй задаче (классификация кошек) градиентный спуск направляет модель к совершенно другому минимуму, который может быть далеко от первого. Это приводит к перезаписи весов и потере знаний из предыдущей задачи.</p><p>Критический фактор — геометрия этих минимумов. В одних архитектурах минимумы узкие и острые (sharp minima) — небольшое возмущение параметров резко увеличивает функцию потерь. В других минимумы широкие и плоские (flat minima) — модель более устойчива к изменению весов.</p><p>Исследования показали, что архитектуры с skip connections, например ResNet, как раз формируют такие плоские минимумы — это делает их более устойчивыми к изменению весов, даже когда модель дообучается на новой задаче, её настройки остаются близки к старым, и забывание происходит не так сильно.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-11-13/577b1e05-d21a-4961-8c59-4dcb41ee428b.png" alt="" /><figcaption>Рисунок 2: Сравнение сетей по устойчивости. Обычные сети создают хрупкие решения (слева) — малейшие изменения ломают старые знания. ResNet‑архитектуры (справа) формируют более плавные, устойчивые решения, поэтому забывают меньше при дообучении.</figcaption></figure><p>Это объясняет, почему современные архитектуры забывают меньше старых. У них принципиально другое устройство процесса обучения — более стабильное, которое труднее случайно сломать при добавлении новых задач.</p><h2>Как нейроны конкурируют друг с другом</h2><p>Внутри нейросети каждый нейрон отвечает за определённые признаки, когда сеть обучается распознавать собак, одни нейроны начинают реагировать на уши, другие — на форму морды или лапы. Это и есть специализация — каждый нейрон берёт на себя свою часть работы.</p><p>Но когда мы начинаем дообучать ту же сеть на новой задаче, например на распознавании котов, часть этих же нейронов переиспользуется. Теперь они начинают подстраиваться под морды котов, их уши и хвосты. Постепенно сеть перенастраивает внутренние связи так, чтобы быть полезной для новой задачи, и старые навыки теряются.</p><p>Нейронам не могут одинаково хорошо специализироваться и на собаках, и на котах. Одни и те же группы нейронов работают на разные задачи, из‑за чего старая специализация стирается.</p><p>Исследования показывают, что если две задачи активируют одну и ту же часть нейронов, эффект забывания становится сильнее — до 40–50%. Получается, сеть забывает не из‑за нехватки параметров, а потому что внутренние ресурсы перекрываются. Она просто переучивает старые нейроны на новую роль и не создает новые.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-11-13/2f287dfd-ebc2-493e-8ebf-a212444f507a.png" alt="" /><figcaption>Рисунок 3: Специализация нейронов и конкуренция. Когда задача B активирует 70% тех же нейронов, что и задача A, катастрофическое забывание увеличивается на 45% по сравнению с задачами, где перекрытие составляет всего 30%.</figcaption></figure><h2>Почему повторное обучение не спасает</h2><p>Можно подумать, что проблему легко решить: просто чередовать старую и новую задачу. Сначала немного обучаем сеть на собаках, потом на котах, потом снова на собаках — и так по кругу. Это действительно помогает, но не решает проблему полностью.</p><p>Когда сеть обучается на новой задаче, обновление весов всё равно изменяет параметры, которые нужны для старой. Даже если повторно возвращать старые данные, оптимизатор начнёт переписывать часть старых знаний. Эффект забывания уменьшается, но не исчезает.</p><p>Кроме того, такое обучение становится дорого по ресурсам. Нужно хранить старые выборки, чередовать их с новыми, настраивать порядок подачи данных. Это не подходит для потоковых систем, где задачи появляются одна за другой, или для областей с ограничениями по хранению данных, например, банковская сфера или медицина.</p><h2>Как разработчики пытаются найти баланс</h2><p>На практике <b>дилемма стабильности и пластичности </b>проявляется в выборе параметров обучения. Например, в методе регуляризации разработчики могут настроить, насколько сильно защищать старые данные от изменения.</p><p>Если усилить регуляризацию — старые знания лучше сохранятся, но сеть хуже будет учиться новому. Если ослабить — сеть быстро впитает новую задачу, но забудет старую. Получается постоянный выбор: жертвовать старым или новым.</p><p>Любая точка на этом спектре — компромисс. Нет такого параметра, который позволит и запомнить всё прошлое, и учиться на будущем — на данный момент, это главное ограничение.</p><p>Хуже того, что даже если удаётся сохранить старые знания, появляется другая проблема. После обучения на множестве последовательных задач сеть теряет саму способность учиться. Её нейроны либо перестают реагировать на новые данные, либо повторяют одну и ту же реакцию.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-11-13/1f9d2a7d-cf7a-4062-8b70-813a7a4c3f17.png" alt="" /><figcaption>Рисунок 4: Компромисс между устойчивостью и пластичностью. Граница Парето (пунктирная кривая) представляет собой теоретический предел. Разные методы занимают разные позиции: стандартный SGD отдаёт приоритет пластичности, EWC уравновешивает оба фактора, Experience Replay максимизирует устойчивость. Ни один метод не может одновременно максимизировать оба фактора.</figcaption></figure><h2>Методы борьбы с забыванием</h2><p>Исследователи разработали несколько способов снизить катастрофическое забывание. Но ни один из них не решает проблему полностью — у каждого есть свои ограничения.</p><h3>Elastic Weight Consolidation (EWC) — защита важных весов</h3><p>Это метод, который старается определить, какие параметры критичны для предыдущей задачи, и защищает их от сильных изменений. Когда сеть дообучается на новой задаче, алгоритм смотрит: если какой-то параметр был очень важен для собак, его не надо сильно менять при обучении на котах.</p><p>Звучит хорошо, но есть минусы. Вычислять важность параметров дорого по ресурсам, и метод всё равно не гарантирует полного сохранения знаний.</p><h3>Rehearsal — повторение старых примеров</h3><p>Этот способ работает просто: сеть хранит в памяти часть примеров из старой задачи и время от времени подмешивает их при обучении на новой. Это снижает забывание, но требует хранить старые данные, что может быть невозможно из-за ограничений по памяти или приватности.</p><h3>Архитектурные подходы — разные задачи, разные параметры</h3><p>Самый радикальный способ — выделить разные части сети под разные задачи. Тогда обучение одной задачи вообще не трогает другую, потому что используются разные параметры. Забывания нет, но сеть становится огромной — чем больше задач, тем больше параметров.</p><p>HyperMask (2024 год) использует специальные маски, которые позволяют переиспользовать до 85% параметров между задачами, сохраняя изоляцию.</p><h4>Современные гибридные методы</h4><p>CURLoRA — метод, который комбинирует математическое разложение матриц с ограничениями при дообучении. Он показывает хорошие результаты на больших языковых моделях: например, для модели Mistral 7B удалось снизить ухудшение с 53 896 до 5,44 по метрике perplexity. Но такие методы заточены под конкретные модели и не всегда переносятся на другие архитектуры.</p><h3>Пример на практике</h3><p>Простой эксперимент на PyTorch показывает, как это выглядит. Сеть обучается на двух задачах: сначала на A, потом на B. Полный код доступен в <a href="https://rewire.it/blog/the-amnesia-problem-why-neural-networks-cant-learn-like-humans/index.html">оригинале в файле catastrophic-forgetting-demo.py</a>.</p><p><b>Без защиты:</b> точность на старой задаче падает с 93,6% до 53,6% — потеря 40%.</p><p><b>С методом EWC: </b>точность падает с 91,8% до 74,4% — потеря 17,4%, что на 52% лучше. Но на новой задаче EWC тормозит обучение: вместо 95,6% получается только 73,8%.</p><p>Здесь видно главное: в каждом методе нужно выбирать чем жертвовать. Либо памятью, либо вычислением, либо производительностью на новой задаче. Вы не решаете проблему катастрофического забывания полностью, вы только управляете ею.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-11-13/87f517dd-3e18-4591-9edf-e66d69fa9aec.png" alt="" /><figcaption>Рисунок 5: Каждый метод защиты от забывания требует жертв. Регуляризация быстрая, но слабая. Повторение старых примеров эффективнее, но нужна память. Архитектурное разделение не даёт забыть ничего, но увеличивает ёмкость модели.</figcaption></figure><h2>Как катастрофическое забывание проявляется в продакшене</h2><p>В реальных системах катастрофическое забывание выглядит не как внезапный сбой, а как <b>постепенное ухудшение работы — дрейф модели.</b> Модель, обученная на прошлых данных, уверенно работает сегодня, но через пару месяцев начинает ошибаться. Это и есть то же самое забывание, только в замедленном виде.</p><p>Исследования показывают, что 75% компаний сталкиваются с падением качества моделей без постоянного мониторинга.</p><p>Если модель полгода не обновлять, ошибки на новых данных вырастают примерно на треть. А если просто дообучать её на новых данных, часто улучшается работа на свежих примерах, но при этом падает точность на старых — классическая форма забывания.</p><p>В итоге разработчику приходится выбирать из двух зол: <b>либо держать несколько моделей под разные типы данных, либо мириться с тем, что качество со временем падает.</b> Некоторые компании даже полностью переобучают модели каждый месяц, чтобы вернуть стабильность, хотя это дорого.</p><p>Понимание механизма забывания помогает объяснить, почему идея «просто дообучить модель на новых данных» не работает. Это также оправдывает сложные и затратные пайплайны мониторинга, проверки метрик и периодического переобучения.</p><p>Например, в рекомендательных системах забывание снижает точность старых сегментов пользователей на 20–25%. В медицинском AI модели, обновленные на новых пациентах, теряют около 18% точности на старых группах — и это уже риск для качества диагностики.</p><p>Для инженеров это значит одно: катастрофическое забывание — не теоретическая проблема. Это реальный фактор, который нужно учитывать, если вы строите систему, которая учится на живых данных.</p><h2>Новые подходы: не бороться, а обойти проблему</h2><p>Исследователи всё больше приходят к выводу, что катастрофическое забывание нельзя вылечить напрямую. Вместо этого стоит менять сам способ, как модели обучаются и обновляются.</p><p>Сегодня развиваются три основных направления:</p><h3>1. Непрерывное предобучение</h3><p>Модель постоянно обновляет свои знания, когда появляются новые данные, но делает это аккуратно — чередуя новую информацию со старой из кеша. Такой подход сохраняет примерно 90–95% исходных способностей модели, при этом добавляя свежие знания.</p><h3>2. Непрерывное дообучение (fine-tuning)</h3><p>Здесь используется идея модульности: новая задача обучается поверх базовой модели, но сама база остаётся “замороженной”. Получается, что каждая дополнительная функция подключается как надстройка, не ломая основную логику. Это похоже на плагины, где каждая новая задача — отдельный модуль, не влияющий на предыдущие.</p><h3>3. Множество моделей вместо одной</h3><p>Третий подход — вообще отказаться от идеи универсальной модели, которая знает всё. Вместо этого создают ансамбли: набор специализированных моделей, которые работают вместе. Каждая отвечает за свой участок задачи, и таким образом проблема забывания просто не возникает — разные знания не мешают друг другу.</p><p>Все три подхода не устраняют забывание напрямую, но делают его несущественным. По факту вам просто нужны разные модели под разные задачи.</p><p>Если вы никогда не будете обучать одну и ту же модель сначала на задаче A, а затем на задаче B, проблема забывания исчезает.</p><p>Это немного философское наблюдение: не пытаться побороть ограничение, а выстраивать архитектуру вокруг него.</p><h2>Вопросы, которые остаются</h2><h3>Существует ли математический предел, ниже которого забывание уже невозможно снизить?</h3><p>Некоторые исследования указывают на такие пределы, но точные границы пока не найдены.</p><h3>Как выбирать баланс между стабильностью и пластичностью?</h3><p>Сейчас это делается вручную через подбор параметров методом проб и ошибок. Но нет чёткого понимания, как именно рассчитать оптимальный баланс для конкретной задачи.</p><h3>Влияет ли размер модели на забывание?</h3><p>Практика показывает, что большие модели забывают меньше, но почему это происходит и как именно зависит сила забывания от размера — неясно.</p><h3>Можем ли мы достичь теоретического максимума?</h3><p>Даже если знать предел, можно ли разработать процедуру обучения, которая его достигает? Сейчас методы работают примерно на 70% от теоретически возможного оптимума.</p><h3>Как ведут себя большие модели?</h3><p>Ранние данные показывают, что большие модели забывают данные по-другому, чем маленькие сети. Но системного описания этих различий пока нет.</p><p>Эти вопросы нужны, потому что от них зависят архитектурные решения. Если бы мы могли точно рассчитать границу забывания, можно было бы строить системы с запасом прочности. Если бы умели находить оптимальный баланс, не пришлось бы подбирать параметры вручную.</p><h2>Выводы, которые можем сделать</h2><p>Катастрофическое забывание — не техническая ошибка, которую можно исправить очередным алгоритмом. Это фундамент того, как работают распределённые системы обучения.</p><p>Дилемма стабильности и пластичности встроена в саму природу нейросетей. Каждый нейрон обновляет свои веса на основе текущей задачи, и механизма для сохранения прошлого просто нет. То же свойство, что позволяет сети учиться, одновременно делает её уязвимой перед забыванием.</p><p>Это означает, что правильная постановка задачи — не «как победить забывание», а «как управлять им осознанно». В одних случаях важна стабильность — сохранить старые знания любой ценой. В других важна гибкость — быстро учиться новому. Большинство реальных систем требует баланса.</p><p>Для разработчиков, которые работают с продакшен ML, это значит следующее: последовательное обучение сложнее одноразового обучения в принципе, и никакой алгоритм этого не изменит. Системы, которые хорошо справляются с меняющимися данными, не пытаются впихнуть всё в одну модель. Они признают ограничение и строятся вокруг него — с мониторингом, переобучением, специализированными моделями или ансамблями.</p>]]></content:encoded>
    </item>
    <item>
      <title>Устраиваем свой Data QA с PyTest и фикстурами</title>
      <link>https://tproger.ru/articles/kak-testirovat-perenos-i-transformaciyu-dannyh-bez-boli</link>
      <comments>https://tproger.ru/articles/kak-testirovat-perenos-i-transformaciyu-dannyh-bez-boli?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Елизавета Якушева]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-testirovat-perenos-i-transformaciyu-dannyh-bez-boli</guid>
      <description><![CDATA[<p>Рабочий подход к тестированию трансформации данных в ETL-процессах. На примере Python-проекта с pytest, allure и psycopg2 демонстрируется, как автоматизировать создание и наполнение таблиц, хранить схемы и данные, а затем сравнивать результат. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-testirovat-perenos-i-transformaciyu-dannyh-bez-boli">Устраиваем свой Data QA с PyTest и фикстурами</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Форматы хранения данных]]></category>
      <category><![CDATA[Анализ данных]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 01 Sep 2025 12:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Как тестировать перенос и трансформацию данных без боли</h2><p>Я всё думаю над тем, о чём говорить на своём канале. Казалось бы, инфы в интернете — вагон и маленькая тележка: бери, читай, вдохновляйся. Но вот что удивительно — про то, как тестировать данные, как они перетекают из одной таблицы в другую и не превращаются в тыкву, пишут мало.</p><p>А зря.</p><p>За свою практику я встречала разные подходы к организации Data QA. В этой статье я расскажу про самый простой и быстрый вариант, который можно «собрать на коленке», а потом уже развивать. С примерами кода и тем, зачем SQL нам нужен в этой жизни.</p><p>И небольшой дисклеймер. Если вы знаете, как сделать это на Python стильно модно молодежно, обязательно напишите мне об этом в комментариях, я с удовольствием почитаю про ваш подход.</p><p>Также подписывайтесь на мой ТГ, который я почти не веду. <br /><br /></p><h2>Базовый сценарий</h2><ol><li>Есть таблица-источник source_table.</li><li>Разработчик запускает свой код (Spark, Airflow или что у него там), и данные магическим образом перекладываются + преобразуются.</li><li>На выходе получаем result_table.</li></ol><p>Вопрос: как это тестировать?</p><h3>Самый быстрый и простой путь</h3><p>Подготовка:</p><ol><li>Создаём таблицу-источник.</li><li>Наполняем её данными (синтетика или реальные примеры с прода).</li></ol><p>Действие:</p><ol><li>Запускаем ETL код.</li><li>Сравниваем данные «как было» и «как стало».</li></ol><p>После теста:</p><ol><li>Удаляем таблицу-источник.</li><li>Удаляем таблицу-приёмник.</li></ol><p>На коленке это можно собрать так:</p><ol><li>CREATE TABLE …</li><li>INSERT INTO …</li><li>Ручной запуск пайплайна (Spark/Airflow).</li><li>Какой-нибудь скрипт для сравнения результатов.</li></ol><p>Рабочая схема? Да.</p><p>Удобная? Нет.</p><h2>Где хранить эти скрипты?</h2><p>Можно, конечно, прилепить их к задаче в Jira в виде файликов. Но выглядеть это будет как «фигня на палке». Через месяц никто не вспомнит, что это было и зачем.</p><p>Поэтому я решила собрать свой Python-проект для автоматизации. А вы можете склепать себе такой же, и жизнь сразу станет легче.</p><h3>Архитектура проекта</h3><h3>Минимальный стек</h3><h3>1. Utils — мелкие, но полезные</h3><p>Здесь мы храним всякую мелочёвку. Например, функцию для открытия JSON:</p><p>Важно отметить, что данные я всегда стараюсь хранить в виде массива с json. Так удобнее использовать.</p><h3>2. APIClient — для триггеров</h3><p>Здесь всё максимально тривиально: клиент для вызова API и запуска ETL джоб.</p><h3>3. PostgreSQLClient — основной игрок</h3><p>Класс для подключения, запросов, создания таблиц, вставки данных и удаления.</p><h2>Фикстуры (conftest.py)</h2><h3>API фикстуры</h3><p>Я показываю пример, как поднимаю один API клиент. Но у вас их может быть много: например, разные сервисы или разные перекладчики.</p><h3>DB фикстура</h3><p>Пример для дефолтной PostgreSQL, но вы можете добавить фикстуры для поднятия GreenPlum или ClickHouse.</p><h2>Как хранить данные?</h2><p>А теперь самый сок, которым я обмазываюсь сейчас.</p><p>Конечно, можно создать отдельный скрипт на чистом sql для создания и редактирования своих табличек: больших и маленьких. Но, если честно, это так *цензура* неудобно.</p><p>Поэтому я придумала хранить схему и данные в отдельных json файлах и налету генерить скрипты. Да, Америку я вновь не открываю, и очень жаль.</p><p>В директории тестов я создала папку resources, где храню эти файлы.</p><p>Конечно, в таком виде вы не передадите ничего в Postgres и ничего не слепите. Так что я услужливо предоставляю вам код, чтобы вы его копировали и вдохновлялись.</p><p>Вы можете взять и пропихнуть эти куски кода прямо в тело теста, но я предпочитаю оборачивать это дело в фикстуры-управленцы, которые будут делать это за меня и записывать отдельными шагами в Алюр:</p><p>Отдельное удовольствие мне даёт вот эта строчка кода db_client:PostgreSQLClient.Она значит, что если так вышло, что у меня есть куча разных PostgesSql, я могу в эту фикстуру прокинуть нужный мне клиент без дополнительных приседаний. И это, конечно, прекрасно.</p><h3>Пример: подготовка данных</h3><p>Самые внимательные уже заметили, что в примере выше я поднимала postgres-клиента.</p><p>Так что разницы почти никакой (ну, кроме тех случаев, когда внезапно очень даже есть 🙃).</p><h3>И сам тест</h3><p>Конечно, можно сравнивать всё это дело через всякие прослойки типа Pandas.</p><p>Но, камон, у меня что, куча времени сидеть, читать доки и писать суперсложные датафреймы ради пары простых проверок? Нет.</p><p>Позвольте мне радостно строчить свой первозданный код с дефолтными проверками и быть довольной этим минимализмом.</p><p>Это я отвлеклась. Вот такой код у меня получается. Я не очень люблю сверять даты и названия таблиц, у меня генерит тест на лету:</p><h2>Итог</h2><ul><li>Ручные скрипты → боль и страдания.</li><li>Автоматизация через Python+pytest → быстро, удобно, воспроизводимо.</li><li>JSON-файлы позволяют хранить схемы и данные в читаемом виде.</li><li>Allure даёт красивые отчёты.</li></ul><p>В итоге у вас появляется настоящий фреймворк для Data QA, который легко расширять и масштабировать.</p>]]></content:encoded>
    </item>
    <item>
      <title>Не только для собеседований: как LeetCode и аналоги помогают новичкам в программировании</title>
      <link>https://tproger.ru/articles/ne-tolko-dlya-sobesedovanij--kak-leetcode-i-analogi-pomogayut-novichkam-v-programmirovanii</link>
      <comments>https://tproger.ru/articles/ne-tolko-dlya-sobesedovanij--kak-leetcode-i-analogi-pomogayut-novichkam-v-programmirovanii?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Диана Тажетдинова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/ne-tolko-dlya-sobesedovanij--kak-leetcode-i-analogi-pomogayut-novichkam-v-programmirovanii</guid>
      <description><![CDATA[<p>Алгоритмические задачи развивают логику, структурное мышление и помогают на собеседованиях и в работе. Узнайте, с чего начать, как избежать выгорания и сохранить мотивацию.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/ne-tolko-dlya-sobesedovanij--kak-leetcode-i-analogi-pomogayut-novichkam-v-programmirovanii">Не только для собеседований: как LeetCode и аналоги помогают новичкам в программировании</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Задачи повышенной сложности]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 21 Aug 2025 14:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Многие новички боятся алгоритмических задач. Кажется, что это бустер для кандидатов в Google, которые решают графы на доске маркером, а не для тех, кто только осваивает циклы. Но опыт разработчиков показывает: даже простые задачи могут заметно улучшить качество кода.</p><p>Мы поговорили с экспертами и попросили их поделиться задачами, которые помогут прокачать логику и навыки работы с данными. Заодно узнали, зачем вообще новичку браться за алгоритмы. Решения оставим в комментариях. Не подглядывайте сразу, а сначала попробуйте свои силы.</p><h2>Зачем вообще решать алгоритмические задачи</h2><p>Алгоритмы в начале карьеры нужны не всем. Эксперты честно говорят, что практика на реальных маленьких проектах может дать больше пользы. Но выкидывать алгоритмы из своего обучающего трека точно не стоит, и вот почему.</p><p>Разработчик Валерий Жила говорит, что на алгоритмы можно смотреть по-разному:</p><blockquote>С одной стороны, алгоритмы новичкам не нужны — пусть лучше берутся за практические проекты, даже если это просто репозиторий на GitHub, который можно запустить на локалхосте. С другой — это как классическая литература или высшая математика. Напрямую в работе может не пригодиться, но здорово прокачивает мозги и помогает найти общий язык с другими разработчиками.</blockquote><p>А Константин Шибков, senior Java-разработчик в СДЭК, автор <a href="https://t.me/three_monitors">канала «Три монитора»</a>, вспоминает, что задачи стали для него тренировочным залом для мозгов:</p><blockquote>Когда я был новичком, знаний для полноценного приложения не хватало, а тренироваться хотелось. LeetCode показал мне, когда использовать массивы, деревья, словари, множества, и как эффективно обходить или искать данные. А просмотр чужих решений после своего помогал находить новые приёмы.</blockquote><p>Даже если вы не мечтаете прямо сейчас попасть в Google или Amazon, алгоритмические задачи — это отличная тренировка. Они помогут:</p><ul><li>развить логику и выстроить чёткий план решения,</li><li>натренировать декомпозицию — разбивку сложного на простое,</li><li>мыслить в терминах массивов, графов и деревьев.</li></ul><p>В бигтехе эти навыки проверяют особо тщательно: Яндекс, OZON и другие компании любят устраивать отдельные алгоритмические сессии. Бонусом вы будете готовы и к ним.</p><figure><img src="https://media.tproger.ru/user-uploads/114509/2025-08-15/90914bb0-f966-49e6-aa1e-3c0990809dbb.jpeg" alt="" /></figure><h2>Простые задачи — лучший вход</h2><p>Начинать сразу со сложного или среднего уровня — это как пытаться пробежать марафон без единой тренировки. Эксперты однозначно советуют начинать с чего-нибудь лёгкого. Чем проще задача, тем выше шанс её довести до конца.</p><blockquote>Например, Merge Two Sorted Lists — простая задача, которая учит работать с указателями. Разобравшись, можно попробовать Merge k Sorted Lists — это более сложная задача с тем же базовым подходом.</blockquote><blockquote>Нужно в первую очередь освоить базовые структуры данных. Научиться видеть в них инструмент с понятной и простой функцией, как лопата или молоток.</blockquote><p>Почему простые задачи действительно приносят пользу:</p><ul><li>вы быстро получаете результат и мотивацию продолжать,</li><li>можно сосредоточиться на логике, а не на дебаге сложных условий;</li><li>легче отрабатывать приёмы и паттерны, которые потом повторяются в сложных задачах.</li></ul><h2>Где искать задачи для практики</h2><p>Загляните на специальные онлайн-сервисы для практики алгоритмического программирования. Вот список популярных в русскоязычной среде сайтов:</p><ul><li><a href="https://leetcode.com/">LeetCode</a> — мировой лидер, база задач от простых до сложных для подготовки к интервью</li><li><a href="https://codeforces.com/">Codeforces</a> — сообщество для соревнований и обучения</li><li><a href="https://coderun.yandex.ru/">CodeRun</a> — российская платформа с задачами на алгоритмы и регулярными контестами</li><li><a href="https://acm.timus.ru/">Timus Online Judge</a> — портал с архивом олимпиадных задач, востребованный у студентов и олимпиадников</li><li><a href="https://adventofcode.com/">Advent of Code</a> — ежегодный онлайн-марафон задач в формате адвент-календаря, стилизованный под приключения</li><li><a href="https://www.codewars.com/">Codewars</a> — геймифицированная платформа с заданиями по разным языкам и уровням сложности</li></ul><blockquote>Как-то раз я завалил экзамен по алгоритмам в университете, будучи уверенным, что предмет — элементарный. Взялся за материалы, LeetCode, Advent of Code, Codewars и пару месяцев плотно ими занимался. Решал по 5−10 задач в день. Экзамен я пересдал на отлично. На последующих собеседованиях уже получалось интуитивно нащупывать решения.</blockquote><figure><img src="https://media.tproger.ru/user-uploads/114509/2025-08-15/3383b7e0-2e3c-4157-9f9e-ac37f079a031.png" alt="" /><figcaption>Фишки LeetCode: большое международное комьюнити, 14 языков программирования и возможность получить оффер от IT-гигантов</figcaption></figure><h2>Что решают разработчики, чтобы держать мозг в тонусе</h2><p>Попросили экспертов выбрать задачи, которые они сами считают полезными для развития алгоритмического мышления.</p><p>Валерий Жила:</p><ol><li><a href="https://leetcode.com/problems/two-sum/">Two Sum</a> — найти два числа в массиве, сумма которых равна заданному значению. Чему учит: работать с хэш-таблицами и быстро находить соответствия. Базовый паттерн, который часто встречается в других задачах.</li><li><a href="https://leetcode.com/problems/number-of-islands/">Number of Islands</a> — посчитать количество связных компонент на карте. Чему учит: обходить граф DFS/BFS, думать в терминах связности элементов.</li><li><a href="https://leetcode.com/problems/decode-string/">Decode String</a> — декодировать строку с вложенными структурами. Чему учит: использовать стек, вложенные циклы и парсинг данных.</li></ol><p>Совет: «Если сухой LeetCode наскучил, попробуйте Advent of Code».</p><p>Константин Шибков:</p><ol><li><a href="https://leetcode.com/problems/maximize-distance-to-closest-person/">Maximize Distance to Closest Person</a> — выбрать место в ряду, чтобы максимизировать расстояние до ближайшего соседа. Чему учит: работать с краевыми случаями, искать оптимальную позицию по условию.</li><li><a href="https://leetcode.com/problems/merge-two-sorted-lists/">Merge Two Sorted Lists</a> — объединить два отсортированных списка в один. Чему учит: работать с указателями и аккуратно обрабатывать данные в упорядоченных структурах.</li><li><a href="https://leetcode.com/problems/move-zeroes/">Move Zeroes</a> — переместить все нули в конец массива, сохранив порядок остальных элементов. Чему учит: оптимизировать алгоритм без создания дополнительных структур.</li><li><a href="https://leetcode.com/problems/partition-to-k-equal-sum-subsets/">Partition to K Equal Sum Subsets</a> — разделить массив на K подмножеств с равной суммой элементов. Чему учит: использовать поиск с возвратом, оптимизировать перебор.</li></ol><p>Никита Дубко, старший руководитель продуктов Яндекс Контеста, автор <a href="http://t.me/mefody_dev">канала mefody.dev</a></p><ol><li><a href="https://coderun.yandex.ru/problem/new-year-fruits-2/">Мандарины и апельсины 2.0</a> — выбрать n ящиков так, чтобы в них оказалось не менее половины всех мандаринов и апельсинов. Чему учит: использовать свойства возрастающих последовательностей, минимизировать количество проходов по данным и находить решение без полного перебора.</li><li><a href="https://coderun.yandex.ru/problem/cha_cha/">Ча-ча-ча</a> — определить итоговую оценку по набору буквенных оценок с ограничением, что итог не может быть более чем на балл выше худшей. Чему учит: работать со строками и символами в ASCII/UTF-8, а также применять решение в лоб, когда оно эффективно.</li></ol><p>Совет: «Тренируйтесь не только решать, но и объяснять, почему ваш алгоритм работает и укладывается в ограничения. Этот навык ценят на собеседованиях».</p><h2>Как не сломаться на старте: выгорание и ошибки новичков</h2><p>Практика алгоритмов должна прокачивать мозг, а не выматывать его. Но у многих новичков энтузиазм быстро сменяется усталостью — чаще всего из-за завышенных ожиданий и неверной стратегии.</p><p>Главные ловушки:</p><ul><li>Гонка на износ. План «100 задач за месяц» звучит амбициозно, но в реальности превращается в марафон без подготовки.</li><li>Залипание на одной задаче. Если вы часами бьётесь над решением, азарт сменяется усталостью.</li><li>Кажется, что все остальные ушли далеко вперед. Вы видите только чужие успехи, но не видите их ошибки.</li><li>Синтаксическая ловушка. Новички пытаются угадать код, вместо того чтобы проработать логику на бумаге.</li><li>Держать всё в голове. Легко потеряться в деталях, если не набросать план на бумаге.</li></ul><blockquote>Если задача по зубам, решение само скомпилируется в голове. Иногда полезно просто отойти, попить чаю или лечь спать.</blockquote><p>Что советуют эксперты:</p><ul><li>Решайте по одной задаче в день, как утреннюю разминку для мозга.</li><li>Чередуйте лёгкие и средние задачи, чтобы тренироваться в комфортном темпе, но с небольшим вызовом. Так вы будете расти без ощущения, что тонете.</li><li>Если за час решение не приходит, то посмотрите разбор без кода, а затем напишите свой вариант.</li><li>Отмечайте, какой приём вы отработали — это даёт чувство прогресса.</li><li>Записывайте решение пошагово. Даже опытные разработчики часто начинают с блокнота.</li></ul><blockquote>Я получал удовольствие, когда решал задачу своим способом, проходил все тесты и потом видел в чужом коде приёмы, о которых даже не думал.</blockquote><h2>Как продолжать развиваться</h2><p>Когда лёгкий уровень перестанет пугать, и вы будете уверенно разбираться в массивах, строках и базовых структурах данных, двигайтесь дальше. Как в спорте: если всегда работать с одной гантелью, прогресса не будет.</p><p>1. Освойте новые темы. Начните с самых популярных направлений, которые часто встречаются в реальной разработке и на собеседованиях:</p><ul><li>сортировки,</li><li>графы,</li><li>строковые алгоритмы,</li><li>деревья.</li></ul><p>2. Устройте себе челлендж. Например, «30 задач за 30 дней». Берите не количеством, а регулярностью. Можно чередовать дни по уровням сложности.</p><p>3. Используйте готовые подборки. Есть отличные списки от экспертов. Приведём лишь некоторые из них</p><ul><li><a href="https://seanprashad.com/leetcode-patterns/">LeetCode Patterns</a> — задачи сгруппированы по типам и темам;</li><li><a href="https://leetcode.com/problem-list/oizxjoit/">Blind 75</a> — 75 самых популярных задач для собеседований;</li><li><a href="https://www.geeksforgeeks.org/blogs/gfg160-160-days-of-problem-solving">GfG‑160</a> — 160 задач для тех, кто хочет по-настоящему прокачать алгоритмы</li></ul><p>4. Пробуйте альтернативные платформы. Чтобы не застревать в одном формате, чередуйте площадки. Разные интерфейсы и условия помогут смотреть на задачи с нескольких сторон.</p><figure><img src="https://media.tproger.ru/user-uploads/114509/2025-08-15/fafb8ef0-7b0e-4b0b-bf24-489d7ad426e7.jpeg" alt="" /></figure><blockquote>Однажды на работе мне нужно было распределить посылки по ячейкам постамата так, чтобы максимально эффективно использовать пространство. По сути, это была вариация задачи Partition to K Equal Sum Subsets: разложить элементы по контейнерам без перегруза. Я использовал поиск с возвратом и оптимизацию, которые до этого отрабатывал на алгоритмических задачах. Закрыл задачу быстрее, чем если бы разрабатывал всё с нуля. <br /><br />Но стоит учесть, что код на LeetCode отличается от того, что мы обычно пишем в прод. У нас на работе даже есть локальный мем «по-литкодовски», когда код — максимально короткий, без попытки быть понятным и простым. Главное для него — быть эффективным. Когда переносишь алгоритмы решения в реальный мир, нужно выделять алгоритм в изолированный класс или метод. Так вы сможете проверить его тестами и сделать более понятным для других.</blockquote><h2>Выводы</h2><ul><li>Алгоритмические задачи развивают логику, структурное мышление и умение разбивать проблему на шаги. Навыки пригодятся и на собеседованиях, и в реальной работе.</li><li>Начинать лучше с простых задач, чтобы закрепить основы и избежать выгорания.</li><li>Нужно научиться не только решать задачи, но и объяснять, почему алгоритм работает.</li><li>Ищите задачи на разных платформах, чтобы сохранить интерес и прокачивать навыки в разных форматах.</li><li>Лучше решать по одной задаче в день, чем десяток в выходные.</li><li>Не гонитесь за чужим темпом и чередуйте уровни сложности.</li><li>Личный опыт экспертов показывает, что алгоритмы могут спасти на экзамене и ускорить поиск рабочих решений.</li></ul><p>Читайте также:</p><p><a href="https://tproger.ru/articles/algoritm-dejkstry--kak-rabotaet-i-gde-ispolzuetsya">Алгоритм Дейкстры: как работает и где используется</a></p><p><a href="https://tproger.ru/articles/top-10-algoritmov--kotorye-realno-nuzhny-na-bekende">ТОП-15 алгоритмов, которые реально нужны на бэкенде</a></p><p><a href="https://tproger.ru/articles/chto-takoe-hew-tablicy-i-kak-ih-ispolzovat">Что такое хэш-таблицы и как их использовать</a></p><p><a href="https://tproger.ru/articles/kviz--kakoj-stek-tehnologij-tebe-podhodit-">Квиз: какой стек технологий тебе подходит?</a></p><p><a href="https://tproger.ru/articles/rabochij-plan--kak-izuchit-novyj-stek-za-3-mesyaca">Рабочий план: как изучить новый стек за 3 месяца</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Разработчик изучал систему рекомендаций Netflix месяцами. Вот что скрывается внутри</title>
      <link>https://tproger.ru/news/razrabotchik-izuchal-sistemu-rekomendacij-netflix-mesyacami--vot-chto-skryvaetsya-vnutri</link>
      <comments>https://tproger.ru/news/razrabotchik-izuchal-sistemu-rekomendacij-netflix-mesyacami--vot-chto-skryvaetsya-vnutri?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/razrabotchik-izuchal-sistemu-rekomendacij-netflix-mesyacami--vot-chto-skryvaetsya-vnutri</guid>
      <description><![CDATA[<p>Разработчик изучил рекомендательную систему Netflix: как алгоритмы и инфраструктура персонализируют контент и удерживают зрителей</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/razrabotchik-izuchal-sistemu-rekomendacij-netflix-mesyacami--vot-chto-skryvaetsya-vnutri">Разработчик изучал систему рекомендаций Netflix месяцами. Вот что скрывается внутри</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[CDN]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 14 Aug 2025 03:48:26 GMT</pubDate>
      <content:encoded><![CDATA[<p>Путь Netflix от сервиса проката DVD к стриминговому гиганту — это история о том, как данные превратились в главный актив компании.</p><p>Сегодня их рекомендательная система экономит более $1 млрд в год, удерживая подписчиков и увеличивая время просмотра. И именно ее решил <a href="https://beyondit.blog/blogs/Inside-Netflixs-1-Billion-Algorithm">изучить</a> разработчик на платформе BeyondIT.</p><p>В основе персонализации — анализ каждого клика, паузы, поиска и жанровых предпочтений. Алгоритм строит уникальный «профиль зрителя» и превращает библиотеку из тысяч фильмов в персональную витрину.</p><p>Такой подход помогает избежать «паралича выбора» и быстрее находить интересный контент.</p><h2>Сердце системы — матричная факторизация</h2><p>Ключевая технология, популяризованная ещё во времена конкурса Netflix Prize в 2006 году — матричная факторизация.</p><p>Она превращает гигантскую и разреженную таблицу «пользователь — фильм» в два компактных набора «скрытых факторов»: вкусов пользователя и характеристик фильмов.</p><p>Перемножив их, алгоритм предсказывает оценку, даже если зритель ещё не видел конкретный фильм. Обучение идёт методом стохастического градиентного спуска, с учётом смещений (bias terms) и регуляризации, чтобы модель не переобучалась.</p><h2>Больше, чем просто «похожие на вас»</h2><p>Современный Netflix учитывает десятки сигналов: от истории просмотров и пропусков до времени суток, устройства, локальных трендов и намерений поиска.</p><p>Интерфейс и обложки фильмов постоянно проходят A/B-тесты, чтобы максимизировать вовлечённость.</p><p>Помимо классического коллаборативного фильтра, используются модели глубокого обучения, такие как Neural Collaborative Filtering, способные находить сложные, нелинейные зависимости, и мультизадачное обучение.</p><p>Это нужно для баланса между точностью, разнообразием и новизной рекомендаций.</p><h2>Реакция в реальном времени</h2><p>Предпочтения меняются и Netflix реагирует на них за миллисекунды. Платформа а реальном времени обрабатывает миллионы событий в секунду, обновляя рекомендации на лету.</p><p>Инфраструктура включает Kafka, Spark, микросервисы в AWS, кэширование в памяти и edge-вычисления для минимальной задержки.</p><h2>Почему это важно</h2><p>Такой масштаб требует устойчивости, низкой задержки и отказоустойчивости. Рекомендательная система Netflix — это не только алгоритмы, но и мощная инженерная экосистема, в которой даже хэш-таблицы играют ключевую роль для мгновенного доступа к данным.</p>]]></content:encoded>
    </item>
    <item>
      <title>Курсы по Big Data, включая онлайн-обучение для аналитиков больших данных</title>
      <link>https://tproger.ru/articles/kursy-po-big-data--vklyuchaya-onlajn-obuchenie-dlya-analitikov-bolwih-dannyh</link>
      <comments>https://tproger.ru/articles/kursy-po-big-data--vklyuchaya-onlajn-obuchenie-dlya-analitikov-bolwih-dannyh?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анастасия Шишкина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kursy-po-big-data--vklyuchaya-onlajn-obuchenie-dlya-analitikov-bolwih-dannyh</guid>
      <description><![CDATA[<p>Самые лучшие курсы по Big Data. В предложенной подборке актуальные варианты обучения от проверенных школ, а так же рейтинги и цены на курсы для аналитиков Big Data</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kursy-po-big-data--vklyuchaya-onlajn-obuchenie-dlya-analitikov-bolwih-dannyh">Курсы по Big Data, включая онлайн-обучение для аналитиков больших данных</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Big Data]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Образование]]></category>
      <category><![CDATA[Обучающие курсы]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 28 Mar 2025 18:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Освоить востребованное направление в области аналитики данных помогут Big Data курсы. Онлайн-обучение в этой области предоставляет возможность овладеть навыками работы с большими данными, что открывает перспективы для карьеры в таких сферах, как IT, финансы, маркетинг и многих других. На курсах обучат методам сбора, обработки и анализа данных, работе с распределенными системами и инструментами для обработки данных в реальном времени, что позволяет стать ценным специалистом в самых динамичных и высокооплачиваемых областях.</p><p>Совместно с экспертами<a href="https://kursfinder.ru/"> Kursfinder</a> я проанализировала более 80 предложений, чтобы отобрать 56 лучших курсов по Big Data. В начале статьи представлены 10 самых лучших, нам мой взгляд, учебных программ. Далее идет список из 19 курсов по Data Science, за ним следуют 11 курсов Power BI и 7 курсов по машинному обучению. В конце статьи вы найдете подборку бесплатных вариантов по изучению аналитики и дополнительную информацию о профессии специалиста по работе с большими данными. Полный список <a href="https://kursfinder.ru/big-data/">курсов по Big Data</a> вы найдете в каталоге Kursfinder.</p><h2>ТОП-10 лучших курсов по Big Data в 2026 году</h2><ol><li><a href="https://experts2.ru/PZakoj?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=1">Python, BI и BigData </a>от ProductStar — программа для изучения инструментов аналитики с нуля при поддержке ИИ-помощника.</li><li><a href="https://experts2.ru/dZHkfh?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=2">Менеджмент AI- и BigData-продуктов</a> от ProductStar — быстрый старт в профессии.</li><li><a href="https://experts2.ru/YxilFf?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=3">Большие данные (Big Data) и интернет вещей (IoT)</a> от МИПО — обучение в рамках профессиональной переподготовки специалистов.</li><li><a href="https://experts2.ru/zseJQl?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=4">Большие данные (Big Data) и интернет вещей (IoT)</a> от Профессионального стандарта — востребованная специальность в сжатые сроки.</li><li><a href="https://experts2.ru/pwQqbD?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=5">Аналитик данных</a> от Eduson Academy — обучение у топовых экспертов.</li><li><a href="https://experts2.ru/zaUXlx?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=6">Программирование для анализа данных</a> от Skypro — углубленный курс по бизнес-аналитике.</li><li><a href="https://experts2.ru/TcpsgA?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=7">Профессия Data Analyst</a> от GeekBrains — бесплатные консультации для успешного развития карьеры.</li><li><a href="https://experts2.ru/gnljXP?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=8">Аналитик данных</a> от Яндекс Практикум — курс с возможностью стажировки в компаниях-партнерах.</li><li><a href="https://experts2.ru/FrpbDy?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=9">Аналитик данных</a> от Skypro — комплексная программа с содействием в трудоустройстве.</li><li><a href="https://experts2.ru/VltrcW?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=10">Машинное обучение</a> от Skillfactory — магистратура с престижным дипломом МФТИ.</li></ol><p>Курсы адресованы тем, кто стремится освоить современные технологии обработки данных, машинное обучение, методы аналитики и визуализации. Big Data обучение подойдет как новичкам, желающим начать карьеру в Data Science, так и действующим аналитикам, разработчикам и специалистам смежных профессий для улучшения навыков и расширения компетенций.</p><h2>Онлайн-курсы по Big Data</h2><p><b>1.</b> <a href="https://experts2.ru/PZakoj?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=1">Python, BI и BigData</a> | <b>ProductStar</b></p><p>Онлайн-курс технологии Big Data не требует специальной подготовки и адресован широкой аудитории слушателей. Вы освоите высокоуровневый язык программирования Python, научитесь использовать язык запросов SQL и нейросети для работы с данными, сможете разрабатывать рекомендательные системы и визуализировать данные с помощью популярных инструментов Power BI и Tableau. В конце обучения выполняется финальный проект, который пополнит ваше профессиональное портфолио.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-03-24/3f54b63c-5c29-41f3-a454-e57e42c90c0d.png" alt="" /></figure><ul><li>Стоимость: 109 451 рублей</li><li>Длительность: 6 месяцев</li><li>Формат обучения: видеолекции, текстовые материалы, практические задания, работа над итоговым проектом</li><li>Сертификат: электронный диплом о прохождении обучения</li></ul><p><b>Кому подойдет:</b> новичкам для старта в аналитике, специалистам для систематизации знаний или перехода на новый карьерный уровень.</p><p><b>Преимущества:</b></p><ul><li>доступна оплата в рассрочку;</li><li>постоянно обновляемые учебные материалы;</li><li>обширная библиотека знаний по профессии;</li><li>отработка практических навыков составляет 70% учебного времени;</li><li>бонусные курсы по программированию, английскому языку, Google Sheets и Excel;</li><li>ИИ-помощник для эффективной учебы;</li><li>бесплатные консультации по развитию карьеры.</li></ul><p><b>Недостатки:</b></p><ul><li>без гарантии трудоустройства.</li></ul><p><b>Программа обучения:</b></p><ul><li>Введение в Python</li><li>Системы контроля версий</li><li>Разработка API</li><li>Анализ и визуализация с Yandex DataLens</li><li>Работа с Power BI и Tableau</li><li>SQL для анализа данных</li><li>Python и создание ML-моделей</li><li>Нейросети, NLP, рекомендательные системы</li></ul><p><a href="https://experts2.ru/PZakoj?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=1">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>2. </b><a href="https://experts2.ru/dZHkfh?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=2">Менеджмент AI- и BigData-продуктов</a> | <b>ProductStar</b></p><p>Онлайн-курс в интенсивном формате поможет за короткий срок освоить методы внедрения ML-задач и создания AI-стратегий, а также познакомит со спецификой взаимодействия с командами аналитиков, маркетологов и разработчиков. Участники научатся работать с большими данными, рассмотрят способы создания датасетов и их применением в машинном обучении. Отработка практических навыков выполняется на реальных кейсах IT-компаний.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-03-24/db6b1688-bb4f-4909-b5c1-50091d7a18bb.png" alt="" /></figure><ul><li>Стоимость: 45 540 рублей</li><li>Длительность: 2 месяца</li><li>Формат обучения: видеолекции, текстовые материалы, практические задания, работа над итоговым проектом</li><li>Сертификат: электронный диплом о прохождении обучения</li></ul><p><b>Кому подойдет:</b> для желающих точечно прокачать навыки работы с данными.</p><p><b>Преимущества:</b></p><ul><li>возможность быстрого старта в профессии;</li><li>обучение в индивидуальном темпе;</li><li>помощь ментора на весь период учебы;</li><li>наполнение портфолио выполненными проектами;</li><li>карьерные консультации.</li></ul><p><b>Недостатки:</b></p><ul><li>обратная связь от ментора может быть с задержкой.</li></ul><p><b>Программа обучения:</b></p><ul><li>Возможности ML для оптимизации бизнеса</li><li>Машинное обучение и ИИ-продукты</li><li>Внедрение задач машинного обучения</li><li>Создание и запуск датасетов, работа с моделями</li><li>Введение в SQL</li><li>Нейронные сети и рекомендательные системы</li><li>Методы анализа Big Data</li><li>Хранение, обработка и масштабирование данных</li></ul><p><a href="https://experts2.ru/dZHkfh?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=2">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>3.</b> <a href="https://experts2.ru/YxilFf?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=3">Большие данные (Big Data) и интернет вещей (IoT)</a> | <b>МИПО</b></p><p>Содержательный курс в рамках профессиональной переподготовки подойдет специалистам любого уровня, включая новичков. К обучению приглашаются слушатели со средним профессиональным или высшим образованием. Под руководством российских и зарубежных экспертов с многолетним опытом студенты научатся обрабатывать и анализировать большие объемы информации, работать с базами данных и интернетом вещей, познакомятся с digital-экономикой и методами цифровой трансформации. Выпускники могут претендовать на позиции аналитика Big Data или IoT-аналитика.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-03-24/590fa0a8-382a-486c-9567-c72b18f54ea2.png" alt="" /></figure><ul><li>Стоимость: 58 249 рублей</li><li>Длительность: 4 месяца</li><li>Формат обучения: лекции, онлайн-вебинары, текстовые материалы, упражнения, тесты</li><li>Сертификат: официальный диплом о переподготовке</li></ul><p><b>Кому подойдет: </b>начинающим специалистам любого профиля со средним профессиональным или высшим образованием, инженерам и тем, кто планирует сменить сферу деятельности.</p><p><b>Преимущества:</b></p><ul><li>учебная программа соответствует актуальным требованиям рынка;</li><li>доступна оплата в рассрочку;</li><li>можно обучаться в ускоренном темпе;</li><li>кураторская поддержка с обратной связью;</li><li>отработка практических навыков на реальных кейсах.</li></ul><p><b>Недостатки:</b></p><ul><li>нужно дождаться старта очередного потока обучения.</li></ul><p><b>Программа обучения:</b></p><ul><li>Работа с базами данных</li><li>Обработка и интерпретация данных</li><li>Цифровая экономика</li><li>Технологическое обновление бизнеса</li><li>Big Data</li></ul><p><a href="https://experts2.ru/YxilFf?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=3">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>4.</b> <a href="https://experts2.ru/zseJQl?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=4">Большие данные (Big Data) и интернет вещей (IoT)</a> | <b>Профессиональный стандарт</b></p><p>Big Data обучение с нуля подойдет для освоения востребованной профессии в сжатые сроки. Занятия в дистанционном формате охватывают современные технологии и методы работы с большими данными. Вы изучите особенности анализа и хранения информации, познакомитесь с инструментами визуализации данных, системного администрирования и возможностями их применения в бизнесе.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-03-24/674c35fa-c828-419a-9cb4-80cd7db7ab04.png" alt="" /></figure><ul><li>Стоимость: 18 000 рублей</li><li>Длительность: 3 месяца</li><li>Формат обучения: предзаписанные видеоуроки, учебники, дополнительные материалы, практические задания, тесты</li><li>Сертификат: диплом установленного образца о профессиональной переподготовке</li></ul><p><b>Кому подойдет: </b>желающим освоить новую инженерию в сфере Big Data.</p><p><b>Преимущества:</b></p><ul><li>доступная стоимость при высоком качестве обучения;</li><li>есть рассрочка оплаты;</li><li>соответствует требованиям профессиональных стандартов;</li><li>обучение без отрыва от работы;</li><li>помощь персонального куратора во время учебы.</li></ul><p><b>Недостатки:</b></p><ul><li>только для участников, имеющих среднее профессиональное или высшее образование.</li></ul><p><b>Программа обучения:</b></p><ul><li>Введение в профессию</li><li>Цифровая экономика и цифровая трансформация</li><li>Методы и системы обработки Big Data</li><li>Оборудование для хранения больших данных</li><li>Инструменты визуализации и презентация результатов</li><li>Аналитика и управление данными</li></ul><p><a href="https://experts2.ru/zseJQl?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=4">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>5. </b><a href="https://experts2.ru/pwQqbD?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=5">Аналитик данных</a> | <b>Eduson Academy</b></p><p>Качественный курс, разработанный топовыми аналитиками. Предназначен для освоения профессии с нуля. Для прохождения обучения достаточно школьных знаний математики. Изучаются основные инструменты анализа, обработки и визуализации Big Data, прогнозирование с помощью Python, создание базы данных, работа с SQL-запросами и применение различных видов аналитики. Также вы освоите методологию Agile и принципы командной работы, научитесь создавать информативные презентации, закрепите практические навыки на интерактивном тренажере.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-03-24/7df254d2-c0c0-4b3f-a123-71152ff5939f.png" alt="" /></figure><ul><li>Стоимость: 98 200 рублей</li><li>Длительность: 6 месяцев</li><li>Формат обучения: лекции, тренажеры, решение кейсов, домашние задания</li><li>Сертификат: удостоверение государственного образца о повышении квалификации, диплом о прохождении курса</li></ul><p><b>Кому подойдет: </b>новичкам без опыта в IT.</p><p><b>Преимущества:</b></p><ul><li>обучение в комфортном темпе;</li><li>более 70% учебы — практика на реальных задачах;</li><li>8 проектов для портфолио;</li><li>материалы курса и обновления доступны всегда;</li><li>годовая кураторская поддержка;</li><li>подготовка к собеседованиям;</li><li>гарантированное трудоустройство или возврат денег.</li></ul><p><b>Недостатки:</b></p><ul><li>набор группы под конкретную дату.</li></ul><p><b>Программа обучения:</b></p><ul><li>Задачи и сферы работы аналитика</li><li>Возможности Excel для обработки данных</li><li>Автоматизация работы</li><li>Анализ данных для бизнеса</li><li>Юнит-экономика и создание системы метрик</li><li>Описательная, диагностическая и маркетинговая аналитика</li><li>Проведение А/В-тестирования</li><li>SQL и Python для аналитика</li></ul><p><a href="https://experts2.ru/pwQqbD?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=5">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>6.</b> <a href="https://experts2.ru/zaUXlx?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=6">Программирование для анализа данных</a> | <b>Skypro</b></p><p>Курс ориентирован на новичков, желающих освоить популярные инструменты для работы с данными, включая Python и SQL. В программу включено изучение программирования, математической статистики, логики и бизнес-процессов. С помощью экспертов-аналитиков студенты научатся обрабатывать и анализировать большие массивы данных, работать с бизнес-метриками, отслеживать динамику рынка и тренды, проводить статистические тесты, формулировать и проверять гипотезы.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-03-24/4de4ab1d-127b-43a3-afa4-187bb966de6c.png" alt="" /></figure><ul><li>Стоимость: от 191 988 рублей</li><li>Длительность: определяется индивидуально</li><li>Формат обучения: уроки в видеоформате, онлайн-вебинары, упражнения</li><li>Сертификат: диплом о профпереподготовке</li></ul><p><b>Кому подойдет: </b>для обучающихся с нуля, независимо от предыдущего опыта работы.</p><p><b>Преимущества:</b></p><ul><li>стандартный или индивидуальный тариф;</li><li>возможно обучение в мобильном браузере;</li><li>общение с экспертами в формате Q&amp;A;</li><li>домашние задания с проверкой;</li><li>доступ к учебным материалам без ограничений по времени;</li><li>бесплатный годовой курс разговорного английского языка;</li><li>обучение работе с нейросетями — в подарок;</li><li>бесплатные консультации по старту и развитию карьеры;</li><li>помощь с трудоустройством.</li></ul><p><b>Недостатки:</b></p><ul><li>набор группы под конкретную дату;</li><li>гарантия трудоустройства только при обучении на индивидуальном тарифе.</li></ul><p><b>Программа обучения:</b></p><ul><li>Инструменты аналитики</li><li>Основы математической статистики</li><li>Обработка данных</li><li>Автоматизация работы с Big Data</li><li>Методы прогнозирования экономических показателей</li><li>Формулирование гипотез на основе данных</li></ul><p><a href="https://experts2.ru/zaUXlx?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=6">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>7. </b><a href="https://experts2.ru/TcpsgA?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=7">Профессия Data Analyst</a> | <b>GeekBrains</b></p><p>Углубленный курс, предназначенный для стартующих в аналитике данных с нуля. Под руководством опытных преподавателей вы научитесь применять продвинутые инструменты для сбора и обработки информации из различных источников, работать с Big Data, проверять гипотезы, проводить сплит-тестирование, визуализировать результаты анализа данных. После каждого теоретического занятия выполняются практические упражнения, а выполненный во время обучения проект пополнит ваше профессиональное портфолио.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-03-24/2dc4c24a-ef48-4512-817f-f46b6722284d.png" alt="" /></figure><ul><li>Стоимость: 133 416 рублей</li><li>Длительность: 12 месяцев</li><li>Формат обучения: онлайн-занятия, уроки в записи, практические упражнения, тесты, проектная работа</li><li>Сертификат: официальный сертификат о прохождении обучения</li></ul><p><b>Кому подойдет: </b>новичкам без специальных знаний.</p><p><b>Преимущества:</b></p><ul><li>беспроцентная рассрочка;</li><li>живое общение с преподавателями;</li><li>обратная связь от кураторов по результатам домашних заданий;</li><li>проекты для портфолио;</li><li>более 500 часов практики;</li><li>дополнительные курсы по основам математики и статистики;</li><li>помощь карьерных специалистов в подготовке к трудоустройству.</li></ul><p><b>Недостатки:</b></p><ul><li>обучение рассчитано на длительный период.</li></ul><p><b>Программа обучения:</b></p><ul><li>Знакомство с Data Science</li><li>Возможности Python для работы с данными</li><li>Язык запросов SQL</li><li>Методы прогнозирования</li><li>A/B-тестирование</li><li>Маркетинговая и продуктовая аналитика</li><li>Алгоритмы и структуры данных</li><li>BI-инструменты</li></ul><p><a href="https://experts2.ru/TcpsgA?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=7">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>8. </b><a href="https://experts2.ru/gnljXP?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=8">Аналитик данных</a>  |<b> Яндекс Практикум</b></p><p>Онлайн-курс с регулярно обновляемой программой и специалистами Яндекса в качестве наставников. Участники подробно узнают о профессии, освоят ключевые инструменты аналитики, включая Python, SQL и BI, изучат методы тестирования и способы визуализации данных, пройдут основы линейной алгебры, познакомятся с алгоритмами и машинным обучением. Предусмотрены стажировки у партнеров, выполнение проектов для портфолио, прохождение технических собеседований.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-03-24/2916612a-ef33-4a84-a5e7-6a4867506cd9.png" alt="" /></figure><ul><li>Стоимость: от 102 820 рублей</li><li>Длительность: от 7 месяцев</li><li>Формат обучения: интерактивный учебник, воркшопы, практические задания, работа над проектами</li><li>Сертификат: диплом о профессиональной переподготовке</li></ul><p><b>Кому подойдет: </b>начинающим с нуля и Junior-специалистам.</p><p><b>Преимущества:</b></p><ul><li>базовый или расширенный курс;</li><li>обучение можно совмещать с работой;</li><li>первые занятия доступны без оплаты;</li><li>актуальная учебная программа;</li><li>более 70% программы отводится практике;</li><li>онлайн-консультации с экспертами;</li><li>возможно пройти стажировку в компаниях-партнерах;</li><li>бесплатный курс по нейросетям для аналитиков;</li><li>содействие в трудоустройстве.</li></ul><p><b>Недостатки:</b></p><ul><li>нужно дождаться старта очередного потока обучения.</li></ul><p><b>Программа обучения:</b></p><ul><li>Функции и задачи аналитика данных</li><li>SQL и BI для работы с данными</li><li>Возможности Python для обработки и анализа данных</li><li>Продвинутая аналитика для бизнес-задач</li><li>Специализация по продуктовой или BI-аналитике</li></ul><p><a href="https://experts2.ru/gnljXP?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=8">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>9. </b><a href="https://experts2.ru/FrpbDy?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=9">Аналитик данных</a> | <b>Skypro</b></p><p>Онлайн-курс для желающих освоить профессию с нуля. Студенты учатся работать с данными, осваивают SQL, Python, Excel и Power BI. Программа предполагает выполнение практических заданий, мастер-классы с реальными кейсами, поддержку наставников, помощь в подготовке резюме и портфолио специалиста. Выпускники получают диплом о профессиональной переподготовке и содействие в трудоустройстве.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-03-24/5a466510-9656-405b-ad47-f5955b0df282.png" alt="" /></figure><ul><li>Стоимость: 169 596 рублей</li><li>Длительность: определяется индивидуально</li><li>Формат обучения: уроки в видеоформате, онлайн-вебинары, упражнения</li><li>Сертификат: диплом о профпереподготовке</li></ul><p><b>Кому подойдет: </b>новичкам без IT-образования и независимо от предыдущего опыта работы.</p><p><b>Преимущества:</b></p><ul><li>выбор из 2 тарифных планов;</li><li>живое общение с экспертами;</li><li>можно учиться с мобильного устройства;</li><li>проверка домашних заданий с ревью от преподавателей;</li><li>бессрочный доступ к материалам программы;</li><li>курсы по визуализации данных и английскому языку в подарок;</li><li>консультации со специалистами по развитию карьеры;</li><li>гарантия устройства на работу.</li></ul><p><b>Недостатки:</b></p><ul><li>набор группы под определенную дату;</li><li>трудоустройство гарантируется при обучении на более дорогом тарифе.</li></ul><p><b>Программа обучения:</b></p><ul><li>Введение в профессию</li><li>Инструменты и технологии для аналитики данных</li><li>Работа с данными и автоматизация процессов</li><li>Обработка больших массивов данных</li><li>Методы прогнозирования</li><li>Проверка гипотез</li><li>Виды тестирования</li></ul><p><a href="https://experts2.ru/FrpbDy?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=9">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>10. </b><a href="https://experts2.ru/VltrcW?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=10">Машинное обучение</a> | <b>Skillfactory</b></p><p>Онлайн-программа в рамках магистратуры МИФИ по направлению «‎Прикладная математика и информатика»‎ поможет с азов освоить работу с данными и ML-моделями. Вы научитесь разрабатывать системы прогнозирования и принятия решений, исследовать гипотезы, автоматизировать процессы с помощью технологий машинного обучения, собирать, обрабатывать и анализировать большие данные, проводить е A/B-тестов, применять инструменты маркетинговой аналитики и многое другое. Фундаментальный курс помимо содержательной теоретической базы включает интенсивное практическое обучение, которое позволит наработать опыт и создать профессиональное портфолио.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-03-24/5fa4d6fb-9ccd-472d-87cd-ff77f95ac220.png" alt="" /></figure><ul><li>Стоимость: 198 000 рублей за семестр</li><li>Длительность: 2 года</li><li>Формат обучения: предзаписанные материалы, онлайн-лекции, семинары, тесты, проекты, хакатоны, тренажеры</li><li>Сертификат: диплом магистра</li></ul><p><b>Кому подойдет:</b> специалистам без опыта в IT, выпускникам и действующим специалистам технических направлений.</p><p><b>Преимущества:</b></p><ul><li>удобное расписание;</li><li>обучение с нуля до продвинутого уровня;</li><li>актуальные учебные материалы;</li><li>преподаватели — эксперты в области Data Science и ML;</li><li>реальные кейсы от партнеров в качестве проектов для портфолио;</li><li>диплом престижного вуза;</li></ul><p><b>Недостатки:</b></p><ul><li>для поступления требуется диплом бакалавра или специалиста по любому направлению;</li><li>старт программы раз в год.</li></ul><p><b>Программа обучения:</b></p><ul><li>Программирование на Python</li><li>Математика для анализа данных</li><li>Сплит-тестирование</li><li>Машинное обучение</li><li>Внедрение ML-моделей</li><li>SQL для работы с базами данных</li><li>Big Data и рекомендательные системы</li></ul><p><a href="https://experts2.ru/VltrcW?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=10">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><h2>Еще 19 курсов по Data Science</h2><p>Предлагаю ознакомиться с подборкой курсов, охватывающих изучение современных технологий и аналитических методов для работы с данными.</p><ol><li><a href="https://experts2.ru/EqokLw?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">BIG DATA для менеджеров</a> от Product Live — онлайн-курс научит применять ИИ, большие данные и машинное обучение для оптимизации бизнес-процессов и повышения прибыли. Программа длится 6 месяцев и ориентирована на владельцев компаний, руководителей отделов и направлений. Участники научатся работать с фреймворками и датасетами, организовывать работу с DS-командой и планировать BD-проекты, решат 18 бизнес-кейсов, разберут внедрение искусственного интеллекта на реальном примере. Проводятся индивидуальные консультации с ментором.</li><li><a href="https://experts2.ru/PbdrkM?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Введение в Data Science</a> от Skillbox — авторский курс от экспертов Сбера рассчитан на полгода. Подходит новичкам и начинающим аналитикам. Вы с нуля изучите инструменты дата-сайентиста, подтянете математику, статистику и теорию вероятностей, научитесь писать код, работать с данными, разрабатывать ML-модели, выполнять когортный и разведочный анализ, формулировать гипотезы и прогнозировать результаты. Практическая часть включает 50 заданий и выполнение итогового проекта, который войдет в ваше портфолио.</li><li><a href="https://experts2.ru/tBhGnp?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Библиотеки Python для Data Science: Numpy, Matplotlib, Scikit-learn</a> от GeekBrains — практико-ориентированный курс содержит более 400 часов упражнений для отработки навыков. Эксперты объяснят, как извлекать необходимую информацию из API, баз данных и файлов, как эффективно работать с большими массивами данных, проводить анализ, формулировать и проверять гипотезы. Дополнительно изучаются основы математики и статистики. Предоставляется бесплатный доступ к облачной платформе Yandex для практики во время учебы. Проводятся карьерные консультации.</li><li><a href="https://experts2.ru/tclEzV?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Data Science: быстрый старт</a> от ProductStar — интенсивная программа поможет всего за пару месяцев освоить Python, писать чистый код, работать с ML-инструментами, создавать рекомендательные системы. Обучение можно проходить в индивидуальном темпе и совмещать с работой. После каждого урока проводится разбор кейсов и выполнение практических заданий. После завершения учебы выдается сертификат, а в поиске работы помогают специалисты Карьерного центра.</li><li><a href="https://experts2.ru/stkIuY?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Data Science в медицине</a> от GeekBrains — специализированный курс фокусируется на применении аналитики в медицине, использовании машинного обучения и статистики для работы с Big Data. Подходит для обучения с нуля. Занятия рассчитаны на 9 месяцев и включают знакомство с языками программирования и базами данных, изучение финансовой математики, статистических методов, сплит-тестирования и юнит-экономики. Предусмотрена бесплатная консультация перед началом обучения, отработка практических навыков на интерактивных тренажерах, проверка работ с ревью от преподавателей, выполнение командных проектов.</li><li><a href="https://experts2.ru/hgVfsZ?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Математика + Machine Learning для Data Science</a> от Skillfactory — объединенный онлайн-курс длится 5,5 месяцев, за которые участники разберутся в применении математических и статистических закономерностей в ML и нейросетях. Программа ориентирована на новичков. Студенты разбирают практические кейсы и участвуют в хакатонах, решают задачи по машинному обучению, предобработке данных, линейной и логистической регрессии, изучают принципы работы с алгоритмами и методы построения рекомендательных систем. Выдается сертификат о завершении обучения, предоставляется бесплатная консультация по развитию карьеры.</li><li><a href="https://experts2.ru/bVcyWr?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Data Science в медицине</a> от Skillfactory — совместная программа с Сеченовским университетом адресована специалистам в сфере исследований, медицины, фармакологии, биологии. Обучение можно совмещать с работой. Участники освоят Python и его библиотеки, научатся обрабатывать и визуализировать данные, применять DS-инструменты и ML-алгоритмы для решения задач в своих сферах деятельности, получат доступ к цифровой платформе больших медицинских данных и опыт работы над реальным проектом. Выпускникам выдается диплом о переподготовке.</li><li><a href="https://experts2.ru/qrhuDT?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Профессия Специалист по Data Science плюс</a> от Яндекс Практикума — углубленное обучение займет 15 месяцев, в течение которых вы научитесь анализировать Big Data, строить ML-модели для принятия решений и  прогнозирования, создавать рекомендательные системы, а также выполните более 20 проектов. Курс подойдет как новичкам без технического образования или опыта в IT, так и специалистам по работе с данными. Первые занятия доступны для бесплатного изучения.</li><li><a href="https://experts2.ru/rkZwvP?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Data Science: введение в машинное обучение</a> от Слёрма — программа для начинающих DS-специалистов, владеющих Python, поможет разобраться в алгоритмах и задачах ML. Эксперты курса расскажут о ключевых подходах к созданию нейросетей и форматах работы с данными, объяснят, как использовать библиотеки для анализа данных и применять машинное обучение для решения задач бизнеса. На отработку практических навыков отводится более 130 часов. Обучение без углубления в математику, выполнение итогового проекта, отработка вопросов с собеседования.</li><li><a href="https://experts2.ru/oyqVKp?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Data Science для Маркетинг Директора</a> от Digital Business School — курс для собственников бизнеса, маркетологов, product-менеджеров и других специалистов, которые хотели бы использовать аналитику данных для повышения эффективности маркетинга и бизнеса в целом. Состоит из 3 уроков и 3 практикумов. Вы узнаете, как собирать и обрабатывать информацию, использовать метрики для решения маркетинговых задач и внедрить DS в своей компании. Есть бесплатное вводное занятие. Доступ к остальным учебным материалам открывается сразу после оплаты.</li><li><a href="https://experts2.ru/lNgLqh?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Онлайн-курсы Python для аналитиков</a> от Международной школы профессий — двухнедельное обучение для тех, кто хочет освоить программирование с нуля и получить практический опыт работы с популярным языком. Курс охватывает такие темы, как основы синтаксиса и структуры данных, работу с файлами и библиотеками, расчет метрик и визуализацию данных. Вы также освоите Selenium WebDriver для автоматизации задач и системой контроля версий. В ходе обучения слушатели создадут три полноценных проекта, которые можно добавить в портфолио. Обучение проходит в онлайн-формате и длится два месяца, что дает возможность совмещать занятия с работой.</li><li><a href="https://experts2.ru/xeAikR?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Специалист по Data Science</a> от Яндекс Практикума — содержательный курс предназначен для тех, кто хочет освоить профессию аналитика данных с нуля. В течение 8 месяцев студенты изучают Python, библиотеки для анализа данных, SQL, методы машинного обучения, а также выполняют практические проекты для портфолио. Программа включает содействие в трудоустройстве, по окончании выдается диплом о профессиональной переподготовке.</li><li><a href="https://experts2.ru/iAorCq?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Data-инженер</a> от Слёрма — онлайн-занятия адресованы разработчикам, аналитикам данных, специалистам по управлению базами данных. За 4 месяца студенты изучат автоматизацию ETL-задач, инструменты для визуализации и отчетности, для обработки, интеграции и хранения данных. Проводятся регулярные встречи с практикующими экспертами. Для ознакомления с форматом обучения предоставляется трехдневный бесплатный доступ к курсу.</li><li><a href="https://experts2.ru/tHBxmh?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Data Scientist с нуля</a> от Брунояма — углубленный курс для начинающих рассчитан на 8 месяцев. За это время освоите программирование на Python, работу с SQL и базами данных, изучите методы машинного обучения, обработки и визуализации данных, рассмотрите этапы проведения A/B-тестирования, познакомитесь с возможностями применения нейронных сетей. Удобный график обучения, акцент на практику, поддержка наставника, индивидуальная помощь с трудоустройством.</li><li><a href="https://experts2.ru/cNykzY?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Аналитик PRO</a> от Changellenge Education — комплексный курс посвящен изучению ключевых инструментов аналитики данных и адресован тем, кто только начинает карьеру в этом направлении, Junior-специалистам и представителям смежных профессий. Опытные преподаватели научат использовать Python, SQL и Excel, создавать продвинутые финансовые модели, тестировать бизнес-гипотезы, работать с маркетинговой и продуктовой аналитикой, Tableau и BI-системами. Вас ждет более 300 часов практики, встречи с экспертами, командная и самостоятельная работа над проектами.</li><li><a href="https://experts2.ru/hwmvPQ?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Курс DP-100: Проектирование и реализация решений Data Science в Azure</a> от Эврики — трехдневный семинар по использованию служб Azure для различных целей машинного обучения. Программа, состоящая из 10 модулей, ориентирована на дата-сайентистов со знанием Python. С помощью эксперта вы научитесь применять инструменты Azure Machine Learning Tools, тренировать модели в ML Designer, создавать хранилища данных, взаимодействовать с вычислительной средой, создавать и запускать конвейеры. По окончании выдается сертификат.</li><li><a href="https://experts2.ru/TzlGaw?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Программирование на Python. Уровень 4. Анализ и визуализация данных: Pandas, Numpy, Matplotlib</a> от Специалист.ru — интенсивная программа для аналитиков, программистов, представителей научных специальностей. Вы познакомитесь с возможностями популярного высокоуровневого языка, применяемыми для анализа и визуализации данных, освоите работу с библиотеками, различные способы построения диаграмм и графиков. Занятия построены на реальных кейсах из сферы обработки данных. Предусмотрено тестирование, выдается удостоверение о повышении квалификации.</li><li><a href="https://experts2.ru/xfusTF?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Data Science проекты</a> от New Professions Lab — экспресс-курс для менеджеров и дата-сайентистов включает 4 видеоурока и 2 тестовых задания. Участники рассмотрят, из каких этапов состоит анализ данных, как определиться с метрикой для оценки ML-модели и оценить эффективность ее внедрения, каким образом проводится сплит-тестирование и как визуализировать результаты DS-проекта. Учебные материалы доступны бессрочно, после прохождения обучения выдается сертификат.</li><li><a href="https://experts2.ru/czeAWt?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Большие данные с BigData Team</a> от BigDataTeam — аналитика big data обучение подойдет разработчикам, аналитикам и другим специалистам по работе с данными. За 10 занятий общей длительностью 80 часов участники научатся взаимодействовать с распределенными файловыми системами, освоят такие инструменты Hadoop, MapReduce, Hive, Spark, Kafka и Cassandra, научатся эффективно обрабатывать и анализировать большие данные, готовить отчеты на основе больших массивов информации. Практические задания выполняются студентами на реальном кластере, что позволяет получить опыт работы в реальных условиях.</li></ol><h2>Еще 11 дополнительных курсов Power BI</h2><p>Power BI представляет собой комплексное программное решение для анализа и визуализации данных. В этом разделе представлены специализированные курсы, которые помогут улучшить навыки аналитики, автоматизации отчетности и построения эффективных дашбордов.</p><ul><li><a href="https://experts2.ru/cspMUi?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Профессия Data-аналитик</a> от Skillbox.ru — углубленное обучение в течение 12 месяцев предназначено для желающих с нуля освоить новую профессию в сфере аналитики данных. Программа включает изучение математических основ анализа и статистики, программирование на Python, применение SQL для работы с базами данных, а также визуализацию с помощью Power BI. Слушатели научатся извлекать, очищать и анализировать данные, строить аналитические отчеты и дашборды, проводить сплит-тесты и формулировать гипотезы. Выпускники смогут претендовать на должности маркетингового, продуктового или финансового аналитика, специалиста по Data Science или BI-аналитика.</li><li><a href="https://experts2.ru/IEtbrf?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Excel и Google-таблицы: от новичка до эксперта</a> от Eduson Academy — двухнедельный онлайн-курс адресован пользователям, желающим освоить все функции Excel и Google-таблиц для эффективной работы с данными. Программа охватывает темы от работы с формулами и функциями до анализа данных и создания сложных отчетов. Участники научатся обрабатывать большие объемы информации, использовать сводные таблицы и графики, а также автоматизировать задачи с помощью макросов. Обучение проводится на интерактивных тренажерах.</li><li><a href="https://experts2.ru/suDIfw?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Power BI и Power Query</a> от SF Education — интенсивная программа продолжительностью 1 месяц подходит широкой аудитории слушателей и нацелена на изучение инструментов для сбора, обработки и анализа данных. Участники научатся собирать информацию из различных источников и подготавливать ее для анализа, интегрировать BI c различными приложениями, использовать возможности BI-системы для аналитических задач и визуализации данных. По окончании выдается диплом международного образца.</li><li><a href="https://experts2.ru/wpQGgt?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">BI-аналитик</a> от Eduson Academy — онлайн-курс предназначен для тех, кто хочет пройти big data обучение и стать специалистом в области бизнес-анализа, работать с большими объемами данных. Обучение длится 4 месяца. Участники освоят навыки работы с  Power BI и Tableau, научатся создавать отчеты, дашборды и анализировать данные для принятия стратегических решений. Программа курса включает темы по основам статистики, прогнозированию, построению аналитических моделей и визуализации данных, а также предполагает выполнение практических заданий, что помогает закрепить теорию на реальных примерах.</li><li><a href="https://experts2.ru/sqQPir?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Профессия BI-аналитик</a> от GeekBrains — обучение продолжительностью 8 месяцев поможет вам стать востребованным специалистом в области бизнес-анализа. Занятия включают изучение таких инструментов для работы с данными, как Python, SQL, Power BI, Power Query и другими. Вы освоите методы обработки информации, формирования аналитических отчетов и создания дашбордов. Предусмотрены практические задания, в том числе на реальных кейсах, индивидуальные консультации с наставниками и помощь в трудоустройстве.</li><li><a href="https://experts2.ru/luGzRc?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">«BI-аналитик» с нуля</a> от Skypro — программа в рамках профессиональной переподготовки. Участники изучат основы Python, научатся писать запросы на SQL, собирать из разных источников и преобразовывать, использовать функционал BI-систем для аналитики, визуализировать данные в виде графиков, диаграмм и презентовать результаты своей работы. Занятия проводятся на собственной образовательной платформе онлайн-школы, предоставляется кураторская поддержка и помощь в трудоустройстве.</li><li><a href="https://experts2.ru/yJHdur?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">BI-аналитика</a> от OTUS — онлайн-обучение для аналитиков данных, продуктовых и маркетинговых аналитиков, product- и project-менеджеров, стремящихся углубить свои знания в области бизнес-аналитики. Продолжительность курса составляет 4 месяца. Вы научитесь работать с большими данными и применять решения с открытым исходным кодом, визуализировать метрики с помощью Power BI, Tableau и отечественной системы Analytic Workspace, создавать интерактивные дашборды с использованием Python и его библиотек. Особенностью курса является акцент на практическом применении знаний и погружение в решение реальных кейсов.</li><li><a href="https://experts2.ru/dwULqv?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Аналитик Power BI c 0 </a>от IQBI — практико-ориентированная программа для изучения аналитики с применением Power BI. Подойдет как новичкам, так и действующим аналитикам, желающим систематизировать свои знания. Рассматриваются инструменты Power Query, DAX и M, автоматизация процессов, работа с базами данных и визуализация сведений. Длительность варьируется от 5 недель при обучении на базовом уровне и до 5 месяцев при выборе тарифа PRO. Важной особенностью курса является получение сертификата от партнеров Microsoft.</li><li><a href="https://experts2.ru/ifbBtF?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Анализ данных в Power BI</a> от Специалист.ru — экспресс-курс знакомит с функционалом программных решений для бизнес-анализа. Освоите основные операции в BI и инструменты визуализации, научитесь обрабатывать информацию и создавать модели данных, писать запросы и сценарии на языке DAX, передавать данные в облачную платформу Power BI и вести там совместную работу над отчетами. Выдается удостоверение о повышении квалификации и диплом международного образца. Можно учиться очно.</li><li><a href="https://experts2.ru/uvTAji?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Power BI для бизнес-аналитики</a> от Stepik — комплексное обучение для всех, кто хочет овладеть инструментами Power BI и научиться преобразовывать сырые данные в интерактивные и визуально привлекательные отчеты. Вы научитесь подключать различные источники информации, работать с Power Query для преобразования и очистки данных, создавать сложные модели с использованием DAX-функций, разрабатывать и публиковать отчеты для различных пользователей и устройств. Более 80 уроков, домашние задания, тесты, доступ к электронному учебнику и файлам проекта, персональная поддержка преподавателя.</li><li><a href="https://experts2.ru/qroFdP?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Power BI: от новичка до уверенного бизнес-пользователя</a> от Udemy — авторский курс для начинающих пользователей, желающих быстро освоить функциональные возможности Power BI. Состоит из 128 лекций общей продолжительностью 15,5 часов. В рамках обучения вы научитесь импортировать сведения из различных источников (Excel, PDF, Web, CRM и ERP системы), очищать и трансформировать ее, создавать модели данных, визуализировать информацию в понятных отчетах и настраивать дашборды. Доступ к лекциям остается навсегда. По окончании программы выдается сертификат.</li></ul><h2>Еще 7 дополнительных курсов по машинному обучению</h2><p>В этой подборке собраны курсы, которые охватывают специализированные темы по ML, такие как нейронные сети, работа с большими данными и продвинутые методы анализа. Эти курсы подойдут как для тех, кто уже знаком с основами машинного обучения, так и для начинающих.</p><ul><li><a href="https://experts2.ru/pViNcd?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Машинное обучение</a> от Нетологии — углубленный курс создан для разработчиков, аналитиков и Junior-специалистов в сфере машинного обучения. Программа длится 10 месяцев. Участники познакомятся с возможностями нейронных сетей, научатся грамотно формулировать задачи для проектов Data Science, определять алгоритмы и метрики, разрабатывать ML-модели, составлять отчеты об исследованиях и создавать рекомендательные системы.  Выпускникам выдается диплом о профессиональной переподготовке, и предоставляется помощь в трудоустройстве.</li><li><a href="https://experts2.ru/kRfjUq?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Профессия Machine Learning Engineer </a>от Skillbox — годовое обучение востребованной профессии с нуля по обновленной программе. Научитесь уверенно работать с Python и SQL, извлекать и обрабатывать информацию из различных источников, включая файлы, API и базы данных. Получите опыт в проведении EDA, d создании ML-моделей, включая нейросети и трансформеры. Сможете решать задачи прогнозирования, внедрять решения в бизнес-процессы с использованием Big Data и алгоритмов машинного обучения. Выполните более 80 практических заданий и 3 проекта, которые пополнят ваше портфолио.</li><li><a href="https://experts2.ru/CUsxkg?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Machine Learning и Deep Learning</a> от Skillfactory — углубленная программа рассчитана на 20 недель и разработана для новичков, программистов и аналитиков со знанием Python. Студенты учатся применять этот язык для обработки и анализа данных, полученных из разных источников. Также изучаются ML-модели и алгоритмы, построение рекомендательных систем, разработка и оптимизация нейросетей. Выпускникам предоставляется помощь с поиском стажировки и работы.</li><li><a href="https://experts2.ru/xiGYav?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Программирование Python и машинное обучение</a> от Coddy School — занятия для школьников 12-16 лет, желающих научится программировать и познакомиться с базовыми концепциями машинного обучения. Ребята изучат популярные библиотеки Python и научатся применять их для решения практических задач, разберут принципы Machine Learning и методы анализа данных. Курс занимает от 7 месяцев, включает разработку простых ML-моделей и их применение на практике. Программа адаптирована для юной аудитории, что позволяет эффективно усваивать сложные темы в доступной форме.</li><li><a href="https://experts2.ru/ZeRlay?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Machine Learning. Advanced</a> от Otus — дистанционный курс продолжительностью 6 месяцев адресован аналитикам, программистам, дата-сайентистам и инженерам машинного обучения. Вы познакомитесь с продвинутыми методами ML, сможете настраивать окружение и писать код, применять инструменты автоматизации, решать сложные кейсы с временными рядами, обучением с подкреплением и системами рекомендаций. Живые вебинары с опытными преподавателями, активная практика и работа над проектами. После окончания курса можно претендовать на позицию дата-сайентиста уровня Middle+.</li><li><a href="https://experts2.ru/fUtTwk?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Онлайн-курс по машинному обучению</a> от Irs.academy — 9 онлайн-уроков для новичков, программистов и аналитиков. Студенты изучат методы предобработки данных, освоят работу с линейной и логической регрессией, получат навыки работы с алгоритмами, построения рекомендательных систем и визуализации полученных данных. 3 тарифа обучения, комфортный график занятий, новые уроки открываются при условии выполнения домашних заданий, которые проверяются экспертами. После защиты проекта выпускники получают сертификат.</li><li><a href="https://experts2.ru/xbqZPa?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Python: анализ данных и машинное обучение</a> от LoftSchool — интенсивный курс для начинающих поможет за 7 недель освоить популярный язык программирования Python и его библиотеки, применяемые для аналитики. Также вы научитесь использовать возможности нейросетей, работать с Machine Learning, подбирать метрики для оценки качества алгоритмов и выполните проект для портфолио. Отработаете навыки на практических воркшопах, поработаете в команде, получите экспертное ревью вашего проекта.</li></ul><h2>Бесплатные курсы по теме</h2><p>Освоить методы работы с большими данными можно без затрат на обучение. Бесплатные курсы отлично подходят тем, кто начинает карьеру в сфере Data Science и ML.</p><p><b>1.</b> <a href="https://experts2.ru/qGsNgf?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Введение в аналитику</a> — <b>Skillbox</b></p><p>Занятия для всех, кто хочет изучить основы аналитики данных и выбрать подходящую профессию в этой области. Программа рассчитана на 1 месяц, за который вы узнаете о различных специализациях, выявите свои сильные стороны, определитесь с дальнейшим обучением и получите представление о своей будущей карьере.</p><p><b>Главное о курсе: </b></p><ul><li>обзор 11 направлений, включая BI и продуктовую аналитику;</li><li>интерактивный разбор с реальными примерами;</li><li>содержит профориентационный тест;</li><li>предоставляется бессрочный доступ к материалам.</li></ul><p><b>2. </b><a href="https://experts2.ru/kjXGyt?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Введение в Data Science‎ и машинное обучение</a> —<b> Stepik</b></p><p>Вводный курс для широкой аудитории. Вы познакомитесь с методами машинного обучения, включая деревья решений и нейронные сети, научитесь использовать популярные библиотеки Python, работать с базами данных, удаленными серверами и системой контроля версий.</p><p><b>Главное о курсе: </b></p><ul><li>подходит для начального уровня;</li><li>30 уроков, тесты, практические упражнения;</li><li>рекомендации от ведущих специалистов в области DS и ML;</li><li>выдается сертификат о прохождении обучения.</li></ul><p><b>3. </b><a href="https://experts2.ru/teqfWZ?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Введение в дата-аналитику</a> — <b>Хекслет </b></p><p>Мини-курс для начинающих, который знакомит с профессией и задачами аналитика данных. Участники узнают, чем такой специалист может помочь бизнесу и какие существуют направления в аналитике, как применяется Python для анализа данных. В практической части вы научитесь работать с электронными таблицами Google, писать запросы к базе данных на SQL, выполнять визуализацию.</p><p><b>Главное о курсе: </b></p><ul><li>обновленная учебная программа;</li><li>обучение в комфортном темпе;</li><li>практика на интерактивных тренажерах;</li></ul><p><b>4.</b><a href="https://experts2.ru/vRcGwz?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop"> Нейронные сети</a> — <b>Stepik</b></p><p>Онлайн-занятия для школьников старших классов, студентов, научных работников. Для успешной учебы необходимо знать математику на школьном уровне и уметь программировать на Python. Участники ознакомятся с алгоритмами, применяемыми для обучения различных нейросетей, научатся проводить анализ данных и визуализировать результаты исследований.</p><p><b>Главное о курсе:  </b></p><ul><li>для обучения достаточно школьного уровня математики;</li><li>24 видеоурока, тесты, задачи;</li><li>доступ к материалам открывается сразу после регистрации на сайте;</li><li>предоставляется сертификат Института биоинформатики.</li></ul><p><b>5. </b><a href="https://experts2.ru/fpXJxh?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Анализ данных в R</a>‎ — <b>Stepik</b></p><p>Программа подходит для студентов, научных работников и старшеклассников. Охватывает основные этапы статистического анализа с помощью языка программирования R, включая обработку данных, применение статистических методов и визуализацию данных.</p><p><b>Главное о курсе:  </b></p><ul><li>длительность — 3 недели, по 4–5 часов в неделю;</li><li>основы статистического анализа в R;</li><li>работа с данными и библиотеками;</li><li>инструменты визуализации результатов.</li></ul><p><b>6.</b> <a href="https://experts2.ru/zwiShY?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Основы Python и анализа данных</a> — <b>Яндекс.Практикум</b></p><p>Курс для желающих освоить профессию аналитика данных с нуля. Студенты изучат основы анализа данных с помощью SQL, Python и инструментов BI, что поможет получить востребованные навыки для работы в различных сферах аналитики.</p><p><b>Главное о курсе:  </b></p><ul><li>более 70% обучения отведено практике;</li><li>работа с SQL, Python, PostgreSQL и DataLens;</li><li>проекты на основе реальных кейсов.</li></ul><p><b>7. </b><a href="https://experts2.ru/BewsgA?sub1=tproger-kf&amp;sub2=big-data-kursy&amp;sub4=netop">Hadoop. Система для обработки больших объемов данных</a> — <b>Stepik</b></p><p>Занятия подготовлены для студентов старших курсов и разработчиков начального или среднего уровня. Учащиеся познакомятся с методами обработки и хранения больших данных с использованием платформы Hadoop.</p><p><b>Главное о курсе: </b></p><ul><li>актуальные учебные материалы;</li><li>33 урока, 12,5 часов видео;</li><li>более 200 тестов и 29 интерактивных задач;</li><li>занятость — 3 часа в неделю.</li></ul><p><b>8. </b><a href="https://www.youtube.com/watch?v=kxjr9OcxvlM&amp;list=PLcsjsqLLSfNCB0yQMHoGsVFx2axpqjlSR">Основы программирования и анализа данных на Python</a> — <b>teach-in</b></p><p>Видеоурок по основам работы с Python с нуля. Рассматриваются возможности этого языка, области его применения, базовые принципы программирования, такие как работа с циклами, условиями, рекурсией и автоматизацией. Обучение сопровождается практическими примерами.</p><p><b>Главное о курсе:  </b></p><ul><li>длительность — 1,5 часа;</li><li>введение в Python и его применение в различных сферах;</li><li>основы программирования;</li><li>ответы на вопросы студентов.</li></ul><p><b>9. </b><a href="https://www.youtube.com/playlist?list=PL15mR4o-R9Ng3Fh8Z2HpLdQeJQHSoNKcp">Курс лекций по Big Data</a> — <b>Sergey Petrovich</b></p><p>10 уроков на платформе YouTube посвящены основам работы с большими данными и машинному обучению. Big Data обучение ориентировано на студентов, начинающих специалистов в сфере Data Science, а также всех, кто хочет разобраться в принципах анализа, хранения и обработки больших объемов информации. Рассматриваются ключевые концепции больших данных, алгоритмы машинного обучения, регрессия, глубокое обучение и другие актуальные темы.</p><p><b>Главное о курсе:  </b></p><ul><li>введение в машинное обучение;</li><li>Python для анализа данных;</li><li>взаимосвязь Интернета вещей (IoT) и Big Data;</li><li>регрессия и методы прогнозирования.</li><li>технологии хранения и анализа данных;</li><li>основы глубокого обучения.</li></ul><h2>Профессия аналитика больших данных</h2><p>Сфера Big Data стремительно набирает популярность в мире, поскольку данные становятся основой для принятия решений в бизнесе, медицине, финансах и других отраслях.</p><h2>Чем занимается аналитик больших данных?</h2><p>Аналитик больших данных (или специалист по Big Data) — это профессионал, который занимается обработкой и анализом массивов данных, которые невозможно эффективно обрабатывать с помощью традиционных инструментов. Его работа заключается в создании и оптимизации алгоритмов, которые позволяют извлекать полезную информацию из больших объемов данных, чтобы сделать бизнес-процессы более эффективными и прибыльными. Это включает в себя работу с различными источниками данных, их очистку, а также создание моделей, которые помогают в принятии обоснованных решений.</p><h2>Навыки специалиста по Big Data</h2><p>Успешный аналитик больших данных обладает следующими знаниями и навыками:</p><ul><li>знание языков программирования, например, Python, R;</li><li>опыт работы с SQL, NoSQL, Hadoop, Hive;</li><li>уверенное владение рабочими программами Excel и Power BI;</li><li>умение применять алгоритмы машинного обучения для прогнозирования и анализа данных;</li><li>математическое и статистическое мышление, внимательность, способность анализировать данные и выявлять закономерности;</li><li>знание бизнес-анализа и отчетности, понимание того, как данные могут помочь в принятии бизнес-решений;</li><li>умение работать в команде;</li><li>навыки презентации для представления результатов исследований.</li></ul><h2>Где учиться на аналитика больших данных?</h2><p>Фундаментальное образование по этой специальности можно получить в высших учебных заведениях. Например, в Санкт-Петербургском государственном университете есть очная программа бакалавриата <a href="https://spbu.ru/postupayushchim/programms/bakalavriat/iskusstvennyy-intellekt-i-nauka-o-dannykh">Искусственный интеллект и наука о данных</a>, которая займет 4 года. Пройти дистанционное обучение <a href="https://www.hse.ru/ma/bigdata-analytics/">аналитик больших данных</a> по двухлетней магистерской программе предлагает Высшая школа экономики.</p><p>Если вас интересует быстрый старт в профессии или точечное совершенствование знаний, имеет смысл обратить внимание на онлайн-курсы. При выборе такого формата обучения на освоение инструментов аналитики данных, Machine Learning и работы с Big Data вам понадобится от нескольких недель до 1 года. Самостоятельный поиск подходящего курса может занять много времени, поэтому предлагаю вам воспользоваться подборкой, представленной в этой статье.</p><h2>Сколько зарабатывает аналитик больших данных?</h2><p>Зарплата аналитиков больших данных зависит от опыта специалистов, региона и типа компании. Согласно данным <a href="http://hh.ru">hh.ru</a>, крупного онлайн-портала по поиску работы и сотрудников, <a href="https://hh.ru/vacancy/117880799?query=big+data&amp;hhtmFrom=vacancy_search_list">начинающие специалисты по Big Data</a> могут рассчитывать на заработную плату от 60 0000 рублей до 100 000 рублей в месяц. Зарплата <a href="https://hh.ru/vacancy/118128471?query=%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D0%BA+big+data&amp;hhtmFrom=vacancy_search_list">опытного специалиста</a> составляет в среднем от 150 000 рублей в месяц и выше.</p><h2>Заключение</h2><p>Аналитика данных становится основой для принятия решений и развития бизнеса. Технологии обработки больших данных применяются во многих сферах, включая финансовые услуги, здравоохранение, маркетинг, науку, что создает постоянный спрос на высококвалифицированных специалистов. Если вы хотите стать экспертом в одной из самых перспективных областей, Big Data курсы станут первым шагом на пути к успешной карьере. Это отличный способ не только изучить теорию, но и развить практические навыки, освоить новейшие инструменты для работы с большими данными и повысить свою конкурентоспособность на рынке труда.</p><p><b>Подборки по схожим темам:</b><b></b></p><ol><li><a href="https://tproger.ru/articles/kursy-po-analitike-dannyh">Лучшие курсы по анализу данных</a></li><li><a href="https://tproger.ru/articles/kursy-po-biznes-analitike">Лучшие курсы для бизнес-аналитиков</a></li><li><a href="https://tproger.ru/articles/kursy-sistemnogo-analitika">Лучшие курсы по системной аналитике</a></li></ol><p><i>Если вы обнаружили в статье устаревшую или некорректную информацию, сообщите, пожалуйста, об этом в комментариях. Там же вы можете поделиться информацией о проверенном вами онлайн-курсе, и я с удовольствием добавлю его в подборку.</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Межгалактическая команда. 1 серия</title>
      <link>https://tproger.ru/articles/mezhgalakticheskaya-komanda--1-seriya</link>
      <comments>https://tproger.ru/articles/mezhgalakticheskaya-komanda--1-seriya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дима Дмитриев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/mezhgalakticheskaya-komanda--1-seriya</guid>
      <description><![CDATA[<p>Спецпроект от Tproger и Мир Plat.Form.  Подписывайтесь, голосуйте, как поступать главному герою и не пропускайте продолжение комикса.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/mezhgalakticheskaya-komanda--1-seriya">Межгалактическая команда. 1 серия</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 23 Dec 2024 17:38:55 GMT</pubDate>
      <content:encoded><![CDATA[<p>Добро пожаловать в межгалактическую систему <a href="https://tprg.ru/VaoQ">Мир Plat.Form</a>! Вместе с новичком Эндрю вы узнаете, как работают потоки данных в системе, чем занимаются специалисты команды и что предстоит пройти новым сотрудникам на этапе обучения.</p><figure><img src="https://media.tproger.ru/user-uploads/99633/2024-12-23/62d5f1eb-8ff7-41a9-b720-5992cc29a45a.jpg" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/99633/2024-12-23/becb267c-482f-4da3-a523-fa48e9b87269.jpg" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/99633/2024-12-23/f631af46-d351-4ad9-b126-fe0721e98660.jpg" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/99633/2024-12-23/459c8d09-c772-47ea-8c06-38af8f24e291.jpg" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/99633/2024-12-23/c2c2f93c-a5ba-4516-8c04-32c94cd08d14.jpg" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/99633/2024-12-23/c11d6bd7-dc2d-4423-915c-f0d0167e28ec.jpg" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/99633/2024-12-23/17489c23-00e9-44fa-98cc-88607a593176.jpg" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/99633/2024-12-23/9d27f521-fd08-4427-929d-4f26075846cb.jpg" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/99633/2024-12-23/bce9f7f8-4ca3-4d9d-a6ab-3baad313e54b.jpg" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/99633/2024-12-23/af489f55-9105-4d3f-8573-e3c5c3762b3f.jpg" alt="" /></figure><p><i>Реклама. Рекламодатель: АО «НСПК» ИНН 7706812159, erid: 2W5zFH8wt5E</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Методы сжатия данных: алгоритмы и инструменты</title>
      <link>https://tproger.ru/articles/metody-szhatiya-dannyh--algoritmy-i-instrumenty-251908</link>
      <comments>https://tproger.ru/articles/metody-szhatiya-dannyh--algoritmy-i-instrumenty-251908?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Владислав Устинов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/metody-szhatiya-dannyh--algoritmy-i-instrumenty-251908</guid>
      <description><![CDATA[<p>Методы сжатия данных. Показываем, какие есть алгоритмы и инструменты. Рассматриваем реальные примеры и кейсы ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/metody-szhatiya-dannyh--algoritmy-i-instrumenty-251908">Методы сжатия данных: алгоритмы и инструменты</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы сжатия]]></category>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 18 Sep 2024 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Классификация методов сжатия данных</h2><p>Наверняка вы сталкивались с zip–архивами, сохраняли фото в jpeg или смотрели видео в 144p — всё это примеры сжатых данных. Когда мы говорим о сжатии (компрессии), то имеем в виду уменьшение исходного размера без потери содержимого. Так можно хранить больше информации, быстрее её передавать и считывать.</p><p>Методы сжатия данных принято делить на 2 категории: с потерей и без потери. Рассмотрим их подробнее.</p><h3>Сжатие с потерями (lossy)</h3><p>При сжатии данных с потерями мы безвозвратно удаляем часть информации. Но делаем это так, чтобы не потерять общую суть.</p><p>Например, надо сжать картинку для сайта, чтобы он быстрее прогружался. Ниже два варианта одного изображения. Один исходник, второй сжатый. Как думаете — какой где?</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2024-09-16/3b566655-b869-40b1-9e31-bc07cb391d37.png" alt="Методы сжатия данных" /><figcaption>Вариант 1</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/105039/2024-09-16/2c77669c-fc49-4448-877e-5afcfa0fdc02.png" alt="Алгоритмы и инструменты сжатия" /><figcaption>Вариант 2</figcaption></figure><p>По идее исходник должен уступать оригиналу в визуальном плане, однако разницы между этими изображениями практически не видно.</p><p>Оригинал — первое изображение в формате png. Второе — сжатый вариант в формате jpeg.</p><p>Казалось бы, вариант 2 должен был потерять качество, и это произошло. При компрессии были удалены некоторые похожие оттенки цветов и лишние детали, а размер файла уменьшился с 2.38МБ до 145 КБ. При этом визуально он все еще выглядит неплохо.</p><p>То же самое происходит и при работе с аудио и видео. В файле могут содержаться звуки, которые не воспринимает человеческое ухо, статичные элементы, которые не изменяются от кадра к кадру. Всё это излишки, которые можно отбросить без потери смысла.</p><h3>Сжатие данных без потерь (lossless)</h3><p>При методах сжатия без потерь мы не удаляем лишние данные, а стараемся упаковать их более компактно.</p><p>Допустим, нам нужно составить список покупок. Мы можем записать его так:</p><p>Однако некоторые продукты повторяются здесь несколько раз, поэтому эту запись можно сделать более компактной вот так:</p><h2>Популярные алгоритмы сжатия данных без потерь</h2><p>Давайте рассмотрим три наиболее распространенных метода сжатия без потерь.</p><h3>Huffman coding</h3><p>Метод Хаффмана позволяет нам компактно закодировать данные при помощи манипуляций с частотой объектов и выстраивания дерева. А еще его включают в себя многие другие алгоритмы и форматы сжатия.</p><p>Рассмотрим пошагово кодирование Хаффмана на примере сжатия слова: «compression».</p><h4>Шаг 1 — строим таблицу частотности</h4><p>Определяем, сколько раз тот или иной символ встречался в тексте. Записываем символы в таблицу в порядке убывания. Под ними указываем частоту.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2024-09-16/4261ae8b-a6f4-4c6f-a9a0-3f8228e014fd.png" alt="Методы сжатия данных" /><figcaption>Частота символов в тексте</figcaption></figure><h4>Шаг 2 — строим дерево</h4><p>Записываем символы как листья дерева. Их частотность будет весом.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2024-09-16/5556973a-367f-4c99-b652-757fbdd757e4.png" alt="Алгоритмы и инструменты сжатия" /><figcaption>Символы как листья</figcaption></figure><p>Находим два крайних правых листа и строим над ними новый. Записываем в него символы и сумму их частот.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2024-09-16/373a9ffe-c82f-4793-98f3-e158070ed1f0.png" alt="Методы сжатия данных" /><figcaption>Формирование нового листа «in»</figcaption></figure><p>Мы создали лист «in» с весом 2. Формируем листы дальше.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2024-09-16/5336b2d9-e436-4eec-8121-c184db207d57.png" alt="Алгоритмы и инструменты сжатия" /><figcaption>Формирование нового листа «ein»</figcaption></figure><p>Теперь мы построили лист «ein» с весом 3 из «in» и «e». Продолжаем до тех пор, пока не создадим последний лист.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2024-09-16/de080d1d-22fd-461b-b746-a5e5bbe9c491.png" alt="Методы сжатия данных" /><figcaption>Итоговое дерево</figcaption></figure><h4>Шаг 3 — кодируем текст</h4><p>Мы закончили строить дерево. Теперь можно приступить к кодированию знаков.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2024-09-16/0fff8763-d67c-4e02-ba9f-4f022d68a716.png" alt="Алгоритмы и инструменты сжатия" /><figcaption>Коды дерева</figcaption></figure><p>Вершина «oscmprein» является корнем нашего дерева, так как обладает наибольшим весом — 11.</p><p>Каждая линия означает один бит. Для линий справа это единица, слева — ноль. Теперь при помощи битов линий мы кодируем каждый символ. Для этого необходимо представить путь от корня до нужного знака. Сочетание битов линий на пути будет нашим кодом.</p><p>Например, между «o» и корнем «oscmprein» есть только одно ребро, которое равно нулю. Следовательно, «o» это 0. От корня до «s» ведут две линии: один и ноль. Значит, код будет 10. И так до узла «n», код которого 11111111.</p><p>В итоге получим следующую кодировку символов:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2024-09-16/8f0870f6-319e-4fd3-949d-f8aab4ecf1d9.png" alt="Методы сжатия данных" /><figcaption>Итоговый код Хаффмана</figcaption></figure><p>В изначальном варианте «compression» весит 88 бит, но благодаря методу Хаффмана мы сжали его до 48 бит.</p><h3>Lempel-Ziv-Welch (LZW)</h3><p>Метод Лемпеля создает словарь, где кодирует символы, слова и сочетания слов. Давайте рассмотрим принцип работы данного алгоритма на примере текста: «The big big big cat sat on the mat mat mat. The big big cat ate the fat fat rat. The cat cat cat sat sat sat.»</p><h4>Шаг 1 — создаем словарь</h4><p>Начнем с создания словаря, содержащего все возможные одиночные символы и их коды. В нашем случае мы будем использовать ASCII-коды для простоты:</p><h4>Шаг 2 — сжимаем текст и расширяем словарь</h4><p>Теперь будем читать каждый символ из фразы. Если он уже есть в словаре, то считаем комбинацию символов:</p><ul><li>Читаем «T». Проверяем его в словаре. Записываем код (84).</li><li>Проверяем его сочетание со следующим символом. «Th» нет в словаре.</li><li>Присваиваем для «Th» код 256.</li><li>Читаем «h». Есть в словаре, пишем код (104).</li><li>Проверяем «he». Этого сочетания нет в словаре.</li><li>Присваиваем код 257.</li></ul><p>Продолжаем этот процесс для всей фразы. Как только данный метод наткнется на комбинацию знаков, которая уже есть в словаре, он заменит её кодом. Не каждый знак по отдельности, а всё сочетание.</p><p>Например, слово «big» повторяется пять раз. Первое повторение мы закодируем по коду символов «b», «i», «g»: 98 105 103.</p><p>Так как в словаре нет сочетаний «bi» и «ig», присвоим им новые коды и добавим в словарь:</p><p>При следующем повторении мы закодируем «big» как 260 261, а не 98 105 103.</p><p>В итоге получим вот такой код:</p><p>Исходная фраза весила 73 байта, но мы сжали её до 53 байт.</p><h3>Deflate</h3><p>На самом деле с этим алгоритмом мы уже сталкивались. Ну, почти. Он основан на двух методах сжатия без потерь: LZ77 и коде Хаффмана. LZ77 — более старая версия LZW. Они отличаются только тем, что LZ77 не создает словарь с кодами — вместо этого он использует ссылки. Для примера возьмем текст: «The big big big cat sat on the mat mat mat».</p><h4>Шаг 1 — определяем повторяющиеся подстроки</h4><p>Это будут:</p><ul><li>big;</li><li>cat;</li><li>mat.</li></ul><h4>Шаг 2 — создаем ссылки</h4><p>Ссылки записываем в следующем формате:</p><p>Например, буква «b» в слове «big» является пятым по порядку символом, если смотреть относительно всего текста. При счете с нуля её индекс — 4. Слово состоит из трех букв. Поэтому наша ссылка выглядит так:</p><p>Аналогично с cat (16,3) и mat (31,3).</p><h4>Шаг 3 — сжимаем текст</h4><p>Последовательно записываем наш текст, заменяя повторения ссылками:</p><h4>Шаг 4 — применяем метод Хаффмана</h4><p>Далее в дело вступает сжатие данных методом Хаффмана. По вышеописанному принципу мы разбиваем этот код на отдельные знаки, ранжируем их по частотности, строим дерево и кодируем каждый символ.</p><h2>Алгоритмы сжатия с потерями</h2><h3>JPEG (для изображений)</h3><p>Сжатие данных исходного изображения в jpeg происходит в четыре этапа.</p><h4>Этап 1 — переводим в цветовое пространство YCbCr</h4><p>YCbCr — цветовой профиль, который условно можно представить как три маски.</p><p>Y — чёрно-белая картинка, которая демонстрирует уровень яркости.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2024-09-16/89736c5c-70c3-4a11-96c0-646d185f0ea8.png" alt="Методы сжатия данных" /><figcaption>Y-канал</figcaption></figure><p>Cb — синий канал.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2024-09-16/08b8722d-bc22-436a-92b4-f52c5254229b.png" alt="Алгоритмы и инструменты сжатия" /><figcaption>Cb-канал</figcaption></figure><p>Cr — красный канал.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2024-09-16/2afcbe1b-917a-4868-8064-599a24954fc4.png" alt="Методы сжатия данных" /><figcaption>Cr-канал</figcaption></figure><p>Так мы сможем отделить цвета от яркости.</p><p>Если что, отсутствие синих и красных оттенков нормально, потому что каналы Cb и Cr не представляют напрямую синий и красный цвета. Они показывают отклонения от нейтрального серого в сторону сине-желтого (Cb) и красно-зеленого (Cr) спектров.</p><h4>Этап 2 — Дискретное косинусное преобразование (DCT)</h4><p>На этом этапе нужно понять, как много деталей содержится в разных частях изображения. Для этого делим картинку на блоки 8 на 8 пикселей. Далее раскладываем каждый блок на паттерны при помощи дискретного косинусного преобразования. Паттерны  — это пространственные волны, которые мы можем представить в виде 64 картинок.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2024-09-16/3f7995d8-3602-402f-b4cd-0a3051a8a2bd.png" alt="Алгоритмы и инструменты сжатия" /><figcaption>64 паттерна</figcaption></figure><p>Комбинируя их, можно повторить любое изображение 8x8 пикселей.</p><p>У каждого паттерна есть свой вес, который можно менять — его называют коэффициентом. DCT определяет, на какие паттерны с какими коэффициентами можно разложить блок.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2024-09-16/b6754156-1a82-48c7-ad65-4b40b95c182c.jpg" alt="Методы сжатия данных" /><figcaption>Пример коэффициентов блока</figcaption></figure><h4>Этап 3 — Квантование</h4><p>Есть объекты, которые человеческий глаз не видит, либо почти не видит, поэтому некоторые детали на фото не нужны. Найти их помогает таблица квантования. В ней прописаны значения коэффициентов, по которым становится понятно, важны детали на блоке или нет. При помощи этих значений мы округляем коэффициенты паттернов до целых чисел. Если они близки или равны нулю, то содержат минимум важных деталей. Последовательности нулей удаляем, и вместо них записываем в скобках один ноль и число его повторений.</p><h4>Этап 4 — сжатие Хаффмана</h4><p>Да-да. Здесь опять вступает в игру метод сжатия Хаффмана, который сжимает нашу последовательность еще сильнее.</p><h3>MP3 и ACC (для аудио)</h3><p>MP3 и ACC — это два формата компрессии аудио с потерями. Сжатие в них работает аналогично сжатию в jpeg.</p><h4>Этап 1 — раскладываем звук на волны</h4><p>Мы раскладываем звук на несколько кусочков — фреймов. Эти фреймы разделяем на волны.</p><h4>Этап 2 — находим у волн лишние частоты</h4><p>У каждой волны есть своя частота. Некоторые частоты человек не воспринимает, поэтому MP3 использует психоакустическую модель. Она удаляет такие частоты, а еще заменяет похожие волны одной.</p><p>ACC использует более свежую и, потому, совершенную версию психоакустической модели, благодаря чему точнее определяет излишние частоты.</p><h4>Этап 3 — округляем коэффициенты частот</h4><p>Далее начинается квантование. Мы округляем коэффициенты частот. Те, что слышим хуже, получают меньше битов, и наоборот.</p><p>Если последовательность частот равна нулю, то удаляем нули и заменяем их записью по типу:</p><p>(0, количество повторений). Точно как с jpeg.</p><h4>Этап 4 — пропускаем через алгоритм Хаффмана</h4><p>В конце получаем последовательность битов, которые означают коэффициенты частот. Проводим сжатие данных алгоритмом Хаффмана.</p><h3>H.264 и HEVC (для видео)</h3><p>H.264 и HEVC — это стандарты видео сжатия. Еще их называют кодеки. Вот основные этапы сжатия видео:</p><h4>Этап 1 — разбиение на кадры и блоки</h4><p>Разбиваем видео на кадры. Каждый кадр раскладываем на блоки:</p><ul><li>16x16 пикселей в H264.</li><li>64x64 в HEVC (H.265).</li></ul><p>Благодаря этим небольшим блокам мы можем отслеживать изменения в кадрах.</p><h4>Этап 2 — формируем I,P,B-кадры</h4><p>Далее мы сравниваем последовательности блоков кадров между собой. Если видим смещения, то создаем векторы, в которые записываем информацию о направлении смещений и их длине в пикселях.</p><p>Этим методом формируем три категории кадров:</p><ol><li>I-кадры (intra-coded frames) — это опорные кадры, которые кодируются без учета других кадров. Они содержат полную информацию о текущем изображении и служат отправной точкой для декодирования других кадров. Такие кадры наиболее «тяжелые» по объему, но необходимы для восстановления видео.</li><li>P-кадры (predictive frames) основываются на предыдущих I- или P-кадрах. В них кодируется только информация о различиях между текущим кадром и предыдущим, что значительно сокращает объем данных.<br /></li><li>B-кадры (bi-predictive frames) используют как предыдущие, так и последующие кадры для предсказания текущего кадра. Это делает их наиболее эффективно сжимаемыми, поскольку они могут использовать информацию из двух направлений — как вперед, так и назад. Однако их обработка требует больше вычислительных ресурсов.<br /></li></ol><p>P и B кадры — это не статичные изображения, а всего лишь информация о том, какая часть кадра изменилась, в каком направлении и как.</p><p>Представим последовательность кадров:</p><p>В I-кадре статичная картинка. В первом P-кадре мы повторяем предыдущий I-кадр и благодаря информации о смещении дорисовываем его часть. То же самое проделываем со вторым P-кадром относительно первого P-кадра.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2024-09-16/b2d0db25-ba46-4d6c-a544-f19cea7b0842.jpg" alt="Алгоритмы и инструменты сжатия" /><figcaption>Условный пример работы I,P-кадров</figcaption></figure><p>Таким образом, мы как бы изучаем все кадры, создаем болванку и дублируем её в следующих кадрах, дорисовывая некоторые фрагменты.</p><h4>Этап 3 — выводим коэффициенты</h4><p>Далее работаем с кадрами так же, как с jpeg. Прогоняем через дискретное косинусное преобразование и выводим коэффициенты деталей.</p><h4>Этап 4 — округляем, убираем излишки и кодируем по Хаффману</h4><p>Округляем их при помощи квантования, сокращаем коэффициенты близкие или равные нулю и используем метод сжатия Хаффмана.</p><h2>Инструменты для сжатия данных</h2><h3>ZIP и GZIP</h3><p>ZIP и GZIP — это утилиты для архивирования файлов. Они уменьшают размер данных без потери информации.</p><ul><li><b>ZIP</b> использует алгоритмы из метода  Deflate, который мы рассматривали выше. Преимущества ZIP в том, что он поддерживается практически на всех операционных системах и способен сжимать несколько файлов.</li><li><b>GZIP</b> используется на серверах для уменьшения объёма данных, передаваемых по сети. GZIP также основан на алгоритме Deflate, но в нем нет реализации методов сжатия многокомпонентных архивов. Это значит, что он не умеет сжимать несколько файлов.</li></ul><h3>FFmpeg</h3><p>FFmpeg — фреймворк, который применяется для сжатия, конвертации и обработки медиафайлов.</p><p>FFmpeg поддерживает широкий набор кодеков и форматов, включая H.264, H.265 для видео и AAC, MP3 для аудио.</p><p>Но его возможности не ограничиваются только сжатием. По сути, это движок с инструментами  для редактирования медиафайлов. Здесь мы можем сделать нарезку, применить фильтры, конвертировать в другие форматы и много чего еще.</p><h3>7-Zip</h3><p>7-Zip — бесплатная утилита для сжатия данных, которая поддерживает формат 7z, а еще там есть ZIP, RAR, и TAR.</p><p>Основное преимущество 7-Zip в его высоком уровне сжатия. Здесь применяется метод сжатия LZMA. Это модифицированная версия LZ77.</p><p>LZMA, так же как и LZ77, ищет повторяющиеся последовательности и заменяет их ссылками. Но еще он использует метод Маркова для предсказания вероятности появления символов.</p><p>7-Zip также поддерживает создание защищённых паролем архивов с шифрованием и работает на большинстве платформ, включая Windows и Linux.</p><h2>Преимущества и недостатки различных методов сжатия</h2><h3>Баланс между эффективностью сжатия, скоростью и качеством данных</h3><h4>Сжатие без потерь</h4><p>Лучше всего подходит для текстов, программного кода, баз данных и других типов данных, где принципиально важно сохранить всю информацию. При этом приходится мириться с ограниченным уровнем сжатия, особенно если мы используем данные, где мало повторяющихся элементов. Это может быть критично при работе с медиафайлами.</p><p>Поэтому методы сжатия данных без потерь лучше применять, когда сохранение качества данных важнее эффективности сжатия и скорости.</p><h4>Сжатие с потерями</h4><p>Позволяет достичь значительно большего уменьшения размера файлов за счёт удаления излишков данных, таких как мелкие детали изображения или неслышимые частоты в аудио.</p><p>Подходит только для данных, где не критично потерять часть информации. При этом стоит иметь в виду, что алгоритмы сжатия с потерями могут сильно убить качество, если использовать высокую степень сжатия.</p><p>Методы сжатия с потерями уместны когда для нас важнее скорость и компактность, чем изначальное качество.</p><h3>Как выбрать метод сжатия данных</h3><p>Выбор способа сжатия данных зависит от задачи.</p><h4>Для хранения архивов</h4><p>Zip, 7-zip или RAR-архивы станут отличными инструментами, если нам нужно просто сохранить набор файлов на компьютере.</p><p>Они умеют компрессировать сразу несколько файлов при помощи методов сжатия без потери данных.</p><h4>Для сжатия веб-сайтов</h4><p>Для оптимизации сайта подойдет формат gzip. Он умеет сжимать html и css без потерь, благодаря чему веб-страницы быстрее прогружаются.</p><h4>Для изображений</h4><p>Когда мы делаем снимки на смартфон для соцсетей, JPEG формат будет оптимальным выбором, поскольку сохраняет баланс между качеством и размером файла.</p><p>Но если мы увлекаемся профессиональной фотографией, то стоит выбрать RAW формат — он содержит максимум данных, которые нужны для обработки.</p><h4>Для видео</h4><p>Для любительской съемки и просмотра видео подойдет Кодек H264. Но если мы занимаемся видеопроизводством профессионально, то для редактирования нам подойдут форматы вроде ProRes. А финальную версию можно сохранить в H.265 (HEVC).</p><h4>Для аудио</h4><p>Чтобы послушать музыку на смартфоне или в машине, нам хватит MP3 или ACC формата. Но для аудиофилов и тех, кто занимается музыкой профессионально, подойдет формат без потери данных FLAC.</p><p><i>А с какими методами сжатия работаете вы? Расскажите в комментариях</i>👇</p>]]></content:encoded>
    </item>
    <item>
      <title>Вот это поворот: комбинация команд find и mkdir из GNU оказалась тьюринг-полной</title>
      <link>https://tproger.ru/news/vot-eto-povorot--kombinaciya-komand-find-i-mkdir-iz-gnu-okazalas-tyuring-polnoj</link>
      <comments>https://tproger.ru/news/vot-eto-povorot--kombinaciya-komand-find-i-mkdir-iz-gnu-okazalas-tyuring-polnoj?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/vot-eto-povorot--kombinaciya-komand-find-i-mkdir-iz-gnu-okazalas-tyuring-polnoj</guid>
      <description><![CDATA[<p>Использование команд find и mkdir в bash-скриптах позволяет реализовать сложные алгоритмы и вычисления. Узнайте, как эти команды помогают достигать новых высот в программировании.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/vot-eto-povorot--kombinaciya-komand-find-i-mkdir-iz-gnu-okazalas-tyuring-polnoj">Вот это поворот: комбинация команд find и mkdir из GNU оказалась тьюринг-полной</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 02 Aug 2024 04:35:31 GMT</pubDate>
      <content:encoded><![CDATA[<p>В мире программирования команды find и mkdir из пакета GNU давно используются для управления файловой системой.</p><p>Однако недавнее открытие <a href="https://ogiekako.vercel.app/blog/find_mkdir_tc">показало</a>, что сочетание этих команд может достичь тьюринг-полноты. Это означает, что они способны имитировать поведение любой другой вычислительной системы, включая выполнение сложных алгоритмов и программ.</p><h2>Доказательство</h2><p>Исследователи показали тьюринг-полноту комбинации команд find и mkdir с помощью реализации систем тегов (tag systems).</p><p>Система тегов — это триплет (<i>m</i>, <i>A</i>, <i>P</i>), где <i>m</i> — положительное целое число, <i>A</i> — конечный алфавит, включающий символ завершения <i>H</i>, и <i>P</i> — правило производства для каждого символа алфавита.</p><h2>Конструкция цикла</h2><p>Простейшая демонстрация заключается в создании бесконечного цикла:</p><p>Эта команда рекурсивно создает каталоги, попадая в бесконечный цикл. Для ограничения глубины создания каталогов можно использовать опцию -maxdepth:</p><h2>Пример FizzBuzz</h2><p>Используя опцию -regex команды find, можно фильтровать имена файлов и выполнять действия в зависимости от результата:</p><p>Этот код создает иерархию каталогов, где выводится FizzBuzz, если количество каталогов кратно 15, Buzz — если кратно 5, Fizz — если кратно 3, и количество каталогов в противном случае.</p><h2>Реализация систем тегов</h2><p>Системы тегов — это пример, показывающий, как можно реализовать тьюринг-полный механизм с помощью команд find и mkdir. В данном примере используется система тегов с <i>m = 2</i> и алфавитом из четырех символов.</p><p>Этот код демонстрирует, как с помощью комбинации команд find и mkdir можно реализовать тьюринг-полную систему тегов.</p>]]></content:encoded>
    </item>
    <item>
      <title>Алгоритм Дейкстры: как работает и где используется</title>
      <link>https://tproger.ru/articles/algoritm-dejkstry--kak-rabotaet-i-gde-ispolzuetsya</link>
      <comments>https://tproger.ru/articles/algoritm-dejkstry--kak-rabotaet-i-gde-ispolzuetsya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дарья Закаулова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/algoritm-dejkstry--kak-rabotaet-i-gde-ispolzuetsya</guid>
      <description><![CDATA[<p>Алгоритм Дейкстры: поиск кратчайших путей в графе. Разбираем сложность O(n²+m), реализацию на C++, ограничения и применение в навигации и компьютерных сетях.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/algoritm-dejkstry--kak-rabotaet-i-gde-ispolzuetsya">Алгоритм Дейкстры: как работает и где используется</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 06 Jun 2024 10:30:02 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Зачем нужен этот алгоритм</h2><p><b>Алгоритм Дейкстры</b> — это алгоритм на графах для нахождения кратчайших путей от заданной вершины до всех остальных вершин во взвешенном графе с неотрицательными весами рёбер, предложенный нидерландским математиком Эдсгером Дейкстрой в 1956 году. Алгоритм Дейкстры используют для решения «задачи о кратчайших путях с единственным источником». Она заключается в поиске кратчайших путей от заданной вершины до всех остальных во взвешенном графе с неотрицательными весами.</p><p>Алгоритм Дейкстры — классический алгоритм нахождения кратчайших путей от одной вершины до всех остальных во взвешенном графе с неотрицательными весами рёбер.</p><p>Сложность простейшей реализации — <b>O(n² + m)</b>, с очередью приоритетов (двоичной кучей) — <b>O((n + m) log n)</b>, что делает алгоритм эффективным на разреженных графах.</p><p>Алгоритм не работает с отрицательными весами рёбер. Для таких задач используют алгоритм Беллмана-Форда (сложность O(nm)) или алгоритм Джонсона.</p><p>Применяется в навигации (Google Maps, GPS), маршрутизации в компьютерных сетях (OSPF), робототехнике, системах бронирования и игровых движках.</p><p>Для закрепления материала рекомендуем порешать задачи на acmp.ru — ссылки на практические задачи приведены в конце статьи.</p><p>Далее будем использовать следующие обозначения, описывающие характеристики графа:</p><ul><li><b>n — </b>количество вершин в графе;</li><li><b>m —</b> количество ребер в графе;</li><li><b>s —</b> стартовая вершина.</li></ul><p>Алгоритм Дейкстры выполняется за n итераций. На каждой итерации выбирается вершина <b>v</b> с минимальным значением <b>d[v]</b> среди непомеченных вершин. Эта вершина <b>v</b> затем отмечается как помеченная.</p><p>Далее на текущей итерации происходит этап релаксации. В этом этапе просматриваются все ребра <b>(v, to)</b>, исходящие из вершины <b>v</b>, и проверяется, можно ли улучшить значение<b> d[to]</b>.</p><p>То есть, если длина рассматриваемого ребра равна <b>l</b>, тогда <b>d[to] = min(d[to], d[v] + l)</b>. При успешной релаксации, то есть когда удалось улучшить расстояние до вершины <b>to</b>, в массиве <b>p</b> указывается, что предшественником на кратчайшем пути к вершине <b>to</b> является вершина <b>v</b>, то есть <b>p[to] = v</b>.</p><p>На этом итерация заканчивается.</p><p>По завершении <b>n</b> итераций все вершины графа оказываются помеченными, и алгоритм заканчивает выполнение.</p><p>Важно заметить, что если из начальной вершины <b>s</b> невозможно построить путь до некоторых вершин графа, их значения <b>d[v]</b> останутся бесконечными. Алгоритм можно завершить досрочно, как только будет выбрана вершина с бесконечным значением расстояния.</p><p>Рассмотрим работу алгоритма на примере. Будем искать кратчайшие пути от вершины <b>4</b>.</p><p>Изначально массивы <b>u</b> (посещений), <b>d</b> (расстояния) и <b>p</b> (предков) для графа из примера имеют следующие значения:</p><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/2bbde186-cac1-4280-9f92-3c033151316a.png" alt="" /><figcaption>Изначальные значения</figcaption></figure><p>На первой итерации мы выбираем вершину <b>v</b> с наименьшим значением <b>d[v]</b>. Очевидно, что на первом шаге будет выбрана стартовая вершина — <b>4</b>.</p><p>Помечаем её посещённой <b>u[4] = true</b>.</p><p>Дальше проходим по всем соседям вершины <b>4</b> и пытаемся улучшить для них значения в массиве <b>d</b>. Для всех вершин, расстояние до которых удалось улучшить, в список предков записываем вершину <b>4</b>. На первой итерации удалось улучшить расстояния до вершин <b>1, 5, 6</b>. В результате значения массивов <b>u, d, p </b>изменились следующим образом:</p><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/5a04596c-2471-4a1c-a123-7634520f5c95.png" alt="" /><figcaption>После первой итерации</figcaption></figure><p>На следующем шаге выбираем вершину <b>6</b>. Улучшаем расстояния до вершин <b>3</b> и <b>7</b>. 
<br /></p><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/fa317dcf-256f-4bd4-ab15-a173695cd48a.png" alt="" /><figcaption>После второй итерации</figcaption></figure><p>Следующая непосещённая вершина с минимальным весом — <b>1</b>.</p><p>Расстояние от вершины <b>4</b> до вершины <b>1</b> равняется <b>3</b>. Пытаемся улучшить расстояние до всех её соседей. Так, например, можно улучшить расстояние до вершины <b>5</b>. Ранее оно было равно <b>8</b>, а после релаксации это значение уменьшается:</p><p><b>d[5] = min(d[5], d[1] + l) = min(8, 3 + 2) = 5.</b></p><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/5d785bba-7bd8-4f26-8e62-470b7fa1f20e.png" alt="" /><figcaption>После третьей итерации</figcaption></figure><p>И аналогичным образом мы проходим все оставшиеся итерации.</p><p>Выбираем непосещённую вершину с минимальным значением <b>d[v]</b>. На этой итерации будет выбрана вершина <b>7</b>. Ни для одного её соседа длину кратчайшего пути улучшить не удалось.</p><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/756f155b-4470-4f7f-b630-95c28bf34c5f.png" alt="" /><figcaption>После четвёртой итерации</figcaption></figure><p>На следующей итерации будет посещена вершина <b>2</b>. От неё удалось улучшить путь до вершин <b>0</b> и <b>3</b>.</p><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/40e8c044-601f-4f9c-93a3-c8db6981f782.png" alt="" /><figcaption>После пятой итерации</figcaption></figure><p>Далее посетив вершину <b>5</b> улучшаем путь до вершины <b>8</b>.</p><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/722ecf97-67fc-47e5-b8d5-7d3f6b5c137a.png" alt="" /><figcaption>После шестой итерации</figcaption></figure><p>На последующих итерациях помечаются посещёнными вершины <b>8</b>, <b>0</b> и <b>3</b>. От них нельзя улучшить путь ни до одного из их соседей.</p><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/55bbebf8-80d5-4e60-8d50-086a6468188f.png" alt="" /><figcaption>После седьмой итерации</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/78b86f35-abde-47a9-adb4-18ff7fef1e74.png" alt="" /><figcaption>После восьмой итерации</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/b60d9e9d-0454-496f-af98-92c550bf4f5e.png" alt="" /><figcaption>После девятой итерации</figcaption></figure><p>После окончания работы алгоритма значения массивов <b>u, d, p</b>:</p><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/ad1f1bef-84ea-433c-951f-b14f5d5cbd28.png" alt="" /><figcaption>После десятой итерации</figcaption></figure><h2>Реализация на C++</h2><p>Оценим скорость работы алгоритма. Он состоит из <b>n</b> итераций, внутри каждой из которых осуществляется поиск вершины с наименьшим значением <b>d[v]</b> (при простейшей реализации n итераций). Также за время работы алгоритма <b>m</b> раз производится попытка релаксации.</p><p>Таким образом асимптотика алгоритма равняется <b>O(n^2+m)</b>.</p><p>С учётом оценки скорости работы алгоритма очевидно, что на его производительность влияет плотность графа. Так, например, для разреженных графов (с относительно небольшим числом рёбер по сравнению с числом вершин) алгоритм Дейкстры в стандартной реализации будет не очень эффективен. Но это можно исправить, ускорив операцию поиска минимального элемента использованием двоичных куч. Тогда время работы алгоритма можно сократить до <b>O(n log n + m)</b>.</p><h2>Где используется</h2><p>Этот алгоритм универсален, поэтому его можно использовать в разных сферах.</p><p>Например, <b>в навигационных системах и картографии</b> алгоритм Дейкстры может помочь проложить маршрут для пешеходов или автомобилей, избегая пробок и выбирая оптимальные дороги.</p><p><b>В робототехнике</b> этот алгоритм применяется для планирования движения роботов, чтобы они могли перемещаться в пространстве используя кратчайшие пути и обходя препятствия.</p><p><b>В системах бронирования</b> для поиска наиболее быстрых и дешевых билетов с учетом возможных пересадок.</p><p><b>В компьютерных сетях</b> алгоритм Дейкстры используется для определения оптимального маршрута передачи данных между узлами сети, минимизируя задержки и повышая эффективность передачи. Если вы работаете с базами данных, также рекомендуем прочитать: <a href="https://tproger.ru/articles/sql--polnyj-putevoditel---ot-pervyh-zaprosov-do-okonnyh-funkcij">SQL — полный путеводитель от первых запросов до оконных функций</a>.</p><h2>Ограничения</h2><p>Основным ограничением алгоритма является <b>невозможность работы с отрицательными весами рёбер</b>, так как в этом случае возможны циклы с отрицательной суммой весов, что приведет к бесконечным попыткам уменьшения длины пути.</p><p>Из-за своей большой временной сложности алгоритм Дейкстры в стандартной реализации <b>может быть не очень эффективен для больших графов</b>, поэтому на практике часто используют разные эмпирические улучшения, с учетом специфики задачи. Также стоит отметить, что для больших графов также требуется выделение значительных ресурсов памяти.</p><p>Алгоритм Дейкстры не приспособлен для работы с динамически изменяющимися графами. То есть если во время работы алгоритма изменятся значения весов, то в итоге вы скорее всего получите неверные результаты.</p><h2>Какие еще есть алгоритмы для поиска кратчайшего пути</h2><p><b>Алгоритм Беллмана-Форда</b> вычисляет кратчайшие пути от одной вершины ко всем остальным, но в отличие от алгоритма Дейкстры, способен работать с графами, имеющими рёбра с отрицательными весами. Его временная сложность составляет <b>O(nm)</b>. Для графов с большим числом рёбер этот алгоритм может работать медленнее, чем Дейкстра. Другие алгоритмы и их применение — в нашем разделе <a href="https://tproger.ru/tag/algorithms">Алгоритмы</a>.</p><p><b>Алгоритм Джонсона</b> позволяет найти кратчайшие пути между всеми парами вершин. Он комбинирует алгоритмы Дейкстры и Беллмана-Форда и имеет временную сложность <b>O(n^2 log n + nm)</b>. Он может быть более эффективным для графов с малым количеством ребер.</p><p><b>Алгоритм А*</b> — это эвристический метод поиска кратчайшего пути, который может работать быстрее, чем алгоритм Дейкстры, при условии использования хорошей эвристической функции. А* применяется в задачах маршрутизации и навигации, особенно в играх и робототехнике.</p><p><b>Модификации алгоритма Дейкстры для разреженных графов</b>. Для графов с малым числом ребер относительно количества вершин можно использовать специальные оптимизации:</p><ul><li><b>Алгоритм Дейкстры с очередью с двойным приоритетом. </b>Применение специализированных структур данных, таких как очереди с двойным приоритетом, может ускорить выполнение алгоритма на разреженных графах.</li><li><b>Алгоритм Дейкстры с помощью дек (deque). </b>Это улучшение алгоритма Дейкстры для разреженных графов, использующее дек для более эффективного управления очередью вершин.</li></ul><p><b>Алгоритм Флойда-Уоршелла </b>предназначен для нахождения кратчайших путей между всеми парами вершин. Его временная сложность составляет <b>O(n^3)</b>, что делает его менее эффективным для очень больших графов, но он может быть выгодным для плотных графов с небольшим числом вершин.</p><h2>Практика</h2><p>Для закрепления темы вы можете порешать задачи на алгоритм Дейкстры на acmp.ru:</p><ul><li><a href="https://acmp.ru/asp/do/index.asp?main=task&amp;id_course=2&amp;id_section=32&amp;id_topic=54&amp;id_problem=674">132. Алгоритм Дейкстры</a></li><li><a href="https://acmp.ru/asp/do/index.asp?main=task&amp;id_course=2&amp;id_section=32&amp;id_topic=54&amp;id_problem=1037">1381. Алгоритм Дейкстры-2</a></li><li><a href="https://acmp.ru/asp/do/index.asp?main=task&amp;id_course=2&amp;id_section=32&amp;id_topic=54&amp;id_problem=1038">1383. Дейкстра за O(M log N)</a><br /></li><li><a href="https://acmp.ru/asp/do/index.asp?main=task&amp;id_course=2&amp;id_section=32&amp;id_topic=54&amp;id_problem=675">133. Заправки</a></li><li><a href="https://acmp.ru/asp/do/index.asp?main=task&amp;id_course=2&amp;id_section=32&amp;id_topic=54&amp;id_problem=676">134. Автобусы</a></li><li><a href="https://acmp.ru/asp/do/index.asp?main=task&amp;id_course=2&amp;id_section=32&amp;id_topic=54&amp;id_problem=1039">1382. Транспортировка</a></li><li><a href="https://acmp.ru/asp/do/index.asp?main=task&amp;id_course=2&amp;id_section=32&amp;id_topic=54&amp;id_problem=677">469. Химическая тревога</a></li><li><a href="https://acmp.ru/asp/do/index.asp?main=task&amp;id_course=2&amp;id_section=32&amp;id_topic=54&amp;id_problem=1040">1384. Защищенное соединение</a></li></ul>]]></content:encoded>
    </item>
    <item>
      <title>7 легендарных уравнений на JavaScript</title>
      <link>https://tproger.ru/articles/10-legendarnyh-uravnenij-na-javascript</link>
      <comments>https://tproger.ru/articles/10-legendarnyh-uravnenij-na-javascript?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Ирина Тюльпакова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/10-legendarnyh-uravnenij-na-javascript</guid>
      <description><![CDATA[<p>Математика и компьютерные науки идут рука об руку. Подобрали 7 математических формул разного уровня сложности для проверки — сможете ли вы их реализовать? И на всякий случай снабдили статью нашими решениями.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/10-legendarnyh-uravnenij-na-javascript">7 легендарных уравнений на JavaScript</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 31 Mar 2024 10:45:56 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мы нашли несколько математических формул, которые в своё время внесли значимый вклад в развитие математики, геометрии и физики. Предлагаем разминку для ума: сможете ли вы справиться и реализовать все перечисленные нами формулы?</p><p>Кстати, Kata Academy набирает студентов на обучение JavaScript. Это отличная возможность, так как вы не платите за обучение, пока не устроитесь Javascript-разработчиком! Подробности здесь → <a href="https://tproger.ru/courses/kurs-po-javascript-razrabotke-ot-kata-academy?erid=LjN8KcGuo">Курс по JavaScript-разработке от Kata Academy.</a></p><h2>Теорема Пифагора</h2><p>Начнём с простенькой формулы. Известная всем со школьной скамьи теорема, которая гласит: квадрат гипотенузы равен сумме квадратов катетов в прямоугольном треугольнике. Она широко используется в инженерии (например, архитектуре), физике и информатике.</p><p>Возьмем c как длину гипотенузы, а a и b — длины катетов. Получаем запись a^2 + b^2 = c^2.</p><h2>Логарифмы</h2><p>С логарифмами сталкивались все в старших классах школы — эта функция возведения в степень, только наоборот: у нас есть возведённое в степень число, и мы хотим узнать, в какую степень нужно возвести основание.</p><p>Звучит определение логарифма примерно так: результат логарифма по основанию a от b будет являться такое число c, для которого справедливо a^c = b. Логарифмы, которые записываются без основания как log(x) — натуральные, то есть в его основание будет константа e.</p><p>Сможете реализовать функцию, которая бы проверяла достоверность log(xy)=log(x)+log(y)?</p><h2>Математический анализ</h2><p>f'(x)=lim(h→0)h</p><p>Теперь пример посложнее. Перед вами уравнение определения производной. Сможете реализовать код, который бы аппроксимировал бы производную функцию в заданной точке, вычисляя наклон секущей линии через две точки функции? При условии, что эти две точки находятся очень близко друг к другу.</p><p>Функция derivative() аппроксимирует производную функцию f в точке x. На выходе в примере мы получаем наклон касательной к f(x) = x^2 при заданном x=3. А поскольку производная для квадратичной функции от x всегда равна 2x, мы ожидаем, что скрипт выдаст ответ 6. В реальности, реализованная функция должна выдать очень близкий к нашему значению результат.</p><h2>Универсальный закон всемирного тяготения Ньютона</h2><p>Закон сформулирован следующим образом: сила притяжения прямо пропорциональна произведению их масс и обратно пропорциональна квадрату расстояния между их центрами. Для</p><ul><li>F — вычисляемая сила притяжения;</li><li>G — гравитационная постоянная (6,674 * 10^(-11) Н(м^2)/кг^2);</li><li>m1 и m2 — масса двух объектов;</li><li>r — расстояние между центрами двух масс;</li></ul><p>будет справедлива запись F=G(m1*m2/r^2).</p><h2>Комплексные числа</h2><p>Комплексные числа вселяли в нас ужас — i^2 = -1. Между тем, они часто используются для решения полиномиальных уравнений (то есть таких, в которых используются многочлены типа x^2=x^3).</p><p>Комплексные числа упрощают анализ электрических цепей, облегчают описание квантовой механики и играют ключевую роль в обработке сигналов.</p><p>Реализация комплексных чисел на JavaScript предполагает создание структуры для обработки как действительной, так и мнимой частей комплексных чисел, поскольку JavaScript изначально не поддерживает комплексные числа.</p><p>В нашем примере мы создаём мнимую единицу i в виде комплексного числа с 0 действительной частью и 1 в качестве мнимой, затем возводим i в квадрат чтобы доказать, что результатом будет -1.</p><h2>Нормальное распределение</h2><figure><img src="https://media.tproger.ru/user-uploads/88534/2024-03-29/2aeb39d3-56c8-4873-950b-dc0d38aee765.jpg" alt="" /><figcaption>Тут уж без картинки не обойдёшься</figcaption></figure><p>Основополагающая формула в статистике и теории вероятностей. Она описывает разброс данных вокруг среднего значения.</p><p>Теорема утверждает: сумма многих независимых случайных величин будет приблизительно соответствовать нормальному распределению. Приведенное выше уравнение представляет функцию плотности вероятности нормального распределения, где:</p><ul><li>x — переменная;</li><li>μ — среднее значение распределения;</li><li>σ — стандартное отклонение распределения;</li><li>e — основа натурального логарифма (~2.71828);</li><li>π приблизительно равно 3.14159.</li></ul><p>Сможете написать функцию для вычисления математического ожидания для заданного x?</p><h2>Уравнение Шрёдингера</h2><figure><img src="https://media.tproger.ru/user-uploads/88534/2024-03-29/f27cea60-c373-4e67-8807-3b1d0e0b35f5.jpg" alt="" /></figure><p>Возьмём формулу из квантовой механики. Уравнение Шрёдингера описывает, как квантовое состояние физической системы изменяется со временем. Уравнение предоставляет способ вычисления амплитуды вероятности положения и импульса частиц, позволяя предсказывать множество физических свойств и явлений, таких как уровни энергии, структуры связей и поведение электронов в атомах.</p><p>Реализация этого уравнения на JavaScript, определенно, выходит за рамки простых функций языка. Сможете с ним справиться? Мы не справились, поэтому приводим концептуальное решение.</p><p>Делитесь в комментариях, какие хитрые формулы вы ещё знаете. А если приложите код — то мы обязательно дополним материал вашим примером.</p><p>Интересуетесь новыми возможностями и языками программирования? Возможно, позиция <a href="https://tproger.ru/jobs/sre-inzhener-deckhouse">SRE-инженера в Deckhouse, компании Флант</a>, станет для вас отличным шансом применить свои знания на практике и участвовать в разработке инновационных проектов.</p>]]></content:encoded>
    </item>
    <item>
      <title>Библиотека программиста: 37 книг для того, чтобы разобраться в IT</title>
      <link>https://tproger.ru/articles/knigi-po-programmirovaniyu</link>
      <comments>https://tproger.ru/articles/knigi-po-programmirovaniyu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Ирина Тюльпакова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/knigi-po-programmirovaniyu</guid>
      <description><![CDATA[<p>Подборка из 37 книг по программированию от Winderton: Computer Science, алгоритмы, Python, C++, Java, C#, JavaScript. Узнайте, с чего начать в IT.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/knigi-po-programmirovaniyu">Библиотека программиста: 37 книг для того, чтобы разобраться в IT</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Операционные системы]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Фронтенд-разработка с нуля]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 29 Mar 2024 13:50:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Два года назад IT-блогер Winderton опубликовал собственную подборку из книг про программирование. Его библиотека включает как базовые книги по алгоритмике и основам компьютерных наук, так и более конкретные, посвященные языкам. Несмотря на то, что к 2024 году некоторые книги получили переиздание, список всё так же можно назвать мощной подготовительной базой для начинающего специалиста.</p><p>Ниже — транскрибация ролика, дополненная ссылками.</p><p>Шесть лет назад я,
Виндертон, будучи в состоянии аффекта,
выкладываю вот этот вот ролик, который
посмотрело уже больше 100 тысяч человек: «Техническая литература для программистов».
Чтобы сэкономить вам 10 минут вашего
времени, там были показаны вот эти вот
книги.</p><figure><img src="https://media.tproger.ru/user-uploads/88534/2024-03-29/f07dfe38-506e-480f-b7c7-2f70bdd6fb46.png" alt="" /></figure><p>Вопросов нет. Кнут — это классный автор
с крутыми материалами. На кто его
потянется со всей этой математикой, если даже
вот эти челы не тянут, а конкретно тот,
что с бородой — Шон Магресс. Тадембаум —
та же самая история. Классный материал,
но настолько сложное задание, что порой
вгоняет в депрессию. Корман заставляет
писать вас вообще деревья с нуля без
примеров.</p><p>Поэтому, если вы хотите освоить основу
программирования, влиться в компьютер-сайенс,
или вам просто нужны хорошие книжки по
программированию, то за следующие
несколько минут я на вас вывалю все
то, что есть на 2022 год, дам по каждой
комментарии, рекомендации и антирекомендации.
Грубо говоря, мы сейчас сделаем с вами
выборку.</p><p>Ну а мы разбиваем видео на три части:</p><ol><li>Введение в программирование и ядро computer science.</li><li>Моя библиотека. GameDev, прочее.</li><li>Языки программирования.</li></ol><h2>Введение и основы computer science</h2><p>«Внутри машины», или как работает ваш
компьютер, у нас это называется еще «архитектура ЭВМ». Как устроен процессор,
память и вся организация железа. Если
у вас нулевой бэкграунд, вам нравятся
картинки и тоненькие книжки (~300 страниц), то это то,
с чего вам точно стоит начать.</p><p>«Введение в компьютерные системы». Тут
автор начинает буквально с того, почему
процессор делается из кремния, потому
что они сами делали процессоры из
кремния. И проходится по всему
абстракционному стеку, начиная от
железа, через периферию, BIOS, операционную
систему, ассемблер, язык программирования
C, пишут на нем потом программы и покажут,
как это дело все между собой связано,
взаимодействует в очень интерактивной
манере.</p><p>«Код» Петцольда. Эта книга, как и
первая, тоже для полных новичков, без
бэкграунда в сфере. Там рассказывается
про то, что такое железо, операционная
система, компиляторы, языки программирования,
как это дело все между собой взаимодействует.
Если вам когда-нибудь было интересно,
почему компьютер именно такой, а программы
пишутся именно так, то Петцольд в очень
простой манере за 400 страниц вам об этом
простенько расскажет.</p><p>Если вдруг по каким-то причинам вы эти
книги не найдете или вам их будет мало,
то вот еще две.</p><p>Первое — это «Теоретический
минимум по Computer Science». Уровень подачи тут
не дотягивает до предыдущих трёх, он
немножко мудрёнее и сложнее, но тут
реально покрывается весь тот компьютер-сайенс необходимый, который вам нужен, и
в книге всего 150-200 страниц.</p><p>Единственный
минус, который связан у меня с этой
книгой — она вся развалилась пока я её читал.</p><p>«Computer Science: an Overview». Эта книга реально местами
довольно часто очень сложная. То есть,
если вы не знаете, что такое транзистор,
а там об этом узнаете, то вы вряд ли
поймете, что такое транзистор.</p><p>Но, (а) эта
книга реально походится по всему курсу
Computer Science, где говорят даже про базы
данных и графику, и, (б) там копают чуть
глубже, чем в этой, этой или этой. Поэтому,
если у вас есть хоть немного опыта
программирования, то смело берите эту
книгу и изучите Computer Science.</p><h3>Алгоритмы и структуры данных</h3><p>Как вы все
знаете, это Корман и Седжик.</p><p>Но Корман — это очень много математики
прямо с первых страниц, а Седжик — это
Java, которая, ну, не особо всем нравится.</p><p>Но нам везет, и со временем появляются
реально годные альтернативы. И одна из
них — это Grokking Algorithms. Я о ней узнал
года три назад, и года два назад полностью
заменил ею Кормана в менторинге. Книгу написал очередной гений, который
программирует с двух лет и продает свои
первые игры чуть ли не в 10 лет. Но она
реально написана простым языком, и хочу
сделать небольшую ремарку, если будете
читать перевод. В переводах есть ошибки,
поэтому просто будьте осторожны и всегда
рекомендую только оригинал.</p><h3>Операционные системы</h3><p>Для меня
это был и остается Томас Андерсон с вот
этой вот книжкой, потому что книги
Тененбаума более сухие, наверное, и выше
по уровню сложности. Поэтому, если вы
понимаете, что написано в этой книге,
можете перейти к Тененбауму, но не Вайзверсу.</p><p>Тут, наверное, есть какой-то
баланс, она не слишком глубокая и не
слишком поверхностная.</p><p>Также мне нравится
вот эта книжка, она супер просроченная,
я давным-давно ее купил, но если вы хотите
знать, как работает Unix, и вам нужен
туториал, как написать свой Unix, то это
как раз-таки то, и не важно, что ей 200 с
лишним лет.</p><h3>Компиляторы и дизайн языков</h3><p>Книгу с драконом сразу отсюда
убираем, потому что она, ну, прям
слишком сложная.</p><p>Берем сюда Николаса Вирза, 150 страниц,
и добавляем сюда Нистерна с его Crafting
Interpreters. Кстати, Нистерн — это тот самый
чел, который делал паттерны для геймдева,
которые являются чуть ли не аналогом
Банды Четырех.</p><h3>Software development</h3><p>Clean Code, Code Complete и так далее — ребят, это классные книги,
не поймите меня неправильно, они написаны
лучшими из нас, но читать их нужно только
тогда, когда вы имеете уже от двух до
трех лет опыта в программировании. Они
учат вас, как делать правильно, и вы,
скорее всего, не поймете, как делать
правильно, если вы сначала не поделаете
неправильно. Тут нереально учиться на
чужих ошибках. Рекомендую читать только
тогда, когда у вас будет пару пэт-проектов
и два-три года опыта в программировании
в целом.</p><p>Касаемо ООП, все советуют «Банду
Четырёх», которая прилично так всем уже
надоела.</p><p>А я посоветую вам вот эту книгу,
которая, на мой взгляд, будет лучше. Единственный момент, то, что там С++, но
его там на самом деле почти нет. Не
пугайтесь.</p><h2>Моя библиотека, GameDev, прочее</h2><p>Джейсон Грегори — это автор,
который написал Uncharted и, соответственно,
эту книгу. У него супер-обширные познания
в игровых движках как минимум и как
максимум в производстве игр. В моменте
этот человек решает написать вот эту
вот книгу, которая уже третье издание.
Отличная подача материала, углубление
в самый раз, максимально широченный
охват тем. И вот, например, то, что делает тот же
самый Ян Черников — это процентов 20-30
вот от этой вот как раз книги. Чаще всего
я читаю именно её.</p><p>Опять же, Андерсон «Операционки». Тут лучшее объяснение
виртуальной памяти, на мой взгляд. Книга
по введению в CS и программирование.
Просто всем советую. Конечно же, Корман
со своей бандой. Они тут явно борщат с
математикой, но, может быть, это просто
я тупой [здесь не даются ссылки на книги т.к. автор повторяет их из первого раздела, — прим.редактора].</p><p>Не особо классная книга по C++,
но как референс или подставка для
монитора вполне сходит.</p><p>Ещё одна классная книга — это Game Coding
Complete. Сложные темы рассказывают достаточно
простым языком. И именно отсюда я узнал,
что такое анимация и как они работают.</p><p>Конечно же «Си» Кернигана и Ричи, но я не
советую, если у вас с психикой не все в
порядке.</p><p>Ассембль от Apress, чтобы
хоть какое-то понимание было, что это
такое, как на него смотреть вообще&lt;...&gt;</p><h2>Языки программирования</h2><h3>Python</h3><p>Тут идёт, конечно же, Лутц с его громким именем. Книжка прям для
суперновичков, и Лутц, самое главное, не
страдает болезнью. Вот это вы пока не
понимаете, но через 10 страниц я вам это
объясню. Нет, он как в бакалее: всё сразу
по полочкам вам раскладывает, и вы
перелистываете страницу за страницей,
с приятным чувством, что вы все понимаете,
вы весь такой вообще умный и сообразительный.</p><p>Еще одна книга на уровне этой — «Краш-курс Питона», которая была написана
тоже автором, у которого куча классных
книг по питону. Он программирует с 5 лет
и пишет полжизни книги. Отличие от Лутца в том, что эта книга
подходит как и начинающим, так и типам
с опытом, поэтому читать ее реально не
скучно.</p><p>Еще одна классная книга и классный
автор — это Дэвид Бизли с его «Python
Cookbook». Вообще, Дэвид Бизли — это бывший
С-шник, который полжизни пишет на C и
в моменте решает преподавать Python. И
расскажет про всякие супер интересные
и занимательные штуки по типу, почему
на Python нельзя программировать многопоточные
приложения, почему на нем нельзя
программировать мобильные приложения.
И у него еще есть всякие видео на YouTube,
где он показывает всякие хаки с Python.
Поэтому Python Cookbook, если уже знаете основу,
то там вас научат расширять даже
питоновский интерпретатор.</p><h3>C</h3><p>Тут сразу запомните одно. Никогда не
читайте книгу Learn C the Hard Way, потому что
там автор сразу видно, что не знает, о
чем говорит, и упрощает то, что упрощать
не надо. У этой книги прям очень много
хейта в интернете, как и у книг Шилта,
который классно знает Java, но не знает
C++ и C, или как минимум не умеет их
преподавать.</p><p>Волк в овечьей шкуре или
Брайан Керниган и Денис Ричи и C, второе
издание. Книгу рекомендуют до сих пор
изучать по C, но на самом деле там есть
куча проблем. Во-первых, это то, что эта
книга подразумевает то, что вы уже знаете
компьютер-сайенс, как работает вообще
все, начиная от железа и вплоть до
операционных систем. Во-вторых, то, что
она по факту страниц 250, хотел сказать,
она по факту 2500, и там нет такого понятия,
как best practices, то есть книги 100 лет, и там
просто не знали, что такое хорошо, а что
такое плохо. Поэтому не рекомендую, если
вы не понимаете компьютер-сайенс.</p><p>Beginning C. Книга от Apress, которая, как вы
видели, у меня уже есть x86 Assembly. Классная
книга, классное издательство. Фишка
этой книги то, что там рассказывают про
C99, про C11, про многопоточность в C.</p><p>Эта книга
отлично работает как туториал, как
референс, как подставка. И там много
всяких работающих маленьких программулек
на C.</p><p>И напоследок, хочу скачать что мне запомнилась,
вот эта книга, которая называется Expert
C. Она была написана челами, которые
классно знают и разбираются в
интерпретаторах и работают в САН.</p><h3>C++</h3><p>Конкретно от меня, у меня Primer Plus, которая
не лучшая из этих книг, но мне хватило
ее как референса [автор упоминал её ранее, — прим.редактора].</p><p>Мне также очень нравятся
книги Скотта Майер Effective C++, которые
нравятся вообще всем.</p><p>Плюс я почитываю
вот эти вот две книги по метапрограммированию,
не самые хорошие, но выбора просто нет
никакого.</p><p>Само собой, многопоточность и C++
Concurrency in Action, потому что также нет никакого
выбора. Ну и само собой, Александр Эску,
которого почитывать нужно как минимум
для того, чтобы видеть, как делать не
надо, а это всегда в C++ интересно
посмотреть.</p><h3>Java</h3><p>Джава за
один день, всем советую, конечно же,
шучу, это полная фигня. Всегда избегайте
этих книг, каких бы отзывов вы там не
видели, потому что это чушь собачья, а
не книги. Простите, авторы.</p><p>А вот книга Шилда Java Complete Reference,
последний, который я читал, шестой и
седьмой, мне всегда нравились, потому
что простая подача, и они очень похожи
на GLS. Наверное, даже проще. Да и вообще,
у Шилда читать, мне кажется, можно всё,
что угодно, потому что он как бы папа джавы.</p><p>Конечно же, как только вы знаете
джаву-основу, это Джошуа Блок с ее Effective Java, это аналог Скотта Майера с Effective C++. На моей первой работе на Java, когда я
пришел и сказал своему тимлиду, что я
читаю Effective Java, он мне говорит, блин, это
классная книга, я там дженерики сейчас
изучаю. А я стоял в этот момент и думал,
что, блин, я ее тоже уже читаю. Было очень
приятное чувство, но меня тогда, типа,
я так и остался работать джуном, а он
так и остался работать тимлидом. Ничего
не поменялось. В этой книге реально
много практик использования джава в
реальном продакшене, поэтому, если
знаете основу, смело ее рекомендую.</p><p>Java Concurrency in Practice. То есть Java — это
исключение, это многопоточность, это
OOП. Такие книги, как Java Concurrency in Practice,
показывают вам, как использовать ту же
самую многопоточность, ее неотъемлемую
часть. А такие книги, как Хедферст или
какой-нибудь Шилдт, показывают вам, что
такое Java Core. Также на уровне с Шилдтом есть тип, которого зовут Кей Хорсман. У
него много всяких книг по типу «Как
работать с синхронизацией» или «Ближележащие топики». То есть какой-то Advanced
Java. Поэтому советую присмотреться тоже.</p><h3>C#</h3><p>Пусть Рихтера читают, пусть больше
ничего не читают.</p><h3>Javascript</h3><p>Симпсон «Вы не знаете
JavaScript». Неоднократно слышал про эти книги
от классных JS-ников, потому что там много
всяких how-to, то есть как работает это,
как работает это, почему не работает
это.</p><p>Советовать
Фленнегана или Дугласа Кроуфорда,
который хотел назвать JavaScript C++++ я не
буду, потому что, если бы вы хотели читать
книги, вы бы, наверное, изучали C++. Все-таки JavaScript — это попробовать,
потыкать и поучиться на практике.</p><h3>Assembly</h3><p>Я
покупал себе вот эту книгу и ни разу в
ней не разочаровался. Возможно, потому
что я прочитал ее только процентов на
30, но какая разница. Наверное, будет
хороший вопрос, если вы скажете, зачем
мне вообще ассембли в 2022 году. Да, он вам
не нужен, вы на нем писать ничего точно
не будете, но если вы пишете на плюсах,
то чтение ассембли во время дебаггинга,
что занимает большую часть вообще
времени в программировании, как минимум на C++, как минимум у меня,
понимать ассембли хотя бы нужно, поэтому
такая вот книга в этом отлично помогает.</p><p>Еще есть вот такая вот книга, но она прям
суперпростая, поэтому я бы рекомендовал
читать сразу вот эту.</p><p>Читайте также: <a href="https://tproger.ru/articles/kak-stat-programmistom">Как стать программистом с нуля — полный гайд</a>, <a href="https://tproger.ru/articles/backend-2024">Что знать бэкендеру в 2024 году</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Синьор, а знаете ли вы алгоритмы? — тест для опытных программистов</title>
      <link>https://tproger.ru/articles/test-algoritmy</link>
      <comments>https://tproger.ru/articles/test-algoritmy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/test-algoritmy</guid>
      <description><![CDATA[<p>Тест для проверки алгоритмического мышления программистов уровней Middle и Senior. Проверьте себя: хорошо ли вы выучили алгоритмы?</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/test-algoritmy">Синьор, а знаете ли вы алгоритмы? — тест для опытных программистов</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 07 Feb 2024 09:15:51 GMT</pubDate>
      <content:encoded><![CDATA[<p>Данный тест разработан для проверки алгоритмического мышления программистов на уровне Middle. Каждый вопрос направлен на оценку способностей к решению задач, которые могут встретиться в реальной работе.</p><p>Тест состоит из 10 вопросов, каждый из которых имеет 4 варианта ответа. Только один из ответов является верным. Выберите вариант, который вы считаете правильным, и отметьте его.</p><p>Удачи!</p>]]></content:encoded>
    </item>
    <item>
      <title>Как стать топ-100 на Kaggle и топовым Data Scientist, за которым охотятся работодатели</title>
      <link>https://tproger.ru/articles/kak-stat-top-100-na-kaggle-i-topovym-data-scientist-om-za-kotorym-ohotyatsya-rabotodateli</link>
      <comments>https://tproger.ru/articles/kak-stat-top-100-na-kaggle-i-topovym-data-scientist-om-za-kotorym-ohotyatsya-rabotodateli?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Ирина Тюльпакова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-stat-top-100-na-kaggle-i-topovym-data-scientist-om-za-kotorym-ohotyatsya-rabotodateli</guid>
      <description><![CDATA[<p>Адель Валиуллин делится опытом участия в соревнованиях и рассказывает, как занять высокое место в рейтинге Kaggle.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-stat-top-100-na-kaggle-i-topovym-data-scientist-om-za-kotorym-ohotyatsya-rabotodateli">Как стать топ-100 на Kaggle и топовым Data Scientist, за которым охотятся работодатели</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Конференции]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Образование]]></category>
      <category><![CDATA[Соревнования]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 12 Dec 2023 12:50:01 GMT</pubDate>
      <content:encoded><![CDATA[<p>Руководитель Центра технологий искусственного интеллекта Газпромбанка Адель Валиуллин смог войти в топ-100 международного рейтинга Kaggle профессионалов в области машинного обучения и подняться на 68-е место. В октябре 2023 года Адель выступил с лекцией для студентов в МФТИ, на которой рассказал, что помогло ему достичь топовых позиций и как Kaggle повлиял на его дальнейшее профессиональное развитие в Data Science. По материалам прочитанной лекции решили опубликовать эту статью.</p><figure><img src="https://media.tproger.ru/user-uploads/88534/2023-12-06/773ca386-e10b-431f-9137-fc5633c1ba8d.png" alt="" /></figure><p><a href="https://www.kaggle.com/">Kaggle</a> — самая известная в мире платформа для специалистов по Data Science. Она выросла в комьюнити, которое объединило в себе опытных и начинающих исследователей в области анализа данных и машинного обучения.</p><p>Платформа была запущена в апреле 2010 года как площадка для проведения соревнований по машинному обучению, но сегодня это уже целая экосистема с более чем 16 млн зарегистрированных пользователей. Сейчас на Kaggle можно проходить курсы по AI, пользоваться облачными ресурсами для решения задач, общаться со специалистами по всему миру, искать работу и, конечно же, участвовать в соревнованиях. В 2017 году Google купила платформу Kaggle, усилив позиции в сообществе исследователей по искусственному интеллекту, а также в борьбе за лучших специалистов на рынке.</p><p>Основное предназначение платформы в том, что на ней проводятся различные хакатоны и соревнования от крупных компаний, таких как Google, Amazon, Facebook, Microsoft, Baidu и других, по результатам которых участники получают очки и формируется мировой рейтинг лучших профессионалов в области машинного обучения.</p><p>В среднем одно соревнование идёт два-три месяца, в течение которых участники могут загружать свои решения в систему.</p><p>Всего на платформе проведено уже более 300 соревнований. Каждое представляет собой актуальную задачу машинного обучения от компании, например, решение задачи кредитного скоринга — необходимо обучить систему принимать решения по кредитным заявкам банка на основе данных клиента (возраст, пол, образование, стаж работы, анкетные данные и других). Или, например, обучить модель компьютерного зрения, которая распознаёт одинаковые достопримечательности на различных фотографиях. Или как можно точнее предсказать цену продажи объектов недвижимости по их описанию и фото.</p><p>В каждой из задач есть определённая метрика, по которой оценивается точность решения и формируется лидерборд участников. Качество решений участников проверяется на закрытом наборе данных — это гарантирует максимально честную оценку.</p><p>Также каждое соревнование имеет призовой фонд, в среднем это 30-50 тысяч долларов, но были и несколько соревнований с призовыми в 1.2 млн и 1.5 млн долларов. То есть можно успешно решить соревнование, купить себе яхту и отправиться в кругосветное путешествие. Но, конечно, никто не решает соревнования только ради денег, это скорее приятный бонус.</p><h2>Составляющие успеха на Kaggle</h2><h3>Хороший бэкграунд</h3><p>Я учился в физико-математическом лицее 131 в Казани. В школе увлекался олимпиадами по математике и физике, а летом выезжал на смены в летние физмат школы. Мне в какой-то степени повезло, что у меня появилась такая сильная техническая база.</p><p>В таких точных науках, как математика, физика и программирование, короткая и однозначная цепочка обратной связи. Ты решил задачку и моментально понимаешь, что молодец. Тебя не должен оценивать кто-то извне, как в гуманитарных науках, художке или музыке. Плюс достаточно легко перейти с одного уровня сложности на следующий. Думаю, этим мне и нравится математика, поэтому после окончания школы я с большим удовольствием преподавал её в Физтех-школе в группах для школьников. Было приятно видеть, как ребята учатся решать всё более сложные задачи и получают удовольствие от этого процесса. Уже в аспирантуре я узнал, что это называется зоной ближайшего развития.</p><p>После лицея поступил на факультет Робототехники и Комплексной Автоматизации МГТУ им. Н. Э. Баумана, который закончил с отличием. Но думаю, всё-таки кругозор в IT хорошенько меня ударил на двухгодичной программе Технопарка от Mail.Ru Group. Это дополнительная программа обучения для студентов Бауманки по направлению веб-разработки, где молодые заряженные специалисты компании читают лекции по разным предметам: углублённое программирование на C/С++, алгоритмы и структуры данных, разработка веб-сервисов, мобильная разработка, безопасность интернет-приложений, тестирование, управление проектом и другим.</p><p>Преподаватели были действительно очень крутыми. Например, по безопасности Ярослав Рабоволюк, CIO Mail.Ru Group, мог на занятии открыть любой сайт, рассказать обо всех его уязвимостях и как с ними работать. Самым ценным опытом были групповые проекты на трех-четырех человек после каждого предмета. Это позволило реализовать достаточно много интересных практических проектов и научиться работать в команде. Сейчас аналогичные программы обучения от VK (ранее Mail.Ru Group) запущены в ведущих технических университетах: МФТИ, МГУ, МИФИ и ИТМО.</p><p>На последнем курсе магистратуры встал вопрос выбора задачи для диссертации. Посмотрев онлайн-лекции по анализу данных от ШАДа (Школы анализа данных от Яндекса) в 2012 году, наткнулся на задачу кредитного скоринга в банках, которой и решил заниматься в рамках дипломной работы и в аспирантуре.</p><p>Дальше всё было как в тумане: прошёл чуть ли не все курсы по машинному обучению на Coursera. На одном финальном проекте было решение задачи на Kaggle по предсказанию победителя онлайн-игры Dota 2. Я неплохо справился с задачей, занял 39-е место по точности решения из 810 участников курса. Впервые узнал о Kaggle и ощутил, что это довольно увлекательно — соревноваться с другими участниками со всего мира в точности решения.</p><p>Меня уже было не остановить. Постепенно я набирался опыта на Kaggle-соревнованиях, программировал свои наработки по различным задачам на табличных данных, текстах и картинках. Суммарно я решил около 80+ задач. Самое успешное соревнование было по сегментации данных на изображениях (необходимо было автоматизировать процесс идентификации ядер клеток, что позволит проводить более эффективное тестирование лекарств, сокращая 10 лет, которые требуются для выхода каждого нового препарата на рынок), во время которого я валялся дома со сломанной ногой (во время прыжка с парашютом не раскрылся парашют) и мог уделить много времени задаче на Kaggle.</p><p>Думаю, в первую очередь сильный бэкграунд по математике и программированию помогал мне в дальнейшем быстро погружаться в различные задачи машинного обучения, разбираться в подходах решения, необходимых алгоритмах. Это не исчерпывающий список, поэтому хотел бы выделить ещё некоторые основные моменты.</p><h3>Удовольствие от процесса</h3><p>Главным фактором успеха на Kaggle, конечно, считаю то, что я получал удовольствие от участия в соревнованиях. Мне действительно было интересно заниматься решением новых и сложных задач.</p><p>Помню, на хакатоне в Сан-Франциско, мы с командой заняли пятое место среди квалифицированных команд. Второе место заняла команда из Google Brain (одно из исследовательских подразделений Google), это была группа из пяти китайцев. После хакатона мне удалось немного пообщаться с ребятами. В конце беседы я уточнил у них, собираются ли они на афтерпати хакатона в бар неподалёку. На что мне ответили, что не пойдут, а планируют разобрать командой своё финальное решение и решения победителей.</p><p>Думаю, именно благодаря такому подходу эти ребята и оказались выше нас по результатам. «Вот это уровень интереса!», — подумал я и убежал на афтерпати 🙂</p><figure><img src="https://media.tproger.ru/user-uploads/88534/2023-12-06/c8f4ef03-a703-4faa-8273-0f350e8ee05d.jpg" alt="" /><figcaption>Фото участников хакатона KaggleDays SF в отеле Fairmont</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/88534/2023-12-06/8afe7195-25c5-458c-884c-4068a6b6660f.jpg" alt="" /><figcaption>Фото c командой из Google Brain на хакатоне KaggleDays SF</figcaption></figure><h3>Достаточное количество времени</h3><p>Каждое соревнование имеет дедлайн, одно соревнование в среднем проходит 2-3 месяца.</p><p>В день можно отправить до пяти сабмитов. Если какой-то день вы пропускаете, то теряете возможность протестировать свои решения и идеи. Поэтому, как только у меня выдавалась свободная минута, я программировал, старался побыстрее протестировать и как можно чаще отправлять свои решения. Параллельно идут несколько соревнований, то есть вам необходимо решать несколько задач одновременно на определённых отрезках времени.</p><p>Уходило на это по несколько часов в день, два-три точно. В выходные я тратил больше времени. Обычно мой день выглядел так: до вечера был на работе, приходил домой, открывал Kaggle и решал соревнования. Порой я не замечал хода времени, мне искренне нравилось находить новые подходы и улучшать свои текущие решения. В последние дни соревнований я увлекался и засиживался до самого дедлайна — до 3 ночи (11:59 PM UTC). Конечно, я не решал всё, что публикуется на платформе, но думаю, большую часть в этот период всё-таки решил. Я брал ноутбук с собой в отпуск и старался находить время и на Kaggle. Мне понадобилось около 2-3 лет, чтобы подняться до 68-го места.</p><h3>Командная работа</h3><p>Большую часть соревнований выигрывают команды. И немудрено: когда несколько участников объединяют свои идеи, финальное решение будет более качественным и точным.</p><p>К тому же вы можете чему-то научиться у своих тиммейтов, понять их идеи, узнать, какими инструментами они пользуются и как организуют свою работу над проектом.</p><p>В этом я не сильно преуспел, только 5 из 87 (6%) соревнований я решал в командах. Думаю, если бы я чаще объединялся с другими участниками, результаты были бы выше.</p><h3>Вычислительное железо</h3><p>Все задачи на Kaggle вычислительно сложные. Платформа предоставляет мощности, но для быстрой проверки гипотез и идей их бывает недостаточно. Понимая, что без своего девбокса соревноваться за высокие места намного сложнее, я купил сервер с четырьмя видеокартами NVIDIA GeForce GTX 1080 Ti 11Gb, 64 ядрами и оперативной памятью на 128 ГБ за 300 000 рублей. И думаю, это было одним из самых удачных вложений в моей жизни. Сервер позволял относительно дёшево, минуя аренду облачных сервисов, делать вычисления, усиленно нагревать квартиру летом и зимой и относительно быстро обучать модели. Но мне все равно было сложно конкурировать с участниками из больших ИТ-корпораций, у которых в компаниях были вычислительные ресурсы в десятки, а то и сотни раз мощнее.</p><p>Сегодня Kaggle старается делать соревнования доступнее для участников, у которых нет возможности доступа к большим вычислительным ресурсам. Главный критерий — решения должны запускаться в Kaggle Kernels. Поэтому для таких облачных вычислений будет достаточно обычного ноутбука.</p><h3>Упорство и целеустремлённость</h3><p>Когда решения выстреливают, ты поднимаешься на лидерборде участников соревнования, занимаешь призовые места, это сильно мотивирует.</p><p>Но стоит помнить, что в анализе данных или машинном обучении много неудач. Ты постоянно тестируешь различные идеи решений, и не все из них приводят к результату. Помню, как в одном из соревнований от Zillow по предсказанию цены продажи недвижимости по описанию и фото, которое длилось целый год, участвовала команда, которая тратила на аренду облачных серверов около 10 тысяч долларов в месяц, и в конце не заняла призового места.</p><p>Главное здесь — не опускать руки, если что-то не получается, продолжать набираться опыта и находить новые решения.</p><h3>Ключевые выводы</h3><p>Считаю, что успех в построении AI карьеры обеспечивает следующая комбинация:</p><ol><li>фундаментальное образование в области математики, физики или компьютерных наук;</li><li>хорошие навыки программирования (Python);</li><li>умение работать с базами данных (SQL);</li><li>знание AI, традиционных алгоритмов ML, CV, NLP, RL.</li></ol><p>В Data Science решения создаются на Python. У языка простой синтаксис, который легко изучить, даже если раньше вы на нем не писали. Особенно если у вас есть опыт разработки на других более низкоуровневых языках: C, C++. Также важно владеть различными инструментами по работе с данными. Ключевым здесь является язык SQL и особенности баз данных (Oracle, Postgres и др).</p><p>Плюсом будут знания конкретной предметной области. Если вы разбираетесь в финансах, вам будет проще решать, например, задачу кредитного скоринга. В дальнейшем это поможет ориентироваться и в понимании бизнеса.</p><h2>Что даёт Kaggle</h2><h3>Разнообразный и уникальный опыт</h3><p>Уникальность платформы Kaggle в том, что у вас появляется возможность решить наиболее актуальные задачи крупных компаний. Например, во время новогодних каникул я смог весьма неплохо решить соревнование от Baidu по 6D позиционированию автомобилей по фотографиям, сделанным с камер беспилотников. Получил серебро и приглашение в VK (ранее Mail.Ru Group) на митап, чтобы рассказать о своём решении.</p><figure><img src="https://media.tproger.ru/user-uploads/88534/2023-12-06/30bde73b-3af1-4346-a948-e01a68d3fb11.jpg" alt="" /><figcaption>Фото трансляции с митапа Mail.Ru Group по задаче позиционирования автомобилей с камер беспилотников</figcaption></figure><p>Или, например, решал задачи по распознаванию рака на медицинских снимках, кораблей на спутниковых снимках и много других.</p><p>В итоге ты становишься специалистом в области беспилотного транспорта, распознавания медицинских изображений, спутниковых снимков, вопросно-ответных систем и множества других направлений AI.</p><p>На Kaggle можно решать задачи кредитного скоринга для крупного банка и параллельно помогать физикам-исследователям CERN найти траекторию движения частиц в адронном коллайдере, предсказывать победителя в Dota 2 и вместе с океанологами определять вид китов по фотографиям плавников. Вы можете построить оптимальный маршрут для Санта-Клауса, чтобы тот раздал как можно больше подарков. Или, например, я впервые узнал, что позиционирование объектов в задачах беспилотного транспорта происходит по 6 координатам (Х, Y, Z и углы поворота по трём осям). Это безграничное поле для развития и возможностей по обучению.</p><p>На KaggleDays в Дубай перед нами однажды стояла задача от полиции Дубая спрогнозировать на карте города районы, где могут произойти преступления. Нам выдали исторические данные по разным происшествиям (кражи, хищения, криптоинциденты): координаты, время и дату. А также статистику по погодным условиям, температуре, окружению в городе. Нужно было построить модель, которая будет прогнозировать области и время с потенциальными преступлениями.</p><figure><img src="https://media.tproger.ru/user-uploads/88534/2023-12-06/9017b041-2647-46a7-bef0-8a7becce7c67.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/88534/2023-12-06/8a540d60-fbdf-46b1-980b-8b3b98465ff7.png" alt="" /><figcaption>В одном из соревнований нужно было распознавать виды китов по фотографиям плавников. Ученые-океанологи используют эти данные для исследования перемещения стад китов в мировом океане. Думаю, было бы здорово в будущем выбраться в отпуске на такую прогулку с китами, сделать несколько фото, прогнать их через свою обученную нейронную сетку и определить вид кита.</figcaption></figure><p>Когда на работе вам попадётся похожая задача, вы сразу понимаете, какие алгоритмы использовать и какую модель построить. Сейчас, когда я сталкиваюсь с задачами на изображениях и видео, или работаю с текстами, или с табличными данными — намного быстрее понимаю, какие подходы применимы в решении этих задач и как создать более качественное решение, и в короткие сроки могу собрать MVP благодаря опыту, который получил на Kaggle.</p><h3>Связи и потенциальных работодателей</h3><p>Kaggle — огромное комьюнити людей со схожими ценностями, я бы сказал с одним ДНК.</p><p>Благодаря успешному выступлению на платформе, в один день я получил приглашение от Google на ежегодную конференцию Google Next19 в Сан-Франциско, где параллельно с конференцией проходил хакатон KaggleDays. В одной команде со мной были вице-президент технологической компании в Калифорнии и аспирант UCLA. Мы прогнозировали, пройдёт ли деталь автомобиля краш-тест на заводе. Среди квалифицировавшихся команд, участвовавших в хакатоне, заняли пятое место.</p><figure><img src="https://media.tproger.ru/user-uploads/88534/2023-12-06/31fa79d1-181f-4b5e-a693-040eed9da9f7.jpg" alt="" /><figcaption>Наша команда на хакатоне KaggleDays в Сан-Франциско</figcaption></figure><p>На конференции можно было вживую увидеть выступление Сундара Пичаи или, например, лично познакомиться с Винтоном Серфом, вице-президентом компании Google, одним из создателей интернета, участником группы DARPA. Удивительно, конечно, какая открытая культура общения на таких ИТ-мероприятиях мирового уровня. Афтерпати конференции проходил на огромном стадионе Oracle Park (домашняя арена команды San Francisco Giants) с выступлением Гвен Стефани.</p><figure><img src="https://media.tproger.ru/user-uploads/88534/2023-12-06/319c9b6a-da9f-495e-9006-db0da9c0299f.png" alt="" /><figcaption>Выступление Сундара Пичаи на GoogleNext2019</figcaption></figure><p>Высокий рейтинг на платформе помогает легко устанавливать контакты со многими известными участниками Kaggle, у вас появляется огромное количество друзей по всему миру. Люди сразу понимают, что вы «свой» и вам можно доверять.</p><p>Если вы находитесь даже в топ-200 или топ-300 рейтинга на Kaggle, вам начинают регулярно поступать предложения о работе от крупных технологических компаний и амбициозных стартапов. Например, знаю, что большая концентрация людей с высоким рейтингом на платформе работают в NVIDIA или успешном стартапе H2O.ai.</p><p>В России при трудоустройстве в любую ИТ-компанию по ML и DS направлениям рейтинг Kaggle будет несомненным плюсом. Если вас собеседует опытный специалист, будьте уверены, он по достоинству оценит ваши навыки, полученные на Kaggle.</p><h2>Подытожим</h2><p>Чтобы достичь успеха на Kaggle, нужно уверенно владеть математикой и программированием, уметь себя дисциплинировать и не сдаваться при неудачах, а также много и упорно решать сложные задачи, не теряя мотивацию. Важно получать удовольствие от этого процесса. Не стесняться обмениваться опытом с другими специалистами — так вы не только получите ответ на свой вопрос, но и обзаведётесь полезными связями. Со многими ребятами с Kaggle мы общаемся и сегодня.</p><p>В итоге вы получите практический опыт, который сможете применить в своей работе, добавить в резюме, и, возможно, именно он поможет вам найти работу мечты.</p>]]></content:encoded>
    </item>
    <item>
      <title>Системы для работы с данными: зачем нужны и как их построить</title>
      <link>https://tproger.ru/articles/sistemy-dlja-raboty-s-dannymi-zachem-nuzhny-i-kak-ih-postroit</link>
      <comments>https://tproger.ru/articles/sistemy-dlja-raboty-s-dannymi-zachem-nuzhny-i-kak-ih-postroit?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Белоцерковский]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/sistemy-dlja-raboty-s-dannymi-zachem-nuzhny-i-kak-ih-postroit</guid>
      <description><![CDATA[<p>Рассказываем, как построить качественную инфраструктуру для работы с данными, какие нужны специалисты и как выйти с решением на рынок.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/sistemy-dlja-raboty-s-dannymi-zachem-nuzhny-i-kak-ih-postroit">Системы для работы с данными: зачем нужны и как их построить</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Анализ данных]]></category>
      <category><![CDATA[Гостевая публикация]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 30 Dec 2022 11:30:47 GMT</pubDate>
      <content:encoded><![CDATA[<p>Индустрия больших данных растет кратными темпами год к году. По оценке Ассоциации больших данных, в 2021 году объем рынка в России составлял 10-30 млрд рублей, а к 2024 году он достигнет 300 млрд рублей.</p><p>Кроме того, исследования показывают, что 68% данных, которые компании уже собирают, не используются или не приносят никакой ценности. При этом, если бизнес качественно работает с данными, используя эффективные и масштабируемые инструменты, то он скорее всего сможет выжать из них полезную информацию для развития и высвободить ресурсы ценных специалистов, перенаправив их на важные направления.</p><p>Рассмотрим пару отраслевых примеров.</p><p>В мобильной игровой индустрии опыт пользователей и успех развития проекта напрямую зависит от быстрой реакции на события. Как аудитория ведет себя в игре, какие ситуации возникают между пользователями, как они реагируют на встроенные покупки — все это большие массивы данных. Их обработка даже в пределах одной игровой сессии требует специальной инфраструктуры, профильных специалистов и математических алгоритмов. Если команда не обрабатывает эти данные и не использует их вовремя, проект может быстро упустить рыночное преимущество, потерять игроков и деньги.</p><p>В игровой индустрии также есть уникальный пример выхода в физическое пространство — и в случае с AR- или VR-играми командам приходится работать с движением человека в пространстве, для чего нужны сложнейшие технологические системы и моментальная скорость их реакции.</p><p>Другой пример — промышленные компании, которые традиционно более консервативны и также проходят через цифровую трансформацию. Производственные предприятия активно ищут сценарии использования больших данных. При этом им не так важна скорость реакции системы на события, если говорить о секундах и миллисекундах, как корректность этой реакции.</p><p>Сбор данных с датчиков на заводских станках и оборудовании позволяет предугадывать поломки и своевременно их устранять, и, соответственно, минимизировать потери и сократить издержки на простой производственный мощностей. Технические команды должны прорабатывать множество сложных сценариев и сразу учитывать все возможные варианты развития событий.</p><p>Таким образом, данные могут работать в любой сфере бизнеса, если их собирают быстро, хранят надежно и анализируют точно. На каждом этапе важно планировать вычислительные и человеческие ресурсы под разные сценарии нагрузки. Процесс отладки системы во время ее работы обходится бизнесу значительно дороже, чем предварительное тестирование сценариев и соразмерные инвестиции в них. Это касается всех участников процесса. Если система работает недостаточно стабильно, это может привести к простою и отразиться на всем бизнесе.</p><p>Правильно выбранный арсенал инструментов критичен для будущего системы. Если двадцать лет назад это было сложно, сегодня есть выбор доступных инструментов и накопленный опыт в разработке собственных. Мы, например, в VK сначала для собственных задач создали in-memory платформу Tarantool. С ее помощью можно разрабатывать высоконагруженные системы хранения и обработки данных. По мере развития продукта мы вывели его в открытый доступ (open source).</p><p>Мы с большим интересом наблюдаем, как пользователи ищут и находят новые применения технологии. Например, при расширении собственных систем обработки данных, когда нужно легковесное решение для адаптации двух систем друг ко другу. Это особенно актуально в условиях сегодняшнего мира, когда новые системы обработки данных сталкиваются со сложными системами, которые разрабатывались давно.</p><h2>Параметры систем хранения и обработки данных — на что обращать внимание?</h2><p>Если говорить про данные, поддерживающие бизнес-процессы компании, то при разработке систем важно в первую очередь обращать внимание на следующие параметры:</p><h3>Безопасность</h3><p>Безопасность и надежность работы с данными — важнейший показатель по дефолту. При разработке и развитии инфраструктуры критически важно обеспечить безопасное физическое и виртуальное хранение данных, а также их целостность — в этом может помочь резервное копирование, чтобы даже при сбоях информация не была потеряна. Все операции с данными должны соблюдать законодательство той страны, где работает компания. Пользователь может простить задержку ответа или транзакции, но потеря данных может стать серьезным ущербом для репутации.</p><h3>Масштабирование</h3><p>Для того чтобы система была отказоустойчивой, важно постоянно проводить нагрузочное тестирование. В лучшем случае при росте нагрузки сервисы могут грузиться дольше, в худшем — инфраструктура выйдет из строя или потеряет данные пользователей.</p><p>Качественная проработка предполагает, что архитекторы вместе с командой эксплуатации должны изучать, где может возникнуть бутылочное горлышко. Например, если в день запуска мобильной игры на рынок она быстро станет популярной, и инфраструктура к этому не готова, задержка в ответе приведет к оттоку пользователей уже на старте.</p><p>Также любопытен подход управления хаосом (Chaos Engineering). С усложнением систем становится труднее понять, как отдельные компоненты будут реагировать на стрессы.</p><p>Chaos engineering — это методика, которая позволяет спроектировать последовательность стрессовых для систем событий, с уже разработанными инструментами. Например, если система размещена в облаке, можно быстро проверить, как база данных реагирует на неожиданные всплески нагрузки на центральный процессор (CPU) в условиях резкого роста запросов из внешних систем, и внести изменения в кодовую базу, процессы и регламенты восстановления.</p><h3>Экономический аспект</h3><p>Экономика и пользовательский опыт идут рука об руку с компромиссом — команды архитекторов и развития бизнеса должны согласовать уровень сервиса, который учитывает время ответа системы и допустимые финансовые издержки. Важно постоянно тестировать гипотезы: сколько выделено ресурсов, как они должны работать и масштабироваться. Если в день анонса игры в приложение зашли тысячи пользователей, а команда включила автомасштабирование без тестирования, есть серьезный риск неоправданных затрат.</p><p>Для разработки инфраструктуры и управления ресурсами можно подключать облачные решения. В этом случае компания использует готовый сервис (PaaS — платформа как сервис), способный выдержать заданную нагрузку, и платит за те ресурсы, которые реально использовала.</p><h2>Качественная инфраструктура для работы с данными — какая она</h2><p>Работа инфраструктуры завязана на качественной архитектуре платформы данных. Она должна учитывать бизнесовые и технические требования к реакции на событие — будь это действие игрока или выключенный прибор в доме — и балансировать между скоростью и издержками. В какой-то момент даже минимальное улучшение показателей системы будет стоить слишком больших усилий и затрат. При этом данные должны трансформироваться в удобный инструмент для развития бизнеса.</p><p>Средний жизненный цикл данных состоит из четырех стадий. Рассмотрим их на примере промышленной турбины, по информации с датчиков которой можно понять, когда оборудование выйдет из строя.</p><h3>1. Сбор</h3><p>На первом этапе данные собираются. В случае с турбиной простые датчики только передают информацию. Более продвинутые решения могут принимать сигналы и управлять работой оборудования.</p><h3>2. Передача</h3><p>Шлюз, на который передаются данные, отправляет агрегированную информацию. Входящие сообщения попадают в очередь — часто для этого используют брокер сообщений Kafka — на другом конце находится приемник. Очередь нужна для отказоустойчивости и возможности масштабирования решения на несколько объектов.</p><h3>3. Обработка и хранение</h3><p>После того, как сообщение принято, его нужно обработать. На этом этапе важно понимать, в каком виде необходимо хранить данные. В случае турбины может быть полезно сохранить информацию о ее работе в архив, чтобы в любой момент была сделать ретроспективный анализ. Для этого в архитектуре необходимо ввести кластер баз данных для архивов и отдельно — СУБД для быстрого анализа и визуализации.</p><h3>4. Визуализация</h3><p>Это ключевой этап для бизнеса. Важно выбрать быстрый и масштабируемый инструмент, который можно кастомизировать под разные группы заказчиков аналитики внутри компании. Например, визуализацией для топ-менеджмента может быть динамически меняющаяся картинка турбины с проблемными зонами. Визуализация для инженера или аналитика должна быть более функциональной и управляемой, чтобы не приходилось каждый раз обращаться к сырым данным.</p><h2>Строим платформу для работы с данными — какие специалисты нужны</h2><p>Самое главное в любом технологическом проекте — люди, которые над ним работают. Профессиональная команда поможет выстроить эффективные процессы и минимизировать риски. При этом важно помнить, что работа с данными на всех уровнях — сложнейшая сфера, в которой стоит четко разделять зоны ответственности специалистов. Есть два подхода для формирования команды: в первом компания создает внутреннее направление и делает все сама, во втором — решает эти задачи с помощью вендоров и партнеров.</p><p>Внутреннюю команду стоит разделить на несколько стримов:</p><p><b>Архитекторы</b>. В зависимости от сложности задач, это может быть один специалист или целая команда: enterprise-архитектор выстраивает взаимодействие систем в крупной компании; solution-архитектор прорабатывает конкретное решение, а application-архитектор — приложение; архитектор данных планирует, как данные будут работать внутри решения и интегрироваться с внешними системами; security-архитектор отвечает за проектирование безопасного периметра.</p><p><b>Команда бизнес-развития</b>. Специалисты команды вырабатывают бизнес-требования к решению на основе вклада других команд.</p><p><b>Команда эксплуатации и тестирования</b>. Тестировщики, инфраструктурные специалисты и специалисты техподдержки проверяет решение на работоспособность и производительность, собирают обратную связь от внутренних и внешних пользователей системы.</p><p><b>Команда разработчиков.</b> Задача разработчиков — проанализировать вклад других команд, свести его к плану и дорожной карте продукта, донести обратную связь в виде технологической реализации.</p><p><b>Команда маркетинга и аналитики</b>. Специалисты этих команд — связующее звено между пользователями и разработчиками, данными и обратной связью с рынка, что помогает постепенно улучшать решение.</p><p>В поддержке и развитии инфраструктуры должны постоянно участвовать все команды. Это важный фактор, который нужно учитывать в планировании — система должна периодически проходить стадии перепроектирования. Состав команды также зависит от технологического стека проекта. Если проект реализован с помощью решений без программного кода (no-code/ low-code подход) или использует Kubernetes, команды могут быть небольшими. Когда нужна постоянная кастомизация или разрабатываемая платформа должна стать основой для других решений, команда проекта может достигать десятков тысяч специалистов.</p><p>Содержать и развивать такой штат сотрудников может далеко не каждая компания. В этом случае можно найти партнеров. У них уже есть собственная команда, закрывающая основной блок задач, а также опыт развития аналогичных проектов.</p><h2>Сроки и альтернативы — как быстро можно выйти с решением на рынок</h2><p>Платформа для работы с данными состоит из интегрированных между собой инструментов для сбора, обработки, хранения, аналитики и визуализации данных.</p><ul><li>Источниками данных могут быть любые системы, которые собирают потенциально полезную для бизнеса информацию — ERP, CRM, реляционные базы данных, Saas-сервисы и т.д.</li><li>В качестве инструментов для обработки данных чаще всего используют Apache Spark, Kafka, Airflow.</li><li>Для хранения и анализа данных подходят in-memory платформа Tarantool, аналитические базы данных Greenplum, Clickhouse, Vertica, а также инструменты из экосистемы Hadoop.</li><li>С задачей визуализации данных справляются BI-системы — Power BI, Qlik, Tableau, Apache Superset или их аналоги.</li></ul><p>Срок построения современных платформ для работы с данными уникален для каждого бизнеса и отдельного проекта. Все зависит от требований компании, готовности архитектуры и команды, уровня проработки бизнес-модели и ожиданий от данных. Дополнительной сложностью может стать процесс согласования: чем больше бизнес, тем, как правило, дольше принимаются решения об изменениях. В крупных проектах согласование может занимать месяцы. Для того чтобы быстрее запустить инициативу, нужен высокий уровень проработки: сформированная команда, серьезный опыт, партнерство с зарекомендовавшим себя на рынке вендором и тд.</p><p>Если в основе инфраструктуры облачные решения, ситуация может быть обратной. В облачных проектах часто стадии тестирования и согласования сокращают до минимума, используя принцип получения быстрых инсайтов от ошибок. Кроме того, у облачных провайдеров уже есть готовые примеры архитектуры и большой опыт в индустрии. Это позволяет запустить некоторые проекты за месяц. Например, «Магнит», VK Cloud и Tarantool за два месяца запустили онлайн-доставку с помощью партнеров ритейлера и подключили к ней 400 магазинов сети.</p><p>Сегодня большая часть технологических проектов в области работы с данными может быть размещена в облачных сервисах. По данным <a href="https://mcs.mail.ru/promopage/bigdata-issledovanie/?amp&amp;ysclid=lbai5pmqb5777914407">исследования</a>, которое мы провели в этом году, 46% компаний в России используют облачные решения для работы с такими проектами и 29% планируют переезд в облака в ближайшее время. Опыт вендора и модель оплаты за ресурсы по факту использования (Pay-as-You-Go) снимают риски и делает жизнь команды проекта проще. В дальнейшем такие проекты только продолжат набирать популярность, ведь количество данных растет, как и потребность в них, а инвестировать в новые физические ресурсы, масштабирование и обучение команды могут единицы компаний.</p>]]></content:encoded>
    </item>
    <item>
      <title>Алгоритмы сортировки на Java с примерами</title>
      <link>https://tproger.ru/articles/algoritmy-sortirovki-na-java-s-primerami</link>
      <comments>https://tproger.ru/articles/algoritmy-sortirovki-na-java-s-primerami?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/algoritmy-sortirovki-na-java-s-primerami</guid>
      <description><![CDATA[<p>Рассматриваем популярные алгоритмы сортировки и принципы их работы с примерами на языке программирования Java.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/algoritmy-sortirovki-na-java-s-primerami">Алгоритмы сортировки на Java с примерами</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 29 Sep 2022 09:56:35 GMT</pubDate>
      <content:encoded><![CDATA[<p>В одной из предыдущих <a href="https://tproger.ru/articles/zachem-nuzhny-algoritmy-sortirovki/">статей</a> мы разобрались, где применяются алгоритмы сортировки, а теперь поговорим об их реализации на Java. Помните, что разные алгоритмы оптимальны для разных наборов и типов данных. В нашей статье мы рассмотрим наиболее «ходовые».</p><ol><li><a href="https://tproger.ru/#part1">Сортировка пузырьком</a></li><li><a href="https://tproger.ru/#part2">Быстрая сортировка</a></li><li><a href="https://tproger.ru/#part3">Сортировка слиянием</a></li><li><a href="https://tproger.ru/#part4">Сортировка вставками</a></li><li><a href="https://tproger.ru/#part5">Сортировка выбором</a></li><li><a href="https://tproger.ru/#part6">Пирамидальная сортировка</a></li><li><a href="https://tproger.ru/#part7">Встроенные функции сортировки Java</a></li></ol><h2>Алгоритм сортировки пузырьком на Java</h2><p>Сортировка пузырьком (Bubble Sort) — это один из наиболее известных алгоритмов, суть которого состоит в последовательном сравнении двух соседних элементов. В том случае, если предыдущий элемент больше последующего, они меняются местами.</p><p><b>Так выглядит сортировка пузырьком на Java:</b></p><h3>Объяснение</h3><p>Как видим из кода, метод bubbleSort() принимает массив в качестве входных данных для сортировки — sortArr. Далее мы создаём внешний цикл for, который перебирает каждый элемент массива, тогда как внутренний цикл for начинается с первого элемента массива до предпоследнего индекса: sortArr.length - i - 1. С помощью условия if мы проверяем, больше ли элемент слева элемента справа или нет. Если элемент слева действительно больше, он меняется местами с правым элементом.</p><p>Примечание Внешний цикл for будет перебирать все элементы массива, даже если массив уже полностью отсортирован.</p><p>Массив, который принимает метод bubbleSort(), может быть любым. В нашем примере мы передаём значения 12, 6, 4, 1, 15, 10.</p><p><b>Сложность алгоритма:</b> О(n2)</p><p>А ниже представлен алгоритм сортировки двумерного массива Java пузырьком:</p><h2>Алгоритм быстрой сортировки на Java</h2><p>Быстрая сортировка, также известная как Quick Sort или сортировка Хоара, является одним их самых эффективных алгоритмов. Она включает в себя три этапа:</p><ol><li>Из массива выбирается опорный элемент, чаще всего посередине массива.</li><li>Другие элементы массива распределяются таким образом, чтобы меньшие размещались до него, а большие — после.</li><li>Далее первые шаги рекурсивно применяются к подмассивам, которые разделились опорным элементом на две части — слева и справа от него.</li></ol><p><b>Пример быстрой сортировки на языке Java:</b></p><p><b>Сложность алгоритма: </b>O(n log n)</p><h2>Алгоритм сортировки слиянием на Java</h2><p>Данный алгоритм разбивает список на две части, каждую из них он разбивает ещё на две и так далее, пока не останутся единичные элементы. Массив из одного элемента считается упорядоченным. Соседние элементы сравниваются и соединяются вместе. Так происходит до тех пор, пока все элементы не будут отсортированы.</p><p>Примечание По возможности используйте готовые алгоритмы для коллекций и методы из java.util.Arrays.</p><p><b>Реализовать алгоритм сортировки слиянием на Java можно так:</b></p><h3>Объяснение</h3><p>Сортировка осуществляется путём сравнения наименьших элементов каждого подмассива. Первые элементы каждого подмассива сравниваются первыми. Наименьший элемент перемещается в результирующий массив. Счётчики результирующего массива и подмассива, откуда был взят элемент, увеличиваются на один.</p><p><b>Сложность алгоритма: </b>O(n log n)</p><h2>Алгоритм сортировки вставками на Java</h2><p>Это простая сортировка, при которой массив постепенно перебирается слева направо. При этом элемент сравнивается со всеми предыдущими элементами и размещается так, чтобы оказаться в подходящем месте среди ранее упорядоченных элементов. Так происходит до тех пор, пока набор входных данных не будет исчерпан.</p><p><b>Так выглядит сортировка вставками на Java:</b></p><h3>Объяснение</h3><p>Предполагается, что первый элемент списка отсортирован. Переходим к следующему элементу, обозначим его i. Если х больше первого, оставляем его на своём месте. Если он меньше, копируем его на вторую позицию, а i устанавливаем в качестве первого элемента.</p><p>Переходя к другим элементам несортированного сегмента, перемещаем более крупные элементы в отсортированном сегменте вверх по списку, пока не встретим элемент меньше i или не дойдём до конца списка. В первом случае i помещается на правильную позицию.</p><p><b>Сложность алгоритма:</b> О(n2) для сравнений и перестановок.</p><h2>Алгоритм сортировки выбором на Java</h2><p>Идея алгоритма:</p><ol><li>Разбиваем массив на отсортированную и неотсортированную части.</li><li>Находим в неотсортированной части минимальный элемент.</li><li>Меняем его местами с тем элементом, который находится на нулевой позиции —<br />в конец отсортированного массива.</li><li>Далее находим следующий по величине элемент и меняем его с элементом на первой позиции, etc., пока не закончатся неотсортированные значения.</li></ol><p><b>Реализация сортировки выбором на языке программирования Java:</b></p><p><b>Сложность алгоритма:</b> О(n2)</p><h2>Алгоритм пирамидальной сортировки на Java</h2><p>Чтобы реализовать алгоритм пирамидальной сортировки (Heapsort) на Java, нужно сперва понять принцип. Алгоритм сегментирует массив на отсортированный и неотсортированный. Неотсортированный сегмент преобразовывается в кучу (heap), что позволяет эффективно эффективно определить самый большой элемент.</p><p><b>Пирамидальная сортировка на Java с использованием класса java.util.Arrays:</b></p><p><b>Сложность алгоритма: </b>O(n log n)</p><h2>Встроенные функции сортировки Java</h2><p>Рассмотрим метод sort() классов Collections и Arrays, а также структуры данных вроде TreeMap и TreeSet.</p><h3>Как использовать метод sort() в Java?</h3><p>Метод Collections.sort() для сортировки коллекций:</p><p>И метод Arrays.sort() для сортировки массивов:</p><p>Метод sort() удобно использовать в том случае, если массив или коллекция заблаговременно заполнены значениями.</p><h3>Структуры данных</h3><p>TreeMap и TreeSet</p><p>Для сортировки списков List и множеств Set следует использовать структуру TreeSet:</p><p>Если же речь идёт о коллекции пар ключ/значение Map, для сортировки подойдёт структура TreeMap, которая сортируется по ключу:</p><p>Самосортируемые структуры данных имеют эффективность O(log(n)), а значит при удвоении количества данных в коллекции время поиска не удваивается, а увеличивается на постоянную величину.</p>]]></content:encoded>
    </item>
    <item>
      <title>Алгоритмы сортировки: зачем они нужны?</title>
      <link>https://tproger.ru/articles/zachem-nuzhny-algoritmy-sortirovki</link>
      <comments>https://tproger.ru/articles/zachem-nuzhny-algoritmy-sortirovki?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/zachem-nuzhny-algoritmy-sortirovki</guid>
      <description><![CDATA[<p>Где на практике применяются алгоритмы сортировки, и применяются ли? Или же их важно знать только для собеседований? Давайте разбираться.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/zachem-nuzhny-algoritmy-sortirovki">Алгоритмы сортировки: зачем они нужны?</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Сортировка и поиск]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 12 Aug 2022 10:34:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>А зачем вообще нужны алгоритмы сортировки, если исключить собеседования? Как часто мы применяем их на практике, а если и применяем, то правильно ли? Давайте разбираться.</p><ol><li><a href="https://tproger.ru/#part1">Ложка теории</a></li><li><a href="https://tproger.ru/#part2">Бочка практики</a></li><li><a href="https://tproger.ru/#part3">Почему их так любят на собеседованиях?</a></li><li><a href="https://tproger.ru/#part4">Где на практике применяются алгоритмы сортировки?</a></li><li><a href="https://tproger.ru/#part5">Выводы</a></li></ol><h2>Ложка теории</h2><p>Сортировка данных — одна из алгоритмических категорий, к которым программисту следует привыкнуть. В первую очередь, конечно же, вы столкнётесь с сортировкой на этапе обучения. Задачи, где что-то нужно упорядочить по определённому признаку, — распространённая история, которая повторяется и на собеседованиях.</p><p>Сегодня существуют десятки алгоритмов сортировки. Прям на 100% одного идеального варианта нет: разные алгоритмы оптимальны для разных наборов и типов данных. Вы наверняка слышали или даже работали с самыми популярными из них:</p><ol><li>Пузырьковая сортировка</li><li>Сортировка перемешиванием</li><li>Сортировка расчёской</li><li>Сортировка вставками</li><li>Сортировка выбором</li><li>Быстрая сортировка</li><li>Пирамидальная сортировка</li></ol><p>Одни алгоритмы просты в реализации и хорошо подходят для разъяснения принципов сортировки, другие  — для работы с большими массивами данных, третьи оптимизированы по числу процессорных циклов, скорости, etc.</p><p>Вот так, например, выглядят 15 Алгоритмов сортировки за 6 минут.</p><p>Примечание Рекомендую убавить громкость.</p><h2>Бочка практики</h2><p>Чтобы понять, зачем нужны алгоритмы сортировки, следует проанализировать хотя бы несколько из них. Рассмотрим наиболее популярные алгоритмы в коде и с кратким объяснением.</p><h3>Сортировка пузырьком</h3><p>Сортировка пузырьком — один из самых известных алгоритмов сортировки. Его суть в последовательном сравнении значений двух соседних элементов слева направо: если предыдущее больше последующего, они меняются местами. При сортировке элементов по убыванию, наоборот: в конец списка уходят элементы с наименьшим значением.</p><figure><img src="https://media.tproger.ru/uploads/2022/08/Sortirovka-puzyrkom.gif" alt="" /><figcaption>Источник, лицензия</figcaption></figure><p><b>Код</b></p><p>Здесь во внутреннем цикле перебираем значения, начиная с последнего (array.length - 1), и в каждом следующем проходе уменьшаем количество просмотренных элементов (j &gt; i).</p><p><b>Сложность алгоритма:</b> О(n2)</p><ul><li>Алгоритм хорошо себя показывает с большими наборами данных, где элементы почти отсортированы и требуется всего одна итерация, чтобы определить, отсортирован ли список до конца.</li><li>В случае с совершенно неотсортированным списком, для пузырьковой сортировки он должен быть хотя бы небольшим.</li></ul><p>Улучшенными версиями пузырькового метода являются <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%88%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC">сортировки перемешиванием (шейкерная)</a> и <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D1%80%D0%B0%D1%81%D1%87%D1%91%D1%81%D0%BA%D0%BE%D0%B9">расчёской</a>.</p><h3>Сортировка вставками</h3><p>Это простая сортировка, при которой массив постепенно перебирается слева направо. При этом элемент сравнивается со всеми предыдущими элементами и размещается так, чтобы оказаться в подходящем месте среди ранее упорядоченных элементов. Так происходит до тех пор, пока набор входных данных не будет исчерпан.</p><p>Звучит сложно, но на деле это самый простой алгоритм сортировки.</p><figure><img src="https://media.tproger.ru/uploads/2022/08/Sortirovka-vstavkami.gif" alt="" /><figcaption>Источник, лицензия</figcaption></figure><p><b>Код</b></p><p><b>Сложность алгоритма:</b> О(n2) для сравнений и перестановок.</p><ul><li>Как и в случае с пузырьковой сортировкой, этот алгоритм работает быстрее всего на очень маленьком или почти отсортированном наборе данных.</li></ul><p>Этот алгоритм также используется как часть <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%A8%D0%B5%D0%BB%D0%BB%D0%B0">алгоритма сортировки Шелла</a>.</p><h3>Быстрая сортировка</h3><p>Быстрая сортировка относится к эффективным алгоритмам и состоит из нескольких шагов:</p><ol><li>Из массива выбирается опорный элемент, чаще всего посередине массива.</li><li>Другие элементы массива распределяются таким образом, чтобы меньшие размещались до него, а большие — после.</li><li>Далее первые шаги рекурсивно применяются к подмассивам, которые разделились опорным элементом на две части — слева и справа от него.</li></ol><figure><img src="https://media.tproger.ru/uploads/2022/08/Bystraja-sortirovka.gif" alt="" /><figcaption>Источник, лицензия</figcaption></figure><p><b>Код</b></p><p><b>Сложность алгоритма: </b>O(n log n)</p><ul><li>Быстрая сортировка считается самой быстрой, но она не всегда O(n log n), так как в худших случаях она становится О(n2).</li><li>Быстрая сортировка более эффективна для наборов данных, которые помещаются в доступную память. Для больших наборов она неэффективна, и в этом случае более предпочтительна, например, <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC">сортировка слиянием</a>.</li><li>Быстрая сортировка — это сортировка на месте (т. е. она не требует дополнительной памяти), поэтому её целесообразно использовать для массивов.</li></ul><p>Ещё больше <a href="https://tproger.ru/digest/sorting-algorithms-visualized/">алгоритмов сортировки с визуализацией</a> и подробным объяснением.</p><h2>Почему их так любят на собеседованиях?</h2><p>Так работодатель преследует сразу несколько целей:</p><ol><li>Если вам дана возможность выбрать любой алгоритм сортировки на своё усмотрение, вас проверяют на понимание работы алгоритмов и грамотный подход к решению.</li><li>Если вас просят реализовать конкретный алгоритм, делается упор на стиль написания кода.</li><li>Иногда для задачи даётся намеренно неправильный алгоритм, например такой, с которым сортировка займёт больше времени или памяти. Тогда вам нужно озвучить и аргументировать более выгодный вариант. Это продемонстрирует ваше умение анализировать задачу и отстаивать своё мнение.</li></ol><p>Очень важно понимать механизм работы того или иного алгоритма. Допустим, быстрая сортировка предпочтительнее для массивов, а сортировка слиянием — для связных списков. Дело в том, что в связном списке для доступа к данным по индексу нужно пройти от головы до этого индекса. Сортировка слиянием обращается к данным последовательно, и потребность в произвольном доступе невелика.</p><p>Если вы готовитесь к собеседованию, обязательно погоняйте себя на знание и, что немаловажно, <a href="https://tproger.ru/translations/sorting-for-beginners/">понимание алгоритмов сортировки</a>.</p><h2>Где на практике применяются алгоритмы сортировки?</h2><p>Кто бы что ни говорил, а на практике это тоже бывает полезно. Да, зачастую мы заочно сортируем данные, например через SQL-запрос с оператором ORDER BY. Или если у вас небольшой понятный массив, можно воспользоваться встроенной функцией языка типа sort() в JavaScript. Но не всегда условия просты в выполнении.</p><p>Сложности с сортировкой начинаются, когда:</p><ul><li>это работа с массивами данных на десятки или сотни тысяч элементов;</li><li>затруднён доступ к этим данным;</li><li>нужно оптимизировать время выполнения или требуемый объём памяти.</li></ul><p>К примеру, в Salesforce-разработке мне приходилось не раз сталкиваться с условиями, в которых без сортировки не обойтись. Это актуально, когда нужен не просто запрос к базе данных, а соответствие искомого элемента нескольким условиям + запуск дополнительных процессов между проверками соответствия этим условиям. При этом проекты были большими, и каждый процесс тщательно оптимизировался, дабы сэкономить время и память.</p><p>Для веба это нормальная история. Игры, такие как знаменитая головоломка французского математика Эдуарда Люка «Ханойская башня», тоже потребуют от вас понимания сортировки. Ряд математических решений и работа со строками порой не обходятся без упорядочивания данных. Есть уйма примеров, но суть одна: алгоритмы сортировки — это далеко не всегда только про собеседования.</p><h2>Выводы</h2><p>Так зачем же нужны алгоритмы сортировки на практике?</p><ol><li>Чтобы иметь чёткое представление, как работает алгоритм и как он ляжет на синтаксис конкретного языка программирования.</li><li>Чтобы тренировать алгоритмическое мышление.</li><li>Чтобы уметь реализовывать алгоритмы там, где нет подходящей готовой библиотеки.</li></ol>]]></content:encoded>
    </item>
    <item>
      <title>Алгоритмическая задача про острова</title>
      <link>https://tproger.ru/problems/algoritmicheskaja-zadacha-pro-ostrova</link>
      <comments>https://tproger.ru/problems/algoritmicheskaja-zadacha-pro-ostrova?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/algoritmicheskaja-zadacha-pro-ostrova</guid>
      <description><![CDATA[<p>Решаем алгоритмическую задачу с собеседований про острова несколькими способами: реализация на языках Java и C#.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/algoritmicheskaja-zadacha-pro-ostrova">Алгоритмическая задача про острова</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Задачи повышенной сложности]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 29 Jul 2022 12:22:37 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ранее мы разбирали алгоритмическую задачу про острова в <a href="https://tproger.ru/articles/zadachi-s-sobesedovanij-dlja-programmistov/">заданиях с собеседований для программистов</a>. К существующему решению мы получили замечание от нашего пользователя и решили разобраться в сложности алгоритма подробнее.</p><p>Давайте проанализируем выбранный нами вариант и рассмотрим тот, который предложил пользователь Типичного Программиста.</p><ol><li><a href="https://tproger.ru/#part1">Условие</a></li><li><a href="https://tproger.ru/#part2">Решение</a></li><li><a href="https://tproger.ru/#part3">Программный код</a></li><li><a href="https://tproger.ru/#part4">Проверяем решение</a></li><li><a href="https://tproger.ru/#part5">Сложность алгоритма</a></li><li><a href="https://tproger.ru/#part6">Решение от пользователя</a></li></ol><h2>Условие</h2><p>Для двумерного массива M x N, состоящего из единиц, которые обозначают сушу, и нулей, обозначающих воду, верните количество островов.</p><p>Остров окружён водой и образован соединением соседних земель по горизонтали и вертикали. Вы можете предположить, что все четыре края матрицы окружены водой.</p><p>Примечание Если островов нет, возвращаем 0. Помечаем острова через 1, а воду обозначаем как 0.</p><h2>Решение алгоритмической задачи про острова</h2><p>Поиск в глубину — классический подход в решении подобных задач. Его суть заключается в том, что мы проходим по карте и для каждой 1 запускаем поиск в глубину, чтобы осмотреться вправо, влево, вверх и вниз. При каждом запуске поиска в глубину для корневого узла будем увеличивать счётчик с количеством островов.</p><h3>Другими словами</h3><p>Для начала нам нужно найти в матрице хотя бы одну единицу: начинаем построчный обход с нулевого индекса [0,0]. Когда мы находим единицу, помечаем её, как просмотренную, и также просматриваем соседние клетки по направлениям вправо, вниз, влево, вверх.</p><p>Если предыдущая ячейка была сушей, а следующая оказалась водой, мы возвращаемся к суше и просматриваем ячейки по перечисленным направлением в том же порядке.</p><h2>Программный код</h2><p>Напишем код на Java, используя три метода. Включая main, у нас также будет метод обхода острова, чтобы понять, что находится вокруг (есть ли там ещё земля или только вода), а также метод подсчёта островов, в котором и будет запускаться метод обхода.</p><p>Никаких дополнительных инструментов для реализации не нужно. В main пишем статичное расположение островов, но при желании можно поиграться с рандомной подстановкой 0 и 1.</p><h2>Проверяем решение</h2><p>В случае с нашей картой и с учётом того, что по диагонали острова не соединяются, мы должны получить в результате три острова, что и видим на выходе программы:</p><figure><img src="https://media.tproger.ru/uploads/2022/07/Islands-task-Java.jpg" alt="" /></figure><p><a href="https://dotnetfiddle.net/RF0fZY">Здесь</a> вы можете запустить аналгичную программу на C#, а также изменить шаблон карты по своему усмотрению.</p><h2>Сложность алгоритма</h2><p>Сложность решения алгоритмической задачи про острова — O(m*n), где m — количество строк, а n — количество столбцов нашей матрицы.</p><h2>Решение от пользователя</h2><p>Есть вариант более быстрого решения, при котором программа не затормозит в случае большого массива данных:</p><figure><img src="https://media.tproger.ru/uploads/2022/07/Reshenie-algoritmicheskoj-zadachi-pro-ostrova-2.jpg" alt="" /></figure><p>А с каким решением согласны вы? Может, у вас есть своё? Предложите альтернативную реализацию в комментариях.</p>]]></content:encoded>
    </item>
    <item>
      <title>Адовые задачи с собеседований для программистов</title>
      <link>https://tproger.ru/articles/zadachi-s-sobesedovanij-dlja-programmistov</link>
      <comments>https://tproger.ru/articles/zadachi-s-sobesedovanij-dlja-programmistov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/zadachi-s-sobesedovanij-dlja-programmistov</guid>
      <description><![CDATA[<p>Держите пять непростых задач с интервью для программистов. Большинство из них имеет несколько решений. Предложите своё?</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/zadachi-s-sobesedovanij-dlja-programmistov">Адовые задачи с собеседований для программистов</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Задачи повышенной сложности]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 17 Jun 2022 09:03:23 GMT</pubDate>
      <content:encoded><![CDATA[<p>Задачи на собеседованиях для программистов характеризуются видимой сложностью, но если спокойно разобраться, всё решается довольно просто. Мы подготовили несколько заковыристых задач и решения к ним.</p><ol><li><a href="https://tproger.ru/#part1">Алгоритмическая задача про острова</a></li><li><a href="https://tproger.ru/#part2">Поиск знаменитости</a></li><li><a href="https://tproger.ru/#part3">Миллион наименьших чисел</a></li><li><a href="https://tproger.ru/#part4">Сумма чисел</a></li><li><a href="https://tproger.ru/#part5">Тёплые дни: задача на стек</a></li></ol><h2>Алгоритмическая задача про острова</h2><p>Для двумерного массива M x N, состоящего из единиц, которые обозначают сушу, и нулей, обозначающих воду, верните количество островов.</p><p>Остров окружён водой и образован соединением соседних земель по горизонтали и вертикали. Вы можете предположить, что все четыре края матрицы окружены водой.</p><p>Примечание Если островов нет, возвращаем 0.</p><h3>Решение</h3><p>Для начала нам нужно найти в матрице хотя бы одну единицу: начинаем построчный обход с нулевого индекса [0,0]. Когда мы находим единицу, помечаем её, как просмотренную, и также просматриваем соседние клетки по направлениям вправо, вниз, влево, вверх.</p><p>Если предыдущая ячейка была сушей, а следующая оказалась водой, мы возвращаемся к суше и просматриваем ячейки по перечисленным направлением в том же порядке.</p><h3>Код</h3><h2>Поиск знаменитости</h2><p>А эта задача с собеседований встречалась программистам при трудоустройстве в Amazon.</p><p>Дана группа людей из K человек, и эти люди могут знать друг друга, необязательно взаимно. Среди них есть знаменитость. Знаменитость — это человек, который не знает никого в компании, зато каждый из компании знает его. Изначально мы не владеем информацией о том, кто кого знает, но мы можем спросить у каждого участника, знает ли он других людей из группы. Нужно определить знаменитость, используя минимальное количество вопросов.</p><h3>Решение</h3><p>Для начала определимся с тем, что знаменитость всего одна. Чтобы понять следующий алгоритм решения, давайте посмотрим на двух людей из группы. Обозначим их как A и B.</p><figure><img src="https://media.tproger.ru/uploads/2022/06/5507148_account_profile_user_avatar_human_icon.jpg" alt="" /></figure><p>Когда мы спрашиваем у A, знает ли он B, мы получаем два варианта ответа:</p><ol><li>Знает — человек A не знаменитость.</li><li>Не знает — человек B не знаменитость.</li></ol><p>Так, задав всего один вопрос, мы избавляемся от одного кандидата на статус знаменитости. Именно этот алгоритм мы и используем в программе: опрашивается пара человек, после чего один из них вычёркивается из списка, и так пока не останется один кандидат.</p><p>Но наличие одного кандидата ещё не означает, что он знаменитость, ведь её может не быть вовсе. Поэтому последние два действия состоят в том, чтобы спросить у остальных, знают ли они кандидата, а у кандидата — знает ли он всех остальных.</p><h3>Код</h3><h2>Миллион наименьших чисел</h2><p>Опишите алгоритм для нахождения миллиона наименьших чисел в наборе из миллиарда чисел. Память компьютера позволяет хранить весь миллиард чисел.</p><h3>Решение</h3><p>Есть несколько способов решить поставленную задачу:</p><ol><li>Сортировка</li><li>Минимум кучи</li><li>Ранжирование</li></ol><p>Каждый из этих способов мы разобрали в нашей статье по <a href="https://tproger.ru/problems/find-the-smallest-one-million-numbers-in-one-billion-numbers/">нахождению миллиона наименьших чисел</a>.</p><h2>Сумма чисел</h2><p>Такая задача нередко встречается на интервью, и в стрессовой ситуации программист действительно может сразу не сориентироваться.</p><p>Дан отсортированный массив чисел, включая отрицательные, и некое число K. Нужно найти два числа из массива, которые в сумме дадут число K. Если таких чисел нет, в результате возвращаем пустой массив. Если комбинаций чисел, дающих нужную сумму, несколько, возвращаем любую из них.</p><p>Есть несколько вариантов решения задачи:</p><ul><li>перебор всех пар — временная сложность алгоритма O(n²);</li><li>HashSet — O(n);</li><li>бинарный поиск — O(n log n);</li><li>два указателя — O(n).</li></ul><p>Давайте решим задачу с помощью HashSet.</p><p>Примечание Хоть метод HashSet и работает за один проход по массиву, он тратит дополнительную память, так как в худшем случае мы перенесём все элементы из входного массива в наш сет.</p><h3>Решение</h3><p>Создаём пустой сет и смотрим первый элемент массива. Добавляем его в сет. Далее смотрим второй элемент и то, даёт ли он в сумме с вынесенным в сет первым элементом K. Если нет, просто переносим его в сет. Так мы продолжаем до тех пор, пока не найдём число, которое в сумме с другим числом из сета даст число K. Выводим массив из этих двух элементов в качестве ответа.</p><h3>Код</h3><h2>Тёплые дни: задача на стек</h2><p>Дан массив чисел, состоящий из N элементов. Эти числа обозначают температуру в конкретный день. Для каждого дня нужно найти количество суток до наступления более тёплого дня.</p><p>Вот пример того, как это можно изобразить:</p><h3>Решение</h3><p>Используем два цикла. В первом мы будем идти по всем дням, для которых хотим определить ответ, а во втором пробегать направо до тех пор, пока не наткнёмся на более тёплый день.</p><h3>Код</h3><p>Понравились задачки? Держите ещё <a href="https://tproger.ru/articles/10-logicheskih-zadach-s-sobesedovanij-kotorye-zastavjat-zastrelitsja/">десять непростых задач на логику</a>, которые часто задают программистам на собеседованиях.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как искать данные в пространстве невероятно быстро? R*-tree в Go</title>
      <link>https://tproger.ru/articles/kak-iskat-dannye-v-prostranstve-neverojatno-bystro-r-tree-v-go</link>
      <comments>https://tproger.ru/articles/kak-iskat-dannye-v-prostranstve-neverojatno-bystro-r-tree-v-go?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Кирилл Данилов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-iskat-dannye-v-prostranstve-neverojatno-bystro-r-tree-v-go</guid>
      <description><![CDATA[<p>Как использовать R*-tree, чтобы обновлять данные об игроках на сервере даже при онлайне в 1000 человек и выше.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-iskat-dannye-v-prostranstve-neverojatno-bystro-r-tree-v-go">Как искать данные в пространстве невероятно быстро? R*-tree в Go</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[Анализ данных]]></category>
      <category><![CDATA[Пост пользователя]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 11 May 2022 11:45:05 GMT</pubDate>
      <content:encoded><![CDATA[<p>Всем привет! Я являюсь игровым разработчиком в трехмерных играх с большим опытом и в данный момент перехожу на язык Go и перехожу в Highload. Сегодня я бы хотел рассказать о том, с какой интересной задумкой я столкнулся и решил одну интересную проблему.</p><p>Задумывались ли Вы, как быстро работать с любыми пространственными данными, чтобы это было быстро и эффективно?</p><h2>Предыстория</h2><p><i>На моём опыте я участвовал проектах с нагруженностью 2-3 тысячи человек.В среднем, на одном игровой «машине» располагается примерно 500-1000 человек.На опыте был один проект, где вовсе было 3 тысячи человек: два игровых сервера по 1500 тысячи человек</i></p><p>По большей своей части, я занимался клиентом и логическим ядром сервера в виде обращений к БД, работе с кэшем и связью между клиентом и сервером.<br />Поэтому во всех этих игровых проектах, к сожалению, у меня не было доступа к более низкому уровню сети вроде «синхронизации игроков между другими игроками», кроме одного проекта, где мне помог один человек. Он рассказал мне о том, как работает синхронизация между игроками в его игре.</p><p>Представим себе трехмерную игровую карту с 1000 игроков на сервере.  Карта достаточно большая, поэтому нет смысла, чтобы игроки видели друг друг друга на огромных расстояниях. Это бессмысленная нагрузка.</p><p>Эффективнее всего игроку давать какую-то область видимости (например, круг или квадрат вокруг игрока), где он бы видел игроков поблизости. Так это и устроено в игре, а такая область видимости называется «<b>зона стрима</b>».</p><p>Как просчитывается эта зона стрима?</p><p>Не будем углубляться в в жизненный цикл игрового сервера… Буквально каждую секунду на сервере происходит перерасчет зоны видимости игрока. Они — игроки — постоянно двигаются, перемещаются по карте на автомобилях или пешком.</p><p>Так вот, тот самый человек, который помог мне, рассказал, что в его игре при 1000 онлайне сервера расчет происходит так: берется игрок — к нему просчитываются все остальные игроки, и так для всех игроков. То есть, это цикл 1000 * 1000.</p><p>Я был очень сильно удивлен, поэтому начал копать…</p><h2>Подходим к R-tree. Что это, почему и зачем?</h2><p>Пока я копался в базах данных для подготовки к собеседованиям на Go, я наткнулся на GiST индекс, который является подвидом структуры R-tree. Я начал изучать, что это такое — и это ровно то, что и было нужно!</p><p><i>Что такое </i><b>R-tree</b><i>? </i>R-tree — это древовидная структура данных, которая позволяет довольно быстро работать с геопространственными данными.</p><p><i>А </i><b>R*-tree</b><i> что тогда такое? </i>R*-tree — это подвид структуры R*-tree, который более ёмок в построении, но при этом позволяет обращаться к данным быстрее, чем обычный R-tree</p><h2>Ещё чуть-чуть о той сфере, в которой я работаю</h2><p><i>Я рассказал этому человеку об этой структуре данных (R-tree) и скинул одну интересную статью, и он с удовольствием принял эту идею и в ближайшее время её реализует. </i></p><p>Я показал разработчику буквально на примере, взяв библиотеку <a href="https://github.com/dhconnelly/rtreego">rtreego</a>, с какой разницей можно работать с этими данными по времени. Нагрузка при 4000 игроков с R-tree может быть такой же, как у него с 1000 игроков при его реализации!</p><p>Я был очень сильно доволен, так как решил одну интересную проблемку, но тут было ещё более интересно… Сам же я бегло прочитал ту статью, которую скинул, и этот человек указал мне на то, что в статье описан R*-tree, а не только R-tree.</p><p>Мне было крайне интересно узнать разницу между этими алгоритмами, поэтому я стал копать дальше…</p><h2>В чём же разница между R-tree и R*-tree?</h2><p>R-tree невероятно прост в построении и так же невероятно прост в поиске. У этого дерева нет никаких требований.</p><p>R*-tree сложнее в построении, но при этом более эффективен в поисковых запросах.</p><h2>Что же сложного в построении R*-tree?</h2><p>Возьмем в пример построение R-tree, R-tree с линейным разделением и R*-tree:</p><figure><img src="https://media.tproger.ru/uploads/2022/05/Bezymjannyj.jpg" alt="" /></figure><p>В третьем варианте мы можем увидеть более четкое и явно разделение элементов по веткам (красным квадратикам) и деревьям (синим квадратикам), в то время как в первом и втором варианте у нас самая настоящая <b>каша</b>.</p><p>При обычной вставке элемента в R*-tree дерево работает так же как и в R-tree, но.<br />Когда «листья», на которых хранятся элементы, необходимо разделить — R-tree делает это не запариваясь, в то время как R*-tree старается сделать так, чтобы:</p><ol><li>Листья занимали как можно меньшую площадь</li><li>Листья как можно меньше накладывались на другие листья поблизости</li><li>Листья были равно распределены</li></ol><p>За счет соблюдения трех этих правил, построение может быть по времени в 2-3 раза сложнее, но! Поиск по элементам будет эффективнее в 1.5 — 3 раза.</p><p>Если Вам нужно использовать статические данные, R*-tree будет для Вас!</p><h2>Так где нужно использовать R-tree, а где R*-tree?</h2><p>Мы поняли, что R-tree довольно быстрый при вставке, но медленнее по поиску.<br />Просто взять и «перемещать» данные по дереву невозможно, а лишь можно удалять элемент и вставлять его заново.<br />Поэтому мы приходим к выводу.</p><p>Где можно использовать <b>R-tree</b>?</p><ol><li>Игровой стриминг (область видимости игрока в пространстве)</li><li>Карты, где элементы могут перемещаться (те же карты с курьерами или такси, например!)</li><li>Любые геоданные, которые довольно часто обновляются, но чтение чуть менее важно.</li></ol><p>Где можно использовать <b>R*-tree</b>?</p><ol><li>Тот же игровой стриминг, но статических объектов! Например, у игрока есть огромная карта с множеством элементов (как города в GTA, например). Поиск по этим элементам, даже если их миллион, можно делать за мили (или даже нано) секунды!</li><li>Карты, где невероятно множество статических элементов. (Например, карта заведений, домов или элементов, которые меняются довольно редко)</li><li>Любые геоданные, которые почти не обновляются, но требуют невероятно быстрого чтения</li></ol><p>Эти две структуры данных можно комбинировать.<br />Например, карта курьерской доставки, на которой располагаются обычные дома в одной структуре, а во второй будут курьеры, которые перемещаются.</p><p><i>Таким образом, я выяснил, где конкретно в играх (и не только) можно невероятно эффективно пользоваться этими данными, поэтому возьму эту структуру данных на вооружение.</i></p><h2>Возвращаемся к вопросу об R*-tree на языке Go…</h2><p>У меня ушло довольно много времени, ради того, чтобы понять, как это работает.<br />Сначала я попытался переписать R*-tree с Delphi на Go. У меня это заняло два дня и… не получилось, потому что я не понимал устройства этой структуры.</p><p>Тогда я выяснил для себя путь:</p><ol><li>Полностью переписать и разобрать каждое мелкое действие в готовом решении R-tree (<a href="https://github.com/dhconnelly/rtreego">rtreego</a>)</li><li>Разобрать статью об R*-tree, в которой были исходники на Delphi и псевдокоде</li><li>Сделать из R-tree — R*-tree</li></ol><p><b>Спойлер</b>: у меня это удалось</p><h2>Исходники того, что было сделано и из чего это было сделано</h2><p>Во-первых, хочу проявить огромную благодарность человеку, создавшему <a href="https://github.com/dhconnelly/rtreego">rtreego</a> — <a href="https://github.com/dhconnelly">dhconnelly</a> (автор этой библиотеки).</p><p>Во-вторых, хочу выразить невероятную благодарность человеку, который буквально на пальцах описал статью об R*-tree на своём опыте. Информации было невероятно мало, но именно эта статья ответила на многие вопросы! <a href="https://habr.com/ru/sandbox/171056/">Статья *тык*</a></p><p>Ну, и в третьих, статьи из вики: <a href="https://en.wikipediam.org/wiki/R*-tree">R*-tree (wikipediam)</a>, <a href="https://ru.wikipedia.org/wiki/R-%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_(%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)">R-tree (wikipedia на русском)</a></p><p>Из <a href="https://github.com/dhconnelly/rtreego">rtreego</a> я взял за основу R-tree и, переварив код на Delphi и псевдокод из <a href="https://habr.com/ru/sandbox/171056/">статьи</a>, мне удалось создать R*-tree на языке Go, который работает ровно так, как описано по алгортиму.</p><h2>Ссылка на репозиторий:</h2><p>Самое важное —</p><p>Всем огромное спасибо за внимание и за то, что смогли осилить эту невероятно <b>не маленькую </b>статью!</p>]]></content:encoded>
    </item>
    <item>
      <title>Угадать число от 0 до 100 за 7 попыток — математический трюк</title>
      <link>https://tproger.ru/articles/matematicheskij-fokus-ugadat-chislo-ot-0-do-100-za-7-popytok</link>
      <comments>https://tproger.ru/articles/matematicheskij-fokus-ugadat-chislo-ot-0-do-100-za-7-popytok?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/matematicheskij-fokus-ugadat-chislo-ot-0-do-100-za-7-popytok</guid>
      <description><![CDATA[<p>Математический фокус, который способен удивить. Объясним алгоритм и напишем на Java простенькую программу для решения.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/matematicheskij-fokus-ugadat-chislo-ot-0-do-100-za-7-popytok">Угадать число от 0 до 100 за 7 попыток — математический трюк</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 11 Feb 2022 08:30:41 GMT</pubDate>
      <content:encoded><![CDATA[<p>Этот математический фокус не так сложен, как может показаться на первый взгляд. Более того, решение мы реализуем программно на языке Java. Приступим?</p><h2>Условие</h2><p>Если расписать весь процесс поэтапно, выглядит это следующим образом:</p><ol><li>Вы загадываете число от 0 до 100.</li><li>Программа выводит целое число в рамках данного диапазона.</li><li>Вы отвечаете, ваше число больше, меньше или равно тому, что вывела программа.</li><li>Если число больше либо меньше, программа продолжает предлагать варианты.</li><li>За 7 или менее попыток число гарантированно угадывается.</li></ol><h2>Решение</h2><p>На самом деле, никакого особого секрета здесь нет, и решение строится на бинарном поиске. Это простая алгоритмическая задача, смысл которой в том, чтобы каждый раз делить оставшийся диапазон на 2. Таким образом мы с каждой попыткой вдвое сокращаем область поиска, увеличивая шансы на успех. Вот и весь математический фокус.</p><p>Допустим, первой догадкой алгоритма будет число 50, после чего становится понятно, в какую сторону исходного диапазона «шагать» дальше: это будет область 0–50 либо 51–100. Если первый вариант, то далее алгоритм предложит число 25 и так далее. Математические законы предполагают, что если число 100 делить вдвое 7 раз, мы гарантированно получим результат в районе единицы.</p><p>Можно найти число и в диапазоне побольше — от 0 до 127 или от 1 до 128. Всё потому, что 27=128. Соответственно, если у нас будет 8 попыток, область можно увеличить до 256, если 9 — до 512 и т. д. По этому же принципу работают <a href="https://tproger.ru/articles/dvoichnoe-binarnoe-derevo-sozdanie-i-obhod/">бинарные деревья</a>.</p><p>Но решать всё вручную с калькулятором наперевес — прошлый век. Давайте подключим код и посмотрим, как с этим справится программа.</p><h2>Решение кодом</h2><p>Воспроизведём решение с помощью Java без использования графического интерфейса. При желании всегда можно подключить Swing или JavaFX.</p><p>Для начала определимся с переменными, которые нам потребуются:</p><p>Поскольку мы будем работать с терминалом, подключим слушатель событий с помощью класса Scanner:</p><p>И объявим переменную слушателя:</p><p>Далее всё просто: программа выводит варианты, а пользователь отправляет +, - или =, в зависимости от того, больше загаданное число, меньше или идентично. Пока введённое значение не = (while (!strInput.equals("="))), продолжаем вычислять и делить заданный диапазон:</p><p>Понравилась задачка? Держите ещё один математический фокус в виде <a href="https://tproger.ru/articles/gipoteza-kollatca-samyj-krutoj-matematicheskij-fokus-vseh-vremjon/">гипотезы Коллатца</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Двоичное (бинарное) дерево: удаление элемента и скорость работы</title>
      <link>https://tproger.ru/articles/dvoichnoe-binarnoe-derevo-udalenie-jelementa-i-skorost-raboty</link>
      <comments>https://tproger.ru/articles/dvoichnoe-binarnoe-derevo-udalenie-jelementa-i-skorost-raboty?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Maksim Petrikov]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/dvoichnoe-binarnoe-derevo-udalenie-jelementa-i-skorost-raboty</guid>
      <description><![CDATA[<p>Удаление элемента из двоичного дерева меняет его структуру. Ключевые аспекты: перестроение после операции и скорость работы в лучшем и худшем случаях.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/dvoichnoe-binarnoe-derevo-udalenie-jelementa-i-skorost-raboty">Двоичное (бинарное) дерево: удаление элемента и скорость работы</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Пост пользователя]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 22 Nov 2021 15:48:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>В <a href="https://tproger.ru/articles/dvoichnoe-binarnoe-derevo-sozdanie-i-obhod/">предыдущей статье</a> мы рассмотрели операции для создания и обхода двоичного дерева.</p><p>Но таких операция недостаточно для полноценной работы с двоичным деревом поиска, кроме добавления элементов, иногда, элементы нужно удалять. В этой статье коснёмся этого вопроса, рассмотрим как при этом перестраивается дерево. Также обсудим скорость работы двоичного дерева в лучшем и худшем случае.</p><h2>Скорость работы алгоритма и вырожденный случай</h2><p>Рассмотрим идеальный случай формирования двоичного дерева.</p><figure><img src="https://media.tproger.ru/uploads/2021/11/06-full-tree.png" alt="" /></figure><p>Все элементы распределены равномерно между левыми и правыми поддеревьями. Такое дерево называется сбалансированным. Есть строгое определение этого: двоичное дерево сбалансировано по высоте, если для каждой его вершины высота её двух поддеревьев различается не более чем на 1.</p><p>Если рассмотреть сбалансированное дерево и операции с ним, то на каждом из переходов в поддерево, мы как бы отсекаем половину значений, понимая что в них точно не содержится нужное нам значение.</p><figure><img src="https://media.tproger.ru/uploads/2021/11/06-split-full-tree.png" alt="" /></figure><p>Алгоритмы с таким отсечением в несколько раз на каждом шаге, называют логарифмическими, или говорят что они работают за время log(N). Где N — количество узлов в дереве. По этому же принципу работает <a href="https://tproger.ru/articles/matematicheskij-fokus-ugadat-chislo-ot-0-do-100-za-7-popytok/">математический фокус</a> по угадыванию числа от 0 до 100 за 7 попыток.</p><p>Можем заметить что при обходе в глубину (рассматривался в предыдущей статье) с использованием симметричного варианта обхода получаем отсортированный массив, и двоичное дерево можно было бы использовать для сортировки за время N * log(N) (N элементов, каждому находится место для вставки за log(N) время). К сожалению, вырожденный случай портит этот вариант, и построение двоичного дерева может занимать N * N (квадратичное) время. То есть каждый элемент вставляется за время N, то есть приходится проходить по всем элементам, чтобы найти нужное место для вставки нового элемента.</p><p>Посмотрим как будет выглядеть двоичное дерево, например при построении из возрастающего массива чисел 1, 3, 6, 9, 10.</p><figure><img src="https://media.tproger.ru/uploads/2021/11/06_list.png" alt="" /></figure><p>Получаем просто односвязный список, все операции в которым занимают линейное время, или, что то же самое, выполняются за время O(N).</p><p>Для исправления этой ситуации существуют более сложные, сбалансированные, вариации двоичного дерева, например АВЛ дерево, красно-черное дерево, Б-деревья.</p><p>Также время работы может портить реализация, например при обходе в ширину,  мы можем использовать метод shift, который сам по себе работает за линейное время. Что увеличивает время работы обхода с O(N) — обходим все элементы без дополнительных затрат на поиск элементов, до O(N*N) — на каждый элемент добавляется операция смещения всех элементов в массиве, который используется для хранения необработанных узлов.</p><h2>Удаление элемента</h2><p>Идея удаления элемента делится на несколько случаев:</p><ul><li>у узла нет дочерних узлов;</li><li>у узла есть левый дочерних узлов;</li><li>у узла есть правый дочерних узлов;</li><li>у узла есть оба ребёнка.</li></ul><p>В случае 1 просто удаляем узел, дополнительная работа не требуется.</p><p>В случае 2 и 3 заменяем удаляемый узел на его потомка, на этом удаление заканчивается. Случай 4 самый сложный, но концепция такого удаления довольно проста — найти в правом поддереве минимальный элемент и переместить его на место удаляемого узла.</p><p>Идейно удаление довольно просто, но мы знаем что работа с деревом обычно происходит через рекурсивные вызовы. И как удалить какой-то узел, если мы уже находимся в потомке не очень понятно.</p><p>Идея реализации удаления следующая. Спускаемся на уровень ниже, вызывая функцию рекурсивно, при этом присваивая обрабатываемому элементу, то что вернёт функция удаления.</p><p>Начало алгоритма удаления — поиск в дереве удаляемого элемента. При этом идея присваивания возвращаемого элемента из функции _deleteNode применяется сразу.</p><p>Когда нашли удаляемый элемент, то проверяем 4 случая описанные выше.</p><p>Если нет потомков, то просто возвращаем null, который в предыдущей вызове функции присвоится вместо элемента.</p><p>Если случаи 2 или 3, возвращаем один дочерний элемент, как бы убирая из дерева текущий узел.</p><p><b>Если у узла два потомка</b>, то находим минимальный элемент в правом поддереве этого узла.</p><p>Можно встретить альтернативное описание поиска минимального элемента, более формальное, но имеющее тот же смысл, что описание выше:</p><ul><li>если в первом узле правого поддерева нет левого узла, то используем его (это минимальный элемент, в правом узле все значение больше);</li><li>либо находим самый левый элемент в правом поддереве</li></ul><p>Ниже в коде, для этого есть отдельная функция _findMinElement. После нахождения такого элемента, заменяем у текущего удаляемого узла значение (value). И вызываем функцию удаления правого поддерева, для найденного минимального узла в правом поддереве, так как мы его уже перенесли на место удаляемого, и на его старом место его нужно удалить. Код этого переноса и вызова удаления перенесенного элемента:</p><p>Код удаления элемента с комментариями:</p><p>Рассмотрим дерево</p><figure><img src="https://media.tproger.ru/uploads/2021/11/07-delete.png" alt="" /></figure><p>Удалим из этого дерева элемент 8.</p><p>Рассмотрим цепочку вызовов, сверху вниз:</p><p>Удалим из дерева элемент со значением 3.5.</p><p>Рассмотрим цепочку вызовов, сверху вниз:</p><h2>Полный код двоичного дерева</h2><p>Здесь приводится полный код простейшего двоичного дерева (без getKey и compare функций) из двух статей, чтобы не пришлось собирать из разных частей, и можно было позапускать, для лучшего понимания.</p><h3>Заключение</h3><p>Мы познакомились с концепцией двоичных деревьев — структурой данных, позволяющей работать с данными за логарифмическое время, вместо линейного. Все операции, кроме реализации удаления, интуитивно понятны. Эта структура данных является отправной точкой для знакомства с более сложными деревьями, такими как сбалансированные двоичные деревья.</p>]]></content:encoded>
    </item>
    <item>
      <title>Двоичное(бинарное) дерево: создание и обход</title>
      <link>https://tproger.ru/articles/dvoichnoe-binarnoe-derevo-sozdanie-i-obhod</link>
      <comments>https://tproger.ru/articles/dvoichnoe-binarnoe-derevo-sozdanie-i-obhod?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Maksim Petrikov]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/dvoichnoe-binarnoe-derevo-sozdanie-i-obhod</guid>
      <description><![CDATA[<p>Двоичное дерево строится из узлов, а обход позволяет посетить его элементы в заданном порядке; объяснение подходит начинающим разработчикам.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/dvoichnoe-binarnoe-derevo-sozdanie-i-obhod">Двоичное(бинарное) дерево: создание и обход</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Пост пользователя]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 10 Nov 2021 16:09:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>В этой статье рассмотрим двоичное дерево, как оно строится и варианты обходов.</p><p>Двоичное дерево в первую очередь дерево. В программировании – структура данных, которая имеет корень и дочерние узлы, без циклических связей. Если рассмотреть отдельно любой узел с дочерними элементами, то получится тоже дерево. Узел называется внутренним, если имеет хотя бы одно поддерево. Cамые нижние элементы, которые не имеют дочерних элементов, называются листами или листовыми узлами.</p><p>Дерево обычно рисуется сверху вниз.</p><figure><img src="https://media.tproger.ru/uploads/2021/11/01_binary_trees.png" alt="" /></figure><p>В узлах может храниться любая информация, от примитивных типов до объектов. В этой статье, мы рассмотрим реализацию, когда в узле также хранятся ссылки на дочерние элементы. Кроме такого подхода, возможен альтернативный подход для двоичного дерева — хранение в массиве.</p><p>Первая особенность двоичного дерева, что любой узел не может иметь более двух детей. Их называют просто — левый и правый потомок, или левое и правое поддерево.</p><p>Вторая особенность двоичного дерева, и основное правило его построения, заключается в том что левый потомок меньше текущего узла, а правый потомок больше. Отношение больше/меньше имеет смысл для сравниваемых объектов, например числа, строки, если в дереве содержатся сложные объекты, то для них берётся какая-нибудь процедура сравнения, и она будет отрабатывать при всех операциях работы с деревом.</p><h2>Создание дерева, вставка</h2><p>Рассмотрим существующее двоичное дерево. Корень содержит число 3, все узлы в левом поддереве меньше текущего, в правом — больше. Такие же правила действуют для любого рассматриваемого узла и его поддеревьев.</p><figure><img src="https://media.tproger.ru/uploads/2021/11/02.png" alt="" /></figure><p>Попробуем вставить в это дерево элемент -1.</p><figure><img src="https://media.tproger.ru/uploads/2021/11/03_insert_element.png" alt="" /></figure><p>Из корня идем в левое поддерево, так как -1 меньше 3. Из узла со значением 1 также идём в левое поддерево. Но в этом узле левое поддерево отсутствует, вставляем в эту позицию элемент, создавая новый узел дерева.</p><p>Вставим в получившееся дерево элемент 3.5.</p><figure><img src="https://media.tproger.ru/uploads/2021/11/04.png" alt="" /></figure><p>Проходим по дереву, сравнивая на каждом из этапов вставляемое значение с элементом в узле, пока не дойдем до узла, в котором следующий узел для сравнения отсутствует, в эту позицию и вставляем новый узел.</p><p>Если дерево не существует, то есть root равен null, то элемент вставляется в корень, после этого проводится вставка по описанному выше алгоритму.</p><p>Напишем класс для создания двоичного дерева:</p><p>На скриншоте ниже то, какую информацию хранит в себе binaryTree:</p><figure><img src="https://media.tproger.ru/uploads/2021/11/05.png" alt="" /></figure><h2>Обход</h2><p>Рассмотрим несколько алгоритмов обхода/поиска элементов в двоичном дереве.</p><p>Мы можем спускаться по дереву, в каждом из узлов есть выбор куда можем пойти в первую очередь и какой из элементов обработать сначала: левое поддерево, корень или право поддерево. Такие варианты обхода называются обходы в глубину (depth first).</p><p>Какие возможны варианты обхода (слово поддерево опустим):</p><ul><li>корень, левое, правое (preorder, прямой);</li><li>корень, правое, левое;</li><li>левое, корень, правое (inorder, симметричный, центрированный);</li><li>левое, правое, корень (postorder, обратный);</li><li>правое, корень, левое;</li><li>правое, левое, корень.</li></ul><p>Также используется вариант для обхода деревьев по уровням. Уровень в дереве — его удалённость от корня. Сначала обходится корень, после этого узлы первого уровня и так далее. Называется обход в ширину, по уровням, breadth first, BFS — breadth first search или level order traversal.</p><p>Выбирается один из этих вариантов, и делается обход, в каждом из узлов применяя выбранную стратегию.</p><p>Обычно для обходов в глубину применяется рекурсия. Реализуем один из вариантов, например симметричный: левое поддерево, корень, правое поддерево.</p><p>При этом мы обработаем первым самый левый узел, где левое поддерево окажется пустым, но правое может присутствовать. То есть в каждом из узлов будем спускаться ниже и ниже, пока левое поддерево не окажется пустым.</p><p>Для реализации других вариантов обхода просто меняем порядок вызова функций в функции _inorderInternal. И нужно не забыть переименовать функцию, чтобы название соответствовало содержимому.</p><p>Рассмотрим inorder алгоритм обхода на примере дерева, созданного в предыдущем блоке кода.</p><p>Сначала мы спустимся в самое левое поддерево — узел -1. Зайдем в его левое поддерево, которого нет, первая конструкция выполнится, ничего не сделав внутри функции. Вызовется обработчик handlerFunction, на узле -1. После этого произойдёт попытка войти в правое поддерево, которого нет. Работа функции для узла -1 завершится.</p><p>В вызов для узла -1 мы пришли через вызов функции _inorderInternal для левого поддерева узла 1. Вызов для левого поддерева -1 завершился, вызовется обработчик для значения узла 1, после этого — для правого поддерева. Правого поддерева нет, функция для узла 1 заканчивает работу. Выходим в обработчик для корня дерева.</p><p>Для корня дерева левое поддерево полностью отработало, происходит переход ко второй строке процедуры обхода — вызов обработчика значения узла. После чего вызов функции для обработчика правого поддерева.</p><p>Аналогично продолжая рассуждения, и запоминая на какой строке для определенного узла мы вошли в рекурсивный вызов, можем пройти алгоритм «руками», лучше понимая его работу.</p><p>Для обходов в ширину используется дополнительный массив.</p><h2>Поиск</h2><p>Операция поиска — вернуть true или false, в зависимости от того, содержится элемент в дереве или нет. Может быть реализована на основе поиска в глубину или ширину, посмотрим на реализацию на основе алгоритма обхода в глубину.</p><h2>Функция сравнения или получение ключа</h2><p>До этого мы рассматривали простые данные, для которых определена операция сравнения между ключами. Не всегда возможно реализовать сравнение таким простым образом.</p><p>Можно сделать функцию, которая будет получать ключ из данных, которые хранятся в узле.</p><p>Можно передать в конструктор специальную функцию сравнения. Эту функцию можно сделать как обычно делают функции сравнения в программировании, возвращать 0, если ключи равны. Значение больше нуля, если первый переданный объект больше второго, и меньше нуля если меньше. Важно не перепутать когда что возвращается и правильно передать параметры. Например, текущий узел, уже существующий в дереве, первым параметром, а тот, с которым производится текущая операция — вторым.</p><p>Для реализации такой возможности потребуется во всех местах сравнения использовать эту функцию</p><h2>Заключение</h2><p>Мы познакомились с концепцией двоичных деревьев и операциями для создания такого типа дерева. Эти операции интуитивно понятны, в следующей статье рассмотрим <a href="https://tproger.ru/articles/dvoichnoe-binarnoe-derevo-udalenie-jelementa-i-skorost-raboty/">процедуру удаления и скорость работы двоичного дерева</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Вычисление чисел Фибоначчи</title>
      <link>https://tproger.ru/articles/chisla-fibonachchi</link>
      <comments>https://tproger.ru/articles/chisla-fibonachchi?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chisla-fibonachchi</guid>
      <description><![CDATA[<p>Что такое числа Фибоначчи и как написать программу вычисления последовательности? Разберём три примера на языке Java.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chisla-fibonachchi">Вычисление чисел Фибоначчи</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 03 Nov 2021 11:39:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>Числа Фибоначчи — это числа такой последовательности, в которой первые два элемента — 0 и 1, а каждый последующий элемент равен сумме двух предшествующих. Выглядит это так:</p><p>Примечание Иногда 0 опускается, и в этом случае ряд начинается с 1, но мы будем использовать последовательность с 0 на первой позиции.</p><p>Формула записывается следующим образом:</p><p><a href="https://media.tproger.ru/uploads/2021/11/Fib_formula-1.jpg"></a></p><p>Вычисление ряда Фибоначчи — стандартная задача, которую задают на собеседованиях, чтобы проверить кандидата на понимание алгоритмов. Не так популярна, как сортировка, но всё же.</p><p>Давайте вычислим ряд и его отдельные элементы, использовав для этого язык Java.</p><ol><li><a href="https://tproger.ru/#part1">Цикл</a></li><li><a href="https://tproger.ru/#part2">Рекурсия</a></li><li><a href="https://tproger.ru/#part3">Stream</a></li><li><a href="https://tproger.ru/#part4">Тест</a></li></ol><h2>Вычислить ряд Фибоначчи циклом</h2><p>Предположим, что нам нужно вывести на экран первые десять чисел последовательности Фибоначчи. Мы помним, что:</p><ul><li>первый элемент ряда — 0, второй — 1;</li><li>каждый последующий — сумма двух предыдущих.</li></ul><p>Тогда наша последовательность будет иметь такой вид:</p><p>Но нам нужно вывести результат с использованием программы. Держите код с объяснениями в комментариях:</p><p>Выполнение завершится на десятом элементе. Количество элементов при этом можно менять, изменив значение в условиях цикла.</p><h2>Найти число Фибоначчи через рекурсию</h2><p>Рекурсивная функция — это такая функция, которая вызывает саму себя. Она также неплохо отрабатывает в алгоритмических задачах вроде чисел Фибоначчи, но ей требуется больше времени.</p><p>Почему так происходит? Всё дело в том, что рекурсивная функция приводит к многоразовому вызову одних и тех же операций. Именно из-за этого её не рекомендуется использовать, но если уж на собеседовании прозвучит такая задача, вы будете готовы.</p><p>Рассмотрим пример, в котором нам нужно получить n-ое число в ряде Фибоначчи:</p><p>Если в качестве num задать большое значение, программа зависнет.</p><p>Тип int в Java может хранить значения до 2147483647, так что вычислить получится лишь первые 46 чисел Фибоначчи. Тип long хранит до 9223372036854775807, а это 91 число Фибоначчи. Класс BigInteger призван работать с действительно большими значениями, вот только само выполнение программы это никак не ускорит.</p><h2>Использовать для вычисления Stream</h2><p>Stream в Java — это компонент для самостоятельной внутренней итерации своих же элементов. Подробнее о нём вы можете почитать в нашей <a href="https://tproger.ru/articles/chto-nuzhno-znat-o-java-stream-api/">статье о Java Stream API</a>.</p><p>И, разумеется, Stream подходит для вычисления элементов последовательности Фибоначчи:</p><p>В данном примере метод iterate() будет возвращать упорядоченный поток, ограниченный лимитом в num значений и созданный с применением функции к начальному массиву arr. В консоль будет выведено следующее:</p><p>А так мы получим сумму чисел последовательности по элемент num включительно:</p><h2>Математический тест</h2><p>Любите математику? Попробуйте решить наш математический тест:</p>]]></content:encoded>
    </item>
    <item>
      <title>Идеи динамического программирования: одномерные задачи, часть 2</title>
      <link>https://tproger.ru/articles/idei-dinamicheskogo-programmirovanija-odnomernye-zadachi-chast-2</link>
      <comments>https://tproger.ru/articles/idei-dinamicheskogo-programmirovanija-odnomernye-zadachi-chast-2?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Maksim Petrikov]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/idei-dinamicheskogo-programmirovanija-odnomernye-zadachi-chast-2</guid>
      <description><![CDATA[<p>Основные задачи динамического программирования, которые можно решить, используя одномерный массив.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/idei-dinamicheskogo-programmirovanija-odnomernye-zadachi-chast-2">Идеи динамического программирования: одномерные задачи, часть 2</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Рекурсия и динамика]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Пост пользователя]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 27 Sep 2021 08:47:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>В первой части статьи мы разобрали несколько типичных задач динамического программирования с использованием одномерного массива для хранения подзадач.</p><p>В этой статье продолжим рассмотрение подобных задач.</p><p>Вернемся к кузнечику, который прыгал по кувшинкам в первой статье.</p><h2>Кузнечик, кувшинки и монетки</h2><p>В этой задаче на кувшинки добавляются монетки, причём их можно как собирать, так и терять. Теперь нам неважно, каким путем двигается кузнечик, главное — собрать максимальное количество монеток к последней кувшинке.</p><p>Немного изменим условия прыжков. Теперь кузнечик может прыгать на 1, 2 или 3 кувшинки вперёд. Также кузнечик не может терять больше монеток, чем у него есть в наличии.</p><p>Как мы уже знаем, две самые главные вещи в динамическом программировании — начальные значения и переход от одной подзадачи к другой. Давайте посмотрим, что у нас является подзадачей, т.е. какие значения будем хранить.</p><p>Для каждой кувшинки мы будем хранить максимальное количество монет, которое можно собрать, добравшись до неё.</p><p>Рассмотрим пятую кувшинку, на которой мы теряем 3 монетки. Откуда мы можем прыгнуть на неё? Со второй, третьей или четвёртой кувшинки. Откуда мы должны прыгнуть на неё, чтобы заработать максимальное количество монеток? С кувшинки, на которой наше заработанное количество монеток было максимальным. Это будет выглядеть примерно так:</p><p>Подумаем над начальным значением. Мы можем через несколько if’ов посчитать, сколько будет на каждой из кувшинок заработано монеток. Но если в данном случае это будет довольно просто, то, например, если кузнечик сможет прыгать на 10 кувшинок, то это приведёт к очень сложному и запутанному коду. Попробуем обойтись без начальных значений, а предыдущие значения, если они выходят за границы массива, игнорировать.</p><p>В примере с распределение монеток [4, -2, 1, -1, -3] максимальная сумма будет 2. Кузнечик прыгнет на первую, третью и пятую кувшинки. На пятую прыгать обязательно, т.к. это условие задачи — достигнуть последнюю кувшинку.</p><h3>Путь, чтобы собрать максимум монеток</h3><p>Дополним задачу — теперь нам нужно не просто найти, сколько максимально можно собрать монет, добравшись до последней кувшинки, а ещё и найти путь, как это было сделано.</p><p>Часто в задачах динамического программирования применяется следующая техника: берём наше вычисленное значение, идём от конца к началу массива с описанием максимума на каждой кувшинке (в данном случае maxCoins), восстанавливая обратную последовательность вычислений: будем находить максимальное значение в предыдущих ячейках массива maxCoins.</p><p>Также мы можем найти путь другим способом — ввести дополнительную структуру данных и хранить в ней путь, по которому мы добрались до текущей ячейки. Код выглядит немного проще, но при работе с большим объемом данных хранение путей может занимать значительное место в памяти. Посмотрим на решение:</p><p><a href="https://leetcode.com/problems/min-cost-climbing-stairs/">Задача для практики на LeetCode</a></p><h2>Наибольшая (по длине) возрастающая подпоследовательность</h2><p>Подпоследовательность — это любая последовательность внутри массива, расположенная по возрастанию индексов. Например? в массиве [1, 2, 3, 4, 5] набор чисел [1, 3, 5] является подпоследовательностью. [1, 4, 2] не является, т.к. 2 расположена перед 4.</p><p>Задача — написать функцию, которая бы возвращала максимальную подпоследовательность.</p><p>Рассмотрим массив [1, 5, 3, 6, 4, 5, 2]. Несколько его возрастающих подпоследовательностей: [1, 5, 6], [1, 5], [1, 3], [1, 3, 5], [1, 3, 4, 5]. Наибольшая из всех таких подпоследовательностей размера 4:</p><figure><img src="https://media.tproger.ru/uploads/2021/09/Screenshot-2021-09-21-at-13.32.00.png" alt="" /></figure><p>Для начала посмотрим, как можно решить задачу про максимальную длину такой подпоследовательности. Введём массив, который будет хранить максимальную длину для текущего элемента. Например, для последовательности выше [1, 5, 3, 6, 4, 5, 2] такой массив в конце вычислений будет содержать значения [1, 2, 2, 3, 3, 4, 2]. Назовем его, например, longestSubsequence. Для первого элемента начальное значение очевидно — последовательность, состоящая только из этого элемента. Добавим начальное значение:</p><p>Для каждого последующего элемента будем искать в исходном массиве значение меньше текущего, проверять, последовательность какой длины можно составить с добавлением текущего элемента, и выбирать максимальную.</p><p>Например, мы добрались до элемента 4, longestSubsequence будет содержать в себе [1, 2, 2, 3]. Ищем в исходном массиве элементы, меньше чем 4, это 1 и 3. Длина подпоследовательностей для этих элементов: 1 и 2. Если добавить после 1 число 4, то получим длину последовательности 2: longestSubsequence[0] + 1, если после 3, то длина будет 3: longestSubsequence[2] + 1. Добавляем единицу к longestSubsequence элементу, т.к. добавление нового элемента увеличивает подпоследовательность.</p><p>Выяснили начальные значение и как переходить от одной подзадачи к другой, остался вопрос, где брать ответ. Максимальная возрастающая подпоследовательность может закончиться в любом месте исходного массива. Значит, нужно просто найти максимальное значение в массиве longestSubsequence. Посмотрим на решение подзадачи про нахождение длины:</p><p>Доработаем задачу, чтобы можно было находить не только длину, но и саму подпоследовательность. Для этого есть два пути. Можем хранить в массиве максимальную подпоследовательность в текущей позиции целиком или просто индекс предыдущего элемента для позиции.</p><p>Хранение подпоследовательностей может привести к значительному расходу памяти для больших значений. Рассмотрим решение с хранением индекса предыдущего элемента:</p><p><a href="https://leetcode.com/problems/longest-increasing-subsequence/">Задача для практики на LeetCode</a></p><h2>Игра — делители</h2><p>Рассмотрим <a href="https://leetcode.com/problems/divisor-game/">ещё одну задачу с сайта Leetcode</a>. Если не быть знакомыми с методами динамического программирования и не понять, что их здесь стоит применять, то решение этой задачи может быть очень сложным.</p><p>Есть два игрока, в задаче — Алиса (или Элис) и Боб. Дано число, например, 5. Игроки по очереди уменьшают число следующим действием: находят целочисленный делитель текущего числа (не само число), вычитают его из текущего числа. Так получается следующее число. Первой ходит Алиса.</p><p>Цель игры — определить, сможет ли выиграть Алиса при идеальной игре обоих участников. Вернуть true, если сможет.</p><p>Рассмотрим случай с числом 5. Ход Алисы. Число 5 имеет 2 делителя: 1 и 5. Но выбрать 5 по условию задачи мы не можем, выбираем единицу. Вычитаем её, получаем число 4 для следующего хода.</p><p>Ход Боба. 4 имеет три делителя, мы можем использовать только 1 или 2. Допустим, что используем 1, для Алисы оставляем число 3.</p><p>Дальнейшая игра очевидна и не предоставляет выбор для игроков.</p><p>Возникает проблема: какое число оптимально использовать, когда есть несколько вариантов делителей? Например, в рассматриваемом случае Боб на втором шаге мог выбрать делитель 1 или 2. Мы могли построить дерево до конца игры, и если у Алисы нет выбора, и в одном из вариантов выиграет Боб, то тот ход был оптимальным. Но что если у Алисы есть выбор, как определить оптимальность?</p><p>Рассмотрим игру для числа 6:</p><p>У Алисы на первом ходу есть на выбор три числа для вычитания: 1, 2, 3 — целочисленные делители числа 6. У Боба тоже появляется ветвление, если Алиса выбрала число 2 и оставила для Боба число 4. Когда мы дойдём до конца этого дерева, то как определить, были ли все ходы оптимальны? Таким подходом, сверху вниз, эту задачу не решить.</p><p>Рассмотрим другой подход, снизу вверх. Будем идти от единицы и выше, постараемся определить, кто выиграл на каждом шаге. Для хранения результатов создадим массив, хранящий возможность выигрыша для того, чей ход текущий.</p><p>Например, если у Алисы число 2, то берем первый элемент из этого массива. Он true, значит, Алиса может выиграть. Для числа 5 — false, значит, если оба игрока играют оптимальным способом, то Алиса проиграет. Как же создать такой массив?</p><p>Для числа 1 ответ очевиден: Алиса не сможет вычесть из этого числа само себя и сразу проигрывает.</p><p>Число 2. Может ли Алиса сделать так, что Боб попадет в ячейку со значением false, т.е. гарантированно проиграет? Да, Алиса может вычесть единицу, для Боба останется число 1, которое проигрывает для того, чей ход. Мы знаем, что число 1 проигрывает для того, кто ходит, т.к. именно эта информация хранится в массиве gameResultForStartPlayer.</p><p>Рассмотрим, например, число 9. Массив gameResultForStartPlayer уже должен быть заполнен для всех предыдущих чисел. Сможет ли Алиса сделать такой ход, чтобы Боб проиграл? Целочисленные делители числа 9 — 1 и 3. Бобу достанется либо 8, либо 6. У обоих этих чисел значение в массиве — true, следовательно, при оптимальной игре Боб выиграет. Соответственно, если Алисе достанется число 9, то она проиграет, и при заполнении массива следует в него добавить значение false.</p><p>Рассмотрим решение:</p><h2>Заключение</h2><p>В двух статьях мы рассмотрели основные задачи динамического программирования, которые можно решить, используя одномерный массив. Это наиболее простые примеры этого способа решения задач, разбираясь с которыми, можно понять основные концепции динамического программирования и двигаться дальше.</p>]]></content:encoded>
    </item>
    <item>
      <title>Идеи динамического программирования: одномерные задачи, часть 1</title>
      <link>https://tproger.ru/articles/idei-dinamicheskogo-programmirovanija-odnomernye-zadachi-chast-1</link>
      <comments>https://tproger.ru/articles/idei-dinamicheskogo-programmirovanija-odnomernye-zadachi-chast-1?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Maksim Petrikov]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/idei-dinamicheskogo-programmirovanija-odnomernye-zadachi-chast-1</guid>
      <description><![CDATA[<p>Разбираем несколько классических задач динамического программирования с использованием одномерного массива и без него.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/idei-dinamicheskogo-programmirovanija-odnomernye-zadachi-chast-1">Идеи динамического программирования: одномерные задачи, часть 1</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Рекурсия и динамика]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Пост пользователя]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 22 Sep 2021 06:22:42 GMT</pubDate>
      <content:encoded><![CDATA[<p>Динамическое программирование — способ решения задач путём разбиения их на подзадачи, которые, в свою очередь, используются для нахождения ответа исходной задачи. В этой статье мы разберём несколько классических задач динамического программирования, которые требуют для своего решения одномерный массив, либо, в некоторых случаях, можно даже обойтись без него.</p><p>Если вы не знакомы с динамическим программированием, посмотрите эту <a href="https://tproger.ru/articles/dynprog-starters/">статью для начинающих</a>.</p><h2>Числа трибоначчи</h2><p>Числа трибоначчи — это числовой ряд, начинающийся с трёх чисел 0, 0, 1, где каждое последующее число вычисляется как сумма трёх чисел перед ним:</p><figure><img src="https://media.tproger.ru/uploads/2021/08/Screenshot-2021-08-28-at-03.11.30.png" alt="" /></figure><p>Рассмотрим следующую задачу: дан массив чисел с порядковыми номерами чисел трибоначчи, например: [73, 10, 4, 15, 20, 7], числа в массиве не превышают 100, требуется вернуть массив, содержащий числа трибоначчи под указанными номерами: [73-е число трибоначчи, 10-е число трибоначчи, и так далее].</p><p>Если вы какое-то время работаете с языками программирования, то наверняка решали задачи нахождения факториала или степени числа через рекурсию. Попробуем применить такую же идею здесь:</p><p>Запускаем функцию с вычислением времени:</p><p>41-е число вычисляется 135 секунд. Кажется, что быстрее вручную посчитать числа, подставить в массив все 100 значений (ограничение задачи) и просто вернуть число на нужной позиции. В чём же проблема, как так получилось, что простой алгоритм работает так долго? Можно заметить, что следующее число вычисляется в 2 раза дольше, чем предыдущее. Давайте посмотрим на рекурсивное дерево вызовов:</p><figure><img src="https://media.tproger.ru/uploads/2021/09/Screenshot-2021-09-01-at-01.02.24.png" alt="" /></figure><p>Можно заметить, что при вычислении через рекурсию многие числа будут считаться по несколько раз, например, число 37 будет посчитано 6 раз. В замерах времени выше мы видели, что вычисление этого занимает 11 секунд, т.е. займёт половину времени от вычислений числа 41 — 66 секунд из 135.</p><p>Напрашивается решение проблемы — запоминать вычисленные значения и при необходимости просто их использовать. Давайте посмотрим, что получается в таком случае:</p><p>Пробуем выполнить новую функция с теми же входными данными:</p><p>Во-первых, мы видим, что выполнение теперь занимает доли миллисекунд. Во-вторых, замечаем понижение времени при каждом новом вызове. Это связано с оптимизациями компилятора JavaScript после определенного количества вызова кода. После пары вызовов время уменьшается на 0.1 миллисекунды (для моего компьютера), следовательно, 100 вычислений, которые нам требуются для исходной задачи, пройдут за 0.01 секунду.</p><p>Мы уже применили идеи динамического программирования — сохранили результат вычисления подзадачи для получения результата следующей задачи. Осталось вызвать это в цикле для исходного массива и получить ответ. Но что делать, если в вычисления закрадётся ошибка? Код с рекурсией отлаживать довольно сложно.</p><p>Давайте немного упростим решение за счёт идеи предварительного вычисления всех возможных вариантов. Это займёт очень мало времени, т.к. по условию задачи максимальное число — 100, и за счет идеи отказа от рекурсии. Будем считать так, как бы мы считали эти числа на листике, руками:</p><p>Поскольку идем, увеличивая число i, и у нас изначально добавлено в массив tribonacciNumbersCache три значения, то получение элементов i - 1, i - 2 и i - 3 отработает без ошибок.</p><p>В 0 позиций массива tribonacciNumbersCache — первое число трибонначи, главное не забыть вычитать единицу при получении значения.</p><p>Напишем решение исходной задачи — по массиву номеров получить массив с числами трибонначи:</p><p>В консоль будет выведено [2073693258389777400, 44, 1, 927, 19513, 7]. Задача решена.</p><p>Задачи на LeetCode и CodeWars для тренировки вычислений чисел <a href="https://www.codewars.com/collections/fibonacci-1">фибонначи</a>, <a href="https://leetcode.com/problems/n-th-tribonacci-number/">трибонначи</a>.</p><h2>Основные идеи</h2><p>Мы использовали несколько подходов, типичных для динамического программирования:</p><ol><li>Определили, как из известных данных маленьких подзадач будет вычисляться следующая подзадача, т.е. с числами трибонначи из трёх значений будет вычисляться следующее значение. Это соотношение называется рекурсивным.</li><li>Нашли исходные данные, чтобы можно было запустить наше вычисление.</li><li>Определили, откуда брать ответ — вычитали единицу при обращении к элементу массива с посчитанными значениями.</li></ol><h2>Кузнечик и кувшинки</h2><p>Рассмотрим следующую задачу: есть определённое количество кувшинок, расположенных в ряд, кузнечик стоит на первой из них. Он может прыгнуть на следующую кувшинку, либо перепрыгнуть через одну. Сколько существует разных способов (путей) добраться до последней кувшинки?</p><p>Рассмотрим вариант с 4-мя кувшинками. Можем перебрать варианты и посчитать, что до последней кувшинки можно добраться 3-мя разными способами:</p><figure><img src="https://media.tproger.ru/uploads/2021/09/Screenshot-2021-09-11-at-01.16.52.png" alt="" /></figure><p>Грустный кузнечик прыгает по кувшинкам</p><p>Рассмотрим сколько способов существует, чтобы добраться до каждой из кувшинок. До второй — 1 способ, до третьей — 2 способа: прыгнуть сразу на неё или прыгнуть с первой кувшинки. До четвёртой уже выяснили перебором, что существует 3 способа.<br />Можем заметить, что на четвёртую кувшинку мы можем прыгнуть только со второй или с третьей и что количество путей до неё равно количеству путей до второй кувшинки + количество путей до третьей кувшинки. Немного порассуждаем, почему так получается.</p><p>С третьей кувшинки на четвёртую есть только один путь — прыгнуть на неё, но при этом до третьей кувшинки было 2 разных пути. Соответственно, если мы двигаемся через третью кувшинку на четвёртую, то так и остается 2 разных пути это сделать. Аналогичные рассуждения можно провести для перемещения со второй на четвёртую кувшинку. Эти два случая будут разными путями, т.к. перед попаданием на четвёртой мы были на разных кувшинках, следовательно, количество путей надо просто сложить.</p><p>Аналогичные рассуждения можно провести для дальнейших перемещений, т.е. просто складываем количество путей до предыдущих двух кувшинок.</p><p>Понятно, как переходить от одной подзадачи к другой, осталось найти начальные условия. Возьмём за начальные условия количество вариантов попасть на вторую и третью кувшинки, т.е. 1 и 2.</p><p>Для нахождения начальных условий можно использовать более математический подход: ввести отрицательные кувшинки, количество путей до них будет 0, и использовать текущую позицию как последнее значение начальных условий. При таком подходе начальные условия будут 0 и 1. В текущей задаче будем использовать первый подход, но для более сложных задач имеет смысл использовать второй.</p><p>Получается следующая функция:</p><p>Задача решена, но можем заметить, что все значения, кроме двух последних, не используются, и упростить решение:</p><p>В цикле происходит смещение количества путей до i + 1 кувшинки. В начале way1 указывает на количество путей до первой кувшинки, way2 — до второй. После первого выполнения тела цикла way1 указывает на количество путей до второй кувшинки, way2 до третьей, и так далее. В конце выполнения цикла в way2 получится количество путей до n кувшинки.</p><p><a href="https://leetcode.com/problems/climbing-stairs/">Задача для практики на LeetCode</a></p><h2>Максимальный(по сумме элементов) подмассив</h2><p>Условие задачи: дан массив чисел, требуется найти непрерывную последовательность чисел с максимальной суммой.</p><p>Например, получен такой массив:</p><figure><img src="https://media.tproger.ru/uploads/2021/09/Screenshot-2021-09-17-at-02.54.23.png" alt="" /><figcaption>Массив для нахождения максимального подмассива</figcaption></figure><p>Рассмотрим идею решения. Начнём суммировать значения в этом массиве слева направо. Просуммировав два первых элемента: 2 — 5 = −3, получим отрицательное число. Если добавить это число к следующему, то оно уменьшит его, независимо от того положительное оно или отрицательное. Просуммировав следующие 3 элемента 2 + 2 — 1 = 3, получим положительное значение, которое при добавлении к следующему увеличит сумму с ним в любом случае.</p><p>Т.е. мы идём слева направо, суммируя элементы, если сумма становится отрицательной, то игнорируем подсумму, если положительной, то прибавляем дальше:</p><figure><img src="https://media.tproger.ru/uploads/2021/09/Screenshot-2021-09-17-at-02.52.12.png" alt="" /><figcaption>Суммы, используемые для нахождения максимального подмассива</figcaption></figure><p>В процессе этих вычислений при каждом прибавлении сравниваем число с переменной, в которой хранится максимальное подсумма.<br />Рассмотрим решение в коде:</p><p>Рассмотрим массив arrayOfSums, на каждом шаге итерации:</p><p>Видим, что максимальное значение 7. Это и будет ответ в текущей задаче.</p><p>В решении мы находим только максимальную сумму подмассива, но не находим саму часть массива. По рассмотренному массиву arrayOfSums и логике решения задачи довольно очевидно, как найти требуемый подмассив: находим 7 в массиве arrayOfSums, это будет конец подмассива. Берём слева все положительные числа, самое левое из списка положительных чисел — начало подмассива.</p><p>В текущем случае это сумма от второго до седьмого элемента (при отсчёте массива от 0). Подмассив arrayOfSums [2, 4, 3, 6, 5, 7], подмассив исходного массива nums [2, 2, -1, 3, -1, 2].</p><p>Реализуем эту идею в коде:</p><p><a href="https://leetcode.com/problems/maximum-subarray/">Задача для практики на LeetCode</a></p><h2>Заключение</h2><p>Мы рассмотрели несколько простых задач динамического программирования, желаю успехов в освоении этого непростого, но очень интересного подхода к решению задач.</p>]]></content:encoded>
    </item>
    <item>
      <title>«Кому-то больше понравится сцена со взрывом, кому-то — с поцелуем»: что такое хайлайты в онлайн-кинотеатрах и какие алгоритмы их создают</title>
      <link>https://tproger.ru/articles/komu-to-bolshe-ponravitsja-scena-so-vzryvom-komu-to-s-poceluem-chto-takoe-hajlajty-v-onlajn-kinoteatrah-i-kakie-algoritmy-ih-sozdajut</link>
      <comments>https://tproger.ru/articles/komu-to-bolshe-ponravitsja-scena-so-vzryvom-komu-to-s-poceluem-chto-takoe-hajlajty-v-onlajn-kinoteatrah-i-kakie-algoritmy-ih-sozdajut?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Yulya Petrikova]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/komu-to-bolshe-ponravitsja-scena-so-vzryvom-komu-to-s-poceluem-chto-takoe-hajlajty-v-onlajn-kinoteatrah-i-kakie-algoritmy-ih-sozdajut</guid>
      <description><![CDATA[<p>Директор по технологии IVI рассказывает, что такое хайлайты в онлайн-кинотеатрах, зачем их показывают и как создают.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/komu-to-bolshe-ponravitsja-scena-so-vzryvom-komu-to-s-poceluem-chto-takoe-hajlajty-v-onlajn-kinoteatrah-i-kakie-algoritmy-ih-sozdajut">«Кому-то больше понравится сцена со взрывом, кому-то — с поцелуем»: что такое хайлайты в онлайн-кинотеатрах и какие алгоритмы их создают</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Гостевая публикация]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 08 Sep 2021 15:25:13 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Что такое хайлайты?</h2><p>Хайлайты — это самые интересные, продающие моменты из видеопотока, которые могут заставить зрителя посмотреть видео целиком. Они как витрина магазина: туда попадает всё самое яркое и красочное. Увидев их, пользователь может заранее понять, что находится внутри видео. И решить, хочет ли он это видео посмотреть. Например, в футбольном матче хайлайт — это момент перед голом. Или сам гол, но его обычно стараются не показывать, чтобы сохранять интригу.</p><p>Хайлайты из фильма выбирает специальный алгоритм или человек. Из большого видеофайла он вырезает набор маленьких видеофайлов, которые лучше всего презентуют содержание.</p><h2>Зачем хайлайты видеосервисам и онлайн-кинотеатрам?</h2><p>Часто покупать и показывать трейлеры слишком дорого, трудозатратно и долго. Также нередко правообладатель предоставляет онлайн-кинотеатру трейлер, но он не подходит под формат видеоплатформы. Например, требуется видео длительностью 15 секунд, а в оригинальном трейлере — 90. Тогда приходится за свой счёт менять формат и содержание видео.</p><p>Хайлайты спасают ситуацию и рассказывают зрителю о контенте до того, как он захотел посмотреть трейлер. И они более универсальны, чем трейлеры: их можно делать короче или длиннее, встраивать в разные места пользовательского интерфейса. Пользователь видит нарезку хайлайтов, как только попадает на страницу фильма или сериала, его внимание сразу привлекают самые запоминающиеся кадры.</p><h2>Как создают хайлайты?</h2><p>Происходящее в кадре — будь то взрыв, выстрел или поцелуй — по-разному влияет на конверсию. Это влияние можно измерить — существует статистика, которая позволяет заранее предположить, какие фрагменты фильма лучше всего подойдут на роль хайлайтов.</p><p>А дальше включаются специальные алгоритмы нарезки — часть большой системы подготовки контента к стримингу. В ней есть возможность создать хайлайт из любого видеофайла и в любой момент после того, как он попадет в систему. Оператор создает задание на генерацию хайлайта, и система обрабатывает его согласно установленным приоритетам.</p><p>У IVI алгоритмы собственные — писали их на Python методом проб и ошибок, потому что во всей литературе, хотя бы отдалённо описывающей подобную задачу, не нашлось ничего, что подходило бы практике онлайн-кинотеатра (но про алгоритмы мы поговорим в следующий раз).</p><p>Первый — алгоритм детекции сцен. Он должен определить начало и конец нужного куска фильма. В ходе обучения алгоритму сначала показали различные ракурсы съемки, научили его находить их, а потом из отобранных ракурсов научили выделять конкретные сцены. Также для определения подходящих отрезков фильма используется информация из видео и аудио потока. Это нужно, чтобы при создании хайлайтов не прерывались диалоги.</p><p>Второй — алгоритм выбора сцен для создания хайлайта. Мы обучили свою сетку на основании всего нашего каталога. Всего в нём более 80 тысяч фильмов, а для обучения подошли 30 тысяч. Мы взяли все фильмы, у которых были трейлеры, искали совпадения фрагментов из трейлеров и фрагментов из фильмов. Теперь, имея обученную сеть, мы можем ранжировать любую сцену нового видеофайла, рассчитывая вероятность того, насколько эта сцена подойдёт для создания хайлайта.</p><p>Когда набор сцен готов, алгоритм выбирает финальных кандидатов, из которых и получится хайлайт. На этом же этапе можно заняться обработкой изображения, цветокоррекцией и фильтрами. Результаты отсматривает человек на пост-модерации. Он всегда может забраковать готовый хайлайт, если увидит, что он получился плохо. Если хайлайт проходит проверку, он помещается на специальные сервера, откуда с помощью CDN доставляется пользователям.</p><h2>Другие механизмы работы и перспективы</h2><p>При этом алгоритмы нейросетей — это лишь один из способов отбора. Хотя сейчас заметен тренд на повсеместное применение технологий искусственного интеллекта и машинного обучения, гнаться за модой не всегда оправданно. Часто куда более простой и экономичный (в плане вычислительных ресурсов) алгоритм может справиться с задачей так же эффективно.</p><p>К тому же алгоритмы могут ошибаться, так что их необходимо проверять. Например, в подборку иногда попадает спойлер: часто алгоритм выбирает действительно интересный момент, который при этом раскрывает всю суть фильма. Поэтому до сих пор у нас есть модерация тех хайлайтов, которые нарезал алгоритм, поскольку есть вероятность рассеять интригу и испортить зрителю впечатление.</p><p>А иногда можно и вовсе обойтись без нейросетевых алгоритмов. Выбрать 10 фрагментов, показать их разным группам людей и определить, какие отрезки дают наибольшую конверсию. Или попробовать на группах разные комбинации хайлайтов и таким образом понять, какие из них эффективнее. Конечно, при таком подходе некоторым пользователям может попасться некачественный хайлайт, но применять его или нет, каждый сервис определяет сам.</p><p>Следующий шаг — это подбор определенных хайлайтов под конкретного человека или сегмент аудитории. Кому-то больше понравится сцена со взрывом, кому-то — с поцелуем. Персонализация всего и вся — очень важная тенденция последнего времени, и персонализация хайлайтов — её закономерное проявление.</p>]]></content:encoded>
    </item>
    <item>
      <title>Teleperformance заставляет удалённых сотрудников устанавливать дома камеры для контроля эффективности</title>
      <link>https://tproger.ru/news/teleperformance-zastavljaet-udaljonnyh-sotrudnikov-ustanavlivat-kamery-u-sebja-doma-dlja-kontrolja-ih-jeffektivnosti</link>
      <comments>https://tproger.ru/news/teleperformance-zastavljaet-udaljonnyh-sotrudnikov-ustanavlivat-kamery-u-sebja-doma-dlja-kontrolja-ih-jeffektivnosti?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Борисов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/teleperformance-zastavljaet-udaljonnyh-sotrudnikov-ustanavlivat-kamery-u-sebja-doma-dlja-kontrolja-ih-jeffektivnosti</guid>
      <description><![CDATA[<p>Компания Teleperformance внедряет систему видеоконтроля за сотрудниками для мониторинга их эффективности. Камеры будут записывать видео и звук.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/teleperformance-zastavljaet-udaljonnyh-sotrudnikov-ustanavlivat-kamery-u-sebja-doma-dlja-kontrolja-ih-jeffektivnosti">Teleperformance заставляет удалённых сотрудников устанавливать дома камеры для контроля эффективности</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Amazon]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 09 Aug 2021 16:32:23 GMT</pubDate>
      <content:encoded><![CDATA[<p>Teleperformance — одна из крупнейших компаний, которая занимается колл-центрами на аутсорсе. Её услугами пользуются Uber, Amazon, Apple.</p><p>В Teleperformance больше 380 000 сотрудников. Видеонаблюдение введут для 39 000 из них — столько работает в Колумбии.</p><p>Teleperformance <a href="https://www.nbcnews.com/tech/tech-news/big-tech-call-center-workers-face-pressure-accept-home-surveillance-n1276227">переводит</a> своих удалённых сотрудников в Колумбии на особые условиы. Им предлагают установить систему видеоконтроля, которая следит за эффективностью работника.</p><h2>Видеонаблюдение за удалёнными сотрудниками</h2><p>Сотрудникам, которые работают на дому, предлагают подписать контракт, который предполагает установку умных камер дома. Они будут следить за тем, чтобы сотрудники не отлынивали на работе.</p><p>Видео с камер будут анализировать алгоритмы распознавания объектов. Они будут следить, чтобы сотрудники не использовали смартфоны и даже не держали на столе бумагу — так компания борется с утечкой личной информации из колл-центров.</p><p>Контроль с помощью камер позволит менеджерам мониторить фактическое рабочее временем сотрудника и следить, чтобы рабочее место всегда было чистым.</p><h2>Apple против такого подхода</h2><p>Apple — один из клиентов Teleperformance  — запретила компании использовать мониторинг за сотрудниками. Teleperformance отменила это решение для команд, которые работают с Apple.</p><p>Источник: <a href="https://www.nbcnews.com/tech/tech-news/big-tech-call-center-workers-face-pressure-accept-home-surveillance-n1276227">NBC</a></p><p>Почитайте, чем закончился мониторинг эффективности в прошлый раз:</p>]]></content:encoded>
    </item>
    <item>
      <title>Google выпустила Translatotron 2 — улучшенный ИИ для синхронного перевода устной речи. Теперь его нельзя использовать для дипфейка</title>
      <link>https://tproger.ru/news/google-vypustila-translatotron-2-uluchshennyj-ii-dlja-sinhronnogo-perevoda-ustnoj-rechi-teper-ego-nelzja-ispolzovat-dlja-dipfejka</link>
      <comments>https://tproger.ru/news/google-vypustila-translatotron-2-uluchshennyj-ii-dlja-sinhronnogo-perevoda-ustnoj-rechi-teper-ego-nelzja-ispolzovat-dlja-dipfejka?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Борисов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/google-vypustila-translatotron-2-uluchshennyj-ii-dlja-sinhronnogo-perevoda-ustnoj-rechi-teper-ego-nelzja-ispolzovat-dlja-dipfejka</guid>
      <description><![CDATA[<p>Исследователи исправили главный недостаток алгоритма для перевода речи Translatotron. Теперь технологию нельзя использовать для создания дипфейков.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/google-vypustila-translatotron-2-uluchshennyj-ii-dlja-sinhronnogo-perevoda-ustnoj-rechi-teper-ego-nelzja-ispolzovat-dlja-dipfejka">Google выпустила Translatotron 2 — улучшенный ИИ для синхронного перевода устной речи. Теперь его нельзя использовать для дипфейка</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 09 Aug 2021 08:05:44 GMT</pubDate>
      <content:encoded><![CDATA[<p><a href="https://ai.googleblog.com/2019/05/introducing-translatotron-end-to-end.html">Translatotron</a> — это ИИ-алгоритм от Google AI, который синхронно переводит устную речь с одного языка на другой. Для этого ему не нужно использовать текстовую расшифровку, как это делают классические алгоритмы.</p><p>Первую версию ИИ Translatotron <a href="https://tproger.ru/news/translatotron-google-ai/">представили</a> в мае 2019 года.</p><h2>Раньше можно было создать дипфейк с помощью технологии</h2><p>В первой версии Translatotron был один существенный недостаток — технологией можно было злоупотреблять для создания дипфейков.</p><p>Дело в том, что Translatotron умеет генерировать голос для озвучки переведённых фраз. Этой функцией могли воспользоваться мошенники.</p><h2>Теперь так не получится</h2><p>В Translatotron 2 разработчики <a href="https://arxiv.org/pdf/2107.08661.pdf">решили проблему</a> злоупотребления возможностями алгоритма.</p><p>Теперь ИИ сохраняет оригинальный голос говорящего. Это затрудняет создание дипфейков с помощью Translatotron.</p><figure><img src="https://media.tproger.ru/uploads/2021/08/image-16.png" alt="" /><figcaption>Модель Translatotron 2, которая переводит испанскую речь в английскую</figcaption></figure><h2>Что ещё нового</h2><p>За 2 года Google улучшила качество перевода и «естественность» речи. Например, в озвучке стало гораздо меньше помех и зажёванных слов.</p><p>Ещё мощно прокачали производительность алгоритма.</p><p><a href="https://google-research.github.io/lingvo-lab/translatotron2/">Послушать примеры перевода → </a></p><p>Источник: <a href="https://www.marktechpost.com/2021/08/07/google-ai-introduces-translatotron-2-a-neural-direct-speech-to-speech-translation-model-without-the-deepfake-potential/">MarkTechPost</a></p><p>«Яндекс» уже <a href="https://tproger.ru/news/jandeks-perevodit-video-s-anglijskogo-i-odnovremenno-ozvuchivaet-ego-u-novoj-tehnologii-net-analogov-v-mire/">внедрила</a> технологию синхронного перевода в свой браузер для русского дубляжа видео на YouTube в режиме реального времени.</p>]]></content:encoded>
    </item>
    <item>
      <title>Twitter запустила соревнование по поиску предубеждений модели машинного обучения. За первое место платят 3,5$ тыс.</title>
      <link>https://tproger.ru/news/twitter-zapustila-bug-bounty-zadacha-najti-predvzjatost-v-modeljah-mashinnogo-obuchenija</link>
      <comments>https://tproger.ru/news/twitter-zapustila-bug-bounty-zadacha-najti-predvzjatost-v-modeljah-mashinnogo-obuchenija?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Борисов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/twitter-zapustila-bug-bounty-zadacha-najti-predvzjatost-v-modeljah-mashinnogo-obuchenija</guid>
      <description><![CDATA[<p>Twitter объявила программу по поиску «предупреждений алгоритмов». Это поможет снизить предвзятость моделей машинного обучения к разным социальным группам.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/twitter-zapustila-bug-bounty-zadacha-najti-predvzjatost-v-modeljah-mashinnogo-obuchenija">Twitter запустила соревнование по поиску предубеждений модели машинного обучения. За первое место платят 3,5$ тыс.</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Twitter]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 02 Aug 2021 06:47:34 GMT</pubDate>
      <content:encoded><![CDATA[<p>Соцсеть Twitter <a href="https://blog.twitter.com/engineering/en_us/topics/insights/2021/algorithmic-bias-bounty-challenge">запустила</a> программу по поиску «предубеждений алгоритма» <a href="https://hackerone.com/twitter-algorithmic-bias?type=team">Algorithmic Bias Bounty Challenge</a>. Так компания хочет снизить предвзятость своей модели машинного обучения к разным социальным группам.</p><p>По словам Twitter, это первое в мире соревнование по выявлению дискриминации людей со стороны машинного обучения.</p><p>Сейчас это особенно актуально: пользователи всё чаще подозревают алгоритмы в наличии расовых или других предубеждений.</p><h2>Что надо делать</h2><p>Задача участников — продемонстрировать, какой потенциальный вред может принести алгоритм «умного кадрирования». Конкурсанты получат доступ к коду модели.</p><p>Этот алгоритм распознаёт на картинке главный объект и кадрирует изображение так, чтобы этот объект остался не обрезанным.</p><p>Модель должна «непредвзято» находить главный объект. Каждое «предубеждение» — уязвимость.</p><h2>Сколько заплатят</h2><p>Команды-победители получат денежные призы через HackerOne:</p><ul><li>1-е место — 3500$ (256 тысяч рублей);</li><li>2-е место — 1000$ (73 тысячи рублей);</li><li>3-е место — 500$ (36 тысяч рублей);</li><li>за самую «инновационную» находку — 1000$ (73 тысячи рублей);</li><li>за проблему, актуальную для большинства алгоритмов Twitter — 1000$ (73 тысячи рублей).</li></ul><h2>Когда результаты</h2><p>Победителей объявят на семинаре <a href="https://aivillage.org/events">DEF CON AI Village</a> 8 августа. Победителям предложат представить свои работы на мероприятии.</p><h2>Где принять участие</h2><p>Программа запущена на HackerOne. Там же <a href="https://hackerone.com/twitter-algorithmic-bias?type=team">изложены все подробности</a>.</p><p>Источник: <a href="https://blog.twitter.com/engineering/en_us/topics/insights/2021/algorithmic-bias-bounty-challenge">Блог Twitter</a></p>]]></content:encoded>
    </item>
    <item>
      <title>В Бельгии искусственный интеллект стыдит политиков, которые используют телефон на заседаниях. И это пугает</title>
      <link>https://tproger.ru/news/v-belgii-iskusstvennyj-intellekt-stydit-politikov-kotorye-ispolzujut-telefon-na-zasedanijah-i-jeto-pugajushhaja-istorija</link>
      <comments>https://tproger.ru/news/v-belgii-iskusstvennyj-intellekt-stydit-politikov-kotorye-ispolzujut-telefon-na-zasedanijah-i-jeto-pugajushhaja-istorija?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Борисов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/v-belgii-iskusstvennyj-intellekt-stydit-politikov-kotorye-ispolzujut-telefon-na-zasedanijah-i-jeto-pugajushhaja-istorija</guid>
      <description><![CDATA[<p>Бельгийский художник Дрис Депортер изобрел искусственный интеллект, который автоматически помечает политиков, которые используют телефоны на работе.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/v-belgii-iskusstvennyj-intellekt-stydit-politikov-kotorye-ispolzujut-telefon-na-zasedanijah-i-jeto-pugajushhaja-istorija">В Бельгии искусственный интеллект стыдит политиков, которые используют телефон на заседаниях. И это пугает</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[YouTube]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 06 Jul 2021 11:37:18 GMT</pubDate>
      <content:encoded><![CDATA[<p>Бельгийский художник Дрис Депортер (Dries Depoorter) изобрел искусственный интеллект, который автоматически помечает политиков, которые используют телефоны на работе.</p><h2>Как работает?</h2><p>Софт Дриса отслеживает стримы и записи заседаний фламандского правительства (Бельгия) на YouTube. С помощью машинного обучения программа ищет телефоны в руках политиков, а алгоритмы распознавания лиц идентифицируют человека.</p><h2>Как позорит?</h2><p>Софт записывает кадры, на которых политик залипает в телефон на работе, и публикует в Twitter и Instagram проекта под названием «Флемандские скроллеры» (The Flemish Scrollers). Публичный позор обеспечен.</p><h2>Почему пугает?</h2><p>Большинство из нас наверняка периодически пользовались телефоном во время встречи или просто на работе. Иногда это действительно бессмысленный скроллинг социальных сетей, но порой — срочные и важные дела. Вряд ли бы вы обрадовались, если за экстренный случай вас публично порицали или оштрафовали. Постоянный мониторинг сотрудников — не круто.</p><p>The Flemish Scrollers и должен пугать — в этом его цель.</p><h2>Зачем нужен этот проект?</h2><p>Обратите внимание, что автор проекта — художник, по крайней мере Дрис сам себя так называет. Скорее всего, это акция, которая привлекает внимание к тому, как ужасно постоянное наблюдение.</p><p>Не зря The Flemish Scrollers атакует политиков. Когда законодатели становятся мишенью, у них появляется больше мотивации урегулировать «оружие».</p><p>Источник: TheNextWeb</p>]]></content:encoded>
    </item>
    <item>
      <title>Опубликован список из 10 максимально полезных GitHub-репозиториев</title>
      <link>https://tproger.ru/news/opublikovan-spisok-iz-10-maksimalno-poleznyh-github-repozitoriev</link>
      <comments>https://tproger.ru/news/opublikovan-spisok-iz-10-maksimalno-poleznyh-github-repozitoriev?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/opublikovan-spisok-iz-10-maksimalno-poleznyh-github-repozitoriev</guid>
      <description><![CDATA[<p>Яш Тивари на Hackernoon собрал десять GitHub-страниц: публичные API, советы по командной строке и коллекция шаблонов файлов .gitignore.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/opublikovan-spisok-iz-10-maksimalno-poleznyh-github-repozitoriev">Опубликован список из 10 максимально полезных GitHub-репозиториев</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[Google Analytics]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 07 Jun 2021 08:10:14 GMT</pubDate>
      <content:encoded><![CDATA[<p>GitHub — крупнейшая площадка для хранения IT-проектов, доступная широкому кругу пользователей. Но из-за размеров площадки, зачастую бывает сложно найти на ней по-настоящему интересные проекты.</p><p>Решить эту проблему вызвался Яш Тивари на платформе Hackernoon. Он составил топ-10 GitHub-страниц, на которые стоит подписаться.</p><figure><img src="https://media.tproger.ru/uploads/2021/06/1-6.jpg" alt="" /><figcaption>Источник: Unsplash</figcaption></figure><h2>Публичные API</h2><p>В <a href="https://github.com/public-apis/public-apis?ref=hackernoon.com">этом репозитории</a> собрано множество бесплатных API-интерфейсов, связанных с различными темами. В том числе с бизнесом, новостями, играми и т.д.</p><p>Есть и более полезные варианты. Например, Gmail API или Google Analytics API.</p><figure><img src="https://media.tproger.ru/uploads/2021/06/1-1.png" alt="" /></figure><h2>«Искусство командной строки»</h2><p><a href="https://github.com/jlevy/the-art-of-command-line?ref=hackernoon.com">Здесь</a> любой желающий может найти полезные советы по повышению производительности при помощи командной строки. Основное внимание уделено её Linux-версии, но есть и разделы с советами для Windows и macOS-пользователей.</p><figure><img src="https://media.tproger.ru/uploads/2021/06/2.png" alt="" /></figure><h2>Коллекция шаблонов .gitignore-файлов</h2><p>Как можно понять из названия пункта, в <a href="https://github.com/github/gitignore?ref=hackernoon.com">этом репозитории</a> собраны различные файлы .gitignore. Есть варианты для совершенно разных языков (от Python до Java) и фреймворков.</p><figure><img src="https://media.tproger.ru/uploads/2021/06/Screenshot-2021-06-07-at-11.07.06.png" alt="" /></figure><h2>System Design Primer</h2><p>С помощью <a href="https://github.com/donnemartin/system-design-primer?ref=hackernoon.com">этой страницы</a>, разработчики могут научиться проектировать крупномасштабные системы.</p><p>Отдельным плюсом репозитория является его помощь в прохождении особо сложных интервью на заданную тему. Для этого в нём имеются примеры вопросов и ответов, встречающихся во время собеседований.</p><figure><img src="https://media.tproger.ru/uploads/2021/06/3.png" alt="" /></figure><h2>А также</h2><ul><li><a href="https://github.com/ohmyzsh/ohmyzsh?ref=hackernoon.com">Oh My Zsh</a>;</li><li><a href="https://github.com/kamranahmedse/developer-roadmap?ref=hackernoon.com">Дорожная карта веб-разработчика</a>;</li><li><a href="https://github.com/EbookFoundation/free-programming-books?ref=hackernoon.com">Бесплатные книги по программированию</a>;</li><li><a href="https://github.com/danistefanovic/build-your-own-x?ref=hackernoon.com">«Создай свой Х»</a>;</li><li><a href="https://github.com/trekhleb/javascript-algorithms?ref=hackernoon.com">JavaScript-алгоритмы и структуры данных</a>;</li><li><a href="https://github.com/jwasham/coding-interview-university?ref=hackernoon.com">План обучения для прохождения интервью в крупные IT-компании</a>.</li></ul><p>Источник: <a href="https://hackernoon.com/10-github-repositories-to-follow-9t1g35y1?source=rss">Hackernoon</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Понимаем красно-чёрное дерево. Часть 1: введение</title>
      <link>https://tproger.ru/articles/ponimaem-krasno-chjornoe-derevo-chast-1-vvedenie</link>
      <comments>https://tproger.ru/articles/ponimaem-krasno-chjornoe-derevo-chast-1-vvedenie?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Nikita]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/ponimaem-krasno-chjornoe-derevo-chast-1-vvedenie</guid>
      <description><![CDATA[<p>Автор объясняет свойства красно-чёрного дерева не заучиванием, а через 2-3-дерево: зачем нужны цвета и что такое чёрная высота.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/ponimaem-krasno-chjornoe-derevo-chast-1-vvedenie">Понимаем красно-чёрное дерево. Часть 1: введение</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Пост пользователя]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 28 Apr 2021 14:05:05 GMT</pubDate>
      <content:encoded><![CDATA[<p>Долгое время я воевал с красно-чёрным деревом (далее — КЧД). Вся информация, которую я находил, была в духе «листья и корень дерева всегда чёрные, ПОТОМУ ЧТО», «топ-5 свойств красно-чёрного дерева» или «3 случая при балансировке и 12 случаев при удалении ноды». Такой расклад меня не устраивал.</p><p>Мне не хотелось заучивать свойства дерева, псевдокод и варианты балансировки. Я хотел знать почему. Каким образом цвета помогают при балансировке? Почему у красной ноды не может быть красного потомка? Почему глубину дерева измеряют «чёрной высотой»?</p><p>Ответы на эти вопросы я получил только тогда, когда мне дали ссылку на лекцию про 2-3-дерево, с которого мы и начнём.</p><p>Эта статья разделена на 3 логические части. Я рекомендую прочитать их в указанном порядке. Первая часть будет направлена на введение в КЧД и знакомство с ним. Во второй части мы поговорим о балансировке и вставке в КЧД. В третьей, завершающей части, мы разберём процесс удаления ноды. Наберитесь терпения и приятного чтения:)</p><p><b>Дисклеймер</b></p><ol><li>В этой статье не будет информации про плюсы и минусы дерева, его применение и т.д.. Информации об асимптотике дерева и работе с ним в интернете полно.</li><li>Материал предназначен для тех, кто уже знаком с КЧД и теперь хочет их понять, а также для тех, кто только знакомится с ними.</li><li>Статья не будет содержать деталей реализации структуры.</li><li>Можно считать, что эта статья — перевод англоязычного видео в упрощённый русский текстовый вариант.</li></ol><h2>2-3-дерево</h2><p>Чтобы понять красно-чёрное дерево, нужно понять 2-3-дерево.</p><p>Забегая вперед, скажу, что 2-3-дерево — это, по сути, <i>родитель</i> нашего КЧД, поэтому важно начать именно с него. Поймем 2-3-дерево — поймём и КЧД.</p><p>2-3-дерево — абстрактный тип данных, напоминающий по структуре дерево. В нодах 2-3-дерева может быть одно или два значения и два или три потомка (от чего зависит количество значений и потомков ноды, узнаем ниже). Ноду с одним значением и двумя потомками будем называть 2-нода, ноду с двумя значениями и тремя потомками — 3-нода. Объяснение я начну с создания такого дерева: это наглядно и просто. Но некоторые уточнения всё же нужны:</p><ol><li>Добавляя элемент, мы всегда спускаемся вниз по дереву.</li><li>Дерево отсортировано классически — меньшие значения находятся слева, бОльшие — справа.</li><li>2-3-дерево — отсортированное, сбалансированное дерево.</li></ol><p>Итак, начнём с первой ноды, это число 5. Тут всё просто — 5 становится корнем.</p><p>Добавим число 12. Его мы также добавляем в корень (помним, что нода может иметь два значения), но теперь нам нужно отсортировать нашу ноду (сортировать два элемента, ха), т.е. уложить их в порядке возрастания. В итоге получается нода 5-12.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/2-7.jpg" alt="" /></figure><p>Добавим следующее число. Пусть это будет 17. Давайте пока добавим наш элемент в единственную ноду и снова отсортируем ее. Получилась нода 5-12-17.</p><p>Внимательный читатель заметит тут подвох — выше я говорил о том, что наши ноды могут содержать не более двух элементов. Вот тут и происходит магия! Мы берём средний элемент нашей ноды и проталкиваем его наверх. Итог виден на картинке. Корнем стало число 12, левым сыном — число 5, правым — 17.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/3-3.jpg" alt="" /></figure><p>То, что мы сделали выше, можно назвать балансировкой 2-3-дерева. Правило в этой балансировке простое: если в ноде оказывается 3 значения, среднее мы проталкиваем наверх. Алгоритм действий зависит от трёх условий:</p><ol><li>Нода является корнем. Тогда ничего не остаётся, как создать новую ноду с одним значением и сделать её новым корнем (как в нашем случае).</li><li>Родительская нода имеет одно значение. Тогда мы просто добавляем значение к родителю и завершаем балансировку (при этом у родителя появляется третий потомок).</li><li>Родительская нода имеет два значения. Тогда мы снова проталкиваем значение вверх, пока не придём к пункту 1 или 2.</li></ol><h2>Другие случаи балансировки 2-3-дерева</h2><p>Окей, идём дальше. Давайте добавим число 3. Так как теперь мы не ограничиваемся одной нодой, спускаемся вниз. Понятно, что спуститься надо влево и добавить 3 к ноде со значением 5. Не забываем расставить 3 и 5 в нужном порядке. В итоге получилась нода 3-5.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/4-1.jpg" alt="" /></figure><p>Потерпите, мы близимся к самому интересному:)</p><p>Давайте добавим число 4, которое также пойдет налево и присоединится к ноде 3-5. Получится нода 3-4-5, которую, как мы уже знаем, нужно привести к нужному виду. Что делаем? Балансируем наше дерево, т.е. проталкиваем значение 4 наверх.</p><p>Теперь самое интересное. Помимо того, что мы добавим 4 к корню, мы также добавим корню третьего потомка — это будет нода, которая была больше 4. В нашем случае это 5. Картина будет выглядеть так:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/5-1.jpg" alt="" /></figure><p>Почему 5 не могла остаться на месте в своей ноде? Тут мы вспоминаем правило отсортированного дерева: значения меньше — слева, значения больше — справа. И так как 5 больше 4, мы не может оставить 5 слева, т.к. это нарушит наш инвариант. Поэтому ноде со значением 5 ничего не остаётся, кроме как переехать и стать потомком ноды 4-12 (кстати, если бы у 5 были потомки, они тоже переехали бы вместе с родителем).</p><p>Тут нужно сделать небольшую паузу и объяснить, как ориентироваться в нодах с тремя потомками. Всё просто:</p><ol><li>Значение, что меньше левого значения в ноде, будет левым потомком.</li><li>Значение, что больше левого, но меньше правого значения в ноде, будет средним потомком.</li><li>Значение, что больше правого значения в ноде, будет правым потомком.</li></ol><figure><img src="https://media.tproger.ru/uploads/2021/04/1-1-1.jpg" alt="" /></figure><p>А теперь посмотрите на то, что получилось. Смело можно заявить, что это отсортированное, сбалансированное 2-3-дерево. Значения меньше лежат слева, значения больше — справа (тут, как и в случае со значениями 4-5-12, мы считаем, что 5 лежит справа от 4 и слева от 12). Корень имеет 2 значения и 3 потомка, что абсолютно соответствует описанию дерева выше. Сейчас вы можете сами попробовать добавить любое значение, чтобы удостовериться, что вы поняли логику (что произойдёт с деревом, если добавить значение 7, а затем 9?).</p><p>Окей, с самим деревом, я надеюсь, разобрались. Ноды добавляются, дерево балансируется, искать можно, всё супер. Но есть нюансы.</p><p>Главный минус такой структуры в том, что она, в отличие от бинарного дерева, неудобна в реализации. Нужно следить за количеством потомков и значением, плюс за их порядком, балансировкой (и это я ещё не говорил про удаление). Красно-чёрное дерево решает эту проблему.</p><h2>Красно-чёрное дерево</h2><p>Как мы выяснили, главный недостаток 2-3-дерева — структура. Тогда давайте попробуем превратить его в бинарное дерево. Чтобы добиться этого, нам нужно простое представление для 3-ноды. Давайте разделим 3-ноду на две 2-ноды и свяжем их ссылками. Пометим эти ссылки каким-нибудь свойством, например, цветом, (возьмём красный), чтобы отличать такие ссылки в дереве от всех остальных.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/2-1-1.jpg" alt="" /></figure><p>Вообще говоря, мы не можем пометить сами ссылки, поэтому мы помечаем ноды.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/3-1-1.jpg" alt="" /></figure><p>Итак, перед вами красно-чёрное дерево. Далее мы разберём несколько свойств КЧД, которые я считаю важными (но я думаю, что уже из прочитанного выше многое стало ясно).</p><h2>Свойства красно-чёрного дерева</h2><p>Фактически мы разбираем не просто КЧД, а левостороннее КЧД — одну из имплементаций КЧД, в которой красные ноды могут находится только слева. То есть от 3-ноды мы всегда отделяем значение меньше (что и было сделано выше). По сути своей левостороннее КЧД ничем не отличается от обычного, за исключением того, что это более простая и понятная имплементация. Аналогично левостороннему КЧД существует и правостороннее КЧД (логику его додумайте сами).</p><p><b>1. Две красные ноды не могут идти подряд</b><i>.</i> Это свойство приобретает смысл, если мы знаем, что красная нода — это по сути часть 3-ноды в 2-3-дереве. Ну а если две красные ноды идут подряд, то получается 4-нода, которой у нас не существует:)</p><p><b>2. Корень дерева всегда чёрный</b><i>.</i> Опять же, тут всё понятно: красная нода не может существовать без потомка.</p><p><b>3. Все null-ноды (ноды, которые не имеют потомков) — чёрные</b><i>.</i> Почему именно так, для себя объяснений я не нашел. Но хочу сказать, что это довольно удобное правило, когда дело доходит до балансировки дерева.</p><p>Раз уж мы затронули null-ноды, то стоит сказать, что в дереве у всех нод всегда должно быть два потомка, а если ссылка на потомка нулевая, то ведёт она как раз в null-ноду. На самом деле, тут встаёт вопрос в реализации, мне было удобнее добавлять null-ноду (меньше проблем с итераторами, балансировкой и прочим).</p><p><b>4. Высота дерева измеряется только по чёрным нодам и называется «чёрной высотой»</b><i>.</i> Тут опять всё в целом становится очевидным: красная нода является только дополнением к ноде чёрной, является её частью, поэтому высоту принято считать по чёрным нодам.</p><p>На этом введение подходит к концу. В следующей части мы поговорим о том, как вставлять ноды в дерево и балансировать его.</p>]]></content:encoded>
    </item>
    <item>
      <title>Муравей Лэнгтона — загадочный клеточный автомат</title>
      <link>https://tproger.ru/articles/muravej-ljengtona-zagadochnyj-kletochnyj-avtomat</link>
      <comments>https://tproger.ru/articles/muravej-ljengtona-zagadochnyj-kletochnyj-avtomat?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Клименков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/muravej-ljengtona-zagadochnyj-kletochnyj-avtomat</guid>
      <description><![CDATA[<p>Муравей Лэнгтона — математическая абстракция и модель динамической системы, которая перемещается по клеткам бесконечной белой плоскости.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/muravej-ljengtona-zagadochnyj-kletochnyj-avtomat">Муравей Лэнгтона — загадочный клеточный автомат</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Пост пользователя]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 29 Mar 2021 11:07:08 GMT</pubDate>
      <content:encoded><![CDATA[<p>В мире существует около 14 000 видов муравьёв, каждый из которых имеет собственное название. Но, даже если вы зададитесь такой целью, вы не найдёте ни в одном биологическом справочнике муравья Лэнгтона. Дело в том, что этот муравей — математическая абстракция, модель для описания поведения динамической системы. Иногда складывается впечатление, что математики вообще неравнодушны к муравьям — вспомним хотя бы уже ставший классическим <a href="https://tproger.ru/articles/kak-muravi-reshajut-problemy-kommivojazhjorov/">муравьиный алгоритм</a>. Да и во всяких логических моделях и задачах муравьи встречаются довольно часто.</p><h2>От хаоса к строгому порядку</h2><p>Познакомимся с муравьём Лэнгтона поближе. Он живёт на бесконечной плоскости, состоящей из белых клеток. У него есть два неиссякаемых ведёрка — одно с белой краской, другое с чёрной. Муравей перемещается по клеткам плоскости от одной клетки к другой. При этом он выполняет несложный алгоритм:</p><ol><li>Если клетка белая, то муравей перекрашивает её в чёрный цвет, поворачивает на 90° направо (по часовой стрелке) и делает шаг вперёд.</li><li>Если клетка чёрная, то муравей перекрашивает её в белый цвет, поворачивает на 90° налево (против часовой стрелке) и делает шаг вперёд.</li></ol><p>Вот, собственно, и всё. Невесёлая жизнь у муравья Лэнгтона, но, как мы увидим, он не готов мириться с такой возмутительной ситуацией и всеми силами старается сбежать.</p><p>Написать программу, которая моделирует поведение муравья Лэнгтона, — это несложная задача. В сети есть много примеров реализации этого алгоритма: <a href="http://www.langtonant.com/">попроще</a> и <a href="https://josephpetitti.com/ant">посложнее</a> — с набором дополнительных настроек.</p><p>Попробуйте понаблюдать за перемещениями этого муравья по его клетчатой плоскости. На первый взгляд, его шаги полностью хаотичны — никакого порядка не наблюдается. Но, перефразируя известную поговорку, если долго наблюдать за муравьём, можно увидеть, как он убегает. Где-то после 10 000 шагов муравей вдруг осознаёт тщетность бытия и предпринимает попытку сбежать — он начинает строить периодическую конструкцию, каждые 104 шага перемещают его на две клетки по диагонали. После этого эти шаги повторяются. Эта конструкция уже никогда не станет хаотичной — теперь муравей так и будет двигаться по широкой диагональной полосе-магистрали, состоящей из чёрных и белых клеток.</p>]]></content:encoded>
    </item>
    <item>
      <title>Видео: девушка-разработчик написала программу на Python для создания необычных портретов</title>
      <link>https://tproger.ru/news/video-devushka-razrabotchik-napisala-programmu-na-python-dlja-sozdanija-neobychnyh-portretov</link>
      <comments>https://tproger.ru/news/video-devushka-razrabotchik-napisala-programmu-na-python-dlja-sozdanija-neobychnyh-portretov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/video-devushka-razrabotchik-napisala-programmu-na-python-dlja-sozdanija-neobychnyh-portretov</guid>
      <description><![CDATA[<p>На YouTube-канале Jenny Ma показан алгоритм, который помогает превратить фотографию в портрет из нитки на круглой деревянной основе.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/video-devushka-razrabotchik-napisala-programmu-na-python-dlja-sozdanija-neobychnyh-portretov">Видео: девушка-разработчик написала программу на Python для создания необычных портретов</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[YouTube]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 19 Mar 2021 06:18:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>На YouTube-канале Jenny Ma появилось новое видео. В нём автор ролика рассказывает о том, как она создавала портрет родителей при помощи нитки и круглого деревянного фона. Для облегчения процесса, девушка написала программу на Python, используя разработанный ею алгоритм.</p><figure><img src="https://media.tproger.ru/uploads/2021/03/Tproger_2.jpg" alt="" /><figcaption>Источник: YouTube / Jenny Ma</figcaption></figure><p>Начала Дженни с поиска кода для «обрезки» исходной фотографии до круга. После этого, путём проб и ошибок, она подбирала наилучшие параметры для превращения обычного изображения в желаемый ей портрет.</p><p>В процессе анализа выяснилось, что для лучшего качества итогового результата лучше использовать более тёмные и менее контрастные фотографии:</p><figure><img src="https://media.tproger.ru/uploads/2021/03/Tproger.jpg" alt="" /><figcaption>Источник: YouTube / Jenny Ma</figcaption></figure><p>При этом нет особого смысла делать портрет из нескольких оттенков ниток — лица на чёрно-белом варианте также прекрасно различимы.</p><p>Отдельное внимание девушка обратила на то, что на дебаг 100 строк кода проекта она потратила около 6 часов. Но в результате у неё получилась программа, которая позволила реализовать задуманное. Со всем процессом (с подробностями) и тем, что у неё получилось в конце, можно ознакомиться в видео:</p><p>Источник: <a href="https://youtu.be/UsbBSttaJos">YouTube / Jenny Ma</a></p>]]></content:encoded>
    </item>
    <item>
      <title>6 способов больше узнать про алгоритмы</title>
      <link>https://tproger.ru/articles/6-sposobov-bolshe-uznat-pro-algoritmy</link>
      <comments>https://tproger.ru/articles/6-sposobov-bolshe-uznat-pro-algoritmy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/6-sposobov-bolshe-uznat-pro-algoritmy</guid>
      <description><![CDATA[<p>Знание алгоритмов помогает оценивать программы по скорости, памяти и масштабируемости — подборка материалов для прокачки этих навыков.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/6-sposobov-bolshe-uznat-pro-algoritmy">6 способов больше узнать про алгоритмы</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 18 Mar 2021 06:29:27 GMT</pubDate>
      <content:encoded><![CDATA[<p>Знание алгоритмов — большой плюс для программиста. Ведь написание программ — это фактически создание собственных алгоритмов. И если вы знаете их, то у вас в голове всегда есть набор методов решения задач, которые вы можете использовать, а не изобретать велосипед для каждой новой задачи. Кроме этого, зная алгоритмы, вы сможете лучше оценивать программы с точки зрения скорости, масштабируемости, использования памяти.</p><p>Большинство алгоритмов есть в библиотеках языков программирования, но знание их устройства позволит вам глубже понимать свою работу и предлагать оптимальные решения для рабочих задач. Вы будете чётко знать, для какой ситуации какое решение лучше подходит и какие механизмы лежат в основе каждого из них.</p><p>Многие компании, среди которых Яндекс, Google, Facebook, проверяют знание алгоритмов на своих собеседованиях, — это своеобразный негласный стандарт. Вы должны хорошо ориентироваться в особенностях алгоритмов, быстро предлагать разные способы решения задач и понимать, какое решение предпочтительнее использовать.</p><p>Вот шесть хороших способов, с помощью которых можно прокачать свои знания алгоритмов.</p><h2>Книги Роберта Седжвика</h2><figure><img src="https://media.tproger.ru/uploads/2021/03/sajevick-autoconverted-330x223.jpeg" alt="" /></figure><p>Роберт Седжвик написал две отличные книги: «<a href="http://www.williamspublishing.com/Books/978-5-8459-1650-1.html">Алгоритмы на C++. Фундаментальные алгоритмы и структуры данных</a>» и «<a href="http://www.williamspublishing.com/Books/978-5-8459-1781-2.html">Алгоритмы на Java</a>» (в соавторстве с Кевином Уэйном). Седжвик, легендарный человек в мире технологий, был членом совета директоров Adobe Systems, работал во многих исследовательских институтах, где в буквальном смысле слова разрабатывались основы современных технологий. В их числе — знаменитая лаборатория Xerox PARC, где были придуманы современные графические интерфейсы, которыми в своё время вдохновился Стив Джобс.</p><p>Книги написаны давно и заслужили статус абсолютной классики. Конечно, здесь нет описания суперсовременных технологий и разработок, но зато рассматриваются фундаментальные структуры данных и алгоритмы, которые применимы к любому языку программирования. Вы поймёте, как работают поиск, сортировка, реализация абстрактных типов данных, алгоритмы на графах и многое другое. Эта книга — абсолютный индустриальный мастхэв.</p><h2>Книга Томаса Кормена «Алгоритмы: построение и анализ»</h2><figure><img src="https://media.tproger.ru/uploads/2021/03/image4-248x330.png" alt="" /></figure><p>«<a href="https://tproger.ru/books/obzor-knigi-kormena-i-lejzersona-algoritmy-postroenie-i-analiz/">Алгоритмы: построение и анализ</a>» написана Томасом Корменом, Чарльзом Лейзерсоном, Рональдом Ривестом и Клиффордом Штайном. Каждый из авторов — легендарный IT-деятель. Эта книга тоже считается классикой. Она хорошо структурирована, каждая глава самодостаточна и раскрывает тот или иной аспект алгоритмов. При этом их суть описана простым и доступным языком с большим количеством примеров, но не в ущерб глубине изложения. Благодаря этому книгу можно читать с любым уровнем подготовки.</p><p>Материал практически любого хорошего онлайн-курса по алгоритмам будет пересекаться с этими книгами.</p><p>Книги переведены на русский и изданы в России, найти их не составит труда.</p><h2>Школа анализа данных Яндекса</h2><p>Я учился в Школе анализа данных и могу порекомендовать курсы <a href="https://yandexdataschool.ru/profile/babenko">Максима Бабенко</a> «Алгоритмы и структуры данных» и «<a href="https://yandexdataschool.ru/course/big-data-infrastructure">Алгоритмы во внешней памяти</a>». Максим умеет доступно объяснять самый сложный материал так, чтобы вы действительно поняли суть.</p><p>Большая ценность обучения именно в Школе анализа данных — это чувство причастности к чему-то большему. Именно такое ощущение появляется от хорошего образовательного заведения. Это может показаться неважным, но на самом деле это ощущение кардинально повышает эффективность и качество обучения. И Школа анализа данных обладает такими свойствами в полной мере. В ШАД работают отличные лекторы и чувствуется поддержка в течение всего курса. Поэтому, если у вас есть такая возможность, получить здесь образование точно стоит. Обучение бесплатное, но попасть в ШАД не так просто: нужно пройти серьезный отбор.</p><h2>Ресурсы для обучения</h2><h3>Курс «Специализация: Искусство разработки на современном C++»</h3><p>Этот курс мы создавали вместе с коллегами — разработчиками из Яндекса и других компаний. Здесь мы делимся своим многолетним опытом в части создания больших проектов на языке C++ и рассказываем в том числе про внутреннее устройство стандартных структур данных в языке С++. Фокус здесь не на теории, а на решении проблем, с которыми в реальной жизни сталкиваются большинство разработчиков. Мы постарались сделать лекции лёгкими и доступными, подкрепив их большим количеством практических задач. В конце каждого спринта вам предлагается серьёзная задача, для решения которой нужно применить весь изученный материал.</p><figure><img src="https://media.tproger.ru/uploads/2021/03/image6.png" alt="" /></figure><h3>Codeforces</h3><p>Codeforces — российский проект, который много лет поддерживает Павел Дуров. Во многом это российское олимпиадное программирование, переведённое в онлайн-формат. Здесь постоянно проводятся соревнования с солидными денежными призами, одержать победу в которых крайне непросто. Однако, если вам удастся занять призовое место, то это явно станет хорошей строчкой в вашем портфолио.</p><p>Ценность сайта — в том, что он позволяет вам сразу почувствовать себя внутри индустрии, внутри комьюнити, которое говорит на профессиональном языке. Можно сразу понять, лежит ли у вас душа к такой работе. Здесь можно изучать таблицы лидеров, чтобы понять, как и почему работа других людей получает высокую оценку, и что надо сделать, чтобы получить такую же.</p><figure><img src="https://media.tproger.ru/uploads/2021/03/image3-3.png" alt="" /></figure><h3>LeetCode</h3><p>LeetCode — это сайт-тренажер для решения разных задач в области программирования. Среди плюсов — удобный и продуманный интерфейс, который позволяет вам сосредоточиться на работе. Также, после решения задачи вы можете посмотреть, как с ней работали другие люди и насколько быстрее других вы справились с ней. Удобно сравнить свой реальный уровень с другими разработчиками. На сайте размещено почти 2 тысячи задач, поддерживаются 14 языков программирования.</p><p>В изучении алгоритмов, практически как и в любом деле, практика намного ценнее теории. Поэтому я бы дал такой совет: изучая алгоритмы, важно не просто прочитать несколько книг и пройти несколько курсов, важно получить как можно больше практики. И благодаря современным технологиям, практиковаться вы можете практически из любой точки мира.</p>]]></content:encoded>
    </item>
    <item>
      <title>Китайские майнеры «сломали» ограничения RTX 3060, внедрённые NVIDIA</title>
      <link>https://tproger.ru/news/kitajskie-majnery-slomali-ogranichenija-rtx-3060-vnedrjonnye-nvidia</link>
      <comments>https://tproger.ru/news/kitajskie-majnery-slomali-ogranichenija-rtx-3060-vnedrjonnye-nvidia?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/kitajskie-majnery-slomali-ogranichenija-rtx-3060-vnedrjonnye-nvidia</guid>
      <description><![CDATA[<p>Видеокарта показала около 45 Мх/сек вместо урезанных алгоритмами 20-25 Мх/сек, правда на фото добывают Octopus, а не Ethereum.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/kitajskie-majnery-slomali-ogranichenija-rtx-3060-vnedrjonnye-nvidia">Китайские майнеры «сломали» ограничения RTX 3060, внедрённые NVIDIA</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Ethereum]]></category>
      <category><![CDATA[Криптовалюты]]></category>
      <category><![CDATA[NVIDIA]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 11 Mar 2021 11:51:49 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ранее NVIDIA <a href="https://tproger.ru/news/nvidia-uhudshit-proizvoditelnost-svoih-videokart-pri-majninge/">заявила</a> о намерении начать борьбу с майнингом на её видеокартах. Первым шагом в этом направлении стало ограничение производительности RTX 3060 при добыче криптовалюты. Но, как оказалось, «рукастые энтузиасты» из Китая без особых проблем обошли запреты NVIDIA.</p><figure><img src="https://media.tproger.ru/uploads/2021/03/1-24.jpg" alt="" /><figcaption>Фотография, доказывающая, что в целом майнеры не парятся об ограничениях NVIDIA</figcaption></figure><p>В сети появилось фото, на котором новейшая видеокарта компании демонстрирует эффективность в районе 45 Мх/сек при майнинге. Для сравнения, алгоритмы NVIDIA ранее опускали это значение до 20-25 Мх/сек в случае обнаружения фарминга электронной валюты.</p><p>Правда, Wccftech <a href="https://wccftech.com/chinese-cryptocurrency-miners-allegedly-bypass-nvidias-geforce-rtx-3060-hash-rate-limiter-delivers-up-to-50-mh-s-in-ethereum/">пишет</a>, что на RTX 3060 майнят не Ethereum (против которого и настроены алгоритмы «зелёных»), а Octopus. С другой стороны, так ли это важно? В любом случае, грядущий ажиотаж вокруг видеоадаптера приведёт к его длительному дефициту.</p><p>Источник: <a href="https://wccftech.com/chinese-cryptocurrency-miners-allegedly-bypass-nvidias-geforce-rtx-3060-hash-rate-limiter-delivers-up-to-50-mh-s-in-ethereum/">Wccftech</a></p>]]></content:encoded>
    </item>
  </channel>
</rss>