Разработка программного обеспечения
Алгоритмы и анализ данных в биоинформатике
Факультативы
5 курс

Осенний семестр

Алгоритмы и структуры данных (часть 1)

Комбинаторика и теория графов

Основы программной инженерии

Эмоциональный интеллект

Базы данных

Введение в Unix и скриптовые языки

Программирование на C++

Функциональное программирование

Операционные системы

Креативные технологии

Иностранный язык в профессиональной деятельности (часть 1)


Весенний семестр

Алгоритмы и структуры данных (часть 2)

Машинное обучение

Проектирование ПО

Формальные языки

Дополнительные разделы C++

Программирование на Java (часть 1)

Математическая логика

Математическая статистика

Типы в языках программирования

Иностранный язык в профессиональной деятельности (часть 2)


6 курс

Осенний семестр

Параллельное программирование

Программирование на Java (часть 2)

Компьютерная графика

Вычислительная геометрия

Альтернативные языки для JVM

Построение баз данных

Графические интерфейсы

Глубокое обучение

Дополнительные разделы машинного обучения

Информационный поиск

Виртуальные машины

Компиляторы

Программирование с зависимыми типами

5 курс

Осенний семестр

Алгоритмы и структуры данных (часть 1)

Комбинаторика и теория графов

Основы программной инженерии

Эмоциональный интеллект

Базы данных

Введение в Unix и скриптовые языки

Программирование на C++

Функциональное программирование

Операционные системы

Креативные технологии

Иностранный язык в профессиональной деятельности (часть 1)


Весенний семестр

Алгоритмы и структуры данных (часть 2)

Машинное обучение

Проектирование ПО

Дополнительные разделы C++

Иностранный язык в профессиональной деятельности (часть 2)

Биоинформатика (часть 1)

Алгоритмы в биоинформатике

Статистика (часть 1)


6 курс

Осенний семестр

Параллельное программирование

Дополнительные разделы машинного обучения

Биоинформатика (часть 2)

Статистика (часть 2)

Молекулярная биология

Анализ данных секвенирования нового поколения
Тестирование ПО

Численные методы

Обучение с подкреплением

Анализ изображений

Технологии компьютерных сетей

Обработка естественного языка

Распознавание и генерация речи

Дополнительные разделы вычислительной геометрии

Мобильная разработка

Программная инженерия больших данных

Семантика языков программирования

Теория категорий

Безопасность ICO контрактов

Молекулярная филогенетика

Метагеномика


Алгоритмы и структуры данных (часть 1)
При создании программ важно уметь строго доказывать корректность их работы, оценивать скорость ещё на стадии проектирования, а также предотвращать ошибки в крайних случаях. Этот курс знакомит слушателей с некоторыми стандартными алгоритмами (сортировки, разделяй-и-властвуй, динамическое программирование) и структурами данных (кучи, хэш-таблицы), на которых можно тренироваться в реализации нетривиальной логики программы. Помимо знакомства, студенты учатся разрабатывать новые алгоритмы и доказывать их корректность. В качестве практики потребуется реализовать созданные алгоритмы в виде программы, решающей конкретную задачу, и сдать через автоматическую систему проверки.
Алгоритмы и структуры данных (часть 2)
Этот курс продолжает изучение стандартных алгоритмов и структур данных. Изучаются и доказываются алгоритмы на графах, жадные алгоритмы (поиска кратчайшего пути, минимального остовного дерева, эйлерова/гамильтонова путей) и более мощные структуры данных (самобалансирующиеся деревья поиска, персистентные структуры данных, link-cut-tree). Все темы также требуют решения теоретических задач на разработку алгоритмов и сдачи реализованных программ через автоматическую систему проверки.
Машинное обучение
Машинное обучение - подход к решению задачи, в котором вместо прямого задания аналитического или вычислительного метода, мы задаем общий вид решения и алгоритм подбора точного вида. В курсе будут рассмотрены основные типы алгоритмов, принципы их работы и обучения. Помимо этого студенты получат практические навыки по вышеупомянутым областям применения.
Базы данных
Реляционные базы данных были и остаются самым популярным средством хранения информации со сложной структурой, а принципы, лежащие в основе реляционных СУБД, широко применяются во многих областях информационных технологий. В этом курсе рассматриваются теоретические основы функционирования реляционных систем и даётся практическая подготовка по проектированию и использованию реляционных баз данных в прикладных приложениях.
Параллельное программирование
Высокопроизводительные вычисления (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.