W zeszłym roku wywalono mnie z roboty za wytykanie jednemu zespołowi, że ich nieumiejętnie napisane aplikacje zżerają niesamowite ilości kasy żeby to uruchomić i utrzymać. Oraz że nie da się tego wyskalować. Zwolniono mnie z dnia na dzień, bo okazało się, że w pierwszej kolejności tam grał rolę nepotyzm, a każdy problem można zalać kasą. Przynajmniej wg managera który chronił swojego przyd**a. Zwolniono mnie z tekstem, że "może się czegoś nauczysz".

W nowej robocie trafiłem do projektu, który robi de facto to samo co poprzedni. Jedyna różnica to kompetencje ludzi dookoła. Parę dni temu udało nam się odpalić podobny system jeśli chodzi o skalę przetworzonych zapytań jak mój poprzedni projekt. Tyle że w starej firmie kosztował ok 10000 USD na miesiąc. Nowy, zoptymalizowany, i nie używający pythona system kosztuje 310 USD miesięcznie.

No więc się nauczyłem czegoś! Czego się nauczyłem? Za głupotę i nepotyzm się płaci. A python to wciąż najgorszy możliwy język gdy masz do czynienia z dużą skalą.

#pracbaza #devops

Komentarze (35)

Gustawff

Odkryłeś że ludzie chodzą do pracy żeby zarabiać, a nie pracować

qwarqq

@Gustawff prawdę mówisz, ale niestety chyba nigdy tego nie pojmę w pełni taki mam defekt.

Marcowy_Kot

@qwarqq a co zamiast pythona?

Gustawff

@qwarqq to nie defekt, to brak znajomości

qwarqq

@Marcowy_Kot zależy od zastosowania, ale tam gdzie przetwarzasz kilkadziesiąt TB danych dziennie: java, rust, ew nodejs. zależy od designu systemu.

koszotorobur

@Marcowy_Kot - jakby powiedział Scala to bym skisł

qwarqq

@koszotorobur cokolwiek co nie ma gila xD

koszotorobur

@qwarqq - Pythona od wersji 3.13 można sobie skompilować z flagą --without-gil - więc nad tym już ostro pracują.

Poza tym od dawna można ominąć GILa - dużo jest poradników jak wyszukasz sidestepping/bypassing/removing GIL.

Może się na Pythonie przejechałeś ale ja go jeszcze nie skreślam

qwarqq

@koszotorobur już zaraz, za momencik (3.12 też miało być takim przełomem wydajnościowym, nie było)... Ale są obejścia, frameworki i tricki!... Zaczyna to przypominać historię PHP jeśli mam być szczerym :P
Z pythona wydajnego programu nie ukręcisz. Ukręcisz działające coś, ale nie będzie to wydajne. Nigdy.

koszotorobur

@qwarqq

Z pythona wydajnego programu nie ukręcisz. Ukręcisz działające coś, ale nie będzie to wydajne. Nigdy.

Mylisz się - będzie wydajny, ale zapewne nie najwydajniejszy - wszystko zależy jak definiujesz wydajności - zdaje mi się, że obecnie dla Ciebie najważniejsza jest szybkość wykonywania się kodu.

To co w nowej firmie napisałeś też pewnie da się przepisać na coś szybciej się wykonującego według naszej obecnej wiedzy - jak dług można gonić tego króliczka?

Cieszę się, że miałeś możliwość zaprojektowania systemu od podstaw i jest na tyle wydajny, że łechta Twoje ego - teraz tylko trzeba go rozwijać, utrzymywać i jeszcze najlepiej zrobić tak by można przekazać development komuś innemu - życzę wielu kolejnych owocnych lekcji.

qwarqq

@koszotorobur tu masz rację, definicja wydajności zależy od wymagań projektu, w przypadku oby projektów o których mówiłem jest to samo: pobrać i przetworzyć określone dane i wypluć je klientowi. W bardzo dużej ilości. Dlatego porównane w tym wypadku jest poprawne. I zgadzam się, że w przypadku pythona, gdy będziesz uważał i pamiętał o wszystkich problemach języka, plus do ciężkich zadań wykorzystasz biblioteki z bardziej dorosłych języków, to masz szansę napisać coś równie wydajnego, co średnio rozgarnięty mid w javie albo rust'cie :)

A co do łęchtania ego, to ponownie masz rację. Głównie dlatego, że w poprzedniej robocie manager z przydu**m zwalali winę za brak wydajności na infrę. Teraz wiem, że nie ona była problemem.

koszotorobur

@qwarqq - no i dochodzimy do sedna - każdy język programowania jest do czegoś przydatny a czym więcej go używamy tym bardziej zauważamy do czego przydatny nie jest

Jakbym sam miał robić greenfield project do obrabiania terabjtów danych to zastanawiałbym się nad doborem języka pod to zadanie i jednym z kryteriów byłaby też docelowa architektura (bo w korpo nie zawsze dane jest nam decydować na czym się nasz kod będzie uruchamiał).

Ja prócz Pythona sam programuję w Ruście, Golangu, JavaScripcie - ba kiedyś nawet w Javie i C - i są to jedynie narzędzia, które dobieram do zadania.

A co do Pythona, to widać, że obrali kierunek na zwiększenie wydajności przetwarzania danych - więc w kolejnych wersjach można spodziewać się różnorakich udogodnień, które (powoli) są rozwijane, by zastąpić te mniej oficjalne (niemniej funkcjonalne) rozwiązania.

koszotorobur

@qwarqq - Python jako klej jest świetny - a optymalizację też da radę w nim zrobić - w poprzedniej firmie użyliśmy do tego Cythona, a w obecnej firmie jeden zespół wybrał przejscie na Polars a drugi na czysty NumPy i Numbę - przepisanie na coś innego nie wchodziło w grę bo nie ma na to zasobów - ale obliczenia w niektórych momentach wykonują się 1K razy szybciej - no i oba projekty działają lepiej niż się na początku wydawało, że będą. Do tego Lead Developer w tym drugim zespole to świetny gość i przerobił wszystkie możliwe scenariusze i poparł je danym ze swoich eksperymentów - z takim ludźmi pracować to przyjemność.

Bez względu, strasznie dużo czasu traci się na serializacji i deserializacji danych - jak to się ogarnie to połowa sukcesu - potem trzeba już kombinować z dostępnymi technologiami i zasobami ludzkimi bo to czasowo i budżetowo się musi śpiąc w działającej aplikacji, która jest krytyczna dla biznesu.

serel

przerobił wszystkie możliwe scenariusze i poparł je danym ze swoich eksperymentów - z takim ludźmi pracować to przyjemność

@koszotorobur daj mi tego gościa, płacę w złocie. Dżizas, ileż to razy "świetne pomysły" wyjebały system na głupi ryj, bo ktoś tylko happy path sprawdził

koszotorobur

@serel - no gość jest bardzo ogarnięty technicznie - do tego miły i rozmowny - jak się widzimy urządzamy sobie sesje ostrego narzekania i jedziemy równo po wszystkim bo obydwoje nie cierpimy korpo bulszitu - generalnie to super się dogadujemy - nie oddam go bo jest wart swojej wagi w złocie

qwarqq

@koszotorobur jako język do sterowania, klej, to faktycznie się sprawdza. jakieś skrypty administracyjne, coś w tym stylu.
Ale jakiekolwiek operacje IO czy na danych to bez bindingów do bibliotek z bardziej sensownych języków nie ruszysz. Taki wspaniały język, że sam nic nie może, a jeszcze jego architektura czyni go kompletnym kaleką.

rith

@qwarqq 310 miesięcznie? Co Wy tam macie, że tak tanio?

qwarqq

@rith przemyślany kod, optymalna infrastruktura... i serwery bare-metal dedykowane ten konkretny workload. Dwa Epyc 4464p. Ogólnie śmiesznie z nimi było musiałem się jeszcze z technikami wykłócać o to które sloty ramu użyli xD

rith

@qwarqq aaaa ok. Myślałem że na jakiejś chmurze coś opędziliście za 310$/mc i się zastanawiam jak to kurde możliwe xD

To najs, fajnie ze się udało trafić do ludzi którym zależy!

koszotorobur

@rith - to pozwól, że ja Ci napiszę jak obniżyliśmy koszty w AWSie jakoś tak dziesięciokrotnie

A więc przyjąłem się do firmy co zapuszczała w nocy batch processing i jak zobaczyłem co robią to złapałem się za głowę:

  • Używali jednej wielkiej instancji co była cały czas włączona

  • Instancja była on-demand (i działała już tak ze 2 lata)

  • Aplikacja była napisana w Pythonie + Pandas

  • Aplikacja od czasu do czasu musiała w ciągu dnia "doliczyć" jakieś rzeczy i było to liczone przez dosłownie kilka minut na tej ciągle uruchomionej isntancji

W ciągu kilku miesięcy udało mi się:

  • Sprofilować kod i wykazać gdzie są największe bottlenecki

  • Dogadać z developerami by zoptymalizowali funkcje obróbki danych przy pomocy Cythona

  • Zmienić infrastrukturę tak by wszystko było event driven

  • Uruchamiać tą jedną nieszczęsną instancję tylko na czas procesowania danych i wyłączać ją gdy nic nie musiało być liczone

W ciągu kilku następnych miesięcy:

  • Wykorzystując fakt, że firma została zakupiona przez korpo rok wcześniej - przejść na resellera usług AWS, gdzie za instancje on-demand płaciliśmy jak za takie zarezerwowane na 3 lata

  • Doprowadzić do przepisania aplikacji tak by wszytko liczyło się na uruchamianej instancji tylko gdy jest taka potrzeba a przy przerwaniu procesowania danych można było je wznowić na innej instancji - wyciskając dodatkowe oszczędności na infrastrukturze używając domyślnie spot instance z fallbackiem na on-demand

rith

@koszotorobur o proszę. Też fajna zabawa. Ja ogólnie to jestem przyzwyczajony do tego, że jak ktoś mówi że ma cała aplikacje i chce klaster, i ma być za mniej niż 1k/mc to mówię że się nie da xD

koszotorobur

@rith - klaster K8s za 1K PLNów (w konfiguracji 3+5) w AWSie... jakby tak pokombinować z zarezerwowanymi instancjami ARM opartymi o procesory Graviton...

rith

@koszotorobur nie no w dolarach mówię. Na 2+3, na azure, wystarczy ( ͡° ͜ʖ ͡°)

piotrlionel

@koszotorobur coś Ci to dało? Procent do pensji, sensowną premie?

koszotorobur

@piotrlionel - wiedziałem od razu przy podejmowaniu tej pracy, że będę za to odpowiedzialny - ocenienie jak bardzo źle jest należało do mnie oraz przygotowanie planu wdrożenia i jego egzekucja - pensja była bardzo dobra - a bonus to był 3% rocznej pensji przy wywiązaniu się z obowiązków w przeciągu roku - oczywiście się wywiązałem, zgarnąłem kasę i znalazłem pracę za jeszcze lepsze pieniądze

AureliaNova

Masz przejęzyczenie w ostatnim zdaniu, powinno być "A python to wciąż najgorszy możliwy język." :P

koszotorobur

@AureliaNova - to teraz zapodaj jaki jest najlepszy

serel

@AureliaNova dawaj mordo, otwórz puszkę Pandory xD

AureliaNova

@serel @koszotorobur mialo być śmieszkowanie, ale widzę, że zabrnąłem do złej dzielnicy ⚔️ Także żeby wyjaśnić to raz na zawsze, każdy język służy do czegoś innego: js będzie dobry do frontendu, SQLe do zapytań, Java do backendu, a python jest do dupy

A tak serio serio i prywatnie, to dla mnie jako osoby używającej na co dzień C# i różnych pokrewnych języków/technologii, to pisanie w pythonie było uciążliwe. Przedstawienie się na czytanie kodu w tej składni też było wkurzające, bo się wszystko zlewa w jedno. Gorzej chyba tylko PHP wspominam :) no i Adę, ale to wyłącznie na studiach.

koszotorobur

@AureliaNova - kwestia przyzwyczajenia do określonej składni

Ja z te 20 kilka lat temu strasznie nie lubiłem Pythona - ale powolutku zaczął być dla mnie czytelny - niemniej czasem dla dużych klas czy funkcji brakuje tej klamry, ale nie zdarza się to często.

Python to jest taki fast food języków programowania - może nie smakuje dobrze ale przynajmniej szybko ląduje w koszu

Jakby na niego nie patrzeć został najpopularniejszym językiem programowania - a niektórym co popularne, choćby zjadliwe, nigdy nie będzie smakowało

LondoMollari

@AureliaNova Ja strasznie lubiłem Adę. Python też jest spoko, prawie wszystko jest spoko, pod warunkiem odpowiedniego dobrania języka do problemu. C# akurat nie lubię, bo bo od lat jestem trochę anty-MS, a przy okazji wszystkie C#-owe projekty z jakimi miałem styczność były napisane tak sobie.


Erlanga też tak sobie lubię, ale to też raczej przez projekt, przy którym dłubałem, a nie sam język.

AndrzejZupa

Tu sie zgodzę...pytong nie nadaje sie do "dużych porcji" (zawsze wolne gunwo).

Cieszę się, ze czegoś sie naumiałeś.( ͡° ͜ʖ ͡°)

piotrlionel

@qwarqq też mamy takiego jednego jak Ty w zespole i wszyscy walczą żeby utkał dziurę bo każdy przychodzi zrobić 8h i chce wyjść ( ͡~ ͜ʖ ͡°)


Niestety w tym przypadku chłop jest niezwalnialny

EvilDick

@qwarqq fabric, snowflake czy databricks?

Catharsis

@qwarqq Plz powiedz mi, że przepisaliście to z Pythona na Rusta xDDD

Zaloguj się aby komentować