Dobrý článek, těším se na pokračování.
Chtěl jsem se zeptat na jinou věc.
Dlouhodobě uvažuji, že bych se pokusil pomoc vývoji OpenJDK, věřím, že zkušenosti bych na to měl.
Odrazují mne ale drobné věci, jako např.
...
After installing Mercurial, acquire and install the Forest Extension available at
http://www.selenic.com/mercurial/wiki/index.cgi/ForestExtension.
Forest:
/!\ This third-party extension does not appear to be actively maintained. Consider using subrepos instead.
Works with: Mercurial 1.x
(There's another version that should also work against post-1.0 releases.
Download site: public development repository. http://hg.akoha.org/hgforest/
http://hg.akoha.org/hgforest/ - Site does not exists
...
... se mi moc nechce něco takového instalovat, někdo by ty instrukce měl opravit a zpřehlednit ...
Nicméně - existuje na internetu nějaká skupina, která by mi pomohla s nastartováním ?
Dík
no ešte že som si miesto Javy vybral C# tam sú tieto "vychytávky" už 10 rokov. nedávno som bol nútený naprogramovať ničo v Jave, a bol som zhrozený koľko základných vecí v nej chýba, pričom v iných jazykoch ich berieme ako samozrejmosť. chcelo by to radšej sparviť kompiler C# ktorý by generoval bytecode pre JVM toto vyzerá celkom zaujímavo:
- porovnávat závislost C# na Microsoftu, jeho vývojových nástrojích a technologiích vs Java a Oracle fakt nejde, OpenJDK opravdu není Mono.
- pokud se nepletu, i SUN nabízel k Javě komerční licence
- nedostatečnost syntaxe jazyka není kritický bottleneck technologie ani není důvodem hrůzných chyb, které se občas do kódu dostanou
- nedovedu si představit úlohu, která by v Javě nešla dostatečně elegantně zpracovat, v případě nějakých extrémně dynamických záležitostí se "přinejhorším" dá použít nějaká scriptovací nástavba jako Groovy nebo JRuby
- teď nám tu chtějí prodat a nasadit nové verze MŠ FAŠŤ, ulízlej obchoďák se snaží, má averze vůči MS a dalším komerčním molochům zase roste, vyhozený milióny dolarů ...
- atd. atd. to už by ale byl flame ...
- blbý počasí a zima, coooo ? ;-)
Jenom taková drobnost: MŠ FAŠŤ má být "fulltext vyhledavač" tedy http://www.fastsearch.com/ ?
Tam ta averze vůči MS není (zatím) na místě, Microsoft to teprve před dvěma lety koupil (viz http://en.wikipedia.org/wiki/Fast_Search_%26_Transfer) a zatím ještě úplně nepředělal k obrazu svému. Aktuální verze tedy stále je prodávána a plně podporována pro Linux. Je otázkou jak ty další verze...
Praktické zkušenosti nejsou zcela pozitivní, ale zase nejsou vyloženě negativní.
já vím, děláme v tom poslední 3 roky.
ale moc nadšený z toho nejsem a teď nám pan v kravatě ukazoval prezentaci na
FSIS (Fast Search for Internet Sites), CTS (Content Transformation Services) a Interaction Management Services (IMS)
(všechno samozřejmě technologie za velmi lidovou cenu (ironie))
a hemžilo se to tam samými sprostými slovy jako Visual Studio, .NET komponenty, ASP ....
Je to zajimave (a mozna to spolu az tak nesouvisi, ale kdo vi), ale po akvizici firmy Sun Oraclem se najednou k OpenJDK pridava krome Red Hatu a dalsich spolecnosti i IBM a Apple, takze mozna se setrit na placenou JVM nebude muset :-) Myslim ted klasicke J2SE ne mobilni platformy...
http://blogs.computerworld.com/17139/oracle_and_ibm_join_together_on_openjdk
Jsou a nejsou. Scala je syntakticky daleko podobnější C# než F# a dá se v ní programovat v zásadě velice podobným stylem jako v Javě nebo C#. Ano, přináší funkcionální prvky, podobně jako ta microsoftí varianta OCaml, jenže nelze nevidět, že funkcionální prvky se dostaly už i do C# (LINQ a lambda "delegates") a razí si pomalu cestu i do Javy. Jenže ve Scale se s nimi počítalo už při návrhu a proto tam vypadají úsporně a elegantně, v C# mi třeba připadají ty lambdy jako přilepené žvýkačkou.
Podivnosti z F# (a OCaml) typu rec a těžkopádná implementace inference převzatá z Caml (operátory typu .+.) je Scale také naprosto vzdálená. Scala je IMO prostě jazyk poučený z chyb při návrhu Javy (konzistentní přetěžování "operátorů", parametrické typy - generika, které Java původně zavrhla, flexibilnější dědičnost...). Funkcionální prvky jsou bonus.
Tomuhle se říká podpásovka. Dobře, v F# jsem neprogramoval, ale OCaml jsem kdysi studoval a F# z něj vychází, to je holý fakt. Ukázkové programy v F# jsem viděl, takže můžu v klidu prohlásit, že je syntakticky daleko vzdálenější C# než Scala. To vyvrátit nemůžete. S těmi operátory jsem se zmýlil a chybu jsem přiznal.
Teď ke Scale - Scalu znám, troufnu si tvrdit, dost dobře. Vlastním a prostudoval jsem (papírovou) knihu Programming in Scala, dělal jsem ve Scale programy včetně kombinátorových parserů a programů založených na aktorech. Pracuji na stránkách ve frameworku Lift a studuji možnosti projektu Akka. Žádné dojmy, ale praktické zkušenosti.
Je fajn, že vztahujete to moje jediné pochybení na celý Root, to jsem ani nevěděl, že jsem taková hvězda a mustr. Pokud ale chcete nadále reagovat na moje příspěvky, dělejte to věcně, pokud máte v rukávu víc, než ty dojmy.
Jaka podpasovka, co nevecneho, psal jste o F# dojmy nebo ne? Navic "tezkopadna" inference, ktera je obecne (priznavaji i priznivci Scaly) v F# na vyssi urovni nez ve Scale. Ja se prozmenu ucim F# a to s temi operatory zjistite velmi zahy. No a co, ze to je syntakticky podobne, s vasi znalosti F# o semanticke vzdalenosti/blizkosti nemuzete rict ani ble napr., leda byste se na to ted podival. Scala je navic v nekterych kruzich propagovana jako funkcionalni jazyk s objektovymi rysy a ne zpusobem, ktery jste zvolil vy. Nejde o chybu, jde o to, ze kecate o necem, o cem v podstate nic moc nevite a rozhodne vubec nic z praxe. A nefandete si, zadna hvezda nejste, jen jsem do sveho dlouhodobeho obecneho dojmu z diskuzi (a nekdy nejen) na rootu zahrnul i vas prispevek.
Těch "10 let" doufám oba bereme jako nadsázku. Ale dobrá, buďme konkrétní, tedy příklady z praxe:
1. Traits - tedy něco, co je mezi klasickou násobnou dědičností a interface. Mám zkušenosti s projekty (například systém pro komunikaci v heterogenním prostředí, který musí spolupracovat s jinými systémy pomocí odlišných protokolů), kde hlavní hierarchie drží "obecný protokol" (třídy zastupují jednotlivé operace, které víceméně umí všechny komunikující systémy) a "lokální předek" definuje metody pro protokol konkrétního zařízení (např. připravuje data do formátu pro daný systém třetí strany a zpět). Tohle je samozřejmě možné řešit jinak, ale "násobná dědičnost" napomáhá kompaktnosti výsledného kódu v koncových třídách. Aplikací traits jsou mraky.
2. Embedded XML - velice užitečné pro webové frameworky. Konkrétní příklad z praxe - šablony v Liftu.
3. "Přetěžování operátorů" - operátor je metoda s "obrázkovým názvem", nejsme omezeni "klasickými" operátory jako v C++ nebo C#. Konkrétních aplikací je knihovna Scaly plná - jako příklad uvedu combinator parsers, kde jsou použity např. operátory ~, ~>, <~, ^^^ a ^^, výsledkem je kompaktní kód přímo ve Scale, který nahradí specializované nástroje typu yacc nebo antlr.
4. Implicitní konverze - umožňují rozšířit funkcionalitu instancí stávajících tříd, ale na lokální, tedy bezpečné bázi (co si naimportuju, to mám). Konkrétní příklad použití z praxe je objekt scala.collection.JavaConversions, který umožňuje pracovat s "chudými" javovskými kolekcemi jako s jejich bohatšími bratříčky, které nabízí knihovna Scaly.
5. Import členských metod objektu, zde mohu opět poukázat na implicitní konverze - klasická konstrukce je import scala.collection.JavaConversions._ samozřejmě s tím, že jako všude ve Scale můžu importovat jenom něco (výčet v {}) a importovat mohu přímo v metodě a nemusím to dělat na úrovni celého modulu. Tím si zajistím plnou kontrolu nad tím, jak a kde rozšířím možnosti objektů daného typu (bod 4).
cili velka nadsazka :-)
za sebe budu vdecny za jakykoli mainstreamovy jazyk (doufam v F#), ktery umozni programovat jinym zpusobem, nez je dnes v korporatnu pozadovano; z toho co pisete (a nebudu predstirat, ze vsemu rozumim, Javovy/C# objektovy system znam opravdu jen obecne/principielne - treba je to povrchni, ale rekl bych, ze jak clovek pochopi jeden single dispatch system, zna je vsechny) mi ony body prijdou jako radikalnejsi (nektere mi prijde, jak je popisujete, obchazi neobratnosti Javy, ktere pro me cynika jsou proste jen dusledkem trvani na jedne objektove pravde) krok stejnym smerem, kterym vykrocila Java spis nez jako jine (potencialne zabavnejsi) paradigma
No já jsem se taky držel dost při zemi a skoro úzkostlivě se držel OOP. A to jsem ještě například nezmínil, že ve Scale je možné říci, že metoda je "private" v rámci třídy nebo v rámci nějaké vyšší hierarchie (package) a to proto, že to nepovažuju za něco tak nezbytného. Jenomže Scala nabízí další věci:
1. Úspornější syntaxi - nepotřebuje v zásadě používat středníky, tedy pokud je z kontextu jasné, kde začíná další příkaz. Obejde se při volání bez závorek, pokud je metoda bez parametru. Obejde se v mnohých případech i bez tečky a tady se dostáváme k té implementaci "operátorů", k možnosti vytváření hezkých interních DSL (použito například v testovacích frameworcích pro Scalu.
2. Intuitivní a snadnou implementaci "singletonů" a zároveň oddělení statických metod od instančních v samostatné struktuře (companion object) - uznávám, že tohle je věc názoru, ale podle mě to napomáhá přehlednosti.
3. Funkcionální vlastnosti Scaly - pattern matching, který je u každého pravověrného scalisty často používaný, který umožňuje práci s regulárními výrazy, za pomoci "case classes", resp. "case objects" + parametrizovaný "Option" + list comprehensions + klasické metody typu fold, map, filter, to umožňuje programování dost podobné třeba Haskellu. Dále je tady (implementovaná pomocí "trampolíny") podpora "tail rekurze", takže není třeba se tolik bát přetečení zásobníku (a dá se ohlídat, zda tu optimalizaci kompilátor provede a zařídit se podle toho. Používám s chutí a často.
4. Neměnné kontejnery, které napomáhají snadnější implementaci konkurenčního zpracování. Používám, pokud to lze.
5. S tím souvisí podpora actorů (vypůjčeno z Erlangu) a velice slibný projekt Akka, na který jsem poukazoval. V současné době studuji.
Shrnuto a podtrženo: Scala je hybridní jazyk, který spojuje OOP a FP a pokud je nějaký jazyk blízký mainstreamu, ale dovoluje psát programy "zgruntu jinak", je Scala podle mě jeden z horkých kandidátů. Jeho (dle mého názoru) transparentní a logická struktura umožňuje dělat velké věci a znovu a znovu mě překvapuje, co s tím někteří lidé dokážou, ať už na úrovni nabízených knihoven nebo ukázkových příkladů. Další výhodou je možnost využití celé Java platformy (Scalu pro .NET jsem neviděl, ale existuje), tzn. například široce dostupný hosting v servlet containerech (udělám WAR, hodím ho do adresáře a webová aplikace běží). Netvrdím, že někomu nemůže být bližší třeba to F#, ale Scala IMO není žádné ořezávátko.
Zni to jako zajimavy jazyk, mne trochu (zda se, ze tomu tak je, ale pripoustim, ze to muze byt jen opticky problem) vadi to baleni vseho do trid - v tomhle se mi libi F#, pri komunikaci se zbytkem sveta je mate k dispozici (tam i zpet), ale pouzivat (= psat to) je nemusite, nektere veci jsou prirozenejsi bez toho (co jineho je singleton, nez ritual a ulitba na oltari OP)
Chtel bych se zeptat - jake vyvojove prostredi pouzivate, jak byste ho moznostmi srovnal s napr. Visual Studiem a existuje pro Scalu neco jako REPL?
Co se týče IDE, situace je ve Scale (pokud se v posledních pár měsících něco výrazně nezlepšilo) poměrně slabší; každý plugin umí dobře něco. Nejlepší debugging má asi plugin do Eclipse, nejstabilnější je plugin do IDEA a ErlyBird (plugin pro NetBeans) má nejlepší syntax highlighting (barevné odlišení val a var apod.) a já osobně mu fandím nejvíc. Osobně ale vesměs používám gvim+sbt, bez IDE se obejdu. Nejnovější verze Visual Studia jsem viděl z rychlíku, takže nedokážu posoudit. Na notebooku mám Visual Studio Express pro C# a oproti třeba Eclipse nebo NetBeans mi přijde, že třeba správa projektů je slabší. Ale plnotučnou verzi VisualStudia (Visual C++) jsem naposledy používal snad před 10 lety a v té době to bylo mnohem slabší než dnešní Eclipse atd. Tohle budete muset vyzkoušet případně sám.
Scala REPL má, stačí napsat "scala". Ale opět: víc mi pro experimentování sedí sbt (píšu v editoru a spustím pomocí sbt).
Scala má několik módů - klasický "javovský", kde se vstupuje do programu pomocí main() (jde to i jinak, ale výhody jsou sporné), interaktivní (REPL) a "skriptovací" (spouští se scala mujmodul.scala), kde není nutné psát třídy vůbec. Scala je každopádně hybridní jazyk a Odersky a spol. se zřejmě rozhodli splnit minimálně dva úkoly najednou: dát javistům silný nástroj a zpřístupnit příznivcům FP Java platformu. Z toho samozřejmě vyplývají určité kompromisy, které se nám nemusí občas líbit.
To úvodní zkracování s Integer je zajímavé, ale dá se pokračovat až na Integer.toString(1), což je konečně postup, který se (snad normálně) používá :-)
Ten switch nad řetězci se mi pořád nelíbí – jediná výhoda proti jiným konstrukcím je výpočet hashe už v době kompilace, ale za cenu toho, že budu mít v kódu náhodně roztroušenou sadu řetězců (která se v Javě jinak vyjadřuje enumem).
Výhoda switche s řetězci je třeba v tom, že se to pěkně píše, je to přehledné atd. To, jestli je někde pár bytů navíc 99% lidí nezajímá (třeba celý OKsystem , když vzpomenu na všechny ty JBossy, ejb 3.0 a VVA a podobný generátor gigabytů zaplácané paměti :-)), 90% z toho zbylého procenta nepíše v javě a ta zbylá 0,1 procenta to samozřejmě nebude používat.
Pěkně se to píše, ale špatně se to pak čte nebo opravuje. Máte řetězce různě roztroušené po zdrojáku, upravíte ho na jednom místě a jinde zůstane neopravený… Když to chcete udělat správně, uděláte z těch řetězců konstanty; pak zjistíte, že je to vlastně uzavřená množina a mělo by někde být uvedeno, co do té množiny patří – tak z těch konstant ještě uděláte pole nebo kolekci. A ejhle, právě jste vynalezl enum.
Zakazat je silne slovo, ale ja jakozto radikalni cistic si myslim, ze kdo potrebuje switch dela neco spatne (coz neznamena, ze se mi to samotnemu nestalo :-) ). Kdyz uz se podle nejake hodnoty switchuje, tak to je vetsinou vickrat (beztak bude nekdo chtit pocet svatku v danem mesici...) a pak uz to vede na nejake pole nebo enumy a zrovna v jave se mi reseni enumama libi mnohem vic. Napr. je to vice bezpecne pri zavadeni nove polozky.
V objektově orientovaných jazycích by se switch v podstatě nemusel a také neměl používat vůbec. Místo něj se má používat polymorfismus.
Např. Smalltalk sice switch má ve formě zprávy caseOf:otherwise:, která se od obyčejných zpráv liší tím, že (podobně jako třeba pro ifTrue:) se pro ni generuje optimalizovaný bytekód se skoky, ale v celém Pharu je použita jen jednou a to ještě v podstatě zbytečně.
switch za výraz jazyka, něco ve smyslu:
if (...) {} if (...) {} else {} switch (...) {} if (...) {} elseif (...) {} else {} A také to tak důsledně používám.
Nemyslím si, že bych byl nějak v OOP slabší.
Samozrejme ze se neda rict, ze kdo pouziva switch, tak je slabsi v OOP. Ale kdyz se podivate na typicke vyskyty, tak bud je pouzit jako mapa (klic -> hodnota) nebo jako nahrada polymorfismu. Z pocatku to vypada trivialne a nevinne, ale kdyz pak mate 20 funkci, v kazde je switch podle toho sameho klice a je to rozstrkano po celym programu, tak je na prusvih zadelano.
Ja mam takovou zkusenost, ze to nebezpecne casto diverguje timto smerem, takze misto "dusledne pouzivam" radsi rikam - kdyz pisu druhy switch dle stejneho klice, tak je na case zavest tridy, enumy nebo mapu (klic->datova struktura). Az budete muset pridat dalsi case, tak to ocenite.
Tak samozřejmě pro interní reprezentaci konstant je lepší použít enum, o tom žádná. Ale v případě třeba parsování nějakých command file (nějaké xml, csv, atd.), kde se podle elementu/prvního sloupce rozhoduje, co se bude vlastně dělat, je to skoro ideální. (ještě ideálnější by byl hash string: handling-metoda, ale občas kanón na vrabce).
V tomto směru nebyl příklad z článku zvolen úplně nejlíp, ale na druhé straně lepší, než na třech stranách definovat umělý příklad a pak dole ukázat to kouzlo JDK 7 :)
I ve vámi uvedených případech máte pořád omezenou množinu řetězců, na které program umí reagovat. Když budete chtít vypsat uživateli hlášku, že má v CSV neznámý typ sloupce a podporované jsou jen sloupce a, b, c, potřebujete jejich seznam. Když budete chtít kód testovat, zase potřebujete seznam.
Já si dovedu představit spoustu příkladů využití switche přes řetězce, ale všechny jsou takové, že když to budu chtít napsat aspoň trochu „správně“ a udržovatelně, musím to stejně změnit na enum. Proto to podle mne do Javy nepatří – jsou jazyky, kde je to plně na odpovědnosti programátora, a když si chce programátor prostřelit koleno, jazyk mu k tomu ochotně poskytne nástroj. Java je ale jiná (a často se jí to vytýká) a pokouší se takovéhle postupy programátorovi co nejvíce znepříjemnit. A teď najednou povolí takovouhle věc.
například settery a gettery je – alespoň prozatím – nutné psát explicitně namísto použití dekorátorů či anotací;
A znáte projekt lombok? Doporučuje 10 z 10 pragmatických programátorů ;-).
Veliká škoda je, že vytvoření takové knihovny je poměrně složité, v porovnání třeba s Ruby. Kdyby tvorba takové knihovny byla v Javě jednodušší, tak si myslím,že by to Javu a myšlení lidí hodně posunulo.
Neco malo jsem o nich psal v serii clanku o jazyku Lua (http://www.root.cz/clanky/funkce-v-programovacim-jazyku-lua-uzavery/#k03), ale v Jave se budou uzavery delat trosku jinak. Urcite se k tomu dostanu pri popisu novych vlastnosti v JDK 8.
Uzaver je neco jako funkce, ktera se muze odkazovat na lokalni promenne z mista, v kterem byla definovana. Tim, ze pak muzete tu funkci nekam predat, ziskavate funkcionalitu, ktera zhruba odpovida tomu provest urcity blok kodu uvnitr nejakeho uplne jineho kodu.
Dobry priklad pouziti je, ze mate nejakou datovou strukturu, jejiz implementaci neznate (a nezalezi vam na ni), a chcete nad daty z te struktury provest nejakou operaci. Pak muzete v jazyce s uzavery implementovat situaci nasledovne:
1. Implementace datove struktury zavola nad kazdym prochazenym prvkem funkci, kterou ji predate.
2. V miste, kde chcete provadet operaci nad tou datovou strukturou, tuto operaci zabalite do funkce. Protoze jazyk podporuje uzavery, neni zde zadny problem - tato funkce se muze odvolavat na lokalni promenne v miste sve definice. Tuto funkci pak predate jako argument do funkce na prochazeni te datove struktury.
Je to krasne ciste - oddelite tim technicke detaily implementace od rozhrani. Teoreticky by bylo mozne udelat rozhrani k te datove strukture, abyste ji mohl prochazet primo, ale to muze zpusobit chyby, napriklad pokud byste pozadoval, aby se po skonceni prochazeni datove struktury jeste volala nejaka funkce (napr. uvolneni zamku nebo kurzoru).
Nejsem Javista, ale mam za to, ze anonymni tridy jsou obezlicka, kterou se tvurci Javy pokusili nahradit prave silu uzaveru.
(Do jiste miry jsou uzavery a tridy dualni koncepce - pomoci uzaveru lze tridy implementovat, stejne jako lze uzavery implementovat pomoci trid. Oba postupy s sebou ale nesou samozrejme syntakticky balast. Common Lisp, ktery ma objektovy system postaveny na uzaverech, tento problem s balastem resi elegantne pomoci maker.)
Přesně tak. "Důkazem" duálnosti budiž C# a JavaScript:
V C# jsou closures implementovány pomocí tříd, které nám nageneruje kompilátor (stačí mrknout třeba Reflectorem na výslednou assembly - není to žádná magie).
V JavaScriptu se třídy "simulují" pomocí closures - resp. privátní položky se udržují v "closure of constructor function".
Mozna jste to tak myslel, ale radsi to reknu jasne - v kazdem pripade se dela equals, kdyz se pro hledany hash najde vzor ve switchi. Ten hash je jen urychleni hledani, ne nahrada, takze pro potvrzeni ze hledany string odpovida danemu case se musi udelat equals vzdy.
V pripade kolize v case stringach se musi porovnavat pomoci equals se vsemi co jsou v kolizi dokud se nenajde shoda.
Ten článek jsem nečetl nijak podrobně, ale ten příklad v Java mi přijde záměrně složitě napsaný.
Pokud vynechám zabalení do objektu a import, získám stejné tři řádky jako v basicu....
int a = Console.readInt("Zadej cislo A:");
int b = Console.readInt("Zadej cislo B:");
System.out.println(a+b);
Čas: 1min včetně hledání nějakého mého příkladu kde jsem používal konzolu....
Přesně. Navíc try - catch je v tomto příkladě taky zbytečné, stačí přidat "throws Exception". System.exit na konci zbytečné. Jediná netriviální věc je použití BufferedReaderu (kvůli readLine), to začátečníka zmate.
Celkově ovšem překomplikované, autor toho příkladu evidentně nemá praxi.
K prechodu Sun -> Oracle se nemuzu a nebudu moc vyjadrovat, ale napriklad okolo OpenJDK se ted deji zajimave veci, treba prislib IBM, ze do ni bude pridavat svoje patche, portace OpenJDK na platformy, na nichz Oracle JDK puvodne nejelo (projekt Zero popr. Shark) atd.
Vyvoje je mozne se zucastnit nebo i pouze sledovat mail listy, tam se clovek mnohdy dozvi dost zajimave informace o internich vecech JDK.
Samozrejme nic neni idealni, ale pokrok okolo Javy skutecne nejaky je (ne tak velky jak bych si treba predstavoval, ale jen testovani a dokumentovani novych vlastnosti zabere spoustu casu).
Osobně na Java pomalu rezignuji. Třeba s NIO nejsem kamarád - to je moje chyba - asi mu nerozumím. Rozpracovaný projekt se chová zákeřně. Anglicky umím celkem dobře, ale velice složité principy z Anglického originálu prostě nepochopím. Po chvilce čtení si jen řeknu WTF? Naopak, pokud chápu princip nemám problém studovat i ty velice odborné texty. Všechno do sebe pěkně zapadá. NIO.2 mi už nedává smysl vůbec, evidentně k vůli nepochopení NIO. Všechno mi to začíná připomínat stav s J2EE. Už mě v JAVA skoro netěší programovat. Ano, mohl bych použít nějakou externí knihovnu která chování NIO odstiňuje, ale nemám rád černé skříňky.
Nejsem John D. Carmack, potřebuji jednoduchý programovací jazyk pomocí kterého udělám věci jednoduše, dobře a příjemně.
Slovo frustrace častým používáním vyčpělo a mám pocit že tedy můj pocit nedokáže vyjádřit dostatečně. Prostě mě už netěší v tom programovat. Z čistého diamantu se stává sudoku. Nemám rád sudoku.
Abych v nějakém jazyce mohl programovat musí mě těšit, aby mě mohl těšit musí být logický, nezáludný (PHP/Javascript ble ble) a snadno pochopitelný.
Vůbec si nejsem si jistý, jestli JDK7 je krok směrem k přehlednosti nebo krok k obdobné situaci jako je u J2EE. Nevím proč, ale mám pocit že JDK7 všechno jen komplikuje.