Jak efektivně studovat programování?

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Jak efektivně studovat programování?
« Odpověď #60 kdy: 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.


BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Jak efektivně studovat programování?
« Odpověď #61 kdy: 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.

Ink

  • *****
  • 655
    • Zobrazit profil
    • E-mail
Re:Jak efektivně studovat programování?
« Odpověď #62 kdy: 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.

Ink

  • *****
  • 655
    • Zobrazit profil
    • E-mail
Re:Jak efektivně studovat programování?
« Odpověď #63 kdy: 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/

Re:Jak efektivně studovat programování?
« Odpověď #64 kdy: 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.


BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Jak efektivně studovat programování?
« Odpověď #65 kdy: 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.

Ink

  • *****
  • 655
    • Zobrazit profil
    • E-mail
Re:Jak efektivně studovat programování?
« Odpověď #66 kdy: 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(())
}

Ink

  • *****
  • 655
    • Zobrazit profil
    • E-mail
Re:Jak efektivně studovat programování?
« Odpověď #67 kdy: 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 {
    }

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Jak efektivně studovat programování?
« Odpověď #68 kdy: 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.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Jak efektivně studovat programování?
« Odpověď #69 kdy: 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.

Ink

  • *****
  • 655
    • Zobrazit profil
    • E-mail
Re:Jak efektivně studovat programování?
« Odpověď #70 kdy: 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.

Re:Jak efektivně studovat programování?
« Odpověď #71 kdy: 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.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Jak efektivně studovat programování?
« Odpověď #72 kdy: 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.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Jak efektivně studovat programování?
« Odpověď #73 kdy: 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.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Jak efektivně studovat programování?
« Odpověď #74 kdy: 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?