Skip to content

Instantly share code, notes, and snippets.

@Rulexec
Last active February 27, 2024 04:16
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Rulexec/7e9ade7ecea307dad917 to your computer and use it in GitHub Desktop.
Save Rulexec/7e9ade7ecea307dad917 to your computer and use it in GitHub Desktop.

Alexander Ruliov

  • Written my first "Hello, World!" in 2006 (16 years ago).
  • 28 y.o., Belarus, Minsk (born in Brest).

Experience

Gurtam (4 years, [2017; 2021))

Worked as frontend-developer from 15 December 2016 to 4 January 2021 in Gurtam on Wialon product.

Initially project was built on Vanilla JS (with jQuery) plus there was server-generated HTML by TCL (which was used as PHP). After 2-3 years we started to implement new features on React, eliminated TCL pages, and migrated them to OpenResty (Lua). I hope that it will be migrated then to nodejs/will be fully static frontend (at the time of first migration there was no expertise with nodejs in the company, but there was a team that used Lua).

Yandex (1+ year, (2021; 2022))

Worked as frontend-developer from 2 June 2021 to 13 September 2022 in Yandex on Zen product (was sold to VK).

Was responsible for the implementation of new features, running A/B experiments, developing mobile interfaces (via DivKit), infrastructure transformations of the code, production duty, and deploying new releases.

This project was fully on React with Redux, with SSR, BEM (later we moved to CCS Modules, but conception is not changed). Committed a bit to Java-backend, when we needed some data on the frontend and it was easy to return it from some API endpoint and all agree that this is fine. Found a beautiful architecture of microservices organization Apphost (the article is in Russian, not found other sources).

Pet-projects

  • Sesuritu — fork of antispam telegram-bot Shieldy. I had to fork it because antispam mechanics that were present in the original bot lost their efficiency and one chat which I am a member of was flooded by bots, successfully bypassing all types of captchas. Within chat we came up with the idea that bot can ask for chat-specific topics, so automatically it will be very hard to expose (maybe with GPT-3?). I made a PR, but the maintainer of bot sold it, and looks like the new owners are not very interested in the active continuation of development. I polish the existing codebase sometimes when having no other activities, if there will be some requests, will try to implement them. I hope that sometimes I will setup monitoring, never did it before.
  • Fiesta — web-page with events of my car. Still in development. Used Directus to store data, used Vite for the first time, and did SSR. Code is available on github https://github.com/anfivewer/an5wer, you can see to packages-fiesta folder. I'm planning to add different kinds of chars (I keep records about fuelling costs, and how much is spent on services). I think that full history will benefit in the future sale.
  • Diffbelt — immutable key-value database with possibility to get diffs of updated key-value pairs from the moment of previous diff. It gives possibility to map/filter/aggregate collections without lost of data consistency, even in cases when our transform scripts can contain bugs/crash at any moment (in such case we can fix them and run again on latest valid version of data).

Technologies

Abstract

  • Adept of MVC, Dependency Injection, PubSub
  • Thinking about races in multithreaded/async computations
  • Encourage tests and TDD
  • Understanding of OOP-principles (inheritance, encapsulation, polymorphism, abstract classes, and interfaces). Almost always prefer composition over inheritance.
  • Understanding of FP paradigm (immutability, pure functions, side effects, monads).

Frameworks

  • React — used for replacing vanilla js code, contributing to existing React apps, writing from the scratch. Understanding of hooks, contexts, refs, imperative handles, effects.
  • MobX / MobX State Tree — used it in Wialon, from my point of view MST is simpler to understand than Redux and more efficient for big apps (for example, there is no need to execute all selectors on the page when the store is changed).

Tools

core

  • git — confident knowledge, can transform commits tree as I want
  • Linux — use Ubuntu everyday at home PC, for more than 6 years own virtual machine for different purposes
  • Docker — awesome thing. A few commands and you have TeamCity, a few agents for it, PostgreSQL, InfluxDB, Grafana and it just works. Or to debug ansible scripts in a container like this one.

CI/Deploy

  • TeamCity — base usage, creation of build configurations with dependencies.
  • Jenkins — less experience than with TeamCity, but I like it more.
  • GitLab CI — transferred some TeamCity configurations to GitLab, the worst CI that I used.
  • Ansible — written playbooks for deploying my pet-projects.

Build

  • webpack — writing plugins, investigation of issues, reducing build times. Sometimes debugging it/reading source code to understand why plugins are not working as expected. The last bug that I found is still not fixed :(
  • Vite — started using it for my pet-projects instead of webpack due to simple configuration and much faster builds (I think it's because of esbuild). I didn't write plugins for it yet.
  • make — if all that we need to do is create a few files and other files from them, why just not write Makefile?

Languages

Programming

  • ECMAScript — write code in it for the last 7+ years, do not fear async processes, few years of nodejs usage.
  • TypeScript — started using it at Yandex, changed my mind about it, it's awesome.
  • Almost forgotten:
    • Java 6/7/8 — read specification, used few years without frameworks (except Yandex, there was some Spring, but almost not touched it, read-only).
    • Kotlin — switched to it after Java for my own projects (but later switched to nodejs
  • Other (too little experience):
    • Python — after writing some code in PHP found Django Framework, where met MVC model
    • C/C++ — C was my first language, C Programming Language by K&R was my first programming book. Understand pointers, memory, thread safety. But prefer higher levels of programming languages. The only reason to use less comfortable languages is performance (or size limit), but when we really need performance it is usually maybe 1% of code that eats 80% of execution time, then this code can be separated to a shared library/microservice written on something fast.
    • Erlang — written a few servers for fun, figured out about processes/messages/behaviour. I very like it, actor model is cool.
    • Haskell — after observing articles with trying to explain monads decided to investigate, what is it. Successfully. Didn't build even hobby projects on it, writing code on Haskell is pretty slow for me, like on Rust (but if in Rust you fight with the compiler, in Haskell you fight with yourself that you are not thought types before start writing actual code and then realize, that you need pass some parameter to the very bottom/wrap half of your functions with some monad). Or maybe I just did something wrong.
    • Go — I call it the dumbest language ever, in a good sense. Written interpreter of Lisp in a day never seen Go before. Want to write a few services with it, but still have not found an application where part of the system on Go will be preferred to nodejs which I use currently. Sadly, my home projects do not have enough high loads (or happily and I can have a good sleep).
    • Rust — with the second try understood, what borrow checker wants from me, used for compiling module for nodejs. But still fighting with the compiler, maybe there will be a third or fourth try.

Declarative

  • HTML
  • CSS — pretty standard flexbox layouts, sometimes adding some float. When I need a table usually I use... table. Still not using grid, but looks like IE11 finally died and I can get it a chance.
  • Less/Sass/etc

Query / etc

  • SQL — select, insert, update, a bit of joins. Prefer to write SQL-queries by hand if I need only a few of them instead of using ORM.
  • Regexp — I use regular expressions every day for mass replacements, searching.
  • PEG (Parsing Expression Grammar) — prefer them for describing syntaxes. Written own implementation of it in Java (inspired by PEG.js, works, but slowly (bad model of code generation)).

Natural

  • Russian — native
  • English — can read documentation/references, understand English youtube videos. Very small IRL communication experience.

Databases

Relational

  • PostegreSQL — basic usage

Non-relational

  • MongoDB — used from nodejs, Erlang.
  • LevelDB — simple key-value embedded db, prefer to use them in own projects instead of "big databases" when they are not really needed. Considering to start using RocksDB for this purpose, looks like it develops more actively (but anyway I have enough features already).

Subjective

I have a small list that I don't like a lot (but use them anyway if needed):

  • Python — not like pythonic way. Feels like if I do something that works but is wrong it will be a "shame".
  • Kubernetes — I still have no projects of such scale where I need such complex tools. I believe, that tools should be pretty simple and easily debuggable at any level, where anything can be fixed by a hand even without having huge expertise in it.

Directions of development

  • Software Architect — somewhen I want to be able to investigate a problem that we need to solve, design system model, API of components and efficiently distribute implementation of the system to available resources of developers/teams. Then adapt to changes and make the whole system work stable.
  • Type Theory — I believe, that formal verification sometime will invade our lives and all serious development (where the price of error is huge) will use type systems with dependent types and mathematical proofs of correctness. Understand them (but still have not tried Idris).

Contacts


Александр Рулёв

  • Начал интересоваться программированием в 2006 году (16 лет назад).
  • 28 лет, Беларусь, Минск/Брест.

Опыт работы

Gurtam (4 года, [2017; 2021))

C 15 декабря 2016 по 4 января 2021 работал фронтенд-разработчиком Gurtam над продуктом Wialon.

Реализация нового функционала, правки старого, модернизация.

Изначально Vanilla JS (с jQuery) плюс серверная генерация HTML из TCL (использовался как PHP), к концу весь новый функционал реализовывался на React, серверная генерация страниц перешла во фронтенд-часть, C++&TCL бэкенд перевёлся на OpenResty (Lua). Надеюсь что далее это ещё раз переведут на nodejs/полностью статический фронтенд.

Yandex (1+ год, (2021; 2022))

C 2 июня 2021 по 13 сентября 2022 работал фронтенд-разработчиком Yandex над продуктом Zen (был продан VK).

Разработка новых фич, проведение A/B экспериментов, разработка мобильного интерфейса (на DivKit), инфраструктурные преобразования, дежурства и выкатки релизов на продакшен.

Полностью React c Redux, SSR, БЭМ (далее переход на CSS Modules). Немного коммитов в Java-бэкенд, если было легко пробросить нужные данные с бэкенда и все согласились, что они должны приходить оттуда. Познакомился с восхитительной архитектурой организации микросервисов Apphost.

Пет-проекты

  • Sesuritu — форк антиспам телеграм-бота Shieldy. Пришлось форкнуть из-за того, что антиспам-механизмы которые были в оригинальном боте перестали быть эффективными, а в один из чатов где я состою начало приходить слишком много ботов. Придумали, что хорошо бы чтобы у бота были вопросы которые касаются тематики чата и для каждого могли быть разными, чтобы боты/нанятые спамерами люди не могли легко пройти каптчу. Сделал PR, но мейнтейнер продал бота и похоже никому не интересно там что-то делать. Причёсываю его код потихоньку если нет других дел, если появлятся какие-то запросы, постараюсь реализовать. Надеюсь дойдут руки до настройки мониторинга его работы, такого я ещё не делал.
  • Fiesta — веб-страничка с событиями относительно моей машины. Пока ещё находится в разработке. Прикрутил Directus для хранения данных, первый раз использовал Vite, смог реализовать SSR. Код находится на гитхабе https://github.com/anfivewer/an5wer, можно заглянуть в папку packages-fiesta. Планирую добавить ещё графиков всяких (веду учёт стоимости заправок, сколько потратил на различные сервисные работы).
  • Diffbelt — иммутабельная key-value база данных с возможностью получать список изменений значений с момента прошлого получения изменений, что даёт возможность консистентно преобразовывать одни коллекции в другие, проводить консистентные аггрегации, не боясь что скрипты этих преобразований упадут в какой-то произвольный момент времени (в худшем случае можно будет поправить и перезапустить, не сломав итоговый результат). Пока в разработке, есть только in-memory вариант, но уже потихоньку обрабатываю логи от Sesuritu им, превращая логи в графики.

Технологии

Абстрактные

  • Адепт MVC, Dependency Injection, PubSub.
  • Умею разруливать состояния гонок в мнотопоточных/асинхронных вычислениях.
  • Импонирую тестам и TDD.
  • Полное осознание объектно-ориентированного программирования (понимание концепций наследования, инкапсуляции, полиморфизма, абстрактных классов, интерфейсов). Но предпочитаю простую композицию.
  • Осознание функциональной парадигмы (концепции иммутабельности, чистоты/сайд-эффектах, монад, etc).

Фреймворки

  • React — использовал и во время перехода с vanilla js, и в существующем React приложении, и в проектах с нуля. Хуки, контексты, рефы, императивные handle'ы, эффекты, вот это всё довольно понятно.
  • MobX / MobX State Tree — очень понравилось класть и забирать данные из одного места, в котором ещё и описаны все возможности их изменения, чтобы всё оставалось консистентным.

Инструменты

core

  • git — уверенное владение, понимание workflow, могу преобразовать дерево коммитов как пожелаю, теми операциями, которыми владею.
  • Linux — использую Ubuntu в быту, постоянно имею личный сервер для разных нужд.
  • Docker — открытие контейнеров стало откровением. Пара команд и ты уже развернул TeamCity, пару агентов к нему, PostgreSQL, InfluxDB, Grafana и оно работает (всё для личного использования). Писал парочку Dockerfile'ов.

CI/Deploy

  • 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, изменил своё отношение к нему, теперь и все свои пет-проекты стартую сразу на нём.
  • Полузабытые:
    • Java 6/7/8 — читал спецификацию, использовал 3 года, без фреймворков.
    • Kotlin — после Java стал использовать Kotlin для личных проектов (но затем вернулся к node.js).
  • Прочие (мало опыта):
    • Python — после PHP нашёл для себя Django Framework, там первый раз познакомился с MVC, какое-то время писал хобби-проекты на нём, затем перешёл на Java.
    • C/C++ — моё изучение программирования начиналось с книги C Programming Language K&R, понимаю указатели, память, потокобезопасность, но считаю, что правильнее писать на языках высокого уровня, а если где-то начинаются тормоза и единственный способ ускориться это реализовать это на низкоуровневом языке, то ок. Однако сейчас предпочёл бы Rust для встраиваемой библиотеки/микросервис на Go.
    • Erlang — написал пару серверов для себя, разобрался с процессами/сообщениями/поведениями. Очень понравилось.
    • Haskell — встречаю статьи с попытками объяснения монад примерно раз в полгода, решил разобраться, что за оно. Разобрался, но на практике у меня на нём писать код получается слишком медленно (хоть и работает после первой же компиляции).
    • Go — за сутки, ни разу не видев Go ранее накидал интерпретатор недолиспа. Приятный язык, хотелось бы реализовать несколько сервисов.
    • Rust — со второго подхода понял, что от меня хочет borrow checker, успешно использовал в связке с нодой, когда нужна была скорость вычислений. Однако пока всё ещё довольно много приходится бороться с компилятором.

Декларативные

  • HTML
  • CSS — верстаю флексбоксами, редко float'ами. Таблицы предпочитаю верстать... таблицами. Посмотрю на grid, когда IE11 умрёт, либо мне не нужно будет его поддерживать.
  • Less/Sass/etc — пока в CSS не ввели блоки, чтобы не писать все родительские селекторы, удобнее всё-таки пользоваться препроцессорами.

Запросов / etc

  • SQL — умею выбирать, добавлять, изменять, join'ить, особо без фанатизма. Предпочитаю написать пару SQL-запросов вместо подключения ORM сразу, если их всего несколько на всё приложение.
  • Regexp — использую регулярные выражения там, где это легко решает задачу. Если в итоге выражение получается нечитаемым, предпочитаю другие варианты (vim-макросы, небольшой скрипт, несколько последовательных регэкспов).
  • PEG (Parsing Expression Grammar) — умею описывать грамматики, навелосипедил свой парсер на Java (вполне себе функционирует, хоть и медленно (плохая модель кодогенерации)). Описал как минимум грамматику описания грамматики :).

Естественные

  • Русский — нативный, люблю читать и писать.
  • Английский — технический, умею читать документации, воспринимаю на слух на уровне youtube-роликов. Разговаривать где-либо помимо баров не приходилось.

Базы данных

Реляционные

  • PostgreSQL — базовое использование.

Нереляционные (NoSQL)

  • MongoDB — использовал короткое время из-под Erlang и node.js.
  • LevelDB — в личных проектах, где всего один сервер обычно не нужна внешняя БД, достаточно embedded-решения. Впрочем, и в больших системах нужны локальные базы для дисковых кешей/реализации своей распределённой БД. Планирую пересесть на RocksDB, похоже что она активнее разрабатывается (хотя мне хватает и того, что есть).

Личные качества, убеждения

  • Мне нравится писать (например, на хабр) и иногда выступать, была бы тема.
  • Всему что умею обучался сам, имею большие способности к обучению и восприятию новых технологий, багаж знаний и опыта позволяет начать использовать технологию буквально в первый-третий день знакомства с ней (не всегда сразу правильным образом).
  • Перфекционист. Относительно программирования являюсь перфекционистом по части API. Качество кода это лишь детали реализации, но API должен быть идеальным.
  • Велосипедист (в обоих смыслах). Если меня что-то не устраивает в какой-либо библиотеке и нет других альтернатив (но только если действительно нет), то предпочту реализовать сам/сделать обёртку, если это возможно сделать за адекватные сроки.

Субъективное

Есть небольшой набор технологий, которые я не сильно приветствую (но и не отторгаю полностью):

  • Python — не сошёлся душой с pythonic way и не понимаю как можно было придумать GIL, _magic_ и рассказывать про правильность, красоту и элегантность
  • Kubernetes — не дорос ещё до таких объёмов и пока верю, что инструменты должны быть максимально тупыми, где нечему ломаться и что можно починить за пару пинков

Дальнейшие направления развития / стремления

  • Software Architect — планирую стать высококлассным архитектором ПО (под этим понимаю человека, способного выяснить о задаче всё, что необходимо о ней знать, спроектировать модель системы, спроектировать API компонентов, максимально эффективно распараллелить реализацию системы между имеющимися разработчиками/командами).
  • Type Theory — верю, что за формальной верификацией программ будущее и что со временем вся серьёзная разработка (где цена ошибки высока) будет использовать системы типизации с поддержкой зависимых типов. Понимаю их (но Idris так и не попробовал).

Контакты

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment