Fórum Root.cz

Práce => Studium a uplatnění => Téma založeno: Artii 20. 10. 2020, 11:03:58

Název: Jak efektivně studovat programování?
Přispěvatel: Artii 20. 10. 2020, 11:03:58
Zdravím, chtěl se zde místní komunity zeptat na pár rad ohledně studia programování.

Moje zkušenosti:

Java (začátečník) - na úrovni semstrálního projektu (základní syntaxe, OOP, okenní aplikace, IO operace, vyjímky)
HTML a CSS (začátečník) - opět jen na úrovni semestrálky (jednoduchý web)

Chtěl bych (alespoň pro začátek) se naučit:
- efektivně skriptovat (jak ve win a v linuxu), myslím tím různé automatické práce se soubory, hromadné úpravy atd.
- vytvářet jednoduché webové aplikace (například něco jako požadavkový systém s napojením na DB apod.)

Podle toho co jsem hledal existuje spousta jazyků ale vyznat se v tom jaký který je lepší na to nebo na to je už horší, určitě budu muset alespoň částečně zůstat u Javy kvůli škole.

Zároveň mě zajímá jaké znalosti k tomu rozvíjet? Má smysl se vracet například k jazyku C? Jakým způsobem jste se učili programovat a čemu se vyhnout?

Budu rád za každou radu, tip případně i zdroje na nějaké materiály k studiu. Díky
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Mlocik97 20. 10. 2020, 11:25:16
Osobne C a Python sú na začiatok asi najlepšie, Python kvôli krivke učenia, a C pretože je nižšej úrovne než Java, Rust, Kotlin, Haskell a pod. C je ťažší, ale když sa to naučíš, už nebudeš mať väčšie problémy naučiť sa aj iné jazyky. Navyše pochopíš ako sa pracuje s pamäťou, ako optimalizovať aplikácie, na čo si dávať pozor. Určite by si si mal pozrieť aj základy JavaScriptu, ktorému sa vo webovom vývoji len ťažko vyhneš.

Začínať s Javou ako s prvým jazykom si nemyslím že je dobré, keď sa ju naučíš, tak potom procedurálne a funkcionálne jazyky sa budeš učiť skoro ako od nuly.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Zdenek Henek 20. 10. 2020, 11:50:38
Vyber si oblast, která tě baví a snaž se pro ni vytvořit nějaký program. Když jsem začínal, tak jsem si chtěl vytvořit program na zkoušení otázek autoškoly.

Programovací jazyk je asi jedno. Každou chvíli budeš potřebovat nějaký jiný.
Zmínil jsi skriptování. Na skriptování pro sysadminy ve windows asi budeš chtít použít powershell, na skriptování v linuxu bash, zsh ....

Pokud máte ve škole javu, tak ji používej i na svoje další projekty. Ze začátku bych se snažil naučit jeden jazyk velmi dobře s celým ekosystémem. Je málo oblastí, pro které by java byla vyloženě špatné řešení.
Pokud chceš něco opravdu jiného, pak bych zvolil programování robotů a Arduino, Edison 2.0 podporuje Python, Lego Javu (ale moc to do detailu neznám)

Processing je další zajímavý jazyk na učení. Psal jsem tady o tom dřív, tak dávám jen dva linky
https://processing.org/ a https://natureofcode.com/

Pokud opravdu trváš na dalších jazycích, tak místo Pythonu bych k Jave pridal něco funkcionálního. Zeptej se učitele, jestli nějaký funcionální jazyk zná - používá. Zkus ten, protože v případě problémů tě může postrčit.

Nezapomínej na jazyky jako Angličtina a Němčina. Těm bych dal stejnou prioritu jako učení se programován. Dá se to i kombinovat, když budeš používat jen anglickou dokumentaci k učení se.

Hodně štěstí.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: A.P.Hacker 20. 10. 2020, 12:53:55
jestli jsi soutezni typ, zacal bych treba s leetcode, codewars, codingame, hackerrank a podobnymi strankami. Muzes prohlizet reseni od jinych uzivatelu, stranka automaticky vyhodnoti tve reseni, hodne se naucis.

ne kazdeho bavi vytvaret nejaky hobby projekt, ktery stejne nikdo nebude pouzivat
Název: Re:Jak efektivně studovat programování?
Přispěvatel: _Jenda 20. 10. 2020, 13:30:49
Má smysl se vracet například k jazyku C?
V uvedeném (jednoduché weby, skriptování a jednoduché okenní aplikace) je C k ničemu, ale pokud budeš dělat něco složitějšího (interakce s hardware nebo nějakými knihovnami co nemají binding pro tvůj jazyk, kód co musí být rychlý (i když javový JIT je relativně rychlý taky)), tak se tomu nevyhneš.

Jakým způsobem jste se učili programovat a čemu se vyhnout?
Učil jsem se strašně živelně -- když bylo něco potřeba udělat, tak jsem to vždycky nějak vygooglil a zbastlil. Pak mi strašně pomohla spolupráce na několika projektech s kamarády a potom je velmi přínosné dělat code review s někým kdo tomu rozumí. A pak jsem šel na matfyz, kde jsem se naučil různé algoritmy a datové struktury. Můžeš si o tom přečíst slidy a knížku: http://ktiml.mff.cuni.cz/~cepek/vyuka.html (ADS 1 a 2), http://pruvodce.ucw.cz/, kuchařky a vzorová řešení na https://ksp.mff.cuni.cz/.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Mintaka ? 23. 10. 2020, 03:19:04
Re. Efektivně.... :

Aby to bylo efektivní, tak by za tím asi měla být pevná a jasná motivace.
Někdo má plnou hlavu vlastních nápadů a má touhu je zhmotnit, někdo se chce přidat k něčemu velkému, smysluplnému a mít dobrý pocit, že má kousek kódu v něčemu, co používají miliony lidí. Někdo se chce programováním především živit, a pak je dobré se zabývat tím, jak si najít své místo ve výdělečné mašinérii (freelancer s vlastními projekty od A do Z, člen malého startupu, specialista na nějakou oblast, architekt, frontend/backedn, databázista, projekťák, vědec,  ...) Také obor působnosti hraje velkou roli. Někomu by se příčilo stavět programy pro dolování dat ze sociálních sítí, někdo si libuje při vývoji "AI" pro armádu, někdo miluje piplání s realtime systémy pro kosmické sondy.
Kombinace více pozic a oblastí se nevylučují.

Od té motivace se odvíjí další kroky, aby to bylo "efektivní", tedy to přímočařeji vedlo k cíli. Po chvíli učení základů to chce "na něčem dělat" a nejlépe pravidelně a intenzivně.

Chtěl bych (alespoň pro začátek) se naučit:
- efektivně skriptovat (jak ve win a v linuxu), myslím tím různé automatické práce se soubory, hromadné úpravy atd.


V těchto úlohách pro mě jasně vede Python.
PowerShell a Bash bych řešil jen do úrovně jednoduchých, přímočarých scriptů a případně z důvodu orientace se ve scriptech druhých.

- vytvářet jednoduché webové aplikace (například něco jako požadavkový systém s napojením na DB apod.)

Pokud už budeš umět Python, tak s ním můžeš dělat i ty webové aplikace.
Nejlépe asi za pomoci některého z webových frameworků.

Základní principy programování: dekompozice, abstrakce, syntéza,  algoritmizace, proměnné, základní datové typy, podmínky, cykly, funkce, objekty, výjimky, debugování, testování,... za tím stojí stejné koncepty a tyhle znalosti jsou víceméně přenositelné napříč většinou jazyků.

Další technologie k ochočení by mohli být: zabydlení se v některém z velkých IDEček, GITování, profilování a teorie kolem výpočetní náročnosti, znalosti z oblasti softwarového inženýrství.

Tož ať se daří.

Název: Re:Jak efektivně studovat programování?
Přispěvatel: Artii 23. 10. 2020, 10:39:28
Ahoj, díky za názory a odkazy na různé materiály. Jsem z toho právě takovej roztěkanej - čím víc možností tím se mi hůř rozhoduje, rád bych uměl všechno ale času na to tolik mít nebudu - můžu se tomu věnovat maximálně 2-3 hodiny denně.

Mám teď pár nápadů na jednoduché webové aplikace které bych chtěl zhmotnit.

Zkoušel jsem si například pár základních věcí v PHP a přišlo mi to takové jednoduché (třeba proti Jave) ovšem názory na internetu ohledně PHP jsou takové rozporuplné (možná spíš až negativní).

Vím že výběr jazyka není rozhodující ale pokud chci věnovat nečemu čas a usílí tak bych chtěl aby mě to někam posunulo, například a to mě opravte okud se pletu:

Když budu chtít vytvořit nějakou webovou aplikaci budu potřebovat HTML+CSS+JS+PHP - ale z tohohle hlediska mi přijde lepší využit node js místo PHP  protože se tím naučím syntaxi JS pro vytváření front endu (rozumnější by to asi bylo spíš obráceně). Pak když nad tím přemýšlím tak backend jde udělat i v Javě tak proč ztrácet čas s PHP nebo node js a prostě se to vše naučit v Javě.

Omlouvám se asi to moc řeším, jen v tom chci nějak zorientovat a efektivně využít svůj čas.

 
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Ink 23. 10. 2020, 12:52:00
Ahoj, díky za názory a odkazy na různé materiály. Jsem z toho právě takovej roztěkanej - čím víc možností tím se mi hůř rozhoduje, rád bych uměl všechno ale času na to tolik mít nebudu - můžu se tomu věnovat maximálně 2-3 hodiny denně.

Mám teď pár nápadů na jednoduché webové aplikace které bych chtěl zhmotnit.

Zkoušel jsem si například pár základních věcí v PHP a přišlo mi to takové jednoduché (třeba proti Jave) ovšem názory na internetu ohledně PHP jsou takové rozporuplné (možná spíš až negativní).

Vím že výběr jazyka není rozhodující ale pokud chci věnovat nečemu čas a usílí tak bych chtěl aby mě to někam posunulo, například a to mě opravte okud se pletu:

Když budu chtít vytvořit nějakou webovou aplikaci budu potřebovat HTML+CSS+JS+PHP - ale z tohohle hlediska mi přijde lepší využit node js místo PHP  protože se tím naučím syntaxi JS pro vytváření front endu (rozumnější by to asi bylo spíš obráceně). Pak když nad tím přemýšlím tak backend jde udělat i v Javě tak proč ztrácet čas s PHP nebo node js a prostě se to vše naučit v Javě.

Omlouvám se asi to moc řeším, jen v tom chci nějak zorientovat a efektivně využít svůj čas.

Paralýza možnostmi (option paralysis), to je normální. V zásadě ale řešíš několik různých cílů:

1. Udělat něco rychle a dostatečně dobře.
2. Pochopit obecné principy a umět optimalizovat řešení (na rychlost vývoje, rychlost běhu produktu, škálovatelnost, udržovatelnost). Prostě se intelektuálně rozvíjet a růst.
3. Naučit se něco, o co je zájem na trhu (ale viz bod 4).
4. V neposlední řadě - dělat něco, co Tě baví, protože je to tvůj čas a chceš ho strávit i příjemně.

A teď si polož otázky:

Je možno v PHP udělat něco rychle a dostatečně dobře? Můžu se s jeho použitím rozvíjet? Je o něj zájem na trhu? Baví mě práce v PHP, nebo mě nudí a děsí?

To samé pro Javu. To samé pro JS. To samé pro jakýkoli další jazyk.

Třeba v mém případě: Shellové skripty mě nejenom nebaví, ale přijdou mi z programátorského hlediska jako strašná prasárna. PHP mi nevadí, ale víc mě baví Python. V Pythonu se dá naprogramovat "všechno", ale má svoje zjevné nevýhody. Určitě se v něm uživím. Ještě víc mě baví Rust, ale to je takový seriózní drsný pán, není to kamarád na rychlou akci. Spojení Rustu a Pythonu mi řeší prakticky úplně všechno a baví mě. Pokud Tě Java baví, klidně v ní pokračuj, pro mě to není, ale to není podstatné.

Určitě bych zvládl psát v několika dalších jazycích (a živilo mě to), ale nedělám to, pokud nemusím.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 23. 10. 2020, 16:14:36
Kotlin, Haskell

Na to, zda se učit Haskell mám rozporuplné pocity. Sice se naučíš a pochopíš spousta věcí z programování, jenže... Já třeba teď dělám v C# a furt zakopávám o to, že se samozřejmostí očekávám věci, které C# prostě neumí. Typové varianty, gradual typing, a tak.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Ditys Cidae 23. 10. 2020, 18:51:15
Zdar, mně osobně ani tak abstraktní věci typu datové struktury nebo profilování programu nepřipadají jako to nejpodstatnější. Já bych požadoval co nejjednodušší kód, který bude fungovat. Tedy aplikace typu: Zobraz formulář, zadej jméno, příjmení, datum narození, odešli to do databáze a pak na výchozí tiskárnu. Aplikaci pak nahraj na USB flešku, přenes na jiný počítač, a tam proveď stejný test. Na takovém základu se dá stavět dál.

Název: Re:Jak efektivně studovat programování?
Přispěvatel: Mintaka ? 23. 10. 2020, 21:43:14
V oblasti webu je to trochu divočina, protože se tam míchá několik různých technologií a asi se, bez ústupků, nevyhneš jejich kombinaci.

HTML, CSS, trocha JS to je asi základ.
Pak záleží na tom, jaké webové aplikace chceš vyrábět.
Jestli vyžadují silnou interakci s uživatelem, pak se asi bude třeba ponořit hlouběji do JS a jeho zvěřince.
Na backendu může být PHP+(MariaDB) MySQL, protože to je stále nejpodporovanější mezi hostingy, případně to mít celé postavené na nějakém frameworku, ne-li rovnou jako rozšíření WordPresu.

Cca před 20 lety jsem měl taky rozlítáno a dělal jsem souběžně v Deplhi a Pascalu, PHPčku, baťácích, Bashi, Perlu, Céčku, HTML+CSS+drobnosti v JS+pohrával si Flashem a JavaAplety (o WSH, VBS a dalších podobných raději pomlčím).
Což mi taky nevyhovovalo a hledal jsem něco, čím bych pokryl většinu toho co dělám a nebyl jsem vláčen , tedy od adminování Lin serverů a správu Win stanic přes vlastní tooling, offline GUI aplikace až po webové aplikace na cloudech.
No a většinu z toho dnes pokrývám právě Pythonem.



Název: Re:Jak efektivně studovat programování?
Přispěvatel: Mlocik97 23. 10. 2020, 22:05:10
Citace
V oblasti webu je to trochu divočina, protože se tam míchá několik různých technologií a asi se, bez ústupků, nevyhneš jejich kombinaci.

Asi stále žiješ v rokoch pred 2010....

Dokonca dnes už len pomocou čistého JS vieš spraviť celú webstránku, vrátane backendu,... ohľadom HTML na tom neviem kto sa čo chce učiť, je to na menej než 10 minút učenia a to vrátane formulárov, a veľmi zriedkavo používaných vecí.
CSS dá trocha zabrať, ale rovnako u desktopových aplikácií používaš na tvorbu UI CSS, alebo nejaký graf. toolkit typu GTK.

Takže hovoriť o nejakom chaosu, když to není o nič komplikovanejšie než tvorba desktopových appiek v iných prog. jazykoch, je dosť prapodivné hovoriť že webový vývoj je divočina... to naopak, by som povedal že najmenšia divočina, lebo tam máš len CSS a hotovo... u Desktop appiek máš GTK, QT, Windows Forms, WxWidgets, Kivy, Fyne, AWT, Ultimate++, FLTK, Elementary, CEGUI, a mnoho ďalších... alebo aj to CSS... mimo to ale samotný JavaScript je samostatný jazyk, ktorý funguje ako akýkoľvek bežný jazyk, a kludne v tom spravý terminálové programy. Tak neviem čo je chaos.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Mintaka ? 24. 10. 2020, 01:39:32
Ta "divočina" je věc mého osobního názoru a vychází z mých zkušeností. Je přirozené, že to někdo vidí jinak a pokud v tom co je pro mě "webová divočina" vidíte krásnou cestičku rozkvetlým údolím, tak je to jen dobře.

Pro mě je džunglí především ten ekosystém kolem JS, ta záplava všemožných technologií, které s hypem nastoupí a za pár let je přebije zase něco jiného superduper. Mám na mysli technologie jako: jQuery, Angular, React, ...
Nástin trendů třeba zde:
https://insights.stackoverflow.com/trends?tags=jquery%2Cangularjs%2Cangular%2Creactjs%2Ctypescript%2Ccoffeescript%2Cpython%2Cjavascript%2Cknockout.js%2Credux%2Cbackbone.js%2Cember.js%2Cnode.js%2Cvue.js%2Cmootools
Jak enormní úsilí je vyvíjeno, aby se lidi vyhnuli JS je možné vidět například ze seznamu transpřekladačů do JS:
https://github.com/jashkenas/coffeescript/wiki/List-of-languages-that-compile-to-JS

Třeba nás, v tom ztracené, zachrání WebAssembly. Uvidíme.


A propós, 10 let pro mě není žádný moc velký čas.
Jsem rád, když můžu napsat aplikace a ty pak bez větších oprav mohou běžet "ideálně pořád" a stále dobře plnit svůj účel, stále být bezpečné a umožňovat rozšiřování, když je to třeba.
Nejsem dokonalý a také se v některých případech potýkám s "technologickým dluhem", ale našel bych i 20leté kousky, které téměř bez změny běží a dělají co mají a dá-li Tim a W3C, třeba budou běžet ještě dalších 20 let.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: okalousek 25. 10. 2020, 01:47:51
Třeba nás, v tom ztracené, zachrání WebAssembly. Uvidíme.

Sledoval jste LinuxDays? První přednášku od Špačka? Zmiňoval tam něco (naštěstí fiktivního), zvané FlashAssembly (zřejmě něco jako flash ve WASM). Těšíte se?
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Mintaka ? 25. 10. 2020, 12:06:20
Záznam jsem viděl, ale neměl jsem pocit, že by se o tom vyjadřoval negativně.

Tohle:
WebAssembly describes a memory-safe, sandboxed execution environment that may even be implemented inside existing JavaScript virtual machines.

zní o dost lépe než to čím "byl" Adobe Flash, byť to nepopiratelně byla významná webová technologie, která měla svého času nezastupitelné místo.

Ale abychom se úplně neodofftopicovali z tématu o efektivním studiu programování.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: okalousek 25. 10. 2020, 22:04:15
Záleží čemu se chcete věnovat. Pokud nechcete dělat systémy nebo mikrořadiče tak vám bude C možná jen jako výlet do historie.
Když máte zkušenosti s Javou, podíval bych se možná na Kotlin, ten vypadá dobře. Pokud se chcete zaměřit na webové služby tak je perfektní jazyk Go. Chcete mít v dnešní době nekompromisní rychlost, skvělé abstrakce tak tu máme Rust. Znalost Pythonu jak na skripty tak na programy užitečná.

Efektivní učení. To záleží na vás co vám vyhovuje. Buď číst dokumentaci, blogové přízpěvky nebo z příkladů. Já když jsem se nějaký jazyk učil, tak jsem si našel nějaký "boilerplate" kód například Gtk aplikace a experimentovat na tom.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Tomáš Procházka 25. 10. 2020, 22:44:09
...Pokud se chcete zaměřit na webové služby tak je perfektní jazyk Go. ...

Go bych nedoporučoval. Tazatel má nutnost ještě chvíli pracovat v Java pro studium, a mohlo by se mu to zprotivit.  ;D
Název: Re:Jak efektivně studovat programování?
Přispěvatel: okalousek 26. 10. 2020, 00:21:17
...Pokud se chcete zaměřit na webové služby tak je perfektní jazyk Go. ...

Go bych nedoporučoval. Tazatel má nutnost ještě chvíli pracovat v Java pro studium, a mohlo by se mu to zprotivit.  ;D

Tak alespoň Rust. Ten uvede tazatele do trošku nižších úrovní, trochu do FP (krásný oxymoron) a navíc si na Javu zuby nebrousí.

Go tedy až po Javě. Myslím že přechod ze špatného něco dobrého se dělá dobře, opak je horší ;)
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Standa Blábol 26. 10. 2020, 01:20:23
Z pohledu uceni je vicemene jedno, jaky jazyk pouzijes, budes to stejne v budoucnu menit.

Osobne doporucuju javu,C# pro pochopeni mainstream OOP, Python na skriptovani, Rust pro lowlevel veci. Na webu Javascript, posledni verze uz nejsou uplne zoufalstvi.
Tohle jsou jazyky s potencialem, zbytek je na niche oblasti nebo vicemene  k nicemu.
Stare C je nyni pouzitelne jenom pro mikrokontrolery.

GO 1.x je nepouzitelny zprasek, do 2.0 uz se aspon snazi pridat generika. Je to domenove soecificky jazyk googlu pro stateless kontejnery s velice snadnou paralelizaci pres kanaly a korutiny, jinak to nic neprinasi. Naopak to zpatky vraci davno vyreseny  bordel z osmdesatych let jako je error handling tupym ifem nad retvaly.
Vsade je spousta verozvestu, jak je GO zachrana lictva, realita je prostsi. GO je tak tupej jazyk, ze se to nauci gibbon za odpoledne a pak zacne hrde hejtovat javu, ktere nerozumi.

Jazyk je stejne jenom mala cast potrebne problematiky. Dulezite je taky nastudovat ekosystem jako je maven,pip,nuget, a hlavne IDE. Vzdycky me berou mory, kdyz vidim idioty nadsene z Kotlin syntaktickeho cukru (ne ze by byl Kotlin spatny, ma par peknych ficur), ze je java ukecana. OMG, javi ukecanost za me napise IDE vcetne generovani getteru a toString(), boilerplate zafolduje a vysledek je krasne lidsky citelny kod.
Sveho casu byli propagatori "usporneho zapisu" perl verozvesti. Kod vypadal jak chyba na lince telexu, prase se v tom nevyznalo a kdo napsal kratsi zapis ve vimu byl king.
Ti uz ale vymreli.

Akorat java je nebezpecna v tom, ze za leta jsou v ni nanosy bordelu, ktery uz nikdo nepouziva a je tam z compatibility duvodu. Javu je nutno ucit se z tutorialu minimalne pro verzi 8, starsi ucebni materialy budou zavadejici.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: okalousek 26. 10. 2020, 07:54:59
GO 1.x je nepouzitelny zprasek, do 2.0 uz se aspon snazi pridat generika. Je to domenove soecificky jazyk googlu pro stateless kontejnery s velice snadnou paralelizaci pres kanaly a korutiny, jinak to nic neprinasi. Naopak to zpatky vraci davno vyreseny  bordel z osmdesatych let jako je error handling tupym ifem nad retvaly.
Vsade je spousta verozvestu, jak je GO zachrana lictva, realita je prostsi. GO je tak tupej jazyk, ze se to nauci gibbon za odpoledne a pak zacne hrde hejtovat javu, ktere nerozumi.

Nejsem Go fanatik, rád dělám v Rustu, ale ten jazyk má své využití. Jazyk má slušnou konkurenci (ve smyslu ne ekonomickém, ale počítačovém) a standardní knihovnu. Syntakticky ten jazyk není nejlepší, jazykové konstrukce if err != nil jsou děsivé věci ale má specifické využití (ten jazyk).
Název: Re:Jak efektivně studovat programování?
Přispěvatel: listoper 26. 10. 2020, 08:36:53
...

 Vzdycky me berou mory, kdyz vidim idioty nadsene z Kotlin syntaktickeho cukru (ne ze by byl Kotlin spatny, ma par peknych ficur), ze je java ukecana. OMG, javi ukecanost za me napise IDE vcetne generovani getteru a toString(), boilerplate zafolduje a vysledek je krasne lidsky citelny kod.

...

Kdyz ctes cizi kod tak taky nechas gettery a toString zafoldovany?
Kde mas jistotu, ze nekdo jiny se nerozhodl, ze treba ten getter bude sahat do databaze?

IDE za me kod sice napise, ale udrzovat uz ho musi clovek. A to napsani je celkem levny a dela se to jednou. Problem je to cteni a upravy. To se dela mockrat a IDE to za me neudela.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Standa Blábol 26. 10. 2020, 09:12:04
GO 1.x je nepouzitelny zprasek, do 2.0 uz se aspon snazi pridat generika. Je to domenove soecificky jazyk googlu pro stateless kontejnery s velice snadnou paralelizaci pres kanaly a korutiny, jinak to nic neprinasi. Naopak to zpatky vraci davno vyreseny  bordel z osmdesatych let jako je error handling tupym ifem nad retvaly.
Vsade je spousta verozvestu, jak je GO zachrana lictva, realita je prostsi. GO je tak tupej jazyk, ze se to nauci gibbon za odpoledne a pak zacne hrde hejtovat javu, ktere nerozumi.

Nejsem Go fanatik, rád dělám v Rustu, ale ten jazyk má své využití. Jazyk má slušnou konkurenci (ve smyslu ne ekonomickém, ale počítačovém) a standardní knihovnu. Syntakticky ten jazyk není nejlepší, jazykové konstrukce if err != nil jsou děsivé věci ale má specifické využití (ten jazyk).

Souhlas, Go ma pekne niche pouziti pro stateless kubernetes containery. Nezere moc resources, start binarky srovnatelny s C, oproti C toho nabizi vic. Korutiny pekne navrzene a snadno uchopitelne.
Pro container s jednoduchou mikroservicou skvele. Na cokoliv jinyho zadna slava
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Standa Blábol 26. 10. 2020, 09:32:07
...

 Vzdycky me berou mory, kdyz vidim idioty nadsene z Kotlin syntaktickeho cukru (ne ze by byl Kotlin spatny, ma par peknych ficur), ze je java ukecana. OMG, javi ukecanost za me napise IDE vcetne generovani getteru a toString(), boilerplate zafolduje a vysledek je krasne lidsky citelny kod.

...

Kdyz ctes cizi kod tak taky nechas gettery a toString zafoldovany?
Kde mas jistotu, ze nekdo jiny se nerozhodl, ze treba ten getter bude sahat do databaze?

IDE za me kod sice napise, ale udrzovat uz ho musi clovek. A to napsani je celkem levny a dela se to jednou. Problem je to cteni a upravy. To se dela mockrat a IDE to za me neudela.

Ne, osobne to zafoldovany nemam, gettery jsou zkratka odsunuty dole.
A pokud ctu cizi kod, staci proscrollovat blok getteru, oko jenom proskenuje behem sekundy tvar toho bloku, hned jde poznat, ze to jsou normalni gettery a ze to neni zadna dobytcina s logikou v getterech. Naopak, pokud je tvar jiny nez ocekavany, okamzita reakce "ou jeee", mame co do cineni s prasaty.
A pokud ma nekdo s gettery trauma, nalinkuje si z mavenu Lombok. Tim samozrejme ale prije o vyhody explicitniho getteru jako je moznost strceni debug hooku do nej.

Ukecanost javy je naopak velka vyhoda, kod je samopopisny, v jave v IDE se rozhodne necte cely text. Oko jenom skace po barvickach, bold, italic syntax highlightingu a po tvaru bloku kodu -  nacteni informace je velice efektivni. Ctenar se pouze sosustredi na pro nej zajimavou cast. Kdyz reim business logiku, vsecko je v try bloku, kdyz resim error handling, vsecko je v catch bloku, ne zmatlany maglajz na jedny hromade jak v Go.

Problem je, ze java se da efektivne pouzivat jedine s podporou IDE a jejiho ekosystemu typu maven. Je tam o dost vetsi prah pro nauceni.
A tutorialy to nijak nezduraznuji.

Chapu, ze kdyz kluk po skole dostane zadani, udelej to a to, jak chces, vcera bylo pozde, mas na to 2 dny, tak zakonite skonci u nejakeho quick and dirty copypaste ze StackOverflow, kde nekdo ukazuje popis parcialniho reseni a okoli resi jenom nejnutnejsim praseckym zpusobem. A spousta lidi se tohoto marasu nikdy nevymani, pak vznikaj veci jako pristu do databaze v getteru.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Artii 26. 10. 2020, 14:47:20
Tak jsem si to ještě jednou hezky promyslel, kouknul na různé jazyky a tipy co jste mi tady davali a rozhodl jsem se ze zustanu u Javy (po pravdě některým věcem co jste tu psali jsem ani nerozuměl  :D).

Ve škole v tom mám dělat další semestrální projekt + v tom vyučují zálkady počítačové grafiky (algoritmy na vykreslování přímek, tvarů apod.). Zároveň se dají pomocí Javy dělat webové aplikace, sice zatím nevim jak ale k tomu bych se dostal asi postupně :-). Začal jsem tedy s tutoriálem přímo od oracle kde to mám zatím jako takové opakování ale přijde mi to dobře zpracované takže si to projdu celé abych něměl mezery někde v základech.

Napadlo mě že bych si udělal při učení Javy udělal nějakou dokumentační webovou stránku kam bych si psal zápisky, zároveň bych si osvěžil html,css (nebo použít bootstrap?).
Název: Re:Jak efektivně studovat programování?
Přispěvatel: listoper 26. 10. 2020, 16:48:53
...
 Zároveň se dají pomocí Javy dělat webové aplikace, sice zatím nevim jak ale k tomu bych se dostal
...

Bud hodne opatrny a overuj si stari zdroju na ktere narazis.
V jave se na webu delali ruzne obskurnosti kterym je asi lepsi se dneska vyhnout.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: _Jenda 26. 10. 2020, 18:06:30
...
 Zároveň se dají pomocí Javy dělat webové aplikace, sice zatím nevim jak ale k tomu bych se dostal
...

Bud hodne opatrny a overuj si stari zdroju na ktere narazis.
V jave se na webu delali ruzne obskurnosti kterym je asi lepsi se dneska vyhnout.
On nemluví o Java apletech, ale o Java EE.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: listoper 26. 10. 2020, 20:52:44
...
 Zároveň se dají pomocí Javy dělat webové aplikace, sice zatím nevim jak ale k tomu bych se dostal
...

Bud hodne opatrny a overuj si stari zdroju na ktere narazis.
V jave se na webu delali ruzne obskurnosti kterym je asi lepsi se dneska vyhnout.
On nemluví o Java apletech, ale o Java EE.
Kdo vi... ale ja bych se dneska treba nehrnul ani do gwt. Ani jsp a jsf bych dneska nevolil jako prvni.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: okalousek 26. 10. 2020, 23:17:15
Možná pro Javistu bych doporučil Kotlin. Osobně se mi moc líbí, běží to pod JVM ale je tu i LLVM backend (ale není zase tolik populární).

Go je pěkný jazyk ale hodně oškrábaný a i když se mi líbí tak dělat v něm veliký projekt je za trest (asi proto se hodí pro mikroslužby).
Název: Re:Jak efektivně studovat programování?
Přispěvatel: L.. 27. 10. 2020, 07:55:05
Kdo vi... ale ja bych se dneska treba nehrnul ani do gwt. Ani jsp a jsf bych dneska nevolil jako prvni.

Přesně tak. V GWT jsem sice nedělal, nicméně JSP(F) je hrozný sh*t. Pokud už bych chtěl dělat webový FE v Javě, tak jedině Wicket.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Standa Blábol 27. 10. 2020, 08:56:06
Kdo vi... ale ja bych se dneska treba nehrnul ani do gwt. Ani jsp a jsf bych dneska nevolil jako prvni.

Přesně tak. V GWT jsem sice nedělal, nicméně JSP(F) je hrozný sh*t. Pokud už bych chtěl dělat webový FE v Javě, tak jedině Wicket.

No to je presne jak jsem psal nahore, v jave je za leta hromada bordelu a je potreba vedet, jak to pouzivat.

Puvodni JSP se scriptlety je peklo.
Udelat ale web postaveny ja bootstrap+jQuery, kde v Jave servlet pripravi data, strci je jako Java objekty do response, v e vlastni JSP strance jenom predam tyto data jQuery a jinym javascript widgetum - elegantni a ciste reseni.
Nedavno jsem delal jednoduchy CRUD postaveny kolem https://datatables.net/

Puvodni JSF arcipeklo, JSF2 peklo. Kdyz ale to JSF nekdo umravni ve stylu https://www.primefaces.org/showcase/ , da se s tim velice pekne pracovat. Backend na Java SpringBoot. A porad se jedna o klasickou servlet/JSP aplikaci se session na serveru, coz ma hromadu vyhod, treba citlive data jsou neviditelne pro browser.

No a dneska bych se pro nove veci snazil udelat v Angularu, Java jenom na REST API backend
Název: Re:Jak efektivně studovat programování?
Přispěvatel: premekv 27. 10. 2020, 08:56:56
Ono to ošetřování chyb v GO má svoji logiku (i když, přiznávám, jako Javista jsem tomu nepřišel na chuť :)).

Funkce typicky vrací dvojici hodnot - výsledek a chybu (result, err). Takto jsou napsané interní funkce a většinou se tak píšou i všechny ostatní. Obojí člověk musí do nějaké proměnné přiřadit  (result, err := func() ). A když už  něco do proměnné přiřadí, musí ji v kódu použít (jinak chyba, hlídá to kompilátor). Existuje ale placeholder "_" kdy můžu explicitně říct, že chybu ignoruju (result, _  := func() ). Takto explicitně kompilátoru řeknu, že chybový výstup funkce mě nezajímá a nechci ho ošetřit vůbec. Další možnost je  chybu ošetřít v kódu v místě vzniku nebo "poslat dál" v návratovém kódu funkce. Vždyť je to v jádru podobný mechanismus jako checked exceptions v javě (akorát s primitivnější konstrukcí).

Filozofie GO je, že chyba je jedna z možností, jak volání funkce může dopadnout. Je to plnohodnotná (a očekávaná!) alternativa k tomu, že funkce vrátí výsledek. Nikoliv něco jako corner case. Něco co "SE nějak" pořeší (frameworkem atp.). Rovnocenná varianta, která si zaslouží stejnou pozornost jako to, že funkce vrátila nějaký výsledek.

Ono v GO se typicky píšou ty mikroslužby, nástroje na automatizaci, síťoví klienti... Různé chyby spojení atd. tu nejsou výjimka ale regulérní věc, která prostě nastává. (tečka.)

A teď proč jsem si jako Javista nezvykl. Samozřejmě runtime exception. Ty jsou hodně oblíbené. Ty totiž nepřikazují, že se musí chyba řešit (buď ošetřit, poslat dál nebo prostě ignorovat (sic)) v místě vzniku.Tahle vlastnost checked exceptions je pro spoustu lidí tak silné omezení že je odchytávají a obalují do runtime a "posílají dál". Na nejpoužívanějších frameworcích v javě je to vidět. Checked exceptions jsou tak nějak demodé, nechtěný člen jazyka, na který se hledá jak to obejít. 

 No jo, je to návykové. Mít možnost chybu nechat bublat stackem, "chytit" ji o mnoho kroků dál a neřešit při každém volání něčeho "co když.."

Ano, pohodlně se s tím žije. Ale někdy je těžké (narozdíl od toho explicitního ošetřování) říct, co se stane, když... třeba server, který volám neopdoví. Data nejde načíst. Vstup je špatný...  Ono "SE" to vyřeší. Někdo tu výjimku ošetří, co na tom, že klient dostane divný návratový kód (nejlépe i se stack trace :)), v databázi (a jiných distribuovaných úložištích) zůstane nekonzistentní binec..  I tohle jsme mockrát viděli. Takže jako všechno se to musí používat s rozmyslem. Což se často neděje a proto vzniká výše uvedené. Bohužel jazyk a konstrukce neošetřených výjimek k tomu vybízí. Nejsem žádný evangelista check exceptions nebo stylu ale GO/C, jen jsem chtěl zkusit přiblížit co je pod tím za záměr.

Ono vynucovaná "štábní kultura" v GO je něco, co hodně lidí pobuřuje/omezuje. Prosté přiřazení proměnné bez dalšího použití v kódu je chyba. Chyba kompilaci (ne varování IDE). Ano, chybový výstup funkce můžu "dát do podtžítka" (ignorovat) ale okamžitě je vidět jaké jsem prase (a kde může být zdroj chyby). Dobře, buďme objektivnější - okamžitě je vidět, kde jsem se explicitně a po zralé úvaze :) rozhodl, že chybu ošetřím zrovna takhle.

Ještě jedna věc k tomu, že v GO je za trest psát větší projekt. Kubernetes je top repozitář na githubu. Nejoblíbenější open source produkt a veliký projekt v GO současně (trocha bulvárního jazyka neuškodí). Kdyby to bylo za trest, asi by to nebylo tak oblíbené.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: alex6bbc 27. 10. 2020, 09:18:51
mi se libi v GO navratove hodnoty s chybou, kde se chyba stala tam se osetri.
excepsny se mi nelibi vubec, presunuje to reseni chyby jinam, a kvuli takove blbosti musi byt v C++ noexcept.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Standa Blábol 27. 10. 2020, 09:59:43
Funkce typicky vrací dvojici hodnot - výsledek a chybu (result, err). Takto jsou napsané interní funkce a většinou se tak píšou i všechny ostatní. Obojí člověk musí do nějaké proměnné přiřadit  (result, err := func() ). A když už  něco do proměnné přiřadí, musí ji v kódu použít (jinak chyba, hlídá to kompilátor). Existuje ale placeholder "_" kdy můžu explicitně říct, že chybu ignoruju (result, _  := func() ). Takto explicitně kompilátoru řeknu, že chybový výstup funkce mě nezajímá a nechci ho ošetřit vůbec. Další možnost je  chybu ošetřít v kódu v místě vzniku nebo "poslat dál" v návratovém kódu funkce. Vždyť je to v jádru podobný mechanismus jako checked exceptions v javě (akorát s primitivnější konstrukcí).

Reseni GO je jenom znpouzectnost a vynucovani pouziti Err je rovnak na ohybak.
V Jave taky muzes vracet errory primo z metody (tedy ne primo dve hodnoty ale bean s dvema atributy valu,err)
A mas to samy co v GO. Nikdo to nepouziva protoze je to k nicemu.

Vyjimky oddeluji business kod od error handlingu, kdyz potrebuju resit chybu inplace, vyresim ji inplace.
Nechat probublavat exception neni zadna lenost ale obri vyhoda.
Zrovna ted jsem psal jeden loader, ktery dostal na vstupu obri JSON s e seznamem itemu s atributy, ten v cyklu zoracovaval a behem kazdeho cyklu provadel obri hromadu checku, tahani tad z externiho API a cteni  z DB.
A LIBOVOLNA chyba v tom slozitem procezu znamenala proste ukonceni procesu a zalogovani log.error("Item XXX loading failed: " + e.getMessage()
V mym kodu nebyl ZADNY error handling, krome finalniho catch bloku v ramci for cyklu pro vsechny itemy.
Tohle samy v GO nebetycny oser s preposilanim chyby manulane vejs a vejs a s totalne zamaglajzovanym a necitelym kodem

V jave je oddelen business kod od error handlingu a to je velice dobre.
Kdyz chci resit business kod, rezim try blok, kdyz resim error handling, resim catch blok. Jednoduche, ucelne.

Java example:

Kód: [Vybrat]
try {
  a1 = action1();
  a2 = action2();
  a3 = action3();
  a4 = action4();
  a5 = action5();
} catch (Exception e) {
  log.error("Je to rozbity")
  System.exist();
}

To samy v GO je necitelny maglajz a kdyz se k tomu pridaji deferred, je bordel dokonaly:

Kód: [Vybrat]
a1,err := action1()
if (err != nil) {
 log.error("Je to rozbity");
 exit();
}
a2,err := action2()
if (err != nil) {
 log.error("Je to rozbity");
 exit();
}
a3,err := action3()
if (err != nil) {
 log.error("Je to rozbity");
 exit();
}
a4,err := action4()
if (err != nil) {
 log.error("Je to rozbity");
 exit();
}
a5,err := action5()
if (err != nil) {
 log.error("Je to rozbity");
 exit();
}


 
Název: Re:Jak efektivně studovat programování?
Přispěvatel: L.. 27. 10. 2020, 10:29:11
Puvodni JSP se scriptlety je peklo.
Udelat ale web postaveny ja bootstrap+jQuery, kde v Jave servlet pripravi data, strci je jako Java objekty do response, ve vlastni JSP strance jenom predam tyto data jQuery a jinym javascript widgetum - elegantni a ciste reseni.

Ano, protože to JSP prakticky nepoužijete, tak to jde :-D

Kdyz ale to JSF nekdo umravni ve stylu https://www.primefaces.org/showcase/ , da se s tim velice pekne pracovat.

Zkoušel jsem. Showcase vypadá hezky, ale ve skutečnosti je to naleštěná hromada hnoje, pod ní větší hromada hnoje a pod ní úplně největší hromada hnoje. Všechno tohle mi připomíná jako kdyby někdo vzal součásti, zkusil je dát k sobě, zjistil, že tak úplně nepasují, tak je prostě brutálně omotal duck tapou, takže "nějak" drží, ale ve skutečnosti je to past vedle pasti.

Jak jsem psal, pokud Java framework, tak Wicket, ten na to jde dobře, komponenty se tam dělají hezky, ajax aktualizace fungují skoro bezešvě... Ale samozřejmě, pořád je to server-side.

No a dneska bych se pro nove veci snazil udelat v Angularu, Java jenom na REST API backend

Angular má jednu zásadní výhodu:

- Je filozofií hodně blízký Java frameworkům. Takže lidé přecházející z Java světa se v něm rychle orientují.

Také má ale jednu zásadní nevýhodu:

- Je filozofií hodně blízký Java frameworkům. Takže je postavený poněkud zastarale a nedokáže využít nové možnosti.

Název: Re:Jak efektivně studovat programování?
Přispěvatel: premekv 27. 10. 2020, 10:43:45

Reseni GO je jenom znpouzectnost a vynucovani pouziti Err je rovnak na ohybak.
V Jave taky muzes vracet errory primo z metody (tedy ne primo dve hodnoty ale bean s dvema atributy valu,err)
A mas to samy co v GO. Nikdo to nepouziva protoze je to k nicemu.

Vyjimky oddeluji business kod od error handlingu, kdyz potrebuju resit chybu inplace, vyresim ji inplace.
Nechat probublavat exception neni zadna lenost ale obri vyhoda.
..

imho je to úhel pohledu/názoru a toho, na co se člověk naučí. Sám jsem dlouholetý javista, v GO jenom "poučený laik" a mechanismus výjimek je mi blízký (a GO přístup pro mne nezvyk).

try..catch..finally je elegantnější a líp použitelná konstrukce, to bych souhlasil. Znovu ale jenom jsem psal, že runtime exceptions -- ač mají tyhle výhody v jednoduchosti použití atp. -- vedou k tomu, že chybu řešit nemusím, a to ani inplace, ani v catch bloku ani v signatuře metody a to je pro mne s otazníkem. Že možná očekávaná (!) chyba není součástí kontraktu. Že ji volající klient může ignorovat a nechat řešit "automagií" (tedy probublat z metody ven, což je jen jedna z možností jak tu chybu ošetřit a ta se za mě vybere automaticky). Že vlastně ani nemusí na první dobrou vidět, že taková očekávaná chyba nastává. Možná je to úleva lenosti na úkor bezpečnosti kódu :) Ignorovat a  neošetřovat chyby ("SE" to vyřeší) je nízko visící ovoce. Pak nastávají ty situace (nejlépe až na produkci) co jsem popisoval.  Mluvím z praxe.

Jinak tenhl ekonkrétní případ by se v GO dal určitě napsat líp. GO umí funkce vyššího řádu a můžu si připravit šablonu (funkci), a volání té funkce dát do ní. Já vím... můžeme to prohlásit za narovnávák na..  Ale takhle ošklivě by to pak nevypadalo.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: jano6 27. 10. 2020, 11:07:56
Citace
Java example:

Kód: [Vybrat]
try {
  a1 = action1();
  a2 = action2();
  a3 = action3();
  a4 = action4();
  a5 = action5();
} catch (Exception e) {
  log.error("Je to rozbity")
  System.exist();
}

Ono to ale v praxi takto pekne rozhodne nevyzera.

Kód: [Vybrat]
       try {

...

        } catch (SQLException ex) {
           ...
        } finally {

            DBUtils.closeResultSet(rs);
            DBUtils.closeStatement(pst);
            DBUtils.closeConnection(con);
        }
    }

a potom

Kód: [Vybrat]
    public static void closeResultSet(ResultSet rs) {

        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException ex) {
                logger.log(Level.FINEST, "Could not close JDBC ResultSet", ex);
            } catch (Throwable ex) {
                // We don't trust the JDBC driver: It might throw RuntimeException or Error.
                logger.log(Level.FINEST, "Unexpected exception on closing JDBC ResultSet", ex);
            }
        }
    }

Jedna vynimka moze generovat dalsiu, a ta dalsia potom dalsiu. Z toho je potom poriadne kosaty kod,
ktory ma daleko k dobrej citatelnosti. Ta poznamka "We don't trust the driver" pochadza zo Springu;
to pridava kodu dalsiu uroven komplexnosti a zamotanosti. Je z toho potom uplny binec.  Mne Java
naopak vynimky poriadne znechutila.

Go ma svoje podivnosti, ako je vyssia spominana chyba, ked sa premenna nevyuziva, vynucovane
taby, Go slice, Github importy, formatovanie casu (to som chvilu zazeral, pokial mi to doslo, pouziva sa namiesto
formatovacich specifikatorov natvrdo retazec datumu a casu.)

Avsak vo svojej oblasti je genialny; vyborne sa hodi na mnostvo taskov na ktore Python nestaci a
Rust je velmi komplikovany. Chcete importovat data z Excelu, efektivne spustat web requesty, pochrumat
obrovske mnostvo dat --> na to je Go ako stvorene, portabilny, malicke binarky a vyrazne jednoduchsie
riesenie ako trebars v tom Ruste, pricom rychlost Go je len o nieco mensia ako pri Ruste.

Ja by som najradsej na vsetko pouzil F#, ale ked zbuildovany Hello World ma 30MB, tak to Go ma svoje
caro.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: premekv 27. 10. 2020, 11:17:43
K tématu tazateli: na různé skripty/řádkové tooly se mi nejlépe osvědčil Python. To je také jazyk, který "frčí" ve strojovém učení, big data, v automatizaci atd. Takže se znalost určitě neztratí. Syntax je elegantní, čitelná (i pro laika nebo člověka přicházejícího z jiného jazyka). Dají se v tom dělat i weby (django, flask) ale s tím nemám zkušenost.

Web má backend (práce s databází, business logika) a frontend část.

Pro backend  je moje volba Java. Jak bylo řečeno, ekosystém a komunita jsou obrovské, vyspělé, mnoha lety utvářené. IDE pro javu od IntelliJ je top (programuje za mne kolikrát líp než já ala "simplify this code"). Jazyk se dá rychle naučit. Strmější křivku učení vidím v knihovnách/frameworcích bez kterých se v praxi člověk neobejde.

Ve velké většině případů v souvislosti s javou uslyšíš o Spring/Hibernate. Tyhle dva frameworky se dlouhá léta pro vývoj používají a je to dospělé, robustní a funknčí řešení. Je to také velice pohodlné na použití. Jako takové SUV audi, sedneš, nastartuješ (možná přečteš pár základních pouček) a jedeš. Všechno se zdá snadné, všude samí asistenti, řídí se to samo. Ale jako se vším tady je druhá strana mince. Zejména ten Hibernate/JPA považuju za hodně komplexní věc, která na jednu stranu extrémně urychluje vývoj, na druhou stranu je to procházka polem plným vidlí. Každou chvíli na nějakou člověk může šlápnout a praštit se do hlavy. A ve finále ten nadšený začátečník zjistí, že chtěl výši platu pana Pepy, ale stahuje kvůli tomu z databáze všechny účetní knihy, data všech zaměstnanců, sklad výrobků a dokonce kompletní jízdní řád českých drah (evergreen). Nebo že dostane místo toho čísla divnou chybu (něco o "líném začátku" nebo tak). Napálí se na to každý. Opravdu každý kdo si s Hibernate něco začne :) Rozhodně používat (používá to každý), ale je potřeba k tomu přistupovat s respektem, studovat specifikaci, vědět jak to funguje a číst také články o best practices s používáním tohoto frameworku. Skutečným machrem na JPA (ale relační databáze obecně) je Vlad Mihalcea, doporučuju jeho články.

Jinak proč ten hibernate používá (skoro) každý - nikomu se nechce pořád dokola psát SQL příkazy na vytažení dat/updaty z/do dtabáze. Tak je za sebe nechává psát framewrok. Je to složitější, ale princip je tenhle.

Spring zase během chvilku umožní nasetovat aplikcai (přístup do databáze, spuštění webového kontextu atd.) řeší takový ten "boiler plate" kód (který nijak nepomáhá tomu, co dělá aplikace, ale je to nutné zlo, aby to celé fungovlao dohromady). Spring je dle mého méně zákeřný a více se dá používat jako "černá krychle" která pod pokličkou nějak funguje a dělá co má. Ale do jisté míry platí totéž co pro ten Hibernate.

Frontend nevím, není to úplně moje parketa.  Jednodušší web se dá udělat v javě (tedy všechno na server straně). Modernějí a lépe na mě než JSP působí Thymeleaf. Spring má perfektní podporu. Ale v praxi jsem to nepoužil.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Standa Blábol 27. 10. 2020, 11:31:35

Jedna vynimka moze generovat dalsiu, a ta dalsia potom dalsiu. Z toho je potom poriadne kosaty kod,
ktory ma daleko k dobrej citatelnosti. Ta poznamka "We don't trust the driver" pochadza zo Springu;
to pridava kodu dalsiu uroven komplexnosti a zamotanosti. Je z toho potom uplny binec.  Mne Java
naopak vynimky poriadne znechutila.


Priklad s JDBC driverem je presne ten pripad stareho marasu v Jave, ktery nikdo soudny nepouziva.
Dneska pouzivat primo JDBC a a manualne mapovat hodnoty z resultsetu do beanu je prace pro masochisty.
Dneska proste reknu Springovi at mi pribali JPA, tam ale volam native queries (JSQL neumi vyuzit moznosti DB a casto to vede k divokym dotazum), Hibernate vespod mi rovnou vraci Listy naplnenejch beanu, neresim zadne konektovani ci spravu DB poolu. Prakticky jedine, co si musim hlidat, je korektni @Id v JPA beanu.

Takze nekde uvnitr Springu je schovana tvoje konstrukce s vyjimkama na vyjimky, lec who cares?
Zkratka mam v package "persitence" interface a tridu, co provolava moje nativni SQL queries a vraci List<Bean> a normalne vyhazuje SQLException.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: alex6bbc 27. 10. 2020, 12:07:20
bezne delam v C/C++ a musel jsem pouzivat Python.
takze zjeveni GO je pro me super, a pouziva se mi lepe nez Python.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Petr Jahoda 27. 10. 2020, 12:19:03
Za me je rozdil mezi Javou a Go asi takovy....
Oba dva ve finale daji stejny vysledek ale...

Dotaz: "Byl jsi vcera v hospode"
Java odpoved: " Pojdme se zamyslet, co to znamena vcera. Myslite tim minus 24 hodin, nebo interval mezi 0 az 24 hodin? Jeste bude potreba zavola Karlovi, co si o tom mysli a pak ... " a tak dale.
Go odpoved: "Ano" anebo "Ne"
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Ondra Satai Nekola 27. 10. 2020, 12:26:10
Za me je rozdil mezi Javou a Go asi takovy....
Oba dva ve finale daji stejny vysledek ale...

Dotaz: "Byl jsi vcera v hospode"
Java odpoved: " Pojdme se zamyslet, co to znamena vcera. Myslite tim minus 24 hodin, nebo interval mezi 0 az 24 hodin? Jeste bude potreba zavola Karlovi, co si o tom mysli a pak ... " a tak dale.
Go odpoved: "Ano" anebo "Ne"

Potreboval bych optimalizovanou typove bezpecnou multimapu.
Java: No problem.
Go: Jeblo ti?
Název: Re:Jak efektivně studovat programování?
Přispěvatel: okalousek 27. 10. 2020, 13:50:52
Go je jednoduché, Java komplexní
Tím pádem je Go na jednoduché věci, Java na komplexní.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 27. 10. 2020, 16:44:26
Ono to ošetřování chyb v GO má svoji logiku (i když, přiznávám, jako Javista jsem tomu nepřišel na chuť :)).

Funkce typicky vrací dvojici hodnot - výsledek a chybu (result, err). Takto jsou napsané interní funkce a většinou se tak píšou i všechny ostatní. Obojí člověk musí do nějaké proměnné přiřadit  (result, err := func() ). A když už  něco do proměnné přiřadí, musí ji v kódu použít (jinak chyba, hlídá to kompilátor). Existuje ale placeholder "_" kdy můžu explicitně říct, že chybu ignoruju (result, _  := func() ). Takto explicitně kompilátoru řeknu, že chybový výstup funkce mě nezajímá a nechci ho ošetřit vůbec. Další možnost je  chybu ošetřít v kódu v místě vzniku nebo "poslat dál" v návratovém kódu funkce. Vždyť je to v jádru podobný mechanismus jako checked exceptions v javě (akorát s primitivnější konstrukcí).

Filozofie GO je, že chyba je jedna z možností, jak volání funkce může dopadnout. Je to plnohodnotná (a očekávaná!) alternativa k tomu, že funkce vrátí výsledek. Nikoliv něco jako corner case. Něco co "SE nějak" pořeší (frameworkem atp.). Rovnocenná varianta, která si zaslouží stejnou pozornost jako to, že funkce vrátila nějaký výsledek.

...

Ano, pohodlně se s tím žije. Ale někdy je těžké (narozdíl od toho explicitního ošetřování) říct, co se stane, když... třeba server, který volám neopdoví. Data nejde načíst. Vstup je špatný... 

Hezky shrnuto. V mnohém souhlasím.

Zdrůraznil bych:
- Výjimky byli vymyšleny, aby se dalo psát toto:
Kód: [Vybrat]
if (((countOfFilesIn(dir1) + countOfFilesIn(dir2)) / countOfFilesIn(dir3)) == 0) { ... }. Což bez nich prostě nejde.
- Nevynucovat odchytávání - tedy unchecked exceptions jsou zlo, a celé to to kazí.
- Výjimky jsou naprosto regulérní návratový stav. Jen jinou cestou. Problém je jen v tom, když jazyk nevynucuje jejich zpracování.
- To co dělá GO je stejnej mechanisumus jako mají funkcionální jazyky (Haskell). Jen je to takové odlehčené.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: borekz 27. 10. 2020, 17:04:58
Potreboval bych optimalizovanou typove bezpecnou multimapu.
Java: No problem.
Go: Jeblo ti?
Jak to udělám jednoduše v Javě bez knihoven třetích stran ?

Silná stránka C++ jsou šablony, které fungují jinak než v Javě. Šablony v Javě jsou jen syntax sugar místo castování. Šablony v C++ generují zdrojový kód jako makro a tím jednak umožňují v kontejnerech uložit zadaný typ přímo bez balení do objektu a navíc instance šablony ten typ zná a proto jej může instanciovat metoda v šabloně. Kontejner v šabloně může jen ukládat reference na objekty vytvořené mimo kontejner.
Kód: [Vybrat]
map<int,vector<int>> multimapa;
multimapa[5].push_back(6);  // operátor [] najde existující vector nebo automaticky vytvoří nový
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Idris 27. 10. 2020, 17:59:59
- Výjimky byli vymyšleny, aby se dalo psát toto:
Kód: [Vybrat]
if (((countOfFilesIn(dir1) + countOfFilesIn(dir2)) / countOfFilesIn(dir3)) == 0) { ... }. Což bez nich prostě nejde.
Ve funkcionálních jazycích to jde ;) Akorát dá o dost víc práce pochopit, jak kód v takovém případě funguje.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Idris 27. 10. 2020, 18:02:33
Silná stránka C++ jsou šablony, které fungují jinak než v Javě. Šablony v Javě jsou jen syntax sugar místo castování. Šablony v C++ generují zdrojový kód jako makro a tím jednak umožňují v kontejnerech uložit zadaný typ přímo bez balení do objektu a navíc instance šablony ten typ zná a proto jej může instanciovat metoda v šabloně. Kontejner v šabloně může jen ukládat reference na objekty vytvořené mimo kontejner.
Kód: [Vybrat]
map<int,vector<int>> multimapa;
multimapa[5].push_back(6);  // operátor [] najde existující vector nebo automaticky vytvoří nový
A generika v Go 2 se jako na potvoru inspirovala javovskou verzí. Aneb Go se v ..... obrací.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Jiří Havel 27. 10. 2020, 21:13:43
Jsem silně poznamenaný funkcionálním programováním a způsob ošetřování chyb v Go se mi extrémně nelíbí.

V žádném jazyce, co má rozumné součtové typy a pattern matching, jsem neviděl že by někdo vracel chyby tuplem. Ono to nedává smysl. Obvyke nechci vrátit hodnotu A chybu, ale hodnotu NEBO chybu. Go mě nutí aby každý typ měl nějakou defaultní/prázdnou/nesmyslnou hodnotu, kterou můžu vrátit v případě chyby, i když jinak není k ničemu a ani nedává smysl.

Až moc mi to připomíná Hoareho bilionový omyl.

Z Go mám nepříjemný pocit promrhaného potenciálu. Ten jazyk by mohl být o tolik lepší, kdyby jeho autoři (záměrně?) neignorovali skoro všechno "nové" kolem překladačů a jazyků.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: okalousek 27. 10. 2020, 22:41:42
Jsem silně poznamenaný funkcionálním programováním a způsob ošetřování chyb v Go se mi extrémně nelíbí.

V žádném jazyce, co má rozumné součtové typy a pattern matching, jsem neviděl že by někdo vracel chyby tuplem. Ono to nedává smysl. Obvyke nechci vrátit hodnotu A chybu, ale hodnotu NEBO chybu. Go mě nutí aby každý typ měl nějakou defaultní/prázdnou/nesmyslnou hodnotu, kterou můžu vrátit v případě chyby, i když jinak není k ničemu a ani nedává smysl.

Až moc mi to připomíná Hoareho bilionový omyl.

Z Go mám nepříjemný pocit promrhaného potenciálu. Ten jazyk by mohl být o tolik lepší, kdyby jeho autoři (záměrně?) neignorovali skoro všechno "nové" kolem překladačů a jazyků.

Tady jde o to, že Go zaplnilo díru na trhu. Ale myslím že se tato diskuze dostala až moc daleko od tématu.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Idris 27. 10. 2020, 22:53:18
Jsem silně poznamenaný funkcionálním programováním a způsob ošetřování chyb v Go se mi extrémně nelíbí.

V žádném jazyce, co má rozumné součtové typy a pattern matching, jsem neviděl že by někdo vracel chyby tuplem. Ono to nedává smysl. Obvyke nechci vrátit hodnotu A chybu, ale hodnotu NEBO chybu. Go mě nutí aby každý typ měl nějakou defaultní/prázdnou/nesmyslnou hodnotu, kterou můžu vrátit v případě chyby, i když jinak není k ničemu a ani nedává smysl.

Až moc mi to připomíná Hoareho bilionový omyl.

Z Go mám nepříjemný pocit promrhaného potenciálu. Ten jazyk by mohl být o tolik lepší, kdyby jeho autoři (záměrně?) neignorovali skoro všechno "nové" kolem překladačů a jazyků.
Go nemá zrovna světobornou syntax, jeho síla je v runtimu (kanály a korutiny). Ale výjimky (stack unwinding) má, jen se jim říká jinak. A ano, součtové typy by to vyřešily, autoři zřejmě mají jiné priority. Ruku na srdce, kdo by chtěl psát síťové služby v Haskellu?
Název: Re:Jak efektivně studovat programování?
Přispěvatel: neregistrovany 27. 10. 2020, 23:08:25
Zmínil jsi skriptování. Na skriptování pro sysadminy ve windows asi budeš chtít použít powershell, na skriptování v linuxu bash, zsh ....

Proc ve Win doporucovat objektovy scripting a v Linuxu textovy? Ve Win bych urcite zatim neodepisoval cmd.exe, MS vyvratil spekulace ze bude s nastupem powershellu deprecated a potvrdil ze ho hodla v systemu drzet jeste desitky let (v nejakem pruzkumu jim vyslo ze cmd.exe je druhy nejpouzivanejsi vestaveny program Win, hned po web Browseru). Na trivialni veci je PS prilis slozity a cmd.exe se od WXP temer nezmenil, takze napsany script pujde prakticky spustit temer na jakekoliv Win masine na svete....
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 28. 10. 2020, 01:01:42
Jsem silně poznamenaný funkcionálním programováním a způsob ošetřování chyb v Go se mi extrémně nelíbí.

V žádném jazyce, co má rozumné součtové typy a pattern matching, jsem neviděl že by někdo vracel chyby tuplem. Ono to nedává smysl. Obvyke nechci vrátit hodnotu A chybu, ale hodnotu NEBO chybu. Go mě nutí aby každý typ měl nějakou defaultní/prázdnou/nesmyslnou hodnotu, kterou můžu vrátit v případě chyby, i když jinak není k ničemu a ani nedává smysl.

To je otázka zvyku a nedostatku představivosti.

Haskelliho Maybe/Either taky není jen hodnota. Vždycky vracíš dvojici. V Go to prostě udělali bez typu. Může se ti to nelíbit, může se mi to nelíbit, ale principielně je to prašť jak uhoď - v porovnání s výjimkama.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 28. 10. 2020, 01:09:54
- Výjimky byli vymyšleny, aby se dalo psát toto:
Kód: [Vybrat]
if (((countOfFilesIn(dir1) + countOfFilesIn(dir2)) / countOfFilesIn(dir3)) == 0) { ... }. Což bez nich prostě nejde.
Ve funkcionálních jazycích to jde ;) Akorát dá o dost víc práce pochopit, jak kód v takovém případě funguje.
Právě.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Idris 28. 10. 2020, 01:35:51
Jsem silně poznamenaný funkcionálním programováním a způsob ošetřování chyb v Go se mi extrémně nelíbí.

V žádném jazyce, co má rozumné součtové typy a pattern matching, jsem neviděl že by někdo vracel chyby tuplem. Ono to nedává smysl. Obvyke nechci vrátit hodnotu A chybu, ale hodnotu NEBO chybu. Go mě nutí aby každý typ měl nějakou defaultní/prázdnou/nesmyslnou hodnotu, kterou můžu vrátit v případě chyby, i když jinak není k ničemu a ani nedává smysl.
To je otázka zvyku a nedostatku představivosti.

Haskelliho Maybe/Either taky není jen hodnota. Vždycky vracíš dvojici. V Go to prostě udělali bez typu. Může se ti to nelíbit, může se mi to nelíbit, ale principielně je to prašť jak uhoď - v porovnání s výjimkama.
Zrovna Maybe/Either je implementačně to, co v Go interface{}, ale ono jde spíš o koncept. Ono ale není tak snadné rozumně spojit podtypový polymorfismus a generické typové operátory, mám čerstvou zkušenost s implementací a je to peklo, ten typový systém vždycky někde kulhá, není třeba sound, potřebuje podporu v runtimu apod. Po takové zkušenosti se člověk nediví, že v Javě je typový systém tak tupý, ono totiž každé jeho rozšíření přináší bolehlav.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Idris 28. 10. 2020, 01:36:35
- Výjimky byli vymyšleny, aby se dalo psát toto:
Kód: [Vybrat]
if (((countOfFilesIn(dir1) + countOfFilesIn(dir2)) / countOfFilesIn(dir3)) == 0) { ... }. Což bez nich prostě nejde.
Ve funkcionálních jazycích to jde ;) Akorát dá o dost víc práce pochopit, jak kód v takovém případě funguje.
Právě.
Ale stojí to za to :)
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 28. 10. 2020, 01:45:18
Jsem silně poznamenaný funkcionálním programováním a způsob ošetřování chyb v Go se mi extrémně nelíbí.

V žádném jazyce, co má rozumné součtové typy a pattern matching, jsem neviděl že by někdo vracel chyby tuplem. Ono to nedává smysl. Obvyke nechci vrátit hodnotu A chybu, ale hodnotu NEBO chybu. Go mě nutí aby každý typ měl nějakou defaultní/prázdnou/nesmyslnou hodnotu, kterou můžu vrátit v případě chyby, i když jinak není k ničemu a ani nedává smysl.
To je otázka zvyku a nedostatku představivosti.

Haskelliho Maybe/Either taky není jen hodnota. Vždycky vracíš dvojici. V Go to prostě udělali bez typu. Může se ti to nelíbit, může se mi to nelíbit, ale principielně je to prašť jak uhoď - v porovnání s výjimkama.
Zrovna Maybe/Either je implementačně to, co v Go interface{}, ale ono jde spíš o koncept. Ono ale není tak snadné rozumně spojit podtypový polymorfismus a generické typové operátory, mám čerstvou zkušenost s implementací a je to peklo, ten typový systém vždycky někde kulhá, není třeba sound, potřebuje podporu v runtimu apod. Po takové zkušenosti se člověk nediví, že v Javě je typový systém tak tupý, ono totiž každé jeho rozšíření přináší bolehlav.
Java je stará věc. Člověk to chápe.
Jenže pak vyšel C# a člověk se zděšením zjišťuje, že je to úplně stejná záležitost. V ničem není vidět ty desítky let zkušeností a vývoje.
A pak narazíš na kód a zjišťuješ, že i to C# je pro mnoho programátorů složité...

Jak velká práce by bylo v jazyce vyškrtnout null? A kolik zisku by to přineslo. Ale on ten problém je v tom vyškrtnout ho z hlavy programátorů.

Co třeba Kotlin dokonce Scala? Ty se s těmi typy IMHO poprali velice slušně.

- Výjimky byli vymyšleny, aby se dalo psát toto:
Kód: [Vybrat]
if (((countOfFilesIn(dir1) + countOfFilesIn(dir2)) / countOfFilesIn(dir3)) == 0) { ... }. Což bez nich prostě nejde.
Ve funkcionálních jazycích to jde ;) Akorát dá o dost víc práce pochopit, jak kód v takovém případě funguje.
Právě.
Ale stojí to za to :)
Proč myslíš?

Domníváš se, že Efekty nejsou lepší řešení takovýchto záležitostí? Nic nebrání, aby to bylo součástí signatury. Jen ta informace teče jinudy - cukr. Řekl bych.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Idris 28. 10. 2020, 02:18:52
Java je stará věc. Člověk to chápe.
Jenže pak vyšel C# a člověk se zděšením zjišťuje, že je to úplně stejná záležitost. V ničem není vidět ty desítky let zkušeností a vývoje.
A pak narazíš na kód a zjišťuješ, že i to C# je pro mnoho programátorů složité...

Jak velká práce by bylo v jazyce vyškrtnout null? A kolik zisku by to přineslo. Ale on ten problém je v tom vyškrtnout ho z hlavy programátorů.

Co třeba Kotlin dokonce Scala? Ty se s těmi typy IMHO poprali velice slušně.
Jo, Scala to má celkem rozumně, v rámci možností. V hlavách bych neškrtal, vždyť ten null se občas hodí. Uživatelsky nejlepší je sice mít typovou kontrolu, ale bez uvádění typů (plná inference), protože pak se jazyk tváří jako dynamický, ale zároveň je typově bezpečný. Většina moderních jazyků to tak do značné míry má. I to C# se snaží.

Skutečná lahůdka je typová inference pro generické typy, protože typové operátory jsou v podstatě takový Prolog a vše stojí a padá s unifikací. Byl by z toho pěkný kurz na VŠ pro všechny, kteří naříkají nad příliš teoretickou výukou tvorby překladačů :)
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Idris 28. 10. 2020, 02:27:03
Domníváš se, že Efekty nejsou lepší řešení takovýchto záležitostí? Nic nebrání, aby to bylo součástí signatury. Jen ta informace teče jinudy - cukr. Řekl bych.
Je to v podstatě to samé, prašť jako uhoď. A furt to je složité, běžný Franta to nepobere. V praxi je nejlepší co nejjednodušší jazyk, aby v něm nešla páchat zvěrstva :) FP je v podstatě pro fajnšmekry, kteří jsou schopní si napsat vlastní překladač, takže do detailu vědí, kudy v programu tečou data.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 28. 10. 2020, 02:33:21
V hlavách bych neškrtal, vždyť ten null se občas hodí.

Co se na tomto hodí? >:(
Kód: [Vybrat]
[TestMethod]
public void Test()
{
Print(null);
}

private void Print(Foo x)
{
System.Console.WriteLine(x.GetType());
}

Tohle beru:
Kód: [Vybrat]
[TestMethod]
public void Test()
{
Print(null);
}

private void Print(int? x)
{
if (x != null) {
System.Console.WriteLine(x.GetType());
}
}
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 28. 10. 2020, 02:38:59
Domníváš se, že Efekty nejsou lepší řešení takovýchto záležitostí? Nic nebrání, aby to bylo součástí signatury. Jen ta informace teče jinudy - cukr. Řekl bych.
Je to v podstatě to samé, prašť jako uhoď. A furt to je složité, běžný Franta to nepobere. V praxi je nejlepší co nejjednodušší jazyk, aby v něm nešla páchat zvěrstva :) FP je v podstatě pro fajnšmekry, kteří jsou schopní si napsat vlastní překladač, takže do detailu vědí, kudy v programu tečou data.

Já chci jazyk, který mě nepustí udělat chybu. Je mi jedno, zda to bude jednoduchostí, nebo díky AI.
Za druhé chci, aby když dělám něco špatně, tak abych to byl schopen z té chybovky pochopit ("no jo, text místo čísla, jasný").

Navrhnout jednoduchý jazyk je jednoduché (Lua, Python) - stačí vyrazit typy. Napsat jazyk, kterej mě bude hlídat, a přitom budu produktivní, to už je jinej kumšt (Rust).
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Idris 28. 10. 2020, 02:50:23
V hlavách bych neškrtal, vždyť ten null se občas hodí.

Co se na tomto hodí? >:(
Kód: [Vybrat]
[TestMethod]
public void Test()
{
Print(null);
}

private void Print(Foo x)
{
System.Console.WriteLine(x.GetType());
}

Tohle beru:
Kód: [Vybrat]
[TestMethod]
public void Test()
{
Print(null);
}

private void Print(int? x)
{
if (x != null) {
System.Console.WriteLine(x.GetType());
}
}
Ber to jako v ObjC, null je taky jen objekt a má své metody ;) Tam se teda jmenuje nil.

Tenhle kiks jde samozřejmě ošetřit jen za běhu, ale ten druhý kód je v podstatě to, o čem jsem psal. Čili asi se shodneme.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Idris 28. 10. 2020, 02:53:47
Domníváš se, že Efekty nejsou lepší řešení takovýchto záležitostí? Nic nebrání, aby to bylo součástí signatury. Jen ta informace teče jinudy - cukr. Řekl bych.
Je to v podstatě to samé, prašť jako uhoď. A furt to je složité, běžný Franta to nepobere. V praxi je nejlepší co nejjednodušší jazyk, aby v něm nešla páchat zvěrstva :) FP je v podstatě pro fajnšmekry, kteří jsou schopní si napsat vlastní překladač, takže do detailu vědí, kudy v programu tečou data.

Já chci jazyk, který mě nepustí udělat chybu. Je mi jedno, zda to bude jednoduchostí, nebo díky AI.
Za druhé chci, aby když dělám něco špatně, tak abych to byl schopen z té chybovky pochopit ("no jo, text místo čísla, jasný").

Navrhnout jednoduchý jazyk je jednoduché (Lua, Python) - stačí vyrazit typy. Napsat jazyk, kterej mě bude hlídat, a přitom budu produktivní, to už je jinej kumšt (Rust).
Ten Rust to ale splňuje, tak kde je problém? Ono i moderní C++ (C++20) je na tom podobně. Na neexistenci rozumného jazyka bych si nestěžoval.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 28. 10. 2020, 02:59:06
Domníváš se, že Efekty nejsou lepší řešení takovýchto záležitostí? Nic nebrání, aby to bylo součástí signatury. Jen ta informace teče jinudy - cukr. Řekl bych.
Je to v podstatě to samé, prašť jako uhoď. A furt to je složité, běžný Franta to nepobere. V praxi je nejlepší co nejjednodušší jazyk, aby v něm nešla páchat zvěrstva :) FP je v podstatě pro fajnšmekry, kteří jsou schopní si napsat vlastní překladač, takže do detailu vědí, kudy v programu tečou data.

Já chci jazyk, který mě nepustí udělat chybu. Je mi jedno, zda to bude jednoduchostí, nebo díky AI.
Za druhé chci, aby když dělám něco špatně, tak abych to byl schopen z té chybovky pochopit ("no jo, text místo čísla, jasný").

Navrhnout jednoduchý jazyk je jednoduché (Lua, Python) - stačí vyrazit typy. Napsat jazyk, kterej mě bude hlídat, a přitom budu produktivní, to už je jinej kumšt (Rust).
Ten Rust to ale splňuje, tak kde je problém? Ono i moderní C++ (C++20) je na tom podobně. Na neexistenci rozumného jazyka bych si nestěžoval.

Rust jsem uváděl jako příklad jazyka s hezkými chybovkami, ale výjimky nemá. A já jsem se z počátečního nadšením nad Maybe/Result vystřízlivěl zase zpět k výjimkám.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Ink 28. 10. 2020, 08:54:42
Rust jsem uváděl jako příklad jazyka s hezkými chybovkami, ale výjimky nemá. A já jsem se z počátečního nadšením nad Maybe/Result vystřízlivěl zase zpět k výjimkám.

Asi jsi chtěl napsat Either/Result. Co přesně Tě vedlo k "vystřízlivění"? Na ergonomii práce s Result (Error) se udělal kus práce - viz třeba crate anohow.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Ink 28. 10. 2020, 09:21:15
Rust jsem uváděl jako příklad jazyka s hezkými chybovkami, ale výjimky nemá. A já jsem se z počátečního nadšením nad Maybe/Result vystřízlivěl zase zpět k výjimkám.

Asi jsi chtěl napsat Either/Result. Co přesně Tě vedlo k "vystřízlivění"? Na ergonomii práce s Result (Error) se udělal kus práce - viz třeba crate anohow.

Sorry, anyhow to mělo být: https://docs.rs/anyhow/1.0.33/anyhow/
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Jiří Havel 28. 10. 2020, 12:25:26
Haskelliho Maybe/Either taky není jen hodnota. Vždycky vracíš dvojici.
Jedna věc je jak je to interně udělané a druhá jak se to používá. U Maybe/Either o tom nemusím uvažovat jako o dvojici. A nemám šanci tu interní dvojici nějak rozdrbat.

Neděláme vlastně všechno zapouzdření právě proto, abychom se tím interním stavem nemuseli zabývat?
V hlavách bych neškrtal, vždyť ten null se občas hodí.
A to je IMO ta esence toho bilionového omylu. Null se hodí občas, ne vždycky. Pro občasné použití se daleko líp hodí věcí jako optional, Maybe a jim podobné. Problém je, pokud ten null není ani opt out.

Každý nesmyslný ale reprezentovatelný stav musím řešit na každé úrovni, kde nemám pod kontrolou vstupy. A když je toho opravdu hodně jako těch nullů, tak je takřka jisté že někdo něco zapomene nebo se na to vykašle.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 28. 10. 2020, 15:53:40
Rust jsem uváděl jako příklad jazyka s hezkými chybovkami, ale výjimky nemá. A já jsem se z počátečního nadšením nad Maybe/Result vystřízlivěl zase zpět k výjimkám.

Asi jsi chtěl napsat Either/Result. Co přesně Tě vedlo k "vystřízlivění"? Na ergonomii práce s Result (Error) se udělal kus práce - viz třeba crate anohow.
Zde jsem možná nedovzdělán. Jak by si přepsal následující kód:
Kód: [Vybrat]
if (((countOfFilesIn(dir1) + countOfFilesIn(dir2)) / countOfFilesIn(dir3)) == 0) { ... }Dělení nulou, špatná cesta, odmítnuté právo pro čtení z adresáře.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Ink 28. 10. 2020, 17:17:06
Rust jsem uváděl jako příklad jazyka s hezkými chybovkami, ale výjimky nemá. A já jsem se z počátečního nadšením nad Maybe/Result vystřízlivěl zase zpět k výjimkám.

Asi jsi chtěl napsat Either/Result. Co přesně Tě vedlo k "vystřízlivění"? Na ergonomii práce s Result (Error) se udělal kus práce - viz třeba crate anohow.
Zde jsem možná nedovzdělán. Jak by si přepsal následující kód:
Kód: [Vybrat]
if (((countOfFilesIn(dir1) + countOfFilesIn(dir2)) / countOfFilesIn(dir3)) == 0) { ... }Dělení nulou, špatná cesta, odmítnuté právo pro čtení z adresáře.

Podle vkusu každého soudruha, třeba takhle nějak:

Kód: [Vybrat]
use std::fs::read_dir;
use anyhow::{anyhow, Result, Context};
use std::path::Path;

fn count_of_files(path: &str) -> Result<usize> {
    let dirs = read_dir(path)?;
    Ok(dirs.count())
}

fn safe_divide(dividend: usize, divisor: usize) -> Result<usize> {
  if divisor == 0 {
    Err(anyhow!("Zero divisor, check it dude"))
  } else {
    Ok(dividend / divisor)
  }
}

fn hausnumero(first: usize, second: usize, third: usize) -> Result<usize> {
    safe_divide(first + second, third)
}


fn main() -> Result<()>{
    let hausn: usize = hausnumero(count_of_files("AAA").context("First dir")?,
                                  count_of_files("BBB").context("Second dir")?,
                                  count_of_files("CCC").context("Third dir")?)?;
    println!("Result: {}", hausn);
    Ok(())
}
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Ink 28. 10. 2020, 17:29:11
Podle vkusu každého soudruha, třeba takhle nějak:

Kód: [Vybrat]

Přesněji teda ale:

Kód: [Vybrat]
    if safe_divide(count_of_files("/etc")? + count_of_files("/home")?, count_of_files("/tmp")?)? == 0 {
    }
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 28. 10. 2020, 18:00:32
Podle vkusu každého soudruha, třeba takhle nějak:

Kód: [Vybrat]

Přesněji teda ale:

Kód: [Vybrat]
    if safe_divide(count_of_files("/etc")? + count_of_files("/home")?, count_of_files("/tmp")?)? == 0 {
    }

Tak tohle už se dá číst. Ale obávám se, že ty otazníčky jen zabrání chcípnutí. Jaká chyba a podrobnosti z toho vytáhnout nejde, že?

Kód: [Vybrat]
fn main() -> Result<()>{
    let hausn: usize = hausnumero(count_of_files("AAA").context("First dir")?,
                                  count_of_files("BBB").context("Second dir")?,
                                  count_of_files("CCC").context("Third dir")?)?;
    println!("Result: {}", hausn);
    Ok(())
}
No jo no, to už jsou ale zase ty monády. A ani to není moc hezký.

Já vím, že se dá ten Result zabalit do funkce, která to celé zpracuje jako výraz a sama vrátí Result. V principu je to pak jako try-catch. Ale není to hezké, a je to dost matoucí. Zatím mě přijde, že když to umí jazyk, že je to takové šikovnější. Ale kritika výjimek mě zajímá. Idris zmínil, že je pak těžší zajistit typovou bezpečnost, ok.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 28. 10. 2020, 18:17:15
No jo no, to už jsou ale zase ty monády. A ani to není moc hezký.

Možná, abych se lépe vyjádřil:

Rozhodně očekávám, že když mi kompilátor přeloží kód, tak že mi zajistí, že všechny chybové stavy jsou pokryty. Což pochopitelně Result splňuje.

Jenže stejně jako od jazyka očekávám, že si validitu vstupů nebudu hlídat sám, ale že mi to bude hlídat jazyk - třeba pomocí typů; tak stejnou logikou očekávám, že mi jazyk usnadní práci s chybami. A ne, že si to budu řešit sám pomocí jiných konstruktů jazyka.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Ink 28. 10. 2020, 18:55:10
No jo no, to už jsou ale zase ty monády. A ani to není moc hezký.

Možná, abych se lépe vyjádřil:

Rozhodně očekávám, že když mi kompilátor přeloží kód, tak že mi zajistí, že všechny chybové stavy jsou pokryty. Což pochopitelně Result splňuje.

Jenže stejně jako od jazyka očekávám, že si validitu vstupů nebudu hlídat sám, ale že mi to bude hlídat jazyk - třeba pomocí typů; tak stejnou logikou očekávám, že mi jazyk usnadní práci s chybami. A ne, že si to budu řešit sám pomocí jiných konstruktů jazyka.

Pořád moc nerozumím. Rust se rozhodl, že ošetření chyb bude dělat pomocí složených typů. Určitě je možné, že práce s nimi může být náročnější, než třeba použití try-catch, ale oč je - v principu - horší řešení pomocí typového systému, než je (poměrně násilný, řekněme) způsob pomocí výjimek?

Rust transformuje data, je třeba si podle toho strukturovat aplikaci. Těch způsobů, jak řešit vícero Error typů na jednom místě je více - třeba pomocí wrapperů. Je s tím zase nějaká práce, nemyslím, že to je tak zlé. Je to jako se vším v Rustu nebo jinde. Musíš tancovat s tím, co má v repertoáru a ne si chtít dělat svoje pogo, když se jede lambada.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Jiří Havel 28. 10. 2020, 20:11:33
Ale kritika výjimek mě zajímá. Idris zmínil, že je pak těžší zajistit typovou bezpečnost, ok.
Jestli tě zajímá kritika výjimek, tak bych měl i další drobnost.

Výjimky IMO oddělují tu standardní a nestandardní cestu až moc dokonale. Jeden extrém je manuální ošetřování chyb furt dokola. Druhý extrém ale je, když při čtení kódu netuším, kde to může a nemůže vyletět.
Pokud může házet úplně všechno, pak se dost blbě udržujou invarianty objektů. Daleko lepší je házející kus a pak commit co nic házet nesmí. Při čtení kódu ale jednoduše nepoznám, kde zrovna jsem.

V tomhle se mi hrozně líbila jedna z posledních přednášek Herba Suttera - jen označit řádky (nebo možná celý blok) co můžou házet a bude se to propagovat nahoru. Překladač by pak mohl zkontrolovat že ty neoznačené kusy házet nemůžou. Tohle by mi přišlo jako rozumný kompromis. Propagace by byla automatická, ale při čtení by bylo vidět, odkud to může lítat.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Idris 28. 10. 2020, 20:22:37
V tomhle se mi hrozně líbila jedna z posledních přednášek Herba Suttera - jen označit řádky (nebo možná celý blok) co můžou házet a bude se to propagovat nahoru. Překladač by pak mohl zkontrolovat že ty neoznačené kusy házet nemůžou. Tohle by mi přišlo jako rozumný kompromis. Propagace by byla automatická, ale při čtení by bylo vidět, odkud to může lítat.
Takhle to má Swift a musím přiznat, že mě to příjemně překvapilo.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 28. 10. 2020, 23:28:44
No jo no, to už jsou ale zase ty monády. A ani to není moc hezký.

Možná, abych se lépe vyjádřil:

Rozhodně očekávám, že když mi kompilátor přeloží kód, tak že mi zajistí, že všechny chybové stavy jsou pokryty. Což pochopitelně Result splňuje.

Jenže stejně jako od jazyka očekávám, že si validitu vstupů nebudu hlídat sám, ale že mi to bude hlídat jazyk - třeba pomocí typů; tak stejnou logikou očekávám, že mi jazyk usnadní práci s chybami. A ne, že si to budu řešit sám pomocí jiných konstruktů jazyka.

Pořád moc nerozumím. Rust se rozhodl, že ošetření chyb bude dělat pomocí složených typů. Určitě je možné, že práce s nimi může být náročnější, než třeba použití try-catch, ale oč je - v principu - horší řešení pomocí typového systému, než je (poměrně násilný, řekněme) způsob pomocí výjimek?

Rust transformuje data, je třeba si podle toho strukturovat aplikaci. Těch způsobů, jak řešit vícero Error typů na jednom místě je více - třeba pomocí wrapperů. Je s tím zase nějaká práce, nemyslím, že to je tak zlé. Je to jako se vším v Rustu nebo jinde. Musíš tancovat s tím, co má v repertoáru a ne si chtít dělat svoje pogo, když se jede lambada.

Já ale nekritizuju Rust. Rust je skvělej jazyk a mám ho moc rád.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 28. 10. 2020, 23:35:13
Ale kritika výjimek mě zajímá. Idris zmínil, že je pak těžší zajistit typovou bezpečnost, ok.
Jestli tě zajímá kritika výjimek, tak bych měl i další drobnost.

Výjimky IMO oddělují tu standardní a nestandardní cestu až moc dokonale. Jeden extrém je manuální ošetřování chyb furt dokola. Druhý extrém ale je, když při čtení kódu netuším, kde to může a nemůže vyletět.
OK, to beru. Tak v prvé řadě skutečnost, že nemusím odchytit potenciální chybu, a mohu ji bezmyšlenkovitě přenechat volajícímu, to je moc špatné. (Checked versus unchecked exceptions v javě.) Řekl bych, že tohle dělá hodně. I když to možná jde ještě líp, jak zmiňuješ tu přednášku.

Pokud může házet úplně všechno, pak se dost blbě udržujou invarianty objektů. Daleko lepší je házející kus a pak commit co nic házet nesmí. Při čtení kódu ale jednoduše nepoznám, kde zrovna jsem.
Můžeš to prosím rozvést?
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Jiří Havel 29. 10. 2020, 08:38:02
Pokud může házet úplně všechno, pak se dost blbě udržujou invarianty objektů. Daleko lepší je házející kus a pak commit co nic házet nesmí. Při čtení kódu ale jednoduše nepoznám, kde zrovna jsem.
Můžeš to prosím rozvést?
Myslel jsem konkrétně "strong exception safety". Takže operace buď projde, nebo se komplet rollbackne. To se obvykle dělá tak, že se spočítá celý nový stav a ten se pak swapne s tím starým. Výpočet nového stavu může házet podle libosti, ale swap nesmí. A teď jak zaručit že nic v tom swapu nehází.

Pokud může házet cokoliv, tak se dá maximálně dosáhnout "basic exception safety". Takže po vyhození výjimky nic neleakuje, ale stav je nějak změněný a musím si ho nějak vyresetovat. Jo, invarianty jednotlivých objektů jsou obvykle ok. To jsem napsal trochu blbě. Myslel jsem spíš něco jako návrat programu do stavu před (high level) operací, co tu výjimku vyhodila.

Takže problém je v tom, že potřebuju bloky kódu o kterých si můžu být jistý že nehází. Můžu zkontrolovat jednotlivé funkce a ověřit podle typu nebo dokumentace. Ale tuhle tupou mechanickou činnost bych rád nějak přehodil na překladač. Navíc to není při letmém čtení kódu nijak vidět. Můžu přidat komentář, který kus nehází, ale ten co do toho bude koukat po mně stejně neví, jestli tomu komentáři může věřit.
Ani checked exceptions to zas tak moc neřeší. U nich vím co může z funkce lítat, ale pokud chci vědět i odkud, tak musím hledat.

Zrovna chyby jsou místo, kde je pomoc překladače obzvlášť potřeba. Protože řešení chyb a nestandardních situací je vždycky ten nejmíň otestovaný a nejvíc zabugovaný kus projektu. A to díky tomu, že jsou ty situace vzácné.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 31. 10. 2020, 21:21:36
Pokud může házet úplně všechno, pak se dost blbě udržujou invarianty objektů. Daleko lepší je házející kus a pak commit co nic házet nesmí. Při čtení kódu ale jednoduše nepoznám, kde zrovna jsem.
Můžeš to prosím rozvést?
Myslel jsem konkrétně "strong exception safety". Takže operace buď projde, nebo se komplet rollbackne. To se obvykle dělá tak, že se spočítá celý nový stav a ten se pak swapne s tím starým. Výpočet nového stavu může házet podle libosti, ale swap nesmí. A teď jak zaručit že nic v tom swapu nehází.

Pokud může házet cokoliv, tak se dá maximálně dosáhnout "basic exception safety". Takže po vyhození výjimky nic neleakuje, ale stav je nějak změněný a musím si ho nějak vyresetovat. Jo, invarianty jednotlivých objektů jsou obvykle ok. To jsem napsal trochu blbě. Myslel jsem spíš něco jako návrat programu do stavu před (high level) operací, co tu výjimku vyhodila.

Takže problém je v tom, že potřebuju bloky kódu o kterých si můžu být jistý že nehází. Můžu zkontrolovat jednotlivé funkce a ověřit podle typu nebo dokumentace. Ale tuhle tupou mechanickou činnost bych rád nějak přehodil na překladač. Navíc to není při letmém čtení kódu nijak vidět. Můžu přidat komentář, který kus nehází, ale ten co do toho bude koukat po mně stejně neví, jestli tomu komentáři může věřit.
Ani checked exceptions to zas tak moc neřeší. U nich vím co může z funkce lítat, ale pokud chci vědět i odkud, tak musím hledat.

Zrovna chyby jsou místo, kde je pomoc překladače obzvlášť potřeba. Protože řešení chyb a nestandardních situací je vždycky ten nejmíň otestovaný a nejvíc zabugovaný kus projektu. A to díky tomu, že jsou ty situace vzácné.

Děkuji za příspěvek.

Na jednu stranu je to co píšeš dost inspirativní. Na druhou stranu si nejsem úplně jist, zda tě dobře chápu.

Cítím v tvém popisu defer z Go. Taky mi přijde, že mluvíš vlastně o určité podobě transakcí - kód změní stav, a pokud vznikne chyba, tak se vrátí původní stav. Je to to co myslíš? Jak se práce se stavem promítne do věcí jako side effects (zapisování do souboru, posílání emailu)? Nechtěl by si napsat nějakou ukázku kódu, jak by to mělo fugovat?

To co popisuješ, existuje to v nějakém jazyce, nebo je to jen studie/úvaha?

Dělal jsem si jednu studii, kdy jsem měl jazyk, který si jednak hlídal při kompilaci, zda jsou všechny scénáře pokryty, zda nemůže dojít k nějaké neošetřené chybě. A dále si při každém spuštění apky kontroloval, zda jsou dostupné externí závislosti (nainstalované knihovny, dostupné externí rutiny/binárky, dostupnost k databázi, filesystému). Čímž jsem chtěl zajistit, aby vlastní běh té aplikace nemohl selhat.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Jiří Havel 01. 11. 2020, 16:15:00
Děkuji za příspěvek.

Na jednu stranu je to co píšeš dost inspirativní. Na druhou stranu si nejsem úplně jist, zda tě dobře chápu.

Cítím v tvém popisu defer z Go. Taky mi přijde, že mluvíš vlastně o určité podobě transakcí - kód změní stav, a pokud vznikne chyba, tak se vrátí původní stav. Je to to co myslíš? Jak se práce se stavem promítne do věcí jako side effects (zapisování do souboru, posílání emailu)? Nechtěl by si napsat nějakou ukázku kódu, jak by to mělo fugovat?

To co popisuješ, existuje to v nějakém jazyce, nebo je to jen studie/úvaha?

Dělal jsem si jednu studii, kdy jsem měl jazyk, který si jednak hlídal při kompilaci, zda jsou všechny scénáře pokryty, zda nemůže dojít k nějaké neošetřené chybě. A dále si při každém spuštění apky kontroloval, zda jsou dostupné externí závislosti (nainstalované knihovny, dostupné externí rutiny/binárky, dostupnost k databázi, filesystému). Čímž jsem chtěl zajistit, aby vlastní běh té aplikace nemohl selhat.
Jestli by měl z mého příspěvku být cítit nějaký jazyk, tak C++. O exception safety se primárně mluví právě v souvislosti s c++ i když je to obecnější koncept. Ale právě v c++ je tohle uvažování vcelku běžné. Strong exception safety jsou transakce, jen se neřeší atomičnost z pohledu jiných vláken.

Zápis do souboru jako transakce je myslím poměrně známý postup :
- Vytvořím pomocný soubor zapíšu ho a flushnu na disk. Pokud tohle selže, pak je původní soubor stále netknutý.
- Přejmenuju pomocný soubor. Pokud má tahle operace strong exception safety, pak ji bude mít i celý zápis souboru.

A stejně se dá uvažovat i o jednotlivých objektech programu. Např při přidávání do dynamického pole mi může selhat alokace, nebo kopírování nějakého objektu. Takže alokuju nový kus paměti, všechno do něj nakopíruju a nakonec swapnu odkaz na nový blok paměti.

Obecně pokud mám swap, který dokáže prohodit vnitřnosti objektů bez možných výjimek, pak se na tom dá stavět transakční chování pro větší a větší bloky programu. A dobrým zvykem je, pokud je to možné, dávat vlastním objektům rozumný swap který jen prohodí ukazatele a nemůže házet.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 01. 11. 2020, 20:48:58
Děkuji za příspěvek.

Na jednu stranu je to co píšeš dost inspirativní. Na druhou stranu si nejsem úplně jist, zda tě dobře chápu.

Cítím v tvém popisu defer z Go. Taky mi přijde, že mluvíš vlastně o určité podobě transakcí - kód změní stav, a pokud vznikne chyba, tak se vrátí původní stav. Je to to co myslíš? Jak se práce se stavem promítne do věcí jako side effects (zapisování do souboru, posílání emailu)? Nechtěl by si napsat nějakou ukázku kódu, jak by to mělo fugovat?

To co popisuješ, existuje to v nějakém jazyce, nebo je to jen studie/úvaha?

Dělal jsem si jednu studii, kdy jsem měl jazyk, který si jednak hlídal při kompilaci, zda jsou všechny scénáře pokryty, zda nemůže dojít k nějaké neošetřené chybě. A dále si při každém spuštění apky kontroloval, zda jsou dostupné externí závislosti (nainstalované knihovny, dostupné externí rutiny/binárky, dostupnost k databázi, filesystému). Čímž jsem chtěl zajistit, aby vlastní běh té aplikace nemohl selhat.
Jestli by měl z mého příspěvku být cítit nějaký jazyk, tak C++. O exception safety se primárně mluví právě v souvislosti s c++ i když je to obecnější koncept. Ale právě v c++ je tohle uvažování vcelku běžné. Strong exception safety jsou transakce, jen se neřeší atomičnost z pohledu jiných vláken.

Zápis do souboru jako transakce je myslím poměrně známý postup :
- Vytvořím pomocný soubor zapíšu ho a flushnu na disk. Pokud tohle selže, pak je původní soubor stále netknutý.
- Přejmenuju pomocný soubor. Pokud má tahle operace strong exception safety, pak ji bude mít i celý zápis souboru.

A stejně se dá uvažovat i o jednotlivých objektech programu. Např při přidávání do dynamického pole mi může selhat alokace, nebo kopírování nějakého objektu. Takže alokuju nový kus paměti, všechno do něj nakopíruju a nakonec swapnu odkaz na nový blok paměti.

Obecně pokud mám swap, který dokáže prohodit vnitřnosti objektů bez možných výjimek, pak se na tom dá stavět transakční chování pro větší a větší bloky programu. A dobrým zvykem je, pokud je to možné, dávat vlastním objektům rozumný swap který jen prohodí ukazatele a nemůže házet.

Takže jsi myslel trasakčnost na úrovni jazyka a to včetně externích závislostí. Zajímavé.

Jak by vypadala syntaxe?
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Idris 01. 11. 2020, 21:23:58
Děkuji za příspěvek.

Na jednu stranu je to co píšeš dost inspirativní. Na druhou stranu si nejsem úplně jist, zda tě dobře chápu.

Cítím v tvém popisu defer z Go. Taky mi přijde, že mluvíš vlastně o určité podobě transakcí - kód změní stav, a pokud vznikne chyba, tak se vrátí původní stav. Je to to co myslíš? Jak se práce se stavem promítne do věcí jako side effects (zapisování do souboru, posílání emailu)? Nechtěl by si napsat nějakou ukázku kódu, jak by to mělo fugovat?

To co popisuješ, existuje to v nějakém jazyce, nebo je to jen studie/úvaha?

Dělal jsem si jednu studii, kdy jsem měl jazyk, který si jednak hlídal při kompilaci, zda jsou všechny scénáře pokryty, zda nemůže dojít k nějaké neošetřené chybě. A dále si při každém spuštění apky kontroloval, zda jsou dostupné externí závislosti (nainstalované knihovny, dostupné externí rutiny/binárky, dostupnost k databázi, filesystému). Čímž jsem chtěl zajistit, aby vlastní běh té aplikace nemohl selhat.
Jestli by měl z mého příspěvku být cítit nějaký jazyk, tak C++. O exception safety se primárně mluví právě v souvislosti s c++ i když je to obecnější koncept. Ale právě v c++ je tohle uvažování vcelku běžné. Strong exception safety jsou transakce, jen se neřeší atomičnost z pohledu jiných vláken.

Zápis do souboru jako transakce je myslím poměrně známý postup :
- Vytvořím pomocný soubor zapíšu ho a flushnu na disk. Pokud tohle selže, pak je původní soubor stále netknutý.
- Přejmenuju pomocný soubor. Pokud má tahle operace strong exception safety, pak ji bude mít i celý zápis souboru.

A stejně se dá uvažovat i o jednotlivých objektech programu. Např při přidávání do dynamického pole mi může selhat alokace, nebo kopírování nějakého objektu. Takže alokuju nový kus paměti, všechno do něj nakopíruju a nakonec swapnu odkaz na nový blok paměti.

Obecně pokud mám swap, který dokáže prohodit vnitřnosti objektů bez možných výjimek, pak se na tom dá stavět transakční chování pro větší a větší bloky programu. A dobrým zvykem je, pokud je to možné, dávat vlastním objektům rozumný swap který jen prohodí ukazatele a nemůže házet.
Takže jsi myslel trasakčnost na úrovni jazyka a to včetně externích závislostí. Zajímavé.
Zajímavé je, jak by se něco takového provedlo v čistě funkcionálním kódu.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 02. 11. 2020, 01:03:28
Děkuji za příspěvek.

Na jednu stranu je to co píšeš dost inspirativní. Na druhou stranu si nejsem úplně jist, zda tě dobře chápu.

Cítím v tvém popisu defer z Go. Taky mi přijde, že mluvíš vlastně o určité podobě transakcí - kód změní stav, a pokud vznikne chyba, tak se vrátí původní stav. Je to to co myslíš? Jak se práce se stavem promítne do věcí jako side effects (zapisování do souboru, posílání emailu)? Nechtěl by si napsat nějakou ukázku kódu, jak by to mělo fugovat?

To co popisuješ, existuje to v nějakém jazyce, nebo je to jen studie/úvaha?

Dělal jsem si jednu studii, kdy jsem měl jazyk, který si jednak hlídal při kompilaci, zda jsou všechny scénáře pokryty, zda nemůže dojít k nějaké neošetřené chybě. A dále si při každém spuštění apky kontroloval, zda jsou dostupné externí závislosti (nainstalované knihovny, dostupné externí rutiny/binárky, dostupnost k databázi, filesystému). Čímž jsem chtěl zajistit, aby vlastní běh té aplikace nemohl selhat.
Jestli by měl z mého příspěvku být cítit nějaký jazyk, tak C++. O exception safety se primárně mluví právě v souvislosti s c++ i když je to obecnější koncept. Ale právě v c++ je tohle uvažování vcelku běžné. Strong exception safety jsou transakce, jen se neřeší atomičnost z pohledu jiných vláken.

Zápis do souboru jako transakce je myslím poměrně známý postup :
- Vytvořím pomocný soubor zapíšu ho a flushnu na disk. Pokud tohle selže, pak je původní soubor stále netknutý.
- Přejmenuju pomocný soubor. Pokud má tahle operace strong exception safety, pak ji bude mít i celý zápis souboru.

A stejně se dá uvažovat i o jednotlivých objektech programu. Např při přidávání do dynamického pole mi může selhat alokace, nebo kopírování nějakého objektu. Takže alokuju nový kus paměti, všechno do něj nakopíruju a nakonec swapnu odkaz na nový blok paměti.

Obecně pokud mám swap, který dokáže prohodit vnitřnosti objektů bez možných výjimek, pak se na tom dá stavět transakční chování pro větší a větší bloky programu. A dobrým zvykem je, pokud je to možné, dávat vlastním objektům rozumný swap který jen prohodí ukazatele a nemůže házet.
Takže jsi myslel trasakčnost na úrovni jazyka a to včetně externích závislostí. Zajímavé.
Zajímavé je, jak by se něco takového provedlo v čistě funkcionálním kódu.

To mi moc zajímavé nepřijde. Funkcionální kód nemá efekty. Tudíž transakce je jednoduchá - zahodit ;-) (Tady trochu provokuju.)
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Ink 02. 11. 2020, 08:05:45
Takže jsi myslel trasakčnost na úrovni jazyka a to včetně externích závislostí. Zajímavé.

Zajímavé je, jak by se něco takového provedlo v čistě funkcionálním kódu.

To mi moc zajímavé nepřijde. Funkcionální kód nemá efekty. Tudíž transakce je jednoduchá - zahodit ;-) (Tady trochu provokuju.)

No podle mě zas tak ne. Třeba v Haskellu je kód s efekty oddělený od kódu bez efektů. Takže by, teoreticky, napřed došlo k výpočtu finálního stavu a pokud by výpočet prošel, došlo by k jeho zápisu. Že by ten zápis byl chráněn transakcí, je jasné, ale to už by si ta low level část systému musela pohlídat sama...
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Idris 02. 11. 2020, 09:08:36
Děkuji za příspěvek.

Na jednu stranu je to co píšeš dost inspirativní. Na druhou stranu si nejsem úplně jist, zda tě dobře chápu.

Cítím v tvém popisu defer z Go. Taky mi přijde, že mluvíš vlastně o určité podobě transakcí - kód změní stav, a pokud vznikne chyba, tak se vrátí původní stav. Je to to co myslíš? Jak se práce se stavem promítne do věcí jako side effects (zapisování do souboru, posílání emailu)? Nechtěl by si napsat nějakou ukázku kódu, jak by to mělo fugovat?

To co popisuješ, existuje to v nějakém jazyce, nebo je to jen studie/úvaha?

Dělal jsem si jednu studii, kdy jsem měl jazyk, který si jednak hlídal při kompilaci, zda jsou všechny scénáře pokryty, zda nemůže dojít k nějaké neošetřené chybě. A dále si při každém spuštění apky kontroloval, zda jsou dostupné externí závislosti (nainstalované knihovny, dostupné externí rutiny/binárky, dostupnost k databázi, filesystému). Čímž jsem chtěl zajistit, aby vlastní běh té aplikace nemohl selhat.
Jestli by měl z mého příspěvku být cítit nějaký jazyk, tak C++. O exception safety se primárně mluví právě v souvislosti s c++ i když je to obecnější koncept. Ale právě v c++ je tohle uvažování vcelku běžné. Strong exception safety jsou transakce, jen se neřeší atomičnost z pohledu jiných vláken.

Zápis do souboru jako transakce je myslím poměrně známý postup :
- Vytvořím pomocný soubor zapíšu ho a flushnu na disk. Pokud tohle selže, pak je původní soubor stále netknutý.
- Přejmenuju pomocný soubor. Pokud má tahle operace strong exception safety, pak ji bude mít i celý zápis souboru.

A stejně se dá uvažovat i o jednotlivých objektech programu. Např při přidávání do dynamického pole mi může selhat alokace, nebo kopírování nějakého objektu. Takže alokuju nový kus paměti, všechno do něj nakopíruju a nakonec swapnu odkaz na nový blok paměti.

Obecně pokud mám swap, který dokáže prohodit vnitřnosti objektů bez možných výjimek, pak se na tom dá stavět transakční chování pro větší a větší bloky programu. A dobrým zvykem je, pokud je to možné, dávat vlastním objektům rozumný swap který jen prohodí ukazatele a nemůže házet.
Takže jsi myslel trasakčnost na úrovni jazyka a to včetně externích závislostí. Zajímavé.
Zajímavé je, jak by se něco takového provedlo v čistě funkcionálním kódu.
To mi moc zajímavé nepřijde. Funkcionální kód nemá efekty. Tudíž transakce je jednoduchá - zahodit ;-) (Tady trochu provokuju.)
Přesně to jsem myslel :)
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Idris 02. 11. 2020, 09:12:38
Takže jsi myslel trasakčnost na úrovni jazyka a to včetně externích závislostí. Zajímavé.

Zajímavé je, jak by se něco takového provedlo v čistě funkcionálním kódu.

To mi moc zajímavé nepřijde. Funkcionální kód nemá efekty. Tudíž transakce je jednoduchá - zahodit ;-) (Tady trochu provokuju.)
No podle mě zas tak ne. Třeba v Haskellu je kód s efekty oddělený od kódu bez efektů. Takže by, teoreticky, napřed došlo k výpočtu finálního stavu a pokud by výpočet prošel, došlo by k jeho zápisu. Že by ten zápis byl chráněn transakcí, je jasné, ale to už by si ta low level část systému musela pohlídat sama...
To “zahodit” znamená, že výpočet se v monádě dostane na vedlejší kolej. Ten kód oddělený není, jen pracuje v rámci složitějšího typového systému. BoneFlute má pravdu, že to je v podstatě zdarma.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Ink 02. 11. 2020, 10:07:11
Takže jsi myslel trasakčnost na úrovni jazyka a to včetně externích závislostí. Zajímavé.

Zajímavé je, jak by se něco takového provedlo v čistě funkcionálním kódu.

To mi moc zajímavé nepřijde. Funkcionální kód nemá efekty. Tudíž transakce je jednoduchá - zahodit ;-) (Tady trochu provokuju.)
No podle mě zas tak ne. Třeba v Haskellu je kód s efekty oddělený od kódu bez efektů. Takže by, teoreticky, napřed došlo k výpočtu finálního stavu a pokud by výpočet prošel, došlo by k jeho zápisu. Že by ten zápis byl chráněn transakcí, je jasné, ale to už by si ta low level část systému musela pohlídat sama...
To “zahodit” znamená, že výpočet se v monádě dostane na vedlejší kolej. Ten kód oddělený není, jen pracuje v rámci složitějšího typového systému. BoneFlute má pravdu, že to je v podstatě zdarma.

Však já polemizuju pouze s tím "Tady trochu provokuju". "kód oddělený není, jen pracuje v rámci složitějšího typového systému" - není to slovíčkaření? Prostě se ví, která funkce má efekty a která ne a dokud se výpočet dělá v bezefektové funkci, víme, že výsledek se může zahodit.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Idris 02. 11. 2020, 10:53:54
Takže jsi myslel trasakčnost na úrovni jazyka a to včetně externích závislostí. Zajímavé.

Zajímavé je, jak by se něco takového provedlo v čistě funkcionálním kódu.

To mi moc zajímavé nepřijde. Funkcionální kód nemá efekty. Tudíž transakce je jednoduchá - zahodit ;-) (Tady trochu provokuju.)
No podle mě zas tak ne. Třeba v Haskellu je kód s efekty oddělený od kódu bez efektů. Takže by, teoreticky, napřed došlo k výpočtu finálního stavu a pokud by výpočet prošel, došlo by k jeho zápisu. Že by ten zápis byl chráněn transakcí, je jasné, ale to už by si ta low level část systému musela pohlídat sama...
To “zahodit” znamená, že výpočet se v monádě dostane na vedlejší kolej. Ten kód oddělený není, jen pracuje v rámci složitějšího typového systému. BoneFlute má pravdu, že to je v podstatě zdarma.
Však já polemizuju pouze s tím "Tady trochu provokuju". "kód oddělený není, jen pracuje v rámci složitějšího typového systému" - není to slovíčkaření? Prostě se ví, která funkce má efekty a která ne a dokud se výpočet dělá v bezefektové funkci, víme, že výsledek se může zahodit.
Možná jsem jen úplně nepochopil komentář o tom rozdělení.

Nicméně zajímavější jsou ty “efekty,” to s tím zahazováním je tedy rollback? A co je pak commit? Jakému typovému operátoru odpovídá? Podle mě je tohle všechno ve FP plně transparentní, ale možná mi něco uniká.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 02. 11. 2020, 15:58:32
Takže jsi myslel trasakčnost na úrovni jazyka a to včetně externích závislostí. Zajímavé.

Zajímavé je, jak by se něco takového provedlo v čistě funkcionálním kódu.

To mi moc zajímavé nepřijde. Funkcionální kód nemá efekty. Tudíž transakce je jednoduchá - zahodit ;-) (Tady trochu provokuju.)
No podle mě zas tak ne. Třeba v Haskellu je kód s efekty oddělený od kódu bez efektů. Takže by, teoreticky, napřed došlo k výpočtu finálního stavu a pokud by výpočet prošel, došlo by k jeho zápisu. Že by ten zápis byl chráněn transakcí, je jasné, ale to už by si ta low level část systému musela pohlídat sama...
To “zahodit” znamená, že výpočet se v monádě dostane na vedlejší kolej. Ten kód oddělený není, jen pracuje v rámci složitějšího typového systému. BoneFlute má pravdu, že to je v podstatě zdarma.
Však já polemizuju pouze s tím "Tady trochu provokuju". "kód oddělený není, jen pracuje v rámci složitějšího typového systému" - není to slovíčkaření? Prostě se ví, která funkce má efekty a která ne a dokud se výpočet dělá v bezefektové funkci, víme, že výsledek se může zahodit.
Možná jsem jen úplně nepochopil komentář o tom rozdělení.

Nicméně zajímavější jsou ty “efekty,” to s tím zahazováním je tedy rollback? A co je pak commit? Jakému typovému operátoru odpovídá? Podle mě je tohle všechno ve FP plně transparentní, ale možná mi něco uniká.

@Ink defakto přesně pochopil mou provokaci. (IO) Monády ve FP (nebo jakákoliv jejich alternativa) jsou přesně ta část jazyka, která není funkcionální. Tudíž nesplňuje zadání :-)

Vezmu-li čistě funkcionální kód, tak ten je v okamžiku kompilace "vyřešen" a neexistuje tam cesta jak něco může selhat. Tudíž předem vím, že 8 `div` 0 se nemůže vykonat, tudíž ho ani nevykonám, tudíž pro něj nejen že nealokuju paměť, já ho prostě budu ignorovat, vůbec nebude. Monády to celé trochu zamotávají, ale jinak fungují úplně stejně.

Pak je tam taková ta vazba mezi pure functional a zbytkem - ať už pomocí IOMonád, nebo Effects, nebo čehokoliv jiného. A tam to zase dostává na starost jazyk, aby se s tím popral -
Citace
ale to už by si ta low level část systému musela pohlídat sama.
.

Mě víc zajímala ta syntaxe, jak si to @Jiří Havel představoval. Protože tam je IMHO ještě co objevovat a vylepšovat.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Jiří Havel 02. 11. 2020, 18:07:18
Mě víc zajímala ta syntaxe, jak si to @Jiří Havel představoval. Protože tam je IMHO ještě co objevovat a vylepšovat.
Já tu ale nepíšu o nějakých hypotetických nových jazycích. Já tu píšu o tom, jak se v c++ normálně píše kód se strong exception safety. Například mám třídu co má dvě dynamické pole stejné délky a metodu resize:
Kód: [Vybrat]
class Foo
{
private:
  std::unique_ptr<Bar[]> m_Bar;
  std::unique_ptr<Baz[]> m_Baz;
  size_t m_Size = 0;
public:
  void resize( size_t new_size )
  {
    std::unique_ptr bar( new Bar[new_size] ); // muze hodit
    std::unique_ptr baz( new Baz[new_size] ); // muze hodit
    // nějake kopirovani co muze hazet atd.

    // noexcept "commit" :
    m_Bar = std::move( bar ); // nebo swap( m_Bar, bar );
    m_Baz = std::move( baz );
    m_Size = new_size;
  }
}

O co mi šlo je, že ten házející a neházející kód se nijak neliší, takže při čtení od sebe nejdou poznat. Ty  výjimky prostě probublávají bez povšimnutí. A líbilo by se mi mít něco jako :
Kód: [Vybrat]
  void resize( size_t new_size )
  {
    std::unique_ptr bar( new Bar[new_size] ); // muze hodit
    std::unique_ptr baz( new Baz[new_size] ); // muze hodit
    // nějake kopirovani co muze hazet atd.

    noexcept {
      m_Bar = std::move( bar );
      m_Baz = std::move( baz );
      m_Size = new_size;
    }
[/quote]
Prostě říct překladači, kde nesmí nic lítat. A pokud bych tam zavolal něco co není noexcept tak aby to zahlásil.

Jinak podobnost se zmiňovanými funkcionálními myšlenkami není vůbec náhodná. Ten házející kód vytváří nový stav pokud možno s minimem vedlejších efektů. A viditelné vedlejší efekty se stanou v té commit fázi.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 02. 11. 2020, 19:26:02
Mě víc zajímala ta syntaxe, jak si to @Jiří Havel představoval. Protože tam je IMHO ještě co objevovat a vylepšovat.
Já tu ale nepíšu o nějakých hypotetických nových jazycích. Já tu píšu o tom, jak se v c++ normálně píše kód se strong exception safety. Například mám třídu co má dvě dynamické pole stejné délky a metodu resize:
Kód: [Vybrat]
class Foo
{
private:
  std::unique_ptr<Bar[]> m_Bar;
  std::unique_ptr<Baz[]> m_Baz;
  size_t m_Size = 0;
public:
  void resize( size_t new_size )
  {
    std::unique_ptr bar( new Bar[new_size] ); // muze hodit
    std::unique_ptr baz( new Baz[new_size] ); // muze hodit
    // nějake kopirovani co muze hazet atd.

    // noexcept "commit" :
    m_Bar = std::move( bar ); // nebo swap( m_Bar, bar );
    m_Baz = std::move( baz );
    m_Size = new_size;
  }
}

O co mi šlo je, že ten házející a neházející kód se nijak neliší, takže při čtení od sebe nejdou poznat. Ty  výjimky prostě probublávají bez povšimnutí. A líbilo by se mi mít něco jako :
Kód: [Vybrat]
  void resize( size_t new_size )
  {
    std::unique_ptr bar( new Bar[new_size] ); // muze hodit
    std::unique_ptr baz( new Baz[new_size] ); // muze hodit
    // nějake kopirovani co muze hazet atd.

    noexcept {
      m_Bar = std::move( bar );
      m_Baz = std::move( baz );
      m_Size = new_size;
    }
[/quote]
Prostě říct překladači, kde nesmí nic lítat. A pokud bych tam zavolal něco co není noexcept tak aby to zahlásil.

Jinak podobnost se zmiňovanými funkcionálními myšlenkami není vůbec náhodná. Ten házející kód vytváří nový stav pokud možno s minimem vedlejších efektů. A viditelné vedlejší efekty se stanou v té commit fázi.

Což je si ale, přiznejme si, nic moc.

Kód: [Vybrat]
# Python
with open('dog_breeds.txt') as src, threading.Lock(), db.connection() as con:
    con.insert(src.readlines())

(GoLang má defer, což je něco podobného ale hnusnějšího.)

Řekl bych, ty tak docela nepotřebuješ rozlišovat co může selhat a co ne. Jako spíše zajistit tu atomicitu.

Ten with řeší dvě věci, automaticky uzavřít zdroj, když něco selže, a rollback při chybě v bloku.

Tohle je zatím nejhezčí s čím jsem se setkal.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Ink 02. 11. 2020, 20:36:47
Kód: [Vybrat]
# Python
with open('dog_breeds.txt') as src, threading.Lock(), db.connection() as con:
    con.insert(src.readlines())

(GoLang má defer, což je něco podobného ale hnusnějšího.)

Řekl bych, ty tak docela nepotřebuješ rozlišovat co může selhat a co ne. Jako spíše zajistit tu atomicitu.

Ten with řeší dvě věci, automaticky uzavřít zdroj, když něco selže, a rollback při chybě v bloku.

Tohle je zatím nejhezčí s čím jsem se setkal.

Teď se Ti myslím povedla demonstrace jedné ze skutečných výhod výjimek, která ale může fungovat asi jenom v dynamických jazycích typu Pythonu - ten context manager pozná výjimku podle parametru, který ji identifikuje.

Jinak je to věc, která se dá řešit destruktorem při výstupu z rozsahu platnosti proměnné - třeba v Rustu se udělá drop v opačném pořadí (vzhledem k pořadí definice proměnné) automaticky a je vymalováno taky.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Jiří Havel 02. 11. 2020, 22:27:20
Což je si ale, přiznejme si, nic moc.

Kód: [Vybrat]
# Python
with open('dog_breeds.txt') as src, threading.Lock(), db.connection() as con:
    con.insert(src.readlines())

(GoLang má defer, což je něco podobného ale hnusnějšího.)

Řekl bych, ty tak docela nepotřebuješ rozlišovat co může selhat a co ne. Jako spíše zajistit tu atomicitu.

Ten with řeší dvě věci, automaticky uzavřít zdroj, když něco selže, a rollback při chybě v bloku.

Tohle je zatím nejhezčí s čím jsem se setkal.
Já teď opravdu neřeším atomicitu, ale kusy kódu co zaručeně nemůžou selhat. I v jednom vlákně se ta transakčnost nedá zaručit pomocí with a podobných.
With, defer, tryWithResource a podobně umí jen to, co destruktory v c++ - zavolat kus kódu na konci bloku. (Taky se pomocí destruktorů dají celkem snadno implementovat). Pro tu transakci to nestačí. Např to with ještě potřebuje aby _každý_ resource uměl zaručeně neházející rollback (pomocí __exit__).

Svým kódem jsem se snažil ilustrovat tohle : Mám několik resourců, update každého může selhat a chci updatovat všechno nebo nic. Buďto můžu spočítat nový stav všech a pak je bez házení prohodit. Nebo můžu updatovat jeden po druhém, ale potřebuju možnost jak je bez házení vrátit zpět. Nevím, jak to udělat bez kusu kódu co zaručeně neselže.

Jádro je ten kus kódu co zaručeně nehází. Bez něho to AFAIK nejde. Destruktory, with, defer a podobné jsou jen bonus co ušetří mechanické bušení try-finally a podobného boilerplate kódu.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 03. 11. 2020, 01:58:40
Kód: [Vybrat]
# Python
with open('dog_breeds.txt') as src, threading.Lock(), db.connection() as con:
    con.insert(src.readlines())

(GoLang má defer, což je něco podobného ale hnusnějšího.)

Řekl bych, ty tak docela nepotřebuješ rozlišovat co může selhat a co ne. Jako spíše zajistit tu atomicitu.

Ten with řeší dvě věci, automaticky uzavřít zdroj, když něco selže, a rollback při chybě v bloku.

Tohle je zatím nejhezčí s čím jsem se setkal.

Teď se Ti myslím povedla demonstrace jedné ze skutečných výhod výjimek, která ale může fungovat asi jenom v dynamických jazycích typu Pythonu - ten context manager pozná výjimku podle parametru, který ji identifikuje.

Jinak je to věc, která se dá řešit destruktorem při výstupu z rozsahu platnosti proměnné - třeba v Rustu se udělá drop v opačném pořadí (vzhledem k pořadí definice proměnné) automaticky a je vymalováno taky.

Obávám se, že rozhodně nemohu souhlasit. Už jsem tu toto téma někdy rozebíral, žel neúspěšně. Má aktuální úroveň poznání mi říká, že dynamické jazyky nepřináší nic co by principielně nešlo ve statických jazycích (a stáli bychom o to). Každopádně, asi zůstaňme u tématu.



Já teď opravdu neřeším atomicitu, ale kusy kódu co zaručeně nemůžou selhat. I v jednom vlákně se ta transakčnost nedá zaručit pomocí with a podobných.
With, defer, tryWithResource a podobně umí jen to, co destruktory v c++ - zavolat kus kódu na konci bloku. (Taky se pomocí destruktorů dají celkem snadno implementovat). Pro tu transakci to nestačí. Např to with ještě potřebuje aby _každý_ resource uměl zaručeně neházející rollback (pomocí __exit__).

Svým kódem jsem se snažil ilustrovat tohle : Mám několik resourců, update každého může selhat a chci updatovat všechno nebo nic. Buďto můžu spočítat nový stav všech a pak je bez házení prohodit. Nebo můžu updatovat jeden po druhém, ale potřebuju možnost jak je bez házení vrátit zpět. Nevím, jak to udělat bez kusu kódu co zaručeně neselže.

Jádro je ten kus kódu co zaručeně nehází. Bez něho to AFAIK nejde. Destruktory, with, defer a podobné jsou jen bonus co ušetří mechanické bušení try-finally a podobného boilerplate kódu.

Kus kódu, který zaručeně nemůže selhat IMHO není problém. Třeba pomocí typů toho lze dosáhnout velice snadno (jsem ze světa Haskell, Rust, etc C++ je samozřejmě jinej případ). FP taky udělají hodně práce. Všechny tyhle požadované záruky ti kvalitní typový systém může dát (neříkám, že na 100%, ale nenechme se rozptylovat podrobnostmi). Chápu, proč to tak komentuješ. Protože C++. Typy C++ a typy v Rust, to je jako mít a nemít.

Já jsem řešil syntax. Ta mě zajímá. Zdá se, že v tomto se trochu míjíme, protože ty se zahrabáváš do implementačních detailů a ještě navíc v C++.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Ink 03. 11. 2020, 07:54:35
Teď se Ti myslím povedla demonstrace jedné ze skutečných výhod výjimek, která ale může fungovat asi jenom v dynamických jazycích typu Pythonu - ten context manager pozná výjimku podle parametru, který ji identifikuje.

Jinak je to věc, která se dá řešit destruktorem při výstupu z rozsahu platnosti proměnné - třeba v Rustu se udělá drop v opačném pořadí (vzhledem k pořadí definice proměnné) automaticky a je vymalováno taky.

Obávám se, že rozhodně nemohu souhlasit. Už jsem tu toto téma někdy rozebíral, žel neúspěšně. Má aktuální úroveň poznání mi říká, že dynamické jazyky nepřináší nic co by principielně nešlo ve statických jazycích (a stáli bychom o to). Každopádně, asi zůstaňme u tématu.

Principiálně ano. Přemýšlím, jak by se to dělalo v C++. Pokud si pamatuju dobře, můžeš jako výjimku házet leccos, takže by maximálně šlo do exit metody poslat info, jestli výjimka byla nebo ne. U dynamických jazyků typu Pythonu je hodnota proměnné libovolná.

No ale zase, kdybychom měli k dispozici jenom bool, šlo by něco podobného i bez výjimek - třeba v Rustu. Tam se mi dokonce rýsuje i řešení s identifikací typu Erroru - pomocí downcastu by to mělo být možné vydolovat i z wrapperu, jaký dělá třeba anyhow! Tudíž asi musím vzít zpět svoje tvrzení o výhodě výjimky, protože podle všeho by to mělo jít postavit i nad Resultem - musel by se udělat příslušný trait (nebo změnit protokol Dropu) a jazyk by tomu musel vyjít vstříc.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Jiří Havel 03. 11. 2020, 09:18:31
Kus kódu, který zaručeně nemůže selhat IMHO není problém. Třeba pomocí typů toho lze dosáhnout velice snadno (jsem ze světa Haskell, Rust, etc C++ je samozřejmě jinej případ). FP taky udělají hodně práce. Všechny tyhle požadované záruky ti kvalitní typový systém může dát (neříkám, že na 100%, ale nenechme se rozptylovat podrobnostmi). Chápu, proč to tak komentuješ. Protože C++. Typy C++ a typy v Rust, to je jako mít a nemít.

Já jsem řešil syntax. Ta mě zajímá. Zdá se, že v tomto se trochu míjíme, protože ty se zahrabáváš do implementačních detailů a ještě navíc v C++.
Jo míjíme se. _Explicitně_ tu píšu o podobnostech mezi různými jazyky. Kus c++ jsem tu hodil jen proto, že sis několikrát psal o příklad syntaxe. Nikde tu IMO neřeším implementační detaily. c++ je to jen proto, že ho umím nejlíp a neřeším konkrétní jazyk ale principy.

Typy v Haskellu tohle moc neřeší. Jestli kus kódu může selhat nezávisí na jazyce, ale na tom, co ten kus kódu dělá. V Haskellu jsem toho napsal taky dost. Monáda ti ten "fail" bude propagovat nahoru úplně stejně neviditelně jako výjimky v c++. A v haskellu taky IMO nejde zaručit že kus monadického kódu ten fail nezavolá. A pure věci nakonec stejně musíš protlačit do toho stavového světa (nebo ten vnější RealWorld něčím prohnat ;) ).

Typy v C++ jsou hrubé, syntaxe je ošklivá, ale co do schopností jsou velmi mocné. C++ má jeden z nejsilnějších typových systémů ze všech mainstreamových jazyků. Kód ení moc hezký, ale principy jsou tam stejné jako ve zbytku světa. Takže prosím ignoruj jazyk a soustřeď se na principy. Ty jsou to o co mi jde.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 03. 11. 2020, 14:00:31
Typy v C++ jsou hrubé, syntaxe je ošklivá, ale co do schopností jsou velmi mocné. C++ má jeden z nejsilnějších typových systémů ze všech mainstreamových jazyků. Kód ení moc hezký, ale principy jsou tam stejné jako ve zbytku světa. Takže prosím ignoruj jazyk a soustřeď se na principy. Ty jsou to o co mi jde.

Nenech se znérvóznit mou antipatií k C++. Je to přeci jen už dlouho, co jsem v něm dělal. :-)

Typy v Haskellu tohle moc neřeší. Jestli kus kódu může selhat nezávisí na jazyce, ale na tom, co ten kus kódu dělá. V Haskellu jsem toho napsal taky dost. Monáda ti ten "fail" bude propagovat nahoru úplně stejně neviditelně jako výjimky v c++. A v haskellu taky IMO nejde zaručit že kus monadického kódu ten fail nezavolá. A pure věci nakonec stejně musíš protlačit do toho stavového světa (nebo ten vnější RealWorld něčím prohnat ;) ).
Předpokládejme, že máme nějakou strukturu, jako to __exit__ u Pythoního with. Tvrdíš (a já nemám důvod nesouhlasit), že musíme zajistit, aby to __exit__ nevyhazovalo výjimku. OK. Co brání, aby v případě, že kompiler zjistí, že v něm je výraz, který výjimku 1) vyhazuje odmítl kód přeložit? (Odmysleme si, že teď lepím syntaxi z Pythonu, na typované myšlení z Haskellu.)

Tudíž nemohu souhlasit, že to Typy v Haskellu neřeší. Domnívám se, že naopak. Naopak!

Monáda ti ten "fail" bude propagovat nahoru úplně stejně neviditelně jako výjimky v c++.
Jak neviditelně?! Vždyť naopak, ty monády jsou v Haskellu největší pruda, protože jdou vidět moc.


A v haskellu taky IMO nejde zaručit že kus monadického kódu ten fail nezavolá.

Tady je nějaký zmatek v názvosloví.
Monáda nemůže selhat. Monáda nemůže zavolat fail. Monáda má množinu stavů, jeden z nich může být klasifikován jako chyba. Zaručený je tam všude všechno.

Moc ti teď bohužel nerozumím.



1) Výjimkou myslím klidně i Monádu, IOMonádu, Effects, cokoliv co bychom potřebovali.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Idris 03. 11. 2020, 14:11:12
ty monády jsou v Haskellu největší pruda, protože jdou vidět moc.
Protože monáda je skoro všechno užitečné, optional, seznam, množina, futures :)
Nicméně otázka výjimek a transakčnosti s tím nijak nesouvisí. Ve FP jde něco jako noexcept udělat jednoduše.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 03. 11. 2020, 14:11:49
Teď se Ti myslím povedla demonstrace jedné ze skutečných výhod výjimek, která ale může fungovat asi jenom v dynamických jazycích typu Pythonu - ten context manager pozná výjimku podle parametru, který ji identifikuje.

Jinak je to věc, která se dá řešit destruktorem při výstupu z rozsahu platnosti proměnné - třeba v Rustu se udělá drop v opačném pořadí (vzhledem k pořadí definice proměnné) automaticky a je vymalováno taky.

Obávám se, že rozhodně nemohu souhlasit. Už jsem tu toto téma někdy rozebíral, žel neúspěšně. Má aktuální úroveň poznání mi říká, že dynamické jazyky nepřináší nic co by principielně nešlo ve statických jazycích (a stáli bychom o to). Každopádně, asi zůstaňme u tématu.

Principiálně ano. Přemýšlím, jak by se to dělalo v C++. Pokud si pamatuju dobře, můžeš jako výjimku házet leccos, takže by maximálně šlo do exit metody poslat info, jestli výjimka byla nebo ne. U dynamických jazyků typu Pythonu je hodnota proměnné libovolná.

No ale zase, kdybychom měli k dispozici jenom bool, šlo by něco podobného i bez výjimek - třeba v Rustu. Tam se mi dokonce rýsuje i řešení s identifikací typu Erroru - pomocí downcastu by to mělo být možné vydolovat i z wrapperu, jaký dělá třeba anyhow! Tudíž asi musím vzít zpět svoje tvrzení o výhodě výjimky, protože podle všeho by to mělo jít postavit i nad Resultem - musel by se udělat příslušný trait (nebo změnit protokol Dropu) a jazyk by tomu musel vyjít vstříc.
Mnou poklamovaná jediná výhoda výjimek, ale zato zásadní - je čitelnost. Na úrovni kompileru a možností, a logiky, a bezpečnosti v následujících dvou příkladech není rozdíl:

Kód: [Vybrat]
fn div (a: Int, b: Int) -> Result Int String
if b == 0 then
Fail ("Dělení nulou")
end
Succes (a / b)

match a <- div(42, a):
Fail msg -> print(msg)
_ -> print(a)



Kód: [Vybrat]
fn div (a: Int, b: Int) -> throw Int
if b == 0 then
throw Error ("Dělení nulou")
end
a / b

try:
print(div(42, a))
catch e:
print(e)
Název: Re:Jak efektivně studovat programování?
Přispěvatel: okalousek 03. 11. 2020, 14:25:06
Kód: [Vybrat]
fn div (a: Int, b: Int) -> Result Int String
if b == 0 then
Fail ("Dělení nulou")
end
Succes (a / b)

match a <- div(42, a):
Fail msg -> print(msg)
_ -> print(a)



Kód: [Vybrat]
fn div (a: Int, b: Int) -> throw Int
if b == 0 then
throw Error ("Dělení nulou")
end
a / b

try:
print(div(42, a))
catch e:
print(e)

To je skutečný jazyk nebo nějaký funkcionální pseudokód?
Název: Re:Jak efektivně studovat programování?
Přispěvatel: BoneFlute 03. 11. 2020, 14:42:52
Kód: [Vybrat]
fn div (a: Int, b: Int) -> Result Int String
if b == 0 then
Fail ("Dělení nulou")
end
Succes (a / b)

match a <- div(42, a):
Fail msg -> print(msg)
_ -> print(a)



Kód: [Vybrat]
fn div (a: Int, b: Int) -> throw Int
if b == 0 then
throw Error ("Dělení nulou")
end
a / b

try:
print(div(42, a))
catch e:
print(e)

To je skutečný jazyk nebo nějaký funkcionální pseudokód?

Pseudokód. Mix Swiftu, Rustu a TypeScriptu.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: okalousek 03. 11. 2020, 15:03:37
Pseudokód. Mix Swiftu, Rustu a TypeScriptu.

S tím by jste udělal díru do světa. Ještě přidat CSP.
Název: Re:Jak efektivně studovat programování?
Přispěvatel: Idris 04. 11. 2020, 12:57:46
Kód: [Vybrat]
fn div (a: Int, b: Int) -> Result Int String
if b == 0 then
Fail ("Dělení nulou")
end
Succes (a / b)

match a <- div(42, a):
Fail msg -> print(msg)
_ -> print(a)



Kód: [Vybrat]
fn div (a: Int, b: Int) -> throw Int
if b == 0 then
throw Error ("Dělení nulou")
end
a / b

try:
print(div(42, a))
catch e:
print(e)

To je skutečný jazyk nebo nějaký funkcionální pseudokód?

Pseudokód. Mix Swiftu, Rustu a TypeScriptu.
Hezký mix, to by si zasloužilo parser a přinejmenším transpiler ;)