- Начал интересоваться программированием в 2006 году (18 лет назад).
- Беларусь, Минск/Брест.
C января 2023 переустроился в Yandex после пары месяцев перерыва после Дзена в HR Tech в разработку внутренних сервисов, вроде корпоративной части календаря (в основном) и прочих.
На этот раз научился поднимать продакшен-инфраструктуру под новые сервисы (балансировщики/запуск сервиса во внутреннем аля-кубернетесе).
В отличие от Дзена не было отдельной команды SRE следящей за алертами и часто приходилось разбираться в разнообразных проблемах: сетевых, проблемами со смежными сервисами, ложно-позитивными срабатываниями из-за прихода ботов-сканеров. Часть времени занимался повышением стабильности сервиса, чтобы меньше мусорных ошибок было на графиках (путём их починки/переводом в ряд штатных ситуаций), настройки умного лимитера RPS, тюнинга дашбордов для лучшего понимания состояния и причин проблем, всякое разное другое.
C 2 июня 2021 по 13 сентября 2022 работал фронтенд-разработчиком Yandex над продуктом Дзен (был продан VK
, туда не пошёл, не было офиса в Минске).
Разработка новых фич, проведение A/B экспериментов, разработка мобильного интерфейса (на DivKit), инфраструктурные преобразования, дежурства и выкатки релизов на продакшен.
Полностью React c Redux, SSR, БЭМ (далее переход на CSS Modules). Немного коммитов в Java-бэкенд, если было легко пробросить нужные данные с бэкенда и все согласились, что они должны приходить оттуда. Познакомился с восхитительной архитектурой организации микросервисов Apphost.
C 15 декабря 2016 по 4 января 2021 работал фронтенд-разработчиком Gurtam над продуктом Wialon.
Реализация нового функционала, правки старого, модернизация.
Изначально Vanilla JS (с jQuery) плюс серверная генерация HTML из TCL (использовался как PHP), к концу весь новый функционал реализовывался на React, серверная генерация страниц перешла во фронтенд-часть, C++&TCL бэкенд перевёлся на OpenResty (Lua). Надеюсь что далее это ещё раз переведут на nodejs/полностью статический фронтенд.
- Sesuritu — форк антиспам телеграм-бота Shieldy. Пришлось форкнуть из-за того, что антиспам-механизмы которые были в оригинальном боте перестали быть эффективными, а в один из чатов где я состою начало приходить слишком много ботов. Придумали, что хорошо бы чтобы у бота были вопросы которые касаются тематики чата и для каждого могли быть разными, чтобы боты/нанятые спамерами люди не могли легко пройти каптчу. Сделал PR, но мейнтейнер продал бота и похоже никому не интересно там что-то делать. Причёсываю его код потихоньку если нет других дел, если появлятся какие-то запросы, постараюсь реализовать. Надеюсь дойдут руки до настройки мониторинга его работы, такого я ещё не делал.
- Fiesta — веб-страничка с событиями относительно моей машины. Прикрутил Directus для хранения данных, первый раз использовал
Vite
, смог реализоватьSSR
с ним. Код находится на гитхабе https://github.com/anfivewer/an5wer, можно заглянуть в папкуpackages-fiesta
. Планирую добавить ещё графиков всяких (веду учёт стоимости заправок, сколько потратил на различные сервисные работы). - Diffbelt — иммутабельная key-value база данных с возможностью получать список изменений значений с момента прошлого получения изменений, что даёт возможность консистентно преобразовывать одни коллекции в другие, проводить консистентные аггрегации, не боясь что скрипты этих преобразований упадут в какой-то произвольный момент времени (в худшем случае можно будет поправить и перезапустить, не сломав итоговый результат). Пока в разработке, есть только in-memory вариант (в nodejs-прототипе), но уже потихоньку обрабатываю логи от
Sesuritu
им, превращая логи в графики.
- Адепт MVC (в разных его формах), Dependency Injection, PubSub.
- Импонирую тестам и TDD.
- Композиция > наследование
- React — хуки, контексты, рефы, императивные handle'ы, эффекты, вот это всё довольно понятно.
- MobX / MobX State Tree — очень понравилось класть и забирать данные из одного места, в котором ещё и описаны все возможности их изменения, чтобы всё оставалось консистентным.
- Effector / Reatom — кажется что этот подход к организации состояния для некоторых случаев сильно всё упрощает. Хотя сложную логику кажется что всё равно лучше написать отдельно, а не пытаться десятком sample и эффектов уместить в рамках эффектора, иначе такое ощущение что не логику запросов описываешь, а решил докторскую по квантовой физике написать.
- git — уверенное владение, понимание workflow, могу преобразовать дерево коммитов как пожелаю, теми операциями, которыми владею.
- Linux — использую Ubuntu в быту, постоянно имею личный сервер для разных нужд.
- Docker — открытие контейнеров стало откровением. Пара команд и ты уже развернул TeamCity, пару агентов к нему, PostgreSQL, InfluxDB, Grafana и оно работает (всё для личного использования). Но и по работе писал докерфайлы с всякими multi-stage билдами.
- TeamCity — имеется базовый опыт использования, включая создание билд-конфигураций, зависимостей между ними.
- Jenkins — опыта меньше, чем с TeamCity, но понравилось больше.
- GitLab CI — построил столько же пайплайнов, сколько в TeamCity (занимался их переносом), худшая CI, которую я видел.
- Ansible — если выкатываю какие-то обновления своих проектов довольно часто, то начинаю писать ansible плейбуки для автоматизации этого.
- webpack — JavaScript-проекты стали сложными, приходится как-то их собирать. Умею разбираться с проблемами, несколько раз пришлось читать код webpack, чтобы понять, почему получаются разные хеши у одинакового кода на разных машинах. Писал плагины.
- Vite — стал использовать в своих пет-проектах из-за простоты настройки, редко нужна та мощь, что даёт
webpack
(хотя может разберусь как писать плагины к Vite и он и не нужен будет). Плюс он сильно быстрее вебпака (полагаю из-заesbuild
). - make — если всё что нужно это сделать несколько файлов, а из них сделать другие файлы, то почему бы просто не использовать
make
? Не буду выделять отдельным пунктом, для сборкиC/C++
проектов использовалcmake
сCMakeLists.txt
.
- ECMAScript — использую 7+ лет, не страшусь асинхронности, умение бороться с лапшой, есть два-три года использования node.js.
- TypeScript — начал использовать в Yandex, изменил своё отношение к нему, теперь все новые проекты стартую сразу на нём.
- Rust — пишу diffbelt с 2023 года, помирился с borrow checker'ом, лайфтаймами, нравится. Хоть и иногда бесит, что все нужные фичи в nightly.
- Полузабытые:
- Java 6/7/8 — читал спецификацию, использовал 3 года, без фреймворков.
- Kotlin — после Java стал использовать Kotlin для личных проектов (но затем вернулся к node.js). Накидал по работе на Spring Cloud Gateway приложение-прокси с описаниями роутов и какие к ним нужно применять правила конфигом, с походами в другие сервисы перед совершением проксирования, даже ничего так получилось вроде.
- Прочие (мало опыта):
- Python — после PHP нашёл для себя Django Framework, там первый раз познакомился с MVC, какое-то время писал хобби-проекты на нём, затем перешёл на Java.
- C/C++ — моё изучение программирования начиналось с книги C Programming Language K&R, понимаю указатели, память, потокобезопасность, но считаю, что правильнее писать на языках высокого уровня, а если где-то начинаются тормоза и единственный способ ускориться это реализовать это на низкоуровневом языке, то ок. Однако сейчас предпочёл бы Rust для встраиваемой библиотеки/микросервис на Go.
- Erlang — написал пару серверов для себя, разобрался с процессами/сообщениями/поведениями. Очень понравилось.
- Haskell — встречаю статьи с попытками объяснения монад примерно раз в полгода, решил разобраться, что за оно. Разобрался, но на практике у меня на нём писать код получается слишком медленно (хоть и работает после первой же компиляции).
- Go — за сутки, ни разу не видев Go ранее накидал интерпретатор недолиспа. Приятный язык, хотелось бы реализовать несколько сервисов.
- HTML
- CSS — верстаю флексбоксами, если флексбоксами сложно и выглядит как сетка, то гридами.
- Less/Sass/etc —
пока в CSS не ввели блоки, чтобы не писать все родительские селекторы, удобнее всё-таки пользоваться препроцессорами(кажется что передумал по этому поводу, с CSS Modules и линейно нормально получается, нечего вложенность и файлы стилей под тыщу строк плодить)
- SQL — умею выбирать, добавлять, изменять, join'ить, особо без фанатизма. Предпочитаю написать пару SQL-запросов вместо подключения ORM сразу, если их всего несколько на всё приложение.
- Regexp — использую регулярные выражения там, где это легко решает задачу. Если в итоге выражение получается нечитаемым, предпочитаю другие варианты (vim-макросы, небольшой скрипт, несколько последовательных регэкспов).
- PEG (Parsing Expression Grammar) — умею описывать грамматики, навелосипедил свой парсер на Java (вполне себе функционирует, хоть и медленно (плохая модель кодогенерации)). Описал как минимум грамматику описания грамматики :).
- Русский — нативный, люблю читать и писать.
- Английский — технический, умею читать документации, воспринимаю на слух на уровне youtube-роликов. Разговаривать где-либо помимо баров не приходилось.
- PostgreSQL — базовое использование.
- MongoDB — использовал короткое время из-под Erlang и node.js.
- LevelDB — в личных проектах, где всего один сервер обычно не нужна внешняя БД, достаточно embedded-решения. Впрочем, и в больших системах нужны локальные базы для дисковых кешей/реализации своей распределённой БД. Планирую пересесть на
RocksDB
, похоже что она активнее разрабатывается (хотя мне хватает и того, что есть). - RocksDB — в diffbelt таки пересел. KV как KV.
- Email: [email protected]
- Telegram: @ruliov
- GitHub: Rulexec
- Прочее: ruliov.an5wer.com