Diskuze a otázky - Nevíme a tak myslíme neboli programujeme
úvodní strana | aktualizovat | dolů
V diskuzi je 6 příspěvků a shlédlo ji 458 uživatelů .
uživatel eliminován | 22. 02. 2008, 12:26:46
hmm ... obdiwuju ty, co to četli jako !1350! takej romáán tyo !1350!
_Wugi_ | 22. 02. 2008, 12:08:18 | více příspěvků | napsat uživateli
Tak.. a ted sem to celé dočetl a zjistil jseml, že je to o hovnu !122!!357!
uživatel eliminován | 22. 02. 2008, 12:04:03 |
!11!Myšlení to je programování ale jaký jazyk na programování je nejlepší?!11!
V dnešní době hodně programátorů přemýšlí, který programovací jazyk mají používat, případně studovat. Jeden z nejpopulárnějších a také nejpoužívanějších programovacích jazyků dneška je Java, kterou již přes pět let prosazuje firma Sun Microsystem. Reakcí na úspěch Javy je nový programovací jazyk, uvedený firmou Microsoft, C#. V tomto článku se pokusím přinést svůj pohled, který je založený na dlouhodobé zkušenosti s oběma jazyky
Jak to možná začalo...
Java již má něco za sebou a dokázala se za dobu své existence prosadit jako dnes již standard pro vývoj velkých serverových systémů a internetových aplikací. Mnoho těchto starostí způsoboval Javě primárně Microsoft, kterému se nejdříve vůbec nelíbilo, že někdo hned od začátku vzbudí takový zájem jako Sun Microsystems, a to ještě na poli, které si snaží Microsoft přivlastnit, tj. vývojové nástroje a programovací jazyky. Sám si pamatuji, jak jsem na internetu vedl diskuse nad výrokem Billa Gatese, který v souvislosti s uvedením Javy zarytě tvrdil, že další programovací jazyk už je zbytečný. Javě také bylo předpovídáno, že do 2 let zmizí ze světa.
Jak situace dnes vypadá můžeme vidět sami. Příkladem jsou internet-banking systémy největších našich bank, které jsou postaveny na platformě J2EE nebo třeba i burzovní systémy nebo clearingové systémy, většinou stojící na Javě (viz. např. Clearstream) a stále rostoucí komunita programátorů v Javě. A proto je zcela pochopitelné, že Microsoft se nemohl spokojit s tímto rostoucím úspěchem Javy. Musel změnit svoji strategii a hlavně rétoriku z pohledu: „není nutný další programovací jazyk“ na „C# je to, bez čeho programátor nemohl nikdy žít“. Když odhlédneme od toho, že to všechno je jen marketingový balast, tak je skoro až neuvěřitelné, jak Microsoft potichu a s úspěchem zkopíroval model firmy Sun Microsystems. Microsoft ve svém .NET prostředí postavil vše kolem C# (podobně jako Sun s Javou) a proklamoval .NET jako prostředí otevřené jakémukoliv programovacímu jazyku (hezká analogie k multi-platformnosti Javy). Platforma jako .NET se dala již víc než očekávat (a lidé kolem Javy o ní již dlouho věděli – viz. spousta ověřených i neověřených informací o připravované odvetě Microsoftu vůči Sunu na Javalobby).
Možná se teď ptáte, proč zde uvádím toto shrnutí? Myslím si, že pro správné (nebo alespoň uvážlivé) rozhodnutí, je vhodné znát tento pohled, a pak se lépe rozhodnout, na co vsadit a na čem vydělat.
Java/C# = 1 ?
Asi začnu od věcí, kterých si každý programátor všimne hned, když vidí kousek kódu v daném jazyce, styl programování a „vzhled“ kódu. Musím říct, že můj první dojem, když jsem C# viděl poprvé, byl, že Microsoft pouze překopíroval Javu a pouze přejmenoval standardní příkazy (viz. následující příklad).
Příklad v Javě
import java.lang.*;
public class HelloWorld {
public static void main(String[] args) {
System.out.println(“Hello World”);
}
}
Příklad v C#
using System;
class HelloWorld {
public static void Main(string[] args) {
Console.WriteLn(“Hello World”);
}
}
Oba dva zdrojové kódy se zdají být koncepčně úplně shodné, pochopitelně s rozdílnými názvy pro příkazy, jinou jmennou konvencí a nebo názvy pro „packages“ potažmo „namespaces“. Ale myslím si, že to není vůbec podstatné, protože pak by se dalo tvrdit o každé aplikaci napsané v C/C++ a používající proprietární zápis, že se nejedná o C/C++, ale o nové programové prostředí dané firmy a aplikace.
V tomto případě bychom mohli jít ještě hlouběji a ukázat si víc, než těsnou provázanost C# a Javy (výjimky, objektové chování atd.).
Až později jsem zjistil, že zhodnocení tohoto jazyka je o něco složitější a že zaujatý a černobílý pohled se nikdy nevyplácí.
(Ne)výhody – Java, C#
Během několika let, kdy programuji s Javou, jsem se setkal s mnoha jejími nedostatky a následující krátký výčet, je asi zatížen subjektivním pohledem, který vychází ze stylu programování, osobních zkušeností a typů projektů, na kterých jsem pracoval. Přesto se ale pokusím o co nejvyšší objektivnost.
Java prošla za 6 let vývojem od jazyka, který spíše sloužil k vývoji „hraček“ ve stylu apletů na stránkách, až ke skutečným velkých informačním systémům. Zde se nakonec uchytila a čas prokázal, že právě zde je velmi vhodná a její použití zrychluje a zkvalitňuje vývoj, což znamená ušetřené peníze a větší zisk (a o to nám jde primárně).
Na druhou stranu se Javě doposud nepodařilo úspěšněji proniknout do desktopových aplikací, a to primárně z důvodu vysoké systémové náročnosti Swing knihoven. I zde by mělo být zlepšení díky použití SWT, ale to zatím mluvíme spíše o budoucnosti, než o tom, čeho Java dosáhla. Přesto její výhled je víc než dobrý.
Na druhou stranu zde máme nový, doposud nijak neprověřený a nepoužívaný nový programovací jazyk C#, který ale je víc než viditelným posunem ze strany Microsoftu. V tuto chvíli je těžké hodnotit jeho úspěch na serverové straně (i když se dá víc než předpokládát a to minimálně díky elegantní integraci do ASP.NET), ale je dnes již zcela zřejmé, že na straně desktopových systémů Windows nebude mít v nejbližší době konkurenci. Již nyní lze C# použít k vývoji kvalitních desktopových aplikací a přitom neriskovat nestabilitu, jako tomu může být v případě serverových systémů.
Co mi chybí na Javě
Java: To, co mi na Javě, asi chybí primárně je neexistence preprocesoru. Sice existují různé testovací a debugovací utility, ale všechny se stále snaží obejít onu skutečnost, že je nutné míchat a nebo minimálně provazovat testovací kód s produkčním kódem. Je to něco, co mě osobně v Javě výrazně chybí a doufám, že Sun se rozhodne k používání preprocesoru.
C#: C# se poučil z vývoje Javy (hlavně z reakcí programátorů) a rozhodl se chybu s preprocesorem neopakovat. Proto jej specifikace tohoto jazyka určuje a kromě toho pre-procesor v C# doznal výrazného vylepšení (tedy spíš zjednodušení) oproti např. pre-procesoru v C/C++. To, co pokládám za nejlepší změnu, je eliminace direktivy include a define, které jsou velmi často důvodem zdlouhavého prozkoumávání velkého kódu např. při jeho ladění nebo při předávání projektu novému kolegovi. Také eliminace include viditelně zrychlí kompilaci, což u velkých projektů je nezanedbatelný faktor (hlavně při ladění).
Co mi přebývá v C#
Java: Co mě na Javě stále více upoutává, je její jednoduchost a přehlednost. Autoři Javy se snažili, aby výsledný kód mohl být co nejvíce „čistý“ a čitelný a vedl ke kvalitnímu objektovému návrhu. I z tohoto důvodu zde existuje podle mého názoru jednoduchý přístup k objektovým principům, jako je například předefinování metod a virtuální metody. Neboli, pokud implementujete metodu, která se shoduje v názvu, návratovém typu i parametrech, vezme se její implementace z poslední třídy, kterou vytvoříte (myslím tím instanci třídy, které ale není přetypována) a která je poslední v hierarchii (prostě se přetíží původní funkčnost). To je podle mého názoru jednoduchá logika, která vede i ke kvalitnímu objektovému modelu při návrhu systémů.
C#: C# předefinování metod realizuje o něco jiným způsobem. Hlavní rozdíl je v tom, že předefinování je zde uděláno o něco složitěji a nejsem si jist (což soudím na základě svých zkušeností s vývojem v C#), že ku prospěchu věci.
Nebudu zde popisovat všechny možnosti, které C# pokrývá, protože cílem tohoto článku není zaškolit do Javy nebo C#, ale pokusit se o srovnání. To, co C# prosazuje, mi ale připadá jako předělávání programátora na písařku. V krátkosti mohu uvést, že pro to, abyste mohli explicitně předefinovávat metody pomocí klíčového slova override, je nutné u jejich předků uvádět v deklaraci další klíčové slovo virtual nebo abstract (pokud override nepoužijete, metoda se i tam předefinuje a pouze kompilátor vyhodí varování). Tím ale dochází k tomu, že kód se stává složitý (jak to přišlo mě, ale i mým kolegům i nepřehledný) a jak jsem si prožil na několika projektech, nakonec se upouští od používání těchto klíčových slov a v podstatě se udržuje chování podobné Javě nebo C++. Je pravda, že na jednu stranu zde působí jakési „zvykové právo“ programátorů, kteří přicházejí z Javy nebo C++, ale i při odhlédnutí od těchto zvyklostí mi připadá, že se podle mého názoru jedná o ne příliš praktickou vlastnost.
Co vybrat?
Tak na tohle není vůbec snadná odpověď a vůbec si nedělám patent na rozum, že ji vím. V předchozích odstavcích jsem se pokusil nabídnout určité pohledy, které jsou subjektivní a které zase mnoho mých kolegů může vidět odlišně. Přesto bych si dovolil aspoň pokus o shrnutí, který by mohl být základem pro další diskusi.
Musím říct, že za mých skoro 10 let práce v IT jsem poznal hodně programovacích technik, jazyků a přístupů a vytvořil jsem si jakýsi okruh mých „jazykových favoritů“ a Java mezi ně určitě patří a s technologií JNI dokáže řešit prakticky cokoliv.
Na druhou stranu se objevil C#, který má některé vlastnosti, jimiž by Java určitě nepohrdla a které podle mě dělají z C# přinejmenším velmi dobrého soupeře.
Přesto říct, zda-li je Java lepší či horší než C# nelze nějak jednoznačně a hned se pokusím vysvětlit proč.
Podíváme-li se na Javu, tak ji můžeme hodnotit ze dvou úhlů: přijetí Javy na trhu a pak možnosti jazyka jako takového.
Co se týká úspěchu na trhu, tak Java již jasně prokázala svojí kvalitu a to jak v malých aplikacích tak na velkých systémech. Příkladem může být integrace Javy do SAPu, podpora Javy v milionech mobilů (viz. podpora NTT DoCoMo) nebo z našich luhů a hájů implementace internet-banking systémů, kdy skoro všechny mají za základ Javu a prostředí J2EE. Proto je možné nyní jasně říct, které koncepty se v praxi ujaly a které naopak nejsou zase příliš využívány. V tomto je možné konstatovat, že je zcela zřejmý odklon od systémového programování (například v Javě minimální použití JNI) k spíše úlohově zaměřenému ( řešit danou obchodní úlohu, než její systémové pozadí a tím v důsledku šetřit náklady na vývoj).
Další obrovská výhoda Javy je její velká podpora od různých softwarových výrobců a integrace Javy do velkých aplikačních systémů jako jsou např. databáze (Oracle, Sybase, IBM). To je podle mě nesmírně důležité, protože to vytváří možnost kombinovat a používat různé produkty (ona stále zmiňovaná produktová nezávislost) a přitom požadavky a náklady na vývoj budou nižší právě díky jednotnému rozhraní definovanému v J2EE (je velmi snadné potom různě kombinovat a provazovat jednotlivé vývojové týmy, které mají odborné technické znalosti a tím zrychlit vývoj na krizových částech podle potřeby zadavatele).
Na druhou stranu je na Javě jako na programovacím jazyku vidět, že již má na sobě pár křížků, a proto některé jazykové koncepty mohou být již z dnešního pohledu pokládány za nedostatečné (viz. např. výše zmíněná část o preprocesoru). Je dost škoda, že se Sun neuvolnil ke standardizaci Javy (údajně kvůli rychlosti reakce standardizační komise na změny), která by možná vedla k lepšímu a hlavně rychlejšímu vývoji jazyka než je zatím pod křídly „Sluníčkářů“.
Dalším slabým místem Javy jsou klientské aplikace, kde Java zatím hledá sebe sama. Zde se sice v poslední době objevily velmi zajímavé koncepty (viz. novinky v JDK1.4 a nebo knihovny SWT), ale stále je na tomto poli Java těžkopádná. A to i přesto, že se objevily takové aplikace, jako světově populární P2P systém LimeWire.
Pak tu máme neotřelý C#. Žel zatím tak neotřelý, že nemáme v ruce skoro žádné nasazení v „enterprise“ sféře, a proto nemůžeme říct, kde je skutečná tržní síla tohoto jazyka a který koncept bude používán. Já osobně znám několik firem, které připravují použití C# pro velké burzovní systémy nebo i pro banky, ale zatím všude jsem byl svědkem toho, že ze strany klientů není zájem jít do .NET prostředí, dokud se neprokáže jako stabilní a bezpečné.
Osobně mám dojem, že Microsoft napodobil s vývojem C# pejska a kočičku, vařící dort, a smíchal mnoho, někdy i rozdílných, konceptů. Toto jednání chápu a dokonce je výhodné pro nás vývojáře. Microsoft dokázal velmi šikovně vykuchat jazyky jako Java, C/C++, Smalltalk atd. a vytvořit hodně univerzální řešení, které lze použít pro psaní databázových aplikací až po vývoj systémových ovladačů. Kromě toho specifikace C# neurčuje, pro kterou platformu má být C# určen, ale ve svém popisu je otevřena všem systémům.
Prozatím je ale C# úzce svázán s Windows, kde bude jeho největší síla (existují portace na Linux, viz. tabulka). Umožňuje snadno pracovat s COM+ a je výborně integrován do všech produktů založených na .NET architektuře.
Kromě toho je C# otevřený programovací jazyk, který se pravděpodobně bude vyvíjet podle potřeb programátorů. To se u Javy nedá vůbec říci, protože Sun prakticky nereflektuje na mnoho připomínek i ze strany svých partnerů (např. připomínky výzkumníků IBM na téma multithreading). Osobně tohle pokládám za jeden ze zásadních bodů, protože tak jako se Sunu vyplatilo otevřít svůj „Java Runtime“ a pustit do něj další výrobce (IBM, HP, Microsoft), tak určitě se Microsoftu vyplatí otevřít přístup k vývoji C#. Věřím, že i díky tomu bude Sun nucen otevřít přístup k Javě a moc doufám, že díky tomuto souboji i Microsoft aspoň maličko pootevře cestu ke svému .NET runtimu (jak již udělal v případě Linuxu). A budu-li si chtít zahrát na silně idealistického vizionáře, tak nakonec budeme mít dvě kvalitní prostředí (obě dvě otevřená), z nichž ani jeden z výrobců nás nebude k sobě přivazovat. No nebyla by taková iluze skvělá? ;o)
reagovat