Dělals někdy na něčem rozsáhlejším v go? Já bych přežil ten divný jazyk a ty zvyklosti kolem něho, ale když se pak na ten kód člověk podívá, tak všechno tak nějak splývá - jediná konvence je začít malým písmenem pro interní věci, a velkým pro export. Už toto je naprostá syntaktická noční můra - žádné visuální oddělení konstant, struktur, atd..., všechno to splyne dohromady a člověk potřebuje dobrý editor, aby v tom nějaký smysl našel. A exportnout něco, co bylo třeba interní znamená změnit název toho symbolu, a upravovat všechny místa, kde byl použitý.
Já nevím jak ostatní, ale větší projekt bych sám od sebe v go nikdy nezačal a ty na kterých jsem dělal už bych nikdy nechtěl zpět :)
A úplně nejlepší jsou hardcore gophers co čumí na černobílý editor, protože tak to dělá i sám tvůrce a tak to je přece nejlepší :-D
Dělal jsem na velkých projektech v Javě, C++ a Go, a pokud někde byly větší problémy, nesouvisely s jazykem. Zrovna Go si mnozí na velké projekty pochvalují, já to vidím spíš neutrálně, Go nebo Java, z pohledu řízení projektu prašť jako uhoď. Pain je spíše C++ nebo Rust, ne kvůli syntaxi — tu se naučí i opice — ale prostě stylu jazyka (zvlášť C++ je občas bordel). Pokud si někdo stěžuje u větších projektů na jazyk (Javu, Go, to je fuk), buď ten jazyk pořádně neumí, nebo by neměl vést/řídit projekty. Ale to je off topic, téma jsou typové parametry a typové množiny. Marně přemýšlím, který jiný jazyk je v této formě má.
Je to něco jako algebraické typy, jen flexibilnější a hlavně jednodušší než původní kontrakty u typů. Nejspíš si chtěli ušetřit práci, proto naroubovali typové množiny na rozhraní. Runtime (implementace pod kapotou) se podobá typovému systému Rustu, syntax je dost odlišná. Rust je o krok napřed, jelikož má přidružené typy a GADT (potažmo HKT), ale to nemá většina rozšířených jazyků.
Hezký příklad je typová množina typů, jež mají ukazatelovou metodu Init(). Instance vytvořená pomocí new(T), kde T je typový parametr, je typu “ukazatel na T” a Init() nejde přímo zavolat, je nutné použít omezený (bounded) polymorfismus. Ovšem nejde použít něco jako [T Initialisable], když je Init() ukazatelová metoda, proto se použije typová množina (zde jednoprvková), která dodá omezení na typ *T, kde už jde Init() zavolat. Tady to je koukám typová množina vyššího řádu (množinový operátor), neboť má typový parametr :) Sakra, začíná to znít jako Haskell :/ Tohle bude hezký námět na článek od p. Tišnovského ;)
Mě zajímá ergonomie a jak to tedy ovlivní psaní kódu. Scala 3 třeba měnila koncept typů a zdá se mi, že k lepšímu. Pod kapotou mají lepší teorii a navrch se to zjednodušilo. Já sem právě zvědavý, jak se s tím popere osazenstvo, které ke Go přišlo jako k jednoduchému jazyku. Což není špatně. Zdálo se mi, že ta alternativa proti složitosti jiných jazyků je u Go záměrná. Kdo chce, může s klidem sáhnout po Scala 3, Idris, Mercury atd., pokud si chce hrát s něčím pokročilějším ve světě typů, nebo ne?
Jo no, chystám se na to :-)
Jinak k těm velkým aplikacím - otázka je, co je to velká aplikace, ale obecně v Go vznikají větší projekty (NATS nebo NSQ například, ale i OpenShift a spol.). Nějaké obří informační systémy by se stejně měly nakouskovat na mikroslužby a tady je Go velmi dobrým prostředkem.
Samozřejmě generické typy můžou chybět. To jsme viděli například v článku o Gonum (https://www.root.cz/clanky/gophernotes-kombinace-interaktivniho-prostredi-jupyteru-s-jazykem-go/#k02) kde to evidentně hodně drhne.
"Zase ty mikroslužby :)"
ale jo já vím, je to buzzword a možná se někde tlačí na sílu, nebo se to porovnává s monolitem, který se vyvíjel X let.
Osobně si myslím, že mám na mikroslužby zdravý kritický názor - kromě všech nevýhod se ale při dobrém návrhu spousta věcí zjednoduší, jsou flexibilnější týmy, fíčurky jdou škálovat (jak vývoj, tak i nasazení).
PS: my udělali v návrhu architektury jednu chybu, v podstatě (když to hodně zjednoduším) máme jednu DB jak pro "skutečná" data, tak i pro uložení feedbacku od zákazníků. A toto spojení se nám vymstilo, protože ke třem frontnedům teď přidáváme čtvrtý, dosti odlišný v požadovaném chování. Kdybychom si dali tu práci a měli 2x DB + 2 různé služby pro přístup k nim, bylo by vše o dost jednodušší. No, u další fíčurky už nebudeme na začátku líní, doufám :-)
Já si z toho tady dělám legraci, protože to je buzzword, ale my je taky na jednom větším projektu používáme. A ano, taky má několik modulů jednu databázi, ale to proto, že prototyp byl monolit a teď se postupně rozsekává, takže v tom je teď solidní zmatek.
Člověk si s mikroslužbami ani moc kódu nenapíše, většinu generuje Protobuf a ORM, ale z hlediska nasazení a hlavně řízení týmu to výhoda určitě je, takové praktické rozděl a panuj.
Go má knihovny pro všechno, na co si člověk vzpomene, včetně dost obskurních věcí. Hlavně je dobré, že to nejdůležitější je přímo součástí buď standardní knihovny, nebo aspoň v x/..., takže napsání serveru, nějaké mikroslužby apod. nevyžaduje žádné "cizí" knihovny. Jediné, co tomu chybí, je něco pro GUI, ale to je záměr. Na to jsou jiné jazyky a nástroje, např. Flutter, haha :)
Go ma knihovny, ale nema kvalitni knihovny. Nebo alespon nemelo.
Pred par lety se u nas resilo vetsi XML, ktere obsahovalo dva separatni elementy (rekneme jmeno a prijmeni) a nejake data v atributu (vek) a chteli jsme vybrat jmeno mezera prijmeni mezera vek rekneme u vsech muzu. XML bylo komplikovane, ruzne vnorene nechtelo se mi to popisovat prez Go struktury. Reknete si XPath? Jasne, v Jave to slo jako nic, hotovo za 10 minut. Go melo tehda tri implementace XPath a zadna nevedela dost na tohle.
Jedinou podstatnou změnou od 70. let je modulární programování. (Ani OOP není nic jiného). Jazyk Go má pokročilé modulární programování rovněž a to od samého počátku - když v mírně odlišné formě. Vše ostatní jsou prkotiny. Není nutné jezdit jen po jedné koleji, dělat ze zvyku dogma a z OOP svatý grál.
Je zajímavé, co všechno se v honbě za modularitou páchá :) Nejdříve to bylo OOP, pak distribuované objekty (v podstatě mikroslužby zabalené do OO terminologie), teď pro změnu mikroslužby v kontejnerech. Na jazyce nesejde, první webový aplikační server byl napsán v ObjC :) Dnes vládne Protobuf, které má vlastní jazyk a generuje zdrojáky automaticky ve všech příčetných jazycích. ORM dtto. Asi tak.
OCaml! Promiňte mám OCD :). Ale k věci, hrozně rád bych někdy viděl články o: OCaml a Erlang/Elixir (něco tu bylo, ale chtělo by to víc). jeden čas mi přišlo, že třeba ReasonML prorazí, pak to ale přejmenovali na ReScript (https://rescript-lang.org/) a většinu času věnují změně syntaxe, aby byla podobná JS. Naprostá ztráta času. Na pozadí to stejně používalo https://www.bloomberg.com/company/press/open-source-at-bloomberg-introducing-bucklescript/ ...
Rust editions nestačí? Mně přijde, že zrovna Rust je v tomhle už dost v pohodě.
Zde odkaz pro neznalé: https://doc.rust-lang.org/edition-guide/editions/index.html
29. 10. 2021, 11:49 editováno autorem komentáře
Jo, rozbily se např. optimalizace (restrict), protože byl bug v LLVM, pak si mysleli, že to opravili, tak je v Rustu povolili, aby je následně zase zakázali. Takovéto detaily, které se navíc obtížně sledují, nejsou úplná vzácnost.
Časem si to snad sedne, jako u Swiftu, tam taky trvalo dlouho, než jej stabilizovali.
Jedna regrese v kompileru nám teď prakticky znemožnila sestavit rozsáhlejší projekt používající Axum framework :)
Rust je super, ale občas trochu divočina a zvolit ho jako primární jazyk pro komponenty ve firmě vede kromě nesporných výhod i k nutnosti přispívat do upstream knihoven víc než jinde, a mít v teamu někoho kdo se vyzná v kódu rustc je celkem dobrý nápad.
Ten problém v rustc existoval od začátku existence Axum (a projevoval se v menší mířé i v jiných knihovnách s komplexními typy)
Celou dobu se na to používaly workaroundy, ale 1.56 to rozbil úplně.
Jasně, není to zas až takový problém, ale ve chvíli kdy to nastane, je docela otrava řešit to, hledat jestli je chyba v kódu… V o něco dospělejších jazycích bych tolik nezvažovala výhodu mít v teamu vývojáře co se umí vrtat v kompileru :)
A nijak tím nehaním Rust, jen je prostě potřeba počítat s občasným výskytem trochu otravnějších regresí než jinde. I tak si za svou volbou jazyka na celý backend stojíme :)
Go má jednoduchou a pragmatickou syntax. Z Rustu bolí oči (což ovšem nijak nesnižuje výhody a sofistikovanost jeho překladače). Lepší hnusná syntax a zajímavá implementace pod kapotou než naopak (looking at you, Java). Druhá věc je, že Rust nemá runtime (a jeho autoři se tím dokonce chlubí), jejich přístup “it’s a feature” není úplně přesvědčivý. Ovšem Rust se živelně vyvíjí, co není, může záhy být.
Jenže proč má Go jednoduchou syntax? Protože ten jazyk nic moc neřeší, je to o malý kousek vylepšené C (a v něčem IMO horší, viz ta někým zde zmiňovaná velká písmena pro public jména, to je fakt bizár). Proč má Rust složitou syntax? Protože toho ve skutečnosti řeší hodně. Já nevím, jestli by se dala vymyslet hezčí, ale mám za to, že se někdo fakt hodně snažil (a to je u Rustu myslím pravidlo) to navrhnout nejlíp, jak to vůbec jde.
Ale za mě toho flame waru bylo fakt dost. Rust a Go nejsou přímí konkurenti a že je každý z těch jazyků jiný, beru jako fakt.
30. 10. 2021, 11:13 editováno autorem komentáře
Go nic neřeší syntaxí, ale runtimem, ten je dost komplexní (a sofistikovaný). Syntax Rustu není složitá, jen hnusná. Rust je celkově jednoduchý a jediná zajímavá věc, se kterou přišel, je borrow checker (a ten je natolik výrazný, že zastiňuje vše ostatní). Rust je super všude, kde není potřeba (nebo by překážel) tracing GC, ale má pár zádrhelů, o kterých je nutné při jeho používání vědět (taky pár vyhod, o kterých se na rozdíl od bezpečné správy paměti nemluví). BTW až bude gRPC v Rustu aspoň stejně rychle jako v Go, dejte mi vědět :)
Vedle zmiňuješ makra a že se mají jazyky navzájem inspirovat. No tak se vývojáři Rustu inspirovali všude možně, akorát si z jazyka udělali další Swift, Scalu nebo D nebo nějaký další jazyk, který má "všechno". Já jsem spokojený a Ty ne, to se stane. Navrhuju udělat téma ve fóru a Rust tam můžeš vesele hejtovat, jsem zvědav.
gRPC? Třeba tady: https://www.reddit.com/r/grpc/comments/hv7h6i/grpc_bench_a_clear_objective_grpc_benchmark/
Tady další: https://www.nexthink.com/blog/comparing-grpc-performance/
30. 10. 2021, 13:55 editováno autorem komentáře
Já nevím, ale Fortran (moderní) je mnohem čitelnější, má spoustu featur přímo zabudovaných a kompilátory vyladěné. Spousta lidí v tom dělá, právě proto, že stejně napsané výkonné C++ vyžaduje spoustu hnusných věcí v kódu (direktivy) a ruční práci. Komunita v poslední době hodně maká: https://lfortran.org/; https://github.com/fortran-lang/fpm; https://en.wikipedia.org/wiki/Coarray_Fortran
:) No asi lepší než MATLAB, ten do studentů rvou ještě víc. Ale zase z těch komerčních věcí mě mile překvapila Mathematica. Jinak jsem nedávno "sjížděl" APL, a člověk si říká kolik zajímavých jazyků se drží sice v šedé zóně, ale stále se používají. Na práci s poli ideální: https://problems.tryapl.org/ Na první pohled bordel, ale po chvíli cviku do dává smysl. Problém C++ je podle mě, jiného druhu. Tam se dají z historických důvodů psát věci různě a pořád se to nabaluje (decltype, enable_if, concepts...). Je težký držet jeden styl i napříč jedním projektem.
HAL jsem neznal, dík.
31. 10. 2021, 10:38 editováno autorem komentáře
Mně jednou Ruda Kryl říkal, že APL navrhli Američané schválně šíleně, aby ho podstrčili Sovětům (kteří Západu kradli technologie a vše možné kopírovali, vlastní výzkum byl zabrzděný ideologickým postojem, že kybernetika je buržoazní pavěda) za účelem způsobení chaosu ve vesmírném programu. Ale Iverson byl Kanaďan, tak nevím. Sověti se pak údajně pomstili vytvořením ještě šílenějšího jazyka, ale už si nevzpomenu na jméno.
To je asi o osobních preferencích, syntax Rustu mi přijde jako jedna z velkých výhod :D A stabilita a spolehlivost - porád platí že pokud se to zkompiluje, tak to prostě funguje.
To že to občas hapruje při kompilaci nám sice třeba v případě Axum ukradlo nějaký čas vývoje, ale zase nemusíme řešit spoustu jiných problémů, které Rust prostě nemá.