Prečo je Java zaostalý a neefektívny jazyk
Kategória: Názory, publikované: 27.05.2010, autor: Igor Kulman
Som zvyknutý na C# 3.5 a naplno využívam všetky jeho možnosti. Java mi pripadá ako hrozne zaostalý a programátorsky neefektívny jazyk, všetko sa v ňom robí zbytočne zložito a zdĺhavo. Uvediem niekoľko príkladov.
Chcem odstrániť prefix zo začiatku čísla zamestnanca, márne hľadám funkciu ltrim, musím si ju napísať sám. Alebo chcem zo zoznamu zamestnaneckých čísel odstrániť duplicity a vybrať len tie, ktoré sú väčšie ako nejaké X, kvôli príslušnosti k organizačnej jednotke. V Jave musím duplicity odstrániť prevodom do HashSet a späť, dané čísla vybrať pomocou prechodu zoznamom. Pre človeka zvyknutého na
employeeNumbers = employeeNumbers.Where(l=>l > X).Distinct().ToList();
a uvedomujúceho si, že žijeme v roku 2010 je to jednoducho nepochopiteľné.
Spomínané príklady sú triviálne veci, so zložitejšími je na tom Java ešte horšie. Ak napríklad chcete z J2SE volať nejakú webovú službu, znamená to pre vás vygooglenie potrebných knižníc, stiahnutie nejakej, zistenie,že nepodporuje pri webových službách autentifikáciu, stiahnutie ďalšej, vygenerovanie proxy tried a ich použitie. Pri zmene webovej služby samozrejme znovu vygenerovanie proxy tried, pridanie nahradenie pôvodných novými v projekte, možno s medzikrokom znamenajúcim zaspomínať si,ako ste to vlastne vtedy prvýkrát generovali.
V C# projekte vo Visual Studiu pomocou asi 3 troch kliknutí pridáte referenciu na webovú službu, .NET sám vygeneruje triedy a všetko potrebné za vás, nestaráte sa, samozrejme s podporou autentifikácie. Pri zmene webovej služby stačí jedno kliknutie na refresh reference.
Ak ste nútení v Jave nielen programovať, ale riešiť aj deployment, výraz Jar Hell vám asi bude dobre známy. Ak v .NET používam v projekte nejakú knižnicu, môžem si určiť, či sa má použiť jej najnovšia, alebo nejaká špecifická verzia. To v Jave nejde. Nalinkujete si JAR knižnicu a je na vás, aby ste program dodávali presne s verziu, ktorú potrebujete, aby nikto neurobil update knižníc na verzie, s ktorými váš program nebude fungovať.
Toto sú asi hlavné veci, ktoré mi na Jave naozaj vadia a nedokážem sa s nimi zmieriť. Samozrejme,je to určite tým, že som zvyknutý na C#, ktorý je oveľa komfortnejší, ale aj tak zástancov Javy nechápem.
Aktualizácia: článok Java vs C# z hľadiska pohodlnosti programovania
Tip na film: Sherlock Holmes
Mám rád filmy Guya Ritchieho, či už je to Snatch, Lock stock and two smoking barrels alebo rozpačitá RocknRola.... čítať ďalej
LINQ: zrýchlenie databázových dopytov pomocou Compiled Queries
Ak používate .NET a jazyk C#, určite poznáte a hojne využívate aj jednu z jeho hlavných predností, a to LINQ.... čítať ďalej
Komentáre
Igor Kulman (28.05.10 - 17:13:12)
O Mavene som počul, ale robím vo veľkej skostnatelej firme, ktorá je v tomto hrozne zaostalá.
Odhliadnuc od deploymentu mi vadí tá ukecanosť, aj keď, nemyslím, že by som to nazval ukecanosť, skôr slabšie vyjadrovacie schopnosti.
LINQ a lambda výrazy som si naozaj obľúbil je to skvelá vec (a aspoň nepriamo využiješ ten haskell zo školy).
Jakub Janeček (29.05.10 - 17:20:44)
Igore, sice naprosto chápu tvůj názor, ale bohužel myslím, že trochu vychází z neznalosti věci. Je třeba si uvědomit, že jazyk Java je mnohem starší než zmiňovaný C# a jeho dnešní použití vůbec neodpovídá původnímu záměru (embedded systémy). C# při svém vývoji hodně čerpal právě z Javy a díky tomu se mohl nejenom inspirovat v dobrých věcech, ale zároveň se vyhnout těm špatným. Další věcí je fakt, že jedním z pilířů Javy je její zpětná kompatibilita a kvůli tomu není možné nebo je velmi složité implementovat některé příjemné vlastnosti jako closures apod. Každopádně, myslím, že jakékoliv diskuse na téma který jazyk je lepší/vyspělejší/… jsou zbytečné. Každý jazyk se hodí na něco jiného a jeho volba by měla záviset na konkrétním projektu. Mimochodem, příklad funkce ltrim mi nepřijde fér. Přeci to vůbec není otázka jazyka, to je otázka knihoven. Ltrim není vlastností C#, ale je součástí jeho bohatých knihoven, tudíž by vůbec nebyl problém ji přidat do knihoven Javy, případně využít některou z mnoha volně dostupných.
David Majda (30.05.10 - 08:46:54)
Znáš Scalu? Pokud bych měl programovat něco pro JVM a nebyla by striktně nutná Java, použil bych tenhle jazyk.
Jinak souhlasím, že Java dnes za C# zaostává, byť to nevidím tak ostře jako ty – stále nacházím víc podobností než rozdílů.
Mimochodem, argumentování generováním kódu pomocí IDE apod. mi nepřijde úplně vhodné. Porovnáváš jazyky, nebo celé platformy? Pokud to druhé, pak je situace o mnoho složitější a je spousta věcí, co jsi do srovnání nezahrnul – např. multiplatformnost, cena vývojových prostředí a dalších nutných nástrojů, závislost na jednom dodavateli a další faktory. A situace najednou není vůbec tak jednoznačná, jako při srovnání jazyků samotných.
Miloslav Ponkrác (01.06.10 - 18:10:21)
Ony jazyky a prostředí vypadají jinak, když děláte jednoduché věci, které dělá automatický generátor, a úplně jinak se chová, když potřebujete opravdu něco udělat.
Upřímně, mnoho mužů nalétne žene s velkými prsy co je s ní divoký sex, aby po zbytek života litovali, že tahle fúrie jim ničí život, a nakonec po svatbě sex ani nechce. A stejné je to s jazyky.
Sám programuji přes 20 let, a vzhledem k tomu, že jde Java i .NET tak nějak skoro mimo mně, řekl bych toto: Kdybych byl nucen dělat a mohl si vybrat, Java je pro mně jasná volba. Je to seriózní jazyk, který možná pro projekty typu hello world nejsou tak přívětivé, ale pro střední a velký projekt velmi oceníte jeho domyšlenost na rozdíl od celého .NETu a C#.
Samozřejmě výše uvedené berte jako můj subjektivní názor. Ale hodnotit jazyk podle toho, že jednu dvě věci jinde napíšete snadněji? To je nedospělé.
Žádná podniková firma, kde jde o hodně, a kde chyba sw může hodně stát Vám nic nepostaví na .NET frameworku, pokud není kamikadze. Ale na Javě se v takovýchto případehc staví hodně.
Nechci obhajovat Javu, ostatně není to můj favorit, ale Java na rozdíl od technologie .NET frameworku je seriózní dotáhnutý jazyk.
Navíc s Javou není problém v multiplatformních prostředích, Java má vyřešené licenční a další věci. Java má standard jazyka.
Prostě .NET je především hezké pozlátko, Java je spartánštější, ale funkčnější, domyšlenější a dotáhnutější. Pokud hodnotíte pozlátko, což je předmětem článku, jasně to musí .NET vyhrát. Naštěstí třeba banka nemůže hodnotit podle pozlátka, když dělá svůj informační systém, protože použití špatné technologie by jí snadno přivedlo do konkursu a krachu.
Igor Kulman (01.06.10 - 18:16:02)
Ako môžete tvrdiť, že Java je domyslenejší a dotiahnutejší jazyk, keď ako sám píšete, ide Java aj .NET mimo vás ?
Všetky zložitejšie veci sú predsa poskladané postupne z triviálnych, ak sa triviálne veci robia ťažko, nemôžete čakať, že väčšie pôjdu jednoducho.
Môžete teda odkázať napríklad ČSOB, že sú kamikadze, keďže ich internet banking beží na ASP.NET.
Miloslav Ponkrác (01.06.10 - 20:55:41)
Posílám komentář ještě jednou, protože byl useknut v místě typografické pomlčky, tedy v prvním Unicode kódu přesahující možnosti ISO-8859–2, ve kterém je kódována tato stránka. A bez toho pokračování vypadá můj komentář divně.
Java i .NET jde mimo mně, to ovšem neznamená, že o nich nic nevím, ani jsem v nich nic neudělal.
Všechny složitější věci nejsou jen součtem jednoduchých. To je omyl. Složitější věci neuděláte tím, že nalepíte na sebe několik jednoduchých. To by pak byly zbytečné disciplíny jako
Ivana Lukšová (07.06.10 - 17:33:36)
Nad týmto článkom sa može každý, kto aspoň trochu viac prenikol do tajov Javy, akurát zasmiať. Nechcem vyvolávať žiadny flame a súdiť, ktorý jazyk je horší či lepší, pretože toto snáď nikto nemôže komlexne posúdiť. Java je stále veľmi obľúbená, technológie typu OSGI, Maven, Spring, GWT, Hibernate spravia obrovský kus práce za teba a naviac sú voľne dostupné. Lenže toto zistíš, až keď vyvýjaš niečo trochu zložitejšie ako zápočtový program :)
Igor Kulman (07.06.10 - 18:19:14)
Spring a Hibernate poznám, je to „ekvivalent“ ASP.NET MVC a LINQ to SQL z .NET sveta. O obľúbenosti nič v článku nehovorím, nech má každý rád, čo len chce, hovorím o efektívnosti a zaostalosti.
Nenechaj sa zmiasť vetou „študent informatiky na MFF UK“, pracovných skúseností z veľkých projektov mám myslím dostatok, k tomuto článku ma motivovala aktuálna práca na kompletnom riešení Identity and Access Managementu pre českú Telefónicu O2.
Ivana Lukšová (10.06.10 - 11:00:55)
Nuž bohužial, tento článok ma o tom, že je Java zaostalá a neefektívna, vôbec nepresvedčil :D Chápem, že je to Tvoj názor a nebudem Ťa presviečať o opaku, ale titulok článku je trochu klamlivý :) Keby to bola naozaj pravda, prečo potom to obrovské množstvo technológií, ktoré sa vytvorili a stále sú vytvárané práve na báze Javy? Inak odporúčam prečítať si: http://www.veridicus.com/…s_csharp.asp
PS: Spring zďaleka nie je ekvivalent ASP.NET MVC, to je len jeden jeho modul Spring MVC. http://en.wikipedia.org/…ng_Framework#…
Daniel Turan (28.06.10 - 16:23:39)
Kazdy kto vyrastol na .net a musel spravit nieco seriozne v jave bude s igorom suhlasit. Aspon zatial som si to na si tucte programatorov na 100% osobne potvrdil.
Ak niekto tvrdi, ze .NET je nedotiahnuty, nevhodny na velke projekty, ze treba vela investovat do vyvojoveho prostredia, tak proste nema dostatocne vedomosti/skusenosti. (specialne narazam na Ivanin komentar o OSGI, Maven, Spring, GWT, Hibernate a hlavne na komentar Miloslava o nedotiahnitosti .net a o tom ze seriozna firma nom nic nepostavi).
sorry, ale je to proste tak, viem to velmi dobre argumentovat, ale to by sa nezmestilo do komentara. Skuste byt trochu viac nezaujati a nehovorit nieco o com nemate dostatok informacii. Lebo to co ste tu napisali, su argumenty na sposob Fica.
Problem mozno je, ze o .nete sa vela hovorilo v jeho rannych verziach (1 a 1.1) kedy java mala este navrch. Vtedy aj vznikla drviva vacsina porovnani Javy a C# a nazorov ze cely .net je nedotiahnuty.
Fakt je ten, ze java trpi svojou spatnou kompatibilitou, lebo kompatibilita zo starymi verziami znamena aj urcitu zastaralost.
Platforma .net a C# vznikali velmi dlho, za asistencie velmi velkeho mnozsta programatorov, a inych IT zainteresovanych ludi, ktori sa delili o svoje skusenotsi. To si moze dovolit iba MS a mozno este google. Od zaciatku bolo cielom vytvorit jazyk, ktory zoberie zo vsetkeho to najlepsie (z C++, Javy, Visual Basicu, Pythonu…) a zbavi sa tych zlych vlastnosti. Prave toto ‚zbavenie sa zlych vlastnosti‘ si nemozu vyvojari javy dovolit.
ked to zhrniem, pre mna:
- jazyk C# ma vsetko co ma jazyk Java, + vela veci navyse (napr. Linq, extenstion metody, ktore mi sice nechybali, ked neexistovali, ale dnes by som sa nezmieril s tym, ze by som ich nemohol pouzivat). ak nie, opravte ma, rad sa poucim.
- kniznice .NET frameworku su predsa len ucelenejsie a modernejsie a hlavne bohatsie ako tie z javy. (aj z dovodov, ktore som spominal vyzsie). Proste nemuseli prechadzat takym vyvojom ako java, ale boli napisane rovno,s ohladom na prechdazajuce dobre aj zle skusenosti napriklad z javy.
- kedze mame vyvojove prostredia, framework, team server, office a mnoho dalsieho od jedneho vyrobcu mozeme si dovolit ovela vacsiu mieru integracie nastrojov, co setri neskutocne mnozstvo casu (a tym aj penazi), kladie mensie naroky na obsluhu a zvladnutie softwareu + znova to pridava nejake moznosti navyse
- v IT svete .NET pokryva ovela vacsiu plochu, co sa tyka moznosti. vytvorit v jave napriklad botahe UI? zamozrejme je to mozne, ale v porovnani s WPF, jeho efektivnostou a moznostami ktore to ponuka, je to ako porovnavat cajovy lyzicku a bager pri kopani jamy.
Web aplikacie? samozrejme v jave mozne, ale v porovnani s WebForms a MVC? trabant a Lamborgini. Ked si zoberiem posledne tri projekty, na ktorych teraz robim (povahou uplne odlisne), ani jeden by nebolo mozne, alebo len velmi tazke (rozumej len s velkymi skusenostami) spravit v Jave.
5. Neodskriepitelne plus pre Javu je jej multiplatformovost. A treba povedat, ze to je velmi vyznamny parameter, ktory moze prevazit vsetko, co som tu pisal. Ale ak toto nieje nevyhnutny parameter a ak neberiem do uvahy to ze java developera je jedoduchsie zohnat (kedze ja sam som developer) tak to az taku vahu nema, naopak z tejto vlastnosti prameni mnoho obmedzeni.
Ak je niekto skalopevne presvedceny o opaku, rad sa o tom porozpravam na maile turand zavinac centrum sk
Daniel Turan (28.06.10 - 16:26:14)
ale tvrdenie ze Java je zaostala a neefektivna je predsa len trochu odvazne. Aj java sa vyvyja a drzi krok s dobou, .NET sa vyvyja trochu inym smerom. Preto mozno argumenty typu ltrim, aleb Linq, alebo Visual Studio nemaju vzdy potrebnu vahu na strane javistov.
Igor Kulman (28.06.10 - 16:33:36)
Netvrdím, že Java je zaostalá práve kvôli týmto veciam, ale aj kvôli týmto veciam, keď programujem, mal by som mať jednoduché veci zaistené a zamýšľať sa nad tým, čo robím v zmysle business logiky a nie nad tým, ako odstránim duplicity zo zoznamu a pod.
Multiplatformnosť je podľa mňa hrozne preceňovaná vec. Ak vyvíjam desktopovú aplikáciu, vyvíjam ju pre Windows, iné platformy sú zanedbateľné, prípadne ak niečo cielene pre Linux, tak ma Windows nezaujíma. Ak vyvíjam nejakú webovú aplikáciu, tak si platformu zvolím takú, aká mi vyhovuje.
Daniel Turan (28.06.10 - 16:41:08)
Igor, ale nieje to az tak pravda. V nasej firme, kde sa pouzivaju Macy, Linuxy aj Windows treba napriklad urobit soft, ktory sa napaja na bug-tracikng system a meria ti cas, ktory si stravil na roznych projektoch. Na toto by bola java predsa len vhodnejsia. Ale nakoniec sa to asi ja tak spravi vo Flexe :P
ARny (10.11.10 - 00:02:45)
Po precitani tohto clanku si myslim, ze autor nema dostatocne skusenosti vo vyvoji aplikacii v jave. Podme po poriadku. Budem reagovat aj na prispevky z vasich komentarov.
- Neviem ako by vam funkcia ltrim mohla vymazat prefix zo stringu, ked vseobecne trim funkcie vymazavaju iba whitespace znaky.
- Riesit duplicity? To co vy popisujete je podla funkcionalita Linq-u, co je rozsirenie jazyka C#. V jave by ste nemali ziadny problem pouzit jazyk groovy, ktory dokaze pracovat rovnako pekne. Okrem ineho popisujete ze HashSet je pre vas asi technologia minulosti. Podla mna ale bude pri rieseni velkeho poctu duplicit daleko efektivnejsi nez pouzitie vasho pristupu, ktory pracuje iba z listom (teda ak ten priklad od vas je list). Rovnaky pristup by ste museli pouzit aj vy a to pravdepodobne cez Dictonary.
- To co pisete o webovych sluzbach nieje feature C# ale vyvojoveho prostredia. To znamena ze porovnavate hrusky z jablkami. Aj java ma „klikacie“ prostredie na lahke loadnutie a pouzivanie webservisov len som si neni isty poctom klikov pri vytvarani mozno ich bude aj 5 :).
- Deployment v jave sa da urobit jednoducho a zlozitejsie, zalezi na vas aky pristup zvolite. Ci uz maven, ant alebo nieco uplne ine.
- Ked ste napisal, ze spring je ekvivalent ASP.NETu a Linq-u tak ste urazil asi vsetky ludi co ho pouzivaju a mal by ste si o nom nieco nastudovat (spring bol preportovany aj pre .NET).
- Multiplatformovost sa precenuje dovtedy, kym nezacnete nadavat preco tento program nefunguje a aj pod linuxom. Ja som len strasne zvedavy, keby manager chcel rozsirenie aj na inu platformu nez je win, co by ste mu asi povedat? Nainstalujte si mono?
Aby som to zhrnul. Celkom neviem ci sa clanok stazi porovnavat javu iba ako jazyk alebo aj ako platformu. Ako jazyk je mozno syntakticky chudobnejsia ale ak mam pravdu povedat, vacsinu z tej novej syntaxe v podstate aj tak nepotrebujete (sam nepouzivam niektru syntax este z java 5). Kazdopadne takto syntakticka „chudoba“ sa v jave riesi uz inym sposobom. Napriklad java ma velmi peknu podporu jazyka groovy, ktory sa dost podoba pythonu, takze mozte ocakavat same syntakticke chutovky. Pokial chcete javu porovnavat z hladiska platformy, tak tam ma .NET este do kopirovat, ehm, teda dobiehat. Aby ste ma pohopil, ja niesom nejaky extremisticky zastanca javy. Sam mam podobne znalosti javy ako .NETu (C# aj VB.NET) a poznam ich niektore slabiny. Podla mna by ste nemali hodnotit javu pokial nemate vacsie znalosti z tejto plaformy, pretoze ste tu nevymenol ani jednu podstatnu nevyhodu java platformy. Nariekat o tom, ze v .NETe napisete nieco o par znakov menej nez v jave nema ziadne opodstatnenie a to mi mozte verit. Tiez som taky byval ;) ale prax cloveka nauci. Verim, ze niekedy dostanete rozsiahly projekt v jave a vtedy pochopite java plaformu. Dovtedy vsak nemate pravo hodnotit javu.
Mike (13.11.10 - 11:18:56)
Pekny sumar, uplne suhlasim s poslednym komentom.
Pridať komentár
Autor
Autor je absolventom softvéroveho inžinierstva na Univerzite Karlovej v Prahe, pracuje ako Windows Phone 7 vývojár v Inmite a pôsobil aj ako prispievateľ počítačového magazínu.


RSS komentárov




Matus (28.05.10 - 16:02:52)
Ahoj Igor, myslim, ze toto, co tu popisujes, je dost subjektivna vec, vela ludi ma opacny nazor (inak by asi Java nebola najpopularnejsia..). Osobne pouzivam to, co mi pride vhodne pre danu vec, alebo jednoducho co musim zo zadania. Nechcem sa tu zastavat Javy ani C#, nemam popravde na to zdaleka dost skusenosti, aby som mohol tvrdit s istotou, ze jedno je lepsie ako druhe. Neda mi ale aspon trochu upravit par veci, co si napisal:
JAR-Hell riesi Maven (http://maven.apache.org), nie su to sice 3 kliky, ale ako to raz nakonfigurujes, bezi to navzdy + ti to tie kniznice stiahne samo v spravnej verzii z netu. Deployment mas tak (po napisani configu) na par prikazov. Konkretne s tym zaciname teraz riesit SWprojekt, kde nam to (maven) skompiluje aplikaciu na Spring/Hibernate, skompiluje Flex projekt, spoji dokopy do .war a deployne do JBossu. Luxusnejsie to uz myslim nejde.. Mozes sa samozrejme hadat, ze Maven nie je sucast Javy, ale problem to riesi.
A to, ze je Java ukecana, nie je ziadna novinka :) Kazdemu to svoje teda!