Boiling Frogs 2022

Na Boiling Frogs warto być. Wcześniej wrocławska konferencja punktowała tym, że była (tak mi się zdaje) pierwszą polską konferencją roku kalendarzowego – często prelegenci przywozili premierowe tematy, które potem powtarzali gdzie indziej. W tym roku „żaby” miały podwójne pierwszeństwo, była to dodatkowo pierwsza od lockdownu konferencja w 100% po staremu, z widownią na miejscu i bez uczestników online. Do tego organizatorom udało się ułożyć ciekawy program.

Niżej podrzucam subiektywny przegląd agendy. Linkuję do slajdów tam, gdzie podzielili się nimi autorzy. Dodałem też zdjęcia od użytkowników Twittera. Nagrań jeszcze nie ma, spodziewam się ich w drugiej połowie maja na kanale YouTube konferencji.

Otwarcie: Wszechobecne idiomy (Tomasz Kaczmarzyk)

W poprzednich latach za każdym razem byłem pod wielkim wrażeniem tematów otwierających. Nie inaczej było teraz. Tomek ciekawie opowiadał o tym, jak etykiety i nazwy przyczepiane do nowych idei stają się ciężarem, prowadzą do wypaczania oryginalnego pomysłu i zradykalizowanych postaw. Propozycja: warto eksplorować obszary pomiędzy przesadną fascynacją a pełnym odrzuceniem, warto brać z nowych idei przydatne rzeczy, a nie traktować je zerojedynkowo.

Czytaj dalej „Boiling Frogs 2022”

Podcast Dev Story: Czym jest Clean Code?

Ukazał się odcinek podcastu Dev Story (devstory.pl), gdzie z gospodarzem, Jarkiem Jarzębowskim, dyskutuję o czystym kodzie. Rozmowa trwa 20 minut, można ją przesłuchać m.in. na Apple Podcasts i Spotify.

Wśród poruszonych tematów między innymi jak przez ponad 10 lat kariery może zmienić się stosunek do reguł od Wujka Boba, utrzymywania testów, code review.

ArchUnit: zapomnij o architekturze, to elastyczny i inteligentny linter

ArchUnit staje się coraz częściej polecanym narzędziem. Tyle że moim zdaniem ludzie skupiają się na zbyt wąskim zastosowaniu. Winę ponosi jak myślę oficjalna strona, która upiera się, że to biblioteka do sprawdzania architektury systemów napisanych w Javie/JVM i straszy diagramami UML. Plus nazwa jest jaka jest, skojarzenia są nieuniknione. Stąd artykuły uczące ArchUnita tłuką do znudzenia przykłady typu wykrywanie cykli zależności i liczenie warstw. Nie mówię, że to zupełnie nieważne rzeczy, ale są bardziej życiowe problemy – a ArchUnit potrafi wykryć znacznie więcej, niż pokazują typowe tutoriale. Warto go poznać, nawet jeśli nie interesuje cię „testowanie architektury”.

ArchUnit pozwala za pomocą fluent API pisać narzucane na kod reguły, które działają szybko i dają jasne komunikaty błędu. Rozumie typy, co jest jego przewagą nad prostymi linterami typu CheckStyle lub ktlint. Operuje na kodzie bajtowym, więc może działać zarówno z Javą, jak i Kotlinem czy Scalą.

Można w ten sposób narzucać spójny sposób pisania („każdy kontroler musi mieć słowo Controller w nazwie”). Być może ważniejsza jest możliwość zabezpieczania się przed niepoprawnym korzystaniem z zewnętrznych bibliotek. Przykladowo, złe użycie adnotacji frameworku JUnit spowoduje, że kod testu zamiast chronić przed regresją nie będzie nigdy odpalony. Podobne pułapki czyhają w wielu bibliotekach i warto się przed nimi zabezpieczyć.

This article is also available in English.

Czytaj dalej „ArchUnit: zapomnij o architekturze, to elastyczny i inteligentny linter”

JUnit 5: DynamicTest i czytelne testy o jasnej strukturze

Jedną z najlepszych zmian wprowadzonych przez wersję 5 JUnita są według mnie testy dynamiczne. Można z ich pomocą pisać testy parametryzowane. Jednak DynamicTest/TestFactory to coś więcej niż skopiowanie funkcjonalności znanej z TestNG czy Spocka. Siłą mechanizmu z JUnita jest, że mamy pełną programistyczną kontrolę nad produkowaniem przypadków testowych. Wcale nie trzeba o dynamicznym teście myśleć jako o liście czy tabelce danych. Niżej pokażę, jak ten mechanizm może dać krótszy i łatwiejszy do zrozumienia kod testowy. Jest w stanie pogrupować powiązane testy w lepszy sposób niż zagnieżdżony test @Nested.

Czytaj dalej „JUnit 5: DynamicTest i czytelne testy o jasnej strukturze”

Slack: pisanie bez rozproszeń

Blokując powiadomienia jesteśmy w stanie uniknąć rozpraszania przez wiadomości otrzymywane na Slacka. Wszystko może jednak wziąć w łeb, jeśli przyjdzie potrzeba skontaktowania się z kimś. Otwarte po dłuższym czasie okienko atakuje przegapionymi wiadomościami i okazuje się, że przeglądamy je zamiast pisać.

Problem da się rozwiązać korzystając z istniejących od dawna możliwości Slacka: minimalizując niepotrzebne elementy. Podobna zasada może być zastosowana do pisania wiadomości przez Facebooka.

Czytaj dalej „Slack: pisanie bez rozproszeń”

Dark mode w KDE i nie tylko

Niby środek lata, ale ostatnio przez gwałtowne zmiany pogody w środku dnia często mamy ciemno jak w nocy. Co może być wtedy lepsze niż tryb ciemny? Okazało się, że w moim Kubuntu 21.04 nie jest oczywiste, jak przestawić KDE w dark mode, więc postanowiłem, że to dokładniej opiszę. W dalszej części podzielę się instrukcjami „przyciemnienia” IntelliJ, Chrome’a i LibreOffice. Na koniec odpowiem, czy zwariowałem, skoro przełączam się między jasnym i ciemnym motywem.

Czytaj dalej „Dark mode w KDE i nie tylko”

Wgląd w konsolowy pipe

Kontynuując temat sprawnego używania terminala. Czasem przy pisaniu pipe’a brakuje podglądu tego, co dzieje się między krokami:

curl http://localhost:8080/admins | awk get-username.awk | ./delete.sh

Łatwym sposobem wydrukowania danych na danym etapie jest użycie tee podłączonego do stderr:

curl http://localhost:8080/admins | awk get-username.awk | tee /dev/stderr | ./delete.sh

Bonusowy content: linki do materiałów do uczenia się obsługi shella.

Czytaj dalej „Wgląd w konsolowy pipe”

Konsola: sprytne przeklejanie argumentów

Wpisujesz komendę w konsoli, uruchamiasz… i coś jest nie tak. Trzeba poprzednie polecenie zmodyfikować i odpalić ponownie. Co teraz? Wpisywanie wszystkiego od zera nie wchodzi w grę. Można pomóc sobie myszą, zaznaczać, kopiować, wklejać, dusić backspace – są jednak szybsze opcje, niewymagające odrywania rąk od klawiatury. Opowiem o nich, zaczynając od tych wspominanych w większości poradników (jak !! i !$), kończąc na rzeczach mniej znanych: odwoływaniu się do argumentów po indeksie i usuwaniu z nich rozszerzeń i fragmentów ścieżki. Opisywane mechanizmy działają w Zsh i Bashu. Część może uprościć pisanie skryptów.

Czytaj dalej „Konsola: sprytne przeklejanie argumentów”

Wyciąganie danych z YAML-a za pomocą yq

yq to konsolowe narzędzie do manipulacji YAML-em. Czemu warto je znać?

YAML jest teraz wszędzie – konfiguruje się nim pipeline’y CI, sposób deploymentu, pojedyncze aplikacje. Przewagą tego języka nad na przykład JSON-em jest możliwość unikania duplikacji przez zdefiniowanie powtarzającego się kodu w jednym miejscu i „dołączanie” go wielokrotnie. Mając konfigurację CI GitLaba:

.jvm_job: &jvm_job
  image: openjdk:11-jdk-slim

.gradle_job: &gradle_job
  <<: *jvm_job
  tags:
    - medium

check:
  stage: test
  image: openjdk:11-jdk
  script:
    - ./gradlew check
  <<: *gradle_job

deploy_cit:
  <<: *cit_variables
  <<: *deploy_job

# a dookoła jeszcze tak z 50 różnego rodzaju jobów

możliwości YAML-a umożliwiają nam dzielenie konfiguracji joba na reużywalne kawałki i komponowanie z nich ostatecznych jobów. Z drugiej strony dużo trudniejsze staje się dla czytającego odpowiedzenie na pytanie, co tak właściwie robi dany job: we fragmencie wyżej mamy zarówno coś w rodzaju dłuższej hierarchii dziedziczenia (check) jak i coś w rodzaju wielokrotnego dziedziczenia (deploy_cit). Konfiguracja GitLaba definiuje prawie 30 parametrów konfiguracyjnych jobów, więc rzeczywiste pliki są zazwyczaj dużo bardziej skomplikowane niż przykład wyżej. Nagle od tego, czy umiem w głowie merge’ować spore struktury danych zależy to, czy wprowadzę błąd w konfiguracji, czy nie.

Idealnie byłoby, gdyby jakieś narzędzie wypluwało mi ostateczną postać pliku konfigurowaniu, po wstawieniu wszystkiego na miejsce i zmerge’owaniu. Tyle, że jest z tym bieda: taki GitLab na przykład chwali się w tym miesiącu wizualizacją pipeline’u generowaną z edytowanej konfiguracji, ale konkretnych parametrów tam nie ma. Jeśli ciekawi mnie, jaki image będzie użyty w jobie check, wizualizacja GitLaba nie przybliży mnie ani o krok do odpowiedzi. Tak w ogóle to odpowiedź brzmi: nie ten image, jaki zamierzył sobie autor kodu, więc pewnie wszystko nie działa.

Ogólnie: systemy przyjmujące YAML-ową konfigurację często nie oferują dobrej możliwości zrozumienia skutków zaaplikowania tej konfiguracji. Dobrze jest znać więc coś niskopoziomowego, nieprzywiązanego do tej czy tamtej aplikacji, coś, co potrafi operować na dowolnym YAML-u, niezależnie od jego przeznaczenia.

Czytaj dalej „Wyciąganie danych z YAML-a za pomocą yq”
Creative Commons License
Except where otherwise noted, the content by Piotr Kubowicz is licensed under a Creative Commons Attribution 4.0 International License.