niedziela, stycznia 05, 2020

Java Profiler jak to działa?

W życiu każdego człowieka który programuje (zwiemy ich programistami i programistkami) nadchodzi taki dzień, że trzeba coś przyspieszyć, bo coś wolno działa i nie do końca wiadomo dlaczego.
Wtedy wzrok takiego kogoś pada na profiler.
Który to profiler obiecuje, że wskaże nam miejsca gdzie nasz kod spędza najwięcej czasu.

Oczywiście zwykle wyniki z profilera nie są tym czego byśmy oczekiwali ;-) bo my byśmy chcieli jasnej informacji, że problem jest w danej linii, a zamiast tego dostajemy informację, że 90% czasu spędzono w metodzie doSth() ;-)

Ale nie o tym tutaj, a o czymś innym.
Zastanawialiście się kiedyś jak działa profiler? :-)

Ja zawsze myślałem, że używa jakichś sprytnych mechanizmów JVM, które mówią ile czasu trwało wykonanie danej metody i że tak naprawdę profiler robi tylko za interfejs do JVM.
Albo, że profiler modyfikuje kod i dodaje swój bytecode do mierzenia czasu...

W tym drugim miałem nawet trochę racji ;-)

A jak jest naprawdę? ;-)

Okazuje się, że profiler zwykle wcale nie wie ile czasu spędzono w metodzie czy metodach, ale używa sprytnej sztuczki by ten czas estymować.

Wiemy, że w Java'ie mamy wątki zwane też Thread'ami.
Mamy też Stack Trace, w którym każda ramka opisuje "linię" kodu w której jest JVM w danej metodzie. Ze Stack Trace'a możemy dowiedzieć się która metoda woła którą.
Zwykle Stack Trace'a widzimy w momencie gdy leci jakiś wyjątek i Stack Trace pozwala nam wyśledzić to miejsce.

Mamy też coś takiego jak Thread Dump, czyli zrzut stanu w postaci StackTrace + stan aktywności dla każdego z wątków.

I właśnie Thread Dump jest kluczowym elementem działania Profilerów ;-)

Profiler "po prostu" prosi z zadanym interwałem JVM o Thread Dump'y i zapisuje je sobie.
Dzięki temu dostaje "historię" tego gdzie dany wątek był w zadanym czasie.

Profiler używając Thread Dump'a próbkuje stan JVM i dzięki tym próbką może pokazać nam gorące fragmenty kodu, w których spędzamy najwięcej czasu*.

Ponieważ Thread Dump jest dość ciężką operacją to w trakcie profilowania prędkość całej aplikacji nam maleje, ale oznacza to też, że istnieje pewna "graniczna" częstotliwość próbkowania, a więc i to, że dokładność/rozdzielczość profilera jest ograniczona.
Stąd profiler może gubić pewne bardzo krótkie metody, albo mocno niedoszacowywać ilość ich wywołań. Co zwykle nie powinno być problemem, bo jeśli robimy 100 zrzutów na sekundę, a metodę wołamy milion razy i ani razu z wciągu tych 100 zrzutów nie byliśmy w tej metodzie to raczej nie ona stanowi nasz problem (ten fragment jest bardziej pisany w oparciu o intuicję niż fakty).

Tu istnieje teoretyczna metoda na poprawienie rozdzielczości, choć szczerze nie wiem czy jest stosowana (tzn. wiem, że jest stosowana np. w AppDynamics, więc pewnie DynaTrace i podobne narzędzia do monitorowania aplikacji też to mogą zrobić, ale w AppDynamics to jest robione "ręcznie" i raczej jest pomyślane jako mechanizm do zbierania metryk biznesowych czy technicznych z aplikacji, a nie metoda na profilowanie per se).
Otóż JVM pozwala na dodanie agenta, który w trakcie ładowania klas może dodać do tych klas swój kod. Jednym ze sposobów jest dodanie kodu na początku i na końcu metody. Ten kod może np. zapisywać informacje o czasie wykonania metody, albo o ilości wykonań metody.
Oczywiście technika ta ma też swoje wady. Bo trudno powiedzieć wtedy jaki procent czasu wykonania danej metody to wykonanie samej metody, a jaki to czas wykonania kodu mierzącego czas i zbierającego statystyki ;-)

Przyznam, że gdy w końcu dowiedziałem się jak działają profilery to trochę spadła mi wiara w ich skuteczność ;-) Nadal są świetnymi narzędziami, ale jednak nie magicznymi.
Wydaje mi się jednak, że teraz jakoś lepiej umiem korzystać z ich wyników.

A i jak potrzebujecie w normalnym życiu programisty czy programistki zajrzeć aplikacji w bebechy to fajnie jest użyć Java Mission Control. Fakt, sam używałem w celach "profilowych" Java Mission Control tylko w Java 8 i nie wiem do końca jak jest z licencją na JCM i jej dostępnością w Java 11...
Ale dzielę się tutaj przydatnymi opcjami do uruchamiania Java'y które w razie obecności JCM zapiszą nam śliczne pliki, które możemy obejrzeć w JCM**.

Poniższy zestaw opcji dla Java'y zapisuje FlightRecord do pliku rec.jfr
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=dumponexit=true,dumponexitpath=rec.jfr -XX:StartFlightRecording=defaultrecording=true


(to wyżej to kopia z moich notatek z Notion (wcześniej z Evernote))

* - OK, tak naprawdę może pokazać nam też punkty, które nie są gorące, ale np. wątek tam na coś czeka, np. na sieć.
** - uwaga, Oracle coś spaprało i na Java 8 UI do JCM nie działa na macOS, stąd dobrze mieć jest do oglądania zapisów z JCM gdzieś 1.8.0_96 czy podobną.


Podobne postybeta
Sztuczki tropiciela błędów, part 2 ;-)
Zinwigiluj się sam ;-)
Raport z emigracji ;-)
wait() i notify()/notifyAll() - najbardziej nierozumiane metody klasy Object ;-)
Inercja i koło wielokrotnego wynajdywania, czyli radosne macki piekieł w kodzie [alem pojechał w tytule ;-)]

czwartek, stycznia 02, 2020

"Pokolenie nihilistów"

Podobno abp (arcybiskup?) Wiktor Skworc w swojej homilii zaapelował do MEN o regulacje które zapewnią, że uczniowie będą musieli chodzić na lekcje religii albo etyki. Bo wg niego brak takiego wykształcenia skutkuje "pokoleniem nihilistów".

Nie chodziłem na religię, ani etykę.

Czy jestem przedstawicielem pokolenia nihilistów?

Co do dobra i zła uważam, że nie istnieją absolutne dobro i zło, bo w mojej ocenie dobro i zło wynikają tylko z oceny przez jakiś subiektywny byt.
Coś co wg mnie jest dobre lub złe, ktoś inny może ocenić inaczej.

Mamy pewne ewolucyjne i społeczne definicje dobra i zła i dobrze nam służą, i póki ktoś nie jest psychopatą czy socjopatą to raczej większości z nich przestrzega.

Stąd pytanie, zakładając, że pan arcybiskup ma rację. Co złego w "pokoleniu nihilistów"?

Podobne postybeta
Najmocniejszy "żart" Prima Aprilisowy
Dobro i sprawiedliwość
Edukator ;-)
No to w fajnym kraju żyjemy
Frustracja....

niedziela, grudnia 29, 2019

A może by tak nosić drugi telefon specjalnie do on-call'a?

Trafiłem znów na on-call'a ;-) po 3.5 roku błogiego bycia bez on-call'a, znów go będę miał...

Tym razem używamy aplikacji, która zowie się PagerDuty.

Z drugiej strony, ostatnio zacząłem odkrywać uroki trybu samolotowego w telefonie, bo nagle nie ma się tych wszystkich powiadomień*

Ale nie wypada włączać trybu samolotowego, gdy PagerDuty chce gadać i sprawdzać czy czasem nie ma jakichś problemów z naszymi zabawkami.

Stąd powoli w głowie rodzi mi się pomysł noszenia 2 telefonów gdy jestem na on-call'u :-)
Jeden bym skonfigurował z PagerDuty, firmowym Slackiem i takimi sprawami, a drugi byłby tylko z moimi zabawkami**

Zawsze mam najmniej 2 w miarę dobre telefony w domu i zaczyna mnie kusić taki układ...


* - tak, wiem, że można je wyłączyć, większość mam wyłączoną, ale przez to co jakiś czas mnie kusi żeby sprawdzić czy np. ktoś do mnie na Telegramie nie pisze, albo na WhatsApp.
** - teraz mam tylko PagerDuty zainstalowane z firmowych rzeczy, nawet nie mam firmowego WiFi włączonego.

Podobne postybeta
Zgubiłem dźwięk...
On-call....
Ostatni on-call ;-)
Wybory mi poprawiły humor ;-)
Idą wybory i mnie kusi wprowadzenie mojej własnej ciszy około wyborczej ;-)

sobota, grudnia 28, 2019

Nintendo Switch - jednak nie...

Kupiłem jakiś miesiąc temu....

I to jednak nie dla mnie, przynajmniej na razie.
W pociągu jakoś nie miałem natchnienia by grać, zobaczymy najpewniej za niedługo w samolocie.

Ale jak dla mnie ekran za mały i jednak trzeba czekać.
Co prawda chcą zagrać w Doom'a szybciej jest to odpalić na Switch'u, niż na XBOX'ie, ale to nie jest takie szybkie jakby się wydawało.

Do tego ekran jest jednak dla mnie zbyt mały.

Najdłużej jak na razie grałem w Untitled Goose Game, którą już prawie przeszedłem ;-)

Podobne postybeta
YouTube czy Vimeo?
Definicja szaleństwa, czyli ja i konsole przenośne
Pożytki z terminu ważności karty kredytowej ;-)
Steam Deck OLED po 24h :-)
Seriale na podstawie gier... na razie 2 się udały ;-)

niedziela, grudnia 22, 2019

Pixel 4 XL czy iPhone 11 Pro

Nadchodzi mniej więcej czas kiedy trzeba by się było rozejrzeć za kolejnym telefonem i nie wiem co wybrać.

Brnąć w Pixela 4 XL, czy przejść do obozu Apple i wziąć iPhone 11 Pro?

Kocham Pixela 3 XL za aparat, nienawidzę za baterię.

W ogóle Pixel'e to są dziwne telefony. Jak iPhone zwykle przychodzi jako cały pakiet dobrych rzeczy, które są wśród najlepszych, może nie są najlepsze, ale są wsród najlepszych, to Pixel'e są mieszane.
Mają np. świetną kamerę, ale słabą baterię.
Pixel 3 wprowadził kamerę szerokokątną na przód telefonu, a Pixel 4 ją usunął....

Pixel'e są jak Google, genialne, ale jakieś takie nie do końca przemyślane.
Do tego w Pixel'ach najwięcej rzeczy jest w sofcie i w AI, które działają zwykle tylko dla języka angielskiego i paru innych.

Jest np. możliwość zrzucenia rozmowy na asystenta Google, ale działa tylko w kilku miejscach na świecie.

Apple jest za to dość nudne, ale działa.
Do tego idąc w iPhone'a 11 Pro mogę pójść też w Apple Watch'a....

Podobne postybeta
70+ godzin, Staff i iPhone ;-)
Pixel 6 po ~2 miesiącach.... prawie nieodróżnialny od Pixela 4 XL ;-)
Google zachorowało na księgowych...
Ważenie Stefanów
Magia....

"os.arch", "os.name", "sun.arch.data.model" co to jest i co pokazuje na jakiej maszynie i OSie? ;-)

[updated 21/02/2021 ;-) niżej dodano wyniki dla Macbooka z M1 :-)]
Ostatnio musiałem dodać do kodu testy, które testują czy interfejs do bazy danych dobrze gada z DynamoDB.
Zdecydowałem, że użyje lokalnego DynamoDB, które dostarcza AWS.
Problem w tym, że drań wymaga natywnych bibliotek na ścieżce...
A kod będzie uruchamiany na macOS, Windows i Linuksie ;-)
Stąd musiałem napisać kawałek, który rozpoznaje którą bibliotekę natywną umieścić na ścieżce.

Tutaj podzielę się czymś podobnym, a mianowicie tym jak różne OSy i czasem platformy sprzętowe się przedstawiają gdy pyta się je o to kim są z Java'y ;-)


Podstawą naszej zabawy będzie ten prosty programik:

public class Test {

public static void main(String[] args) {
System.out.println("OS Architecture : " + System.getProperty("os.arch"));

System.out.println("OS Name : " + System.getProperty("os.name"));

System.out.println("OS Version : " + System.getProperty("os.version"));

System.out.println("Data Model : " + System.getProperty("sun.arch.data.model"));

System.out.println("Endian : "+ System.getProperty("sun.cpu.endian"));
}

}

Tutaj opis tego co oznaczają poszczególne informacje.

OS Architecture (os.arch) - prostu architektura CPU i OSa (CPU może mieć często wyższą architekturę, ale uruchamiać kod dla "niższej" architektury). W przypadku Java'y będą to teraz głównie amd64 i x86_64 (obie znaczą to samo, ale zależą od OSa), czasem może się zdarzyć arm, z rzadka x86.
OS Name (os.name) -  nazwa OSa, najbardziej "niepewna" część, macOS to np. czasem macOS, a czasem Darwin, Windows to czasem win, a czasem Windows. Jak jednak pokazują rezultaty, ostatnimi czasy jest jakiś porządek tutaj.
OS Version (os.version) - wersja OSa, chyba najmniej przydatna rzecz. Rzadko w Java'ie używamy wersji OSa do detekcji czekogolwiek.
Data Model (sun.arch.data.model) - bitowość Java'y :-) najmniej musi być 32, bo Java nigdy nie występowała w wersja 16 bitowej (przynajmniej nie znam takowej), teraz prawie zawsze 64. Ważna gdy ładuje się biblioteki natywne, bo 32 bitowy kod nie może być wykonany w trybie 64 bitowym, a 64 bitowy w trybie 32 bitowym.
Endian (sun.cpu.endian) - ciekawostka, "indianowatość" CPU. Tu jest ciekawe bo i x86 i ARMy są little endian, a sama Java jest big endian. Ogólnie w przypadku zapisu liczb w CPU, pamięci czy w pakietach przesyłanych siecią (albo w plikach) powstaje pytanie gdzie są które części liczby, czy bajt należy czytać od lewej czy prawej, czy słowo od prawej czy lewej i tak dalej. Kiedyś było to dość ważne, dziś żyjemy w świecie gdzie to wszystko jest zwykle dla nas załatwiane przez OS i biblioteki. Nasze OSy i CPU są little endian, sieć i Java big endian, a mimo wszystko to jakoś działa.

Sam programiki uruchomiłem na kilku konfiguracjach (z czego 3 to mój MBP 15 z macOS Catalina + Parallels 15)

Wyniki są takie:

Linux (Ubuntu 18.04, uruchomione przez Parallels 15 na macOS Catalina)
OS Architecture : amd64
OS Name : Linux
OS Version : 4.15.0-72-generic
Data Model : 64
Endian : little

Windows (Windows 10, uruchomione przez Parallels 15 na macOS Catalina)
OS Architecture : amd64
OS Name : Windows 10
OS Version : 10.0
Data Model : 64
Endian : little

macOS Catalina
OS Architecture : x86_64
OS Name : Mac OS X
OS Version : 10.15.2
Data Model : 64
Endian : little

Raspbian na Rasbperry Pi (Pi 2 Model B)
OS Architecture : arm
OS Name : Linux
OS Version : 4.1.19-v7+
Data Model : 32
Endian : little

Linux (Ubuntu 16.04)
OS Architecture : amd64
OS Name : Linux
OS Version : 4.4.0-170-generic
Data Model : 64
Endian : little

Android (Android Emulator w trybie x86 na macOS Catalina)
OS Architecture : i686
OS Name : Linux
OS Version : 4.14.112+
Data Model : null
Endian : null

Android (Pixel 3 XL z Androidem 10)
OS Architecture : aarch64
OS Name : Linux
OS Version : 4.9.185-xxxxx
Data Model : null
Endian : null

Macbook z M1 (dodane 21/02/2021)
OS Architecture : x86_64
OS Name : Mac OS X
OS Version : 10.16
Data Model : 64
Endian : little

Macbook z M1 (dodane 10/05/2021) - w końcu ARMa raportuje ;-)
OS Architecture : aarch64
OS Name : Mac OS X
OS Version : 11.2.3
Data Model : 64
Endian : little


Jak widać największe zamieszanie panuje w OS Architecture.
Na Windows i Linuksie pryz 64 bitach mamy amd64, ale na macOS X mamy x86_64.
Obie są prawidłowymi nazwami, choć x86_64 było nazwą zaproponowaną przez AMD gdy tworzyli ten tryb dla Athlonów, a amd64 powstało trochę później*.

Jeszcze kilka lat temu problemem była też "bitowość", czyli Data Model.
Wtedy sprawa się komplikowała, bo choć większość CPU na rynku była już 64 bitowa, to jednak OSy nadal były 32 bitowe. Później już i OSy i CPU były 64 bitowe, ale jeszcze soft był 32 bitowy.
Przez jakiś czas dostępne były wersje Java'y dla 64 bitowych OSów, które mogły pracować w 32 i 64 bitach.
Tutaj napiszę z pamięci, bo nie mam nigdzie żadnego 32 bitowego procesora zgodnego z x86, ani 32 bitowego OSa :-)
Ale jeśli dobrze pamiętam dla Windows to był x86, dla Linuksa i386 (czasem i586???), nie mam pojęcia jak było z macOS.
Na szczęście od paru lat wszystko co mamy ma prawie na 100% 64 bity (najnowsze Raspberry Pi 4 też jest 64 bitowe).

Kolejnym problemem jest OS.
Wydaje się jednak, że dziś można niemal na 100% przyjąć, że 1 słowo w lower case pozwoli na rozpoznanie OSa.
Widzimy też, że Android to tak naprawdę Linux ;-)

Oczywiście autorzy natywnych bibliotek nie zawsze przestrzegają reguł, stąd jeśli wiemy, że nasz kod będzie działał np. tylko na 64 bitowych wersjach macOS, Linuksa i Windows to prościej po prostu dokonywać detekcji OS'a i zamiast budować nazwę biblioteki, to po prostu mieć zahardcodowane wersje dla każdego z OSów.
Nie jest to najbardziej uniwersalna metoda, ale kod jest dużo prostszy ;-)

* - historia jest taka, że Intel uznał, że przejście na 64 bity to dobry moment na przejście na nową architekturę. Ale ponieważ była to nowa architektura, konieczna byłaby nowa licencja i dodatkowo trzeba by było tworzyć całkiem nowe procesory. Stąd AMD postanowiło wziąć istniejącą architekturę x86 i ją "zupgradować" do 64 bitów, tak jak kilka lat wcześniej zrobił Intel gdy dodał do 16 bitowego x86 32 bitowość.
Przez ten manewr, który pozwolił na w miarę szybkie przeniesienie kompilatorów i istniejącego kodu (nawet w assemblerze) na nową 64 bitową architekturę, x86_64 zabrał prawie cały rynek Itanium,  który praktycznie umarł i żyje teraz tylko w highendowych procesorach od Intela, a i sam Intel planuje tę architekturę "umrzeć" w 2021 roku.



Podobne postybeta
Dla Java'y Apple Silicon M1 to jednak nadal x86 ;-)
W końcu dane z M1, które w Java'ie mówią, że to jest ARM :-)
"CPUInfo" w Java :-)
JNA, czyli w Java'ie też można :-)
Exif jest zły - część 2 :-)

sobota, listopada 16, 2019

Bonusy, koszty autorskie i limit 30 krotności...

Powiedzmy wprost, podatek dochodowy dla programistów w Polsce nie jest najłatwiejszą rzeczą do policzenia ;-)

Wiele firm daje możliwość naliczania sobie autorskich kosztów uzyskania przychodu, każda od innego procenta pracy, do tego część daje już akcje czy też LTI, a do tego dochodzą jeszcze bonusy.
Dostępne w internecie kalkulatory są takie, że umieją liczyć autorskie koszty, ale nie rozumieją bonusów i LTI....

Więc sobie stworzyłem swój własny ;-) i w końcu działa.

Na razie nie jest piękny, jak ktoś chce to jest tutaj (specjalnie go tak kitram, żeby trzeba było nań kliknąć) (instrukcja jest taka, u góry wpisujesz ile procent masz autorskich kosztów, dalej jest 250 PLN miesięcznie jako koszty uzyskania przychodu (jeśli mieszkasz w innej gminie czy powiecie niż pracujesz to to będzie 300 PLN), dalej wpisujesz bazę i bonus dla każdego miesiąca. Do bazy idzie pensja zasadnicza, do bonusu LTI i ewentualne premie. Później klikasz "Calculate" i widzisz wynik, pierwsza tabelka pokazuje wynik gdy limit 30 krotności istnieje, a druga gdy nie istnieje, pod każdą z tabelek jest zapisana łączna kwota netto wypłat (to jest przy założeniu, że nie miało się urlopu, chociaż przy odpowiednio wysokich dochodach to nie ma znaczenia ;-)).

U mnie różnica jest niezła, jakieś 6% w skali roku...
Nie zabije mnie, ale w liczbach bezwzględnych robi wrażenie ;-)

Sam kalkulator działa dla 2020 roku, przy założeniu, że limit się nie zmieni i że progi się nie zmienią, jeśli limit zostanie, to pewnie się zmieni wartość, bo ta zależy od średniego miesięcznego wynagrodzenia.
Mam zamiar go uładnić. Teraz się cieszę, że w końcu działa.
Pod koniec już miałem wątpliwości bo porównywałem jego wyniki (bez bonusów) z innymi kalkulatorami i przez ostatnie 3 miesiące roku miałem zawsze o 139 PLN wyższy podatek..... dopiero w końcu doczytałem, że od 1 października 2019 roku koszty uzyskania wskoczyły z 111.25 PLN do 250 PLN miesięcznie ;-)
Do tego wszystkiego jest tak, że kalkulator, tak jak i pracodawca zakłada, że będzie się miało kwotę wolną... większość programistów jej nie będzie mieć bo zarabia za dużo, stąd trzeba się liczyć, że ten kalkulator pokazuje mniej więcej to co dostaniemy w wypłacie, ale ta wypłata jest pewnie wyższa niż powinna być i to wróci w momencie rozliczania PIT.


Podobne postybeta
Pensje w IT są trudne
Nie ma sprawiedliwych podatków ;-) przynajmniej obiektywnie sprawiedliwych ;-)
"Pokochałem me Atari....", a właściwie G1 :-)
Płatnik czy beneficjent?
Dobrze być programistą w Polsce ;-)

poniedziałek, listopada 04, 2019

Serce czy rozum?

Jest tak, mam decyzję do podjęcia.
Serce mówi jedno, rozum drugie.

Tzn. serce mówi też trochę za tą drugą opcją, a rozum też trochę za pierwszą, ale ogólnie serce jest bardziej za opcją B, a rozum za opcją A.

Niby wiem, że serce, czyli emocje + gut feeling to różne heurystyki które mamy w głowie i często one "wiedzą" lepiej, bo rozum i jego zdolność symulacji są dość nowym wynalazkiem, więc nie mają takiego doświadczenia.
Z drugiej strony wiem, że serce/emocje mają silny bias do znanych rzeczy.

Moje zwyczajowe metody, jak losowanie (coś w stylu orzeł A, reszka B) i patrzenie czy mi się output podoba wskazują opcję B.
Wywiady wśród ludzi, gdzie ich argumenty słucham i niektóre mi się podobają, a inne nie, też wskazują na B.
B mnie też bardziej cieszy.
Ja jednak chcę wierzyć, że jestem człowiekiem rozumu i opcja B wiąże się z pewnymi konsekwencjami.

Kto by pomyślał, że kupowanie spodni to taki problem?* ;p


* - ukłon w stosunku do anegdoty z Paradox of Choice albo z wywiadów z autorem ;-)

Podobne postybeta
Gdyby przez kolejne 5 lat wszystko mi się udawało to za 5 lat.....
Chodzi za mną nowy Nexus 7....
Czy vibecoding zmienia ważność ludzi? Czy PM/PO stają się bardziej niezbędni od inżynierów?
Wyrzucanie książek...
Nexus 10... Chodzi drań za mną..

niedziela, listopada 03, 2019

Polski to nie jest dobry język do internetu ;-)

Takie coś zobaczyłem dziś na Patronite:
I przy pierwszym scanie ekranu te dwa napisy mi się połączyły i było "wypierdalaj" ;-)

Ja wiem, że szybko czytam i jako osoba niecierpliwa wiele napisów czytam od prawej do lewej, ale nie wiem czy jednak jakiś UX nie powinien zwrócić uwagi na to, że tak to można na szybko odebrać ;-)

Inna sprawa, po co poszedłem na Patronite.
Mój ulubiony (i jedyny polski kanał, który oglądam) na YouTube ma coraz mniej filmów, a jak są to nie takie jak kiedyś (niby lepsze technicznie, ale zwykle mniej interesujące) i zastanawiam się czy im nie zabrać wsparcia...
Powinien być ficzer "probation" ;-)


Podobne postybeta
Taki mały sekret, czyli jak to czasem lubie się pobowaić user experience ;-)
Metryka do mierzenia jak interesujący są ludzie ;-)
Netflix w służbie nauki - nauki języka ;-)
Anioł Ciemności - polskie DVD :-)
Smutno mi się zrobiło...

70+ godzin, Staff i iPhone ;-)

W tamtym tygodniu skończyłem mój projekt, który trwał od paru miesięcy, a ostatnia faza zajęła mi łącznie 170 pomidorów, czyli 70 godzin i 50 minut.


Co ciekawe rezultat projektu jest mi bardziej obojętny niż proces :-)
A projekt mi został na tydzień zawieszony przez wyjazd do USA.

Przy okazji jakoś tak 3 dni temu mi się stanowisko zmieniło... choć może wrócić do poprzedniego i zmienić się w styczniu ;-)
W końcu jednak będzie brzmiało albo brzmi Staff Software Engineer ;-)

W ogóle, co jest ważniejsze? Pieniądze, czy pozycja (nie w sensie stanowiska, a bycia znanym).
Niby pieniądze to tylko miara, a wszystko robimy by mieć pozycję, najlepiej społeczną bo ta się w końcu przekłada na dostęp do lepszych samic (czy samców, chociaż ten socjobiologiczny "model" jest ciut bardziej skomplikowany).

Zastanawiam się czy by nie kupić iPhone'a...
Kocham Pixele, ale Pixel 4 jest raczej na razie nieosiągalny, a do tego Googlerzy jak zwykle coś spaprali.
Tak się momentami zastanawiam czy oni tam nie mają takiego spotkania na którym ktoś im przypomina, że "pamiętajcie nie możemy zrobić telefonu, który będzie sukcesem finansowym bo zasmucimy Samsunga i innych" i zaczyna się burza mózgów jak by tu jednak zapewnić, że telefon będzie uznawany za świetny, ale z minusami...
W przypadku Pixela 2 XL uznali, że ekran dadzą taki sobie, w przypadku Pixela 3 XL postanowili pójść dalej, dali świetną kamerę, olbrzymiego notcha (który wygląda jeszcze jakby był nierówny i nie jest dopasowany do OSa) i zmniejszyli baterię, w przypadku Pixela 4 XL ekran jest fajny, kamery też, ale znów bateria taka sobie, do tego uznali, że dodadzą radar...
A iPhone oznaczałby też Apple Watcha...


Podobne postybeta
Dwa małe błędy - czyli czemu świat nie jest do końca taki jak powinien być ;-)
Istotny łowca sztabowy ;-)
Pixel 4 XL czy iPhone 11 Pro
Tygrysy
Koronawirus - jak na mnie wpływa