Přejít k navigační liště

Zdroják » Různé » Nebezpečí Java škol

Nebezpečí Java škol

Články Různé

Jsou pointery a rekurze latinou softwarového inženýrství?

Nálepky:

Článek je překladem textu The Perils of JavaSchools, který napsal Joel Spolsky (mimo jiné spoluautor stackoverflow.com). S jeho laskavým svolením na serveru, kde už je více jeho českých překladů, jsem text přeložil do češtiny (překlad je uvolněn pod licencí CC by-nc-sa).

29. prosince, 2005
Líná děcka.

Kam se poděla tvrdá dřina?

Jistou známkou mé senility je naříkání nad „dnešními dětmi“ a nad tím, jak už nechtějí či nezvládnout dělat cokoliv obtížného.

Jako dítě jsem se učil programovat na děrných štítcích. Pokud jste udělali chybu, neměli jste žádnou z těch moderních vymožeností jako tlačítko zpět, abyste chybu napravili. Museli jste štítek vyhodit a začít od začátku.

Když jsem v roce 1991 začal dělat vstupní pohovory s programátory, nechal jsem je vybrat si libovolný jazyk k řešení problémů, které jsem jim dal. V 99 % případů si vybrali C.

Dnes dávají přednost Javě.

Nechápejte mě špatně, s Javou jako implementačním jazykem není nic špatně.

Počkat, chci změnit své prohlášení. V tomto konkrétním článku nepíšu nic o tom, že je Java špatný jazyk. Je mnoho věcí, co je na ní špatně, ale to je na samostatný článek.

Místo toho bych rád zdůraznil, že Java není dostatečně složitý programovací jazyk, aby dokázal oddělit skvělého programátora od průměrného. Může to být dobrý jazyk na práci, ale to není dnešním tématem. Dokonce bych zašel tak daleko a řekl, že fakt, že Java není tak složitá, není bug, ale featura.

Můžu-li být tak drzý, z mé skromné zkušenosti soudím, že jsou na univerzitách jako součást osnov Computer Science (dále jen CS) tradičně učeny dvě věci, které mnoho lidí nikdy skutečně plně nepochopilo: pointery (ukazatele) a rekurze.

Na škole jste začínali s kurzem datových struktur (spojové seznamy, hashovací tabulky atd.) s rozsáhlým použitím pointerů. Tyto kurzy byly často používány jako síto. Byly tak obtížné, že kdo by býval nezvládl mentální výzvu oboru CS, by to vzdal. Což bylo dobře, protože pokud si myslíte, že pointery jsou obtížné, počkejte, až se pokusíte dokázat věci ohledně teorie pevné řádové čárky.

Všechna ta děcka, která válela na střední, protože si v BASICu napsali hru pong pro svůj Apple II, se dostala na vysokou. Zapsali si CompSci, kurz datových struktur, a když se dostali k pointerům, jejich mozek prostě explodoval. Další věc, kterou o nich víte, je, že získali titul z politologie, protože právničina se jim zdála jako lepší nápad. Viděl jsem různá čísla kolik lidí odpadne z CS, obvykle je to mezi 40 % and 70 %. Školy mají sklon si myslet, že je to plýtvání. Já si myslím, že je to prostě nezbytné třídění lidí, kteří se nestanou šťastní a úspěšní v kariéře programátora.

Další obtížný kurz pro mnoho mladých studentů CS byl kurz, kde jste se učili funkcionální programování včetně rekurze. MIT nastavilo pro tyto kurzy laťku velmi vysoko. Vytvořili povinný kurz (6.001) a učebnici (Abelson & Sussman – Structure and Interpretation of Computer Programs), která byla použita na stovkách nejlepších škol jako de facto úvod do CS. (Můžete a měli byste se podívat na starší verzi přednášky online.)

Obtížnost těchto kurzů je udivující. V první lekci jste se naučili téměř vše ze Scheme a byli jste již seznámeni s funkcí, která bere další funkci jako svůj vstup. Když jsem zápasil s takovým kurzem (CSE121 na Penn), viděl jsem, jak ho mnoho studentů, ne-li téměř všichni, nezvládli. Materiál byl příliš obtížný. Napsal jsem profesorovi dlouhý lkavý dopis, že to nebylo fér. Někdo na Penn mě (nebo někoho jiného) musel vyslyšet, protože teď je kurz vyučován v Javě.

Kéž by bývali neposlouchali.

Léta skuhrání líných bakalářů jako já v kombinaci se stížnostmi z průmyslu na to, jak málo inženýrů promuje na amerických univerzitách, si vybralo svou daň. Velké množství jinak perfektně dobrých škol v posledních deseti letech přešlo 100 % na Javu. Je to trend. Personalistům, kteří používají „grep“ na vyhodnocení životopisů, se to, zdá se, líbí. Nejlepší na tom je, že na Javě není nic tak obtížného, abyste na tom mohli vyhazovat programátory, kterým chybí ta část mozku, která zvládá pointery a rekurzi. Takže odpadne málo lidí, fakulty mají více studentů, větší rozpočet a vše je dobré.

Štastná děcka z Java škol nikdy nedostanou divný segfault při implementaci na pointerech založené hash tabulky. Nikdy neztuhnou hrůzou ani nebudou blouznit při převodu věcí do bitů. Nebudou si lámat hlavu nad tím, že se v čistě funkcionálním programu nikdy nemění hodnota proměnné a přesto se stále mění. Paradox!

To jste měli štěstí! My jsme tři měsíce bydleli ve zmuchlaných novinách v septiku! Museli jsme každé ráno vstát v šest ráno a vyčistit noviny, běžet do fabriky, tam pracovat čtrnáct hodin denně, týden za týdnem, šest pencí týdně a když jsme se vrátili domů, otec nás uspával ranami opaskem!

Jsem jen jeden z těch starých bručounů, jako Four Yourkshirmen, chvástajících se, jak drsné bylo přežít všechny ty obtíže?

V roce 1900 byla na vysokých školách latina a řečtina povinný předmět ne proto, že by sloužila k nějakému účelu, ale protože byla svým způsobem považovaná za všeobecný rozhled vzdělaných lidí. V jistém smyslu se můj argument neliší od lidí, kteří prosazovali latinu. „[Latina] trénuje vaši mysl. Trénuje paměť. Rozluštit latinskou větu je úžasné myšlenkové cvičení,“ napsal Scott Barker. Ale nemůžu najít jedinou univerzitu, která by ještě latinu vyžadovala. Jsou pointery a rekurze latinou CS?

Připouštím, že programování s pointery není v 90 % případech potřeba, ve skutečnosti jsou v produkčním kódu naprosto nebezpečné. Dobrá. A funkcionální programování není tak moc využíváno v praxi. Souhlasím.

Ale je to stále důležité pro některé z nejvzrušujících programátorských prací. Bez pointerů bychom například nikdy nebyli schopní pracovat na linuxovém jádru. Nemůžete porozumět řádku kódu Linuxu, ani jiného operačního systému, bez skutečného porozumění pointerům.

Bez porozumění funkcionálnímu programování bychom nevynalezli MapReduce, algoritmus který dělá Google tak masivně škálovatelný. Termín Map a Reduce přišly z Lispu a funkcionálního programování. Zpětně viděno, MapReduce je zřejmé každému, kdo si pamatuje něco z 6.001 – čistě funkcionální program nemá žádné vedlejší efekty a proto je snadno paralelizovatelný. Fakt, že Google, nikoliv Microsoft, vynalezl MapReduce, říká něco o tom, proč Microsoft stále nemůže dohnat základy vyhledávání, zatímco Google se posunul k dalšímu problému: budování Skynet^H^H^H^H^H^H světově největší hromadně paralelní superpočítač. Nemyslím si, že by si Microsoft plně uvědomoval, jak daleko jsou za konkurencí.

Kromě prima facie důležitosti pointerů a rekurze je jejich skutečná hodnota v tom, že velké systémy vyžadují tento druh mentální flexibility, které se vám dostane během učení se o pointerech a rekurzi. A tuto mentální schopnost potřebujete, aby vás nevyhodili z kurzů, kde se učí. Pointery a rekurze vyžadují určitou schopnost úsudku, abstraktního myšlení, a hlavně vidět problém v několika úrovních abstrakce zároveň. A proto schopnost porozumět pointerům a rekurzi je přímo úměrná schopnosti být skvělým programátorem.

Z osnov postavených kompletně na Javě skutečně nic nevytřídí studenty, kteří postrádají mentální hbitost vypořádat se s těmito koncepty. Jako zaměstnavatel jsem viděl, že Java školy začaly stloukat máslo ze studentů, kteří nejsou prostě dost dobří na to, aby pracovali na složitější aplikaci než další Java účetnictví. Přesto je byli schopní protlačit novými, neskutečně zjednodušenými předměty. Tito studenti by nikdy nepřežili 6.001 na MIT nebo CS 323 na Yale. A upřímně, to je jeden z důvodů, proč si jako zaměstnavatel cením titulu z MIT nebo Yale víc než z Duke, kde nedávno kompletně přešli na Javu. Nebo U. Penn, kde nahradili Scheme a ML Javou a snaží se učit předmět CSE121, který téměř zabil mě i moje kamarády. Ne že bych nechtěl najmout chytrá děcka z Duke nebo Penn, najímám je, jen je pro mě o dost těžší zjistit, co jsou zač. Býval jsem schopný poznat chytrá děcka, protože bývali schopní ve vteřině porozumět rekurzivnímu algoritmu nebo implementovat funkce na manipulaci se spojovým seznamem pomocí pointerů tak rychle, jak rychle uměli psát na tabuli. Ale u Java absolventů nedokážu říct, zda se s tím problémem trápí proto, že nejsou dostatečně vzdělaní, nebo proto, že jim chybí ta speciální část mozku, kterou budou potřebovat pro skvělou programátorskou práci. Paul Graham takovým říká Blub Programmers.

Je velmi zlé, že Java školy nevytřídí taková děcka, která se nikdy nestanou skvělými programátory. Školy se můžou vymluvit, že to není jejich problém. Průmysl, nebo alespoň personalisté-používající-grep, jistě volají po tom, aby se učila Java.

Ale Java školy rovněž selhávají v trénování mozků dětí k tomu, aby byly znalé, hbité a dostatečně flexibilní pro to dělat dobrý softwarový design (a nemyslím objektově orientovaný „design“, kde trávíte nespočet hodit přepisováním svého kódu do hierarchie objektů nebo dřina s falešnými „problémy“ jako has-a versus is-a). Potřebujete trénovat myšlení o věcech na více úrovních abstrakce zároveň a tento druh myšlení je přesně to, co potřebuje návrh skvělé softwarové architektury.

Může výuka objektově orientovaného programování (OOP) nahradit síto pointerů a rekurze? Rychlá odpověď: ne. Bez debaty o podstatě OOP to není dostatečně obtížné k vytřídění průměrných programátorů. OOP se na školách skládá většinou z memorování slovníkových hesel jako „zapouzdření“ a „dědičnost“ a absolvování testů ohledně rozdílů mezi polymorfismem a přetěžováním. O nic složitější než se naučit pár slavných dat a jmen v hodinách dějepisu. OOP tak nepředstavuje dostatečnou hrozbu, která by odradila prváky. Pokud máte problémy s OOP, váš program bude stále pracovat, jen ho bude složité udržovat. Ovšem máte-li problémy s pointery, tak dostanete Segmentation Fault a nebudete mít tušení, co se děje, dokud se nezastavíte, zhluboka nadechnete a skutečně přinutíte svou mysl pracovat ve dvou různých úrovní abstrakce najednou.

Mimochodem personalisté-používající-grep jsou zde vysmíváni z dobrého důvodu. Nikdy jsem nepotkal nikoho, kdo umí Scheme, Haskel a pointery v C, kdo by se nedokázal naučit Javu za dva dny a psát lepší kód než lidé s pětiletou praxí v Javě, ale zkuste to vysvětlit průměrnému HR trubci.

A co s poslání CS fakult? Nejsou to učňáky! Nemělo by být jejich úkolem trénovat lidi pro práci v průmyslu. To by vám měli říct kolegové nebo v rekvalifikačním kurzu. Univerzity by měly dávat studentům základní nástroje na žití jejich života, nikoliv je připravovat na první týdny v práci. Není to tak?

Přesto CS jsou důkazy (rekurze), algoritmy (rekurze), jazyky (lambda kalkulus), operační systémy (pointery), kompilátory (lambda kalkulus). Z toho plyne že Java školy, které nebudou učit C ani Scheme, ve skutečnosti vůbec neučí CS. Jakkoliv neužitečný může být koncept function currying pro skutečný svět, je to základní požadavek pro CS školy. Nedokážu pochopit, proč profesoři při schvalování osnov dovolili, aby jejich program zprimitivněl na úroveň, kdy nejen že už nezvládnou produkovat pracující programátory, ale nedokáží ani produkovat studenty, kteří by mohli získat doktorát a ucházet se o jejich práci. Počkat. Nevadí, možná, že rozumím.

Když se vlastně vrátíte zpět a prozkoumáte diskusi, která se odehrála na akademické půdě během Velké Java změny, všimnete si, že největší obavou bylo, zda je Java, jako výukový jazyk, dostatečně jednoduchá.

Můj bože, pomyslel jsem si, chtějí osekat osnovy ještě víc! Proč rovnou nekrmit studenty lžičkou? Nechme asistenty, ať za ně píší testy, tak alespoň nikdo neuteče na humanitní studia. Jak se má kdokoliv cokoliv naučit, když byly osnovy pečlivě sestaveny tak, aby bylo všechno zjednodušeno ještě více, než už to je? Zdá se, že je tu síla (PDF), která se snaží najít jednoduchou podmnožinu Javy, kterou by šlo učit studenty. Připravují zjednodušenou dokumentaci, která pečlivě schovává všechen ten EJB/J2EE balast před jejich něžnou myslí.

Nejsympatičtější interpretace toho, proč CS fakulty tak nadšeně zjednodušují předměty, je to, že jim to nechává víc času na vysvětlení skutečných CS konceptů. Pokud by nepotřebovali celé dvě lekce na vysvětlení rozdílu, řekněme, Java int a Integer. No, pokud je to ten případ, tak 6.001 pro to má perfektní odpověď: Scheme, je to tak jednoduchý jazyk, že může být bystrým studentům vysvětlen celý za deset minut. Pak můžete věnovat zbytek semestru pevné řádové čárce.

Pche.

Vracím se k jedničkám a nulám.

(Cože, vy máte jedničky? Klikaři! My měli jen nuly.)

Osobní poznámka překladatele

Nebyl jsem ze studia FEL ČVUT nijak nadšený, naopak jsem dost držkoval. Ovšem nutno přiznat, že ačkoliv nás učili Javu, prošel jsem si i pointery a rekurzi (pravda, to už jsme měli na střední). Bohužel se pro samý hardware a elektroniku nedostalo na Haskel, Lisp…

Zpětně viděno, má úloha z přijímacího pohovoru do Google velký smysl.

Komentáře

Subscribe
Upozornit na
guest
24 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
Eda

Ahoj. Díky za článek :-)

Jen si neodpustím své obvyklé upozornění na nějakou drobnost:
„…obvykle je to mezi 40 % and 70 %.“

cpt-nemo

Opravdový programátor totiž píše programy zásadně COPY CON > program.arj …

Radek Miček

Java je dost složitá – právě proto některé školy začínají Scheme nebo Standard ML. A (otevřená) rekurze je základní stavební kámen OOP, mnoho lidí si to však neuvědomuje.

karel

Lol, java je jednoduchá jako každý programovací jazyk.
Stejně tak Lisp, Scheme sou moc pěkné jazyky, a je dobré si je aspoň jednou za život vyzkoušet.
Já třeba miluju python a je to asi důvod proč sem strašlovou dobu nechápal co maj všici s closure a tak, než sem pochopil, že všichni co o tom tak básní jsou vlastně java bastliči. Sorry ale tydle věci má třeba python odjakživa, to že mi funkce může vrátit funkci, že si odkaz na funkci dam do proměné atd… to jsou věci se kterými jsem se učil programovat a tak dnešní výkřiky jak je closure krokem do budoucnosti nějak nechápu. Jinak javascript je další jazyk co tydle věci vždy měl.
Abych doplnil proč sem to pochopil, dostal jsem zakázku upravit a dodělat jeden program co byl v jave no tak sem se během týdne který jsem na to dostal naučil javu. Ano jistě neznám všechny základní knihovny, ale to nepovažuji za znalost jazyka. Znalost jazyka je pro mě naučit se jak v něm psát a porozumět jeho filozofii, to jakou knihovnu mam na co použít si vždy dohledám. A ne neprogramuji tak pomalu, protože programátor má víc času přemýšlet než zběsile něco psát.
Stejně tak je podle mě dobré hodně zapomínat, protože to člověka nutí vždy si dostudovat aktuální trendy a ne leta letoucí reciklovat obskurdní kód.

Já vim učit se nové věci bolí. Tak se neučte, nepřemýšlejte a jděte si zas vklidu bastlit formulář za formulářem, jak vás to naučily, ale prosím neříkejte si programátor.

Jiří Knesl

Předpokládám, že myslíte Clojure.

Nevím, kde jste vzal něco o bastličích. Vývojáři v Clojure, které znám, patří k těm nejchytřejším a nejlepším vývojářům, které jsem potkal.

A rozhodně ta výhoda není v tom, že můžu mít funkci, která vrátí funkci. To je jen drobná část skládačky. Když se ale složí řada těch věcí, která tam je, jako STM, homoikonicita, funkcionální přístup, persistentní datové struktury, možnosti paralelního programování, dostanete se k tomu, co konkrétně na Clj lidem vyhovuje. A dostanete věci, které v Pythonu nejsou (některé ano, ale třeba to STM nebo persistentní dat.struktury tam nejsou a bez nich je paralelní programování mnohem těžší). Takže ano, proti Pythonu je Clojure krokem do budoucnosti.

Srigi

Myslim, ze myslel closure vo vyzname lexikalny uzaver. Alebo inymi slovami, ze funkcia je 1st class citizen (je mozne ju predat ako argument, je mozne ju vratit ako navratovu hodnotu). S programovacim jazykom Clojure to nema nic spolocne.

Pavel Tišnovský

To ovšem nestačí, protože koncept uzávěrů vyžaduje další vlastnosti jazyka. Resp. takto – je docela dost jazyků, které uzávěry nepodporují, ale funkce tam jsou first class objekty. Javisti jsou asi nadšeni hlavně z anonymních funkcí, protože ty tam skutečně strašně dlouhou dobu chyběly a obezličky přes implementace anonymních tříd (=specifikace rozhraní + přímá implementace metod z rozhraní) je dost hnusná, hlavně po syntaktické stránce (sémanticky taky :-)

Ladislav Thon

No, a přitom ten lexikální uzávěr udělá anonymní třída taky. Takže můžeš říct, že Java má closures od verze 1.1, z čehož některé asi trefí šlak :-)

Pavel Tišnovský

To neřeknu :-), protože právě Java má stejný problém jako další jazyky – tím že máš lokální proměnné na zásobníkovém rámci, nejde je jednoduše ponechat pro pozdější použití v uzávěru. Právě proto je tam ta rastrikce na final proměnné a různé obezličky (typu final reference na měnitelný objekt atd. atd.). Nicméně máš pravdu v tom, že vnitřní třídy (výše jsem omylem napsal že anonymní, většinou tedy jsou i anonymní) se uzávěrům hodně podobají.

Ladislav Thon

Já bych to klidně řekl, protože z lokální proměnné na zásobníku uděláš snadno referenci na heap tím, že ji zabalíš do jednoprvkového pole. Je to hack, ale viděl jsem to kdesi v java.util.concurrent použité i pro předávání parametrů odkazem, takže se tomu dá říct idiom :-)

filip.jirsak

Nejlepší na tom je, že na Javě není nic tak obtížného, abyste na tom
mohli vyhazovat programátory, kterým chybí ta část mozku, která zvládá
pointery a rekurzi.

Myslím, že i v Javě se najdou podobně obtížné věci. Třeba memory model (paměťové bariéry apod.) – oblíbený příklad byl, jak v Javě správně napsat singleton. Dokonce bych řekl, že je to ještě obtížnější, protože pointery i rekurze je jeden koncept, memory model je propojení několika konceptů. Ostatně v Javě se dá pracovat i s pointery i s rekurzí.

Takže rozdíl je spíš v tom, že v Javě lze napsat spoustu kódu, aniž by programátor musel pointery nebo rekurzi znát. To opravdu není bug, ale feature. Problém je tedy spíš v tom, že potřebujeme nějak odlišit ty Java programátory, kteří pointerům a rekurzi nerozumí, od těch, kteří tu potřebnou část mozku mají. Potřebujeme je nějak odlišit v inzerátech a na pohovorech, ale potřebujeme je také nějak odlišit na školách, aby si samotný student byl vědom toho, zda příslušnou část mozku má nebo nemá. (To, že jí nemá, není žádná ostuda, nejspíš má zase jiné části mozku, které zase chybí ostatním.)

Karl

Inu trh potřebuje jak ty nejlepší, tak i ty průměrné, možná i podprůměrné, tak si to holt zaměstnavatel bude muset roztřídit sám, tak jak je to často i v jiných oborech.

osamc

Takato vec neexistuje.
Fixed point theory by sa dalo prelozit ako teoria pevneho bodu (veci typu kazdy monotonny funkcional ma pevny bod).

okep

Predem se priznavam, ze clanek jsem proletl.

Rozhodne neplati implikace, ze kdo si prosel ve skole lambda kalkulem a funkcionalnim programovanim, tak je automaticky programatorska hvezda. A neplati ani opacna implikace.

Dale je treba rozlisova typ programatora. Napriklat koporatni prostredi si vyzaduje uplne jine kvality, nez prostredi nejakeho maleho startupu.

Prekvapive uspedny programator ve startupu, muze byt dost neuspesny v korporatnim prostredi. Korporatni software se sklada z velkeho mnozstvi jednoduchych problemu, ktere ve vysledku prestavuji neuveritelne komplexni system. Tyto bodchovanci lambda kalkulu a pointru jsou schopni vysetrit maly velmi komplexni problem, ale u vetsiho systemu byvaji ztraceni. Neumeji, nebo nechteji resit sisri souvislosti.

Tj. kdyz mi prijde nekdo na pohovor, tak to ze absolvoval nejaky narocny kurz matematiky nebo programovani, muj pohled na nej nemeni.

Dale neni pravda, ze Perlista, Ceckar, clojurista se nauci Javu, za tejden. Jedna vec je znat jazyk, druha vec je, naucit se ho pouzivat. Pamuju si, nepral bych vam videt Javovy kod napsany programotorem odchovanym ANSI C. Stejne tak je nekdy zazitek cist JavaScript kond napsany Javistou.

Po me je u programatora dulezite:
1) zakladni programatorske znalosti, obcas se stava ze programator se stredoskolskym vzdelanim znovuobjevuje kolo.
2) Peclivost, programator musi premejslet nad kodem, nad knihovnama ktere vola a nad tim co se jeho kod zpusobuje v prostredi kde bezi. Tohle je bouzel nesvar Javy, peclivi programatori se odnauci nad kodem premyslet.Je to taky nesvar knihoven, ktere se snazi odstinit programatora od low-level problemu (Hibernate).
3) Schopnost pochopeni high-level abstrakci a konceptu. Irituje me, kdyz programator neumi problem rozdelit do skatulek. Jeho kod je pak jedna velka hromada balastu. Tohle opravdu delaji i kluci co neco vystudovali.
4) musi se chtit ucit a pracovat na sobe

Ja osobne mam lepsi zkusenosti z klukama z FEL nez MFF (sorry jestli to ctete ;) ).

O

geek

Já za sebe můžu říct, že mě baví C a C++, hlavně tedy C++. Nevím, jestli je to tím, že jsem na něm začínal nebo můj mozek podvědomě vyhodnocuje Javu podobně, jako ji lichotí tento článek a protože jsem tak trochu antisocioální geek, tak mám rád C++.

Protože ale realita je taková, že Java je velice žádaná a asi i lépe placená, tak se věnuji hlavně ji (tedy studiu různých frameworků). Druhým důvodem je, že také lehce pochybuji o svoji inteligenci (rozhodně bych asi neporozumněl rekurzivnímu algoritmu během sekundy a nenapsal bych algoritmus pracujicí se seznamem cca stejně rychle, jako když píšu na papír, což mě moje sebevědomí ještě víc nahlodalo :)) a na C++ bych si pak v produkčním mohl hodně rychle vylámat zuby a být odejít.

Takže sklopit hlavu a šrotit Java frameworky.

xxar3s

pointery nie su zlozite naopak, princip je jednoduchy, problem pointerov je ze umoznuju prasit vo velkom style.

no a FP mi nepride zlozite, naopak FP je castokrat priamociarejsie jednoduchsie a pochopitelnejsie ako imperativny pristup. Nanestastie mnohi programatori zdeformovani imperativnym pristupom maju problem zvyknut si na trosku iny sposob myslenia. Ale pre neprogramatora budu obidve paradigmy na naucenie rovnako komplikovane. Vyhoda rekurzie je ze velakrat zapis dost podstatne zjednodusuje.

Ivan Nový

podívejte se, co se za psí kusy dělají z Javascriptem, aby se z něho udělal použitelný jazyk, každý framework dělá to, aby ho té funkcionality zbavil a udělal z něho Javu. Konstrukce typu $(x).(function(){}) moc přínosná není. C++ zase není taky nic jiného než předělání C na Javu.

Ivan Nový

jen je si třeba uvědomit, že například na důkazy některých matematických vět se čeká více než 100 let, což je z hlediska programování dost nepraktické :-)))

donnie

Obecne mi prijde mnohem vic CS (computer science) like kdyz je nastoleny obecny problem typu najdete chytry algoritmus detekce hran v datech, nebo efektivne filtrujte „nepotrebna“ data a nezlente co nejvic vzoru.

Tohle je CS, proste ala Knut, ne to jeslti clovek zvlada pointery. By me ani ve snu nenapdlo znalosti pointeru neco „merit“, kdyz uz bych neco meril, tak bych si vybral obecny algoritmicky problemy a tam je mi totalne sumak cim to kdo napise, at to pise clovek klidne nejakym svym pseudokodem.

Dalsi vec, zaklady OOP slozity nejsou, myslim ale ze u OOP se spis studuji design patterns, to je abstraknit dost, vic abstraktnjsi nez pointery mi prijde. A s tim ze Cckar umi hned javu … jo, jasne … ani teoreticky :/, proc ? Protoze OOP, pokud prejde cistej ceckar netrenovanej na OOP na javu, tak hadejte co vam z toho vznikne.

aubi

Kdysi jsem presel na Javu, protoze poskytla spoustu vyhod oproti C++. Skoro u kazde feature muzu rict priklad, kdy me Java usetrila nekolik tydnu (treba pouziti vyjimek bez memory leaku je peklo). Problem ale neni v Jave!

Problem je v uceni. Dost casto se uci „cool“ veci — multimedia, web ap. Takze misto zakladu — algoritmy, efektivni struktury, principy, vice viz Effective Java nebo Clean code — se radsi uci frameworky nebo hotova reseni. Takovy je holt tlak headhunterskych firem, ktere nerozumi obsahu zadani. Radsi najmu kluka, kterej umi zaklady. Framework se snadno nauci. Nechci lidi, co umi frameworky, velmi casto jim chybi zaklady.

Hrozne casto se setkavam s tim, ze lidi v praxi slepe nasleduji nejaka naucena pravidla, ale uz nevi, proc. „Protoze to tak ma proste byt, tak je to spravne.“ A to jde aspon o lidi, kteri ty pravidla znaji, taky je tady spousta lidi, kteri ani nevi, co maji delat, proste umi cist a psat, tak programuji. Zavidim vam vase problemy ;-)

Mimochodem, zjistuji, ze spoustu veci chapu, protoze jsem delal kompilatory. Takze kazdej, kdo pouziva C++ a mysli si, ze rozumi pointerum, chape jen pulku, kdyz nevi, jak se muze stat, ze po prirazeni ukazatele (a = b;) muzu dostat pointer na jiny kus pameti (hint: vicenasobna dedicnost).

Michal Zyka

Je to celý jenom hádanice o ničem… pocházím z informatiky z VŠE, kde se jede Java stylem OOP first a nesouhlasím ani s jedním výrokem z článku týkajícím se OOP, ale to vem čert. Spíš mě zaráží, že se někdo do takových debat pořád pouští. Pro mě je měřítko schopnosti programátora stručný a jasný – jestli se umí (a chce) danej člověk učit a má přehled a širokej záběr. Přehledem myslím ne jenom technologie a ty věci, o jejichž důležitosti je tady vedená debata, ale přehled o všem s čím informační systémy souvisej, takže třeba o podniku, procesech, informacích atd. Moc si nedokážu představit, že bych někde dlouhodobě musel rubat na jedný platformě něco jenom proto, že to jsem se jednou naučil a tak u toho musim zůstat. Stačí mi otevřít internet a každou chvíli mě zaujme něco uplně novýho a zamýšlim/porovnávám případy užití všeho s čim přídu do kontaktu a nezavrhuju hned nějákej nástroj kvůli tomu, že jsem si někde přečetl nějakýho homo-alterno-debila jak se mu nelíběj syntaktický konstrukty toho či jinýho jazyka, když mi de přeci primárně o řešení konkrétního problému. Koneckonců, vždycky nakonec půjde o prachy a kdo si myslíte, že vygeneruje víc hodnot? Manager vývojáře s přehledem o okolí nebo krysa vývojář co vidí jenom dopředu? :-D

petrph

Jo pár podobnejch článků už jsem četl, ale z těch plynulo že těm programátorům v Javě chyběj znalosti základních algoritmů (pokud je špatně učena), Ale aby se někdo pokoušel tvrdit že jsou od přírody hloupější než céčkaři, tak to ještě někde nikdo nenapsal-a upřímně se divím že něco takového vůbec mohlo v USA vyjít a nenásledovala hned lavina žalob.
Jen tak pro připomenutí,už v době kdy dominoval jazyk C/C++ (což už je strašně dlouho) se používal vedle něj taky jistej jazyk Cobol- programovací jazyk pro ekonomické aplikace a kupodivu už ani v něm programátoři nemuseli umět práci s pointery ani nemuseli mít vysokou znalost abstrakce, „Stačila “ jim jen pečlivost při práci s dosti dlouhými (nikoliv složitými) datovými strukturami.
Ono se zkrátka programování rozdělilo. i dneska je většina IT projektů ekonomického či ryze evidenčního charakteru na což je skoro i Javy škoda.Ale jestli chce někdo mermomocí vyvíjet operační systém, tak ať si ty geniální céčkaře sežene a zaplatí…

Milos

Na mě je třeba znát, že jsem vyrostl na zpracování hromadných dat a ne např. na zpracování obrazu nebo hrách. Pointery jsem přičítal už v assembleru a PL/1, ale neustále mám roblém pracovat stylem rozděl a panuj, tak jak se to naučili lidi, co začínali v Pascalu. Dřiv v jazyku bylo všechno, dnes se javu naučíte za chvilku, vše ostatní je o knihovnách, praxi a pochopení a zažití filosofie jazyka.

Na školách se jako CS nebo Základy programování nebo Algoritmy učí základy javy na třídících algoritmech a seznamech, abstraktní datové struktury atd. Podle mě je základem vyučování CS rozdělení problému. Na to byl dobry pascal a Karel. Neučí se metodika.

také jse zjistil (a někteří vedoucí při pohovorech mi to potvrdili), že mladí programátoři se nechtějí zatěžovat problémovou doménou, jen věc udělat a JEN podle popisu a honem od toho. Jestli to je user friendly, jestli je neco napadne…. Proste udělat a na další.

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.

Pocta C64

Za prvopočátek své programátorské kariéry vděčím počítači Commodore 64. Tehdy jsem genialitu návrhu nemohl docenit. Dnes dokážu lehce nahlédnout pod pokličku. Chtěl bych se o to s vámi podělit a vzdát mu hold.