JavaRush /Blog Java /Random-PL /Jeden dzień z życia programisty Java. Część 1
alex8894
Poziom 34
Санкт-Петербург

Jeden dzień z życia programisty Java. Część 1

Opublikowano w grupie Random-PL
Pozdrawiam, drodzy koledzy! Po publikacji „ 20+ lat później ” niektórzy czytelnicy poprosili o kontynuację historii. O czym jeszcze mógłbym porozmawiać? Wygląda na to, że wyczerpałem temat przekształcenia „brodatego enikeya” w programistę Java. Wnioski będzie można wyciągnąć dopiero po roku pracy. A potem postanowiłem po prostu opisać, jak wygląda mój typowy dzień pracy. Pod hasłem „Jeden dzień z życia programisty Java”. Kiedy byłem młody, uwielbiałem spać. Kiedy byłem enikeyem, zdarzało się, że spałem do południa i przychodziłem do pracy o trzeciej, a nawet o wpół do trzeciej. Za każdym razem, gdy odpowiadałem na okresowe żądania kierownictwa, żebym „przychodził jak wszyscy”, czyli o 9:00, za każdym razem w ten sam sposób – mówią, że muszę pracować przy komputerze, kiedy nikomu nie przeszkadzam. Toczyło się. Ale z wiekiem najwyraźniej coś się zmieniło w organizmie i teraz jestem bardziej „skowronkiem” niż „nocną marką”. Dlatego teraz przychodzę do pracy pierwsza (albo jedna z pierwszych). Dziś jestem pierwszy i mam pół godziny lub godzinę ciszy, aż nadrobią zaległości inne, mniej „ranne ptaszki”. Czas zaplanować dzisiaj. Programuję pod Linux Mint. Podoba mi się przycisk Start, skromny i elegancki, nie jak te kafelki. Menedżer pulpitu Cinnamon nie jest przeładowany efektami wizualnymi, ale pod względem dopracowania odstaje nieco od MacOS-u, co jest oczywiście standardem w tej kwestii. Łatwo to porównać, na stoliku obok stoi Mac, za nim pracuje projektant UX. Na sam system operacyjny też nie mam prawie żadnych zastrzeżeń: działa szybko i bardzo stabilnie, w tym czasie restartowałem go tylko trzy razy - kiedy wyłączałem komputer na długie wakacje. Właściwie ładuje się również niemal natychmiast, nawet ekran powitalny nie ma czasu się pojawić, ponieważ wszystkie komputery programistów są wyposażone w dyski SSD. Przede wszystkim otwieram klienta poczty e-mail Thunderbird, przychodzą tam listy z informacjami o zmianach na stronach, które mnie interesują na wiki (są ustawienia i specyfikacje), ale najważniejsze są powiadomienia z modułu śledzącego. Co ciekawego nam się przydarzyło? Och, wrócili z testowania funkcji, którą ukończyłem wczoraj, wygląda na to, że znaleźli błąd. Tak, tak. Muszę to jak najszybciej poprawić, może zdążę zanim przyjedzie tester i od razu przyjrzy się poprawkom, zanim zajmie się jakąś jeszcze „niedokończoną konstrukcją”. To pierwsza rzecz na dzisiaj. A więc chodzi o moją „niedokończoną konstrukcję”, o której pisałem przez cały ostatni sprint. Wygląda na to, że tym razem skutecznie przetrwał wszystkie kręgi piekłaetapów testów i dziś prawdopodobnie trzeba będzie go włączyć do głównej gałęzi projektu. Ale to nastąpi później, po obiedzie. Już dziś będziemy musieli popracować w devopsach i zaktualizować stoisko z branży, w której aktualnie trwają prace rozwojowe, musimy pokazać nową funkcjonalność. „Z wielką mocą wiąże się wielka odpowiedzialność” – polecenie sudo wyświetla ostrzeżenie przed przyznaniem uprawnień roota. W moim nieco luźnym tłumaczeniu to zdanie brzmi jak „im więcej możesz zrobić, tym więcej będziesz musiał zrobić”. Nic więc dziwnego, że ja, noszący „pieczęć administratora”, często otrzymuję takie „graniczne” zadania. Cóż, zaczynajmy. Wczoraj pracowałem nad inną funkcją, a teraz muszę wrócić do gałęzi, w której występuje błąd. Użytkownicy systemu Windows zazwyczaj uwielbiają wszelkiego rodzaju powłoki graficzne i używają Turtle (TortoiseGit), ale dla mnie jest to łatwiejsze i bardziej znajome poprzez wiersz poleceń. Ogólnie rzecz biorąc, linia poleceń w Linuksie to małe arcydzieło, niezwykle przemyślane i potężne, szczególnie w połączeniu z Midnight Commanderem. Zmieniliśmy się, teraz musimy przebudować projekt. Wpisuję polecenie gradle clean ass. Nie wiem, czy to polecenie było pierwotnie zamierzone przez autorów gradle, czy zostało stworzone przez przypadek, ale po prostu czyści i przebudowuje projekt (ass to skrót od assemble, a nie to, co pierwsze przychodzi na myśl). W javarush gradle jest wspomniane tylko krótko, jako „i inne systemy kompilacji”. Tak, gradle nie ma przewagi nad Mavenem w składaniu projektów edukacyjnych. Większość samouczków i porad w Internecie również korzysta z mavena. Pojawienie się i rosnąca popularność gradle wynika prawdopodobnie z szybkiego wzrostu złożoności budowy nowoczesnych projektów. Projekt, w który jestem zaangażowany, składa się z kilkudziesięciu komponentów, gdzie backend napisany jest w Javie, frontend w Javascript, a testy w Pythonie. Swoją drogą, w dzisiejszych czasach składanie projektu JavaScript to oddzielny i całkowicie skomplikowany proces, który ma nawet nazwę - Web Workflow, a drzewo zależności jest tam prawie tak rozległe jak w Javie. Cóż, przynajmniej nie trzeba montować komponentów Pythona, cóż, prawie nie ma takiej potrzeby... Po złożeniu i uruchomieniu (co również jest nietrywialne) trzeba wywołać i zainicjować danymi testowymi całe środowisko z relacyjnym i baza danych NoSql, kolejka komunikatów i pamięć podręczna w pamięci. Następnie wszystko to należy ponownie złożyć i uruchomić na serwerze CI, a następnie wdrożyć za pomocą ansible. Jednocześnie rozwój odbywa się głównie pod systemem Windows, a serwery „bojowe”, demonstracyjne, testowe i inne serwery przedprodukcyjne znajdują się oczywiście pod Linuksem. Naprawdę nie wyobrażam sobie, jak można zaimplementować takie rzeczy w maven, ale całkiem nieźle w gradle. Faktem jest, że plik kompilacji gradle jest napisany w Groovy. To bardzo zabawny język, mówią, że to skrzyżowanie Java i Ruby, ale ja nie znam Ruby, ale znam trochę JavaScript i wiele jego konstrukcji też działa. Twórcy gradle zaimplementowali takie API, że w prostych przypadkach plik kompilacji wygląda dość deklaratywnie (a swoją drogą moim zdaniem jest nawet łatwiejszy do odczytania niż pom.xml Mavena), ale jeśli potrzebujesz czegoś bardziej złożonego, cała ta deklaratywność zostaje odrzucona, pojawiają się zmienne, funkcje, klasy - jednym słowem wszystkie funkcje Groovy, które, nawiasem mówiąc, można skompilować i wykonać na tej samej maszynie JVM, co kod Java. Sam montaż, jak już wspomniałem, jest wieloplatformowy, ale wchodzi w interakcję z otoczeniem, więc trzeba to sprawdzić także pod Windowsem. Aby to zrobić, mam zainstalowany system Windows na maszynie wirtualnej. KVM rozwija się skokowo i jeśli system gościa jest poprawnie skonfigurowany, wirtualizacja jest prawie niewidoczna. Tak, spice obsługuje teraz dwa monitory, rozdzielczości ekranu są dostosowywane automatycznie, a parawirtualne sterowniki urządzeń nie powodują prawie żadnej utraty wydajności. Czasami łapię się na tym, że myślę, że nie odczuwam dużej różnicy między tymi dwiema platformami. Mimo to Java jest niesamowitym narzędziem, które zbliżyło do siebie dwa zupełnie różne, a czasem nawet wrogie światy – świat prawnie zastrzeżonego oprogramowania, cracki, generatory kluczy i seriale,uosobieniem systemu Windows i świata otwartych systemów Linux. Tak więc projekt jest złożony, uruchamiamy go (oczywiście także poprzez gradle) i przyglądamy się. Cóż, tak, szkoda mojej siwej brody, nie zrealizowałem jednego z wymagań produkcji, oto jest, czarno-biało napisane na wiki. W mojej poprzedniej pracy regularnie spotykałem się z taką sytuacją i zawsze zastanawiało mnie, jak programista mógł przeoczyć cały akapit specyfikacji. Tak, łatwo! Myślałem o tym, skupiłem się na innym problemie - i pojawił się błąd. Dopiero tutaj, dzięki kilku etapom testów, zostanie złapana, ale w poprzednim miejscu - cóż, cokolwiek się stanie. Na szczęście praca tutaj nie potrwa długo. Odpalam Idea Ultimate, który swoją drogą jest jednym z niewielu płatnych produktów wykorzystywanych w fazie rozwoju. W zasadzie można sobie poradzić z edycją Community, jednak szybko można się przyzwyczaić do dobrych rzeczy, np. integracji ze Springiem. Potrzebujesz także kilku terminali do logów, przeglądarki do frontendu i wiki, kolejnego terminala z linią poleceń, wszystko się rusza, miga... Ogólnie rzecz biorąc, obraz na ekranach dwóch monitorów zaczyna nabierać przerażającego wyglądem, niczym z niskobudżetowych filmów, przedstawiających ciężką pracę hakera. Ale to wciąż drobnostki, ale pamiętam, jak musiałem podnieść i skonfigurować klaster pracy awaryjnej - siedem okien terminali, coś innego w rogu ekranu, we wszystkich oknach - trochę liczb i obrazków z grafiki ASCII... Ale Odrywam się trochę od pracy, a czas płynie. ... Uff, cóż, wygląda na to, że zrobiłem wszystko, czego potrzebowałem i wydaje się, że nie zepsułem niczego, co zrobiłem wcześniej. Dodaję komentarz do funkcji i wysyłam wątek do przetestowania. Staram się pisać bardziej szczegółowo, co dokładnie zrobiłem lub zmieniłem, aby ułatwić pracę testerowi. W mojej poprzedniej pracy bardzo brakowało mi takich wyjaśnień, gdy musiałem sprawdzać ulepszenia otrzymane od programistów. Tymczasem poranek płynnie przeszedł w dzień, ludzie stopniowo się zatrzymywali. Już niedługo odbędzie się spotkanie stand-up, lub naszym zdaniem stand-up. Tak naprawdę dzień pracy powinien zaczynać się od tego i w przypadku większości „nocnych marków” prawie tak jest. Stand-up stanowi granicę przybycia do pracy tak późno, jak to możliwe; spóźnianie się na nią jest zdecydowanie odradzane. Cóż, dla mnie to jak przerwa. Zatem wstańmy wszyscy. Na stand-upie jak zwykle programiści opowiadają co robili wczoraj i co planują zrobić dzisiaj, testerzy mówią co przetestowali i z jakimi wynikami, a szefowie już wiadomo, co planują dalej, jakie problemy się pojawiły i na co należy zwrócić szczególną uwagę. Nasz zespół jest rozproszony geograficznie, a jego pełny skład można zobaczyć jedynie na stand-upach (oczywiście w telewizji), a także być może na ogólnej imprezie firmowej kilka razy w roku. Podczas stand-upu często przychodzi mi na myśl, że tak naprawdę zostało to wymyślone, żeby deweloperzy nie mogli się zrelaksować. Kiedy każdego dnia musisz pokazywać postępy w swojej pracy, a nie w papierowym raporcie, który przeczyta tylko Twój szef, ale przed współpracownikami, chcąc nie chcąc, będziesz próbował zrobić więcej, żeby mieć o czym rozmawiać. Są oczywiście „długoterminowe projekty budowlane”, o których przez kilka dni z rzędu powtarzasz „wczoraj to zrobiłem i dzisiaj będę to robić nadal”, ale i w nich ciągle jakieś drobne pilne zadania są wciśnięty. Krótko mówiąc, prawdziwy Kowbojski programista zawsze ma coś do powiedzenia swoim kolegom. Na stand-upie poproszono mnie o szybką aktualizację mojego stoiska, więc teraz to zrobię. Po opublikowaniu głównej gałęzi projektu aktualizację dokonują administratorzy, ale teraz musimy opublikować funkcję, która nie jest jeszcze ukończona, a jednocześnie nieuchronnie pojawią się pewne problemy, których administratorzy nie będą w stanie rozwiązać. Stanowisko zlokalizowane jest w data center, dostęp do niego możliwy jest jedynie poprzez ssh, nie ma tam oczywiście żadnej powłoki graficznej - więc tylko linia poleceń, tylko hardkor! Sama aktualizacja jest zautomatyzowana i przebiegła sprawnie, jednak po aktualizacji jeden z komponentów nie uruchamia się. Na logi przeglądam poleceniem less, swoją drogą ma ono bardzo wygodną funkcję: jeśli wciśniesz Shift-F, to na bieżąco będzie wyświetlana aktualna zawartość pliku, co idealnie sprawdza się w przypadku logów. A co to jest... dziwna rzecz? Pełny ekran ze znakami zapytania oddzielonymi przecinkami. Drugi ekran, trzeci, dziesiąty... Ile ich jest? Och, to już koniec, okazało się, że to niezły stacktrace. Ktoś napisał zapytanie SQL z operatorem IN w celu wybrania żądanych rekordów z listy i utworzył parametr dla każdego elementu listy. Wszystko działało do czasu, aż lista zawierała ponad 32767 elementów, po czym serwerowi SQL w końcu zabrakło cierpliwości. Będziesz musiał napisać raport o błędzie w tej sprawie, ale nie ma to nic wspólnego z problemem z niedziałającym komponentem. Spójrzmy dalej. Teraz już widać, że migracja struktury bazy danych do nowej wersji nie doszła do skutku, wygląda na to, że autor funkcjonalności coś zmienił w migracji i tu, na stoisku, stała jej poprzednia wersja. Będziesz musiał ręcznie wycofać zmiany w strukturze za pomocą narzędzia konsoli serwera SQL. Jak mogę napisać polecenie w DML, aby usunąć pole? indeks? stoły? Wygląda na to, że to wszystko. Zrestartowałem komponent, migracja przebiegła pomyślnie... wszystko jest w porządku. Pora iść na lunch, swoją drogą pogoda dzisiaj jest wspaniała. „Jasnożółta kula wisząca nieruchomo na niebie i tak przerażająca mieszkańców miasta okazała się Słońcem”. Prawie pierwszy słoneczny dzień w roku. Nawet nie chcę wychodzić z ulicy, ale muszę - zbliża się czas połączenia. Ciąg dalszy nastąpi
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION