Skip to content

Instantly share code, notes, and snippets.

@c80609a
Last active October 22, 2019 07:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save c80609a/035a8b9eb9f5b01bb224b18e925f9101 to your computer and use it in GitHub Desktop.
Save c80609a/035a8b9eb9f5b01bb224b18e925f9101 to your computer and use it in GitHub Desktop.

1) С какими Rails библиотеками(gem-ами) приходилось работать?

Я не сторонник лишних gems. Если необходим какой-либо несистемный функционал (например, state machine), то вместо того, чтобы тянуть в проект какую-то стороннюю OpenSource либу (которая вместе с нужным функционалом добавляет ненужный потайной функционал "магического характера"), я лучше потрачу тоже самое время на разработку собственной библиотеки, которая может уместиться в 1-3 класса, чем разбираться в коде и в случае багов выяснять, где проблема: "у нас или у них там в геме?". Либо выдеру из гема нужный мне код без лишнего.

Ответ на вопрос:

  • rspec
  • composite_primary_keys
  • omniauth (omniauth-instagram, omniauth-vkontakte, omniauth-google-oauth2)
  • devise
  • kaminari
  • json-schema + dry-validation - огонь-гемы, позволяющие очень быстро валидировать приходящие параметры с форм (пример: https://gist.github.com/c80609a/f9326ac3169f335fb10e71be7714bb38)
  • virtus - частично был заменён на json-schema, выпиливается
  • mini_magick
  • bunny
  • backburner
  • phonelib
  • curb - Easy::Curl для клиентов, которые общаются, например, с ЯндексКассой
  • mongoid
  • dalli - для работы с memcached
  • newrelic_rpm
  • prawn - для генерации PDF
  • cancan, pundit (выпилены впоследствии, заменены на таблицу с привилегиями, спец-кода в route.rb и обработку Devise warden)
  • aasm (вообще шляпа, досталась в наследство с проектом)

2) С какими backend фраймворками приходилось работать?

Ror, hanami, своё.

update:

  • sinatra -- для "mock-серверов", если пишется/тестится, например, клиент для sms.ru
  • trailblazer -- из него была взята теория: контроллеры заняты маршрутизацией, сервисы заняты бизнес-логикой и пр.
  • goliath -- давно смотрел, как можно реализовывать ruby async app

3) С какими frontent фраймворками(библиотеками)?

React, pure js

4) C какими базами данных?

mysql, postgres

5) Какой stack технологий рационально использовать для создания интернет магазина с ожидаемым трафиком 1000 rps?

  • Кэшировать вьюхи\json в memcached -- и тогда не важно какая рельса и с каким шаблонизатором стоит позади этого барьера. Само собой, нужен будет код, который отслеживает изменения и валидирует кэш. Так работатет, например, RuTube (но у них бэк на питоне, но сути это не меняет).
  • Использовать адаптеры для иницализации сущностей, данные для которых хранятся не базе, а, например, в memcached
  • Вместо sidekiq, который запускает копию приложения, я бы воспользовался легковесными самописными скриптами (можно назвать их микросервисами), которые запускаются и демонизируются с помощью systemctl, слушая очередь сообщений (backburner, rabbit).
  • Модели бы в эти микросервисы я подключил с помощью git submodules.
  • Общий код в виде словарей и сериалайзеров завернул бы в свой gem.

6) Какие pattern-ы программирования используются Вами в работе?

  • The Template Method pattern - самый ходовой и практичный. Позволяет инкапсулировать неизменяющуюся логику (алгоритм) в базовом классе,а меняющийся код упаковать в подклассы.

  • Далее идёт стратегия. Например, если Инстаграм забанил моего кравлера, который парсит подписчиков с помощью официально API,главный скрипт это детектит и меняет стратегию - теперь Инстаграм парсится с помощью phantom.js до тех пор, пока девелопер не создаст несколько новых аккаунтов, с помощью которого можно дальше парсить официально.

  • Адаптер. Т.к. код, который пишут программисты, слабо стандартизируем и, порой, пишется со скоростью мысли. И иногда вместо того, чтобы лезть во внутрь класса и втыкать туда свои подпорки и костыли, проще написать адаптер, который обернёт этот класс и предоставит нужный мне и приложению интерфейс. Адаптер - это еще и возможность менять хранилище в таких фреймворках, как hanami - либо пишем в быструю память, либо в базу, либо в файлы, сохраняя при этом единый интерфейс.

  • State machine, decorator

  • Service Objects - не уверен, паттерн ли это. Но данный подход позволяет разгрузить контроллеры (которые должны содержать лишь логику маршрутизации - как и при каких условиях отвечать 200, 404, 202) и тестировать сервисы отдельно.

7) Перечислите набор иструментов, сервисов, практик для отладки производитетельности страницы

Ответ на вопрос: flamegraph, benchmark,gem 'memory_profiler'

Т.к. я в основном работал с проектами, где:

  • ActiveRecord модели это всего лишь DAO (data acces object) с описанием взаимосвязей,
  • вместо строк используются symbols
  • любят raw sql
  • минимальное количество gems, которые добавляют в проект неизвестной f..kn magic,
  • для react-фронта собирается JSON и вью это рендерится на стороне клиента

-- то вопрос профилирования -- самый последний вопрос, у нас все работало и работает быстро.

8)Ссылка на пример Вашего кода на Ruby/Rails

9) Ссылка на пример Вашего кода на JS (Желательно с использование Vue/React)

Фрагмент кода на React, позволяющий рисовать графики с помощью d3:

Pure Js, позволяющий форматировать строки вида "от 1500 $ в месяц" на основании списка цен, которые приходят в JSON с учётом региона и локали:

Немного Sagas:

10) Ссылка на пример Вашего кода Elixir/Phoenix

nope

11) принимали участие в OSS, если да то какие проекты

nope (на работе и так есть чем заняться)

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