Ruby є однією із швидких, багатогранних та функціональних мов програмування. У середині нульових років відбувся справжній бум на Ruby програмістів. І по сьогодні мова програмування Ruby залишається затребуваною, як і попит на Ruby-розробників.
У цій статті ми поділимося рекомендаціями, як пройти співбесіду з Ruby, які питання найчастіше ставляться під час технічної співбесіди, щоб допомогти вам підготуватися.
Для чого потрібна Ruby мова програмування?
Ruby мова програмування здебільшого використовується для розробки серверної частини застосунків та сайтів, CRM-систем, інколи — QA-фахівцями, що займаються автоматизацією тестування. З появою у 2003-му популярного фреймворку Ruby on Rails, мова Ruby стала ще більш затребуваною у розробці.
І сьогодні вона залишається однією із найпопулярніших опенсорсних мов, що застосовуються у тисячах ІТ-компаній по всьому світу.
Перевагами програмування на Ruby є:
- Швидкість та легкість написання коду (без шкоди для якості), менша кількість строк, висока продуктивність.
- Гнучкість (код легко редагувати, випускати оновлення та адаптуватися до вимог користувачів).
- Багато безкоштовних бібліотек та інструментів.
- Кросплатформеність: код, написаний на Ruby, також працює на різних ОС та пристроях, у різних браузерах.
- Високий рівень безпеки, захист даних.
Мова Ruby є універсальною та має широкий спектр використання.
У наступних 4 типах проєктів застосування Ruby надає відчутну різницю у порівнянні з іншими мовами загального призначення:
1. Веб-розробка
Багато відомих сайтів були створені на базі фреймворку Ruby on Rails: Airbnb, Twitter, Dribbble, Bloomberg, Netflix, Zendesk, SoundCloud, Upwork, Hulu, Basecamp, Change.org.
2. Мобільні застосунки
Для цієї мови доступний ряд тулів для розробки, таких, як:
Titanium Studio, Ruboto (Android), RubyMotion (iOS), MobiRuby (Android/iOS), Rhodes (фреймворк для розробки Enteprise Mobility застосунків для смартфонів Motorola).
3. Програми для десктопних пристроїв
Ruby використовується у якості скритової мови для GitHub та GitLab, Redmine (система управління проєктами), SketchUp (ПЗ для моделювання та візуалізації), XChat (IRC-клієнт) та інших.
4. Системне адміністрування
Часто застосовується сисадмінами компаній для обслуговування операційних систем типу Linux, BSD, Mac OS X.
Серед цікавих прикладів застосування Ruby слід відзначити:
- NASA Langley Research Center: авіакосмічна компанія використовує Ruby для проведення моделювання у дослідницькому центрі.
- Motorola використовує Ruby скрипти для моделювання, генерації сценаріїв та обробки даних.
- Toronto Rehab використовує застосунок, заснований на RubyWebDialogs, для регулювання та прослідковування звернень та дзвінків через сайт для власних-IT команд.
- У проєкті MORPHA — для створення реактивних елементів управління робота Siemens.
- Basecamp, веб-сервіс для управління проєктами, повністю написаний на Ruby.
Співбесіда з Middle Ruby розробником
Попит на розробників, які володіють Ruby/Ruby on rails, є великим, але і вимоги висуваються доволі жорсткі, особливо для фахівців рівнів Middle та Senior. Тож, якщо ви хочете отримати роботу на посаді Ruby-розробника, радимо ретельно підготуватися до інтерв’ю.
Різні компанії, скоріш за все, будуть ставити різні запитання під час співбесіди з Ruby. Стартапам важливо знайти досвідчених програмістів, які здатні швидко створювати продукти. Великі підприємства хочуть знати глибину розвитку розраба, що і з’ясовують під час технічної співбесіди з Ruby. В будь-якому випадку, кандидатові важливо знати цю мову та її використання у розробці.
Ресурс DOU опублікував перелік із 500+ питань для проходження технічної співбесіди з Ruby. Ми виділили топ-100 найбільш поширених запитань та завдань.
Для Middle розробників приблизний перелік питань включатиме загальні, питання щодо предметно-орієнтованого проєктування, баз даних, а також тестування та практичні завдання.
Загальне
1. SOLID: що це таке і які є приклади у Ruby?
2. Якими інструментами для логування ви користувались у роботі?
3. Як проводити моніторинг веб-застосунків?
4. Що таке Decorator/Singleton/Facade/Factory/Template Method/Strategy?
5. За допомогою яких процесів та інструментів ви деплоїли застосунки на staging/production?
6. Як виміряти швидкість виконання алгоритму?
7. Як покращити швидкість, коли один із ендпоінтів відпрацьовує довго?
8. Навіщо використовують кешування?
9. Коли використовується деградація функціональності?
10. Поясніть призначення та наведіть приклади лінивих обчислень.
Предметно-орієнтоване проєктування
11. Що таке DDD? Які його переваги перед класичним MVC?
12. Що являє собою модель?
13. Що таке контекст?
14. Як ви розумієте value object?
15. Що таке агрегування?
Git, code review
16. Коли проводите code review, на що першою чергою звертаєте увагу, що таке погано проведений code review?
17. Що являє собою Gitflow? Які правила використання Git ви застосовували на своєму минулому проєкті?
18. Які завдання є у команд squash, stash, cherry-pick, log?
19. Яких правил іменування комітів/гілок/пулл ріквестів дотримуєтеся?
Database
20. Що являє собою Database view та чим відрізняються materialized від non-materialized database view?
21. Чи можна гарантувати, що при збереженні даних у різні таблиці всі вони запишуться?
22. Як імпортувати великі (один-два мільйони рядків) масиви даних у CSV-файл?
23. Що являють собою індекси і як будувати їх за декількома полями?
Реляційні БД
24. Чим відрізняються джоїни FULL OUTER JOIN, CROSS JOIN, NATURAL JOIN, INTERSECT та EXPECT?
25. Назвіть специфічні типи даних у PostgreSQL.
26. Яка мета використання view, materialized view та recursive view?
27. Як створювати резервне копіювання даних? Що таке pg_dump?
28. Яку проблему розв’язує партиціонування?
NoSQL БД
Redis
29. Які завдання, типи даних та функції Redis? Як налаштовується БД?
30. Що таке pub/sub?
31. У чому суть mass insertion?
Elasticsearch
32. Які завдання Elasticsearch?
33. Що являють собою репліки та шарди?
34. Поясніть суть Query DSL?
35. Що є мапинг?
Статичний аналіз коду
36. Навіщо використовується утиліта danger?
37. Поясніть призначення overcommit.
38. Поясніть завдання кожного з наступних гемів:
- Rubocop;
- Reek;
- Rails Best Practices;
- Brakeman;
- RubyCritic;
- SimpleCov;
- Bundle Audit;
- Bundle Leak;
- Traceroute.
39. Які завдання у цих модулів:
- Eslint;
- Stylelint;
- Prettier.
Ruby
40. Які є проблеми у Ruby та як їх можна усунути?
41. Послідовність дій у Ruby при створенні гему.
42. За допомогою якого вбудованого класу в Ruby надсилається запит на сторонній API?
43. Чи є у Ruby можливість множинного наслідування?
44. Як відбувається запуск rspec та bundle exec rspec?
45. Який шлях пошуку методів у Ruby є максимально точним?
46. Виконайте наступне завдання: встановіть, після якого рядку коду ActiveRecord здійснює запит у базу
users = User.where(id: [1,3,4])
users.where(name: ‘Alex’)
users.inspect
Ruby on Rails
47. Назвіть види кешу в Rails та де його можна зберігати?
48. Яким чином можна створити функціональність для відсилання пошти у Rails-застосунку?
49. Де та як в Rails-застосунку краще тримати бізнес-логіку?
50. Яке призначення фреймворку Action Cable?
51. Коли використовуються Query Objects та Form Objects?
52. Що являє собою формат JSON API формат? Чи доводилося вам використовувати бібліотеки для серіалізації об’єктів у ньому?
Тестування
53. Чому тести на проєкті можуть виконуватися дуже довго?
54. Які інструменти дозволяють контролювати якість тестів?
55. Чим відрізняються TDD та BDD-підходи?
56. Як написати тести на код, у якому надсилається запит на API?
57. Які складові відповіді тестуються, коли пишеться тест на певний endpoint?
58. Коли проводиться імплементація нової функціональності або багфіксінг, чи може code coverage 100% створювати найменшу вірогідність щось «зламати»?
Сервіси та DevOps
59. Як ви використовували CI/CD-підхід на попередньому проєкті?
60. Яка різниця між Docker та віртуальною машиною?
61. Як працювати з image у Docker?
62. Що являють собою:
- Docker Client
- Docker Daemon
- Docker Compose
- Docker Hub
Завдання
63. Як порахували кількість пасажирів, що заходять чи виходять на певній станції метро?
64. Використовуючи низькорівневі бібліотеки (Net::HTTP, HTTP.rb, Faraday тощо), напишіть клієнт для відкритого API ресурсу.
65. Напишіть функцію, що поверне унікальні елементи масиву, при цьому не застосовуючи uniq або set, to_set зі стандартної бібліотеки. Ви можете використовувати хеш-таблиці, де ключами є унікальні елементи з масиву, а значеннями — true.
Senior Ruby розробник: питання та завдання
Senior-фахівець може вирішувати архітектурні завдання. Він виявляє ініціативу щодо покращення роботи усієї системи, проводить дослідження нових технологій, пошук вузьких місць, усунення хитрих багів.
Готуючись до співбесіди з Ruby, йому варто переглянути наступні питання та практичні завдання, що є найбільш розповсюдженими для цієї посади:
Загальні питання
1. Які є способи аутентифікації в API?
2. При проєктуванні API, які питання будете ставити клієнту?
3. Де ви використовували Singleton-патерн?
4. Які ознаки поганого коду?
5. У яких випадках краще проводити рефакторинг, а коли краще здійснити оптимізацію?
6. На прикладі будь-якого фреймворку в Ruby опишіть процес обробки HTTP-запиту.
7.Коли краще використовувати multi-tenant architecture?
Метапрограмування, DSL
8. Якщо в проєкті мається понад 1000 бізнес-операцій, як ви будете будувати бізнес-логіку?
9. Наведіть приклади паралельного виконання коду через Thread, Fiber, Ractor.
10. Поясніть суть дизайн-патернів Service, Form, Value, Policy, Guard.
11. Що являють собою архітектурні патерни Monolith, Microservices, Distributed app?
12. Яким чином можна оптимізувати швидкодію через benchmark, lineprof та flamegraph.
Ruby/Rails
13. На вашу думку, які є недоліки в Ruby, як вони заважають у розробці й що можна змінити, щоб їх нейтралізувати?
14. Яким чином можна визначити, скільки виконується код?
15. Як у розробці використовуються Thread?
16. Які коллбеки вам відомі в Ruby?
17. Як в Rails виглядає життєвий цикл Request — Response.
18. Чи можна передати контекст виконання одного методу в інший?
19. Які у Ruby базові концепти реалізації Singlethon-класу?
20. Як будете розв’язувати наступну проблему: вам необхідно імпортувати користувачів, що записані в CSV-файлі (кожен рядок — дані користувача) у базу Rails-застосунку. Що ви зробите, якщо файл матиме > 300000 рядків?
21. Дайте рекомендації, як побудувати semantic versioning для Rails API, який працює з IOS, Android та Web.
22. Задача: кожен запит, який приходить до Rails app незалежно від роуту, має повертати якомога швидше 403 статус. Як будете реалізовувати код?
БД
23. Транзакція та database lock: властивості та відмінності.
24. Розкажіть, що таке Pessimistic та Optimistic locking?
25. Що таке і які є види Database View?
26. Що собою являє партиціювання? Опишіть кроки для партиціювання верхньорівнево на прикладі будь-якої СУБД.
27. Яка різниця між партиціюванням та шардингом?
28. Ситуація: ваш сервер, на якому розміщений redis, перезапустився (причини невідомі). Які превентивні дії слід зробити заздалегідь, аби подібні ситуації не завдали шкоди?
Тестування
29. Як може під час Load Testing допомогти розробник?
30. Як можна пришвидшити тести на CI?
31. Якщо на проєкті (Rails API) немає процесу написання тестів, то як його впровадити?
Завдання
32. Вам необхідно спроєктувати реферальну систему: один користувач запрошує інших, вони стають його рефералами. Далі ці користувачі запрошують своїх рефералів. Таким чином формується деревоподібна структура. Модель виглядає наступним чином:
class Users < ActiveRecord::Base
end
Як ви зв’яжете її з рефералами?
33. Додайте метод:
class Users < ActiveRecord::Base
end
який порівнево повертає реферали користувача. Наприклад, user має реферали user1, user2. user1 має реферала user3, user2 має рефералів user4 та user5. У підсумку має бути результат:
{ 0 => [user],
1 => [user1, user2],
2 => [user3, user4, user5 }
34. Напишіть реалізацію структури даних Set. У чому полягає алгоритмічна складність додавання елементів?
Кілька слів наостанок
Мова програмування Ruby, що була випущена у далекому 1995-му, досі успішно використовується, вважається дуже потужною та функціональною мовою для веб-розробки. На цій мові написані Shopify, Netflix, Twitter, GitHub та багато інших
Маєте знання та досвід роботи з Ruby? Відправляйте свої резюме на посади Middle та Senior Ruby розробників. Залюбки переглянемо і запросимо на технічну співбесіду.
Читайте також: