Rust w zespole: czego wymagać, a czego uczyć po zatrudnieniu
Zaplanuj wdrożenie do pracy z Rust, zanim uznasz znajomość języka za wymóg. Ustal pierwsze zadania, zasady review i sposób oceny gotowości do pracy.
Ernest Bursa
Wdrożenie do pracy z Rust powinno pokazać programiście, jak zbudować, przetestować, wyjaśnić i zmienić kod projektu przy odpowiednim wsparciu podczas review. Zanim uznasz doświadczenie z tym językiem za warunek zatrudnienia, ustal, które obowiązki wymagają wiedzy od pierwszego dnia, a czego zespół może nauczyć podczas wspólnej pracy. Zapisz ten podział w opisie stanowiska i planie nauki.
Błąd można popełnić w obie strony: odrzucić dobrego programistę z powodu nieznajomości składni, której można go nauczyć, albo zatrudnić osobę chętną do nauki, choć nikt nie ma czasu sprawdzać jej kodu. Plan wdrożenia pozwala zauważyć ten problem, zanim kandydat przyjmie ofertę.
Co informacja Microsoftu o Rust oznacza dla twojego zespołu?
Wprowadzenie języka do projektu wymaga też przygotowania warunków do pracy. Informacja z dużej firmy to okazja, żeby przyjrzeć się własnym praktykom, nie powód do kopiowania jej wymagań rekrutacyjnych.
W gościnnym wpisie opublikowanym 10 września przez Rust Foundation Victor Ciura, principal engineer w Microsoft, wyjaśnił wewnętrzny status Tier-1 języka Rust. Opisał narzędzia kompilacji, środowisko pracy programistów, kontrolę jakości, integrację z platformą i wsparcie produkcyjne. Zaznaczył też, że wewnątrz firmy nadal dominuje C++. Chodzi o klasyfikację wsparcia inżynieryjnego w Microsoft, a nie poziomy wsparcia platform docelowych Rust ani nakaz przepisania wszystkich projektów. Rust Foundation: Rust jako język Tier-1 w Microsoft
W startupie warto zacząć od węższego pytania: co programista musi umieć zrobić w komponencie, który zamierzacie zbudować? Rozbudowa istniejącej usługi to inne zadanie niż projektowanie pierwszej biblioteki Rust i ustalanie zasad dla wszystkich osób, które będą później nad nią pracować.
Poniższy plan jest propozycją organizacji pracy, a nie wynikiem badania skuteczności rekrutacji. Pomaga oddzielić braki, które można uzupełnić w zespole, od obowiązków wymagających już teraz doświadczonej osoby. Dostosuj zadania i zasady review do własnego systemu. Wykonanie opisanych ćwiczeń nie potwierdza gotowości do pracy na produkcji.
Ustal, jakie umiejętności Rust są potrzebne od pierwszego dnia
Wymagania rekrutacyjne powinny wynikać z zadań i dostępnego wsparcia podczas review. Wybierz rzeczywistą zmianę, za którą nowa osoba miałaby odpowiadać. Następnie ustal, gdzie może pomóc recenzent, a gdzie potrzebna jest samodzielność.
Dla każdego obowiązku zapisz skutki ewentualnego błędu. Zmiana komunikatu błędu parsera, projektowanie wspólnych interfejsów i utrzymanie połączenia między językami nie powinny mieć jednakowych wymagań tylko dlatego, że wszystkie dotyczą Rust. Przy ustalaniu wymagań może pomóc taki podział:
| Charakter pracy | Co sprawdzić przed zatrudnieniem | W jakiej nauce zapewnić wsparcie |
|---|---|---|
| Programista rozwijający wybrany fragment aplikacji przy wsparciu doświadczonego recenzenta | Diagnozowanie błędów, testy, rozumienie domeny i umiejętność wyjaśnienia zmiany | Konwencje repozytorium, wzorce własności danych w tym kodzie i proces wydawania wersji |
| Pierwszy programista Rust ustalający zasady pracy zespołu | Odpowiednie doświadczenie w projektowaniu i utrzymaniu kodu Rust, w tym wyjaśnianie kompromisów współpracownikom | Kontekst produktu, istniejące systemy i ograniczenia organizacyjne |
| Programista utrzymujący kod unsafe lub połączenia między językami | Doświadczenie z danym interfejsem i jego wymaganiami bezpieczeństwa oraz realny plan review | Lokalne niezmienniki, szczegóły integracji i sposób zgłaszania problemów wymagających pomocy |
To propozycja tematów do rozmowy, nie uniwersalny podział stanowisk. Za znaną nazwą roli mogą kryć się zupełnie inne obowiązki. Osoba prowadząca rekrutację i programista, który ma sprawdzać kod, powinni wspólnie wskazać wiersz najlepiej opisujący tę pracę.
Najtrudniejszy przypadek to zespół bez osoby, która potrafi rzetelnie przeprowadzić review kodu Rust. Samo przydzielenie kursu tego nie zmieni. Być może trzeba zatrudnić kogoś z doświadczeniem, zaangażować zewnętrznego recenzenta z jasno określonym zakresem pracy albo odłożyć budowę komponentu. Deklaracji „będziemy uczyć się razem” musi towarzyszyć odpowiedź na pytanie, kto zatwierdzi pierwszą istotną zmianę.
Opisz stanowisko zgodnie z tymi ustaleniami. Jeśli języka Rust można się nauczyć już w pracy, napisz to i wyjaśnij, jakie wsparcie zapewniasz. Jeśli nowa osoba od początku ma pomagać innym, wymień decyzje, za które będzie odpowiadać. Poradnik Kit o tworzeniu profilu idealnego kandydata pomaga jeszcze przed rozpoczęciem rozmów przełożyć obowiązki na kryteria oparte na obserwacji.
Zapewnij każdemu działający punkt wyjścia
Dobra instrukcja konfiguracji kończy się działającym zadaniem i wskazaniem osoby do kontaktu. Opisz środowisko, którego faktycznie wymaga repozytorium, a potem poproś kogoś, kto nie zna projektu, o wykonanie opisanych kroków.
Dokumentacja rustup opisuje pliki konfiguracji zestawu narzędzi oraz polecenie rustup show, które pokazuje aktywny zestaw. Inne ustawienia mogą mieć pierwszeństwo, więc sam plik w repozytorium nie wystarczy, by ustalić, z jakich narzędzi korzysta programista. Porównaj aktywne środowisko z wymaganiami projektu. Dokumentacja rustup: nadpisywanie ustawień
Manifest zależności Cargo i plik blokady pełnią różne funkcje. Manifest opisuje zależności, a plik blokady zapisuje ich ustalone wersje. Ułatwia to użycie tych samych zależności, ale nie zapewnia identycznych bibliotek systemowych, bezpieczeństwa zależności ani kompilacji powtarzalnej co do bitu. Dokumentacja Cargo: Cargo.toml a Cargo.lock
Połącz te informacje z konkretnym repozytorium. Wskaż konfigurację narzędzi, wymagane programy na komputerze, potrzebne uprawnienia, katalog roboczy i dokładne polecenie uruchamiające mały, istniejący test. Wymień też ustawienia lokalne, które trzeba uzyskać w zwykłym procesie nadawania dostępu. Nowa osoba nie powinna zgadywać, kto w zespole zna brakujący szczegół.
Zamiast polegać na zrzucie dawnego wyniku z terminala, nazwij test lub zachowanie, które programista ma zobaczyć. Opisz oczekiwany wynik, a jeśli polecenie się nie powiedzie, wskaż komunikaty pozwalające odróżnić brak zależności od błędu aplikacji.
Nieudana konfiguracja może świadczyć o brakach w dokumentacji, a nie o umiejętnościach nowego pracownika. Wyznacz osobę, która będzie aktualizować instrukcję przy zmianach sposobu pracy. Zapisuj pominięte kroki, gdy jeszcze pamiętasz szczegóły problemu, i poprawiaj opis przed przyjściem kolejnej osoby.
Na koniec pokaż, gdzie ten sam test działa w CI. Poproś programistę o znalezienie ostatniego wyniku i wyjaśnienie, co zostało sprawdzone. Dzięki temu lokalne polecenie będzie miało jasny związek z review. Pojawi się też konkretny temat następnej rozmowy: jakie wyniki recenzent powinien otrzymać wraz z proponowaną zmianą?
Oceń małą zmianę, którą naprawdę możesz sprawdzić
Zadanie o jasno określonym zakresie i kryteriach pomaga rozmawiać o sposobie rozumowania. Jeśli dopuszczasz naukę Rust po zatrudnieniu, daj kandydatowi dość kontekstu, by nieznajomość języka nie przesłoniła umiejętności, które chcesz ocenić.
Przykładowe, fikcyjne ćwiczenie: dostarczony komponent Rust odczytuje rekord wejściowy i zwraca wynik parsowania. Nieprawidłowa wartość pola powoduje obecnie mało przydatny komunikat błędu. Poproś o zmianę tego zachowania, dodanie testu regresji i wyjaśnienie rozwiązania. Udostępnij repozytorium, które się kompiluje, oraz opis oczekiwanego zachowania z perspektywy kodu wywołującego.
To przykład do dostosowania, nie zweryfikowana metoda przewidywania wyników w pracy. Wybierz niewielkie zadanie, które recenzenci rozumieją na tyle dobrze, by omówić alternatywne rozwiązania. Nie wykorzystuj rekrutacji do pozyskiwania nieodpłatnej pracy nad produktem.
Napisz treść zadania przed zaproszeniem kandydatów
Wyjaśnij oczekiwane zachowanie, co nie wchodzi w zakres zadania i ile pracy przewidujesz. Określ, czy wolno korzystać z dokumentacji, wyszukiwarki, pomocy AI i rozmów z recenzentem. Poproś o opisanie istotnej pomocy wykorzystanej przy rozwiązaniu, żeby późniejsza rozmowa uwzględniała warunki, które zaproponowano kandydatowi.
Na stanowisku dopuszczającym naukę wskaż miejsca w kodzie, od których warto zacząć, i pozwól zadawać pytania. Napisz, czy oceniasz gotowe rozwiązanie, częściowe rozwiązanie z uzasadnieniem, czy oba te rezultaty. Kandydat na tej podstawie rozdzieli czas, więc nie zostawiaj takich ustaleń wyłącznie w głowach recenzentów.
Dokumentacja Cargo wyjaśnia, że cargo test kompiluje i uruchamia testy, w tym jednostkowe, integracyjne i testy przykładów z dokumentacji. Szczegółowe zachowanie zależy od opcji i ustawień projektu. Poproś kandydata o wskazanie uruchomionych testów i wyjaśnienie ich zakresu. Poprawny wynik dotyczy tylko sprawdzonego zachowania. Dokumentacja Cargo: cargo test
Omawiaj decyzje według tych samych kryteriów
Karta oceny może być krótka:
- Zachowanie: czy zmiana spełnia podane wymaganie, również dla nieprawidłowych danych wejściowych?
- Testy: czy test regresji sprawdza błąd i jasno pokazuje oczekiwane zachowanie?
- Wyjaśnienie: czy kandydat potrafi opisać przepływ danych i uzasadnić sposób obsługi błędu?
- Zakres: czy wskazuje założenia i pracę świadomie pominiętą w ćwiczeniu?
- Review: czy potrafi rozważyć konkretną wątpliwość i wyjaśnić, czy zmienia ona jego podejście?
Przy każdym kryterium zapisz obserwację. „Wyjaśnia, dlaczego kod wywołujący potrzebuje nazwy pola” daje lepszą podstawę decyzji niż „dobrze się komunikuje”. Jeśli recenzent chce oceniać zaawansowane projektowanie w Rust, sprawdź, czy było ono wymaganiem tego stanowiska.
Poradnik tworzenia zadań programistycznych omawia doświadczenie kandydata w całym procesie. Oddziel jednak ocenę rekrutacyjną od wdrożenia pracownika: kandydat powinien rozumieć warunki zadania, na które się zgadza, a pracownik potrzebuje czasu i wsparcia na poznanie systemu zespołu.
Ucz Rust na własnym kodzie
Połącz materiał do nauki z małym fragmentem kodu, który programista wyjaśni recenzentowi. Wybierz pojęcia potrzebne przy następnej zmianie wykonywanej ze wsparciem, zamiast traktować program kursu jak listę warunków dopuszczenia do produkcji.
Rust Book opisuje własność danych jako sprawdzane przez kompilator zasady zarządzania pamięcią. Wyjaśnia przenoszenie i pożyczanie danych oraz to, co dzieje się po opuszczeniu zakresu przez ich właściciela. Te pojęcia dają konkretną podstawę do rozmowy o danych w twoim komponencie. Rust Book: czym jest własność danych?
Wybierz na przykład krótką funkcję zwracającą dane. Poproś programistę o prześledzenie ich pochodzenia, wskazanie właściciela na każdym etapie i wyjaśnienie, dlaczego interfejs zwraca dane pożyczone albo przekazuje ich własność. Omówcie, czy kopiowanie jest zamierzone i co zmieniłoby inne rozwiązanie. Ćwiczenie powinno być na tyle małe, by recenzent mógł sprawdzić rozumowanie, a nie tylko zatwierdzić diff.
Zespół pracujący nad Androidem w Google publikuje bezpłatny kurs Comprehensive Rust, dostępny także dla osób, które wcześniej nie znały Rust. Wybrane lekcje mogą przygotować do tej rozmowy. Ukończenie kursu ani zmieszczenie się w podanym harmonogramie nie potwierdza gotowości do samodzielnej opieki nad komponentem produkcyjnym.
Proponowana kolejność wdrożenia:
- Zbuduj: przejdź instrukcję konfiguracji i znajdź oczekiwany wynik testu. Zapisz wszystko, czego instrukcja nie wyjaśnia.
- Wyjaśnij: omów z recenzentem istniejący przepływ danych, obsługę błędu i miejsce przekazania własności danych.
- Zmień: przygotuj niewielką zmianę zachowania, wyjaśnij testy i odnieś się do uwag z review.
- Utrzymuj: przejdź przez diagnozowanie problemów, wydanie wersji i wycofanie zmiany w rzeczywistym komponencie, w zakresie wymaganym na tym stanowisku.
Tempo dopasuj do zadań i dostępnego wsparcia. Stałe terminy pomagają zaplanować rozmowy, ale data w kalendarzu nie dowodzi, że ktoś może bezpiecznie przejąć dany obowiązek. Po każdym etapie krótko zapisz obserwacje i wskaż, jaka pomoc nadal jest potrzebna.
„Potrafi zmieniać ten parser z review; nie przeprowadzał jeszcze wydania wersji” to przydatna informacja dla kolejnego recenzenta. Ogólna etykieta „przeszkolony z Rust” zaciera te różnice.
Pozwól też programiście zgłaszać zastrzeżenia do materiałów. Jeśli ćwiczenie wymaga znajomości nieopisanej konwencji, uzupełnij lekcję. Jeśli kolejne zadanie wymaga pojęcia nieobecnego w kursie, omów je przed przydzieleniem pracy.
Ustal, co wymaga review doświadczonego programisty Rust
Wskaż zmiany wymagające wiedzy specjalistycznej, zanim trafi na nie nowa osoba. Plan powinien określać, kto może je zatwierdzić i co zrobić, gdy ta osoba jest niedostępna.
Rust Book wyjaśnia, że operacje unsafe wiążą się z warunkami, za których spełnienie odpowiada programista. Blok unsafe nie wyłącza mechanizmu sprawdzania pożyczeń, a autorzy zalecają niewielkie bloki i udostępnianie bezpiecznych abstrakcji. Sama kompilacja nie potwierdza spełnienia tych warunków. Rust Book: Unsafe Rust
Znajdź w komponencie kod unsafe i interfejsy łączące go z innymi językami. Zapisz założenia, które recenzent musi sprawdzić. Pierwsze zadanie nie powinno bez uprzedzenia wymagać od osoby uczącej się samodzielnego potwierdzenia bezpieczeństwa nieznanej abstrakcji.
Review musi jednak obejmować więcej niż zarządzanie pamięcią. Programista nadal powinien rozumieć wymagane zachowanie, obsługę błędów, ewentualne zasady dostępu i sposób udostępniania zmiany użytkownikom. Mechanizmy języka nie odpowiedzą na pytanie, czy implementacja spełnia wymagania produktu.
Określ dokładnie, do jakiej pracy dana osoba jest gotowa. Możesz dopuścić zmiany w znanym module pod nadzorem, a projektowanie interfejsów lub wydawanie wersji pozostawić komuś z doświadczeniem. Zapisz ten zakres i wróć do niego po kolejnych wspólnie ocenionych zadaniach. Wynik quizu nie powinien oznaczać zgody na utrzymywanie każdej części systemu.
Jeśli potrzebny recenzent stale jest niedostępny, zmień zakres pracy albo plan zatrudnienia. Kolejka zablokowanych review to problem organizacyjny, który musi rozwiązać osoba zarządzająca zespołem. Kolejny kurs nie odpowiada na pytanie, kto sprawdzi następną zmianę programisty.
Zadbaj o przydatne zapisy rekrutacji i wdrożenia w Kit
Kryteria oceny, zapisy nauki i decyzje z review powinny być zrozumiałe dla kolejnej osoby. Odpowiadają na różne pytania, nawet gdy dotyczą tego samego języka.
Etapy rekrutacji w Kit obsługują kryteria oceny z nazwami, opisami, wagami i skalami. Recenzenci mogą zapisywać oceny i komentarze, a zadania programistyczne obsługują szablony GitHub oraz pisemne instrukcje. Pozwala to zorganizować rekrutację wokół wybranych kryteriów. Bez odpowiedniego review nie potwierdza jednak poprawności przesłanej implementacji.
Do nauki pracowników służy Kit Training: własne kursy ze slajdami, quizami i oświadczeniami, a także zaproszenia, zapisy postępów i przypomnienia. Programy z checklistami obsługują edytowalne punkty, instrukcje dla poszczególnych platform i przesyłanie dowodów wykonania. Samodzielnie przygotowujesz materiały o Rust i ustalasz, co ma dokumentować potwierdzenie konfiguracji. Kit nie zawiera programu nauki Rust i nie weryfikuje automatycznie kompetencji programistycznych.
Zapis ukończenia mówi, że wykonano skonfigurowane etapy nauki. Osobno zadbaj o ocenę inżynieryjną: kto sprawdził pracę, co zaobserwował i jaki obowiązek programista może przejąć jako kolejny. Ukończenie kursu nie zastępuje tej rozmowy.
Zanim wpiszesz Rust jako wymóg w ogłoszeniu o pracę, ustal pierwsze zadanie, osobę do review i wiedzę rzeczywiście potrzebną na tym stanowisku. Dopasuj do tego opis rekrutacji i materiały wdrożeniowe. Tak przygotowany plan można omówić zarówno z kandydatem, jak i nową osobą w zespole.
Wprowadź plan w życie. Uporządkuj w Kit kryteria rekrutacji i materiały szkoleniowe przygotowane przez zespół.
Powiązane artykuły
Zacznij pierwszą rekrutację.
Zacznij za darmo na 30 dni. Zrezygnuj przed końcem, a nie zapłacisz ani grosza. Skonfiguruj swój pierwszy pipeline rekrutacyjny w kilka minut.
Zacznij za darmo