Skip to content

Instantly share code, notes, and snippets.

@artkirienko
Last active February 3, 2022 19:18
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save artkirienko/56a04b735ee8c4e472d3dbf527c0ea03 to your computer and use it in GitHub Desktop.
Save artkirienko/56a04b735ee8c4e472d3dbf527c0ea03 to your computer and use it in GitHub Desktop.
Ruby on Rails interview questions

General: UNIX, HTTP/HTTPS/SSH, API, regex

• В чём разница между процессом и тредом?

• Что такое мультизадачность?

• Устройство файловой системы. Файловые дескрипторы, inode.

• Знаешь ли, что такое race condition? Сталкивался ли в реальной жизни (когда возникало и как боролся)? Когда может произойти?

• Как работает https, ssh (для чего там public_key, private_key; что в https вместо public_key, private_key? браузер на спешит каждый раз стучать в центр выдачи сертификатов, чтобы проверить подлинность сайтов, как он проверяет подлинность)?

10.0.0.7/29 Что это такое? О чём это? Когда это синтаксически верно? Какую информацию из этого можно вынуть? Крайние значения имеют какой-то особый смысл или это тоже просто ip-адреса компьютеров?

10.0.0.7/29 Беру, вставляю в адресную строку браузера, жму на Enter. Что происходит? Как этот запрос будет выглядеть? Сможешь написать? Зачем нужен заголовок Host в http-запросе? Что такое GET? Какие ещё бывают? Зачем они нужны? Чем GET отличается от POST? Чем тело запроса отличается от заголовка запроса? Помимо способа передачи параметров, с точки зрения браузера, есть ли ещё какие-то отличия между GET и POST?

• Что происходит с того момента, когда ты вводишь в строчке браузера название сайта и до того момента, когда отобразится страница.

• Какие заголовки http ты знаешь? Зачем нужен http-заголовок Content-Length? С какими mime-типами ты сталкивался?

• Авторизация в API. Где хранить сессию в API?

• Есть файлик, в котором через пробел, скажем, записан timestamp и какая-нибудь измеряемая величина. И файлик какой-то большой. Нужно каждой измеримой величине посчитать, скажем, среднее, минимальное и максимальное для окошка в 60 секунд (проще: 60 секунд вперёд; сложнее: 30 секунд назад, 30 секунд вперёд). То, что время отсчётов будет равномерно идти — совершенно необязательно. Как это задачу решать?

• Как работает TCP/IP?

• Как работает Ethernet? Коллизии?

• Можешь рассказать про REST? Как ты понимаешь? Юзается ли у вас? Плюсы, минусы, подводные камни, о чём это?

• Можешь рассказать что вообще такое REST? Для чего он нужен?

• Чем отличается memcached от Redis?

• Дано регулярное выражение

^[+-]?(\d+\.\d*|\.\d+)([Ee][+-]?\d+)?$

как его прочитать слева направо? Что оно обозначает? Как расшифровывается e23 в научной форме записи числа? В этом регулярном выражении есть ошибка: как исправить это регулярное выражение, чтобы целые числа тоже начали работать?

• Диалог:

  • Как поменять значениями две переменные без использования третьей?
  • Это на руби что-ли?
  • Ну можешь и на Си.

(ну тут максимальное количество способов, которыми можешь это сделать)

• Как ты развиваешься? Какими путями? Книги? Ресурсы? Конференции?

OOP

• Что такое SOLID?

• Какие дизайн-паттерны применял в жизни? (Не какие знаешь, а какие применял?)

• Можешь рассказать про паттерн декоратор? Какая основная суть паттерна декоратор?

• Какая разница между декоратором и презентером?

• По поводу организации кода в rails-проектах. Какими принципами руководствуешься? Какое у тебя сложилось мнение по поводу всех этих штук, паттернов, толстых контроллеров, тонких моделей, средних контроллеров, толстых моделей. Вот это вот. Опиши, что вообще как.

• Вы используете сервисные объекты. Что они из себя представляют у вас?

• Тебе на Code Review прислали сервис обжект. Руби класс. Ну, среди прочего кода. Это вполне себе плейн руби обжект. И тебе нужно понять вообще класс как, нормальный или не нормальный? На что ты будешь смотреть, когда оцениваешь класс? В целом, как он написан и прочее. Ну это такой открытый вопрос.

• Какие ты паттерны используешь в рельсах?

DBMS

• Расскажи про индексы в Postgres. (Какие типы, чем отличаются, плюсы минусы и т.д.)

• В чём разница между row и tuple?

• Как хранятся данные в таблице? Внутри как они представлены?

• Как обеспечивается транзакционность?

• Что такое пессимистичная/оптимистичная блокировка?

• Так смотри значит по базе данных. Ты используешь Postgres. Представим, что у тебя тормозит запрос. Как будешь его оптимизировать? Как будешь находить узкие места?

• В базах данных индексы меня интересуют. Пусть у нас будет таблица users. Два столбца: f_name, l_name. Бывают индексы по нескольким столбцам, да? Имеет значение при определении индекса в каком порядке я укажу эти столбцы? И какая разница, (f_name, l_name) или (l_name, f_name)?

• Что такое транзакция в базах данных? Для чего нужно?

• С какими базами данных сталкивались в работе?

• Что такое нормализация базы данных? Для чего она используется?

• В чём отличие left / inner join?

• Что такое индексы, для чего они и как работают? Плюсы и минусы индексов?

• Что можешь про транзакции рассказать? Для чего они нужны и что это такое вообще?

• Какие типы соединений (объединений) есть в sql? (вложенными циклами; хэшированием; слиянием сортированных списков)

• Есть таблица posts, есть таблица users, есть таблица posts_users. Мне нужно найти все посты, у которых имя_пользователя = 'test'.

• Given the following table t:

     d     
------------
 2014-01-05
 2014-01-02
 2014-01-18
 2014-01-12

where d is a date, column has unordered values.

make an SQL query which produces

     d1     |    d2    
------------+------------
 2014-01-02 | 2014-01-05
 2014-01-05 | 2014-01-12
 2014-01-12 | 2014-01-18
 2014-01-18 | NULL

Ruby

• Почему в MRI Ruby не может быть достигнута полная параллельность на потоках? Что такое GIL?

• В руби есть возможность запускать процессы. Знаешь, как это делается? (Process.new) Что именно делает эта функция?

• Какие недостатки ты знаешь в руби?

• Чем отличается lambda от proc?

• Есть такой термин — метапрограммирование. Что это означает? И как в руби используется? В частности в rails?

• Можно вызвать метод send'ом. А как ещё можно вызывать метод? Чем send от public_send отличается?

• Есть такая штука как method_missing. Что это такое и как вообще происходит обращение к некому методу?

• Для чего нужны модули в руби?

• Как идёт поиск метода в руби?

• Что такое метакласс?

• Что такое символы?

• При наследовании приоритет отдаётся модулю или наследуемому классу?

class A < B
  include M
end

Ruby. Что это за язык? Какой у него тип?

• В руби есть такие методы and и or. А есть ещё такие &&, ||. Они чем-то отличаются?

• Полиморфизм инкапсуляция наследование в руби.

• Сможет ли метод изменить константу:

class SomeClass
  PI = 4

  def hello(a)
    a = 3.14
  end
end

SomeClass.new.hello(SomeClass::PI)
p SomeClass::PI
class SomeClass
  A = {}

  def hello(h)
    h[:hello] = 'hello'
  end
end

SomeClass.new.hello(SomeClass::A)
p SomeClass::A

• Как сделать нормальный monkey-patch в руби? (Вопрос про Refinements)

Ruby on Rails

• Что такое rack?

• Какие недостатки ты знаешь в рельсах? Вообще хотел бы отказаться от рельс в пользу чего-то другого?

• Какие особенности есть у sidekiq? Чем отличается от Delayed::Job, от resque?

• Хуки в моделях ActiveRecord. Как соотносятся sql-транзакции и эти хуки? Например, обновили модель, сохраняем в базу данных. Когда началась транзакция, когда закончилась?

• Если я в after_save буду вызывать что-нибудь внешнее, например, отправку e-mail'а. Какие могут быть сложности?

• Если у нас два after_save коллбэка определено (на модели User). Один ставит в очередь отправку e-mail'а, а второй какую-то ещё запись в базе данных создаёт. Допустим, юзер сохранился, отправка e-mail'а поставилась в очередь, но следующий callback упал. Что произошло в этом случае? Пользователь останется? Ну и второй вопрос, как лучше это написать (если не два коллбэка after_save)?

• Для чего нужны концерны в rails?

• Можешь рассказать про паттерн MVC и как вообще устроены rails изнутри?

• Давай поговорим про миграции в рельсах. Почему их туда вообще туда сделали? И какую проблему они решают?

• По системам полнотекстового поиска. С какими сталкивался? Сталкивался или слышал?

• Представь, тебе либо дали новый проект, либо к этой части проекта, на котором ты работаешь — никогда с этой частью не сталкивался. И говорят «проблема такая-то: там что-то не работает». Как ты будешь искать решение?

• Представь, что поставили задачу: нужно сделать приложение, которое будет управлять какими-то задачами. TODO-лист. Единственное требование — чтобы можно было добавить задачу, отметить её как выполненную ну и разделить эти два списка как-то визуально. Всё это должно быть без перезагрузки страницы. Как ты эту задачу решишь? С помощью каких технологий, фреймворков и так далее. И сколько это на твой взгляд времени займёт.

• Кроме rails ещё какие-нибудь фреймворки рубишные использовал?

• Чем отличается joins от includes?

Single table inheritance

Polymorphic associations

Testing

• Чем отличается TDD от BDD?

• Касательно Rspec, ты какие тесты пишешь?

• Что такое интеграционные тесты?

• Как бы ты сейчас принимал решение о покрытии кода тестами? Т.е. тебе дают задачу, её нужно сделать и потом тебе же её поддерживать. На чём бы основывался?

• Если x — это время сколько ты кодишь сам функционал, а y — сколько ты кодишь тесты. x/y — примерно сколько?

Write code

• Синтетическая задача на регулярные выражения. Делаю упор на слове «синтетическая», потому что в продакшене такое делать точно не получится. Нужно написать регулярку, которая будет описывать положительные целые числа (т.е. на знаки забиваем, на точки тоже) от 0 до 174.

• Нужно написать функцию, которая из целого числа на входе будет возвращать вторую младшую десятичную цифру. Если число на входе 12345, то вернуть нужно 4.

• Нужно написать функцию, которая в заданном массиве b целых чисел будет искать число ближайшее по разнице к заданному числу a и возвращать найденное число. При этом, если кандидатов больше одного, то вернуть нужно то, которое ближе к началу массива.

Например,

a = 9
b = [-15, 64, 10, -3, 8, 640000000, ...]

Если где-то в многоточии есть 9, то функция closest(a, b) вернёт 9. Если в многоточии нет 9, то функция closest(a, b) вернёт 10.

• Ты работаешь в букмекерской конторе. Нужно написать программу, которая возвращает 0, 1 или 2. На вход a - Array счёт, bArray счёт.

Например, пользователь поставил, что команды сыграют со счётом 0:1. Команды сыграли со счётом 1:1.

some_method([0, 1], [1, 1])

Возможны три варианта: • угадал полностью счёт • угадал исход • не угадал

На каждый из случаев нужно возвращать какую-то цифру (т.е. можно самому выбрать, какую цифру на какой случай возвращать)

def some_method(a, b)
  # write code here
end

Запрещается использовать условные конструкции (if, unless, тернарный оператор)

• Реализовать метод, который будет разворачивать строку. Без использования reverse.

• Как ты будешь проверять регуляркой валидность email'а? Чем /\A \z/ отличается от /^ $/?

• Дано (код ниже). Реализовать memoize. На выходе должно один раз вывестись "called" и 6 раз вывестись "ok".

class SomeClass
  def some_method
    puts "called"

    sleep 1

    "ok"
  end

  memoize :some_method
end

new_class = SomeClass.new

puts new_class.some_method
puts new_class.some_method
puts new_class.some_method
puts new_class.some_method
puts new_class.some_method
puts new_class.some_method

Ответ. Должно получиться что-то типа:

module Memoizer
  def memoize(name)
    @@store = {}

    func = instance_method(name)

    define_method(name) do |*args|
      @@store[[args, name]] ||= func.bind(self).call(*args)
    end
  end
end


class SomeClass
  def some_method
    puts "called"

    sleep 1

    "ok"
  end

  memoize :some_method
end

new_class = SomeClass.new

puts new_class.some_method
puts new_class.some_method
puts new_class.some_method
puts new_class.some_method
puts new_class.some_method
puts new_class.some_method

• Сделать манки-патч на класс Array. Написать метод my_each без использования each.

• Given the file with random chars, draw a histogram of chars count.

For example for file with content

123456789012345678909999991234569999

Output should be the following:

1 ***
2 ***
3 ***
4 ***
5 ***
6 ***
7 **
8 **
9 ************
0 **

HTML, CSS, JS

• допустим есть два div'a. Один сверху, один снизу. У одного margin-bottom: 10px, а у другого margin-top: 10px. Какое будет между ними расстояние?

• Есть страничка, где куча изображений. И есть кнопка: «загрузить ещё». Нужно повесить некое событие на каждую картинки, например, открывать полную версию картинки на этом экране. И нужно навесить на все эти image'и, в том числе и на те, которые потом появятся. Как бы ты это сделал?

• Чем click отличается от on 'click'?

Logic

• Есть аналоговые часы. На этих часах 15:15. Найти угол между стрелкой, показывающей часы, и минутной стрелкой.

• Есть торт. Нужно разрезать его на 8 частей тремя разрезами.

• Взяли планету Земля. Для простоты будем считать, что это идеальный шар. Обернули вокруг неё ленту по экватору, так что лента легла без зазоров, плотно. Увеличили длину этой ленты на один метр. Лента равномерно поднялась на столько, на сколько она смогла подняться. Везде расстояние от земли до ленты одинаковое. Вопрос: сможет ли кошка пролезть под лентой?

• У Маши не хватает для покупки книжки 7 рублей, а у Миши - 1 рубля. Они сложились, чтобы купить одну книгу на двоих, но денег все равно не хватило. Сколько стоит книга?

• Есть две изолированные друг от друга комнаты. В одной находятся 3 лампочки накаливания, в другой - три выключателя. Вы стоите в комнате с выключателями и можете перейти в комнату с лампочками лишь один раз. Необходимо определить, какая лампочка включается каким выключателем.

• Длина головы рыбы 9 см, хвост составляет сумму длин головы и половину туловища, туловище составляет сумму длин хвоста и головы. Какова длина рыбы в см?

Full test tasks

• Приложение принимает список url-ов. Приложение мониторит эти url. Если с url всё хорошо (коды: 2xx, 3xx), то мониторится раз в минуту. Если плохо (остальные коды, нет ответа), то нужно об этом сообщить и начать мониторить этот url раз в 30 секунд; как только с ним опять всё стало хорошо, нужно об этом сообщить и мониторить раз в минуту.

Интерфейс может быть консольным. Сообщать можно просто выводом в консоль.

• Написать сервис с API.

Сервис должен иметь один endpoint и предоставлять возможность версионирования (версия указывается в header'e запроса).

Url endpoint'a - '/data'.

Post запрос:

Обязательный параметр - type. Может принимать два значения: 'time' и 'location'.

Если параметр 'time', то необходим еще один обязательный параметр 'value', который может принимать значения в формате 'hour:minutes day.month' (19:25 13.11) / 'end' (конец текущего дня) / 'beginning' (начало текущего дня).

В случае 'location', обязательны три параметра 'latitude' (double, 4 зн после точки), 'longitude' (double), 'name' (string) и один необязательный 'timezone' (вида '-04:00').

Полученные данные сохраняются в бд.

Get запрос:

Единственный query параметр 'timezone' должен указывать на 'name' одного из хранимых 'location'. Endpoint должен возвращать список хранимых 'time' для указанной timezone. В случае отсутствия query параметра, либо пустого поля 'timezone' для указанного 'location', возвращать в utc.

Использовать JSON API формат ответов. Добавить ошибки по своему усмотрению. Покрыть код тестами. Указать используемую database и web server. Сервис должен быть рассчитан на средне-высокую нагрузку.

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