W ostatniej części serii tych artykułów wracam do Was z wyzwaniem technicznym ! Opowiem Wam jakie zadanie miałem do wykonania, jak sobie z nim poradziłem oraz podzielę się z Wami moimi odczuciami oraz wnioskami, które dotyczą całego procesu rekrutacyjnego.

Wyzwanie techniczne

Miałem wrażenie, że rozwiązałem pytania quizu i byłem gotowy na techniczne wyzwanie.

„30 minut może wystarczyć, aby coś rozwiązać”-  pomyślałem.

Następnie wysłali mi link do Code Sandbox z jednym plikiem JS:

// index.js

/*

We have lots of deployment dashboards where we have drop-down UI to select an application version to deploy. We want to ensure that software version numbers delivered to our UI from the back-end API are always ordered with the newest (highest) available version at the top.

Eg:

const input = [0.1.0, 3.2.1, 2.2.3, 0.1.1];

sortVersions(input) should return [3.2.1, 2.2.3, 0.1.1, 0.1.0];

*/

const sortVersions = (unsortedVersions) => {

  // code

};

export default sortVersions;

I plik testowy z pewnymi twierdzeniami, aby upewnić się, że jest poprawny

// index.test.js
import sortVersions from './index';
it('should sort correctly numbered versions', () => {
  const versions = ['0.2.0', '3.1.2', '0.1.6', '5.0.0'];
  const output = ['5.0.0', '3.1.2', '0.2.0', '0.1.6'];
  expect(sortVersions(versions)).toEqual(output);
});
// Other assertions

Zasady rozwiązania tego wyzwania:

  • Mógłbym użyć google do wyszukiwania informacji o API JS
  • Nie mogłem użyć Google do wyszukania problemu.

Pierwsze stwierdzenie było bardzo łatwe. Moje rozwiązanie było proste:

const sortVersions = (unsortedVersions) => {
  // code
  return unsortedVersions.sort().reverse();
};

I minęło! 🙂

Następnie musiałem rozwiązać drugie twierdzenie:

// index.js
it('should sort correctly numbered versions with different lengths', () => {
  const versions = [
    '1.3.0.9',
    '0.2.0',
    '3.1.2',
    '0.1.6',
    '5.0.0',
    '3.3.3.3',
    '3.3.3.3.3',
    '3.10',
    '0.2.0',
  ];
  const output = [
    '5.0.0',
    '3.10',
    '3.3.3.3.3',
    '3.3.3.3',
    '3.1.2',
    '1.3.0.9',
    '0.2.0',
    '0.2.0',
    '0.1.6',
  ];
  expect(sortVersions(versions)).toEqual(output);
});

I tutaj właśnie utknąłem.

Moje poprzednie rozwiązanie nie obejmowało takich przypadków. Po prostu wróciło::

[
  '5.0.0',
  '3.3.3.3.3',
  '3.3.3.3',
  '3.10',
  '3.1.2',
  '1.3.0.9',
  '0.2.0',
  '0.2.0',
  '0.1.6',
];

Powód jest oczywisty dla prostego sortowania ciągów. Domyślnie idzie w kolejności alfabetycznej, gdzie po 3,3 znajduje się później niż jakikolwiek 3.1. Ale w wersji semantycznej wiemy, że 3,10 jest większe niż 3,3.

Po zabawie metodami sortowania wpadłem na pomysł, aby wszystkie wersje miały ten sam rozmiar w oparciu o największą wersję.

Szczerze mówiąc, w tym momencie byłem już zdenerwowany, ponieważ nie mogłem pomyśleć, jak rozwiązać ten „prosty” problem, przez co zacząłem się niepokoić.

Otrzymałem od nich kilka wskazówek, jak mogę to rozwiązać, ale było to trochę trudne do zrozumienia. Nie dlatego, że nie wyjaśnili dokładnie, ale dlatego, że próbowałem zrozumieć wiele rzeczy w tym samym czasie.

Kiedy tworzyłem kod, aby wszystkie wersje miały taką samą długość, czas się skończył.

Jeden z programistów zapytał mnie, jakbym to rozwiązał, jeśli miałbym więcej czasu i wyjaśniłem, że moje pomysły polegają na tworzeniu wszystkich wersji tej samej długości, więc mogłem porównać je w poszczególnych blokach.

Podziękowałem im za poświęcony czas i wyłączyliśmy połączenie.

Jeśli jesteś ciekawy, jak rozwiązać ten problem, polecam przyjrzenie się tej odpowiedzi w StackOverflow. Właśnie to przetestowałem i rozwiązuje wszystkie specyfikacje.

Po teście

Szczerze mówiąc, po tym, jak odebrałem telefon, poczułem porażkę.

W ciągu ostatnich 5 lat rozwiązywałem już o wiele trudniejsze problemy, a na koniec pokonał mnie problem sortowania, co było ze mną nie tak?

Ale starałem się pocieszyć: „Ok… poszło mi dobrze we wszystkich poprzednich krokach, nawet gdy zadawali mi pytania techniczne… to nie powinno się zbytnio liczyć”.

Ostatnia rozmowa HR

Po tygodniu czekania, na odpowiedź czy zostanę przyjęty, czy też nie, w końcu zadzwoniła do mnie osoba z działu HR, mówiąc:

„Niestety nie będziemy kontynuować rozmów z Tobą”

Mogłem tylko czuć się bardzo sfrustrowany.

Następnie zapytałem, dlaczego i czy mogę uzyskać informacje zwrotne na temat tego, co mogę poprawić, a ona powiedziała mi:

„Programistom bardzo podobała się Twoja komunikacja i energia podczas przeprowadzania wywiadu. Podobało im się również to, że poprawnie odpowiedziałeś na większość pytań technicznych, ale myśleli, że nie udało Ci się rozwiązać dobrze ostatniego problemu.

hmm … ok, powiedziałem.

Mógłbym na wielu wyjazdach spierać się przeciwko tej decyzji, ale bądźmy szczerzy, decyzja została podjęta. To niczego by nie zmieniło.

Wyłączyłem rozmowę, zatrzymałem się na 5 minut, aby przetrawić poczucie porażki i próbowałem pomyśleć o całym tym procesie.

Myśli o zatrudnieniu X naszych umiejętności

Nie wiem, czy mieliście już okazję w życiu być osobą przeprowadzającą wywiad. Ja miałem taką okazję i mogę powiedzieć na pewno: nie jest to łatwe zadanie. A to dlatego, że proces rekrutacji jest ogólnie bardzo trudny.

Musimy w jakiś sposób zdefiniować kroki i rzeczy do oceny kandydata i pomimo naszego celu, jakim jest przejrzystość i analityczność, nie jest to zdecydowanie doskonała metoda.

Ludzie myślą, uczą się, rozwiązują problemy, komunikują się inaczej niż inni, a w procesie rekrutacji staramy się stworzyć przewodniki i filtry, których oczekujemy od ludzi.

Oznacza to, że jeśli ktoś po prostu nie pasuje do tego, czego oczekujesz, może to być dobry sygnał, że ta osoba nie jest idealna do tej pracy. Ale… czy to znaczy, że ta osoba byłaby złym profesjonalistą?

Nie sądzę.

Pamiętam, że kiedy w końcu udało mi się zdobyć pierwszą pracę jako programista, podjąłem podobne wyzwanie związane z kodem i po prostu nim kierowałem.

Chcecie poznać różnicę między mną 3 lata temu a mną teraz? W tym momencie cały czas ćwiczyłem rozwiązywanie algorytmów na platformie FreecodeCamp.

Po tym, jak dostałem pracę, udowodniłem, że jestem wartościowym pracownikiem i mogę z całą pewnością powiedzieć, że trudne myślenie, które zdawałem podczas rozmowy kwalifikacyjnej, nie było tym, co skłoniło mnie do wysłania produktu, ponieważ rzadko zdarzały się momenty, w których nie mogłem użyć Google do wyszukiwania jak ludzie rozwiązują ten problem, aby stworzyć inne rozwiązanie.

Miałem do rozwiązania kilka trudnych problemów i wszystkie rozwiązywałem w krótkim lub długim czasie, czasem z pomocą innych, czasem sam.

Aby dostać moją obecną pracę, musiałem stworzyć aplikację React, która używa publicznego API, dodać testy (E2E), nieskończone przewijanie, animację między stronami i gdzieś je hostować, wyjaśnić moje rozwiązanie, moje zmagania i działać w grupie, aby rozwiązać niektóre problemy które miałem .

I to jest to, co robię przez większość dni, aby zarobić pieniądze.

Czy brak możliwości rozwiązania algorytmu oznacza, że ​​nie jestem dobrym programistą?

Nie sądzę. Moim zdaniem mówi tylko, że nie udało mi się rozwiązać problemu w określonych warunkach. Ale znowu, to jest ich miara tego, jak oceniać profesjonalistę.

Nie chodzi mi tutaj o to, żeby narzekać, dlaczego mnie nie zatrudniono, ale po to, żeby Wam wyjaśnić, że: niepowodzenie w rozmowie kwalifikacyjnej nie oznacza, że ​​poniosłeś porażkę jako zawodowiec.

Nauka

Ogólnie rzecz biorąc, wykonanie tego całego procesu wiele mnie nauczyło.

Na następne rozmowy kwalifikacyjne będę przygotowany do łatwego odpowiadania na pytania dotyczące umiejętności miękkich. Nigdy nie zapomnę różnicy między inline i inline-block lub czym jest metoda HTTP OPTIONS i różnica między PUT a PATCH.

Ale moja największa nauka brzmiała: staraj się być przygotowany na wszystko.

Możesz zostać poproszony o zaimplementowanie jakiejś aplikacji przy użyciu React, Vue, Angular, cokolwiek, a nawet rozwiązanie niektórych trudnych problemów w JS.

W tym celu zacząłem już spędzać kilka godzin dziennie próbując rozwiązywać problemy na platformach takich jak Codewars, FreeCodeCamp Learn i Codility.

Podczas gdy wciąż wdrażam nowe rzeczy na mojej osobistej stronie internetowej i coraz lepiej rozumiem, jak tworzyć solidną aplikację front-end.

Wniosek

Mam nadzieję, że moje doświadczenie da Wam  wgląd w to, co możecie zrobić inaczej, aby dostać swoją pierwszą pracę lub przynajmniej być przygotowanym do kierowania procesem rekrutacji!

Raul Melo

Programista, pisarz w wolnym czasie, uzależniony od technologii, miłośnik open-source, który wierzy, że jedyną drogą do zmiany życia jest edukacja.