JavaRush /Blog Java /Random-PL /Zadanie testowe na zatrudnienie, rozwiążmy to..
timurnav
Poziom 21

Zadanie testowe na zatrudnienie, rozwiążmy to..

Opublikowano w grupie Random-PL
Przyjaciele, witam wszystkich. Chcę podzielić się z Wami moim doświadczeniem w rozwiązywaniu zadania testowego na stanowisko programisty Java w rosyjskiej firmie. Od razu powiem, że wdrożenie głównej funkcjonalności zadania nie jest szczególnie trudne, ale jak zawsze ważne są szczegóły i drobiazgi, które uniemożliwiły mi złożenie go w terminie; nigdy nie odpowiedzieli nic na temat zadania - ich wakat był już wypełniony, kiedy go do nich wysłałem. Sugeruję, abyś przyjrzał się zadaniu i sprawdził, czy zrobiłem wszystko, czego ode mnie wymagano. A dla tych, którzy nie mają pojęcia jak to zrobić, dodam sporo wody o tym, jak sobie z tym poradziłam. Jeżeli kogoś to interesuje to zapraszam na kotka. Od razu powiem, że nie będę tu wrzucał całego rozwiązania, ale będzie sporo wyjaśnień dla początkujących, jeśli ktoś nie chce czytać moich wynurzeń, to tutaj projekt na githubie . tekst samego zadania.
Zadanie testowe nr 1
Opis: Serwer API (JSON HTTP API) Narzędzia programistyczne: Framework Java : Play Framework 2.4 (lub nowszy) lub Spring boot 1.2.3 (lub nowszy) Baza danych: MySQL Protokół: HTTP, port 80 Funkcjonalność (żądania):
  1. Ładowarka.
    • Przesyłamy plik (obrazek awatara JPG) na serwer.
    • Zapisujemy obraz w katalogu na serwerze.
    • Odpowiedź serwera to wewnętrzny identyfikator URI obrazu.
  2. Dodanie nowego użytkownika.
    • Przesyłamy na serwer dane osobowe użytkownika (URI obrazu, nazwa użytkownika, adres e-mail itp.).
    • Zapisujemy informacje w bazie danych.
    • Odpowiedź serwera jest unikalnym identyfikatorem nowego użytkownika.
  3. Pozyskiwanie informacji o użytkowniku.
    • Przesyłamy unikalny identyfikator użytkownika do serwera.
    • Odczyt informacji z bazy danych.
    • Odpowiedzią serwera są dane osobowe użytkownika (patrz wyżej).
  4. Zmiana statusu użytkownika (Online, Offline).
    • Przekazujemy na serwer unikalny identyfikator użytkownika i nowy status (Online, Offline).
    • Zmiana statusu użytkownika.
    • Odpowiedź serwera - unikalny identyfikator użytkownika, nowy i poprzedni status.
    Uwaga: serwer wysyła zapytanie do zewnętrznego interfejsu API/bazy danych. Ponieważ jest to uproszczone zadanie testowe, konieczne jest wdrożenie „odcinka” z symulowanym dostępem i opóźnieniem czasowym 5-10 sekund.
  5. Statystyki serwera.
    • Przesyłamy na serwer parametry: 1. status klienta (Online, Offline lub nieobecny), 2. unikalny identyfikator (znacznik czasu) żądania (może być brak)
    • Odpowiedź serwera to lista użytkowników ze statusami i identyfikatorami URI obrazów, a także unikalnym identyfikatorem (znacznikiem czasu) żądania.
    Uwaga: Jeżeli żądanie zawiera parametry, serwer musi według nich filtrować swoją odpowiedź. Jeżeli żądanie zawiera unikalny identyfikator (znacznik czasu) żądania (otrzymanego wcześniej), to serwer powinien zwrócić tylko tych użytkowników, których statusy zmieniły się po (w czasie) tym unikalnym identyfikatorze (znaczniku czasu).
Obowiązkowe wymagania:
- SPOKOJNY. - Wszystkie dane są w formacie JSON. - Serwer API powinien być zaprojektowany z uwzględnieniem tego, że żądania 3 i 5 mają najwyższy priorytet (w stosunku do żądań 1, 2, 4) i muszą zostać zrealizowane tak szybko, jak to możliwe. - Błąd przetwarzania.
Wymagania opcjonalne (pożądane):
- Dokumentacja kodu. - Architektura serwera API musi być zaprojektowana pod kątem dużego obciążenia i skalowania. - Testy.
Wynik testu:
- Wynik zadania testowego należy dostarczyć w archiwum wraz ze szczegółowymi instrukcjami jego wdrożenia. Zaleca się dołączenie pliku Dockerfile w celu zbudowania kontenera Docker na potrzeby zadania testowego. Można pobrać na github.com. - Powinien zawierać krótką dokumentację utworzonego API (lista żądań, parametry żądań, formaty żądań, formaty odpowiedzi itp.). - Informacje o czasie spędzonym nad zadaniem testowym w kontekście: projektowania, programowania, dokumentacji itp. Należy pamiętać, że to zadanie testowe ma na celu jedynie ocenę wiedzy i umiejętności, a nie ma na celu stworzenia gotowego produktu (serwera API), dlatego dopuszczalne są uproszczenia wraz z objaśnieniami i uzasadnieniem.
uważni i doświadczeni programiści mogą pominąć następną sekcję, tutaj zajmę się tekstem samego zadania. „Nagłówek” zadania nie sprawia żadnych trudności w zrozumieniu, więc powiem tylko, że mój wybór padł na Spring Boot, ale nie dlatego, że już coś z nim zrobiłem, ale dlatego, że zrealizowałem już prawdziwy projekt przy użyciu Spring (ale Boota tam nie było, jak rozumiem to ze względu na jego prostotę). Zgodnie z funkcjonalnością serwera: 1) Narzędzie do pobierania plików. W zasadzie nie ma tu nic skomplikowanego, musiałem się tylko zorientować jak ogólnie zdjęcia są przechowywane na serwerze, okazało się, że najwygodniej jest po prostu umieścić je w jakimś specjalnym katalogu. Poniżej przyjrzymy się konkretnej implementacji. 2) Dodanie nowego użytkownika, prosta operacja, jeśli kiedykolwiek tworzyłeś aplikacje CRUD, to on mnie wesprze, jeśli nie, wszystko zobaczysz poniżej. 3) Pozyskanie informacji o użytkowniku. żadnych pytań – wszystko jest jasne. 4)Zmiana statusu użytkownika. pierwsze dwa punkty zadania są jasne jak słońce, ale co z prośbą zewnętrzną??? Nie da się tego rozgryźć bez 100g, nawet teraz nie jestem w 100% pewien, czy dobrze zrozumiałem. Szczegóły poniżej. 5) Statystyki serwera. To również jest interesujące. Punkt pierwszy sugeruje wdrożenie metody z różnymi opcjami parametrów, nie jest jeszcze jasne, jak to zrobić, biorąc pod uwagę, że powinna to być metoda kontrolera. drugi punkt pyta wszystkich użytkowników, których status zmienił się po pewnym czasie, wydaje się jasne, ale są subtelności.
Pierwsze kroki
och, ile razy czytałem to zdanie, pracując nad tym zadaniem! Jeśli kiedykolwiek próbowałeś wymyślić, jak skonfigurować projekt na wiosnę, ale z jakiegoś powodu nigdy nie próbowałeś Spring Boot, gratulacje, będziesz po prostu zachwycony tym, co napiszę poniżej. Czytałem gdzieś, że programiści zwykli przenosić bardzo dużą ilość kodu z projektu do projektu, jest to kod szablonu - ustawienia łączenia się z bazami danych, mapowania serwletów itp. itp., aby np. zmniejszyć ilość kod szablonu do pracy z bazami danych Używamy JPA/Hibernate, ukrywają one część szablonów, ale aby je skonfigurować, ponownie trzeba napisać plik xml lub klasy konfiguracyjne. a jeśli masz mały projekt, okazuje się, że piszesz nie mniej kodu, ale nawet odwrotnie. Następnie na wiosnę kończymy współpracę z JPA, projektów jest wiele, ale najwygodniejszy jest oczywiście Spring Data. To bardzo duży projekt, który może współpracować z prawdopodobnie wszystkim, co możliwe, w tym JPA i NoSQL i całą masą różnych projektów, jest niesamowicie magiczny, wykorzystamy go w naszym projekcie. Używając Springa prawie pozbywamy się ustawień połączenia z bazą danych, Spring robi wszystko za nas, wystarczy że wkleimy niezbędne adnotacje dotyczące transakcyjności, buforowania, a w szczególnych przypadkach google (spójrz na inne) jakieś inne ustawienia w konfiguracji kontekstowej. Ale jednocześnie większość początkujących programistów nie ma pojęcia, jak stworzyć projekt na wiosnę. Nikt nie wie do końca, jak go skonfigurować, aby uruchomić projekt i uzyskać wynik w przeglądarce, klikając link zaczynający się od localhost:8080/*. I wtedy pojawia się Spring Boot! Lepiej porozmawiać o Spring Boot na konkretnym przykładzie! Zacznijmy od pustego miejsca. Aby utworzyć projekt Spring Boot, programiści Spring opracowali „konstruktor” do tworzenia szablonów. Możesz go używać na ich stronie internetowej, ale znacznie łatwiej jest to zrobić w naszym ulubionym IDE, Intellij IDEA. I tak: Plik->Nowy->Projekt W oknie przejdź do zakładki Spring Originizr, należy w niej ustawić jdk, a adres URL https://start.spring.io sprawdź połączenie internetowe, wtedy będziesz potrzebować aby wybrać nazwę, a następnie technologie, z których będziemy korzystać, w pierwszym etapie potrzebujemy jedynie WEB - zaznaczamy obok i projekt zostaje utworzony. Aby Maven mógł pobrać wszystkie zależności, musimy otworzyć zakładkę Maven w pomyśle i kliknąć przycisk aktualizacji. Otrzymaliśmy gotowy szablon aplikacji, który zawiera wszystkie ustawienia komunikacji klient-serwer. Aby uzyskać pierwsze wrażenie, utwórzmy klasę kontrolera (prawdopodobnie wszyscy słyszeliśmy o MVC). We wszystkich aplikacjach Springa kontrolery mają dość prostą konstrukcję - jest to klasa oznaczona adnotacją @Controller (możliwe są przedrostki, np. @RestController), klasa ta odpowiada za przetwarzanie przychodzących żądań. Aby kontroler rozpoznał żądanie o jakiś adres należy zmapować ten adres na metodę kontrolera. import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(value = "/hello") public class DemoController { @RequestMapping(method = RequestMethod.GET) public String halloWorld() { return "Hello World!"; } @RequestMapping(value = "/{name}", method = RequestMethod.GET) public String halloName(@PathVariable("name") String name) { return "Hello, " + name + "!"; } } Zastanówmy się, co się tutaj dzieje. @RestController . dokładnie ta adnotacja, o której pisałem powyżej. Używamy kontrolera rest, ponieważ chcemy od razu zobaczyć wynik i nie chcemy pisać stron .jsp (wow), łatwiej będzie nam od razu zobaczyć wynik w przeglądarce jako ciąg znaków. @RequestMapping to po prostu powiązanie z adresem. Prefiks adresu publicznego będzie wyglądał następująco: localhost:8080. Jak widzimy, cała klasa zawiesza się pod adresem /hello , co oznacza, że ​​wszystkie metody wewnątrz tej klasy mają przedrostek localhost:8080/hello. Następna jest pierwsza metoda tej klasy, w jej własnym mapowaniu wskazana jest metoda protokołu Http - żądanie GET (przeczytaj o metodach protokołu Http dla siebie) Co to wszystko oznacza? wysyłając żądanie GET na adres localhost:8080/hello, otrzymamy odpowiedź w postaci ciągu znaków „Hello World!”, Sprawdźmy to! W klasie DemoApplication znajduje się jedna fajna adnotacja, o której można powiedzieć, że w pojedynkę uruchamia cały kontekst Springa – @SpringBootApplication. Główna metoda tej klasy staje się magiczna, po prostu uruchamia całą magię ukrytą w SpringApplication, jeśli wywołasz menu kontekstowe tej klasy, opcje pojawią się w linii Uruchom, polecam uruchomić ją wcześniej z zielonym znakiem, w ten sposób konsola będzie wyglądać ładniej i w przyszłości łatwiej będzie odczytać logi bezpośrednio z niej. Uruchommy aplikację. kiedy wyjście konsoli się zatrzyma, powinieneś zobaczyć w konsoli
2015-09-02 09:25:36.895 INFO 5844 --- [główne] sbcetTomcatEmbeddedServletContainer: Tomcat uruchomiono na portach: 8080 (http) 2015-09-02 09:25:36.900 INFO 5844 --- [główne] demo.DemoApplication : Uruchomiono aplikację DemoApplication w **** sekund (JVM działa na wersji 15.501)
gdzie "****" to czas uruchomienia aplikacji :) po czym w dowolnej przeglądarce (lub curl, czy czymkolwiek używasz?) należy wpisać adres, na który została zmapowana metoda kontrolera
localhost: 8080/witaj
Przeglądarka powinna wyświetlić plik kanoniczny
Witaj świecie!
Oto aplikacja internetowa dla Ciebie! Jeśli zauważyłeś, że w kontrolerze istnieje inna metoda, ma ona własne mapowanie adresu; do bieżącego adresu dodawany jest symbol zastępczy. Który jest przekazywany do metody jako parametr przez Spring. Nietrudno się domyślić, że odpowiada za to adnotacja @PathVariable. Więc na żądanie
localhost:8080/witaj/Twoje imię
przeglądarka pokaże
Witaj, twoje imię!
Ustaliliśmy podstawy Spring Boot. Następnie dołączymy bazę danych, ale o tym w następnym poście. Dziękuje za wszystko.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION