pátek 11. června 2004

Re:Jak se naučit profesionálně programovat?

Promiňte Radku, ale článek Jak se naučit profesionálně programovat nemůžete myslet vážně! Jak můžete doporučit začátečníkovi jazyk C++? Jak můžete doporučit referenční příručku?

Pokud se někdo chce naučit opravdu dobře programovat, tak ať sáhne po učebnici programování. Máte pravdu v tom, že většina učebnic se čtenáře nesnaží naučit programovat, ale naučit syntaxi a jiné špeky daného jazyku.

Pro mě osobně znamená umět programovat, programovat objektově, ale k tomu je třeba umět objektově přemýšlet. Začátečník potřebuje jazyk, který bude bližší lidskému chápání. Potřebujete jazyk, který vás oprostí myslet v intencích alokované/dealokované paměti a podobných závislostí. Vyberte jazyk jenž vám dovolí pohybovat se na větší úrovni abstrakce.

Poté co si začátečník osahá základní techniky OOP a naučí se s nimi zacházet nech se vrhne do dalšího studia. Návrhové vzory, unit testy, UML atd. a pak pokročilejší mechanismy v rámci vlastní odbornosti.

Až přijdete do firmy, která se bude zabývat profesionálním vývojem softwaru a napíšete slovy Radka Hulána ..za 3 hodiny těch řádků 500, budou si ťukat na hlavu. Vývoj softwaru není 110 metrů překážek, stejně jako není pískovým hradem, který můžete každé dva dny rozbourat a postavit znovu.

Stát se dobrým programátorem je běh na dlouhou trať a žádný instantní návod nelze dát.

čtvrtek 10. června 2004

Frontální útok programovacím jazykem Flex

Hned na úvod zklamu příznivce čí zbloudilé příchozí tím, že se nejedná o projekt Flex pod křídly firmy Macromedia, ale o český programovací jazyk Flex. Podle tvůrců Flex vychází syntakticky z Ady a Pascalu a mezi jeho hlavní rysy patří důsledná typová kontrola a OO design. Přidruženým projektem se zaměřením na webové aplikace je modFlex. Toliko k PR masáži, která zahltila české odborné servery Root (8.6.2004)Nový český programovací jazyk a Interval.cz (10.06.2004) Český programovací jazyk Flex a modFlex

Soudě dle ohlasů v diskusích pod články, nebylo přijetí tohoto jazyku nijak dobré. Mezi hlavní nevýhody patří

  • Pouze pro nekomerční použití
  • Pouze platforma Windows
  • Neveřejné zdrojové kódy API
  • Celková uzavřenost jazyku

Jsou tu i další mušky, slabá vývojářská komunita a podpora, není se ovšem čemu divit Flex je relativně úplně nový a neznámý jazyk. Má osobní výtka směřuje k zvolené syntaxi inspirované zmíněným Pascalem a Adou, "kouzlu" begin a end bych přivykal těžko.

Jako odnož projektu Flex vzniklo webové rozšíření modFlex jako alternativa k PHP. ModFlex běží jako modul web serveru Apache. K dispozici jsou i vývojové balíčky pro integraci s textovými editory mezi kterými nechybí ani Elipse.

Potřebujeme Flex a modFlex?

Začal bych odvážným tvrzením samotných autorů Flexu:

Flex je komplexnější jazyk než třeba Java nebo C# a přináší více možností bez nutnosti používat mohutný aparát knihoven i na tak základní věci, jako je multitasking.

Už tady se objevují první trhliny, není komplexnost jazyku dána mimo jiné škálou jeho knihoven? Je to pravou úměrou právě multitasking? Stejně tak by se neměla míchat vlastní jazyky a platformy, platforma Java a .NET jsou mimo tisíce dalších výhod otevřené a neustále rostou a vyvíjejí se. Za Javou stojí mnoho nadnárodních společnosti a velkých softwarových hráčů, za .NETem stojí Microsoft. Proti tomu Flex a firma A&&L soft s. r. o. jsou jen koťátka, na které sem tam zbude nějaký drobt.

Pro Enterprise řešení tu máme Javu a .NET, pro dynamický web tu máme etablované a oblíbené řešení jako PHP, Perl či Python, všechny s širokou komunitou a vývojářskou podporou. Velkou výhodou Flexu bude česká podpora a zázemí pro tuzemské vývojáře, ale na velké rozšíření to nevypadá. Dle mého skromného názoru nedosáhne Flex či modFLex rozšíření a potichoučku si najde vlastní místo v propadlišti dějin. Flex je jako hozený placák na hladinu rybníka, udělá dva tři kroužky a po té nenávratně zmizí pod hladinou... a kdo by ho hledal?

středa 9. června 2004

Trvalé problémy trvalé vrstvy

Není to tak dávno co javovskou komunitou proběhly dvě významné zprávy pro vývojáře. První se týkala připravované enterprise verze Javy 1.5(J2EE 1.5), která bude formována v duchu usnadnění vývoje. Druhou významnou zprávou byl výsledek hlasování o rozšíření JDO specifikace viz. Velcí hráči proti JDO

Po těchto dvou zprávách se rozhořela nebo se jenom přiživila debata o rozšíření J2EE specifikace v oblasti persistence vrstvy. Na jednu stranu tu máme komplexní a relativně složité EJB, které se nehodí a nebo je moc těžkopádné na určité druhy problémů. Jasným důkazem tohoto stavu je existence JDO specifikace a hojné využívání jiných O/R(object to relations) frameworku jako například Hibernate.

Enterprise Java stoji nyní na pomezí a má dvě možnosti. Slyšet, vidět a vnímat volání po rozšíření o persistence vrstvy formou JDO a nebo být imunní a vydat se cestou EJB 3.0.

Ono pomezí, na kterém Java přešlapuje a cestu, kterou by se měla vydat popisuje z vlastního pohledu Geir Magnusson a Jeremy Boynes v článku Persisting Problems

úterý 8. června 2004

Extrémní programování, humbuk nebo přínos?

O extrémním programování(XP) jsem poprvé slyšel na jednom interním školení, kde byly některé jeho metody zmíněny. V paměti mi utkvělo programování v párech a důraz na testování. Z dnešního pohledu vnímám XP jako filosofii vývoje softwaru.

Nemám praktickou zkušenost s aplikací XP, ale jeho aspekty např. zmíněné testování jsou tak obecné, že jdou využít i v běžném vývoji. Podobný názor s aplikací aspektů XP v běžném programování má i Tomáš Kouba v zamyšlení Extrémní programování - pár úvah

Pokud vám XP nic neříká, pak mohu doporučit starší články Pavla Kolesnikova(Jablok) Extrémní programování v praxi a Trocha toho extrémismu.

pondělí 7. června 2004

JavaScript a zpětné volání mezi okny

Občas dostávám úlohy, které zpočátku vypadají zapeklitě, ale postupem času mi přijdou jednoduché. Nejinak tomu bylo při řešení problému, kdy bylo třeba zajistit zpětné volání rodičovského okna z okna dceřiného. Součást rodičovského okna tvořil formulář, pro vyplňování číselníkových hodnot tohoto formuláře se otevíralo dceřiné okno s číselníkem, ze kterého si při výběru přenesly hodnoty do okna rodičovského.

Pro zvýšení uživatelského komfortu vzniknul požadavek, aby bylo možné při vložení hodnoty z číselníku nastavit např. formulářové nabídky či provést jinou akci. Celý problém se musel vyřešit tak obecně, aby to nijak neovlivnilo klientské skripty, které číselníky používají, ale tuto funkčnost nepotřebují.

Jak na to

Pokud je potřeba zprostředkovat komunikaci mezi dceřiným a rodičovským oknem tak nemůžeme začít nikde jinde, než u objektu opener, ve kterém má každé otevřené okno vytvořené voláním window.open(), odkaz na okno rodičovské.

Jako rozhraní mezi oběma okny bude sloužit funkce, nazveme ji například onenumsubmit, která bude volána na rodičovském okně při ukončení práce s dceřiným oknem.

Funkce onenumsubmit bude volána s každým použitím dceřiného okna, ale budeme muset zajistit ošetření stavu kdy tato funkce nebude existovat. Pro tento účel se nabízí využití výjimek a chráněného bloku pomocí try, catch nebo testu na existenci funkce s využitím automatické konverze datových typů v JavaScriptu

Na ukázku si na onenumsubmit navěsíme klientskou funkci, kterou si implementují klientští programátoři. Pro zpestření si ukážeme, jak universálně předat další argumenty pro naši klientskou funkci a jejich vyzvednutí za pomocí pole arguments.

Komentované řešení

Začneme přípravou klientské funkce, ve které si můžeme implementovat logiku podle vlastní potřeby.

  
   <script type="text/javascript">
	function myListener(){
	  //logika pracující s rodičovským oknem
	}
   </script>
 

Připravenou funkci myListener pověsíme na onenumsubmit. Funkci onenumsubmit musíme zároveň přidat objektu window, v dceřiném okně nám pak opener ukazuje na window s funkcí onenumsubmit.

 
   <script type="text/javascript">
	window.onenumsubmit = myListener;
   </script>
 

Případně

 
   <body onload="window.onenumsubmit = myListener;">
 

Pro jednoduchost připravíme klientským programátorům co největší komfort. Protože používáme v rámci našich řešení XSL, připravil jsem jednoduchou šablonu, kterou mohou klientští programátoři volat.

 
  <xsl:template name="addEnumListener">
	<xsl:param name="listenerName" />
         <script type="text/javascript">
		window.onenumsubmit = myListener;
   	 </script>
  </xsl:template>
  .
  .
  .volání
  .
  <xsl:call-template name="addEnumListener">
    <xsl:with-param name="listenerName">myListener</xsl:with-param> 
  </xsl:call-template>	
 

Klientskou část tedy kód pro rodičovské okno máme připravený, nyní si ukážeme jak volat onenumsubmit z dceřiného okna. Díky volání onenumsubmit se zavolá i naše funkce myListener. Volání můžeme spojit s uzavřením dceřiného okna(window.close()) nebo události onunload.

 
   <script type="text/javascript">
	opener.onenumsubmit()
   </script>
 

Bohužel takto jednoduše neošetříme přiklad kdy funkce onenumsubmit nebude existovat. Můžeme použít zmíněný try, catch nebo test funkce.

 
   <script type="text/javascript">
	try{
	  opener.onenumsubmit()
	}catch(e){
	  //ignoruj výjimku
	}
   </script>

   <script type="text/javascript">
	if(opener.onenumsubmit){
          //funkce existuje
	  opener.onenumsubmit();
	}	
   </script>   
 

Rád bych upozornil, že ignorovat výjimky prázdným catch blokem není dobrá praktika. Výjimka, kterou jsme se rozhodli ignorovat prázdným catch blokem, totiž nemusí být nutně vyvolána neexistencí funkce onenumsubmit, ale i chybou v těle klientské funkce pověšené na onenumsubmit, v našem ilustrativním příkladem v myListener.

Pokud by tento případ nastal, měli bychom horké chvilky při dohledávání chyby neboť ta by byla vždy "spolknuta" bez jakéhokoliv chybového hlášení.

Nakonec jsem si nechal malé zpestření v předávání argumentů do klientské funkce. V JavaScriptu neni možné přetěžovat funkce počtem nebo typem argumentů, na druhou stranu všechny argumenty jsou v kontextu volané funkce k dispozici v poli arguments.

Řekněme, že bychom si rádi předali do klientské funkce dvě hodnoty z dceřiného okna.

 
   <script type="text/javascript">
	if(opener.onenumsubmit){
	  opener.onenumsubmit("fooValue","hooValue");
	}	
   </script>
 
  
   <script type="text/javascript">
	function myListener(){
	  fooValue = arguments[0];
          hooValue = arguments[1];
	}
   </script>
 

Samozřejmě by jste si rovnou mohli funkci myListener navrhnout s argumenty v deklaraci(myListener(fooValue, hooValue)), ale pole arguments by se mohlo hodit v případech kdy neznáte počet argumentů. Pro vyzkoušení přidávám odkaz na všeshrnující příklad.

Související články