Proč ten hype okolo Go?

stilett

Re:Proč ten hype okolo Go?
« Odpověď #120 kdy: 29. 08. 2018, 00:44:45 »
Abych trochu přispěl do diskuze.

Go používáme na produkci. Ve sledovanitv.cz s ním např. streamujeme desítky 10Gb/s. Používáme ho řadu let. Začali jsme s ním tedy dříve, než vznikl zmiňovaný hype.

Za jeho hlavní výhody považuji:

  • Pragmatický přístup vývojářů. Má to právě ty věci, které jsou potřeba na praktický vývoj, ale nic navíc.
  • Konzervativní přístup ke změnám a promyšlenost návrhu směrem do budoucna. Pokud člověk napsal program v souladu se specifikací 1.0, tak i v nejnovější verzi kompilátoru a základní knihovny program bude fungovat beze změn.
  • Snaží se tlačit jeden styl. Dá se potom dobře číst a přidávat kód jiných lidí.
  • Jednoduchost a snaha zredukovat magic a překvapivé chování. Žádné přetěžování operátorů, žádné settery/gettery, automatické konverzy typů, overloaded funkce. Je pak snadné vyčíst, co kód dělá.
  • Snadná paralelizace, na kterou je připraven celý jazyk a základní knihovna.
  • Výkon programů, ačkoliv se jedná o paměťově bezpečný jazyk ve smyslu žádné buffer overflow a neplatné pointery.
  • Jednoduchost nástrojů.
  • Základní knihovna, která je velmi konzistentní a umožňuje logické propojení funkcionalit z různých jejích částí. Jednoduché věci lze udělat jednoduše, ale nebrání mi si do něčeho sáhnout po svém.

Nemohu souhlasit s některými tvrzeními. Zejména, že se jedná o jazyk pro lepiče jako PHP. Přístup vývojářů PHP je v mnoha ohledech přesně opačný. Do PHP se pořád přidávají nové konstrukce a funkcionality, aby to umělo všechno možné. Některé funkce pak vrací chybové výsledky, jiné hází výjimky.

Taky rozhodně nelze tvrdit, že to není OOP jazyk, tudíž se v něm programuje procedurálně. Mohli bychom se přít, co znamená OOP. Liší se hodně od Javy (nemá třídy, hierarchii typů). Ale rozhodně umí polymorfismus a zapouzdření, což jsou podle mě ty nejdůležitější vlastnosti z OOP. Programuje se hodně objektovým stylem a základní knihovna je tak postavená. Koncept interfaců v Go je velmi šikovný a je hodně blízký abstraktním datovým typům. Důsledkem je existence velmi malých interfaců, které splňuje kdeco. Tudíž to lze jednoduše propojovat.

Některé věci mě také zarazily, ale posléze mi došlo, že autoři Go to měli promyšlené. Např. jazyk nepodporuje výjimky, chyby jsou návratové hodnoty. Říkal jsem si, teď musím všude testovat návratovou hodnotu, což je nepohodlné. Ale pak jsem si všiml několika věcí:
  • Nelibost vůči chybovým návratovým hodnotám byla částečně způsobena tím, že zejména v C mají funkce jen jednu návratovou hodnotu. A pro signalizaci chyby se často používají speciální hodnoty (např. -1). To je zmatečné a navíc o chybě nemám žádné podrobnosti. V Go se to řeší vracením více hodnot a jedna z nich je chyba.
  • V Javě hází výjimku případy, které vlastně nejsou výjimečné (např. parsování řetězce poslaného uživatelem na číslo, otevření souboru, který nemusí existovat). Tyto chyby často chci ošetřit v normální toku programu a místo toho musím blbnout s catch bloky.
  • Zvláště u serverových aplikací je potřeba na chyby patřičně reagovat (zkusit něco znovu, stornovat co nejmenší práci), spíše než je jen detekovat. Výjimky vedou k tomu, že programátoři nechají výjimku propadnout na místo, kde už nelze dobře řešit.
  • Chyba jako extra návratová hodnota člověka donutí se fakt zamyslet nad tím, co s tou chybu bude dělat.

Další sporný příklad je, že standardní nástroje pro instalací balíků třetích stran neřeší jejich verze. (Mimochodem v aktuální verzi 1.11 to už je a i předtím existovaly "neoficiální" nástroje). Což mělo jeden velmi pozitivní výsledek. Všichni napsali balíky tak, že jsou zpětně kompatibilní. Prostě je zvykem dělat úpravy tak, aby se kompatibilita nerozbíjela. Za mě jednoznačné plus. Například takové javascriptové npm umožňuje balíkům záviset na různých verzích jiného balíku, což vyřeší veškeré zpětné i dopředné nekompatibility. Ale je z toho naprosté peklo pro údržbu, balast ve výsledných souborech a práce při přechodu na novější verzi, protože vývojáři rozbíjí kompatibilitu jako šílenci.

Co týče výkonu, tak si nemohu stěžovat. Jasně, že to v čistém algoritmu nemá na C. Ale reálně se to používá na věci, kde se provádí věci paralelně a dělá se rozličné I/O. A tam si vede velmi dobře a poráží Javu.

V jazyce mi chybí snad generika, která by se hodila do přísně typovaného jazyka. O tomto nedostatku autoři vědí, ale řekli, že aktuálně neznají dobrou implementaci, která by nenarušovala jiné zásady. Tak je tam nedali, protože by je tam pak museli tak nechat.


kkt1

  • *****
  • 796
    • Zobrazit profil
Re:Proč ten hype okolo Go?
« Odpověď #121 kdy: 29. 08. 2018, 01:01:50 »
Stilett, na co konkretne pouzivate go jestli muzes prozradit? Transcoding? Stream? Nebo? Jeste jeden dotaz mimo go - dle vaseho webu streamujete v ramci cele EU, coz minimalne u nektereho obsahu neni z pohledu licenci mozne. Mate nejakou vpnku nebo proste clovek registrovany v CR muze sledovat cokoliv v ramci EU?

Bacsa

Re:Proč ten hype okolo Go?
« Odpověď #122 kdy: 29. 08. 2018, 01:37:48 »
Abych trochu přispěl do diskuze.

Go používáme na produkci. Ve sledovanitv.cz s ním např. streamujeme desítky 10Gb/s. Používáme ho řadu let. Začali jsme s ním tedy dříve, než vznikl zmiňovaný hype.

Za jeho hlavní výhody považuji:

  • Pragmatický přístup vývojářů. Má to právě ty věci, které jsou potřeba na praktický vývoj, ale nic navíc.
  • Konzervativní přístup ke změnám a promyšlenost návrhu směrem do budoucna. Pokud člověk napsal program v souladu se specifikací 1.0, tak i v nejnovější verzi kompilátoru a základní knihovny program bude fungovat beze změn.
  • Snaží se tlačit jeden styl. Dá se potom dobře číst a přidávat kód jiných lidí.
  • Jednoduchost a snaha zredukovat magic a překvapivé chování. Žádné přetěžování operátorů, žádné settery/gettery, automatické konverzy typů, overloaded funkce. Je pak snadné vyčíst, co kód dělá.
  • Snadná paralelizace, na kterou je připraven celý jazyk a základní knihovna.
  • Výkon programů, ačkoliv se jedná o paměťově bezpečný jazyk ve smyslu žádné buffer overflow a neplatné pointery.
  • Jednoduchost nástrojů.
  • Základní knihovna, která je velmi konzistentní a umožňuje logické propojení funkcionalit z různých jejích částí. Jednoduché věci lze udělat jednoduše, ale nebrání mi si do něčeho sáhnout po svém.

Nemohu souhlasit s některými tvrzeními. Zejména, že se jedná o jazyk pro lepiče jako PHP. Přístup vývojářů PHP je v mnoha ohledech přesně opačný. Do PHP se pořád přidávají nové konstrukce a funkcionality, aby to umělo všechno možné. Některé funkce pak vrací chybové výsledky, jiné hází výjimky.

Taky rozhodně nelze tvrdit, že to není OOP jazyk, tudíž se v něm programuje procedurálně. Mohli bychom se přít, co znamená OOP. Liší se hodně od Javy (nemá třídy, hierarchii typů). Ale rozhodně umí polymorfismus a zapouzdření, což jsou podle mě ty nejdůležitější vlastnosti z OOP. Programuje se hodně objektovým stylem a základní knihovna je tak postavená. Koncept interfaců v Go je velmi šikovný a je hodně blízký abstraktním datovým typům. Důsledkem je existence velmi malých interfaců, které splňuje kdeco. Tudíž to lze jednoduše propojovat.

Některé věci mě také zarazily, ale posléze mi došlo, že autoři Go to měli promyšlené. Např. jazyk nepodporuje výjimky, chyby jsou návratové hodnoty. Říkal jsem si, teď musím všude testovat návratovou hodnotu, což je nepohodlné. Ale pak jsem si všiml několika věcí:
  • Nelibost vůči chybovým návratovým hodnotám byla částečně způsobena tím, že zejména v C mají funkce jen jednu návratovou hodnotu. A pro signalizaci chyby se často používají speciální hodnoty (např. -1). To je zmatečné a navíc o chybě nemám žádné podrobnosti. V Go se to řeší vracením více hodnot a jedna z nich je chyba.
  • V Javě hází výjimku případy, které vlastně nejsou výjimečné (např. parsování řetězce poslaného uživatelem na číslo, otevření souboru, který nemusí existovat). Tyto chyby často chci ošetřit v normální toku programu a místo toho musím blbnout s catch bloky.
  • Zvláště u serverových aplikací je potřeba na chyby patřičně reagovat (zkusit něco znovu, stornovat co nejmenší práci), spíše než je jen detekovat. Výjimky vedou k tomu, že programátoři nechají výjimku propadnout na místo, kde už nelze dobře řešit.
  • Chyba jako extra návratová hodnota člověka donutí se fakt zamyslet nad tím, co s tou chybu bude dělat.

Další sporný příklad je, že standardní nástroje pro instalací balíků třetích stran neřeší jejich verze. (Mimochodem v aktuální verzi 1.11 to už je a i předtím existovaly "neoficiální" nástroje). Což mělo jeden velmi pozitivní výsledek. Všichni napsali balíky tak, že jsou zpětně kompatibilní. Prostě je zvykem dělat úpravy tak, aby se kompatibilita nerozbíjela. Za mě jednoznačné plus. Například takové javascriptové npm umožňuje balíkům záviset na různých verzích jiného balíku, což vyřeší veškeré zpětné i dopředné nekompatibility. Ale je z toho naprosté peklo pro údržbu, balast ve výsledných souborech a práce při přechodu na novější verzi, protože vývojáři rozbíjí kompatibilitu jako šílenci.

Co týče výkonu, tak si nemohu stěžovat. Jasně, že to v čistém algoritmu nemá na C. Ale reálně se to používá na věci, kde se provádí věci paralelně a dělá se rozličné I/O. A tam si vede velmi dobře a poráží Javu.

V jazyce mi chybí snad generika, která by se hodila do přísně typovaného jazyka. O tomto nedostatku autoři vědí, ale řekli, že aktuálně neznají dobrou implementaci, která by nenarušovala jiné zásady. Tak je tam nedali, protože by je tam pak museli tak nechat.
Go (něco jako) výjimky má, panic/recover se ve standardní knihovně používá poměrně často, například v net/http se zachycuje panic z obslužných korutin, aby nespadl celý server. Funguje to podobně jako longjump.

Ivan Jaros

Re:Proč ten hype okolo Go?
« Odpověď #123 kdy: 29. 08. 2018, 01:39:38 »
Hajp? Aky hajp pre boha. Si pozri pracovne ponuky a zistis ze a) jediny aktivny zaujem je v USA a trochu na severe EU(ale to je skor len tak ze Go je doplnkovy jazyk) a za b) akykolvek "hajp" bol tak rok-dva dozadu. Si pozri Google trendy. Go nema uz ziadne momentum ktore by ho nejak tlacilo do mainstreamu(nejake nezmyselne SO ankety su naprosto bezpredmetne)

Ak sa ti jazyk paci, pouzivaj ho. Ak nie, tak kasli na to. Co riesis?

PS: je taky zazity fakt ze Go ludia pochopia az minimalne po roku-dvoch aktivnej prace s nim kvoli zazitym zvykom z inych jazykov.

PPS: panic sa v Go da naprosto bez problemov pouzivat ako klasicka exception, zase netreba brat oficialnu dokumentaciu ako bibliu. To iste plati o velkosti interfejsov, ne/pouzivanie oznacenia this, self, me a plno dalsich veci.

stilett

Re:Proč ten hype okolo Go?
« Odpověď #124 kdy: 29. 08. 2018, 07:11:51 »
Stilett, na co konkretne pouzivate go jestli muzes prozradit? Transcoding? Stream? Nebo? Jeste jeden dotaz mimo go - dle vaseho webu streamujete v ramci cele EU, coz minimalne u nektereho obsahu neni z pohledu licenci mozne. Mate nejakou vpnku nebo proste clovek registrovany v CR muze sledovat cokoliv v ramci EU?
Na samotný transcoding Go nepoužíváme. Ale na řízení transcodingu, na ukládání a distribuci streamů (CDN). A další různé věci.

Co se týče vysílání v EU, tak to děláme v souladu s evropským nařízením o přeshraniční přenositelnosti služeb (letošní záležitost). Tedy streamy můžete přijímat v celé EU, ale musíte prokázat, že máte bydliště v ČR.


Ohledně panic/recover. Ano, Go podporuje takovou věc. Ale její četnost a způsob použití se dost liší od výjimek ála Java. Oproti vracení chyb se to používá zcela zanedbatelně. Jako nejužitečnější vidím použití, pokud chci mít nějaké "stabilní jádro" a z něj pouštím kód, který by mohl spadnout. Ten HTTP server je typický příklad. Ale rozhodně standardní knihovna není udělaná tak, že funkce házely panic, který by měl uživatel zachytávat.


Bacsa

Re:Proč ten hype okolo Go?
« Odpověď #125 kdy: 29. 08. 2018, 07:46:20 »
Ohledně panic/recover. Ano, Go podporuje takovou věc. Ale její četnost a způsob použití se dost liší od výjimek ála Java. Oproti vracení chyb se to používá zcela zanedbatelně. Jako nejužitečnější vidím použití, pokud chci mít nějaké "stabilní jádro" a z něj pouštím kód, který by mohl spadnout. Ten HTTP server je typický příklad. Ale rozhodně standardní knihovna není udělaná tak, že funkce házely panic, který by měl uživatel zachytávat.
Přesné a výstižné.

tralala

Re:Proč ten hype okolo Go?
« Odpověď #126 kdy: 29. 08. 2018, 09:51:23 »
Citace
Ehm.. jen pokud chcete. Už zmíněný Spark (http://sparkjava.com/) nebo třeba Pippo (http://www.pippo.ro/) nic takového totiž nepotřebují.

Kiež by to bolo tak. Spark aj Pippo sú malé, hobby projekty. Na Sparku aktívne pracuje pár ľudí.
Spark funguje defaultne s embedded Jetty, ktorý však nemá možnosť nakonfigurovať si connection pooling. Takže v skutočnosti sa nevyhneme nasadeniu na Tomcat serveri a WARku, XMLkám atď.

co tak si to tam dorobit a poslat im pull request?

MarSik

Re:Proč ten hype okolo Go?
« Odpověď #127 kdy: 29. 08. 2018, 16:21:08 »
Spark funguje defaultne s embedded Jetty, ktorý však nemá možnosť nakonfigurovať si connection pooling. Takže v skutočnosti sa nevyhneme nasadeniu na Tomcat serveri a WARku, XMLkám atď.

Máte pravdu, proto jsem zmínil to Pippo, které umí běžet třeba na Undertow a dá se lépe konfigurovat.

Ano, oba projekty jsou malé a pracuje na nich málo lidí. Zatím žijí, komunitu mají a podporují vše co od nich chci. Tak proč bych se tím trápil.

.

Re:Proč ten hype okolo Go?
« Odpověď #128 kdy: 29. 08. 2018, 17:21:56 »
Pro těch pár lidí, co tady neblili nesmysly a nevedli hate, 3 nejnovější návrhy core týmu na zjednodušení kontrolu chyb a generika v Go2. Vše zpětně kompatibilní.

https://go.googlesource.com/proposal/+/master/design/go2draft.md

A pro toho, co tady mlel nesmysly o rychlosti Go vs. Java,  při veškerých výhradách proti Benchmarks Game, jednoduchý pohled dává výsledek 5:5. I u nejpomalejšího benchmarku (kde je Go z důvodu svého návrhu opravdu velmi slabé) je rozdíl 3.5x. To vše s bonusem až 20x větší spotřeby paměti u Javy (jen v jednom případě byla Java paměťově méně náročná - 1.3x).

oss

Re:Proč ten hype okolo Go?
« Odpověď #129 kdy: 29. 08. 2018, 17:38:43 »
Zaujimave generika a verzie balickov...
pri tom som doteraz od ludi co aktivne robia v Go pocul, nieco na styl, ze to nie je bug to je feature... proste, pre ze komunita okolo Go to ani nechce ani nepotrebuje  ;D

Mozno s toho za 4-5 rokov bude pouzitelny jazyk.

Re:Proč ten hype okolo Go?
« Odpověď #130 kdy: 29. 08. 2018, 17:51:26 »
Pro těch pár lidí, co tady neblili nesmysly a nevedli hate, 3 nejnovější návrhy core týmu na zjednodušení kontrolu chyb a generika v Go2. Vše zpětně kompatibilní.

https://go.googlesource.com/proposal/+/master/design/go2draft.md


Tak až ty chyby v návrhu ofixují, můžeme se bavit dál.

Že je to mizerný jazyk teď, neznamená, že za pár let nezačne dávat smysl.

Kit

Re:Proč ten hype okolo Go?
« Odpověď #131 kdy: 29. 08. 2018, 18:47:52 »
A pro toho, co tady mlel nesmysly o rychlosti Go vs. Java,  při veškerých výhradách proti Benchmarks Game, jednoduchý pohled dává výsledek 5:5. I u nejpomalejšího benchmarku (kde je Go z důvodu svého návrhu opravdu velmi slabé) je rozdíl 3.5x. To vše s bonusem až 20x větší spotřeby paměti u Javy (jen v jednom případě byla Java paměťově méně náročná - 1.3x).

Co znamená výsledek 5:5? Po zkrácení mi to dává 1:1, tzn. srovnatelné.

stilett

Re:Proč ten hype okolo Go?
« Odpověď #132 kdy: 29. 08. 2018, 19:45:47 »
Ono je velmi těžké porovnávat programovací jazyky, pokud jste je nějakou dobu nepoužívali. Je potřeba je porovnávat komplexně. Určité problémy se tam řeší rozdílným způsobem. Takže opravdu není vhodné vybrat si jednu věc a bez kontextu ji odsoudit.

Neodpustím si jedno přirovnání, jak probíhají takové diskuse:
Potkají se uživatel povozu a uživatel auta.
Uživatel auta: Jsem se svým autem spokojen.
Uživatel povozu: A za jak dlouho do něj zapřáhneš koně?
Uživatel auta: To moc nejde.
Uživatel povozu: Tak to je auto k ničemu.

Do toho přijde příznívec aut a začne vymýšlet, že se to dá na auto navařit. Čímž jen uživatele povozu utvrdí, že auto stojí za houby, protože na povoz nic přivařovat nemusí. Následuje malá odbočka, kdy se řeší, jestli by taková úprava prošla homologací. Pak někdo řekne, že to bylo rozhodnutí výrobce neumožnit zapřahání koně, protože to nikdo nechce. Načež je obviněn, že nedostatek vydává za vlastnost.

andy

Re:Proč ten hype okolo Go?
« Odpověď #133 kdy: 29. 08. 2018, 19:49:31 »
Ja som si v go skusal rozne mensie tooly na vlastne pouzitie (typu webcrawler sprav na machine learning atd), ale mal som pocit, ze pisem stale dookola iba "if" (narazam na kontrolu chyb z volani). Ako oracle vydal graalvm s native-image, tak som na go uplne zabudol :). Jednoducho nemam argument nepouzit javu. Nejde s tym sice skompilovat vsetko, ale aj tak paradicka.

kikina

Re:Proč ten hype okolo Go?
« Odpověď #134 kdy: 29. 08. 2018, 20:04:27 »
Ja som si v go skusal rozne mensie tooly na vlastne pouzitie (typu webcrawler sprav na machine learning atd), ale mal som pocit, ze pisem stale dookola iba "if" (narazam na kontrolu chyb z volani). Ako oracle vydal graalvm s native-image, tak som na go uplne zabudol :). Jednoducho nemam argument nepouzit javu. Nejde s tym sice skompilovat vsetko, ale aj tak paradicka.

a bylo tech if nejak vic nez bloku try-catch v jave?