При создании программ важно уметь строго доказывать корректность их работы и оценивать скорость ещё на стадии проектирования, а также предотвращать ошибки в крайних случаях. Этот курс знакомит слушателей с некоторыми стандартными алгоритмами (сортировки, разделяй-и-властвуй, динамическое программирование, жадные алгоритмы, кратчайшие пути в графах) и структурами данных (списки, кучи, деревья, СНМ). Помимо знакомства, студенты учатся разрабатывать новые алгоритмы и доказывать их корректность. Кроме задач на доказательство, студенты решают практические задачи, где нужно придумать алгоритм, реализовать его в виде программы, решающей конкретную задачу, и сдать через автоматическую систему проверки.
Алгоритмы и структуры данных (часть 2)
Этот курс продолжает изучение алгоритмов и структур данных. Во второй части курса изучаются алгоритмы и структуры данных для поиска (деревья поиска и хеш-таблицы), числовые алгоритмы (БПФ, генерация простых, RSA), алгоритмы на строках (КМП, z-функция, Ахо-Корасик, суффиксные структуры). В заключение обсуждаются NP-трудные задачи и подходы к их решению. Все темы также требуют решения теоретических задач на разработку алгоритмов и сдачи реализованных программ через автоматическую систему проверки.
Машинное обучение
Машинное обучение - подход к решению задачи, в котором вместо прямого задания аналитического или вычислительного метода, мы задаем общий вид решения и алгоритм подбора точного вида. В курсе будут рассмотрены основные типы алгоритмов, принципы их работы и обучения. Помимо этого студенты получат практические навыки по вышеупомянутым областям применения.
Базы данных
Реляционные базы данных были и остаются самым популярным средством хранения информации со сложной структурой, а принципы, лежащие в основе реляционных СУБД, широко применяются во многих областях информационных технологий. В этом курсе рассматриваются теоретические основы функционирования реляционных систем и даётся практическая подготовка по проектированию и использованию реляционных баз данных в прикладных приложениях.
Параллельное программирование
Высокопроизводительные вычисления (high performace computing) - область программной инженерии, позволяющая удовлетворять такие важные для многих классов систем требования, как скорость обработки данных, время отклика и масштабируемость. В курсе делается акцент на комплексное умение с использованием различных технических и архитектурных решений уметь проектировать как системы обработки больших объёмов данных, так и системы, близкие к жёсткому реальному времени. Теоретическая подготовка в области неблокирующих алгоритмов, теории параллельного программирования и широкий спектр рассматриваемых технологий анализа и повышения производительности, от простого мнгопоточного кода до применения транзакционной памяти, позволяет студентам применять полученные знания в прикладных работах по другим дисциплинам. Практическая часть курса затрагивает наиболее применимые в современном программировании шаблоны и подходы к реализации высокопроизводительных приложений.
Комбинаторика и теория графов
В представленном курсе дается достаточно подробное и систематическое описание всех основных разделов современной перечислительной комбинаторики. В основе курса лежит понятие производящей функции - основного аппарата современной перечислительной комбинаторики. Объясняется комбинаторный смысл основных операций над производящими функциями и показывается, как с его помощью перечислять практически любые дискретные помеченные структуры, встречающиеся на практике. Отдельная часть курса посвящена перечислению так называемых непомеченных дискретных структур --- непомеченных графов, деревьев, а также других подобных комбинаторных объектов. С практической точки зрения перечисление именно таких структур завершает комбинаторное их описание, и потому является особенно важным и полезным на практике.
Введение в Unix и скриптовые языки
UNIX-подобные операционные системы очень популярны среди программистов и компаний. Курс на примере семейства систем GNU/Linux знакомит слушателей с командной строкой и стандартными утилитами, регулярными выражениями, интерпретатором Bash, структурой файловой системы, пользователей и разрешений в UNIX-подобных системах, а также процессом загрузки Linux. На практиках слушателям потребуется продемонстрировать умение работать в UNIX-подобной ОС и выполнять стандартные для программистов задачи из командной строки.
Вторая часть курса посвящена работе со скриптовыми языками на примере языка Python. Слушатели познакомятся с базовыми техническими моментами: рецензирование кода (code review), автоматическое тестирование, системы контроля версий, состояние гонки, вычисления с вещественными числами.
Программирование на C++
C++ — один из "классических" языков в промышленной разработке. Этот язык даёт программисту много свободы и ответственности, он стабильно применяется при разработке высокопроизводительных систем, системном программировании и в других областях. В курсе рассматриваются особенности ручного управления памятью в программах, а также основные возможности C++: const-correctness, умные указатели, объектно-ориентированное программирование, перегрузка операторов, виртуальные функции. На практиках требуется реализовать небольшие проекты и пройти рецензирование кода.
Дополнительные разделы C++
Этот курс продолжает изучение языка C++ и покрывает более глубокие и современные возможности: шаблоны, исключения и идиому RAII, стандартную библиотеку шаблонов (STL), внутреннюю реализацию итераторов, способы приведения типов, RTTI, move-семантику, а также появившийся в C++11 синтаксис и библиотечные функции. На практиках требуется написать свою реализацию нескольких нетривиальных библиотек и пройти рецензирование кода.
Основы программной инженерии
Промышленная (коммерческая) разработка программного обеспечения состоит из большого числа самых разных видов деятельности, и написание кода -- лишь одна из них. В курсе мы вкратце рассмотрим все составляющие успешного проекта от анализа требований и проектирования пользовательского интерфейса и до построения наиболее подходящего под проект и команду процесса разработки. Также будут рассмотрены и некоторые технические практики: непрерывная интеграция и непрерывная доставка ПО (CI/CD), рефакторинг, управление качеством ПО и некоторые другие.
Функциональное программирование
Функциональное программирование — отдельная парадигма, элементы которой всё чаще используются в современных языках программирования. Иногда оказывается, что написанные в функциональном стиле программы более точно выражают намерения программиста. Их корректность может быть легче доказывать и проверять, даже если они написаны на императивном языке. В рамках курса разбираются как теоретические основы функционального программирования (лямбда-исчисление, автоматический вывод типов Хиндли-Милнера), так и конкретные реализации этих идей в языке программирования Haskell (использование свёрток, иерархия классов типов от функторов до монад, трансформеры монад). Пример практического задания: реализация вывода типов Хиндли-Милнера на языке Haskell.
Математическая статистика
Математическая статистика — раздел математики, изучающий методы обработки данных, и один из основных разделов науки о данных. В курсе будут рассмотрены следующие темы: оценивание параметров, проверка гипотез, регрессионный анализ. Результатом освоения дисциплины будет понимание принципов работы методов статистического анализа данных и умение использовать методы в анализе реальных данных.
Типы в языках программирования
Системы типов являются неотъемлемой частью большинства современных языков программирования. Они обеспечивают безопасное взаимодействие различных частей программ, позволяя задавать спецификации, выражать инварианты и контролировать их сохранение. В рамках курса мы познакомимся с алгоритмами вывода и проверки типов для широкого класса типовых формализмов, включающих полиморфизм, наследование (подтипизацию), операторы над типами, рекурсивные и зависимые типы. Для каждой из систем мы обсудим минимальное количество типовых аннотаций в программе, необходимых для того, чтобы задачи проверки и вывода типов были бы алгоритмически разрешимыми.
Графические интерфейсы
Проектирование систем с графическим интерфейсом –– это исследование, планирование и разработка взаимодействия между человеком и машиной. Для программного обеспечения большинство интерфейсов имеют графическое представление, непосредственно с которым взаимодействует пользователь. Чтобы создавать такие системы, нужно четко понимать методологии проектирования и природу процесса, уметь подстраивать разработку под требуемую задачу. В курсе рассказываются основные подходы к исследованию предметной области и оценке интерфейсов, методологии проектирования и способы прототипирования, а также принципы и гайдлайны для современных платформ. На практике студенты выполняют собственный проект, цель которого пройти весь процесс проектирования системы от поиска проблемы до работающего прототипа.
Глубокое обучение
Глубокое обучение – популярная область, в которой используются нейронные сети сложной архитектуры. Такие системы дают лучшие результаты в таких областях как обработка изображений и видео, звука и текста. В курсе будут рассмотрены основные типы архитектур, принципы работы и обучения глубоких нейронных сетей. Помимо этого студенты получат практические навыки по вышеупомянутым областям применения.
Компиляторы
Данный курс представляет собой начальное введение в область языков программирования, компиляторов и других языковых инструментов. Будут сформулированы некоторые основные понятия и подходы в данной области, такие, как операционная семантика языков программирования, промежуточное представление программ, интерпретация, преобразования программ и т.д., и показано, как эти понятия и подходы решают важные и интересные практические задачи. Предполагается, что слушатели в процессе выполнения заданий к концу курса реализуют полноценный компилятор в машинный код для простого, но вполне функционального языка императивного программирования, содержащего выражения, присваивания, конструкции управления, функции и динамические структуры данных. В качестве основного инструмента в рамках курса будет использована cреда программирования OCaml.
Формальные языки
Теория формальных языков, помимо прочего, позволяет описывать некоторые структурированные данные (например, исходные коды программ) с математической строгостью. Это необходимо обработки таких данных и создания своих собственных форматов и языков программирования. Курс рассказывает о способах описания формальных языков (конечные автоматы, регулярные выражения, грамматики, нормальная форма Хомского, иерархия Хомского) и теоретических результатах (теорема Клини, леммы о разрастании, эквивалентность неограниченных грамматик машинам Тьюринга). На практиках требуется решать теоретические задачи.
Программирование на Java (часть 1)
Java — один из "классических" объектно-ориентированных языков с автоматическим управлением памяти, используемых в промышленной разработке. Для виртуальной машины Java существует огромное количество библиотек и дополнительных языков, которые несложно интегрировать друг с другом. Курс знакомит с объектно-ориентированным программированием в Java (классы, интерфейсы, абстрактные классы, модификаторы доступа), системой типов Java (примитивные/ссылочные типы, generics), исключениями, библиотеками ввода-вывода, коллекциями, потоками (streams), рефлексией и возможностями Java 8.
Программирование на Java (часть 2)
В этом курсе продолжается изучение языка программирования Java. Изучается многопоточное программирование (в том числе при помощи fork-join framework), модель памяти виртуальной машины Java, асинхронная работа с файлами и сетью при помощи NIO, а также механизм аннотаций. На практиках предлагается написать несколько проектов с используемых изученных технологий и пройти рецензирование кода.
Математическая логика
Математическая логика – раздел математики, изучающий доказуемость математических суждений, природу математического доказательства в целом, вычислимость и прочие аспекты оснований математики. Данный курс ставит цель ознакомить слушателей с основами математической логики. В курсе освещаются следующие базовые темы: логика высказываний, исчисление высказываний, языки первого порядка.
Компьютерная графика
Синтез изображений в реальном времени (Real-Time Rendering) - ключевая область компьютерной графики. Технологии синтеза изображений используются в системах виртуальной реальности и являются неотъемлемой частью подавляющего большинства тренажерных и игровых проектов. В рамка курса будут рассмотрены базовые элементы области синтеза изображений: основы фотометрии и радиометрии, модели освещения, преобразование проекций, визуализация отражений и теней. Курс имеет практический уклон и предполагает реализацию курсовых работа на основе OpenGL.
Вычислительная геометрия
Вычислительная геометрия -- это алгоритмы и структуры данных, "работающие" в геометрическом пространстве. Вычислительная геометрия является одной из базовых дисциплин для компьютерных игр, CAD, картографии, робототехники и т.д. Во вводном курсе вычислительной геометрии будут рассмотрены базовые алгоритмы и структуры данных. Практическая самостоятельная работа организована на платформе проведения соревнований по программированию (Яндекс.Контест).
Построение баз данных
В данном курсе изучается устройство различных типов СУБД, использующих различные модели данных. На занятиях мы рассмотрим архитектуры, компоненты и алгоритмы, применяющиеся в этих СУБД. Особое внимание будет уделено обработке запросов. В курсе будут затронуты реляционные системы (как централизованные, так и распределенные), колоночные СУБД, системы для обработки слабоструктурированных данных (на примере XML СУБД), объектные СУБД, многомерное индексирование и настройка физического уровня. На практических занятиях мы будем строить исполнитель запросов реляционной СУБД. Слушателям курса будет выдан базовый прототип и дан доступ в систему автоматического тестирования. От студентов ожидается знакомство с базами данных, умение программировать на языке C++ и опыт работы в unix-подобных системах.
Информационный поиск
Поиск информации, от поиска файлов на ноутбуке до поиска отелей на соответствующих веб-сайтах, давно стал частью нашей повседневной жизни. Курс рассматривает, как устроены подобные системы поиска информации: от сбора данных, их обработки и хранения, до ранжирования результатов по запросу пользователя и оценки качества этих результатов. После прохождения курса студенты будут знать основные методы работы поисковых систем и смогут создать собственную систему поиска информации с нуля.
Проектирование ПО
Большая часть программ, за которые люди готовы платить деньги, весьма сложна. Их уже не получается создавать "как придётся", в ходе их создания требуется принимать множество решений, многие из которых могут вступать в противоречия друг с другом, сильно затягивая и усложняя процесс разработки. Данный курс посвящён проектированию и архитектуре программного обеспечения. Что такое вообще архитектура и как она себя проявляет на разных этапах жизненного цикла ПО? Какие есть подходы к моделированию различных аспектов программного обеспечения? Что такое архитектурный шаблон и стиль, какие они бывают и для чего могут быть полезны на практике? В курсе также разбираются примеры архитектуры существующих открытых проектов.
Обучение с подкреплением
Обучение с подкреплением - это комплекс методов обучения различных агентных систем. Успехи обучения с подкреплением можно наблюдать во многих областях науки и индустрии: робототехнике, беспилотном транспорте, игровых системах. В курсе будут рассмотрены основные типы алгоритмов обучения с подкреплением, их принципы работы. Помимо этого студенты получат практические навыки по вышеупомянутым областям применения.
Анализ изображений
Анализ изображений — дисциплина, которая объединяет в себе различные задачи извлечения информации из изображений и видео, возникающие во множестве областей: от промышленности до кино. В курсе рассматриваются идеи и классические алгоритмы компьютерного зрения. Порядок изложения построен вокруг емкого примера — проблемы извлечения позиций камеры и 3D-структуры сцены из видео. Домашние задания представляют собой поэтапную реализацию приложения, решающего эту задачу.
Обработка естественного языка
Методы обработки естественного языка (ОЕЯ) находят сегодня применение во многих областях. В курсе рассматриваются базовые инструменты ОЕЯ -- морфологический и синтаксический анализ, языковые модели и лексическая семантика, а также популярные приложения — информационный и вопросно-ответный поиск, автоматическое реферирование, анализ тональности, извлечение информации и машинный перевод. Домашние задания позволяют получить практические навыки работы с текстовыми данными.
Мобильная разработка
Разработка мобильных приложений представляет собой одновременно интересную и сложную задачу из-за ограниченности ресурсов мобильных устройств, а также специфичности взаимодействия с пользователем. В рамках курса будут рассмотрены основные этапы проектирования, программирования, публикации и поддержки мобильных приложений. На практических занятиях студенты получат навыки разработки Android-приложений на языке Kotlin.
Алгоритмы в биоинформатике
Курс является вводным и покрывает следующие темы: историю исследования белковых структур, историю изучения ДНК, общее представление об алгоритмах выравнивания, поиска в базе данных и построение деревьев. Кроме того в курсе рассматривается применение скрытых марковских моделей, алгоритмы множественного выравнивания последовательностей и их оптимизация.
Статистика (часть 1)
Курс позволяет получить знания о базовых методах и подходах классической статистики. Понятие выборки. Генеральные и выборочные характеристики. Интервальное оценивание. Понятие доверительного интервала. Распределения, связанные с нормальными. Построение доверительных интервалов через центральные статистики. Проверка статистических гипотез. Общие подходы к построению статистических критериев. Понятие мощности, ошибок первого и второго рода. Понятие p-значения. Связь проверки статистических гипотез и построения доверительных интервалов. Проблема множественных сравнений: FWER, FDR, схемы критериев. Изложение ведется в первую очередь для объяснения "а почему оно так?", "какие предположения нужно сделать, чтобы это было верно?", "какие методы можно применить в данной ситуации?" и так далее.
Статистика (часть 2)
Продолжение курса "Статистика (часть 1)"
Биоинформатика (часть 1)
Курс посвящен знакомству с основными методами и направлениями в биоинформатике. Среди которых: работа с геномами и популяционные исследования, работа с данными РНК-секвенирования (сборка транскриптомов и анализ дифференциальной экспрессии), работа с протеомными данными -- анализ белкового состава, а так же методы биоинформатики и биофизики для создания лекарственных препаратов и дизайна молекул. Задания на курсе состоят из небольших проектов -- цель которых научить обрабатывать различные данные, а также делать выводы и писать отчеты по результатам работы.
Биоинформатика (часть 2)
Продолжение курса "Биоинформатика (часть 1)"
Молекулярная биология
Общая цель курса: познакомить студентов с базовыми понятиями молекулярной биологии, научить ориентироваться в научной литературе и понимать биологическую мотивацию и основные выводы из научных исследований. Курс посвящен общим аспектам строения клетки и различных процессов в ней. Помимо вопросов организации и функционирования генома, несколько занятий будет посвящено работе белков, их взаимосвязям и разнообразным молекулярным процессам в клетке.
В курсе будут чередоваться лекционные занятия и "семинары", в течение которых мы будем обсуждать разные интересные и актуальные вопросы.
Анализ данных секвенирования нового поколения
Данный курс посвящен обработке данных высокопроизводительного секвенирования для различных целей. Включая оценку качества данных секвенирования и коррекцию ошибок в прочтениях; геномную сборку и разрешение геномных повторов; выравнивание последовательностей на уже собранный референсный геном; cборку транскриптомов и анализ дифференциальной экспрессии генов.
Молекулярная филогенетика
Курс посвящен теоретических основам молекулярной эволюции биологических последовательностей и практическим методам работы с молекулярными данными для реконструкции эволюционной истории видов и отдельных популяций. Курс состоит из двух частей: 1) Молекулярная филогенетика. В этой части студенты знакомятся с основными методами построения филогенетических деревьев. 2) Генетика популяций. Лекции и семинары будут посвящены базовой эволюционной теории, генетике популяций и эволюционной геномике.
Метагеномика
В данном курсе обсуждаются вопросы существования метагеномных сообществ и особенностей их изучения и анализа; математических методов, на которых базируется программное обеспечение для обработки такого типа данных; вопросы секвенирования, основные задачи и проблемы в сборке метагеномов, биннинг и классификация результатов.