Обо мне

Образование

Закончил лицей “Вторая школа”.
Участвовал в школьных олимпиадах:

  • призер Московской олимпиады по информатике
  • призер Олимпиады Росатома по математике
  • призер Региональной олимпиады по физике
  • участник заключительного тура Всероссийской олимпиады по физике
  • победитель Олимпиады Росатома по физике
  • призер МФТИ по физике

По результатам олимпиад поступил в МФТИ на ФРТК.
Участвовал в ACM-ICPC.

Программированием серьезно начал заниматься в школе с 8 класса.
Вначале изучил actionscript, написал простой сайт и несколько игр.
Затем начал увлекаться моделированием разных физических систем на C++ и OpenGL, DirectX.
Это требовало изучения разных алгоритмов и их оптимизации.
Занимался сетевым программированием на с++/tcp/ip.
Изучил java, но серьезно нигде не использовал.
Самостоятельно изучал ассемблер, в последствии прослушал специальный курс в МФТИ.
Изучал разнообразную литературу по улучшению качества кода
и использованию разных паттернов проектирования (Страуструп, Мэйерс, Герб Саттер).
Имею большой опыт многопоточного программирования для CPU и CUDA на GPU.
Прошел в МФТИ курс по суперкомпьютерным технологиям.
В старших классах и в МФТИ много занимался веб-программированием.
Для серверных технологий использовал языки PERL, PHP, node.js, (так же изучил ruby on rails).
После программирования на C++ легко освоил javascript и html/css, haml, jade, coffeescript, sass, compass.
Изучил angular2, react, flux, redux, webpack, es6, es7, susy, materialize.
Работал с системами контроля версий git, mercurial.
Работал с базами данных postgres, mysql, mognodb, redis, sqlite3.
Хорошо владею linux, начинал с fedora, сейчас на ubuntu.
Занимался администрированием сервера на centos и ubuntu
настройкой selinux, firewalld, denyhost, fail2ban.
В основном пользуюсь редактором vim, иногда vscode.

С golang работаю недавно, но разобрался легко.
Написал библиотеку для работы с named pipe в unix,
библиотеку posix semaphore на cgo для синхронизации межпроцессорного доступа к пайпам.
Обертку над protobuf для передачи данных через named pipe между микросервисами
и вызов handlerов с преобразованными типами с помощью reflect.
Было интересно сравнить скорость работы grpc по net/http2 и чистого protobuf через named pipes.

godoc.org/github.com/avezila/psem - POSIX semaphore

Работа

Andiks

https://andiks.com/

6 месяцев работал в гейм студии “Андикс” над созданием браузерной игры Mireyn: Strong World.
Идея была в том, чтобы создать realtime браузерную игру без использования разных плагинов,
таких как unity на возможностях html5, webgl.
В игре развитая экономика в 2D режиме (позволяет играть в офисных пк и планшетах)
с последующей возможностью входить в 3D realtime бой на удобном стационарном пк.
Сама система боя похожа на dota 2.
Проект был написан на node.js и socket.io
Я занимался разработкой интерактивной карты мира,
функциональностью инвентаря (как в diablo), системой авторизации.
Занимался разными оптимизациями уже написанного кода.
Помогал придумывать алгоритмы связанными с картой мира,
хождением юнитов, определением столкновений и т.д.

LessonHome

https://lessonhome.ru/

Сайт по поиску репетиторов для учеников.
Руководил командой разработки и был ведущим разработчиком.

Технологии:

Node.js, mongodb, redis, socket.io, babel, coffeescript, sass/compass, jade, materialize.
Реализовали модульную систему в виде компонентов,
каждый из которых состоит из js, css, html, и состояний,
которые описывают части структуры страницы из этих компонентов.
Для состояний было реализовано наследование и инкапсулирование.
Все это дело собиралось, сжималось и т.д.,
отдавая минимальный набор css, html и js на клиент, необходимый для отображения страницы.
Для работы с данными была реализована микросервисная архетиктура.
Каждое состояние отвечает за структуры модулей для части страницы,
за подгрузку необходимых данных в эти модули из микросервисов и,
если это корневое состояние, то за роутинг и права доступа.
Микросервисы запускались в отдельных кластерах node.js, общение происходило с помощью задач,
роутинг которых происходил через redis.
В среднем на ноутбуке постановка задачи из одного сервиса другому,
решение и получение ответа занимает 300мкс.
Микросервисы позволили масштабировать систему из однопоточного node.js
до использования всех ресурсов системы,
а в дальнейшем для легкого масштабирования для межсерверного взаимодействия.
Модульная система позволила c помощью предкомпиляции сделать свою
область видимости для css, js, html внутри каждого модуля,
что позволило не писать длинные имена в css по БЭМ, а оперировать короткими именами.
Но в скомпилированном виде не отличить от бэм.
Весь js на клиенте и сервере написан через связку Promise,Coroutine,Q.async,yield
что позволило писать псевдо-синхронный код без лапши коллбеков:

  data = yield db.find(query);  
  n = yield fs.writeFile(filename,data); 

Пример модуля: personal_cabinet/chat
Пример состояний: lp/personal_cabinet
Пример сервиса: workers/pupil

О себе

10 лет занимался музыкой на саксофоне и фортепьяно.
Люблю быструю езду, кататься на вейкборде, ходить в походы.
У меня замечательная жена и дочь.
Постоянно изучаю разные технологии, языки программирования,
паттерны проектирования, методологии разработки, аджайл.
Стремлюсь дорасти до fullstack разработчика или системного архитектора с большой буквы.
Люблю обдумывать и реализовывать сложные алгоритмы, не люблю верстку.

Как я вижу архитектуру современного веб-приложения

Требования:
Со стороны фронтенда:
  • Компонентаная архитектура
  • Легкое переиспользование существующих компонентов в разных проектах
  • Гибкая адаптивная верстка
  • Если приложение сложнее, чем просто блог со статическими статьями,
    то имеет смысл делать single page application.
  • При загрузке страницы грузится только минимальный набор необходимых стилей и верстки
    одним запросом, следом отдельным запросом грузится javascript движок,
    затем можно закешировать часто используемые ресурсы в cache storage,
    и при переходах по страницам грузить только динамически изменяемые данные
  • Соответственно приложение должно одинаково хорошо рендерится как на сервере так и на клиенте
Со стороны бекэнда:
  • микросервисная архитектура, которую легко масштабировать.
  • минимальные затраты на общение между сервисами
  • возможность как быстрого написания простых сервисов с низким rps,
    так и требовательных сервисов с высоким rps.
  • некий пакетный менеджер, для удобного переиспользования микросервисов
    и компонентов в разных проектах
Реализация
  • React - компонентная верстка и динамический рендеринг страницы на клиенте
  • redux - для работы с данными
  • Susy - адаптивная верстка
  • Компоненты Bootstrap, semantic-ui,material-ui - в качестве базы для собственных компонентов
  • sass, compass/bourbon
  • universal - server side rendering
  • babel - es6,es7 на сервере и клиенте
  • node.js - для рендеринга приложения на стороне сервера и простых микросервисов
  • golang - для сложных микросервисов
  • protobuf/grpc - для общения между микросервисами
  • возможно socket.io или простые http запросы для общения с микросервисами со стороны клиента.
  • postgres/mongodb - в качестве базы данных
  • redis/leveldb/rocksdb - для кеширования, межсервисного хранения данных.
  • В качестве пакетного менеджера для компонентов можно было бы использовать npm,
    но туда не удобно заливать и обновлять.
    В этом плане хорошо выглядит go get с использованием git,
    но нужно реализовать надстройку для импорта компонентов и микросервисов в node.js
  • nginx,http2… - для раздачи статики и роутинга запросов с клиента между микросервисами
    на go/node.js и react приложением на node.js
  • service worker - для управления кешированием на стороне клиента.
  • так же микросервис для сжатия и хеширования статики
    для “бесконечного кеширования” вида /static/asd43fsdg45/image.jpg,
    можно написать свой, можно найти какой-нибудь модуль для nginx,
    можно взять готовые модули для webpack.

Школьные/студенчиские проекты

  • Моделировал картину силовых и эквипотенциальных линий
    электрического поля произвольного расположения зарядов в 2D на С++/opengl
  • Физическую систему деформируемых объектов через частицы в 3D на opengl и directx
  • Написал игру для программистов. Есть 3D мир, в котором ездят танчики.
    Каждый игрок пишет интелект для танчика на с++ и компилирует его в динамическую библиотеку,
    которая подключается к программе.
    Каждую итерацию “мира” дергается хандер в библиотеке игрока для обработки интелекта.
    Игрок может вызвать api для получения данных о мире, который видит танчик,
    и для вызова функций управления роботом - двигаться, повернуться,
    выстрелить под каким-то углом и т.д. Соответственно побеждает тот танчик,
    который остался последним.
  • Участвовал в конкурсе юниор с проектом хождения робота. Смоделировали четырехногого робота,
    затем научили его ходить в виртуальном мире,
    управляя виртуальными мускулами с помощью нейронных сетей.
  • В МФТИ делали летающего квадрокоптера. Моей задачей было научить получать информацию с датчиков,
    управлять полетом и ориентироваться в пространстве с помощью камеры,
    кинект и разных дальнометров и т. д. для достижения автономного полета и огибания препятствий.
Профессиональные навыки
Опыт работы
Сентябрь 2014 — Март 2016
LessonHome
Ведущий разработчик
Москва
Обязанности и достижения

Разработка всей архитектуры проекта, весь бэкэнд и ядро фронтенда.

Январь 2014 — Август 2014
Andiks
разработчик
Москва
Обязанности и достижения

Разработка функционала на node.js, javascript(client), php

Высшее образование
Сентябрь 2012 — Май 2014
МФТИ
Радиотехники и кибернетики; ФРТК
Москва