To je jeden z Murphyho zákonů: Končí-li novinový titulek otazníkem, zní odpověď „ne“ :-)
Ja v tom nevidim problem. To chcete ludi drzat v bezpecnej bavlnke jazykov beziacich na nejakej virtualnej masine a smrtelne zranenia nech si potom spravia na vlastne triko? To nedava zmysel. Ak sa nebavime o nejakom uplne brutaln high end programatorovi, alebo databazistovi, ktory programovanie potrebuje len k tomu aby vedel nieco oskriptit, tak systemovy programator *ma* zacat C-ckom. Ak ho nezvladne, tak z neho nebude systemovy programator. Bud nie hned, alebo nikdy.
"To chcete ludi drzat v bezpecnej bavlnke jazykov beziacich na nejakej virtualnej masine a smrtelne zranenia nech si potom spravia na vlastne triko?"
A na to jsi prisel jak? Rikam, ze je dobre zacit zaklady a studentum to zjednodusit. Nejdriv lehke veci, pak tezke veci. Nema smysl je na zacatku trapit problemy, na ktere je casu dost.
"systemovy programator *ma* zacat C-ckom. Ak ho nezvladne, tak z neho nebude systemovy programator. Bud nie hned, alebo nikdy."
A na to jsi prisel jak?
Prave naopak. Dava to smysl.
Dejte detem noze, a trenera. Ti kdoz preziji budou velmi dobre vytrenovani a neprekvapi je uz zadny jiny typ boje.
Navic oproti nozi, C nikoho nezabije pri treninku. A kdo to nevydrzi / nepochopi, no tak by spise pri proramovani skodil a mel by jit delat manazera...
Funkce malloc je součástí specifikace ANSI C, takže tvrdit, že nemá s jazykem C nic společného, je poněkud mimo. A pokud se při výuce C budu vyhýbat dynamické alokaci paměti, tak nevidím valný důvod, proč se ten jazyk vůbec učit. Pro takto základní výuku programování je C zbytečně náročné.
Pro výuku základů programování je C náročné, protože spousta věcí se v něm dělá výrazně složitěji než v jiných jazycích. V jazycích, které lépe zapouzdřují práci s pamětí a s řetězci, je samozřejmě mnohem snazší zvládnout základní prinicipy programování. Psát něco v jazyce, kde každá na pohled trivialita končí na segmentation fault, je pro začátečníka neskutečně frustrující. Ale pokud už se mám učit programovat právě v C, tak je blbost se tématu dynamické alokace vyhýbat. To, že se bez ní mohu v řadě případů obejít, fakt není argument, proč ji nemuset ovládat. A vytahovat v tomto kontextu jako argument bezpečnostně kritické aplikace je hodně mimo mísu. Já bych teda člověku, který nezvládá dynamickou alokaci paměti, nevěřil ani to, že dokáže v C napsat bezpečný Hello World.
"C není není složitý jazyk, jen se v něm snadno dělají chyby."
Chybama se člověk učí -> C je ideální na učení :D
"V pythonu za kratší dobu naprogramujete víc složitějších věcí, což je IMHO pro výuku přínosnější."
Který student bude v praxi přínosnější?
a) Semetrálka 500 LOC, ale během práce na ní si osvojí pointerovou arritmetiku, řetězený seznam a iterace v něm
b) Semestrálka 2500 LOC, ale když na něj někdo bafne ohledně adresování paměti nebo uložení dat v RAMce, zrudne, zpotí se, zalapá po dechu, zezelená a svalí se jak špalek
Pokud A, proč by byla přínosnější výchova k tomu, aby z něho byl B?
Jako semestrální úlohu jsem dělal implementaci standardní unixové utility "wc" (jen ty nejpoužívanější parametry). A i když jsem nesplnil miniální požadovaný počet řádků, dostal jsem pochvalu za velice kompaktní kód. Takže s tím že je C ukecanější nesouhlasím. Ona ta pointrová aritmetika a různé vychytávky C, jako napřiklad přiřazení v podmínce cyklu, hodně kód zkrátí. Jestli je něco ukecaného, tak možná Java....
Před pár dny jsem porovnával můj prográmek s jiným, od čerstvého studenta. Oba v C a dělaly úplně stejnou věc. On tam měl přes 200 řádků. Zhruba půlku jeho kódu jsem zvládl už v deklaracích proměnných, to byly první tři řádky z pěti. Takže ukecaný určitě není jazyk C, ale jedině programátor :-D
V pythonu to naprogramuji rychle, ale po rozšíření projektu mi při změnách datových typů hrábne. Ani kvalitní IDE mi v tom nepomůže, muselo by být věštec. Potřebuji silně typový systém, čím víc compile-time kontrol nabídne (generika, value types, atd.), tím pro mě a pro efektivitu vývoje lepší.
Směrem dolů si ten pythoní kód nespustím na mikročipu, který je také počítač a také se programuje. Ani se tím nenaučím, co se vlastně v počítači děje.
Takže všechno má své pro a proti. Volba jazyka pro výuku musí odpovídat cíli, který se v daném předmětu vyučuje. A ty jsou různé.
Souhlas, ale na ty mikročipy bacha :) https://micropython.org/
C docela vytříbí mysl. Rozhodně super úvod do řádného programování bez zábran. V nejhorším dostanete přes pusu od kompilátoru, Valgrindu nebo si chybu uvědomíte pomocí printf nebo gdb atd. Myslím, že je to rozhodně jeden z lepších možných začátků.
Je ale fakt, že C i Javu často učí lidi, co prostě neumí ty věci poutavě a užitečně vysvětlit. Vždy to je něco ve smyslu "tak si otevřeme Visual Studio (na C) nebo Eclipse (na Javu)" a tím začíná pohroma. Myslím, že pedagogicky lepší je získat aspoň částečnou představu, v jakém prostředí jazyk vznikl. U C i Javy to byl UNIX. Proč tedy nevzít nějaké RaspberryPi s Linuxem a GNU a nepřiblížit se tomuto prostředí touto cestou a jako náhodou můžu třeba i blikat diodou na GPIO nebo tak něco a potrénovat se na binárních kódech, když budu chtít. Ještě jsem neviděl nikoho, kdo by řekl, že je RaspberryPi úplně k ničemu a že to byly vyhozené peníze. Dá se použít i virtuální stroj, když někdo má zrovna Windows nebo nově i Windows Subsystem for Linux. Všechno to je rychlejší začátek, než se pachtit s instalací VSC++ nebo Eclipse. Později třeba využije student silných stránek IDE, ale pro začátek bohatě stačí GEdit, Kate nebo dokonce i nano.
Jinak znám lidi, co začínali na Algolu 60 nebo Fortranu 77. Jeden můj kolega ze studií měl FORTRAN rád, byl to matematik a těm to obecně prostě sedne. I dnes se běžně vyučuje Pascal a může to být kvalitní průprava. Prostě jde o to, kdo a pro koho to jak učí. Jazyk už je potom celkem jedno, když je to něco rozumně využitelného v praxi (jako že pro vědce FORTRAN určitě praktický je).
Kvalitní objektový návrh nějakého reálného procesu, který je má správně rozdělené kompetence, je přehledný, lze jej snadno rozšiřovat, upravovat, používá správné datové komponenty atd. (python, java), tříbí mysl úplně stejně jako technické detaily správy paměti v C. Prostě jsou to dvě různé věci, obě stejně důležité. A s obojím je dobré se dnes seznamovat hned od začátku.
Kecy v klecy ... vsechny skolni projekty sou ze 100% pro jakykoli objektovy programovani naprosto nevhodny, naopak to zcela zastira jak funcionalitu tak zhorsuje citelnost kodu, a vysledkem je patlal, ktere na prinf potrebuje GB ram, protoze to prece musi bejt spravne objektovy a dynamicky ...
To je mor současné doby. My vyrostli na TurboPascalu a vše cpali do polí a struktur. Dnes se místo struktur používají objekty. Ale z nějakého důvodu k tomu lidé mají potřebu dobastlit i metody atd. Zatímco my jsme měli binární vyhledávací strom jako spojový seznam struktur, tak dnes tam lidé nasází objekty a jsou schopni se půl hodiny hádat o tom, zda má být nějaká metoda private nebo public a zda náhodou nemá být v jiné třídě. Do toho začnou házet výrazy typu "friend funkce" a člověk má pocit, že pro samé objekty už ani nevidí data.
Postupem času tak vídám objektové programování u věcí jako je LZSS, fraktály atd. A nechápu proč. Osobně mi objektové programování přijde nevhodné i na úlohy jako "půjčovna videokazet", ale to do toho se silou cpaly objekty už za nás.
Taky, na ZŠ Basic na Didaktiku, na SŠ TurboPascal, na VŠ Delphi, po VŠ C.
Dopadlo to tak, že v jednočipu s oblibou používám makra jako třeba
[code]
#define foreach(index, array) for(index=array; index != NULL; index = index->next)
[/code]
na procházení seznamu struktur na heapu... :D Pár takových maker, spotřeba paměti minimální a přehlednost na úrovni ještě vyšších jazyků...
Souhlas. Nevím, jak to teď na školách vypadá, ale rád bych viděl RPi jako učební pomůcku. Prostředí - Linux je určitě lepší pro výuku než nějaké přeplácané Visual Studio. Dále díky GPIO je RPi ideální na učení low-level C (ovládání PLL, práce s pamětí, ovládání GPIO), hlavně proto že uvidím výsledek mé práce. Změním pár bitů v paměti a začne mi blikat dioda. Samozřejmě si také můžu stáhnout knihovnu a udělat to Pythonu.
Sám seš totální píčovina. V začátcích potřebuješ vědět jak funguje program, větvení, cykly, funkce apod. to vše C má a je to jednoduchý jazyk na naučení. Na základní úlohy, kde potřebuješ rozvinout algoritmické myšlení, to zcela dostačuje. Nepotřebuješ nic jako list comprehensions, generátory, třídy nebo vícenásobnou dědičnost. Sám jsem se C učil z knihy C programming language od autorů K&R a naučilo mě to víc než jakákoliv jiná kniha nebo předmět na VŠ. Ti co začali s Javou nebo jiným high level jazykem pak těžce narazili, když měli řešit úlohu, na kterou neměli knihovnu nebo přímou podporu v programovacím jazyce.
to řikáš, jak kdyby byl jen jeden "programátor".
Volba jazyku na výuku by měla být ovlivněna cílem a množstvím času. Těžko budu datového analytika učit céčko, stejně tak o céčku raději nebudu říkat webaři, aspoň ne v počátcích.
Jsem zastánce toho, že kažý jazyk něco přináší a každá výuka programování má nějaký cíl, který mají studenti splnit. Znám lidi od Colobu, fortranu, kteří to stejné co ty říkáš o javě říkají o céčkařích ;)
To vše má python a je snazší na póužití i pochopení. Navíc python je mnohem praktičtější, takže lidem, co skončí u toho prvního iazyka dá víc, než nepraktické C. Jazyk C je vhodný až pro pokročilé programátory, které už nemusíš složitě učit základní konstrukce, ale potřebuješ je naopak naučit low level věci. Takhle je to efektivnější.
Myslím si, že je potřeba rozlišovat mezi výukou principů programování počítačů - low level Cčko a výukou modelování abstrakcí - python. Obojí by měl programátor umět a jsou to hodně odlišné disciplíny. Někoho pak zaujme to první, někoho to druhé.
Se svým školou povinným synovcem děláme na domácím projektu, ve kterém je potřeba objektový model v pythonu na PC, kde objekty maximálně odpovídají realitě, a low-level Cčko pro připojený jednočip s displejem a ovládáním. Z jeho pohledu jsou to dost rozdílné světy, ač obojí lze nazvat programováním.
Osobně jsem se taky učil na C na základce, ale nijak hloubkově.
Pak když jsem viděl Python, co odstraňoval vše, co mě na C štvalo, byla to láska na první pohled. Nicméně pak když jsem se k C musel vrátit (Arduino a STM32 - nic hloubkového, ale jisté přípravky do výroby) alespoň jsem na to nečuměl jak blbec, ale velice rychle jsem funkční kod spáchal (ano, velice jednoduché věci, žádné velkoalgoritmy), takže jsem vděčen za výuku v C, že není/nebyla k ničemu.
Pak když s tímhle vším jsem šel na výšku a tam mi začli cpát Pascal, to jsem zuřil!!! (ten opravdu je k ničemu)
A jak padlo, větvení, funkce, proměnné apod. jsou všude +- stejné, výuka logiky se tak může dělat v čemkoliv, krom extrémů. A ač milovník Pythonu, jsem rád, že začíáky byly nad staticky typovaným jazykem, člověk si lépe uvědomil, jak to uvnitř vypadá a ocenil, že to v Pythonu odpadlo, stejně tak si ale dával majzla, zda Python dělá to co má a na důležitých místech typy kontroloval.
Počítač není lidská mysl. Je to stroj, který je pro potřeby programování abstrahován. Ano, na algoritmy je třeba lepší Haskell nebo třeba i Python. Na pochopení principů je zase dobré C.
Kdyby počítače byly blízké lidskému myšlení, tak bychom je nemuseli programovat, ale prostě bychom řekli, co chceme a něco blízkého našemu záměru bychom dostali zpátky. Možná by ale taky počítač byl v létě a zimě na dovolené :-) kdo ví. Realita je taková, že bez porozumění funkci počítače na již dost abstraktní úrovni, jako využívá C např. pro user space GNU/ Linux operačních systémů, bude programátor dlouhodobě vždy vědět jen zhruba, co dělá. To přináší všechny problémy, které potom řeší těch několik málo schopných, kteří opraví více chyb, než vytvoří. A o tom je softwarové inženýrství.
Programovat umí každý. Když vám babička nadiktuje recept, tak se dostanete deterministicky k cíli, tedy něčemu co chutná podobně jako od babičky. Ten kumšt je ale v tom jak, proto prostě jídla od babičky chutnají lépe. Ona prostě už ví kde, kolik, jak dlouho a má na to metodu, aby se v určitém čase dobrala výsledku. Programátor je kuchtík, SW inženýr je kuchař a SW architekt je šéfkuchař, který navrhuje menu a kontroluje splnění požadavků.
Můžete mít hodně dobrého kuchtíka, bude krájet cibuli bleskem a vše co je potřeba bude moct zrovna tak uvařit, jako kuchař. Nepřijde ale na to, že některé nové kombinace budou dobře chutnat ještě před skutečnou realizací receptu. To ale ví šéfkuchař a kuchař nový nápad rychle pochopí a správnou mírou realizuje. Nikdo se na tom nemusí sáhodlouze domlouvat.
Vysoká škola nevychovává kuchtíky, ale šéfkuchaře. Někde se naučí krájet tu cibuli, ale vždy jde nakonec o ten lepší nápad, architekturu a jasnou představu co se týče realizace, aby ji mohli kuchtíci efektivně a opakovatelně realizovat.
Rozhodne jako prvni jazyky doporucuji javascript, php, mysql, pripadne assembler. Nema smysl se prplat s deklarovanim promennych, jak se to dela v pascalu, delphi, c, c++ a pod. Tim stravi hodiny zbytecneho casu misto, aby se naucil pouzivat algoritmy.
Myslim si, ze python, java, asp a podobne experimetny patri mezi jazyky, ktere postupne ustoupi na pozadi. Zalezi na tom, jak se dal vyvyne treba js a to php, jestli prevezmou vyhodne zapisy z pythonu nebo ne. Zatim to spis vypada, ze js zamrzl nekde 20 let zpet a od te doby jsou spis jen nejake vychytavky navic. Js by se mel prepsat objektove a sjednotit. Tez by se tam mela sjednotit struktura funkci. Podobne, jak na tom pracuje php. Ale stale mi prijde efektivnejsi udelat program v js, ktery spustite na kazdem pc bez instalace kde ceho, nez se brodit v necem jinem.
JS, PHP - rozšíření C syntaxe, ale skrytý pasti (== vs. ===) a moc daleko od počítače. Takže to je tak pro gympláky.
mysql není jazyk, to je databáze. Kdyžtak SQL, ale to není jazyk na algoritmy, to už můžeš nahodit rovnou Verilog.
assembler jde až na železo, ale bez abstrakce a nepřehledný, začátečníkům bych to nedoporučil.
Deklarace proměnných je naopak žádoucí. Je potřeba mít představu, že data jsou někde nějak uložena, že je rozdíl mezi intem a reálným číslem,... Jak co do velikosti, tak do formátu. A nejsou to hodiny psaní, ale ušetřený hodiny hledání chyb, když kompilátor zařve, že je někde binec. Třeba když se snažíš nacpat hodnotu typu WeightInTons_t do WeightInGrams_t bez konverze...
Nejdříve by bylo dobré si ujasnit, co je to dominantní programovací jazyk. Nemyslím, že v dnešní době může nějaký jazyk získat takové dominantní postavení, jako tomu bylo třeba v dřívějších dobách u C. Lze získat dominantní postavení v určitém segmentu, třeba výuka prvního jazyka na středních a vysokých školách a získat tak díky tomu první místo v indexu PYPL. Ale těžko se už najde jazyk, který by dominoval napříč mnoha obory. Vždyť i v tom strojovém učení, kde má Python určitě vůdčí postavení (vzhledem k R, těžko říct jestli dominantní), je to postavení dané především malými aplikacemi, prototypováním a modelováním. Reálně to pak běží na něčem jiném a používají se modely z Pythonu.
P.S.: Google nedávno představil interní nástroj na migraci jejich Pythoního kódu do Go. Ať už to dopadne jakkoliv, ten graf dole je zajímavý.
Souhlasím. Python je perfektní na rychlé vytváření modelů a prototypů. Bohužel zřejmě často dochází k tomu, že prototyp přeroste svůj původní cíl a pak už se to nikomu nechce přepisovat do něčeho vhodnějšího a bezpečnějšího pro rozsáhlejší projekty (tedy staticky typovaného). To bude tipuji i ten případ youtube.
Je mi 71 let, naučil a používal zažil jsem vše od Fortranu přes PL/I až relačním databázím a Javě a nakonec Pythonu a RPii. U Pythonu bych rád skončil. Už jsem v něm napsal vnukovi hru, to bych asi v Javě nedokázal, nyní se pouštím do paralelního programování také je v tom Python excelentní. Python je esencí toho nejlepšího co se kdy na IT poli urodilo. Long life to Python !!!
Já jsem to dokázal jak v Javě tak dokonce i v C++. Pokud jde o OOP v C++ tak jsem si řekl, že už v tom napíši tak akorát ten jeden program. Java je lepší, ale také je to se skřípěním zubů. V Pythonu je to simple clever. Já chci aby se můj vnuk dostal k počítačům tak, že se si v Pythonu naprogramuje pro RPi řízení akvaria pro rybičky nebo autodráhy a ne že bude teoreticky pitvat paradigmata OOP (ala Matfyz), ale že k tomu počítači přijde, zkusí, opraví vylepší a bude mít radost, že mu to něco reálného dělá. A to mu umožní jen Python. Konec konců jak umí Python propojovat části kódů v různých jazycích zejména C, to že má skvělé knihovny zpřístupňující snad každou myslitelnou funkcionalitu. A pokud potřebuji rychlost tak optimalizuji v C a propojím s Pythonem. Kolik už po světě pracuje amatérských robotů řízených kódem v Pythonů a kolik robotů řízených prostřednictvím Java 8.
A propos kolik je vám let, že na potkání tykáte možná o 50 let staršímu člověku, kterého ani neznáte. V KSČM nejsem a ve stejném ročníku na universitě jsme také nestudovali.
Jde o to, že díky silné typovosti je to v javě jednodušší, protože člověk vždy ví, co mu do/z kódu vyleze. A je mnohem jednodušší/bezpečnější/ve výsledku rychlejší program upravovat a rozšiřovat, obzvláště když postupně naroste. Opravdu si to chce vyzkoušet. Dělám v javě a trochu v pythonu.
S tím vykáním - sorry, ale tohle mi ani nenapadlo. Nikdy jsem tu nikomu nevykal, stejně jako většina ostatních. Nic osobně, prostě to tu tak je.
1) python má dnes také typovou kontrolu, v některých ohledech přísnější než Java (null safety).
2) v minulosti jste zde odkazoval na váš projekt na githubu. Nepíšete testy. Ze stylu bylo jasné, že nepoužíváte žádný linter.
V něčem určitě máte pravdu, ale některé vaše špatné zkušenosti mohu plynout z nedodržování best practices.
Pamatuji doby, kdy testování končilo okamžikem, kdy z kompilátoru vypadl kód a né errory. Mezi best practices patžilo rozumné pojmenování proměnných a komentáře k funkcím - plus rozumné odsazování zdrojáku, aby se to líp četlo.
Pak přišly IDE a bylo po legraci.
A nakonec různé automatizované testy, CVS a sdílení kódu - a dnes aby se jeden bál naprogramovat přepis vstupu na výstup, aby mu jiní nevyprášili kožich za bezpečnost kódu, nedodržování standardů či zvyklostí a používání vůdů místo dokumentování kódu.
Taky byly doky, kdy kružnice byla "když (x*x)+(y*y)=(r*r), vybarvi bod";
pak přišlo "nakresli kružnici o poloměru r",
potom "deklaruj geometrický objekt kružnice a poloměrem r, vykresli" -
a dneska nejdřív musí odborník na UX rozhodnout, že od kružnice uživatel očekává, že nebude mít příliš mnoho rohů.
V tom kódu jsem použil maximum typových anotací, co jsem našel. Opravdu rád bych se tu typovou kontrolu naučil, momentálně píšu v pythonu další projekt a chci typovat co nejpřísněji, protože jsem na to z javy zvyklý. Typy proměnných, výstupní typy metod, to vše samozřejmě používám. Hodně bych potřeboval generika kolekcí a "anotační" přetypování na potomka. Máš nějaké linky?
Opravdu nepíši testy, že mi z pole vyleze datový typ ten a ten. Na to jsem zvyklý z javy, že jiný díky generikům nevyleze. Nevidím přínos dynamického typování v tom, že si musím vše následně hlídat testy. Od toho mám v javě kompilátor.
Linter jsem si musel najít, co znamená, psal jsem, že python není moje doména. V pycharmu je samozřejmě integrovaný a není úplně špatný. Leč kouzla nedokáže, když tam ta informace není. Samozřejmě základní typové chyby to s typovými anotacemi hlásí rovnou. Zajímalo by mě, jak jsem tuhle informaci z toho kódu vyčetl.
Už jen třeba přidání proměnné do metody - v javě díky typům zcela spolehlivé, v pycharmu výsledek tristní. I přejmenování metody není stopro spolehlivé, nerozpozná spolehlivě stejně pojmenované metody různých tříd a to je úplný základ. Nebo existuje lepší IDE na python, než pycharm? Opět se rád poučím a využiju to.
Jestli si chce vnuk jen hrát, tak supr, na takové to domácí žvýkání dobré, ale na vážnou, větší práci to už asi stačit nebude, tam je právě pak potřeba to pitvání paradigmat, aby se z kuchtíka stal kuchař (jak tu někdo podotknul). Problémem pak je, když jsou projekty obsazeny takovými kuchtíky, to pak vypadá jak to blikání diodou.
Jako profesní Javista a Pythonista musím říct, že moderní Java (8) se mi líbí víc než Python (2/3).
Python totiž v paralelním programování opravdu excelentní není (přečtěte si něco o Global Interpreter Lock!), pokud nepoužijete čistě IO thready nebo knihovnu multiprocessing. Vytvořit v Javě (čísté! žádný JBoss) thread pool a posílat do něj úlohy je o dost jednodušší než v Pythonu. Silná typová kontrola a ekosystém (maven, funkční refaktoring v IDE..) jsou taky dost ve prospěch Javy.
Na druhou stranu.. Python a NumPy (+ pár dalších) je v tuto chvíli asi nepřekonatelná kombinace na matematické věci a Python je obecně velmi dobrý jazyk na vytváření DSL (Domain specific language), takže pro vědce ideální.
V ostatních věcech je to spíše o tom, co potřebujete. Není třeba moc rozdíl (v principu) mezi Python list comprehensions a Java streams. Funkcionální prvky mají už taky oba jazyky (Java 8). Java je relativně náročná na paměť a čistý Python zase na výkon CPU. Python rychle startuje a Java umí skvěle optimalizovat dlouhoběžící procesy.. atd.
Ale co se tématu týče: Nejlepší jazyk na výuku programování byl podle mě Pascal. Silně typovaný bez nutnosti hned používat ukazatele.. jen by to chtělo doplnit vyšší datové struktury.
Zásadně se nelišíme v názoru. Jen nahodilé poznámky. Moje zkušenosti s Javou jsou malinké, pár věcí se mi na ní líbílo.
Přesto jsem před lety skončil u Py. Má obrovské kouzlo, spojení jednoduchosti a síly či didaktičnosti. Byť tehdy to vypadalo, že nejvíc peněz je v Javě. Tehdy. :-)
Prosím rozlišovat jazyk (Python) a jeho implementaci (např. CPython s GILem).
PyPy je zajímavý na JIT optimalizaci. Zíral jsem, jakého zrychlení je schopen. Stupeň kompatibility je vysoký.
Pro výuku programování například paralelizaci nepotřebuju.
BTW, učím lidi už řadu let a když ilustruju moc modulu multiprocessing v Pythonu, lidičkám svítí oči jako mně. :-)
Pár vyjadrení k problematike C a spol. sa dá nájsť aj v článku Getting started with Go ;)
C is the Latin of programming languages. It inspired JavaScript, Ruby, Python, C++, C#, and Java. A few of those languages are even written in C.
As Bjarne Stroustroup, creator of C++ puts it: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off."
Prirodzene, odporúčajú práve Go: ...learning Go is one of the best investments you can make as a programmer.
Moc nechápu zdejší disputaci, zda pro 1. jazyk je lepší C (nízkoúrovňový, blíž hw) nebo Python (vysokoúrovňový, blíž lidskému uvažování, snažší modelování reálného světa). Připadá mi, že proponenti C (jakkoli je to jazyk fantastický pro svůj účel) nedoceňují, co student osvojující si nový myšlenkový svět potřebuje.
To jiste, .... a vyleze z toho dalsi nekola ....
Pokud nekdo programovat zacina, tak V ZADNYM PRIPADE A NAPROSTO NIKDY nesmi pouzivat zadny knihovny. Protoze vi lautr hovno co to dela, a vysledek je, ze ma GB kodu a vubec netusi proc.
Vzit 100MB knihovnu a zavolat "vykresli krychli" ho nauci leda velky hovno.
A je to videt i tady, protoze sem zcela pravidelne chodej deticky, ktery cekaj ze ten domaci ukol za ne nekdo udela, a oni pak jen cpy&paste odevzdaj. Bez nejmensiho poneti o tom, co to vlastne dela. A plati to od ZS pres SS po VS, protoze je to vsude stejny, jen se pak cas od casu nekde resi "afera", ze zaci/studenti opisujou. Aby taky ne, kdyz tomu zadavatel rozumi jako koza petrzeli, ne-li jeste mnohem hur, a zadava porad dokola totez, pricemz zhodnotit kod a nechat si ho vysvetlit, na to nema. Kdyby se totiz zeptal, tak by zjistil hned, ze dotycnej vubec netusi co to dela.
@j
Jasně, pak si naistaluje třeba Julli a místo toho aby stahl pythoní knihovnu s GUi pro grafy, tak to bude hned pro začátek pár let sepisovat sám.
Naopak kód knihoven, jejich dokumentace a styl fungování je koilikrát, a speciálně pro začátečníky, parádní návod jak nedělat hovadiny hned od začátku a něco se přiučit, to samé platí pro frejmvorky, místo toho aby se celou ZS, SS a VS učili něco patlat podle 10 let starých osnov a vlastní nezkušenosti. Pak se tu zas budeš rozčilovat co to ze škol leze. Stejně bych chtěl vidět školní zadání a k němu kód, kde jenom nalinkuješ knihovny a nic netvoříš . . .
2NULL: Kdyz se nekdo uci prgat, tak nebude delat zadny grafy ani zadny gui natoz naky objety dedicnost nebo cokoli podobnyho ... a prave proto ze se podobny picoviny ucej, to pak vypada ...
Prileze absolvent VS, ze prej programator, a kdyz se ho zeptam jaky typy smycek zna, tak nevi co je to smycka. Kdyz po nem chci, aby mi ukazal co kdy kde naprogramoval, tak vytahne nejakej silenej dev balik ... a aniz by tusil co to vlastne dela, tak tam neco nekde vygeneruje, ale jakmile mu reknu, ze chci ten zaviraci krizek kulatej, tak je v riti, protoze nema paru kde ...
Dtto vsemozny frejmworky ... dostane za ukol seradit 10 cisel ... a stahne si na to klidne cely SQLko, protoze se mu to nekde nejak samo spusti a nekde se mu nejak vygeneruje nejakej konektor ... pricemz i kdyby napsal ten nejblbejsi a nejpomalejsi algoritmus kterej napadne maly dite, bylo by to nejmin o rad, ale spis o 2 az 3 efektivnejsi.
Ale jo, az budu potrebovat zrejt zahradku taky si objednam http://img.blesk.cz/img/1/full/346020-img-rypadlo-stroj-bilina-v0.jpg
Takze nas tu clovek, co sam neumi cist, poucuje o tom, jak programovat...
Tak jeste jednou a pomaleji, at mas sanci i ty: jako prvni knizku nedavame detem Kafku. Ridice neposadime pri prvnim usednuti za volant do zihadla na plnou silnici. Fyziku neucime od kvantovky. A uplne stejne ma smysl zacit vyuku prgani s necim bezpecnym a motivujicim. Nikdo nerika, ze se tam ma skoncit (ale porad lepsi, kdyz NEPROGRAMATOR pobere trebas zaklady pythonu s tim skonci. Pak je pouzije na hrani nebo na zakladni analyzu dat). Vcelku souhlasim s Joelem, ze v ramci vyuky programovani musi casem programator potkat pointery a rekurzi - na tomhle se nalame chleba. Ale nikde neni psane, ze to musi byt na zacatku. Nekdo se tam dostane, nekdo ne.
@j
Neuraz se, znám spoustu lidí z VŠ a nemyslím si programátor který vyleze z VŠ neví co je smyčka. Možná se mu ta smyčka poplete se smyčkou na provazu, když si představí že by tam pracoval a slyší ty tvoje kecy.
Hlavně si vědom, že učit se jazyk neznamená jenom zopakovat první tři díly z nějakého tutoriálu. Daleko víc se člověk naučí při tvorbě něčeho reálného než přeťukáváním nějakých lekcí někde z Moodlu. A když děláš něco reálného, tak zahrneš i ty knihovny, ostatně znalost IDE, includování souborů a knihoven, jejich aktualizace, VCS atd. jsou důležité disciplíny.
Ono to právě často vypadá jak to vypadá proto, že v současné době se na ZS a SS většinou ty frameworky vůbec k výuce nepoužívají a učitel nakonec než by to s 20 lidma celé prošel a měsíc předělával, tak jim dá něco jako 2- a hurá.
U Vás dáváte jako test pro programátory seředit 10 čísel? To jste co za výzkumný ústav, že máte takové nároky?
Tj, kreteni tvyho formatu muzou ucit leda imbecily ktery jim posle chocholousek.
Vis ty imbecile co se uceja maly deti?Vis o tom leda hovno ze? Maly dete se ucej jak si naprogramujou blikajici LEDky. Ty schopnejsi zvladnou hada. A sou z toho nadseny, protoze to vazne neco dela. Nepotrebujou na to zadnej frejmwork ani zadnej balik na desitky GB, staci jim na to libovolne textovej editor.
Asi tak. To když už low level jazyk, tak Rust, který dovede v překladači dost poradit. Ale rozhodně Python. Programátorů je hrozně málo. A odradit je hned první den jazykem jako C je hrozné plýtvání. Protože z těch co by odpadli se nakonec mohou vyklubat slušní programátoři, nebo aspoň lidi co si zvládnou automatizovat část práce. A už to je vzácnost a obrovská výhoda.
Potřebuje maximální jednoduchost a pochopitelnost, žádné zbytečné formality. Pro začátečníka je ohromný přínos interaktivní konzole v které si může testovat věci s okamžitou odezvou a umožňuje snadnou introspekci. Někdo si základy programování představuje na vysoké, hako kdysi, ale teď se už učí programovat děti na základní škole, na prvním stupni, sotva se naučí číst a psát. Při čtení texu slabikují, na klávesnici zápasí s tím, jak napsat uvozovku, ale v pythonu už umí psát jednoduché programy.
Koukám, že je tu plno názorů a pěkný flame co je a co není dobré, samozřejmě vše od zkušených programátorů. Ale učil už někdo z vás někdy? Já jsem učil několik let na VŠ mj. prváky hned po střední, kteří většinou nikdy neprogramovali. U nás se učila Java. S klidným svědomím si troufám říct, že učit umím dobře. Mám na to skvělý feedback od studentů i pedagogické vzdělání (paralelně s odborným). A moje zkušenosti?
Chtít po prvácích co nikdy neprogramovali, aby se za jeden semestr naučili "celou" Javu vč. OOP konceptu, networkingu, GUI, vláken, kolekcí atd. je naprosto mission impossible. Tohle zvládlo vždy pouze nejlepších 10% v daném kruhu. Ostatní se trápili s konceptem OOP, kterým se podle osnov začínalo, a když přišla řeč na podmínky, cykly a rekurzi, tak zezelenali a nevydali ani slovo.
Takže za mě Java a OOP jako první programovací jazyk fakt NE! K čemu je studentům že "chápou" objekty, když shoří na cyklech a podmínkách. A pokud se vykašleme na OOP a odložíme to, tak proč se trápit s Javou? Statická analýza kódu a IDE na steroidech je pak strašně pletou, nerozumí věcem jako kompilátor, nevědí že program jde spustit z konzole atd. Já jsem se před XY lety učil v Pascalu a dodnes si myslím, že to byl naprosto skvělý začátek. Jazyk jako takový nic moc, ale ty základy co mi dal jsou k nezaplacení. Myslím, že by to chtělo najít nějakou moderní alternativu a nad ní něco učit. A bez IDE. Aspoň první semestr, hezky lowlevel. Nemůžeme přeci barák stavět od střechy. Jinak produkujeme bastlíře co tomu kloudně nerozumí, programují metodou pokus omyl (bohužel zkušenost, 80% současných vysokoškoláků to tak dělá) a vůbec netuší, co se děje pod kapotou. Dle mého názoru tací lidé by neměli mít VŠ, když nejdou do hloubky.
Abych to shrnul, pojdme se trochu zamyslet nad konceptem a začněme učit opravdu od základů v něčem jednoduchém a přehledném. V čem? To nevím. Ale C je moc komplexní, Java moc ochranářská a Python toho hodně tají, chybí tam typovost a za mě už je tam moc abstrakce.
Co se poohlédnout po něčem sice exotičtějším, ale uzpůsobeném k výuce? Vždyť člověk co umí programovat v A se rychle adaptuje na B, je to jen syntaxe. Ale člověk co bastlí A a houby tomu rozumí, tak na B přejít nedokáže, protože v reálu nechápe o co tam běží. Bude to zase bastlit a časem to dostane do takového stavu, že to "snad funguje".
C je moc komplexní? Nemluvím samozřejmě o C++... Mně to přijde jako jeden z nejjednodušších jazyků, vždyť to prakticky nic neumí (v porovnání s Pythonem, Javou apod.). A navíc z jeho syntaxe vychází řada dalších populárních jazyků, což se o Pascalu říci nedá. A je extrémně rozšířené a funguje prakticky na každé platformě... s tím se člověk neztratí i kdyby se chtěl věnovat pouze Céčku v budoucnu. Co chtít víc?
Tady je bohužel vidět, že jste nikdy nepřišel do styku s tím, co produkují dnešní střední školy, ...takže co víc chtít? Aby se na VŠ hlásili lidi co 1) umí trochu programovat, 2) nejsou úplně mimo. Pak se možná má smysl zabývat C. Ale za současné situace a současného trendu to prostě není dobrá cesta.
Tady je spis problem v tom, jak funguje uplne cely nase skolstvi a to funguje z pohledu vsech budoucich zamestnavatelu naprosto nahovno a to na vsech urovnich.
Ze zakladni skoly to vyleze s tim, ze sice umi vetnej rozbor a vsechny ty pricesti, prisudky, casy, rody ... pamatuje si to zpameti vsechny mozny i nemozny krale, cisare, knizata ... ale urok si to spocitat neumi. Kdyz to dostane do ruky koste, privodi si tezky zraneni, protoze ho vzivote nevidel(a).
Na stredni se za nejdulezitejsi znalost pro budouci povolani povazuje epizeuxis, a kazdej spravnej prumyslovak to musi zvladat jak kdyz bicem ... ze elektrikar nepozna kondenzator od odporu uz tak nejak nikoho nezajima.
Mno a kazdej spravnej vysokoskolak musi pekne odvozovat derivaci z limit, recitovat maxwelky, sepsat asi tak 14687987987 variantu laboratu na tema kyvadlo ... zato jakej je rozdil mezi for a while netusi (on teda klidne netusi, ze neco takovyho vubec existuje, protoze vsechny domaci ukoly mu vyresil nekdo na rootu a on je proste odevzdal ...).
Ja bych teda tak nejak cekal, ze pokud se VS hodla holedbat tim, ze je to IT VS (trebas FIT CVUT) tak se tam student, kterej programovat neumi, nedostane vubec. Jenze realita je ta, ze ten co programovat umi, odtamtud rychle utece, protoze prvni zamestnavetel kterej ho potka mu nabidne ... penize ... a ucit se muze co chce. Nauci se toho totiz (sam) mnohem vic a kvalitnejs. A nemusi se ucit ty naprosto nesmyslny kravince.
Pricemz ten, co programovat umi, se to stejne naucil doma, mozna tak maximalne v nejakym krouzku nejakyho osvicenyho vedouciho.
Navic specielne na tech VS ucej z 50% duchodci a z 50% asistenti, kde plati, ze bud praxi videl naposled pred 50 lety, nebo praxi nevidel nikdy, protoze v ty skole zustal hned potom, co ji dodelal.
Na SŠ se už programování neučí? Skutečně se ptám, za nás se totiž probíral Pascal, na VŠ přišlo po prvním semestru s Pascalem samozřejmě na řadu céčko a potom teprve další paradigmata (tehdy LISP, Prolog).
Ptám se proto, že jsem už ztratil iluze, že se základy algoritmizace naučí děcka uz na základce. Škola sice má nějaké licence na Baltíka nebo Baltazara, ale nemá to kdo učit (navíc to prý není v osnovách ani v rámcovém programu), takže dělají pořád Word, prezentace a ... už vlastně nic :( K tomu jen ocituji ze stránek školy "Na naší škole je rovněž rozšířená výuka informatiky a na druhém stupni si naší žáci mohou vybrat větev s rozšířenou výukou přírodovědných předmětů."
Takže už i na SŠ to tak upadlo?
Nevim kdy je "za tebe", ale co ja vim, tak v prvni hodine toho packalu (na ty stredni) sme dosli k zaveru, ze i ten nejvetsi mamlas v rocniku umi programovat o 3 rady lip, nez ten co nas to ma ucit. A od ty doby sme si proste delali co zajimalo nas, a "ucitele" sme meli u rite. Kdyz mel naky pindy, tak sme mu hackli jeho stroj, a mel na par hodin o zabavu postarano.
Vysledek byl ten, ze sme meli neomezenej pristup do uceben, mohli sme si tam prgat klidne do 10 vecer. Vymenou za to, ze nebudem hackovat ty ucitelsky stroje ;D.
Vyuka informatiky na zakladce vypada tak, ze duchodkyne predcita kapitoly z "zaciname s pocitacem", a dava deckam za domaci ukol vetnej rozbor z precteny kapitoly. V lepsim pripade se deckam do hlavy vtlouka, ze na text se pouziva word, a zkousi se, jestli si pamatujou kolikata polozka zleva je ulozit.
Jo a na ty VS ... to vypadalo (za me) vubec nejlip ... to ti byla takova parada, ze se zapoctovej test psal na papir, a resilo se, jestli tam sou stredniky.
Nedelal bych si iluze, ze se na tom neco zasadniho zmenilo.
Škola funguje takhle:
1. Potřebujeme přežít další rok, ať nejsme bez páce.
2. Aby nám to nezavřeli, budeme držet hubu a splníme všechno, co od nás chce zřizovatel a MŠMT
3. Jsme placení od kusu, nebudeme vyhazovat ty, co to nedávají.
4. Nebudeme je zbytečně zatěžovat. Žáci nebo rodiče by si mohli stěžovat a z toho by byly problémy.
Výjimkou z 3 byla VŠ, tam nabrali do prváku všechny a do letního semestru hodili dva filtrační předměty. Ono to bylo výhodný, přednáška z matiky v aule stojí stejně, ať tam je 20 lidí nebo 200 lidí, ale je jinak placená státem. Ti, co vypadli na filtrech, to buďto zabalili, nebo zkusili druhák. Když to nedali ani tam, konec... A ve třeťáku v laborkách už nebyla taková tlačenice (přece jenom ty kity s DSP, FPGA něco stojí a je rozdíl mít u nich 20 lidí nebo 200 současně nebo o 10 vyučujících víc...). Ze 30 lidí na začátku nás státnicovalo šest...
Pozor: C je velmi jednoduchý jazyk, a docela přehledný... pro někoho kdo zná hardware. Tedy přesněji řešeno, kdo zná jednoduchý hardware - hradla a KO, paměti, osmibit procesory, atd.
Bez těchto znalostí se těžko bude vysvětlovat co je to pointer a proč. Koneckonců, já osobně jsem to zažil, když jsem se pokoušel naučit Pascal podle článků ve VTM a knih půjčených z knihovny (samozřejmě bez počítače, kde bych ho vzal). Prostě ten ukazatel mi pořád nějak nebyl jasný. Až do té doby než jsem si později prakticky vyzkoušel asembler Z80 (navíc mi už bylo víc než 12, to také pomohlo :-).
Cčko je fajn na relativně jednoduché systémové věci - ty se v Cčku dělají docela jednoduše přímočaře. Účetnictví bych v tom dělat nechtěl. Jinak není moc tak jednoduchých jazyků jako je Cčko. Rozhodně to ale není ideální jazyk na výuku programování - pokud bych nechtěl programování znechutit 90% děcek. Pár procent má talent od přírody, pár zase motivaci, a zbytek by se zablokoval nebo vyděsil. Pro začátek může být Python docela fajn - Cčko až v druhém nebo třetím kroku. Na Pascalu ale něco bylo - nebyl úplně nízko, ale taky zas moc nezakrýval. A v 90 letech na PC nebylo nic v čem by se dalo rychleji psát.
Souhlas - Cčko je nedoceněný jazyk - co se týká jednoduchosti. Ale to je jenom jedna dimenze. Další je složitost procesu kompilace, možnosti ladění, komfort knihoven ... A to jsou všechno zbytečné klacky pod nohy lidem, kteří se mohou programovat, byť nikdy nebudou programátory.
Na školách se 100% děcek učí programovat - z toho tak 5% max se bude programováním živit. Pro začátek není nutný hard core - ale něco, co 95% zvládne a mohlo by někdy použít - třeba makra v Excelu - nebo ten Python pro jednoduchou algoritmizaci.
Je rozdíl jestli učím budoucí programátory, kteří se budou programováním živit, nebo neprogramátory, kteří si mohou programováním automatizovat práci, kterou by jinak dělali ručně.
Neprogramator se nema ucit programovat ... dalsi ukazka tragedie naseho skolstvi. Pokud se budem bavit o ZS, tak programovani ma smysl jako volitelnej predmet/krouzek pro zajemce. Decka se maj ucit veci pouzivat a to pokud mozno bezpecne. Viz vejs, pak to vypada tak, ze jim nekdo vtlouka nejaky i trebas ty makra, ale poslat email nezvladnou. Vetsina toho co dneska vyleze jak ze strednich tak z vysokych skol nezvlada v tom excelu secist sloupec cisel. A prave to je doslova katastrofa. Ze neumi napsat makro je v tomhle ohledu tak nejak naprosto nezajimavej detail.
Kdybych to nezazil vsechno osobne, tak to nepisu, je to tejden co za mnou dotazil "pan inzenyr" ... a ptal se, jestli by nejak neslo, ze uz hodinu posila maily zakaznikum, kazdymu zvlast ... kupodivu pouzil aspon 1/2 mozku, a neposlal to vsem (chapal ze neni dobrej napad aby vsichni videli komu to jeste poslal).
To mam trebas takhle ve svym "VIP" hezkej mail kterej dorazil z jednoho retezce ... pekne s kontaktama na vsechny jeho dodavatele v danym segmentu (byla jich tam asi tak stovka).
To jsi těžce v omylu - programování je dost široký pojem - a hromada lidí může a taky docela s úspěchem "programuje" .. reporty v databázích, analyzuje data, vytváří a ověřuje výpočetní modely. Je otázkou, jestli velká část uživatelů Rka jsou víc programátoři nebo statistici.
Všichni nejsou geniální jako ty - a určitě jen minimum lidí tuší jak funguje SMTP - ale většina může používat počítače inteligentně ke svému prospěchu - a chybama se člověk učí. V podstatě všechny děravé operační systémy a služby napsali jenom programátoři - a dost možná, že hodně z nich mělo přístup ke svým zákazníkům a okolí podobně kritický (asociální) jako máš ty.
Skriptování není programování? Když už se za programování někdy bere i psaní HTML stránek? A co tvorba SQL dotazů, což kolikrát nezvládnou ani profi programátoři. V čem se liší skript v VBA v MS Excelu od skriptu v Pythonu v Calcu? A jak moc se liší skript v Pythonu pro Calc od jiného programu v Pythonu - než použitím jiných API.
Jen je to takové divné. Třeba předminulý sprint jsem programátorka nebyla, protože jsem patlala Python. Tenhle sprint pracuju na jedné části backendu v C++, takže programátorka jsem. To že ta věc v Pythonu byla algoritmicky podstatně složitější než ty úpravy v C++ kódu kde potřebuju dopsat jen nějaké validace dat, to je věc jiná. Prostě, jazyk rozhoduje! :D
Mám tu zkušenost, že to studentům dělá problémy, protože nemají praxi a nemají pod kůži zažité normální operace s proměnými a nevidí ten rozdíl, netuší k čemu je to dobré - to že jim to někdo řekne a oni se to naučí zopakovat ještě neznamená, že to chápou. Nejsou jakoby zvyklí vidět ty definice a operace s proměnými jako bloky a výsledky, ale jako hromadu direktiv kterí musí odcitovat a protože je nemají zažité, tak se v tom ztratí - a že s pointery se dají provádět různé skopičiny. To je pak těžko.
Jinak je to logické, protože v asembleru se pracuje právě s těma adresama na kterých jsou ty hodnoty
Oni dnes studenti dost často ani neví co je RAM. Respektive si pamatují definici, ale nerozumí jí. To se pak věci jako pointer nebo zásobník těžko chápou. Datový typ chápou jako semantickou konstrukci. Jazyky typu Python je v tom pak podporují. Nějakou souvislost datového typu s jeho reprezentací v paměti nehledají.
To pak řešíte otázky, že mu to pro větší testovací úlohy padá s nějakou chybou. A vysvětlit dotyčnému, že prostě nemá dost RAM na miliony instancí, bývá problém. Protože v tom nevidí souvislost. Poznáte to podle jejich snahy to obejít. Třebas místo seznamu o 100k záznamech chtějí vytvořit 10 seznamů po 10k záznamech. V jejich hlavě je to prostě omezení "funkce ABC umí maximálně XY záznamů". Legrační je pak když se snaží zjistit, jaký je přesně ten limit na počet instancí. A výsledné číslo jsou schopni skutečně nacpat do testu a nahrát výsledek do repozitáře.
Mikrořadiče a assembler na ně.
> Oni dnes studenti dost často ani neví co je RAM. Respektive si pamatují definici, ale nerozumí jí.
Taková situace by se podle mě ale neměla řešit použitím jazyka, u kterého není potřeba vědět, co je RAM (jak asi bude vypadat kód od takového člověka?), ale vysvětlením, co je RAM.
Akorát, že shrnul úplně jiný problém.
Joel píše, že ten, kdo se chce programováním živit jako svou hlavní pracovní náplní, by měl umět více, než Javu a že školy by měly chtít po studentech hlubší pochopení - a to učit a testovat na těžších jazycích. S tím se snad nedá nesouhlasit.
Většina téhle diskuze se ale točí tom, jaký by měl být PRVNÍ programovací jazyk pro výuku nováčků. První, nikoliv jediný. A vůbec se nebavíme o tom, jestli se ten člověk učí programovat proto, aby to bylo jeho hlavní zaměření.
Tak jako se dneska mohou naučit řídit lidi, kteří nechápou a nepochopí, co je synchronizace převodových stupňů, nebo dokonce ani nechápou řazení jako takové, tak se dneska mohou naučit NĚJAK programovat lidi, kteří nechápou a nepochopí, co je pointer. Na to, aby si statistik programovat něco v pythonu, VBA, nebo nějakém matematickém balíku ho opravu není nutné zatěžovat pointerem.
Na to nepotřebuješ C. Už 8 letý kluk je schopen pochopit jak to s pamětí, proměnnými a (ne)měnitelnými hodnotami v Pythonu. Jen je potřeba to umět vysvětlit.
Začínám to vysvětlovat názorně tím, že všechny informace jsou v počítači uloženy jako čísla, protože procesor umí pracovat pouze s čísly. Takže všechno se převádí na čísla - text, zvuk (hrátky se soxem), obraz (zkoumali jsme při tom třeba televizor mikroskopem, aby viděl, že každý obrazový bod se skládá ze třech světýlek, které mohou svítit jasem 0 až 255).
Pak je potřeba vysvětlil, co je to číslo pro počítač, vysvětlit pojem bit, byte a dvojkovou soustavu, naznačit i hexa a oktalovou. Na to byla velmi užitečná interaktivní konzole pythonu.
Od toho se už dá přejít s vysvětlením ci je to paměť. Součástka, která má miliardy paměťových buněk, kde každá buňka si pamatuje jedno malé číslo 0 až 255 a má svou adresu, což je řada jedinečných čísel, po každou buňku jedno. Adresaci paměti a omezení u 32 bit procesorů.
Všechno maluji, ram je dvousloupcová tabulka se sloupci adresa a hodnota. Velmi intiutivní, děti to chápou hned. Od toho už je jen krok k vysvětlení, jak se ukládají v paměti větší čísla než 255.
A pak už je možno si vysvětlit, co je to proměnná, hodnota a reference mezi proměnnou a hodnotou. Všechno o čem mluvím zapisuji pro názornost do té tabulky, byť trochu zjednodušeně. Ukazuji jak jsou v paměti uloženy čísla, texty, seznamy. Rozdíl mezi měnitelnými a neměnitelnými hodnotami.
Nemyslím si, že by poždější přechod z Pythonu na C měl pro takto vzdělaného kluka představovat nějaký šok. Reference jsou v podstatě pointery a přímé adresování paměti, které v Pythonu není, je na pochopení ta snadnější část.
Představa, že když se někdo učí programovat v pythonu, taj je pro něj všechno black box, je lichá. Pokud má dotyčný chápat co dělá, je nutno mu tyto základy vysvětlit tak jako tak. Bez toho je nepochopitelný blackbox i to C. Ale v Pythonu je to všechno mnohem jednoduší interaktivně předvádět, zkoušet si to, používat a proto i pochopit.
> Mně to přijde jako jeden z nejjednodušších jazyků
Naprostá většina začátečníků má problém pochopit jak se program vůbec vyhodnocuje, jak založit proměnnou, jak zavolat funkci, prostě naprosto základní věci. Takže když chtějí, aby bylo vidět co program dělá a zkusí správně zavolat printf, tak většina lidí končí kvůli naprosté ztrátě motivace. To co tady píšeš prostě ukazuje, že jsi moc lidí programovat nenaučil, vrať se až budeš mít pár zářezů.
Tato diskuze je cela zoufala, protoze vetsina z diskutujicich neni schopna rozlisit programovani ve smyslu tvorba programu v nejakem programovacim jazyce a tvorba programu ve smyslu reseni algoritmicke ulohy.
Pricemz dulezity je ten druhy vyznam a ten prvni je podruzny, i kdyz nutny. Dulezite je umet vyjadrit myslenku, najit algoritmicke reseni, jak to zapsat je podruzne. Z tohoto pohledu jazyky typu C nebo Java nejsou dobrou volbou, protoze odpoutavaji pozornost; v jazyce C je to sprava pameti, v Jave je to zbytecna objektovost pro jednoduche ulohy.
Aby se z cloveka stal dobry programator, neni potreba hned nezbytne hrabat se v pameti a pretypovavat void * na cokoliv. Myslim, ze lidi, kteri se potkali se SICP (nebo jeho variantu) a v praxi nepouzitelnym Scheme, toho nakonec o programovani vi vic, nez ti, co zacali s C.
> a vůbec netuší, co se děje pod kapotou.
A tyto tusis? Podivej se na vypocetni modely a zeptej se, zda tento pozadavek ma vubec smysl. Co treba klasicky model provadeni programu. Mam prikaz v nejakem vyssim jazyce, ten se prevede na instrukce procesoru (jak se to provede zalezi na prekladaci a konkretnim procesoru), procesor si tyto instrukce rozebere na mikrooperace a posklada podle sve momentalni nalady. Pristup k pameti pres nekolik urovni cache je pak tresinkou na dortu. A to je jen takovy bezny postup. Virtualni stroj po ceste prekladu je dalsi bonus.
A ted si vem, ze vedle toho mame treba vypocty bezici v OpenCL. Myslis, ze clovek resici nejakou numerickou ulohu potrebuje znat, jak je nasobeni matic implementovano v OpenCL? Myslis, ze clovek chroustajici data s Hadoop/Spark potrebuje vedet, jak jsou jeho ulohy map/filter/reduce konvertovany na mikrooperace procesoru?
Nerikam, ze znalost C je k nicemu, ale bazirovat na tom mi prijde jako anachronismus. Obzlvast, kdyz mnohem dulezitejsi nez vyuka jazyku je vyuka algoritmizace.
Víš, pod každým článkem jsi za místního blbce, ale navzdory tomu že ti to říkají všichni ti to zatím nedochází.
Nechceš mi poslat ten linuxový kernel se stabilním driver abi, o kterém jsi bájil nedávno? Hodil by se mi do mé Xperie. Qualcomm totiž na nové verze jádra kašle.
Ale gratuluji, za poslední měsíc jsem napočítala asi 3 příspěvky od tebe, které byly k věci a nebyly naprostá blbost.
To je zas diskuze. Lidi by si měli uvědomit, že je rozdíl učit se obecnou algoritmizaci nebo programování pro dnešní HW. C člověka naučí jak funguje dnešní HW, ale pro učení algoritmizace hází lidem klacky pod nohy (zbytečně musím vědět co je pointer, kdo má odpovědnost za dealokaci paměti, prakticky nemůžu dělat immutable struktury, objektové programování v C je jako drbat se levou rukou za pravým uchem, funkcionální programování v C je jak drbat se pravou nohou za pravým uchem atd. atd.). Naopak z pythonu se sice nenaučíte nic o stávajícím HW, ale neleze vám do cesty při učení algoritmizace a umožňuje vám programovat strukturovaně, objektově i funkcionálně. Navíc 9 z 10 dnešních programátorů nikdy v životě v C dělat nebude a pointerovou aritmetiku potřebovat nebudou. A ten 1 z 10 co v C dělat bude, by se měl naučit, že C neumožňuje bezpečné programování, tak pokud ho použít nemusim, tak ho nepoužiju. A kdo mě chce tvrdit opak, tak se podívejte třeba jen tady na rootu do článků a zpráviček, kolik chyb v C programech bylo zaviněno úplně triviálními chybami, které přehlédli zkušení programátoři.
Tohle nepíšu jako nějaký odpůrce C, ale jako člověk, který se programováním v C/C++ dlouhá léta živí. Dnes a denně se setkávám s kódem od bastličů v C/C++, kteří nerozpoznají základní algoritmy a datové struktury. Nebo pro kód nevidí data a tak píšou šílenosti na stovky až tisíce řádků, které se dají snadno vyřešit použitím chytré datové struktury a rázem je jak přehlednost, tak rychlost programu úplně někde jinde. A to nemluvím o tendenci těch "nejzkušenějších" neustále znovu vynalézat kolo a všechno si psát od znova.
Ono taky zavisi, co (a jak) programujete :-)
Ja treba hlavne platebni terminaly a cipove karty (krome jineho).
Takze na nejaky python/lua/... a jine 'moderni' a 'cool' jazyky rovnou zapomente ....
Platebni terminaly: zacinalo se v assembleru (8051, x86), nyni jedine C (vetsinou arm, obcas mips); C++ je tak trosku podporovane, ale ma sve mouchy; javu par nadsencu zkouselo, ale rychle od toho upustilo :-)
Ono, kdyz ma terminal +-16MB RAM, relativne pomaly procesor, a vsechno musi byt certifikovane (EMV L1,L2, PCI PED, PCI PTS, ...) tak se do toho opravdu nic moc naprat neda. A na malloc() rovnou zapomente .....
Cipove karty: zacinalo se v assembleru (6502 like) jako 'filtery', nyni na 99% java. Ale neni java jako java, treba java na JCOP kartach nena funkcni garbage collector - takze stejne v tom programujete zase spise jako v C/C++ - co nejvice veci staticky, a pokud uz objekty, tak je vytvarite jednou pri inicializaci a v maximalne mozne mire je 'zneuzivate'.
Pamatuji si na jeden seminar, kdy nejaky ucitel rikal: ja zadam priklad, zaci si to napisi a odladi v simulatoru (eclipse); ja to pak u zapoctu nahraju na fyzickou kartu, poslu na to par APDU a karta nekomunikuje - student si totiz na kazde APDU vytvori novou instanci objektu .....
No a z me praxe: nejlepsi jsou pak takove hlasky: 'a vy nepisete unit testy'? A ma odpoved 'a jak to mam udelat' ?!?!?
U terminalu mam cross-compiler a musel bych to podepsat a fyzicky nahrat na terminal (a jak pak mackat klavesy ci protahovat kartu)? A uz java karty????
A nebo si muzu napsat simulant terminalu/karty, ale jakou to ma pak vypovidajici hodnotu, kdyz to bezi na necem uplne jinem .....
A já bych jako první programovací jazyk učil HTML. Už na základce nebo na střední. A když tě to baví, přihoď si CSS nebo JavaScript nebo pak i nějaký server-side jazyk.
Už to HTML učí tomu, že je něco jiného co píšu a co vidím, že záleží na každém písmenku a znaku, a co za magii je to zvýrazňování syntaxe.
Některé to nadchne, některé ne, ale přijde mi to jako užitečný úvod do počítačů pro všechny.
Z mého pohledu se Python opravdu může stát dominantním jazykem, důvodů je hned myslím několik
- dostává se do podobné pozice, jako byl v době osmibitů basic
- velice jednoduchý na naučení, nicméně na druhou stranu umožňuje poměrně sofistikované konstrukce
- díky balíkům Numpy/Scipy jednoznačně jasnou volbou pro vědeckou komunitu potřebující "prohnat" něčím naměřená data a daný script už nikdy nevidět
- integrovatelný do běžných aplikací jako scriptovací jazyk pro tvorbu nejrůznějších rozšíření ... a přiznejme si, pokud už běžný smrtelík chce něco programovat, je to takovýto případ chybějící funkce v něčem hotovém
Na druhou stranu jasnou nevýhodou je stále přítomnost globálního locku interpretu, který prakticky znemožňuje použitelný vícevláknový běh kódu
GIL je skutečně prokletím a jedinou slepou cestou v návrhu Pythonu. A stejně jako zde, se vedou na Python fórech vášnivé diskuze zda zrušit/nezrušit GIL (na těch pythoních mnohem fundovanější než zde). I s GILem lze naprogramovat velice rychlé paralelní programy v případě, že pracujete se soubory ať už z internetu nebo s obrovskými soubory fotek. Tam kde je I/O, je GIL vyblokován. Pro normální threading je to zpočátku s GILem pro začátečníka docela dobré, naučí se pracovat se sdílenou pamětí. Ale GIL lze také vypnout a pak je správa zámků na programátorovi a přinese mu bezesné noci. Vedle toho ovšem má Python knihovnu multiprocessing, která se sdílenou pamětí nepracuje a každý procesor má svou vlastní CPU a svou paměť. A komu je to málo, tak má Python importy OpenMP, MPI4 a další. A vůbec není náhodou, že se Python používá na superpočítačích na špičkové úlohy pro porovnávání sekvencí DNA. Tady zřejmě diskutují lidé, kteří nikdy nic paralelního nenaprogramovali a jen někde pochytili to, jaká hrůza je ten GIL. Na paralelním programování je nejkrásnější a také nejobtížnější procesní a paměťová dekompozice úlohy na procesory a skládání výsledků jejich výpočtů. Poslední umění, které v programování ještě zbylo, to ostatní už je jen robotárna ve frameworcích.
Ta integrace do různých prostředí je naprosto dokonalá. Já např. píši makra pro Calc v Open Office jen v Pythonu, existuje modul pro vstup a výstup do Calcu a na zbytek už je skvělý Python, žádný Basic.
Jen taková struktura tuple při práci s databází hodně zabrání napsání kódu, kde je možný SQL injection.
Napsal jsem si vlastní programy pro správu svého RAID pole v souborovém systému btrfs a včetně vyhodnocování dat SMART a to za dva dny. V C bych to psal měsíc, v Javě 14 dní v diluviálním bashi se mi to vůbec nechce dělat, PERL neumím.
A víte proč nyní NASA shání programátory v Pythonu? Protože, když máte někde u Jupiteru sondu a potřebujete něco opravit nebo změnit, tak to nejrychleji a nejefektivněji uděláte v Pythonu.
Ono, odstranit GIL z CPythonu, to už je vlastně hotové, loni měl o tom Larry Hastings pěknou přednášku na EuroPythonu. A proč tedy sále v aktuální 3.6 straší? No, protože díky němu je CPython rychlý tak jak je. Viz https://www.youtube.com/watch?v=fgWUwQVoLHo.
> že se Python používá na superpočítačích na špičkové úlohy pro porovnávání sekvencí DNA
A tam je to fakt napsané v Pythonu (což se mi moc nezdá, že by si někdo pořídil superpočítač a pak tam provozoval inherentně pomalý jazyk), nebo většinu práce dělá z Pythonu volaný nativní kód (který může GIL obejít)?
> Jen taková struktura tuple při práci s databází hodně zabrání napsání kódu, kde je možný SQL injection.
Ostatní jazyky používají pole a nepřijde mi to o moc jiné…
Lidi, prosímvás, šetřete svůj čas.
Pár tipů na rozpoznání: http://hogreta.blog.cz/1206/nic-cloveka-nerozhodi-vic-nez-srazka-s-blbcem
Blbec je do diskuse motivovan jinak než ti, kteří se chtějí dobrat konsenzu a poučení.
Blbci jde sobecky o sebe. Neasistujte mu v tom.
Pokud se s blbcem hádáte víc než půl minuty, už se hádají dva blbci.
Agresivita a bohorovnost maskují strach a slabost.
Na tom není nic inspirativního, přínosného.
Ano, to je dobře řečeno, kde mohu, tam použiji python :-).
Na rozdíl od jiných si myslím, že je to výborný první jazyk, protože je velmi jednoduchý, poměrně konzervátivní a jednoduché věci v něm jde dělat jednoduše. Díky tomu se lze rovnou učit programovat a člověk se nemusí zabývat různými mnohdy složitými obskurnostmi. Kdo se snažil učit programovat 8 leté děti, které se sotva naučili číst a psát mi dá za pravdu.