Открытый вебинар «Aсинхронное программирование» 21.08.2018 в 20:00 | OTUS
Проходил 21 августа 2018 года в 20:00

Открытый вебинар "Разработчик Java"
Aсинхронное программирование

Совместно с

Совместно с

Открытый вебинар онлайн

Вы узнаете, почему асинхронность позволяет делать код быстрым и эффективным, не используя сложные технологии распараллеливания. Рассмотрим примеры применения асинхронности для построения процессов обработки данных в бизнес-приложениях.
На вебинаре ждем Java программистов с опытом разработки от одного года/релевантным образованием.
Преподаватель
Владимир Сонькин

Запись

Совместно с

Совместно с

О курсе

Java Developer. Professional
152 000 ₽
6 месяцев
Начало 30 октября

Для кого этот курс?

  • Для программистов Java с практическим опытом разработки
  • Для программистов на других языках ООП с опытом разработки от 3-х лет


Необходимые знания

  • Опыт разработки на Java от 1 года / опыт разработки на другом языке от 3 лет (приветствуются любые языки ООП)
  • Понимание основных структур данных и алгоритмов
Программа курса
Модуль 1
Язык и платформа Java
Модуль 2
Проектирование
Модуль 3
Работа с окружением
Модуль 4
Spring
Модуль 5
Многопоточность
Модуль 6
Проектная работа
Язык и платформа Java
В этом модуле изучаются фундаментальные основы работы Java Virtual Machine (JVM) и "тонкие" аспекты языка Java. В результате обучения студент сможет достаточно подробно рассказать как выполняется Java программа и что проиходит "под капотом".
Подготовка к курсу. ДЗ
познакомиться с программой курса;
рассмотреть основные инструменты.
30 октября, 20:00 — 21:30
Лектор: Сергей Петрелевич
Домашние задания: 1
ДЗ
Проект gradle с модульной структурой. 1) Создайте аккаунт на github.com (если еще нет)
2) Создайте репозиторий для домашних работ
3) Сделайте checkout репозитория на свой компьютер
4) Создайте локальный бранч hw01-gradle
5) Создать проект gradle
6) В проект добавьте последнюю версию зависимости
```

com.google.guava
guava
```



7) Создайте модуль hw01-gradle
8) В модуле сделайте класс HelloOtus
9) В этом классе сделайте вызов какого-нибудь метода из guava
10) Создайте "толстый-jar"
11) Убедитесь, что "толстый-jar" запускается.
12) Сделайте pull-request в gitHub
13) Ссылку на PR отправьте на проверку (личный кабинет, чат с преподавателем).
Дополнение к gradle. Логирование.
углубить знания о gradle;
познакомиться с методами логирования в Java;
6 ноября, 20:00 — 21:30
Лектор: Сергей Петрелевич
QA и тестирование
познакомиться с junit и mockito;
объяснить на примере, что такое "тестируемое приложение".
11 ноября, 20:00 — 21:30
Контейнеры и алгоритмы. ДЗ
познакомиться с Generic-ами в Java и со стандартными коллекциями.
13 ноября, 20:00 — 21:30
Лектор: Павел Стрекалов
Домашние задания: 1
ДЗ
Применение коллекций. необходимо сделать todo в классах из пакета homework.
все тесты должны проходить.
предполагается использование встроенного в jdk функционала, поэтому реализация методов должна быть буквально из нескольких строк.
Инструменты для преобразования контейнеров, unsafe, jmh
объяснить на примере принципы создания коллекций;
познакомиться с пакетом unsafe, утилитой JMH и популярными библиотеками коллекций.
18 ноября, 20:00 — 21:30
Лектор: Сергей Петрелевич
Аннотации. ДЗ
познакомиться с механизмом Reflection;
объяснить, что такое Аннотации и как их можно сделать.
20 ноября, 20:00 — 21:30
Лектор: Павел Стрекалов
Домашние задания: 1
ДЗ
Свой тестовый фреймворк. Написать свой тестовый фреймворк.


Поддержать свои аннотации @Test, @Before, @After.


Запускать вызовом статического метода с именем класса с тестами.


**Т.е. надо сделать:**
1) создать три аннотации - @Test, @Before, @After.
2) Создать класс-тест, в котором будут методы, отмеченные аннотациями.
3) Создать "запускалку теста". На вход она должна получать имя класса с тестами, в котором следует найти и запустить методы отмеченные аннотациями и пункта 1.
4) Алгоритм запуска должен быть следующий::
метод(ы) Before
текущий метод Test
метод(ы) After
для каждой такой "тройки" надо создать СВОЙ экземпляр класса-теста.
5) Исключение в одном тесте не должно прерывать весь процесс тестирования.
6) На основании возникших во время тестирования исключений вывести статистику выполнения тестов (сколько прошло успешно, сколько упало, сколько было всего)
7) "Запускалка теста" не должна иметь состояние, но при этом весь функционал должен быть разбит на приватные методы.
Надо придумать, как передавать информацию между методами.
Lombok
познакомиться с технологиями annotation Processor и возможностями Lombok.
25 ноября, 20:00 — 21:30
Лектор: Вячеслав Лапин
Сборщик мусора. ДЗ
познакомиться со сборщиком мусора в Java.
27 ноября, 20:00 — 21:30
Лектор: Сергей Петрелевич
Домашние задания: 1
ДЗ
Определение нужного размера хипа. Есть готовое приложение (модуль homework)

Запустите его с размером хипа 256 Мб и посмотрите в логе время выполнения.


Пример вывода:

spend msec:18284, sec:18


Увеличьте размер хипа до 2Гб, замерьте время выполнения.

запусков записывайте в таблицу.

Определите оптимальный размер хипа, т.е. размер, превышение которого,
не приводит к сокращению времени выполнения приложения.


Оптимизируйте работу приложения.

Т.е. не меняя логики работы (но изменяя код), сделайте так, чтобы приложение работало быстро с минимальным хипом.

Повторите измерения времени выполнения программы для тех же значений размера хипа.
Java в Docker-е
на примере Docker-а познакомиться с особенностями запуска приложений на java в контейнере.
2 декабря, 20:00 — 21:30
Лектор: Сергей Петрелевич
Байт код, class-loader, инструментация, asm. ДЗ
познакомиться с принципами работы виртуальной машины Java, ClassLoader-ами и байт-кодом.
4 декабря, 20:00 — 21:30
Лектор: Сергей Петрелевич
Домашние задания: 1
ДЗ
Автоматическое логирование.. Разработайте такой функционал:
метод класса можно пометить самодельной аннотацией @Log, например, так:

```

class TestLogging implements TestLoggingInterface {
@Log
public void calculation(int param) {};
}
```


При вызове этого метода "автомагически" в консоль должны логироваться значения параметров.
Например так.

```

class Demo {
public void action() {
new TestLogging().calculation(6);
}
}

```


В консоле дожно быть:

`executed method: calculation, param: 6`


Обратите внимание: явного вызова логирования быть не должно.


Учтите, что аннотацию можно поставить, например, на такие методы:
```

public void calculation(int param1)
public void calculation(int param1, int param2)
public void calculation(int param1, int param2, String param3)
```


P.S.
Выбирайте реализацию с ASM, если действительно этого хотите и уверены в своих силах.
Функциональное программирование в Java
рассмотреть введение в функциональное программирование (ФП);
познакомиться с возможностями ФП, которые появились в Java 8.
9 декабря, 20:00 — 21:30
Проектирование
В этом модуле рассматриваются принципы проектирования SOLID и паттерны проектирования GOF.
В ходе выполнения Домашних Работ студент сможет на практике научиться применять паттерны проектирования и их комбинации.
Концепты проектирования ООП. ДЗ
объяснить принципы SOLID и общие критерии идеальной архитектуры.
11 декабря, 20:00 — 21:30
Лектор: Павел Стрекалов
Домашние задания: 1
ДЗ
Эмулятор банкомата. Написать эмулятор АТМ (банкомата).

Объект класса АТМ должен уметь:
- принимать банкноты разных номиналов (на каждый номинал должна быть своя ячейка)
- выдавать запрошенную сумму минимальным количеством банкнот или ошибку, если сумму нельзя выдать.
Это задание не на алгоритмы, а на проектирование.
Поэтому оптимизировать выдачу не надо.
- выдавать сумму остатка денежных средств

В этом задании больше думайте об архитектуре приложения.
Не отвлекайтесь на создание таких объектов как: пользователь, авторизация, клавиатура, дисплей, UI (консольный, Web, Swing), валюта, счет, карта, т.д.
Все это не только не нужно, но и вредно!
Creational patterns
рассмотреть "создающие" паттерны проектирования.
16 декабря, 20:00 — 21:30
Лектор: Павел Стрекалов
Behavioral patterns
объяснить поведенческие паттерны проектирования.
18 декабря, 20:00 — 21:30
Structural patterns. ДЗ
рассмотреть структурные паттерны проектирования.
23 декабря, 20:00 — 21:30
Домашние задания: 1
ДЗ
Обработчик сообщений. Реализовать todo из модуля homework.
Работа с окружением
Этот блок посвящен вопросам взаимодействия java-приложения с внешним миром.

Рассматриваются операции с файловой системой, механизмы сериализации/десериализации объектов.

Большое внимание уделяется работе с реляционными базами данных. Подробно изучаются jdbc и Hibernate. При этом не забываем про noSQL. В качестве примера работы с noSQL рассматривается реактивное взаимодействие с MongoDb.

Особое внимание уделяется разработке Web-серверов. Изучаем TomCat как пример контейнера war-приложений и Jetty - как встроенный web-сервер, учимся применять технологию web-сокетов.

В качестве примера Dependency Injection изучаем Spring и Spring Boot.
Сериализация. ДЗ
познакомиться с функционалом сериализации объектов.
25 декабря, 20:00 — 21:30
Лектор: Сергей Петрелевич
Домашние задания: 1
ДЗ
Обработчик json-ов. Некая система:
- принимает входящий json файл;
- обрабатывает данные из файла;
- формирует ответный файл.

Нужно реализовать недостающий функционал
Более подробно смотрите в примерах к вебинару.
NIO - операции с файлами
познакомиться с NIO.
13 января, 20:00 — 21:30
Лектор: Сергей Петрелевич
JDBC. ДЗ
познакомиться с транзакцией в реляционной СУБД и jdbc.
15 января, 20:00 — 21:30
Домашние задания: 1
ДЗ
Самодельный ORM. Работа должна использовать базу данных в docker-контейнере .

В модуле homework реализуйте классы:
- EntityClassMetaData
- EntitySQLMetaData
- DataTemplateJdbc

Метод main в классе HomeWork должен работать без ошибок.
Общие вопросы работы с СУБД, архитектура РСУБД
оптимизировать SQL-запросы.
20 января, 20:00 — 21:30
Лектор: Павел Стрекалов
Hibernate
познакомиться с Hibernate.
22 января, 20:00 — 21:30
Лектор: Александр Оруджев
JPQL. ДЗ
проанализировать методы конструирования запросов в Hibernate.
27 января, 20:00 — 21:30
Лектор: Александр Оруджев
Домашние задания: 1
ДЗ
Использование Hibernate. Работа должна использовать базу данных в docker-контейнере .

За основу возьмите пример из вебинара про JPQL (class DbServiceDemo).
Добавьте в Client поля:
адрес (OneToOne)
class Address {
private String street;
}
и телефон (OneToMany)
class Phone {
private String number;
}

Разметьте классы таким образом, чтобы при сохранении/чтении объека Client каскадно сохранялись/читались вложенные объекты.


ВАЖНО.
1) Hibernate должен создать только три таблицы: для телефонов, адресов и клиентов.
2) При сохранении нового объекта не должно быть update-ов.
Посмотрите в логи и проверьте, что эти два требования выполняются.
Типы ссылок. Кэширование. ДЗ
объяснить, какие в java есть виды ссылок и для чего они нужны;
оценить, как устроены кэши;
познакомиться с "промышленным" кэшом Ehcache.
29 января, 20:00 — 21:30
Лектор: Сергей Петрелевич
Домашние задания: 1
ДЗ
Свой cache engine . Закончите реализацию MyCache из вебинара.
Используйте WeakHashMap для хранения значений.

Добавьте кэширование в DBService из задания про Hibernate ORM или "Самодельный ORM".
Для простоты скопируйте нужные классы в это ДЗ.

Убедитесь, что ваш кэш действительно работает быстрее СУБД и сбрасывается при недостатке памяти.
Знакомство с Redis
Познакомиться с Redis и его основными возможностями
3 февраля, 20:00 — 21:30
Лектор: Сергей Петрелевич
Web сервер. ДЗ
объяснить на примере Jetty принципы работы Web-сервера и servlet API.
5 февраля, 20:00 — 21:30
Лектор: Александр Оруджев
Домашние задания: 1
ДЗ
Веб сервер. Встроить веб-сервер в приложение из ДЗ про Hibernate ORM (или в пример из вебинара встроить ДЗ про Hibernate :))
Сделать стартовую страницу, на которой админ должен аутентифицироваться;
Сделать админскую страницу для работы с клиентами;
На этой странице должны быть доступны следующие функции:
- создать клиента
- получить список клиентов.
Spring
Модуль посвящен изучению основ Spring Framework.
В этом модуле разберемся в принципах DI, IoC, поймем как это используется в Spring.
Изучим как на технологиях Spring-а создать Web-приложение с базой данных.
Dependency injection. ДЗ
объяснить фундаментальные основы Inversion of Control (IoC) и Dependency Injection (DI).
10 февраля, 20:00 — 21:30
Лектор: Александр Оруджев
Домашние задания: 1
ДЗ
Домашнее задание (Собственный IoC контейнер). Обязательная часть:

- Скачать заготовку приложения тренажера таблицы умножения из репозитория с примерами
- В классе AppComponentsContainerImpl реализовать обработку, полученной в конструкторе конфигурации, основываясь на разметке аннотациями из пакета appcontainer.
Так же необходимо реализовать методы getAppComponent
- В итоге должно получиться работающее приложение. Менять можно только
класс AppComponentsContainerImpl

Дополнительное задание (можно не делать):
- Разделить AppConfig на несколько классов и распределить по ним создание компонентов. В AppComponentsContainerImpl добавить конструктор, который обрабатывает несколько классов-конфигураций

Дополнительное задание (можно не делать):
- В AppComponentsContainerImpl добавить конструктор, который принимает на вход имя пакета, и обрабатывает все имеющиеся там классы-конфигурации (см. зависимости в pom.xml)
Spring Boot. Spring MVC
познакомиться со Spring Boot;
объяснить, что такое Spring Boot и как им пользоваться;
объяснить Spring MVC.
12 февраля, 20:00 — 21:30
Лектор: Александр Оруджев
Asynchronous Web applications
познакомиться с устройством стартеров Spring Boot;
объяснить как можно сделать асинхронный web-сервис на java.
17 февраля, 20:00 — 21:30
Spring Data Jdbc. ДЗ
познакомиться с фреймворком Spring Data Jdbc.
19 февраля, 20:00 — 21:30
Лектор: Сергей Петрелевич
Домашние задания: 1
ДЗ
Веб-приложение на Spring Boot. - Взять за основу ДЗ к вебинару Занятие «Web сервер. ДЗ», но без страница логина;
- Вместо Jetty использовать Spring Boot;
- Работу с базой данных реализовать на Spring Data Jdbc;
- В качестве движка шаблонов использовать Thymeleaf;
Если Thymeleaf не нравится, используйте чистый HTML и JavaScript.

Авторизацию и аутентификацию делать не надо.
Многопоточность
Этот модуль посвящен многопоточности в разных ее проявлениях.
Начинаем изучение с разбора Java Memory Model, какова цель ее создания, что решается и как это использовать.
Заканчиваем Completable Future.
Начинаем разрабатывать многопоточные приложения и переходим к разработке многопроцессорных приложений - приложения, отдельные части которых работают на разных хостах.

Чтобы понять как объединить такие приложения, изучаем блокирующие и неблокирующие сокеты (NIO).
Thread
познакомиться с основными принципами многопоточности;
объяснить как управлять потоками в Java.
3 марта, 20:00 — 21:30
Лектор: Павел Стрекалов
JMM
познакомиться с основными проблемами многопоточности;
объяснить зачем придумали JMM;
рассмотреть основные положения JMM.
5 марта, 20:00 — 21:30
Лектор: Сергей Петрелевич
Executors. ДЗ
познакомиться с пулами потоков в Java.
10 марта, 20:00 — 21:30
Лектор: Павел Стрекалов
Домашние задания: 1
ДЗ
Последовательность чисел. Два потока печатают числа от 1 до 10, потом от 10 до 1.
Надо сделать так, чтобы числа чередовались, т.е. получился такой вывод:
Поток 1:1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1 2 3 4....
Поток 2: 1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1 2 3....

Всегда должен начинать Поток 1.
Потокобезопасные коллекции. ДЗ
познакомиться с потокобезопасными контейнерами;
познакомиться с паттерном - "система обмена сообщениями".
12 марта, 20:00 — 21:30
Лектор: Александр Оруджев
Домашние задания: 1
ДЗ
Queues. Реализовать SensorDataProcessorBuffered из примера к вебинару, представляющий из себя класс,
который накапливает внутри себя данные, в порядке времени измерения, а при достижении заданного размера буфера
выполняет запись этого буфера с помощью метода flush и зависимости SensorDataBufferedWriter.
Тесты внутри SensorDataProcessorBufferedTest должны проходить
Многопроцессные приложения. ДЗ
проанализировать сетевое взаимодействие в java;
объяснить принципы работы "клиент-серверного" приложения в Java.
17 марта, 20:00 — 21:30
Лектор: Александр Оруджев
Домашние задания: 1
ДЗ
gRPC клиент-серверное приложение или "Убить босса". Разработать клиент-серверное приложение с применением технологии gRPC.

1) Серверная часть.
сервер по запросу клиента генерирует последовательность чисел.
запрос от клиента содержит начальное значение (firstValue) и конечное(lastValue).
Раз в две секунды сервер генерирует новое значение и "стримит" его клиенту:
firstValue + 1
firstValue + 2
...
lastValue

2) Клиентская часть.
клиент отправдяет запрос серверу для получения последовательности чисел от 0 до 30.
клиент запускает цикл от 0 до 50.
раз в секунду выводит в консоль число (currentValue) по такой формуле:
currentValue = [currentValue] + [ПОСЛЕДНЕЕ число от сервера] + 1
начальное значение: currentValue = 0
Число, полученное от сервера должно учитываться только один раз.
Обратите внимание, сервер может вернуть несколько чисел, надо взять именно ПОСЛЕДНЕЕ.


Должно получиться примерно так:
currentValue:1
число от сервера:2
currentValue:4 <--- число от сервера учитываем только один раз
currentValue:5 <--- тут число от сервера уже не учитывается.
число от сервера:3
currentValue:9
currentValue:10
new value:4
currentValue:15
currentValue:16

Для коммуникации используйте gRPC.
Клиент и сервер не обязательно разделять по модулям.
Можно сделать один модуль с двумя main-классами для клиента и сервера.

Пример лога работы клиента (new value - это значение полученное от сервера)

21:44:04.782 [main] INFO ru.otus.numbers.client.NumbersClient - numbers Client is starting...
21:44:04.932 [main] INFO ru.otus.numbers.client.NumbersClient - currentValue:1
21:44:05.140 [grpc-default-executor-0] INFO r.o.n.client.ClientStreamObserver - new value:2
21:44:05.933 [main] INFO ru.otus.numbers.client.NumbersClient - currentValue:4
21:44:06.933 [main] INFO ru.otus.numbers.client.NumbersClient - currentValue:5
21:44:07.113 [grpc-default-executor-0] INFO r.o.n.client.ClientStreamObserver - new value:3
21:44:07.934 [main] INFO ru.otus.numbers.client.NumbersClient - currentValue:9
21:44:08.934 [main] INFO ru.otus.numbers.client.NumbersClient - currentValue:10
21:44:09.112 [grpc-default-executor-0] INFO r.o.n.client.ClientStreamObserver - new value:4
21:44:09.935 [main] INFO ru.otus.numbers.client.NumbersClient - currentValue:15
21:44:10.935 [main] INFO ru.otus.numbers.client.NumbersClient - currentValue:16
21:44:11.113 [grpc-default-executor-0] INFO r.o.n.client.ClientStreamObserver - new value:5
21:44:11.935 [main] INFO ru.otus.numbers.client.NumbersClient - currentValue:22
21:44:12.936 [main] INFO ru.otus.numbers.client.NumbersClient - currentValue:23
21:44:13.113 [grpc-default-executor-0] INFO r.o.n.client.ClientStreamObserver - new value:6
21:44:13.936 [main] INFO ru.otus.numbers.client.NumbersClient - currentValue:30
21:44:14.937 [main] INFO ru.otus.numbers.client.NumbersClient - currentValue:31
21:44:15.114 [grpc-default-executor-0] INFO r.o.n.client.ClientStreamObserver - new value:7
21:44:15.938 [main] INFO ru.otus.numbers.client.NumbersClient - currentValue:39
21:44:16.938 [main] INFO ru.otus.numbers.client.NumbersClient - currentValue:40
21:44:17.113 [grpc-default-executor-0] INFO r.o.n.client.ClientStreamObserver - new value:8
21:44:17.939 [main] INFO ru.otus.numbers.client.NumbersClient - currentValue:49
21:44:18.939 [main] INFO ru.otus.numbers.client.NumbersClient - currentValue:50
21:44:19.113 [grpc-default-executor-0] INFO r.o.n.client.ClientStreamObserver - new value:9
21:44:19.940 [main] INFO ru.otus.numbers.client.NumbersClient - currentValue:60
21:44:20.940 [main] INFO ru.otus.numbers.client.NumbersClient - currentValue:61
21:44:21.114 [grpc-default-executor-0] INFO r.o.n.client.ClientStreamObserver - new value:10
21:44:21.119 [grpc-default-executor-0] INFO r.o.n.client.ClientStreamObserver - request completed
Применение RabbitMQ
познакомиться с очередями на примере RabbitMQ и SpringBoot.
19 марта, 20:00 — 21:30
Лектор: Александр Оруджев
NIO
рассмотреть основы сетевых возможностей NIO.
24 марта, 20:00 — 21:30
Лектор: Сергей Петрелевич
Netty
рассмотреть основные принципы работы Netty.
26 марта, 20:00 — 21:30
Лектор: Сергей Петрелевич
Реактивное программирование. Spring Webflux. ДЗ
познакомиться с реактивным программированием в Java.
31 марта, 20:00 — 21:30
Лектор: Сергей Петрелевич
Домашние задания: 1
ДЗ
Комната 1408. В чат из примера к вебинару добавьте специальную комнату: 1408.

В этой комнате нельзя отправлять сообщения.
Однако в нее приходят все сообщения из всех других комнат.

Обратите внимание:
при входе в комнату 1408 должны загрузиться все сообщения из всех комнат (по аналогии с типовыми комнатами).
Применение Kafka
познакомиться с платформой Kafka и возможностями применения в приложениях на java.
2 апреля, 20:00 — 21:30
Лектор: Сергей Петрелевич
Проектная работа
Заключительный месяц курса посвящен проектной работе. Свой проект - это то, что интересно писать студенту. То, что можно создать на основе знаний, полученных на курсе.
При этом не обязательно закончить его за месяц, однако к защите надо разработать действующий прототип, который пояснит идею проекта.

В процессе написания по проекту можно получить консультации преподавателей.

Для достижения результата работа над проектом организуется в виде недельных итераций.

Проект должен стать примером кода, который можно показывать потенциальным работодателям.

Студент может самостоятельно выбрать технологии из числа изученных на курсе и/или использовать что-то дополнительно.

Примеры тем:
- телеграм-бот
- распределенный кэш
- web сервер (разберите протокол)
- socket сервер на NIO (как netty)
- свой ORM
- кэш для hibernate
Основы CI/CD
познакомиться с основами развертывания приложения.
7 апреля, 20:00 — 21:30
Лектор: Павел Стрекалов
Домашние задания: 1
ДЗ
Проектная работа. Заключительный месяц курса посвящен проектной работе. Свой проект это то, что интересно писать студенту. То, что можно создать на основе знаний, полученных на курсе.
При этом не обязательно закончить его за месяц. В процессе написания по проекту можно получить консультации преподавателей.

Проект должен стать примером кода, который можно показывать потенциальным работодателям.

Примеры тем проекта:
- web сервер (разберите протокол)
- socket сервер на NIO (как netty)
- свой ORM
- распределенный кэш
- кэш для hibernate
Знакомство с Kubernetes
узнать, что такое Kubernetes и чем он полезен java-разработчику.
9 апреля, 20:00 — 21:30
Лектор: Сергей Петрелевич
Защита проектных работ
защитить проект и получить рекомендации экспертов.
14 апреля, 20:00 — 21:30
Лектор: Александр Оруджев

Преподаватель

Владимир Сонькин
Luxoft Training Center
Эксперт по направлению Java и Web и тренер в Учебном Центре Люксофт. Более 4 лет разрабатывает и ведет курсы по Java и Web-технологиям. До этого более 7 лет работал программистом в Люксофт, разрабатывал системы для крупнейшего швейцарского банка UBS, авиастроительной компании Boeing, сельскохозяйственной компании Bunge и других крупных заказчиков. С технологиями Java Enterprise и JavaScript профессионально работает с 2000 года.
В 2000 году закончил ВМК МГУ, кафедру алгоритмических языков, занимался искусственным интеллектом и нейронными сетями.