Skip to content

Witaj w Świecie Jutra!

  • Technologie jutra
  • Sprzęt jutra
  • Aplikacje jutra
  • Programowanie
  • Księga Drogi
  • Renowacja
  • Różności
  • Archiwum
  • Autor
  • Home
  • Wszystko
  • ITCandidateEvaluator – Frontend
  • Programowanie
  • Wszystko

ITCandidateEvaluator – Frontend

Jakub Raczkowski 12 lutego 2024

Swing to z języka angielskiego "huśtawka" (między innymi). Źródło obrazka: thehindu.com

Nauczony doświadczeniem zdobytym w czasie tworzenia mojego pierwszego projektu, od razu wiedziałem, że prace nad ITCandidateEvaluator zacznę od frontendu napisanego w Swingu.

Ale dlaczego znowu Swing?

Swing oferuje bardzo podstawowy interfejs graficzny pamiętający jeszcze czasy Windowsa XP i nie jest już używany przy tworzeniu komercyjnego oprogramowania. Ale jednocześnie jest to część standardowych bibliotek Javy, więc nawet tworząc front wciąż zdobywam cenne doświadczenie backendowca. Alternatywą byłoby proste korzystanie z konsoli do wyświetlania i przyjmowania danych, ale takiemu podejściu daleko do komfortowego. Mogłem też oczywiście spróbować nauczyć się frontendu z prawdziwego zdarzenia – liznąć trochę HTMLa i JavaScript, ale to tylko jeszcze bardziej odsunęłoby w czasie moment wysłania pierwszego CV. Dlatego zostaję przy Swingu.

W tym tekście przejdziemy sobie przez widoki jakie oferuje ITCandidateEvaluator, omówimy co-jak-dlaczego oraz zastanowimy się co będzie nam potrzebne od strony backendu. Zaczynamy od ekranu startowego reprezentowanego przez klasę InitialView:

Ekran startowy

Widzimy tutaj 3 przyciski, których znaczenia chyba nie trzeba tłumaczyć. Startujemy od stworzenia albo wczytania procesu rekrutacyjnego. To będzie się opierać o bazę SQL i zostanie opisane w przyszłych artykułach. Tymczasem już wiemy, że będzie nam potrzebna klasa Recruitment. Ale co ma zawierać?

Ekran wyboru parametrów rekrutacji

Aby stworzyć proces rekrutacyjny będziemy koniecznie potrzebować jego nazwy i ustawień (Presets – kolejna wymagana klasa, musi pozwalać na ładowanie zapisanych ustawień z pliku .txt). Te elementy muszą bezwzględnie zostać wstrzyknięte do konstruktora. Przyda się też data utworzenia danego procesu oraz lista kandydatów biorących w nim udział. A na koniec zmienna typu boolean określająca czy rekrutacja jeszcze trwa czy już została zakończona.

Ekran listy kandydatów w danym procesie

Jeśli natomiast chodzi o obiekt kandydata to na screenie powyżej widać tylko podstawowe dane ustawione pod testy widoku. W rzeczywistości kandydat będzie musowo charakteryzowany przez obiekt rekrutacji w której bierze udział, oraz swoje imię i nazwisko (wstrzyknięte w konstruktor). Musi także posiadać hashmapę zawierającą uzyskane wyniki na każdym ze szczebli procesu rekrutacyjnego.

Obiekt kandydata może zostać stworzony manualnie (widok poniżej) albo automatycznie (przycisk: „Add many”) w którym podajemy ścieżkę do katalogu zawierającego CV wszystkich kandydatów. Osobna klasa CandidateFactory zajmie się przetworzeniem nazw plików pdf, tak aby z nazwy np. CV_JanKowalski.pdf albo JanKowalski.pdf wyeksportować tylko imię i nazwisko.

Ekran danych kandydata

Ponadto aplikantowi automatycznie zostanie nadane id (na rzadki wypadek pojawienia się dwóch kandydatów o tym samym imieniu i nazwisku), czas poświęcony na jego ewaluację i datę dołączenia do procesu oraz opcjonalnie:

  • rok urodzenia (aby w widoku listy przedstawić jego wiek)
  • ścieżkę do pliku CV (aby w widoku listy móc na szybko podejrzeć CV)
  • notatki

Każdy kandydat będzie również posiadał zmienną (typu String) feedback zawierającą wyniki poszczególnych kroków zapisane w czytelnej formie i gotowej do przesłania mailem.

Klasa ResumeStagePanel dziedzicząca po AbstractStage

W tym miejscu muszę się pochwalić zastosowaną sztuczką z dziedziczeniem. Otóż wszystkie 8 kroków rekrutacji są do siebie na tyle podobne, że musiałbym popełnić duplikację kodu na masową skalę. Zamiast tego utworzyłem klasę AbstractStage zawierającą powtarzalną logikę i dzięki temu klasa Resume (poniżej) ma tylko kilka linijek kodu.

Pierwszy z kroków ewaluacji – ocena CV i mediów społecznościowych

Każdy z etapów ewaluacji ma swój tytuł, opis i suwak służący do ustawienia oceny. Możemy się wycofać do wcześniejszego etapu (przycisk: „Back„), możemy iść dalej („Continue„), możemy zapisać i zakończyć ocenę na chwilę obecną („Save & Exit„) lub całkowicie porzucić wszelkie zapisane zmiany („Discard„).

Te dwa ostatnie przyciski sugerują istnienie tymczasowej klasy TemporaryCandidate. W czasie rekrutacji wszelkie zmiany będą zapisywane tylko do wersji tymczasowej i dopiero po kliknięciu Save & Exit (lub „Finish” na końcu procesu) właściwy obiekt zostanie zaktualizowany.

Krok numer 6 – pytania techniczne

Jeśli chodzi o sam sposób oceny to postawiłem na prosty suwak, który jest łatwy w obsłudze i intuicyjny. Jednocześnie usunąłem jakiekolwiek liczby, aby oszczędzić rekruterowi zastanawiania się czy na tym etapie aplikant zasłużył na 72 czy 73 punkty. Owe punkty jak najbardziej istnieją (w zakresie 0-100) tylko są niewidoczne dla użytkownika, zamiast nich mamy 7 dynamicznie zmieniających się opisów:

{"Unacceptable", "Poor", "Not too good", "Average", "Quite good", "Impressive", "Amazing!"};

Powyższy przykład z etapem pytań technicznych różni się nieco od innych kroków jako, że pytań może być sporo i każde z nich będzie miało własną ocenę. Pytanie to klasa Question z własną fabryką, najlepiej będącą osobnym wątkiem, tak aby ładowanie długich list z wielu plików nie blokowało programu. Jak widzimy powyżej – można wybrać rodzaj pytania (czyli plik z którego są sczytywane) oraz samo pytanie (lub postawić na losowe: Pick random question). Po wciśnięciu „Save score” suwak wraca na domyślną pozycję, a poprzednie pytanie wraz z wynikiem lądują do hashmapy. Wynik końcowy z tego etapu to średnia arytmetyczna z wszystkich zadanych pytań.

Krok siódmy – czas porozmawiać o wynagrodzeniu

Podobnie klasa SalaryStagePanel została uzbrojona w dwa pola: From oraz To pozwalające rekruterowi określić widełki płacowe. W oparciu o nie wyliczana jest średnia płaca – jeśli kandydat zażyczy sobie kwotę niższą niż średnia, jego stosunek jakość/koszt rośnie. Lub maleje, wraz ze zwiększającymi się wymaganiami finansowymi.

Ten stosunek nie wpłynie na końcowy wynik osoby rekrutowanej, ale będzie można na jego postawie sortować kandydatów.

Z kolei ostatni krok czyli ocena umiejętności miękkich będzie globalnym modyfikatorem oceny za etapy 1-6 (czyli bez SalaryStage) na podstawie którego wynik kandydata będzie mógł być zwiększony/zmniejszony o pewną wartość procentową. To o jaką dokładnie, zostanie wyliczone z uwzględnieniem ustawień presets zadeklarowanych na początku procesu rekrutacyjnego.

Podsumowanie

Jak dotąd sam frontend liczy już 20 klas, do tego klasa główna, Model i Controller. Jeśli chodzi o część modelową to zakładam kolejne kilkanaście klas. Mam natomiast problemy z warstwą kontrolera, który ze względu na Swinga jest w większości obsługiwany już w widoku. Niby mogę umieścić obiekt JButton w View i dać mu ActionListener zadeklarowany w kontrolerze, ale tam są zazwyczaj pojedyncze metody obsługiwane jedną lambdą więc to byłoby trochę bez sensu.

openRecruitment.addActionListener(e -> {view.setCurrentPanel(new RecruitmentsListView(view));});

Myślę jednak, że dobrym pomysłem będzie umieszczenie tam obiektu typu DTO (Data Transfer Object – obiekt służący tylko do transferu danych) TemporaryCandidate, który będzie przechowywany tymczasowo w trakcie trwania ewaluacji. Po jej zakończeniu wszelkie wartości weń zapisane mają trafiać prosto do właściwego obiektu Candidate.

Jeszcze na koniec dodam, że przy tym projekcie chciałem zasymulować pracę komercyjną w metodologii Agile. W związku z tym wszystkie zadania są opisywane na platformie Trello gdzie przerzucam je z koszyków „TODO” w „DOING” i wreszcie w „DONE” wraz z postępami. Stworzenie frontendu to był mój pierwszy Sprint, który właśnie się zakończył. Przed nami jeszcze trzy kolejne:

  • backend: logika działania
  • backend: bazy danych
  • testy jednostkowe i manualne

Na dzisiaj tyle i widzimy się za około tydzień. Postępy prac możecie śledzić na moim GitHubie oraz wspomnianym Trello (po angielsku).

Tags: programming

Continue Reading

Previous: ITCandidateEvaluator – Geneza
Next: ITCandidateEvaluator – Backend

Related Stories

Mageege Moon104 – test niskoprofilowego mechanika
  • Sprzęt

Mageege Moon104 – test niskoprofilowego mechanika

11 marca 2025
Przebranżowienie cz.4
  • Programowanie

Przebranżowienie cz.4

27 lutego 2025
Smartfon Jutra
  • Sprzęt

Smartfon Jutra

15 lutego 2025

Ze świata

  • Antyweb
  • Kwantowo
  • Dwóch po dwóch
Netflix odpala nową funkcję, która da użytkownikom więcej władzy
Tanie iPhone'y i Samsungi w nowym sklepie Orange
Fani Androida mają powód do radości. Wraca wsparcie uwielbianej funkcji
Wielkie nieporozumienie wokół nowego iPhone’a. Zobaczcie to, zanim zaczniecie krytykować
Chiny przejmują legendarny oddział Sony. Koniec ery
Tak chcemy wyjaśnić napięcie Hubble'a. Lepszej metody dotąd nie było
Netflix odkrywa karty o premierach. Wiemy, co pokaże na dniach
A co powiesz na ładowanie... laserem? Badacze już to testują
ChatGPT zabierze nasze pieniądze? Nowy pomysł jeszcze gorszy niż reklamy
To najmniejsza myszka na świecie. Użyjesz jej wszędzie
Ta aplikacja to „centrum dowodzenia” każdego miłośnika podróży
Kaufland zaszalał. Rozchwytywany sprzęt Parkside trafił na półki
O tych nowościach w Windows 11 jest dziwnie cicho. A szkoda
Microsoft szykuje rewolucję. Skorzystasz, jeśli obejrzysz reklamy
Te zestawy LEGO za moment znikną z rynku. Wiecie, co to oznacza?
To już ostatni dzwonek! Skorzystaj za darmo, zanim Apple to wyłączy
Masz uczulenie na sierść psa? Z tym nic ci nie grozi
Prawdziwa bomba od T-Mobile - klienci Heyah będą zachwyceni!
Garmin, Samsung i Apple na celowniku. Te zegarki mogą zniknąć z rynku
Łatwiej zmienisz przeglądarkę na iPhonie. Wystarczy jedna opcja
To by było na tyle, jeśli chodzi o możliwość ugody
Ocalić od zapomnienia
Ostatni kwant
ALH 84001 – meteoryt, o którym mówiono nawet w Białym Domu
HESS zarejestrował kosmiczny elektron o niespotykanej energii [Phys. Rev. Lett.]
Matka ciemnej materii – recenzja biografii “Vera Rubin. Życie”
Satelita, który zerwał się ze smyczy
Wiadomość od Carla Sagana do przyszłych eksploratorów Marsa
Ile najdłużej może trwać zaćmienie Słońca?
Nowa największa liczba pierwsza ma ponad 41 milionów cyfr [GIMPS]
30 lat konsoli PlayStation – Odcinek #130
Omawiamy serię The Walking Dead (gość: Stary Gracz)
Nikt nie potrzebuje cienkich smartfonów – Odcinek #129
To ostatni dzwonek na kolekcjonowanie gier i filmów
Najlepsza relacja z PGA 2025 (Poznań Game Arena)
Bumblebee wśród klawiatur. Marvo Meqa 80W – recenzja
Pierwsze spotkanie z Omoda 7 Super Hybrid
Logitech MX Master 4, Wednesday, 1670 sezon 2 – Odcinek #128
Tani pad, który chciał być jak DualSense. Test Monka Contra GT-96
Secret Service i prasa komputerowa w Polsce – Odcinek #127

To może cię zainteresować:

Mageege Moon104 – test niskoprofilowego mechanika
  • Sprzęt

Mageege Moon104 – test niskoprofilowego mechanika

11 marca 2025
Przebranżowienie cz.4
  • Programowanie

Przebranżowienie cz.4

27 lutego 2025
Smartfon Jutra
  • Sprzęt

Smartfon Jutra

15 lutego 2025
Czym jest Swagger?
  • Programowanie

Czym jest Swagger?

22 lipca 2024
  • Technologie jutra
  • Sprzęt jutra
  • Aplikacje jutra
  • Programowanie
  • Księga Drogi
  • Renowacja
  • Różności
  • Archiwum
  • Autor
Copyright © All rights reserved. | DarkNews by AF themes.