Najlepsze pytania i odpowiedzi rekrutacyjne z Ruby on Rails

Pytania rekrutacyjne dla junior programisty Ruby on Rails

01

Czym jest ORM w Rails?

ORM to Object Relationship Model, w którym klasy odpowiadają tabelom w bazie danych, a obiekty odpowiadają bezpośrednio wierszom tabeli.

02

Wyjaśnij, czym jest rake w Rails.

Rake to narzędzie Ruby, które zastępuje uniksowe „make” i korzysta z plików „Rakefile” oraz „.rake”, żeby utworzyć listę zadań. W Rails używa się go do typowych zadań administracyjnych, takich jak migrowanie bazy danych za pomocą skryptów, wczytywanie schematu do bazy i tak dalej.

03

Wyjaśnij, czym jest Ruby on Rails.

Ruby: obiektowy język programowania inspirowany PERL-em i Pythonem.

Rails: framework służący do budowy aplikacji webowych.

04

Czy Ruby jest typowany statycznie czy dynamicznie?

Ruby jest typowany dynamicznie. Dlatego typ zmiennej możesz zmienić w locie.

W Ruby poniższe linie kodu, wykonane jedna po drugiej, nie spowodują błędów.

05

Opowiedz o getterach i setterach w Ruby.

Getter pozwala odczytać zmienną instancji. Setter pozwala ją ustawić.

Metody gettera i settera możesz zdefiniować ręcznie.

Ale Ruby daje trzy akcesory, które robią to samo i wyglądają czyściej: attr_reader (getter), attr_writer (setter) oraz attr_accessor (setter i getter).

06

Co się dzieje, gdy wywołujesz metodę w Ruby?

Do obiektu wysyłana jest wiadomość zawierająca nazwę metody. Jeśli ta metoda istnieje dla obiektu, obiekt ją wywołuje.

Stanie się to bardziej oczywiste, gdy przyjrzysz się metodzie send w Ruby.

07

Czym jest Gemfile?

W Gemfile określamy zależności aplikacji w Ruby. Plik znajduje się w katalogu głównym projektu.

08

Czym jest Gemfile.lock?

Zawiera zapis dokładnych wersji zainstalowanych gemów. Dzięki temu te same wersje zainstalują się, gdy projekt sklonuje inny komputer.

Dla porównania: podanie gema w Gemfile bez przypięcia do konkretnej wersji zainstaluje po prostu jego najnowszą wersję.

09

Czym jest MVC?

MVC (Model-View-Controller) to wzorzec projektowy, na którym zbudowany jest Rails. Dzieli przetwarzanie informacji na trzy części.

Model zarządza danymi i logiką. Widok wyświetla informacje. Kontroler przyjmuje dane wejściowe i przygotowuje je dla modelu lub widoku.

10

Czym jest ActiveRecord?

Active Record to ORM (Object Relational Mapping), który mapuje modele na tabele bazy danych. Ułatwia to dostosowywanie aplikacji, bo nie musimy już pisać SQL-a wprost, żeby wczytywać, zapisywać czy usuwać obiekty.

Daje też pewną ochronę przed SQL injection.

Pytania rekrutacyjne dla mid programisty Ruby on Rails

01

Jak wdrażałeś autoryzację w przeszłości?

Autoryzacja (nie mylić z uwierzytelnianiem) polega na tym, że różne typy użytkowników mają w aplikacji różne poziomy dostępu. Przydaje się, gdy typów użytkowników jest wiele i mają różne uprawnienia.

Autoryzację implementuje kilka gemów, na przykład Pundit i CanCanCan.

02

Czym są callbacki?

Callback to mylące określenie. To haki w cyklu życia obiektu, w których możesz wykonać metody.

Callbacków związanych z tworzeniem, aktualizowaniem i usuwaniem obiektu jest sporo — na przykład before_validation, after_save i after_destroy.

Przydają się do logiki warunkowej, takiej jak tworzenie powiązanego rekordu kontaktu przy tworzeniu rekordu użytkownika.

03

Kiedy użyjesz callbacku before_save, a kiedy after_save?

Aktualizacja obiektu po jego zapisaniu wymaga dodatkowej transakcji bazodanowej, żeby zapisać zmianę. Jeśli więc aktualizujesz atrybut obiektu, callback before_save jest wydajniejszy.

Czasem jednak informacja o obiekcie powstaje dopiero po zapisie (na przykład id). Jeśli więc do stworzenia powiązanego wpisu potrzebne jest id, trzeba to zrobić w callbacku after_save.

04

Czym są inicjalizatory w Rails?

Inicjalizatory zawierają logikę konfiguracji i uruchamiają się tylko podczas ładowania aplikacji. Oznacza to, że po ich zmianie trzeba zrestartować serwer Rails. Znajdują się w katalogu /config/initializers.

05

Jaka jest różnica między delete a destroy?

  • delete: usuwa wpis.
  • destroy: usuwa wpis i wykonuje callbacki.

Najczęstszy callback destroy w aplikacjach Rails definiuje się w asocjacjach w plikach modeli. Na przykład poniższy fragment usuwa powiązane komentarze, gdy artykuł zostaje usunięty.

06

Co oznacza „fat models, skinny controllers”?

Logika biznesowa powinna znajdować się w modelach, a nie w kontrolerach. Dzięki temu łatwiej testować ją jednostkowo i jest bardziej wielokrotnego użytku.

Kontrolery są tylko rękami przekazującymi informacje między widokami a modelami.

Zwykle podaje się to jako radę dla początkujących programistów Rails. W praktyce nie jest to zalecane, zwłaszcza w dużych aplikacjach.

07

Co oznacza „skinny controllers, skinny models”?

Wraz ze wzrostem kodu „grube” modele wymykają się spod kontroli, robią zbyt wiele i stają się niezarządzalne. Modele powinny odpowiadać za trwałość danych, nie będąc przeładowane logiką.

Modele można odchudzić, pamiętając o zasadzie pojedynczej odpowiedzialności i przenosząc logikę do innych wzorców projektowych, takich jak obiekty usługowe.

08

Jaka jest różnica między metodami klasowymi a metodami instancji?

Metody klasowe są dostępne w klasach, a metody instancji — w instancjach (oczywiście). Zwykle służą do różnych celów.

W klasie Article metoda instancji może policzyć liczbę słów w treści konkretnego artykułu, a metoda klasowa — liczbę artykułów danego autora spośród wszystkich artykułów (widzisz różnicę w zakresie?).

Metody klasowe oznacza się przez def self.nazwa_metody.

09

Jak Rails zarządza stanem bazy danych?

Programista ręcznie tworzy pliki migracji i dodaje do nich instrukcje.

Mówią one ActiveRecord, jak zmienić istniejący stan bazy danych. Dlatego usuwanie lub modyfikowanie wcześniejszych migracji może zepsuć bazę i nie jest zalecane.

Ręczne tworzenie plików migracji różni się od innych frameworków, takich jak Django, gdzie określasz docelowy stan bazy danych, a migracje wprowadzające potrzebne zmiany generują się automatycznie.

10

Jakich wzorców projektowych w Rails używałeś?

Wzorców projektowych w Rails jest sporo: obiekty usługowe, obiekty wartości, obiekty formularzy, obiekty zapytań, obiekty widoku, obiekty polityk i dekoratory.

Szczegółowy opis każdego z nich to temat na cały osobny wpis, ale tutaj znajdziesz świetny tutorial z przykładami.

Pytania rekrutacyjne dla senior programisty Ruby on Rails

01

Czy Ruby pozwala na wielokrotne dziedziczenie?

Ruby nie pozwala dziedziczyć z więcej niż jednej klasy nadrzędnej, ale umożliwia mixiny modułów przez include i extend.

02

Ruby jest typowany silnie czy słabo?

Ruby jest typowany silnie. Jeśli spróbujesz obliczyć „hello” + 3, dostaniesz błąd.

Dla porównania JavaScript jest typowany słabo i po prostu obliczy to samo działanie jako „hello3”.

03

Jakich frameworków używałeś do zadań w tle?

  • Delayed::Job: łatwy w konfiguracji i użyciu. Kolejki przechowuje w tabeli bazy danych. Jeśli ta sama baza obsługuje Delayed::Job i produkcję, duża liczba zadań może stać się wąskim gardłem bazy.
  • Sidekiq: kolejkuje zadania w Redisie. Redis to magazyn danych w pamięci, więc jest bardzo szybki. Sidekiq komplikuje infrastrukturę, bo trzeba dołożyć Redisa.
  • Sucker Punch: działa jako proces Ruby i trzyma wszystkie zadania w pamięci. Jeśli proces padnie, zadania przepadają. Niezalecany w aplikacjach krytycznych.

04

Jak zadeklarować konstruktor w klasie Ruby?

Konstruktor definiuje się metodą initialize, która jest wywoływana przy tworzeniu nowej instancji klasy. Zdefiniowanie tej metody nie jest wymagane. Często służy do nadania wartości atrybutom nowych instancji.

05

Jaka jest logika stojąca za helperem?

Logika helpera powinna wspierać wyłącznie widoki.

Dobrym kandydatem na helper jest logika formatowania dat, potrzebna w kilku różnych widokach.

06

Kiedy używamy self w Ruby?

Używaj self przy definiowaniu i wywoływaniu metod klasowych.

W klasie self odnosi się do bieżącej klasy, więc jest wymagane, gdy metoda klasowa wywołuje inną metodę klasową.

self.class.metoda jest wymagane, gdy instancja wywołuje metodę klasową.

07

Czym jest rack?

Rack to API znajdujące się między serwerem WWW a Rails. Pozwala podłączać i wymieniać frameworki, na przykład Rails na Sinatrę, albo serwery WWW, na przykład Unicorna na Pumę.

08

Jaka jest różnica między proc a lambdą?

Zarówno proc, jak i lambda to zapisane bloki, ale ich składnia i zachowanie nieco się różnią.

Lambda zwraca wartość z samej siebie, a proc zwraca ją z metody, w której się znajduje.

 

Zwróć uwagę, że method_proc zwraca 1, bo wywołanie proca kończy wykonywanie wewnątrz metody.

09

Czym jest PORO?

PORO to skrót od Plain Old Ruby Object.

Choć w Ruby niemal wszystko jest obiektem, ActiveRecord zwykle korzysta z wielu złożonych obiektów. Termin PORO oznacza więc zazwyczaj mały, prosty obiekt wspierający logikę biznesową.

10

Jaka jest różnica między count, length i size?

  • count: wykonuje zapytanie SQL, żeby policzyć liczbę rekordów. Przydaje się, gdy liczba rekordów w bazie mogła się zmienić względem tej w pamięci.
  • length: zwraca liczbę elementów kolekcji znajdującej się w pamięci. Jest lżejsze niż count, bo nie wykonuje transakcji bazodanowych. Można go też użyć do policzenia znaków w ciągu.
  • size: to alias dla length i robi to samo.
hire_an_expert_01
Rekrutujesz programistów Ruby on Rails? Mamy ludzi, których szukasz!
Skontaktuj się
Szukasz sprawdzonych programistów Ruby on Rails do swojego zespołu?

W naszej Talent Network czeka setki sprawdzonych w boju ekspertów od tworzenia oprogramowania.

Jesteś programistą Ruby on Rails i szukasz świetnych projektów? Dołącz jako Talent