SlideShare a Scribd company logo
1 of 64
www.luxoft.com
ENTERPRISE БЕЗ ТОРМОЗОВ
www.luxoft.com
Пара слов обо мне
- работаю в «Люксофте» с 2013 г.
- пишу на Java
- люблю разбираться с проблемами производительности
Связаться со мной можно
- написав на корпоративную почту stsypanov@luxoft.com
- написав на личную почту sergei.tsypanov@yandex.ru
- написав ВК https://vk.com/sergei.tsypanov
- написав ФБ https://www.facebook.com/sergei.tsypanov
www.luxoft.com
Вычислительная сложность
Каноническое определение звучит так:
Вычислительная сложность — понятие в информатике и теории алгоритмов, обозначающее функцию зависимости
объёма работы, которая выполняется некоторым алгоритмом, от размера входных данных.
https://ru.wikipedia.org/wiki/Вычислительная_сложность
www.luxoft.com
Итак, разминка
Ваши мысли?
www.luxoft.com
А так?
Для пропуска блока if необходимо и достаточно, чтобы только один из операндов был false.
Обратите внимание, что метод checkFlags выполняется значительно быстрее, чем определение значения
переменной hasGoodRating.
www.luxoft.com
Меняем порядок операндов
… а обращение к БД обернём в предикат
(можно и в метод, но предикат – это функционально, стильно, модно, молодёжно)
Это позволяет отложить запрос до того времени, когда он станет действительно необходимым.
www.luxoft.com
Пример посерьёзнее
В базу один за другим летят три запроса, при том, что
далеко не всегда все три необходимы.
www.luxoft.com
Почему так? Или пятиминутка скучной теории
В худшем случае мы
ничего не теряем
В лучшем случае
достаточно
вызвать лишь
одни метод
www.luxoft.com
Так лучше
www.luxoft.com
Менее очевидный пример
Здесь нет ветвления, однако обращение к базе всё ещё можно отложить.
www.luxoft.com
Используем fast return
В лучшем случае мы обойдёмся без обращения к БД, в худшем мы ничего не потеряем.
www.luxoft.com
Ещё менее очевидный пример
На первый взгляд, разницы нет.
…но посмотри ещё раз…
Сравним:
и
www.luxoft.com
Не всё так просто
Метод getAnotherValue
вызывается всегда
Метод getAnotherValue
вызывается только при наличии
пустого Optional-а
www.luxoft.com
1 ПРАВИЛО КЛУБА:
ЕСЛИ МЕДЛЕННОЕ ДЕЙСТВИЕ
МОЖНО ОТЛОЖИТЬ – ОТЛОЖИ ЕГО.
ВОЗМОЖНО, ДЕЛАТЬ ЕГО ВОВСЕ НЕ
ПРИДЁТСЯ.
Действия лучше выполнять в
порядке возрастания их сложности.
www.luxoft.com
Едем дальше
«Понабирали по объявлению» (с)
www.luxoft.com
Присмотрись внимательнее
Количество обращений к репозиторию
равно количеству DTO в списке
Чтобы отбросить повторяющиеся
сущности, используется Set
Множественные запросы к БД?
HashSet там где достаточно ArrayList-а?
Не отчаивайся, $USER, выход есть
www.luxoft.com
Грузите апельсины бочками
Посчитаем для списка из 10 ID…
Сначала собираем
все ID в список
Потом достаём данные
одним запросом
www.luxoft.com
Разница почти в 10 раз
Запросы в цикле
Один запрос
www.luxoft.com
Правило можно повернуть в обратную сторону
Вместо чтения будем записывать в БД:
www.luxoft.com
Раз проблема та же, то и решение то же
Ведь работает же 
www.luxoft.com
Почему так? Или пятиминутка скучной теории
Что происходит под капотом?
1 Получаем сессию
2 Открываем транзакцию
3 Работаем
4 Завершаем транзакцию
5 Закрываем сессию
Это шаблон session-per-request (https://developer.jboss.org/wiki/Sessionsandtransactions)
www.luxoft.com
Почувствуйте разницу…
Указанные действия выполняются при каждом
вызове repository.findOne(ID), т. е.
вычислительная сложность равна О(n)
При вызове repository.findAll(Iterable<ID>)
указанные действия выполняются всегда один раз, т. е.
вычислительная сложность равна О(1)
www.luxoft.com
2 ПРАВИЛО КЛУБА:
ГРАБЬ, ВОРУЙ, …
СОБИРАЙ И ВЛАСТВУЙ.
Однотипные действия, которые
выполняются в цикле, часто можно
выполнить за один проход, особенно
когда речь идёт о запросах в БД.
www.luxoft.com
Внезапно вернёмся к первому примеру
Таким мы его запомнили:
www.luxoft.com
А что если…
…его можно сделать ещё чуточку лучше?
Самую малость…
Ведь осталась ещё одна проблема.
www.luxoft.com
А что это у нас в третьей строке?
У свеженайденной сущности мы берём сущность-дочку, а потом – сущность-внучку.
…дочка за внучку, внучка за Жучку, и вытащили они – нет, не репку, – а полновесный
OutOfMemoryError…
www.luxoft.com
Шутка,
OutOfMemoryError на таком примере не выловить, однако это вполне жизненный пример анти-паттерна под
замысловатым названием Circuitous Treasure Hunt.
Его определение:
Occurs when an object must look in several places to find the information that it needs. If a large amount of
processing is required for each look (i.e. a database access), performance will suffer.
Способ борьбы прост: не размазывайте логику.
www.luxoft.com
Выход есть
Достанем рейтинг напрямую, минуя дочку и внучку:
Подправим предикат:
www.luxoft.com
Измерим
До
После
www.luxoft.com
90 миллисекунд? Серьёзно?
www.luxoft.com
Пятиминутка арифметической объективности
1 проход = 90 мс ≈ 1 фигня
10 проходов = 900 мс ≈ 1 с
100 проходов = 9000 мс = 9 с
1000 проходов = 90000 мс = 90 с = 1,5 минуты
С уважением,
ваш Кэп
www.luxoft.com
Обратите внимание
Ускорение на 90 мс достигается в худшем случае, т.е. при проверке обоих условий:
В лучшем случае первое условие скажет решительное «нет» уронив общее время выполнения почти до нуля, т. е.
выигрыш составит около 200 мс.
www.luxoft.com
И наша арифметика засияет новыми красками
1 проход = 200 мс ≈ 1 фигня
10 проходов = 2000 мс ≈ 2 с
100 проходов = 20000 мс = 20 с
1000 проходов = 200000 мс = 200 с = 3 минуты 20 секунд
www.luxoft.com
Пока верстался номер…
Entity достаётся
целиком, при том
что нужен только её
ID
Переменная movedOut
используется только
внутри блока if
www.luxoft.com
Перепишем
Был такой запрос:
А стал запрос:
Переменная
movedOut
ограничена блоком
if
www.luxoft.com
3 ПРАВИЛО КЛУБА:
КОСИ И ЗАБИВАЙ …
НЕ ДЕЛАЙ ЛИШНЮЮ РАБОТУ ТАМ,
ГДЕ ЕЁ МОЖНО НЕ ДЕЛАТЬ.
ДЕЛАЙ ВСЁ В ОДНОМ МЕСТЕ.
www.luxoft.com
Несложный, но важный пример
www.luxoft.com
Что скажете?
отсеиваем лишнее
и ещё раз отсеиваем лишнее
А теперь, внимание, вопрос:
Что мешает выбрать нужные данные сразу?
Можете ли вы с первого взгляда понять, что делают последние 3 строки?
www.luxoft.com
Переложим логику на мощные плечи БД
Обратите внимание, насколько лаконичнее и выразительнее стал код
www.luxoft.com
4 ПРАВИЛО КЛУБА:
НЕ ДЕЛАЙТЕ ТОГО, ЧТО МОЖЕТ ЗА
ВАС СДЕЛАТЬ БД.
Если задача состоит в поиске
данных и отсеивании лишнего –
делайте это с помощью базы. Она
специально заточена под это.
www.luxoft.com
На мой взгляд, самый необычный пример
www.luxoft.com
Внезапно
Транзакция открывается как для «хороших», так и для «плохих» данных.
Если данные «плохие», то транзакция тут же откатывается.
А зачем нам в таком случае транзакция?
Achtung !!!
www.luxoft.com
Что можно с этим сделать?
Испечём «Наполеон»: всю транзакционную логику перенесём во внутренний сервис, а всю логику проверки оставим во
внешнем сервисе. Таким образом, транзакция становится ленивой:
Транзакция открывается
только тогда, когда данные
проверены
Внешний сервис более не
является транзакционным
www.luxoft.com
Считаем
До
После
www.luxoft.com
«Наполеон», он же шаблон Service Layers
https://en.wikipedia.org/wiki/Service_layers_pattern
• проще писать
• легче читать
• проще тестировать
• легче поддерживать
• проще рефакторить
И это просто вкусно 
www.luxoft.com
5 ПРАВИЛО КЛУБА:
РАЗДЕЛЯЙ И ВЛАСТВУЙ.
УВЕЛИЧИВ КОЛИЧЕСТВО СЛОЁВ,
ПРИЛОЖЕНИЕ ЛЕГЧЕ ТЕСТИРОВАТЬ
И ОНО (В НЕКОТОРЫХ СЛУЧАЯХ)
СТАНОВИТСЯ БОЛЕЕ
ОТЗЫВЧИВЫМ.
www.luxoft.com
Лирическо-логическое отступление
<режим-капитана-очевидности>
В JVM существует сборщик мусора (GC), который включается, когда приложению не хватает памяти.
Иногда работа GC приводит к stop-the-world задержкам в работе приложения.
GC освобождает память и не даёт приложению голодать, но всё имеет свою цену.
В обмен на помощь в освобождении памяти GC берёт дань процессорным временем.
Таким образом, если доступная вычислительная мощность равна 1, а GC отнимает у нас х, то приложению
остаётся лишь 1 - х вычислительной мощности.
Отсюда вывод: производительность можно повысить, если уменьшить дань, забираемую GC.
</режим-капитана-очевидности>
www.luxoft.com
Немного отвлечёмся от вычислительной сложности
Небольшое пояснение: это общий предок для около 50 сущностей одного из приложений.
Метод includeInAudit() вызывается при изменении значений некоторых полей, и вызывается он очень часто
www.luxoft.com
Вернёмся к нашим баранам
На основе реальных событий: в результате 1 действия 1 пользователя данный метод вызывается 3,5 тыс. раз
И при каждом вызове метода
создаётся HashSet…
www.luxoft.com
Пятиминутка арифметики:
Пустой HashSet в 64-разрядной JVM «весит» 240* 80** байт.
Путём сложнейших вычислений определим, что 3,5 тыс. пустых (берём по нижней границе) HashSet-ов «весят» 820
273 кБ.
И это 1 действие 1 пользователя…
* Накладные расходы памяти у коллекций https://habrahabr.ru/post/159557/ (внимание, Java 6)
** Oracle HotSpot JVM x64 (Java 8)
www.luxoft.com
Присмотримся внимательнее
…и обнаружим, что по завершении цикла переменная drafts может иметь только 4 состояния:
• пустая коллекция
• коллекция, содержащая OLD_DRAFT
• коллекция, содержащая NEW_DRAFT
• коллекция, содержащая обе записи
www.luxoft.com
Перепишем
определим все
возможные
состояния
вместо добавления
объектов используем
уже созданные
коллекции
www.luxoft.com
Ещё пример
Так делать не стоит:
Бессмысленно создавать новую коллекцию при каждом вызове метода, тем более что создаётся она
только для чтения. Ничто не мешает сделать коллекцию постоянной.
www.luxoft.com
Стоит делать вот так
www.luxoft.com
Не сразу бросается в глаза
Как видим, формат даты не зависит от аргументов метода, поэтому его повторное создание при каждом
вызове метода бессмысленно.
Обратите внимание, что java.text.SimpleDateFormat не является потокобезопасным, поэтому его
необходимо оборачивать в ThreadLocal.
www.luxoft.com
Перепишем
Объект создаётся лишь
единожды при
обращении к get()
www.luxoft.com
6 ПРАВИЛО КЛУБА:
ЧИСТО НЕ ТАМ, ГДЕ УБИРАЮТ,
А ТАМ, ГДЕ НЕ МУСОРЯТ.
Кэшируйте всё, что можно и не
превращайте приложение в помойку.
www.luxoft.com
Задачка по структурам данных:
найди вложенный цикл
www.luxoft.com
Внезапно
Ничто не предвещало беды…
…окромя того, что сложность поиска в списке равна О(n)
www.luxoft.com
Сравнение поиска в списке и наборе
0.008 0.062 0.527 5.896 56.757
2106.069
15126.756
0.007 0.006 0.006 0.007 0.006 0.007 0.007
0
2,000
4,000
6,000
8,000
10,000
12,000
14,000
16,000
10 100 1000 10000 100000 1000000 10000000
ArrayList.contains
HashSet.contains
мкс
Количество элементов
www.luxoft.com
Закономерно возникает вопрос
Если поиск в наборе настолько эффективнее поиска по
списку, то стоит ли оборачивать в Set полученный в
качестве аргумента список/массив?
Есть только один способ выяснить это – проверить.
www.luxoft.com
Вывод: игра не стоит свеч
0.008 0.062 0.527 5.896 56.757 2106.069 15126.756
0.161 1.662 18.652 221.583 4843.397
95631.165
1621857.897
0
200,000
400,000
600,000
800,000
1,000,000
1,200,000
1,400,000
1,600,000
1,800,000
10 100 1000 10000 100000 1000000 10000000
contains in
ArrayList
contains in
copied
HashSet
мкс
Количество элементов
www.luxoft.com
7 ПРАВИЛО КЛУБА:
ЗНАЙ СВОИ СТРУКТУРЫ ДАННЫХ.
Проще не всегда значит лучше.
www.luxoft.com
СПАСИБО ЗА ВНИМАНИЕ
И ДЕРЖИТЕ ПОРОХ СУХИМ БАЗУ
ПРОГРЕТОЙ

More Related Content

What's hot

Татьяна Новикова (Казахстан), ЦАРКА. Как мы мониторим Казнет с помощью WebTotem
Татьяна Новикова (Казахстан), ЦАРКА. Как мы мониторим Казнет с помощью WebTotemТатьяна Новикова (Казахстан), ЦАРКА. Как мы мониторим Казнет с помощью WebTotem
Татьяна Новикова (Казахстан), ЦАРКА. Как мы мониторим Казнет с помощью WebTotemKazHackStan
 
"Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли...
"Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли..."Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли...
"Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли...Ontico
 
Sim sim-2
Sim sim-2Sim sim-2
Sim sim-2gorad
 
Setup1
Setup1Setup1
Setup1Zuenta
 
Data mining for nmap acceleration
Data mining for nmap accelerationData mining for nmap acceleration
Data mining for nmap accelerationbeched
 
Криптология в анализе защищённости
Криптология в анализе защищённостиКриптология в анализе защищённости
Криптология в анализе защищённостиbeched
 
Олег Царев, Кирилл Коринский Сравнительный анализ хранилищ данных
Олег Царев, Кирилл Коринский   Сравнительный анализ хранилищ данныхОлег Царев, Кирилл Коринский   Сравнительный анализ хранилищ данных
Олег Царев, Кирилл Коринский Сравнительный анализ хранилищ данныхSiel01
 
Хранение данных на виниле / Константин Осипов (tarantool.org)
Хранение данных на виниле / Константин Осипов (tarantool.org)Хранение данных на виниле / Константин Осипов (tarantool.org)
Хранение данных на виниле / Константин Осипов (tarantool.org)Ontico
 
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...Lenvendo
 
Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...
Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...
Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...KazHackStan
 
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....KazHackStan
 
Redis: возможности, выгоды, примеры использования
Redis: возможности, выгоды, примеры использованияRedis: возможности, выгоды, примеры использования
Redis: возможности, выгоды, примеры использованияAlexey Kachayev
 
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013Unigine Corp.
 
С одним плюсом (Андрей Аксёнов)
С одним плюсом (Андрей Аксёнов)С одним плюсом (Андрей Аксёнов)
С одним плюсом (Андрей Аксёнов)Unigine Corp.
 
Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference
Выступление Андрея Сумина, Mail.Ru Group, на High Performance ConferenceВыступление Андрея Сумина, Mail.Ru Group, на High Performance Conference
Выступление Андрея Сумина, Mail.Ru Group, на High Performance ConferenceEYevseyeva
 
Meet Magento Belarus 2015: Andrey Tataranovich
Meet Magento Belarus 2015: Andrey TataranovichMeet Magento Belarus 2015: Andrey Tataranovich
Meet Magento Belarus 2015: Andrey TataranovichAmasty
 
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...Ontico
 
Boost.Algorithm: что, зачем и почему
Boost.Algorithm: что, зачем и почемуBoost.Algorithm: что, зачем и почему
Boost.Algorithm: что, зачем и почемуcorehard_by
 
Open source субд глазами обычного программиста
Open source субд глазами обычного программистаOpen source субд глазами обычного программиста
Open source субд глазами обычного программистаSlach
 

What's hot (20)

Татьяна Новикова (Казахстан), ЦАРКА. Как мы мониторим Казнет с помощью WebTotem
Татьяна Новикова (Казахстан), ЦАРКА. Как мы мониторим Казнет с помощью WebTotemТатьяна Новикова (Казахстан), ЦАРКА. Как мы мониторим Казнет с помощью WebTotem
Татьяна Новикова (Казахстан), ЦАРКА. Как мы мониторим Казнет с помощью WebTotem
 
"Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли...
"Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли..."Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли...
"Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли...
 
Sim sim-2
Sim sim-2Sim sim-2
Sim sim-2
 
Setup1
Setup1Setup1
Setup1
 
Data mining for nmap acceleration
Data mining for nmap accelerationData mining for nmap acceleration
Data mining for nmap acceleration
 
Криптология в анализе защищённости
Криптология в анализе защищённостиКриптология в анализе защищённости
Криптология в анализе защищённости
 
Олег Царев, Кирилл Коринский Сравнительный анализ хранилищ данных
Олег Царев, Кирилл Коринский   Сравнительный анализ хранилищ данныхОлег Царев, Кирилл Коринский   Сравнительный анализ хранилищ данных
Олег Царев, Кирилл Коринский Сравнительный анализ хранилищ данных
 
Хранение данных на виниле / Константин Осипов (tarantool.org)
Хранение данных на виниле / Константин Осипов (tarantool.org)Хранение данных на виниле / Константин Осипов (tarantool.org)
Хранение данных на виниле / Константин Осипов (tarantool.org)
 
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
 
Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...
Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...
Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...
 
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
 
Redis: возможности, выгоды, примеры использования
Redis: возможности, выгоды, примеры использованияRedis: возможности, выгоды, примеры использования
Redis: возможности, выгоды, примеры использования
 
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
 
Redis (Dump 2015)
Redis (Dump 2015)Redis (Dump 2015)
Redis (Dump 2015)
 
С одним плюсом (Андрей Аксёнов)
С одним плюсом (Андрей Аксёнов)С одним плюсом (Андрей Аксёнов)
С одним плюсом (Андрей Аксёнов)
 
Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference
Выступление Андрея Сумина, Mail.Ru Group, на High Performance ConferenceВыступление Андрея Сумина, Mail.Ru Group, на High Performance Conference
Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference
 
Meet Magento Belarus 2015: Andrey Tataranovich
Meet Magento Belarus 2015: Andrey TataranovichMeet Magento Belarus 2015: Andrey Tataranovich
Meet Magento Belarus 2015: Andrey Tataranovich
 
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
 
Boost.Algorithm: что, зачем и почему
Boost.Algorithm: что, зачем и почемуBoost.Algorithm: что, зачем и почему
Boost.Algorithm: что, зачем и почему
 
Open source субд глазами обычного программиста
Open source субд глазами обычного программистаOpen source субд глазами обычного программиста
Open source субд глазами обычного программиста
 

Viewers also liked

Igor Dmitriev: "Java behind the scenes"
Igor Dmitriev: "Java behind the scenes"Igor Dmitriev: "Java behind the scenes"
Igor Dmitriev: "Java behind the scenes"LogeekNightUkraine
 
Hibernate performance tuning
Hibernate performance tuningHibernate performance tuning
Hibernate performance tuningMikalai Alimenkou
 
Vadym Ruchka «GraphQL from UI perspective»
Vadym Ruchka «GraphQL from UI perspective» Vadym Ruchka «GraphQL from UI perspective»
Vadym Ruchka «GraphQL from UI perspective» LogeekNightUkraine
 
Andrii Datsenko «Practical RxJS»
Andrii Datsenko «Practical RxJS»Andrii Datsenko «Practical RxJS»
Andrii Datsenko «Practical RxJS»LogeekNightUkraine
 
Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"
Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"
Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"LogeekNightUkraine
 
Sergii Puzankov «UI Regression Testing with "Gemini"»
Sergii Puzankov «UI Regression Testing with "Gemini"»Sergii Puzankov «UI Regression Testing with "Gemini"»
Sergii Puzankov «UI Regression Testing with "Gemini"»LogeekNightUkraine
 
Как улучшить результаты, используя софт для рекрутинга
 Как улучшить результаты, используя софт для рекрутинга Как улучшить результаты, используя софт для рекрутинга
Как улучшить результаты, используя софт для рекрутингаCleverStaff
 
Excelsior JET в действии
Excelsior JET в действииExcelsior JET в действии
Excelsior JET в действииNikita Lipsky
 
урок ц о
урок ц оурок ц о
урок ц оsemyurihor
 
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Nikita Lipsky
 
JavaFX Layout Secrets with Amy Fowler
JavaFX Layout Secrets with Amy FowlerJavaFX Layout Secrets with Amy Fowler
JavaFX Layout Secrets with Amy FowlerStephen Chin
 
Массивы в Java
Массивы в JavaМассивы в Java
Массивы в Javametaform
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 
Секреты сборки мусора в Java
Секреты сборки мусора в JavaСекреты сборки мусора в Java
Секреты сборки мусора в Javaaragozin
 
8 True Stories about JavaFX
8 True Stories about JavaFX8 True Stories about JavaFX
8 True Stories about JavaFXYuichi Sakuraba
 
JavaFX 8 - GUI by Illusion
JavaFX 8 - GUI by IllusionJavaFX 8 - GUI by Illusion
JavaFX 8 - GUI by IllusionYuichi Sakuraba
 

Viewers also liked (20)

Igor Dmitriev: "Java behind the scenes"
Igor Dmitriev: "Java behind the scenes"Igor Dmitriev: "Java behind the scenes"
Igor Dmitriev: "Java behind the scenes"
 
Hibernate performance tuning
Hibernate performance tuningHibernate performance tuning
Hibernate performance tuning
 
Vadym Ruchka «GraphQL from UI perspective»
Vadym Ruchka «GraphQL from UI perspective» Vadym Ruchka «GraphQL from UI perspective»
Vadym Ruchka «GraphQL from UI perspective»
 
Andrii Datsenko «Practical RxJS»
Andrii Datsenko «Practical RxJS»Andrii Datsenko «Practical RxJS»
Andrii Datsenko «Practical RxJS»
 
Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"
Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"
Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"
 
Sergii Puzankov «UI Regression Testing with "Gemini"»
Sergii Puzankov «UI Regression Testing with "Gemini"»Sergii Puzankov «UI Regression Testing with "Gemini"»
Sergii Puzankov «UI Regression Testing with "Gemini"»
 
Как улучшить результаты, используя софт для рекрутинга
 Как улучшить результаты, используя софт для рекрутинга Как улучшить результаты, используя софт для рекрутинга
Как улучшить результаты, используя софт для рекрутинга
 
Excelsior JET в действии
Excelsior JET в действииExcelsior JET в действии
Excelsior JET в действии
 
кобзар
кобзаркобзар
кобзар
 
урок ц о
урок ц оурок ц о
урок ц о
 
JavaFX Real-World Apps
JavaFX Real-World AppsJavaFX Real-World Apps
JavaFX Real-World Apps
 
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
 
JavaFX Layout Secrets with Amy Fowler
JavaFX Layout Secrets with Amy FowlerJavaFX Layout Secrets with Amy Fowler
JavaFX Layout Secrets with Amy Fowler
 
Массивы в Java
Массивы в JavaМассивы в Java
Массивы в Java
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
Секреты сборки мусора в Java
Секреты сборки мусора в JavaСекреты сборки мусора в Java
Секреты сборки мусора в Java
 
8 True Stories about JavaFX
8 True Stories about JavaFX8 True Stories about JavaFX
8 True Stories about JavaFX
 
JavaFX 8 - GUI by Illusion
JavaFX 8 - GUI by IllusionJavaFX 8 - GUI by Illusion
JavaFX 8 - GUI by Illusion
 
JavaFX Presentation
JavaFX PresentationJavaFX Presentation
JavaFX Presentation
 
Guava’s Event Bus
Guava’s Event BusGuava’s Event Bus
Guava’s Event Bus
 

Similar to Sergii Tsypanov: "Tricky enterprise"

Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
 Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт... Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...Ontico
 
64-битный конь, который умеет считать
64-битный конь, который умеет считать64-битный конь, который умеет считать
64-битный конь, который умеет считатьTatyanazaxarova
 
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)Vadim Kosov
 
Zabbix в badoo, от lld к super discovery
Zabbix в badoo, от lld к super discoveryZabbix в badoo, от lld к super discovery
Zabbix в badoo, от lld к super discoveryBadoo Development
 
Top-10 популярных вопросов администраторам баз данных или почему я против св...
Top-10  популярных вопросов администраторам баз данных или почему я против св...Top-10  популярных вопросов администраторам баз данных или почему я против св...
Top-10 популярных вопросов администраторам баз данных или почему я против св...Ilya Kosmodemiansky
 
Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером
Tomato Engine: Как мы создавали онлайн шутер с авторитарным серверомTomato Engine: Как мы создавали онлайн шутер с авторитарным сервером
Tomato Engine: Как мы создавали онлайн шутер с авторитарным серверомDevGAMM Conference
 
Как сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрееКак сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрееRoman Dvornov
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Ontico
 
MySQL Optimization. Russian
MySQL Optimization. RussianMySQL Optimization. Russian
MySQL Optimization. RussianRawan Qurmet
 
Не бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоНе бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоRoman Dvornov
 
Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выраженияTatyanazaxarova
 
Презентация: 1С-Bitrix — как начать
Презентация: 1С-Bitrix — как начатьПрезентация: 1С-Bitrix — как начать
Презентация: 1С-Bitrix — как начатьDmitriy Polisadov
 
BlackBox testing
BlackBox testingBlackBox testing
BlackBox testingbeched
 
Эффективный C++
Эффективный C++Эффективный C++
Эффективный C++Andrey Karpov
 
Обработка данных в RTB: быстро, дешево и на 98% точно
Обработка данных в RTB:  быстро, дешево и на 98% точноОбработка данных в RTB:  быстро, дешево и на 98% точно
Обработка данных в RTB: быстро, дешево и на 98% точноPavel Kalaidin
 
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...Ontico
 
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Badoo Development
 
Роман Еникеев - PHP обязан умирать
Роман Еникеев - PHP обязан умиратьРоман Еникеев - PHP обязан умирать
Роман Еникеев - PHP обязан умиратьDataArt
 

Similar to Sergii Tsypanov: "Tricky enterprise" (20)

Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
 Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт... Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
 
64-битный конь, который умеет считать
64-битный конь, который умеет считать64-битный конь, который умеет считать
64-битный конь, который умеет считать
 
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
 
Zabbix в badoo, от lld к super discovery
Zabbix в badoo, от lld к super discoveryZabbix в badoo, от lld к super discovery
Zabbix в badoo, от lld к super discovery
 
Top-10 популярных вопросов администраторам баз данных или почему я против св...
Top-10  популярных вопросов администраторам баз данных или почему я против св...Top-10  популярных вопросов администраторам баз данных или почему я против св...
Top-10 популярных вопросов администраторам баз данных или почему я против св...
 
Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером
Tomato Engine: Как мы создавали онлайн шутер с авторитарным серверомTomato Engine: Как мы создавали онлайн шутер с авторитарным сервером
Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером
 
Как сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрееКак сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрее
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
 
PowerShell
PowerShellPowerShell
PowerShell
 
MySQL Optimization. Russian
MySQL Optimization. RussianMySQL Optimization. Russian
MySQL Optimization. Russian
 
User Aggs In As
User Aggs In AsUser Aggs In As
User Aggs In As
 
Не бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоНе бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их много
 
Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выражения
 
Презентация: 1С-Bitrix — как начать
Презентация: 1С-Bitrix — как начатьПрезентация: 1С-Bitrix — как начать
Презентация: 1С-Bitrix — как начать
 
BlackBox testing
BlackBox testingBlackBox testing
BlackBox testing
 
Эффективный C++
Эффективный C++Эффективный C++
Эффективный C++
 
Обработка данных в RTB: быстро, дешево и на 98% точно
Обработка данных в RTB:  быстро, дешево и на 98% точноОбработка данных в RTB:  быстро, дешево и на 98% точно
Обработка данных в RTB: быстро, дешево и на 98% точно
 
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
 
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
 
Роман Еникеев - PHP обязан умирать
Роман Еникеев - PHP обязан умиратьРоман Еникеев - PHP обязан умирать
Роман Еникеев - PHP обязан умирать
 

More from LogeekNightUkraine

Autonomous driving on your developer pc. technologies, approaches, future
Autonomous driving on your developer pc. technologies, approaches, futureAutonomous driving on your developer pc. technologies, approaches, future
Autonomous driving on your developer pc. technologies, approaches, futureLogeekNightUkraine
 
Orkhan Gasimov "High Performance System Design"
Orkhan Gasimov "High Performance System Design" Orkhan Gasimov "High Performance System Design"
Orkhan Gasimov "High Performance System Design" LogeekNightUkraine
 
Vitalii Korzh "Managed Workflows or How to Master Data"
Vitalii Korzh "Managed Workflows or How to Master Data" Vitalii Korzh "Managed Workflows or How to Master Data"
Vitalii Korzh "Managed Workflows or How to Master Data" LogeekNightUkraine
 
Yevhen Tatarynov "From POC to High-Performance .NET applications"
Yevhen Tatarynov "From POC to High-Performance .NET applications"Yevhen Tatarynov "From POC to High-Performance .NET applications"
Yevhen Tatarynov "From POC to High-Performance .NET applications"LogeekNightUkraine
 
Oleksii Kuchuk "Reading gauge values with open cv imgproc"
Oleksii Kuchuk "Reading gauge values with open cv imgproc"Oleksii Kuchuk "Reading gauge values with open cv imgproc"
Oleksii Kuchuk "Reading gauge values with open cv imgproc"LogeekNightUkraine
 
Oleksandr Kutsan "Using katai struct to describe the process of working with ...
Oleksandr Kutsan "Using katai struct to describe the process of working with ...Oleksandr Kutsan "Using katai struct to describe the process of working with ...
Oleksandr Kutsan "Using katai struct to describe the process of working with ...LogeekNightUkraine
 
Pavlo Zhdanov "Mastering solid and base principles for software design"
Pavlo Zhdanov "Mastering solid and base principles for software design"Pavlo Zhdanov "Mastering solid and base principles for software design"
Pavlo Zhdanov "Mastering solid and base principles for software design"LogeekNightUkraine
 
Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"
Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"
Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"LogeekNightUkraine
 
Iurii Antykhovych "Java and performance tools and toys"
Iurii Antykhovych "Java and performance tools and toys"Iurii Antykhovych "Java and performance tools and toys"
Iurii Antykhovych "Java and performance tools and toys"LogeekNightUkraine
 
Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...
Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...
Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...LogeekNightUkraine
 
Aleksandr Kutsan "Managing Dependencies in C++"
Aleksandr Kutsan "Managing Dependencies in C++"Aleksandr Kutsan "Managing Dependencies in C++"
Aleksandr Kutsan "Managing Dependencies in C++"LogeekNightUkraine
 
Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"
Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"
Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"LogeekNightUkraine
 
Alexandr Golyak, Nikolay Chertkov "Automotive Testing vs Test Automatio"
Alexandr Golyak, Nikolay Chertkov  "Automotive Testing vs Test Automatio"Alexandr Golyak, Nikolay Chertkov  "Automotive Testing vs Test Automatio"
Alexandr Golyak, Nikolay Chertkov "Automotive Testing vs Test Automatio"LogeekNightUkraine
 
Michal Kordas "Docker: Good, Bad or Both"
Michal Kordas "Docker: Good, Bad or Both"Michal Kordas "Docker: Good, Bad or Both"
Michal Kordas "Docker: Good, Bad or Both"LogeekNightUkraine
 
Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"
Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"
Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"LogeekNightUkraine
 
Shestakov Illia "The Sandbox Theory"
Shestakov Illia "The Sandbox Theory"Shestakov Illia "The Sandbox Theory"
Shestakov Illia "The Sandbox Theory"LogeekNightUkraine
 
Dmytro Kochergin “Autotest with CYPRESS”
Dmytro Kochergin “Autotest with CYPRESS”Dmytro Kochergin “Autotest with CYPRESS”
Dmytro Kochergin “Autotest with CYPRESS”LogeekNightUkraine
 
Ivan Dryzhyruk “Ducks Don’t Like Bugs”
Ivan Dryzhyruk “Ducks Don’t Like Bugs”Ivan Dryzhyruk “Ducks Don’t Like Bugs”
Ivan Dryzhyruk “Ducks Don’t Like Bugs”LogeekNightUkraine
 

More from LogeekNightUkraine (20)

Face recognition with c++
Face recognition with c++ Face recognition with c++
Face recognition with c++
 
C++20 features
C++20 features C++20 features
C++20 features
 
Autonomous driving on your developer pc. technologies, approaches, future
Autonomous driving on your developer pc. technologies, approaches, futureAutonomous driving on your developer pc. technologies, approaches, future
Autonomous driving on your developer pc. technologies, approaches, future
 
Orkhan Gasimov "High Performance System Design"
Orkhan Gasimov "High Performance System Design" Orkhan Gasimov "High Performance System Design"
Orkhan Gasimov "High Performance System Design"
 
Vitalii Korzh "Managed Workflows or How to Master Data"
Vitalii Korzh "Managed Workflows or How to Master Data" Vitalii Korzh "Managed Workflows or How to Master Data"
Vitalii Korzh "Managed Workflows or How to Master Data"
 
Yevhen Tatarynov "From POC to High-Performance .NET applications"
Yevhen Tatarynov "From POC to High-Performance .NET applications"Yevhen Tatarynov "From POC to High-Performance .NET applications"
Yevhen Tatarynov "From POC to High-Performance .NET applications"
 
Oleksii Kuchuk "Reading gauge values with open cv imgproc"
Oleksii Kuchuk "Reading gauge values with open cv imgproc"Oleksii Kuchuk "Reading gauge values with open cv imgproc"
Oleksii Kuchuk "Reading gauge values with open cv imgproc"
 
Oleksandr Kutsan "Using katai struct to describe the process of working with ...
Oleksandr Kutsan "Using katai struct to describe the process of working with ...Oleksandr Kutsan "Using katai struct to describe the process of working with ...
Oleksandr Kutsan "Using katai struct to describe the process of working with ...
 
Pavlo Zhdanov "Mastering solid and base principles for software design"
Pavlo Zhdanov "Mastering solid and base principles for software design"Pavlo Zhdanov "Mastering solid and base principles for software design"
Pavlo Zhdanov "Mastering solid and base principles for software design"
 
Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"
Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"
Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"
 
Iurii Antykhovych "Java and performance tools and toys"
Iurii Antykhovych "Java and performance tools and toys"Iurii Antykhovych "Java and performance tools and toys"
Iurii Antykhovych "Java and performance tools and toys"
 
Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...
Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...
Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...
 
Aleksandr Kutsan "Managing Dependencies in C++"
Aleksandr Kutsan "Managing Dependencies in C++"Aleksandr Kutsan "Managing Dependencies in C++"
Aleksandr Kutsan "Managing Dependencies in C++"
 
Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"
Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"
Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"
 
Alexandr Golyak, Nikolay Chertkov "Automotive Testing vs Test Automatio"
Alexandr Golyak, Nikolay Chertkov  "Automotive Testing vs Test Automatio"Alexandr Golyak, Nikolay Chertkov  "Automotive Testing vs Test Automatio"
Alexandr Golyak, Nikolay Chertkov "Automotive Testing vs Test Automatio"
 
Michal Kordas "Docker: Good, Bad or Both"
Michal Kordas "Docker: Good, Bad or Both"Michal Kordas "Docker: Good, Bad or Both"
Michal Kordas "Docker: Good, Bad or Both"
 
Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"
Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"
Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"
 
Shestakov Illia "The Sandbox Theory"
Shestakov Illia "The Sandbox Theory"Shestakov Illia "The Sandbox Theory"
Shestakov Illia "The Sandbox Theory"
 
Dmytro Kochergin “Autotest with CYPRESS”
Dmytro Kochergin “Autotest with CYPRESS”Dmytro Kochergin “Autotest with CYPRESS”
Dmytro Kochergin “Autotest with CYPRESS”
 
Ivan Dryzhyruk “Ducks Don’t Like Bugs”
Ivan Dryzhyruk “Ducks Don’t Like Bugs”Ivan Dryzhyruk “Ducks Don’t Like Bugs”
Ivan Dryzhyruk “Ducks Don’t Like Bugs”
 

Sergii Tsypanov: "Tricky enterprise"