wtorek, sierpnia 04, 2026

No kurde nie, przestańmy się zachowywać jak ofiary...

Dziś nie o kodowaniu ;-)

Jakiś kult bycia ofiarą staje się modny.To nie jest to - chcę robić biznes, chcę zostać gwiazdą, a raczej - nie robię biznesu bo podatki mnie dojadą, nie zostanę gwiazdą bo układy.

Taki kult bycia ofiarą. Ale oczywiście nie przez to, że się samemu coś źle robi, tylko to zawsze wina innych.Paragony grozy, ceny mieszkań za duże, benzyna za droga, wszystko idzie ku gorszemu.... incele są tacy sami "nigdy nie będę miał dziewczyny bo baby są puste i lecą na kasę albo atrakcyjność"...

Dziwne to jest. W tym sensie, że naprawdę nigdy tak łatwo nie było zostać bogatym. W USA z jednej strony badania wskazują, że najłatwiej w historii zostać miliarderem (tak, to zrobi tylko drobny ułamek procenta populacji).. a z drugiej przekonanie, że wszystko się wali.

W polskiej polityce to, że masa ludzi próbowała się przedostać przez granicę z Białorusi nie było dowodem na to, że coś nam się udało, ale tego, że inni nam chcą to zabrać.To, że Ukraińcy tu uciekli po wojnie i część myśli o zostaniu zamiast bycia takim potwierdzeniem "kurcze, kiedyś to my jechaliśmy na zachód, a teraz to my jesteśmy dla niektórych zachodem", to nie "bo na nasz koszt chcą żyć".

Taki kult przegrywu, tego, że już wszystko się zwija...I to tak prawica i lewica na to choruje, chociaż prawica bardziej. (W USA lewica też, oni tam twierdzą, że nigdy nie było tak źle dla mniejszości... niektórzy próbują im zwracać uwagę, że tak nadal istnieje wiele miejsc gdzie nie ma równości i trzeba do tej równości dążyć, ale nie oni uważają, że dziś jest gorzej niż było kiedyś).

To jest dziwne...Sam miewam takie myśli! Co mnie bardzo denerwuje ;-)

Czy może być lepiej? Oczywiście - i to jest super.Ale może być też dużo, dużo gorzej. Mamy lepiej niż 10 lat temu, lepiej niż 20 lat temu, lepiej niż 100 lat temu.Czy są rzeczy, które bym chciał a ich nie mam? Pewnie. O pewnej randce marzę od 8-9 lat i jej nie miałem i co? I nic ;-)

Tak z innej strony, nie jest to dowód na starość? Takie patrzenie, że teraz to już tylko z górki?Rozumiem jak kogoś spotka coś złego, strasznego... ale kurde nie wszystko jest tragedią. I co złego w przyznaniu, że się samemu zawaliło?

Ile to zdejmuje ciężaru z człowieka... Ileś lat temu na rozmowie kwalifikacyjnej jako przesłuchujący powiedziałem głupotę, coś w stylu, że:

Integer c = 0;
c++;
System.out.println(c);

Nie wypisze 1... bo niby tam jest boxing i tak dalej... i wydaje mi się, że powiedziałem coś głupiego w stylu czy to c++ zmieni się w c=c+1 ? Tak jakby to się tak nie miało stać.Wstyd mi. Nie wiem co kandydat sobie o mnie pomyślał. Nie wiem nawet czy ja to naprawdę powiedziałem :-)

Ale OK, już takiego błędu nie zrobię. Biorę winę na siebie - staję się lepszy.OK, to może znaczyć, że jeden kandydat myśli o mnie, że jestem idiotą... no bo się tak zachowałem.Mógłbym oczywiście dla poczucia się lepiej uznać, że to był do bani kandydat i dobrze, ja go testowałem, a on był głupi bo nie widział tego...

A najlepsze, ja ogólnie bywam pesymistą.Chociaż lata temu do mnie dotarło, że kult bycia ofiarą robi człowiekowi krzywdę. Tzn. ja to tak odbierałem.

Odchodząc z jednej firmy wiedziałem, że odejdę już od dłuższego czasu, mój team wiedział, ludzie w koło wiedzieli (bo ja nie umiem zachować tajemnicy), ale plotka poszła o podwyżkach więc miałem takie w głowie "OK, to może miesiąc później złożę wypowiedzenie? A tak będę miał miesiąc na przemyślenie bo może te nowe pieniądze zmienią moją percepcję?".. była mowa o podwyżkach w okolicach 40%... ja dostałem 7.5% z "to bardzo dużo" od nowego managera. Wkurzyłem się, powiedziałem coś w stylu "OK, odpuść sobie, właśnie wysłałem wypowiedzenie"... ale to nie jest nawet ten punkt. Później przez 3 dni chodziłem sam przekonany i wkurzony jaki to ja jestem pokrzywdzony i jak to ten zły manager mnie zmusił do odejścia..... dopiero po 3 dniach do mnie dotarło, że "Ej, Ty Przemek - ale Ty chciałeś odejść, to nie miało żadnego wpływu, to nie przez to się zwalniasz"... ale tak mnie uwiodła wizja bycia ofiarą....

Więc trochę rozumiem "urok", ale nie rozumiem czemu jest teraz aż taki kult tego. Praktycznie każda partia polityczna w to idzie. Powstają seriale z takim motywem. Takie Sweetpea... laska którą gra Ella Purnell, która jest w top of the top najbardziej atrakcyjnych kobiet gra "ofiarę" którą wszyscy pomiatają i w końcu zaczyna mordować ludzi...

To wszystko jest po to by napisać, że nie bycie jak pączek w maśle to nie jest bycie ofiarą... no i w dłuższej perspektywie to, że dziś masz ten taki hit "to ich wina" nie sprawi, że będziesz szczęśliwy. To Ci tylko zatruje percepcję świata i wszędzie będziesz widzieć niesprawiedliwość w stosunku do siebie. Nigdy nie będziesz szczęśliwym człowiekiem.

Kilka lat temu w Gdańsku szedłem i w słuchawkach mi grała biografia Leonarda da Vinci, było coś o malowaniu przez niego ludzi i tym, że robił sekcje. I zobaczyłem gościa na wózku. Nie miał rąk i nóg. Rodzina go pchała. Podejrzewam trochę, że to był jakiś ukraiński żołnierz, który stracił kończyny na wojnie.... walnęło mną to... ale jeszcze bardziej to, że on się uśmiechał.

Szczerze nie chciałbym być w jego skórze - ale jak go mam nie podziwiać? Nie wiem czemu, ale to mi się kojarzy z Jezusem. Nie jestem wierzący, może też przez to, że jak sobie pomyślę, że gdybym był wierzący i wierzyłbym w śmierć Jezusa na krzyżu "za grzechy ludzkości" to czułbym się odpowiedzialny za to jego cierpienie za każdym razem jakbym zrobił coś źle czy nieładnie....

Jakoś tak chciałem wyrzucić te myśli, może i głupie, ale teraz już powiedziałem czemu nie podoba mi się ten cały kult bycia ofiarą wszystkiego i wszystkich.....



Podobne postybeta
0 prawo programowania - Shit hits all fans in the same time
In vitro
Zajrzyj w duszę liberała (social-liberała) w sprawie imigracji ;-)
Dziura
Enum zdradziecki jest ;-)

poniedziałek, sierpnia 03, 2026

Napisz źle, ale napisz ;-)

W pisaniu na blogu człowiek ma fazy ;-)
Nadal mam fazę - przypominam sobie algorytmy ;-)

Ale próbuję inaczej niż zwykle, tak trochę w metapoznanie idę, czy próbuję.

Np. dochodzę do zadania, którego nie chcę robić, nie podoba mi się, nudne jest, błe....

To sygnał ;-) tzn. mogę naprawdę już być zmęczony czy chory... albo co jest bardziej prawdopodobne, to jest trudne zadanie i mój mózg ma reakcję "Ej, tu nie ma żadnego tygrysa który mnie chce zeżreć, to jest praca, niewygodne, do tego jak mi źle wyjdzie to się poczuję gorszy... to lepiej mi księżniczkować".

To jest pierwszy etap - detekcja. Ten mi nawet wychodzi.

Drugim etapem jest przełamanie - i tu jest gorzej. Powiedziałbym, że najlepszą formą ataku jest próba pójścia przez:
  • zrób prosto i nieoptymalnie i próbuj stąd atakować - to ma wady, bo można się "źle nauczyć" - dla mnie to jest często jedyny sposób na atak na rzeczy z dynamic programming,
  • zrób głupio - podobne do poprzedniej, ale z takim "tu dzieje się cud" (tu nie można przesadzać, bo nie może być całe tak zrobione, ale może uda się zidentyfikować gdzie dokładnie jest problem),
  • oszukaj - może da się to zrobić inaczej? (np. obrót tablicy 2D.... można to ubrać w metody które nic nie obracają, a robią strukturę danych która ma w środku prawdziwą tablicę),
  • ogranicz się - jak nie wiesz jak atakować to spróbuj inaczej, a może przez rekurcsę się da?
Jest jeszcze jeden cudowny sposób - buddy system*, ale nie zawsze jest buddy ;-)


Nadal trzeba jednak znaleźć siłę... więc może tu Kaizen? Czyli np. "nie ma stresu, próbuję to pisać przez następne 5 minut, jak mi nic nie wyjdzie to spoko, odpuszczę na dziś", ale tu trzeba wtedy PISAĆ a nie myśleć, nawet robienie ręcznego rozwiązywania problemu się liczy....

Później dobrze popatrzeć na wszystkie głupie metody rozwiązania... ja wrzucam do ChatGPT... i pytam "Ty, gdzie popełniam błąd" i ten mi np. mówi "off-by-one" i pytam "czemu", a ten mówi np. "bo mieszasz i raz liczysz w LinkedList node'y, a innym razem linki" i ja wtedy mam "Ty, faktycznie!"...
(To jest taka proteza tego buddy system)

To ostatnie wynika z mojego pojęcia tego jak działa programowanie i chunkowanie.... na pewnym poziomie mamy już pattern matching, który często mamy "z poprzednich razów"... tylko, że pamiętamy ogólne zasady, wiemy gdzie dzwoni, ale nie w którym kościele. Stąd wg mnie jak trzeba trenować na poziomie całego rozwiązania, to też dobrze wytresować się w tym co pisze nam teraz Copilot, czyli w tych "nudnych klockach". Warunki dla ifów, przesunięcie się w strukturze danych i tak dalej... takie podstawowe elementy. Dobrze dla nich umieć znaleźć niezmiennik, init, warunek stopu i to co podtrzymuje iteracja.

Albo jeszcze inaczej ;-) to jest trochę jak w medytacji ;-) w mindfulness meditation cała sztuka polega na tym, że starasz się nie myśleć, ale mózg po paru sekundach zaczyna o czymś myśleć, Ty w pewnym momencie to zauważasz - to jest trenowanie umiejętności dostrzeżenia, że się straciło focus... ale kolejny krok czyli "nonjudgemental" reakcja jest najważniejsze, to nie jest "o ja głupi znów nie umiem", a raczej takie może nawet radosne "o motylek! tu jesteś, to sobie poczekaj, a ja wracam do niemyślenia"...
Tu chyba to też jest najważniejsze ta druga część, jak już widzimy, że nasz mózg pokazuje, że się boimy tego zadania to sztuka polega na podejściu do tego tak właśnie radośnie "o! ciekawe jakie błędy tu zrobię"..

* - chociaż tu zawsze się zastanawiam się czy lepszy buddy to taki ktoś kto jest na podobnym poziomie, czy ktoś kto jest lepszy. Próbowałem obu i nadal nie wiem....


Podobne postybeta
Agent nie na wszystko pomoże ;-)
Hackowanie teorii umysłu ;-)
A może by tak Projekt Yes!? ;-)
Piątkowy potok świadomości ;-)
Błędy jakie ludzie robią na rozmowach kwalifikacyjnych

niedziela, sierpnia 02, 2026

Pociągowe kodowanie

Utwierdzam się w przekonaniu, że zadania koderskie są świetnym sposobem na testowanie stresu.

Jadę pociągiem (wracam z Juraty), siedzę na swoim miejscu 86 w Pendolino. Oglądałem seriale i teraz stwierdziłem, że sobie pokoduję...

I idzie mi to tak sobie... Zaczęło mi iść lepiej jak wyłączyłem muzykę.

Widzę, że mój mózg nie uznaje, że siedzenie w pociągu jest dobrym miejscem do kodowania ;-) mówiąc inaczej, stresuję się.

Może to jest sposób na trenowanie? Adversed Coding Training? ;-) Metoda ACT!

Kodować w miejscach nietypowych i stresujących. Większość z nas kodowała na spotkaniach, bardzo dużo fajnego kodu powstaje na spotkaniach (trudniej to się robi jak się prowadzi spotkanie.... wiem, próbowałem ;-)).

Co ciekawe teraz mnie LinkedList męczy... wiem, że tak naprawdę jednymi z lepszych zdań do wejścia w tryb koderski są zadania z drzewami. W normalnym życiu się ich prawie nie używa, ale konieczne jest myślenie o tym jak to leży w pamięci... LinkedList to takie drzewo bez gałęzi, każdy node ma 1 dziecko.... ale co ciekawe jakoś w mojej głowie problem z LinkedList jest procesowany inaczej niż drzewo...

A, i pisanie tego wpisu jest dużo prostsze niż pisanie kodu, jakoś o wiele mniej mózgu trzeba do tego używać.



Podobne postybeta
Po Devoxx'ie
Jak z metody size() w List w Java'ie dostać ujemną liczbę? ;-)
Pomodoro z positive reinforcement? ;-)
LinkedList w Java'ie to taki miś koala...
Taki trochę niezwykły lot Queen of the Skies.

piątek, lipca 31, 2026

Zmęczony Przemek -> "Głupi" & Smutny Przemek ;-)

Kto by pomyślał mało snu i utrzymujace się 2-3 tydzień przeziębienie obniża IQ ;-) a może stres też (mam takie ćwiczenie, że czasem sobie przez 5 minut piszę co czuję i wrzuciłem ostatnio to do lokalnego modelu i poprosiłem o "diagnozę" i dostałem, że żyję w stresie... fakt z 3 źródeł jedno się dookreśliło więc jest lepiej).

Próbuję robić sobie zadania z Cracking the Coding Interview.
Robię tak, że pisze sobie w Obsidianie kod w Java'ie, później daje go ChatGPT i Gemini (ChatGPT jest tu lepszy) i proszę o ocenę.

Teraz mam banalne zadanie do usunięcia duplikatów z LinkedList... coś co w dobrym momencie robię w ciągu paru sekund.... napisałem wersję, która działa ale jest taka jakaś dziwna z czym zgadzają się oba LLMy...

Wstyd przyznać, ale wygląda tak:

public <T> void removeDupes(ListNode<T> head) {
var seen = new HashSet<T>();
var dh = new ListNode<T>();
var nh = dh;
while (head!=null) {
var next=head.next;
head.next=null;
if (seen.add(head.value)) {
nh.next=head;
nh=head;
}
head=next;
}
}

Niby działa, ale jest dziwne bo używa dummy head, ale to dummy head jest używane ot tak sobie żeby nie mieć ifa.. nie jest zwracane nigdzie dh.next, ale nie musi być bo dh.next ZAWSZE wskazuje na oryginalne head... więc wszystko działa, ale jest dziwne.

Coś chyba źle robię z prakacjami...

Po pierwsze niby 4 tygodnie prakacji, ale jeden tydzień w jednym AirBnb, drugi w innym (gorszym), trzeci i czwarty miały być w "ośrodku dla emerytów", ale wyskoczył mi workshop w Berlinie (2 dni + 2 dni jazdy)... więc de facto przez te 4 tygodnie mam każdy tydzień "oddzielny".
Doszło do tego, że po procy nie mam siły pójść nigdzie i idę tak trochę "no głupio by było nie iść, skoro jestem w tej Juracie".... 

Jeśli ktoś to czyta to może się zastanawiać po co to piszę - bo sam fakt pisania i zdania sobie sprawy z tego sprawia, że jakbym to trochę zaczynał kontrolować :-) czyli taki swoisty system diagnostyczno/terapeutyczny to dla mnie jest ;-)

Aż sobie też zmieniłem audiobooka z Contact na Bogowie, Honor i Anhk-Morpork i zacząłem słuchać jakiejś muzyki z lat 80... i żyję tym, że jutro mogę spać ile mi się podoba.



Podobne postybeta
PROPFIND, czyli jak przechytrzyć HttpURLConnection
Czas czasowi nierówny
Długi tydzień
overload vs varargs
No czemu? Czemu .NETowa DLLka to nie DLLka? ;-)

niedziela, lipca 26, 2026

Długi tydzień

Trzeba przyznać, że to był długi tydzień.

Jestem na prakacjach w Juracie, to już 3 tydzień, ale tak się złożyło, że musiałem jechać na 2 dni na workshop do Berlina...

Stąd cały poniedziałek jechałem do Berline, a cały czwartek wracałem z Berlina.

Człowiek zapomina jak trudno żyje się poza tymi naprawdę dużymi miastami... z Krakowa by to było szybsze, z Warszawy jeszcze szybsze (bo oni mają bezpośrednie połączenie z Berlinem).
Moja podróż do Berlina to było ponad 2h w pociągu z Juraty do Gdyni, później 30 minut w Uberze do lotniska, tam ~2.5h (bo akurat tak pociągi były ułożone) czekania, 1-1:15 lotu do Frankfurtu, tam ~1h czekania, ~1h lotu do Berlina, ~30 minut jazdy Uberem i jak wyjechałem o 9:31 to w hotelu byłem trochę przed 20... 
Tak naprawdę bliżej jest z Krakowa do Wenecji, Gran Canarii, a nawet w pewien sposób do Los Angeles czy San Francisco ;-) niż Juraty do Berlina.

Następny dzień workshop, później kolacja więc mój spacer z biura obok Bundestagu i bramy Brandenburskiej był taki sobie, później Tiergarten, obok Zoo i już jestem w hotelu...

Środa miała być krótsza, ale zmieniła nam się w serię estymacji, tzn. najpierw rozrysowałem co rozumiem z tego co mamy zbudować i stąd zaczęło się estymowanie... i z 12:30 gdy to się miało kończyć zrobiła się 16:30 gdy uciekłem ;-)

A uciekłem bo miałem o 18:30 Alize by Cirque du Soleil.
Byłem już na paru występach Cirque du Soleil, na 3 w Big Top (ich namiocie) na 5 albo 6 w halach i tym razem na pierwszy stacjonarnym w teatrze :-)

Cirque du Soleil przygotował w Berlinie pierwsze stacjonarne przedstawienie w Europie. Jest imho jeszcze nierówne i jest masa świetnych kawałków, ale niektóre są jeszcze troche niedorobione, ale i tak robi wrażenie (i mam zamiar jeszcze pojechać ;-)), do tego zrobili tam kilka nowych efektów optycznych. Są sytuacje gdy jedna z osób lata i nie widać linek (podobno cienkie linki poryte substancją która bardzo dobrze pochłania światło, a jest umocowana tak sprytnie, że nie widać tego jej umocowania... do tego jest tam gdzieś ukryty ekran, ale taki przezroczysty i chyba jak zmieniają jasność bo obu stronach ekranu to widać to co jest na 1 (przed ekranem) i 3 planie (za ekranem), albo na wszystkich 3 planach i tylko na 1 planie (gdzie drugi plan - ekran robi za tło). 

Przez pierwszy akt miałem cały czas rogala na buzi :-) siedziałem w rzędzie A (przed 1 ;-)) prawie przy centrum sceny więc byłem naprawdę blisko ;-)

Później wróciłem do hotelu, znów przez Tiergarten... bo teatr który zajęło Cirque du Soleil jest na Potsdamer Platz...

No i czwartek to było wracanie... 

Przy okazji, Balice naprawdę wyglądają przyzwoicie gdy się je porówna do Berlina czy Gdańska. W Berlinie niby do kontroli czekało się krócej, ale też im to jakoś tak niemrawo szło, w Gdańsku załapałem się jeszcze na te maszyny które nie umieją "zobaczyć" elektroniki w torbie.

Btw. jechałem z moim PeakDesign Travel Backpack 45L w wersji zwiniętej, gdzie ma 30L... i bałem się, że może podpadnę bo on teoretycznie jest ciut większy (ale miękki więc by przeszedł inspekcje)... ale oczywiście była masa "oszczędnych" którzy maja plecak, coś jeszcze i twardą torbę na kółkach... wkurzają mnie ;-)

W piątek się próbowałem zdekompresować, ale jeszcze mi nie wyszło bo przez cały tydzień mało spałem i dopiero dziś w niedzielę idąc po plaży do mnie dotarło "Ty, nie śpiesz się, gdzie Ci się tak śpieszy"... 

A jutro znów praca i trzeba rozrysować to co mamy zbudować... kawałki są w miarę proste, ale przyznam, że jeszcze nigdy nie operowałem danymi w ilościach 100 GB (1 kawałek danych może tyle ważyć), gdzie może być kilkadziesiąt a może i kilkaset kawałków danych o takich rozmiarach.... 



Podobne postybeta
Lepszy soundtrack dla rzeczywistości ;-)
Zmęczony Przemek -> "Głupi" & Smutny Przemek ;-)
Ostatni Rammstein... przynajmniej w 2024 ;-)
Eventy na żywo nie zawsze są bardziej wow niż w TV ;-)
Pociąg vs samolot - cena

piątek, lipca 24, 2026

Wzór na zmianę pracy ;-)

Wiedzieliście, że istnieje wzór na zmianę pracy?

Aby zmiana miała sens, poniższa nierówność musi być prawdziwa:

wartość tego, co wynosisz z obecnej pracy < oczekiwana wartość tego, co wyniesiesz z nowej pracy


Ta wartość jest funkcją wielu zmiennych, takich jak:

  • Pieniądze – dodają wartość,

  • Stres – odejmuje wartość,

  • Work-life balance – może dodawać lub odejmować,

  • Czas dojazdu – odejmuje wartość,

  • Nauka i rozwój – dodają wartość,

  • Wzrost Twojej wartości rynkowej – dodaje wartość,

  • Ludzie – dodają lub odejmują wartość.

To nie wszystkie czynniki, ale prawdopodobnie najważniejsze.

Kluczowe jest to, że jedyne w miarę pewne parametry na starcie to pieniądze i czas dojazdu (choć to drugie też może się zmienić). Pieniądze są jednocześnie jedyną zmienną, którą realnie kontrolujesz i możesz negocjować.

Nie wiesz, jak w praktyce będą wyglądać pozostałe kwestie. Stąd Twoje oczekiwania finansowe muszą dyskontować ryzyko zmiany. Zawsze możesz trafić na gorszą kulturę organizacyjną, gorszych ludzi, słabszy projekt czy toksycznego managera. Pytanie brzmi: jaka kwota zrekompensuje Ci to ryzyko i pozwoli pogodzić się z ewentualnym rozczarowaniem (nie musisz przecież zostawać tam na zawsze, wystarczy na czas szukania kolejnego miejsca).

Co ciekawe, firmy doskonale rozumieją ten mechanizm. Gdy pracownik przychodzi z nową ofertą i zapowiada odejście, często pojawia się kontroferta. Podwyżka od obecnego pracodawcy nie musi nawet wyrównywać stawki z rynku – o ile przejście z 20k na 30k zł miesięcznie uzasadnia ryzyko, o tyle porzucenie znanego środowiska dla przejścia z 25k na 30k zł często przestaje się opłacać.

Stąd zachęcam do sceptycyzmu wobec myśli w stylu: „dla świetnego projektu lub super ludzi mogę zarabiać mniej”. To, że w dniu podpisywania umowy projekt i zespół wyglądają świetnie, nie gwarantuje, że za pół roku lub rok cokolwiek z tego zostanie. Pieniądze to jedyna rzecz, którą masz gwarantowaną na papierze.

Dodatkowy plus: jeśli wszyscy zaczną podchodzić do tematu w ten sposób, pensje na rynku będą rosły.



Podobne postybeta
A tak o liczbach ;-)
Kilogram i ile to jest? To jest dopiero spór :-)
Wybory
Emerytury
Ja długo przygotowywać się do rozmowy? (kwalifikacyjnej w IT ;-))

Kitten driven development - czyli jak sprawić by nikt nie robił kotkom krzywdy

Dość często miewam dyskusje o backward compatibility i wersjonowaniu API.

Jestem z obozu, który uważa, że każda breaking change to moment, gdy ktoś zabija kotka. Ja nie chcę, by kotki ginęły, więc staram się projektować API czy struktury danych tak, by były one jak najbardziej otwarte na ewolucję bez konieczności stosowania specjalnych narzędzi.

Preferuję jak najbardziej low-levelowe API, uznając, że klient powinien móc je obudować w dowolny sposób. Najlepiej, jeśli takie API nie wprowadza pojęć typu projekty czy dokumenty, tylko operuje na danych na jak najniższym poziomie. Jeśli użytkownik chce mieć projekty, to po prostu sam sobie je stworzy.

Nie lubię enumów. Jeśli jednak są już potrzebne do zaprezentowania pewnych stanów, chętniej dodam nowe pole dla większej granulacji, niż będę zmieniał istniejącą listę enumów. Choć szczerze mówiąc, ponieważ preferuję API samowystarczalne, te stany zwykle mają charakter czysto informacyjny.

Oczywiście zawsze może pojawić się konieczność wprowadzenia breaking change. Lata pracy pokazały mi jednak, że prawie zawsze można tego uniknąć. A to oznacza, że użytkownik API nie zabije żadnego kotka.



Podobne postybeta
WWŚ i wielkie hałdy książek
Case insensitive OS ma pewne problemy ;-)
Ile z obligacji... odsłona 2 ;-)
"Dziennikarze" to debile
Czytelnictwo ;-)

czwartek, lipca 09, 2026

"Kompas" z Augmented Reality ;-)

Dzieliłem się tu już jakiś czas temu "dziełkiem" które jest kompasem pokazującym gdzie coś jest...

Czyli jestem w Juracie na molo i mi pokazuje gdzie jest (jaki ma bearing) molo w Sopocie...


Apka dostała nawet Augmented Reality mode ;-)

Jeden problem... te wskazania kompasu w iPhone'ie czy Pixelu to jedna wielka ściema jest ;-)

Na tym zdjęciu Gdynia jest "między" markerami dla Gdyni i Molo w Sopocie ;-)
A bywa, że te markery się potrafią o 90 czy nawet 180 stopni przesunąć.

Oczywiście może to być przez to, że ruscy znów zagłuszają GPS (chociaż na kompas by nie mogli wpływać), ale pewnie jakaś większa ilość metalu w okolicy wszystko zaburza... 

Jak się ktoś chce bawić to jest tutaj https://przemelek.github.io/geo/index.html - lepiej wejść telefonem, bo tam to ma sens ;-)
Komputer nie ma kompasu :-)

Jak działa dziwnie to teoretycznie zrobienie ósemki (w przypadku Pixela z obracaniem w koło jego osi) powinno pomóc... ale nie ma gwarancji ;-) 



Podobne postybeta
Okrucieństwo vibe codingu część 2 ;-)
Wyłącz czasem ANC w słuchawkach i wleź na molo gdy wieje wiatr i z nieba leci grad ;-)
Chyba zacznę notować po angielskiemu... coby pomóc AI ;-)
TimeToRead 0.0.2 - nowy tag i poprawki ;-)
HP7 bez manifestu ;-)

piątek, lipca 03, 2026

Szuflada z panierką

Miałem kilka razy w życiu dziwne reakcje na to, że nie jem mięsa. Jakby sam fakt niejedzenia wrzucał mnie automatycznie do jakiejś konkretnej szuflady.

A przecież: nie jem mięsa, nie piję alkoholu, nie palę, nie biorę narkotyków, nie piję kawy, nie jem lodów innych niż czekoladowe lub kakaowe (od biedy śmietankowe i waniliowe), nie zabijam, nie kradnę, nie otwieram okien w nocy, nie oglądam piłki nożnej, nie jem chrupków, nie słucham disco polo i nie czytam Paulo Coelho ;-).

Tak, to są części mojej osobowości, a niektóre nawet tożsamości, ale one nie przypisują mnie z automatu do żadnej grupy.

  • Część tych rzeczy mam z natury – jak niezabijanie i niekradzenie.

  • Część to czysty pragmatyzm – nie otwieram okien w nocy, bo nie znoszę komarów, a komary uwielbiają mnie. Wybieram mniej bąbli zamiast komfortu cieplnego.

  • Części rzeczy nigdy nie zacząłem – jak alkohol, papierosy czy narkotyki.

  • Inne odpadły po testach – spróbowałem i po prostu nie wpasowały się w mój gust. Tak było z kawą, szpinakiem, mięsem czy lodami owocowymi.

Przez wiele lat jadłem mięso, ale nigdy nie byłem jego wielkim smakoszem – znam lepsze smaki. Kiedyś, jeszcze będąc mięsożercą, zażyczyłem sobie "schabowego", ale w wersji wege. Okazało się, że smakuje mi tak samo jak oryginał. Wtedy do mnie dotarło: ja po prostu najbardziej lubię panierkę. Podobnie było z mizerią – z czasem odkryłem, że ogórki są mi tam w zasadzie zbędne, za to maślanka z solą i pieprzem to mistrzostwo.

Szczerze mówiąc, od zawsze trochę brzydził mnie widok surowego mięsa albo obgryzanie kości. Ale nie mam nic przeciwko ludziom, którzy je lubią – super, świetnie, że Wam smakuje.

Jedyny mięsny akcent, którego czasem mi brakuje, to mocno wysmażony, chrupiący boczek. Chodzi o reakcję Maillarda i ten genialny smak głębokiej karmelizacji. Na szczęście zbliżony efekt można wyciągnąć z dobrze suszonego pomidora.

Moje niejedzenie mięsa to nie deklaracja przynależności do jakiejś subkultury czy manifest. To po prostu kwestia smaku – ja naprawdę wolę żółty ser od szynki. A kawy nie piję, bo o ile jej zapach jest genialny, o tyle smak zupełnie mi nie podchodzi. Swój przydział kofeiny i tak dostarczam z herbatą (wtedy to teina) i Coca-Colą.

OK, czasem mogę sobie w głowie dodawać jakieś bonusowe punkty do "etyczności", ale doskonale wiem, że są one trochę nie na miejscu.

Słyszałem kiedyś wywiad z farmerem prowadzącym "szczęśliwą hodowlę". Mówił, że jego zwierzęta mają świetne życie poza jednym, ostatnim dniem – ale to dzieje się szybko i nawet nie wiedzą, co je spotkało. W moim odczuciu takie mięso jest nie tylko etyczne, ale wręcz bardzo etyczne. Pomijając już fakt, że po moich własnych przygodach ze stekiem w Teksasie za żadne pieniądze nie chcę przeżywać tego znowu...

Chodzi o coś innego: sera bez mleka zrobić się nie da. A rzeczywistość krów mlecznych rzadko bywa szczęśliwa. Skoro więc rezygnuję z mięsa, ale bez mrugnięcia okiem jem nabiał, to z tą moją wybiórczą "etycznością" w głowie należy podejść tak bez przesady.

I jest to trochę wkurzające, że w ogóle muszę się z tego tłumaczyć ;-). Jak długo nie robię komuś krzywdy, to moja sprawa, co jem, a czego nie jem ;-).

Zresztą, ja już w pierwszej czy drugiej klasie podstawówki podpadłem nauczycielom. Kazali nam wtedy napisać w ćwiczeniach do "Środowiska", co jedliśmy na śniadanie. Wpisałem mój ulubiony pokarm – dżem truskawkowy. Dzisiaj wolę pomidora, pewnie przez to, że ma mnóstwo glutaminianu, a ja mam bardzo dobrze rozwinięte wyczuwanie umami (przez to też uwielbiam jajka ;-)).

Kto wie, może to jest właśnie prawdziwy powód, dla którego nigdy nie przepadałem za mięsem? Pamiętam, że jak dostawałem kanapkę z pomidorem i szynką, to tę szynkę po prostu wyciągałem. Zdarzało mi się zjeść ją oddzielnie, "na raz" – no bo przecież jedzenia się nie wyrzuca – ale to była czysta metoda eliminacji odpadów. Wszystko po to, by wreszcie móc cieszyć się smakiem samego pomidora... A jeśli ten pomidor miał jeszcze cebulę, dużo soli i pieprzu, to już w ogóle było mistrzostwo.

Tak myślę, może jak będę miał jeszcze kiedyś taką samą reakcję to wyślę ten post? ;-)



Podobne postybeta
Wegetarianizm kaizen - czyli ja bywać wegetarianinem bez zbytniego wysiłku ;-)
Ja to mam jednak utylitarne podejście do jedzenia ;-)
Triada spokoju, albo triada antychaosowa ;-)
Książki, które mi się spodobały w 2017
"Promocja homoseksualizmu" co to niby ma być?

Enum zdradziecki jest ;-)

Emum niby prosty jest, a bywa bardzo zdradliwy ;-)

Nie chodzi mi nawet o to, że w Java'ie do wersji 8 dało się stworzyć enuma, który formalnie nie istniał, więc kod:
public enum Toster {
OTHER_TEST(TEST.getS()),
TEST("TEST"),
TEST2("TEST2");

String s;
String getS() {
return s;
}
Toster(String s) {
this.s=s;
}
}
był legalny, ale rzucał NullPointerException... w Java 9 już się nie skompiluje...

Ani o to, że jeszcze wcześniej gdy kolekcje były w rozsypce zdarzał się kod:
var v = new Vector<>();
Enumeration enum = v.elements();
Który w Java 5 przestawał działać bo tam enum to był keyword ;-)

Nie, to są quirky wczesnej Java'y (choć nadal na produkcji jest MASA kodu działającego na JVM 8 ;-))

Chodzi o sam koncept i gdzie go używać.

Bo enum ma to do siebie, że to jest z definicji zamknięta lista. Można ją rozszerzyć, ale to zmienia API tego enuma. I niby nie ma problemu... trochę to psuje serializację, ale mało kto tego potrzebował.... do czasu.

Bo przyszło programowanie sieciowe i cały Internet zaczął pracować w debug mode z JSONem jako formatem do przesyłania danych.

Bardzo szybko programiści wpadli na to, że przecież niektóre z tych Stringów które tam są wysyłane to są enumy i zaczęli robić serializację do JSONa i deserializację z JSONa do obiektów z enumami....

Wczoraj widziałem kolejny team (mój ;-)), który poległ z enumem, choć tym razem w Pythonie.

Jak zwykle mamy deserializację po stronie backendu, która żeby to wszystko ładnie zrobić używa enumów.... i lecie 500 gdy ktoś przyśle coś spoza listy.

Tu jest też ciekawe pytanie czy zmiana kodu by to 500 nie leciało to poprawka błędu, czy nie? ;-)
Bo de facto kod zakładał, że istnieje legalna lista wartości i choć 500 nie jest może najlepszym sposobem na obsługę tego (400 byłoby lepsze) to nadal wołający "złamał" API ;-)
Stąd ja twierdzę, że to nie jest bug a new feature ;-)

W innym projekcie, też małżeństwo JSONa i enuma popsuł konwersję bo dostawca danych dodał nowy typ złącza... tu team był oburzony - bo złamali specyfikację - ale ta specyfikacja nigdy nie istniała, to team sobie sam ją napisał (bardzo 2000 like podejście).

Jeszcze wcześniej, znów JSON + Enumy, ale tam jeszcze Avro było gdzieś... i w końcu było tak architekt zmusił nas do używania Avro - bo tak lepiej, a później jak jeden z teamów źle tego użył to uznał, że OK, używajcie JSONa jako transportu ;-) [oryginalny problem był w tym, że JSON nie wspiera naturalnie migracji schemy....]

Jeszcze wcześniej, była sobie biblioteczka annotacji do Java'y, chodziło o Authz ze SpringBootem, tam w oryginalnej (mojej ;-)) wersji były scope'y jako String, ktoś wziął mój kod i uznał, że zrobi to lepiej i użył Enumów... działało do momentu gdy pojawił się nowy scope... który w ogóle nie dotyczył tej aplikacji, ale że ich wersja wymuszała deserializację scope'ów z tokena na enumy to mieli problem ;-)

Zaryzykuję twierdzenie, że enum nigdy nie został stworzony do bycia używanym do łączności między różnym kodem. Zrobiliśmy mu piggyback jakoś zapominając, że schema ma tendencję do zmieniania się i przez to mamy zabawne błędy z rodzaju - zmiana mnie w ogóle nie dotyczy, ale dane z wynikiem tej zmiany mogą mnie popsuć ;-)

Stąd ja tam czytając kod traktuję enum jako taki sygnał code smell (dla mnie code smell to wszystko co jest "niezwykłe", enum, protected (w Java'ie), extend (też w Java'ie), print, catch bez obsługi wyjątku i bez logu, deklaracja szerokich Exception i tak dalej).

Czy używam? Zależy, ale chyba zwykle nie.

Są świetne do maszyny stanów, ale stałe typu int w kodzie też działają, a są nawet bardziej czytelne.
Jest też sens zaryzykowania z enumem w jakieś większej klasie jeśli historia nam pokazała, że to lista jest zamknięta, albo gdy mamy obsługę "unknown"... ciągle to jednak jest ryzykowne bo jak wiele rzeczy da się rozszerzyć gdy pojawi się nowy enum, to nigdy nie masz pewności, że gdzieś nie ma czegoś co zostanie popsute.

Ja bym chyba nie używał, jakoś w moim kodzie nie znalazłem powodów, ale nie zakazuję, daję tylko takie "dwa razy się zastanów czy użyć".

A jeśli to ma być do JSONa to bym prawie nigdy nie używał ;-) Bardzo łatwo popsuć dane. Nawet gdy masz świetną obsługę i nieznane enumy są zmieniane w UNKNOWN... to problem jest w tym, że jeśli te dane zapiszesz i przekażesz dalej to kolejny klient dostał właśnie dane z usuniętą informacją. Ty chcesz zmienić pole innego typu, ale przy okazji popsujesz pole którego nawet nie używasz....
Tak, to można też obejść, ale to już jest dobudowywanie na siłę maszyny która będzie naprawiać nasz zły design.

Myślę, że enum jest podobny trochę do developmentu z branchami. Daje złudne poczucie bezpieczeństwa.
Wielu developerów tłumaczy fakt używania branchy tym, że czują się bezpieczni bo nie mają konfliktów... do momentu integracji, która jest potencjalnie największym źródlem problemów... Enum też daje poczucie bezpieczeństwa i elegancji. Wszystko ładnie się konwertuje, nie używamy Stringów, nie ryzykujemy porównywania == między typami, których nie wolno tak porównywać.... tylko, że to też jest takie pozorne bezpieczeństwo, bo w momencie gdy schema się zmienia to nagle staje się widoczna w wielu miejscach, których byśmy mogli nawet nie podejrzewać o to, że będą dotknięte przez tę zmianę.....
Tu pamiętam, że robiąc za orkiestrator do deploymentów widzieliśmy pole status i pokazywaliśmy je userowi wg zasady, że mieliśmy:
var textToShow = translations.getOrDefault(s, s);
i jakież było nasze zaskoczenie jak przebudowa w drugim systemie, który zaczął wysyłać w pewnym momencie nieznane stany to wszystko nadal działało? ;-)
Tajemnica była w tym, że wymusiliśmy kontrakt "fireAndForget", czyli my dawaliśmy pakiet do deploymentu, ale maszyna stanów była w kodzie, który robił deployment (w operatorze dla K8S), więc on sobie wprowadził swoje enumy i rozszerzył ich listę.... ale nas nie popsuł ;-)


Podobne postybeta
Lubię enumy
Javozagadka ;-)
finalize() - do czego służy, a do czego nie i z czym to się je.
Nie lenistwo, a strach. Prawdziwe źródło długu technicznego
Modale nie takie dobre dla Androida ;-)