О чём расскажут на C++ Russia 2023 в онлайне и офлайне
В доковидные времена (помните такие?) мы проводили C++ Russia два дня в офлайне. Когда в 2020-м конференция перешла в онлайн, один участник решил отложить поход на конференцию до возвращения полноценного офлайна. И вот теперь, в 2023-м, наконец снова проведём два дня в Москве. Получается, человек хотел сходить в год нового стандарта C++ и действительно сходит в год нового стандарта, но есть нюанс!
Однако многим успел понравиться онлайн-формат, когда участники не привязаны к городу. Поэтому будут ещё и два онлайн-дня. А к «офлайновой» части можно будет подключиться удалённо, не пропустив ни одного доклада.
Поскольку мероприятие на целых четыре дня, докладов получилось особенно много. И теперь, когда программа готова, рассказываем Хабру, о чём они будут.
Оглавление
Практичный C++
C++ трюки из userver
Яндекс Go
Три года назад Антон уже делился C++ трюками, и участникам очень понравилось. Теперь пришло время новых трюков и приёмов. Вас ожидают:
В чате конференции уже обсуждался последний трюк. В докладе подробно рассматриваются как предыстория вопроса, так и итоговые результаты с бенчмарками. Готовый к использованию код из доклада уже можно найти на userver.tech.
Имплементируем класс tuple в 100 строк кода
Project Jupyter
В докладе рассказывается о том, как можно написать класс tuple (через рекурсию), и рассматривается проблема метода имплементации. Спикер покажет, как имплементировать наивную версию с множественным наследованием, которую затем доработает до простой и рабочей версии класса tuple. Этот класс будет обладать большим количеством свойств класса std: tuple из стандартной библиотеки, хотя и не будет полностью удовлетворять всем его требованиям.
Кастомизируем ASIO
Yadro
ASIO позволяет использовать std: future из коробки для работы с асинхронными событиями. А если хочется использовать свою реализацию future? Илья расскажет и покажет, как это сделать. Заодно он поговорит про кастомизацию уровнем ниже, на примере io_uring.
YsonStruct: дешевая сериализация иерархических JSON-структур
Яндекс
Для описания настроек сервисов часто используются конфигурационные файлы в форматах наподобие JSON и YAML. В разных высокоуровневых языках есть возможность автоматически преобразовывать JSON в нативные структуры языка: marshalling в Go, модули JSON и YAML в Python.
Яндекс представляет библиотеку, позволяющую реализовать сериализуемые в JSON структуры на C++. Важное отличие от аналогов — поддержка сложных иерархий классов, в том числе со множественным и виртуальным наследованием.
Иван расскажет про высокоуровневый дизайн библиотеки, технические трудности в её реализации, опыт внедрения библиотеки в большую кодовую базу, попытки сделать хороший интерфейс. В докладе будет погружение в детали layout-а классов в различных иерархиях наследования, специфика работы с offset-ами полей, подходы к реализации рефлексии. Не будет парсинга JSON и сериализации примитивных типов — эта задача хорошо выполняется и сторонними библиотеками.
Машина состояний: непридуманная история
Orion Innovation
Александр расскажет, как для решения одной задачи им пришлось самостоятельно создать машину состояний. Поскольку требования к решаемой проблеме постоянно менялись, а особенности и сложности появлялись и исчезали, то и машина состояний эволюционировала, реагируя на происходящее. В рамках доклада спикер опишет происходившие изменения и оценит, какие из них были удачными, а какие нет.
Tooling
Roren — С++ фреймворк для описания пайплайнов распределенных вычислений
Яндекс
Огромное количество С++ кода в Яндексе можно описать словами «распределенные вычисления». Доклад посвящен активно разрабатываемому сейчас С++ фреймворку, вдохновленному библиотеками std: ranges и Apache Beam. Этот фреймворк позволяет достаточно компактно и просто описывать такие процессы и запускать их в MapReduce-режиме для обработки таблиц данных или в real-time режиме для обработки бесконечных потоков (очередей) данных.
Доклад не предполагает знакомства с какими-либо специфичными технологиями. Он будет полезен разработчикам и пользователям различных распределенных систем обработки данных и тем, кто интересуется этой темой.
С Conan за кроссплатформенностью
IntelliVision
Доклад о применении менеджера пакетов Conan в разработке computer vision-продуктов. Лев расскажет об эволюции их процесса разработки ПО и о том, как пришли к Conan. Он также уделит внимание подводным камням Conan при кроссплатформенной разработке.
Опыт использования Bazel
Лаборатория Касперского
Bazel — это достаточно новая open source-система сборки, которая набирает популярность (Google, BMW, Uber, Dropbox и т.д.). Евгений поделится опытом использования Bazel.
Речь пойдет о двух проектах. В первом проекте он пользовался им как C++/Python-разработчик. Во втором проекте, в Лаборатории Касперского, спикер участвует в команде, которая переводит кодовую базу с CMake на Bazel. Он расскажет о killer features этой системы сборки — ее преимуществах и недостатках.
nocc — распределенный компилятор для гигантских проектов на C++
ВКонтакте
Известно, что С++ проекты очень долго компилируются. ccache может спасти локально, но современный деплой состоит из изолированных контейнеров, TeamCity, билд-агентов и прочего — там ccache не поможет.
Есть такая вещь, как distcc — распределенная компиляция, ускорение за счет множества серверных нод. На крупных проектах это действительно быстрее, чем локально. ВКонтакте много лет ее и использовали, но кодовая база разрослась так, что их перестала устраивать скорость.
Они написали nocc — аналог distcc, только значительно более быстрый, и это дало им колоссальный прирост скорости сборки в реальных условиях. Александр расскажет про архитектуру, про особенности имплементации, про отличия от distcc и, конечно же, как использовать nocc в ваших С++ проектах.
Исходный код: скрытое знание и как его показать?
Университет Иннополис
Университет Иннополис
Традиционно информация о программе представляется в виде документации, которая, как правило, представляет собой неформальное или полуформальное описание тех или иных особенностей, правил ее использования и т.д. — то есть, содержит информацию о внешней стороне программы («взгляд пользователя»). С другой стороны, аспекты внутреннего устройства программы, как на уровне ее общей архитектуры, так и на уровне отдельных компонентов (функций, классов), как правило, никак не документируется (комментарии не в счет).
В то же время, именно внутреннее устройство программы, смысл (семантика) ее компонентов является критически важным — особенно для крупных долгоживущих программных комплексов, которые, как правило, эволюционируют и в процессе сопровождения подвергаются рефакторингу, добавлению новых функциональных возможностей, оптимизации и другим модификациям. Поэтому выявление семантики структурных компонентов программы, архитектуры системы в целом и представление (визуализация) их в форме, удобной для анализа, — является критически важной и актуальной задачей, особенно учитывая тот факт, что в настоящее время для многих современных ЯП не существует адекватных инструментов для подобного анализа и визуализации.
Доклад посвящен проблеме глубокого анализа семантики программ, представленных в исходных текстах, и наглядного (удобного для восприятия) отображения знания о ее семантике. Предлагается ряд подходов и технологий, направленных на извлечение и визуализацию знаний о семантике программ, в том числе «скрытой семантики», а также общей архитектуре программных систем.
Как мистер L-сан утечки искал
Память в С++ доставляет много радости (эффективность!) и много печали (UB, уязвимости). Все в большем числе проектов для выявления проблем с доступом к памяти используют Address Sanitizer. Он хорошо известен и описан. Вместе с ним обычно тихо и незаметно работает Leak Sanitizer, которому уделяется намного меньше внимания. В конце концов значительную утечку памяти мы и так заметим, а небольшая — это не страшно. Или страшно?
Рассмотрим, чем нам грозят и сигнализируют небольшие утечки памяти, как работает Leak Sanitizer и что вообще интересного может быть в поиске утечек памяти.
Компиляторы
Автоматизация программирования в СССР. Трансляторы (60–70-е годы)
РТУ МИРЭА
Ранее на C++ Russia Пётр уже рассказывал про автоматизацию программирования в СССР (можно посмотреть видеозапись). Пришло время продолжения: на этот раз речь пойдёт о советских трансляторах, созданных в 60–70-е годы. Изложение концентрируется на простых и актуальных даже сегодня алгоритмах. Центральная тема доклада — задача распределения регистров. Что общего между разработками советской компиляторной школы и LLVM с SSA, а также с планированием команд для современных процессоров? Эти вопросы тоже будут рассматриваться в докладе.
Компилятор LCC и оптимизация слияния кода
МЦСТ
Эльбрус как архитектура сильно отличается от мейнстримовых архитектур процессоров. Как следствие, она требует от компилятора проведения некоторых особенных оптимизаций. Виктор кратко расскажет про особенности Эльбруса и про его особые оптимизации, реализованные в компиляторе LCC. Более подробно он остановится на оптимизации слияния кода: что это такое, зачем нужно и как работает. Доклад будет полезен тем, кто интересуется компиляторами и оптимизацией кода.
Безопасный компилятор: надежная оптимизация и улучшение защищенности кода
ИСП РАН
К появлению уязвимостей в программах могут приводить не только ошибки, допущенные программистом, или злой умысел, но и агрессивные оптимизации, применяемые компилятором. Такая опасность возникает прежде всего для кода, содержащего конструкции с неопределенным поведением (undefined behavior), появление которых в программе может быть связано как с недостаточным знанием стандарта языка C, так и с попытками «эффективно» реализовать некоторую семантику (что иногда даже «срабатывает» для конкретной версии компилятора для заданной архитектуры). Тем не менее компилятор вправе выполнять оптимизации исходя из того, что исходный код написан в строгом соответствии со стандартом, и что в нем отсутствует неопределенное поведение.
Дмитрий рассмотрит примеры кода с различными видами неопределенного поведения, а также неочевидные эффекты от его оптимизации современными версиями GCC и Clang. Он также покажет разработанный ими безопасный компилятор на основе GCC, цель которого — предотвращать некорректные оптимизации кода, содержащего неопределенное поведение. Кроме того, спикер расскажет и про другие методы улучшения безопасности кода, применяемые как в безопасном компиляторе, так и в стандартном GCC, а также их влияние на производительность.
Как сделать фронтенд компилятора в домашних условиях
Mekhovyye Kulaki
Mekhovyye Kulaki
Владислав и Сергей расскажут, как написать небольшой фронтенд-прототип для компилятора/статического анализатора. В качестве примера используется язык программирования Solidity. Разработка велась на C++20 под Windows, Linux и macOS.
Dive into Recent LLVM
Тулинг и инфраструктура компиляторов LLVM продолжают развиваться, обрастая поддержкой архитектур и их расширений, а также улучшениями инструментов. Clang тоже не простаивал. Никита подготовил нескучный changelog и демки. Его доклад будет полезен прикладным C++ разработчикам, пользователям тулчейна LLVM и тем, кто почему-то им еще не стал.
C++ Experiments: The Battle Continues: Cpp2 vs Carbon
Лаборатория Касперского
Несмотря на работу комитета над новыми стандартами языка, похоже, некоторые инварианты не могут быть пересмотрены, и активисты ведут работу в создании своих C++ совместимых языков по этим мотивам.
Вы снова окунетесь в дизайн с тем, чтобы попытаться ответить на вопрос: зачем? Что такого нового предлагается и чего может не хватать в С++?
Loop unrolling в деталях
Unipro
Доклад о широко применяемой технике оптимизации — раскрутке циклов (loop unrolling):
как ваш цикл видит компилятор;
в каких случаях loop unrolling вреден;
как Clang и GCC справляются с loop unrolling;
какие дополнительные возможности открывает unrolling.
На примере боевой задачи о минимальном взвешенном вершинном покрытии графа рассмотрим, какой эффект на performance может дать loop unrolling.
Производительность
Практика программирования тензорных ядер
Судо
Сложно переоценить влияние тензорных ядер на развитие нейросетей в нашем мире. В этом докладе мы заглянем под капот библиотек линейной алгебры, на основе которых и работает обучение нейронных сетей.
Эффективное использование GPU на примере разработки игр
Elverils
В докладе описываются общие моменты анализа и эффективного использования современного графического процессора на примере компьютерных игр. Профилирование и оптимизация для GPU. Разбор методик из геймдева для повышения производительности.
GPU Driven Rendering Pipeline, или Как пишется графика в современных видеоиграх
Elverils
Современный GPU достаточно производительный, чтобы заниматься рендером объектов, не обращаясь к CPU. Это позволяет ускорить процесс рендеринга в современных играх. Благодаря использованию GPU Driven Rendering Pipeline можно снизить загруженность CPU до 50%-60%.
В докладе разберем, как реализована поддержка GPU Driven Rendering Pipeline в современных графических API таких, как DX12 и Metal. Также затронем то, что большой уклон на GPU Driven Rendering Pipeline делает Apple с Metal API, где реализовано добавление команд в командный буфер прямо на GPU, а так же ICB.
Учим Кукушку Летать, или ConcurrentHashMap with Seqlocks
Huawei
Huawei
Хэш-таблицы — это базовый алгоритм ассоциативного массива, используемый практически везде. Существует множество алгоритмов, включая те, что поддерживают многопоточность, но мы обратим внимание на один из лучших — libcuckoo. Одна из проблем таких многопоточных алгоритмов — это то, что для безопасного чтения данных все равно необходимо произвести запись в память замка, чтобы синхронизироваться с другими потоками. Алгоритм SeqLock позволяет избавиться от необходимости в записи, существенно повышая масштабируемость чтения, однако он ставит несколько существенных условий использования, которые не просто адресовать… и не только на уровне алгоритма хэш-таблиц, но так же и на уровне языка С++, затрагивая его высшие материи и пробелы.
Advanced Linux Kernel Bypass Techniques in 2023
Unum
Recent kernel version feature io_uring helps developers communicate with the host Operating System at lower latencies, avoiding interrupts caused by direct system calls. This asynchronous interface brings substantial performance improvements to databases and networking applications but is still rarely seen in real products. Still, even that is not State-of-the-Art. We will talk about SPDK, DPDK, and the kind of performance you can expect from high-end SSDs and 200 GBit Infiniband.
Техники оптимизации производительности
Яндекс
Максим расскажет много практических вещей про оптимизации производительности. Какие инструменты стоит использовать для того, чтобы находить места для оптимизаций. Как не ошибиться при тестировании производительности. Как правильно выбирать и тестировать алгоритмы и структуры данных. В докладе будет множество примеров из практики.
Максимально быстрый и максимально удобный С++ msgpack-кодек
VK
Msgpack — это компактная и быстрая бинарная сериализация произвольных данных. Существует масса реализаций msgpack-кодеков для разных языков программирования, в том числе для C++. Все они по-своему хороши, но что будет, если поставить себе цель реализовать максимально быстрый msgpack-кодек, оставаясь при этом в лаконичном С++ интерфейсе?
Александр расскажет про их реализацию msgpack-кодека на C++, которая использует массу возможностей С++, позволяя паковать и распаковывать абсолютно абстрактные типы, в том числе в compile time, без динамической аллокации памяти, zero-copy (или once-copy?) и максимально branchless. Большинство описываемых подходов применимы и к другим типам сериализации и интересны сами по себе.
Ускоряем синтез: от TensorRT до CUDA C++
SberDevices
Выступление будет посвящено оптимизации одного из компонентов сервиса SberDevices, который превращает текст в человеческую речь. Артём подробно рассмотрит способы оптимизации ML inference, начиная от применения высокоуровневой библиотеки TensorRT, заканчивая самостоятельной оптимизацией на CUDA C++. Доклад будет интересен как тем, кто сталкивается с машинным обучением в продакшене, так и тем, кто хочет получить максимум от используемого железа.
Security
С++ и безопасность: правда ли все так плохо?
Лаборатория Касперского
Сергей проанализирует недавний отчет NSA и расскажет, так ли плохо обстоят дела с безопасностью в С++ на самом деле и что современная индустрия предлагает для решения этого вопроса.
Он разберет проблемы с безопасностью в С++ на открытых примерах из Chromium, среди которых:
работа с памятью;
UB;
C legacy, строки, арифметика, преобразования типов.
Спикер также покажет различные подходы к митигации описанных проблем, в частности:
статический анализ;
динамический анализ;
фаззинг-тестирование;
харденинг;
выделение безопасных подмножеств языка: Misra, AUTOSAR, стандарт Google;
методология SDL как комплексное решение;
(бонус) подход KasperskyOS по определению недоверенных компонентов, допускающих наличие уязвимостей, но без возможности их проэксплуатировать и развить атаку.
Злые фреймворки и генерируемый ими позиционно-независимый код
Яндекс
В прошлом году Денис говорил о том, как выглядит ваш код на С++ в скомпилированных исполняемых файлах. В этом году он предлагает посмотреть на position-independent code (PIC).
Вряд ли перед средним прикладным программистам часто приходится писать код, выполнение которого никак не зависит от итогового расположения инструкций в памяти. Системщики с таким встречаются чаще, но в этом докладе Денис подойдет к PIC с более знакомой лично ему стороны — такой код часто применяется во вредоносах. Нам даже не придется искать зло на зараженных машинах: на GitHub есть много довольно развитых и популярных фреймворков, которые сгенерируют нам импланты. Что ж, тем лучше: вы сможете посмотреть на исходный код фреймворка, а при желании сгенерировать имплант сами.
Зачем имплантам PIC? Для обхода защит в таких программах разработчики часто решают не пользоваться стандартными «сервисами» ОС или компиляторов. Они могут подменять своим кодом работу, которую обычно выполняет загрузчик исполняемых файлов. Или же вместо линкера заняться определением адресов API-функций, нужных для работы с примитивами ОС. Например, с сокетами для связи с контрольным сервером — так, чтобы в списке импортируемых вредносом функций не было видно ничего про сеть. Еще один связанный с API ОС-пример, не относящийся напрямую к PIC, — это снятие установленных защитными решениями хуков или расстановка собственных на системные вызовы, с помощью которых ОС ведет журналы и регистрирует события. Так что польза для злого кода в независимости от расположения в памяти есть. Чтобы ее получить, разработчику нужно использовать немного «ненормативные» техники, которые редко встречаются в легитимном ПО. Вот на них и посмотрим на примере живых имплантов.
Back to basics
Как правильно писать компараторы
Один из малоизвестных примеров undefined behavior в C/C++ это нарушение требований к функциям сравнения (компараторам). Компараторы широко используются в алгоритмах (std: sort, std: binary_search, и т.д.) и контейнерах (std: set, std: map) и встречаются как в C++, так и в C (qsort, bsearch). Компараторы должны удовлетворять некоторым аксиомам, которые в математике описываются понятием строгого слабого порядка (strict weak ordering). Эти аксиомы не интуитивны и в них легко ошибиться, о чем свидетельствует большое количество соответствующих багов в open source проектах. Современные тулчейны предоставляют средства для отслеживания таких ошибок. О них и будет рассказано в докладе Юрия.
Что-то у меня тормозит: заглядываем внутрь С++ контейнеров
Яндекс
Вернемся к азам и рассмотрим, какие асимптотики имеют различные операции с контейнерами С++ и почему именно так. В конце доклада обсудим общие рекомендации — какой контейнер и когда использовать.
Почти полноценный RTTI с контролируемым overhead
Лаборатория Касперского
Почему в C++ до сих пор продолжают делать «свой» RTTI в обход существующего стандартного решения? Причина в том, что далеко не всегда и не для всех классов этот механизм востребован. И иногда он медленный. А еще у вас нет полноценного доступа к иерархии классов.
Те же, кто пишет свой RTTI сталкиваются вот с такими проблемами:
При добавлении классов приходится писать много дополнительного кода.
Как правило, в «своем» RTTI нет возможности получить доступ к иерархии классов, а иногда это было бы очень удобно.
В каких-то случаях (например, для паттерна Visitor) приходится даже использовать генераторы программного кода (см. Clang AST Visitor).
Используя С++17 (с заделом на C++20) и немного всяких хитростей, можно почти полностью уйти от этих проблем:
Дополнительный код по-прежнему нужен, но его все же теперь меньше, чем в других решениях.
Имея указатель на базовый класс, вы не только можете узнать, что это за тип, но еще и получить доступ к иерархии классов.
Посмотрим, сможем ли мы сделать Visitor без генерации кода?
Доклад будем полезен тем, кто небезразличен к таким вещам, как «стирание типов» и RTTI в C++.
Back to Basics: Lock-free
Яндекс
Марсель расскажет про стандартные способы работы в многопоточной среде (мьютексы, compare and swap, hazard pointer) и алгоритм снятия снапшота двух атомарных «регистров».
Доклад будет полезен новичкам в работе с многопоточностью и опытным разработчикам, желающим смахнуть пыль с уже заржавевших знаний.
Про flat_map
flat_map может казаться загадочным зверем, но вы скорее всего использовали его много раз, возможно, не осознавая этого: по сути, flat_map — это просто отсортированная последовательность.
В этом докладе спикер:
сравнит flat_map с существующими стандартными ассоциативными контейнерами;
рассмотрит популярные существующие реализации flat_map;
посмотрит на то, что предлагается добавить в стандартную библиотеку C++;
сделает выводы о том, какой flat_map мы хотим иметь в C++.
После доклада у вас должно появиться хорошее понимание того, что же такое flat_map и в каких ситуациях его следует применять.
Back Deep to Basics: Наследование и виртуальность в C++
Лаборатория Касперского
Наследование, виртуальные функции, v-таблицы, виртуальное наследование — вещи до боли знакомые каждому C++ разработчику. Но так ли хорошо мы знаем эти механизмы?
Практика собеседований показывает, что как только дело доходит до деталей, возникает много нюансов, на которые не всегда находится ответ. Эти вещи напрямую влияют на производительность, объем наших бинарных файлов, а иногда даже на безопасность нашего кода. Так давайте вернемся к началам и разберемся в деталях этой машинерии. Внезапно: рассмотрим, что есть нового в этой области и как оно работает под капотом.
Software design
Concurrency Patterns
Modernes C++ GmbH
The main concern when you deal with concurrency is shared, mutable state or as Tony Van Eerd put it in his CppCon 2014 talk «Lock-free by Example»: «Forget what you learned in Kindergarten (i.e., stop Sharing).»
Rainer will present in theory and praxis proven patterns such as thread-safe storage, strategized locking, thread-safe interface, or guarded suspension to deal with the enemies of thread-safe programming: shared state and mutation. To synchronize and schedule member function invocations in a concurrent architecture, the classics such as active object, or monitor object provide valuable services.
Колоночное хранилище в памяти: void* и шаблоны
На конференции SmartData 2022 был доклад «Колонки и векторные инструкции». В том докладе Александр сделал обзор устройства колоночных хранилищ в памяти и подходов для повышения производительности за счет применения векторных алгоритмов над колонками.
В этом сезоне мы нырнем чуть поглубже — в устройство колоночного хранилища в памяти и поговорим о том, почему std: vector не дружит с кэшами. Ответим на вопрос, почему void* и шаблоны являются хорошей абстракцией для нашей задачи. Рассмотрим варианты, как можно сдружить API колонок и векторные инструкции. В этом сезоне затронем многие особенности построения колоночного хранилища и посмотрим на него со стороны бенчмарков.
Модель асинхронности в C++: теория и практика
VK
Сегодня программный код растущими темпами становится асинхронным. Асинхронность используется повсюду: от процессоров, сетевого кода и файлового ввода/вывода, до GUI и GPU. Языки программирования, которые хотят идти в ногу со временем, должны учитывать асинхронность в своем дизайне.
Комитет стандартизации C++ работает над принятием в стандарт C++26 новой модели асинхронных вычислений — std: execution, также известной как Senders/Receivers. Чем эта модель лучше низкоуровневых примитивов стандартной библиотеки, как можно испытать ее на практике уже сейчас с C++17 и при чем тут корутины — об этом Эрнест расскажет в своем докладе.
Семантические процессы в C++
Syntacore
В языке C++ есть синтаксис и семантика. Когда мы говорим о синтаксисе, мы говорим о контекстно-независимых конструкциях, которые просто что-то означают. Например, if — это всегда if.
Но когда мы говорим о семантике, мы сталкиваемся с необходимостью для компилятора что-то сделать или что-то выяснить: разрешить имя, инстанцировать шаблон, вывести тип, вычислить константное выражение. Можно сказать что в каждый такой момент мы стартуем некий процесс, развивающийся по своим правилам. Этот доклад посвящен описанию взаимодействующих семантических процессов в языке, как с точки зрения внутренностей компилятора, так и с точки зрения стандарта языка.
Dynamic Libraries for Bare Metal
Независимый разработчик
Все привыкли к динамически загружаемым библиотекам в больших ОС: это экономит размер исполняемого файла и позволяет обновлять только необходимые компоненты. Однако в bare metal-разработке это не так популярно и распространено. Антон расскажет про свой опыт в этой области и обсудит плюсы и минусы такого подхода.
Designing Robust APIs: How to Write C++ Code that’s Safe, Extensible, Efficient & Easy to Use
Современное С++ сообщество уделяет удивительно мало внимания тому, как писать хороший код. Даже само понятие «хорошего кода» скорее предмет холиваров, а не обоснованных дискуссий. Александр намерен это исправить. Он рассмотрит проблемы, с которыми сталкиваются инженеры, переносящие сложные концепты в С++ код, и приемы, которые помогут вам этот процесс упростить и упорядочить.
Элементы функционального программирования в языке C++
Tech Lead developer, кандидат физико-математических наук, автор книг и научных публикаций по теории программирования, переводчик книг по программированию, преподаватель программирования и сопутствующих разделов математики. Любимые языки: C++ и Haskell.
B-tree индексы в базах данных на примере SQLite и PostgreSQL
Владимир расскажет о том, как работают обычные™ индексы в базах данных, и ответит на следующие вопросы:
как индекс ускоряет поиск;
нужно ли индексировать условия where;
нужно ли индексировать условия в order by;
нужно ли индексировать foreign keys;
что делать, если критериев поиска несколько;
в каком порядке указывать колонки в индексе;
когда индекс замедляет работу и как снизить влияние индекса на приложение.
Доклад будет интересен и новичкам в работе с базами данных, и тем, кто работал, но подзабыл. Если в вашем проекте есть база данных, а там индекс, то доклад вам точно будет полезен. Ну, а если доклад попадет в подборки «обязательно посмотреть на онбординге разработчика», то цель точно достигнута.
Про алгоритмы в поисковых движках
Авито / Sphinx
В полнотекстовом поиске есть: одна ключевая структура данных (тупая); бывают два–три умеренно уникальных для поисковиков алгоритма; и целая гора разнообразных алгоритмов, техник и фокусов, используемых где-то еще. Сегодня внятные движки — это еще и достаточно рабочая база данных + всякие элементы ML + особая IR-магия типа классического BM25 + какие-нибудь свежевыдуманные векторные модели (или там BERT) + что угодно еще. Кроме того мы тоже перекладываем JSON на лопате.
Андрей точно расскажет про 1,5 прямо самые ключевые и прямо уникальные для поиска алгоритмы и структуры данных. Он точно пробежится как минимум по верхам и ключевикам других неуникальных, но особо интересных и важных алгоритмов и техник, которые могут встречаться хоть где-то, кроме поиска. Примерный спектр этих, неуникальных алгоритмов: от банальных SIMD-оптимизаций всяких парсеров через ловкие особые спецалгоритмы сжатия к совсем верхнеуровневым штукам, типа интеграций CatBoost и прочих FAISS. Напоследок спикер занырнет в особо интересные детали, насколько позволит время.
Санитайзеры и стандарт не спасут
Некоторые считают, что C++ — прекрасный язык: много литературы и курсов, санитайзеры для ловли undefined behavior, мощные IDE и статический анализ. Но так ли они надежны? Что, если программист доверяется инструментам, а не знает стандарт наизусть? Поможет ли потребовать корректную работу программы на пяти компиляторах в 15 режимах под тремя ОС? Какие подковырки стандарта, особенности компиляторов и баги тулинга можно выявить, решая на C++ лишь учебные задачи?
Егор расскажет о защитах от дурака (и их ненамеренном обходе) в ОС, системах контроля версий, инфраструктуре на GitHub Actions, а также несовместим