<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blogisticon &#187; Architektur</title>
	<atom:link href="http://blog.holisticon.de/category/architektur/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.holisticon.de</link>
	<description>Das Holisticon-Blog</description>
	<lastBuildDate>Thu, 16 May 2013 08:10:30 +0000</lastBuildDate>
	<language>de-DE</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>JavaScript für Java Enterprise-Entwickler &#8211; Teil 1</title>
		<link>http://blog.holisticon.de/2013/03/javascript-fur-java-enterprise-entwickler-teil-1/</link>
		<comments>http://blog.holisticon.de/2013/03/javascript-fur-java-enterprise-entwickler-teil-1/#comments</comments>
		<pubDate>Tue, 12 Mar 2013 08:18:47 +0000</pubDate>
		<dc:creator>Oliver Ochs</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://blog.holisticon.de/?p=7190</guid>
		<description><![CDATA[Am 28. Februar waren mein Kollege Norman Erck und ich (Oliver Ochs) für einen Abendvortrag &#8220;Enterpise JS – JS für Java Enterprise-Entwickler&#8221; zur JUG Ostfalen in das Haus der Wissenschaft eingeladen. Der erste Teil des Vortrags richtete sich an Enterprise-Enwickler (meist mit einem Java-EE-Hintergrund), die sich für JS interessieren, sich schnell darin einarbeiten wollen und [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.holisticon.de/wp-content/uploads/2013/03/haus-der-wissenschaft-bei-nacht.jpg"><img class="size-medium wp-image-7198 colorbox-7190" style="float: left; padding: 10px;" alt="Haus der Wissenschaft bei Nacht, CC BY 3.0 Oliver Ochs" src="http://blog.holisticon.de/wp-content/uploads/2013/03/haus-der-wissenschaft-bei-nacht-169x300.jpg" width="169" height="300" /></a>Am 28. Februar waren mein Kollege <a href="https://www.xing.com/profile/Norman_Erck" target="_blank">Norman Erck</a> und ich (<a href="https://www.xing.com/profile/Oliver_Ochs" target="_blank">Oliver Ochs</a>) für einen Abendvortrag &#8220;Enterpise JS – JS für Java Enterprise-Entwickler&#8221; zur <a href="http://www.jug-ostfalen.de/" target="_blank">JUG Ostfalen</a> in das Haus der Wissenschaft eingeladen.</p>
<p>Der erste Teil des Vortrags richtete sich an Enterprise-Enwickler (meist mit einem Java-EE-Hintergrund), die sich für JS interessieren, sich schnell darin einarbeiten wollen und Tipps suchen, dieses Ziel zu erreichen. Dabei wurden einige Grundlagen der Sprache vorgestellt. Dieser Teil des Vortrags sollte eher Lust auf mehr machen als fundamentales Wissen in aller Tiefe zu vermitteln.<span id="more-7190"></span></p>
<p><strong>Geschichte</strong></p>
<p>JS wurde 1995/1996 von Brendan Eich als Mocha bzw. LiveScript für den Netscape Navigator entwickelt. 1996 wurde die Script-Sprache in JavaScript 1.0 im Zuge der Sun-Netscape-Alliance, einer Marketing-Kampagne, umbenannt. Auch Microsoft zog mit JScript, einem JS-Dialekt für Internet Explorer 3.0 nach. JScript wurde nicht JavaScript genannt, um keine Markenrechte von Sun zu verletzen (dies ist auch der Grund, warum heute viele Entwickler lieber von JS als von JavaScript sprechen, denn die Rechte am Namen JavaScript liegen heute bei Oracle). Schließlich wurde der Kern der Sprache als ECMAScript von der ECMA standardisiert.</p>
<p><a href="http://de.slideshare.net/BrendanEich/splash-9915475" target="_blank">Brendan Eich</a> schwebte ein Scheme im Web-Browser vor – eine Sprache, um HTML über Skripte zu manipulieren. Seine Aufgabe war es, JS wie Java aussehen zu lassen, allerdings ähnelte das Ergebnis eher C und AWK. Zudem wurden einige Fehlentscheidungen, die sich auf den Versuch zurückführen lassen, LISP-Konstrukte in JS einzuführen, schon früh eingefroren.</p>
<p>Seine Designziel war u.a., eine Script-Sprache zu schaffen, die es einem Web-Designer ermöglicht, Code-Snippets zu kopieren und in den eigenen HTML-Code einzufügen. Darum toleriert JS Fehler wie fehlende Semikolons. Das ursprüngliche Event-Handling (onclick, onmouseover) war sehr einfach und orientierte sich an HyperCard von Apple. Eich wählte einige mächtige Grundelemente (First Class Functions aus AWK und Scheme und prototyp-basierte Objekte aus Self) und ließ viele andere, in anderen Sprachen übliche, Sprachfeatures weg.</p>
<p>Self – ein Vorbild für JS – war eine Sprache, die in den 1980er Jahren von Xerox PARC &amp; Sun Microsystems entwickelt wurde. Ziel von Self war es, mehr Freiheiten als Smalltalk (eine damals beliebte objektorientierte Sprache) zu bieten. Self verwendet nur wenige Konstrukte wie Slots, Traits und Prototypen, aber keine (statischen) Typen und Klassen. Diese Konstrukte finden sich auch in JS wieder.</p>
<p>Self unterscheidet nicht zwischen dem Verhalten eines Objekts (Methoden einer Klasse) und dem Zustand des Objekts (Eigenschaften einer Klasse). Ein Objekt besteht aus Slots, die einen Namen haben und Methoden oder Attribute aufnehmen können. Objekten können zur Laufzeit Slots hinzugefügt werden. Objekterzeugung erfolgt vollständig ohne Klassen. Neue Objekte erzeugt man durch das Klonen existierender Objekte. Einzelne Slots können an einen Parent delegieren, indem sie den Slot aus dem Parent-Objekt nicht überschreiben. Trait-Objekte sind abgespeckte Implementierungen (Mixins).</p>
<p>Brendan Eich begründet die Existenz der beiden Programmiersprachen – Java und JS – mit dem Argument der Arbeitsteilung: Java war für hochpreisige Komponenten und Widgets vorgesehen, die in Java Applets laufen sollten. JS war für den Massenmarkt und Web-Designer gedacht, die lediglich Glue-Code zwischen Komponenten schreiben, Java Applets ansprechen oder Form-Validierungen bzw. Image-Rollovers implementieren möchten. Allerdings ist in der letzten Dekade Java aus der Client-Seite des Webs fast komplett verschwunden.</p>
<p>Im Jahr 2000 wurde ECMAScript 3rd Edition (ES3) spezifiziert. Dies ist der JS-Dialekt, den heute nahezu alle Browser sprechen. Erst zehn Jahre später wurde der Nachfolge-Standard ES5 fertiggestellt. Dies liegt daran, dass sich das Konsortium um ECMAScript nicht über die Features von ES4 einigen konnte, das u.a. Klassen und eine statische Typsierung bieten sollte. Ideen aus ES4 werden jedoch in ES6 einfließen, das voraussichtlich noch in diesem Jahr fertiggestellt wird.</p>
<p><strong>Dynamische Typisierung</strong></p>
<p>Als Java Enterprise-Entwickler ist man oft der Meinung, dass sich nur in einer statisch typisierten Sprache zuverlässiger Code schreiben lässt. JS kennt aber keine statische Typisierung, sondern Typen werden dynamisch zur Laufzeit ermittelt.</p>
<p>JS kennt fünf Basistypen. Diese sind Zahlen (number), Strings (string), Booleans (boolean), null und undefined. Wenn diese als Literale verwendet werden, sind sie unveränderlich (immutable).</p>
<p><strong>Objekte</strong></p>
<p>Obwohl es Basistypen gibt, so könnte ein Java Enterprise-Entwickler einwerfen, ist JS lediglich eine Script-Sprache. Eine strukturierte, objektorientierte Programmierung ist ohne Objekte nicht möglich.</p>
<p>In JS sind alle Datentypen außer Basistypen Objekte. Dies sind Arrays, Funktionen, Reguläre Ausdrücke (Funktionen) und Objekte selbst.</p>
<p><strong>Prototypen</strong></p>
<p>Der Java Enterprise-Entwickler könnte nun dagegen halten, dass eine objektorientierte Programmierung nur klassenbasiert möglich ist, da man ansonsten kein eigenes Typsystem entwickeln kann. JS bietet keine Klassen und damit kein eigenes Typsystem.</p>
<p>Schon ES3 bietet Konstruktor-Funktionen. Objekte werden über das new-Keyword und eine Konstruktor-Funktion gebildet. Letztere beginnt per Konvention mit einem Großbuchstaben (im Gegensatz. zu „normalen“ Funktionen). Ruft sie der new-Operator auf, wird ein Objekt vom Typ der Konstruktorfunktion erzeugt und kann innerhalb dieser angereichert werden.</p>
<p>Für Verebung gibt es Entwurfsmuster. Wem diese zu unbequem sind, kann eine Meta-Sprache wie TypeScript verwenden, die voraussichtlich ES6 ähneln wird, aber zu lesbarem ES3 kompiliert. Üblicher als die Verwendung von Vererbung ist aber das Benutzen von Mixins, die den Traits von Self ähneln.</p>
<p><strong>Funktionale Programmierung und Closures</strong></p>
<p>Java wird erst mit Java SE 8 Closures bekommen, die einem Konzept der funktionalen Programmierung aus den 1970er Jahren entstammen, das JS von Scheme geerbt hat.</p>
<p>In JS sind Funktionen sind gleichwertig zu Objekten (eine Funktion ist ein Objekt). Funktionen können als Parameter eine andere Funktion übergeben und auch als Rückgabewert ausgegeben werden. Dies illustriert dieses <a href="http://jsfiddle.net/oochs/EAHTU/" target="_blank">Script</a>, das der Standard-Sortierfunktion von Arrays eine Sortiervorschrift als Funktion mitgibt.</p>
<p>Bei der Verwendung von JS ist das Scoping für Java-Entwickler sehr gewöhnungsbedürftig. Auf den aktuellen Kontext (Scope) greift man über <code>this</code> zu. Dies ist der globale Namensraum bei einem Funktionsaufruf, ein Objekt-Namensraum beim Aufruf einer Konstruktor-Funktion mit dem new-Operator, ein Objekt-Namensraum bei einem Methodenaufruf, das <a href="http://jsfiddle.net/oochs/CGVK5" target="_blank">Aufrufer-Objekt bei Events</a> (im Browser) und (hier wird es interessant) definierbarer Namensraum durch call und apply. Durch call und apply lassen sich Methoden eines Objektes im Kontext eines anderen Objekts wiederverwenden. Scoping illustriert <a href="http://jsfiddle.net/oochs/VD5UU/" target="_blank">dieses Code-Snippet</a>.</p>
<p>Eine Funktion wird stets in einem Funktionsgeltungsbereich ausgeführt, der auch dann gilt, wenn in einer Funktion eine weitere, innere Funktion definiert wird. Letztere hat dann Zugriff auf die Variablen der äußeren Funktion. Dieses Verhalten wird als Closure bezeichnet. Ausnahmen sind hier <code>this</code> und der Bonusparameter <code>arguments</code>, da diese Parameter von jeder Funktion selbst überschrieben werden.</p>
<pre class="brush: jscript; title: ; notranslate">
function outherFunction() {
	var x = 'Hello';
	function innerFunction() {
		return x;
	}
	return innerFunction();
}
outherFunction(); // Hello
outherFunction.x; // undefined
</pre>
<p>Im oben aufgeführten Beispiel wäre es möglich, Closures zur Implementierung privater Variablen zu nutzen.</p>
<p><strong>Namespaces und Module</strong></p>
<p>Ein Java Enterprise-Entwickler könnte der Ansicht sein, dass sich in JS Objekte und Konstruktoren definieren lassen – und mit Closures können sogar Konstrukte, die private Variablen ersetzen können, gebaut werden. Allerdings kennt JS keine Packages, ohne die sich Code nur schwer organisieren lässt. Allerdings kann man JS-Objekte als Namespaces benutzen. Dies illustrieren folgende Code-Snippets:</p>
<ul>
<li><a href="http://jsfiddle.net/oochs/AA7TV/" target="_blank">http://jsfiddle.net/oochs/AA7TV/</a></li>
<li><a href="http://jsfiddle.net/oochs/pECUe/" target="_blank">http://jsfiddle.net/oochs/pECUe/</a></li>
</ul>
<p>Über Packages hinaus muss Code in Libraries und Modulen gepflegt werden. In Java existieren dafür JARs, OSGI-Module und demnächst das standardisierte Java Module System. Die Unterstützung von JS dafür ist, was den ECMA-Standard bis Version 5 angeht, mangelhaft. Allerdings spezifiziert <a href="http://www.commonjs.org/" target="_blank">CommonJS</a> ein <a href="http://www.commonjs.org/specs/modules/1.0/" target="_blank">Modulsystem</a>, das u.a. durch <a href="https://github.com/amdjs/amdjs-api/wiki/AMD" target="_blank">AMD</a> (<a href="http://requirejs.org/" target="_blank">require.js</a>) implementiert wird. Dazu möchten wir <a href="http://freshbrewedcode.com/derekgreer/2011/11/28/getting-started-with-requirejs/" target="_blank">diesen Blog-Post</a> empfehlen.</p>
<p><strong>Zusammenfassung und Ausblick</strong></p>
<p>Zusammenfassend für den ersten Teil lässt sich sagen, dass JS als Script-Sprache für den Browser entwickelt wurde. Die Wurzeln von JS sind nicht Java, sondern exotische Sprachen, deren Konzepte niemand kennt. JS ist dynamisch typisiert, funktional und objektorientiert. Packages lassen sich über Objekte nachbilden, und für Module existieren etablierte Ansätze.</p>
<p>Enterprise-Entwicklung ist in der Regel Teamarbeit. Eine umfangreiche Codebasis, wie sie ein großes Team erstellen wird, muss wartbar bleiben. Im zweiten Teil des Vortrags wurden Techniken und Tools vorgestellt, die dabei helfen können, eine geeignete Codequalität zu erreichen und zu wahren. Dieser Teil des Vortrags wird in einem folgenden Blog-Post beschrieben.</p>
<div style="height:33px; padding-top:2px; padding-bottom:2px; clear:both;" class="zare366"><div style="float:left; width:90px; " class="zare366_google1"> 
				<g:plusone size="medium" href="http://blog.holisticon.de/2013/03/javascript-fur-java-enterprise-entwickler-teil-1/" ></g:plusone>
			</div><div style="float:left; width:110px; padding-left:10px;" class="zare366_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="JavaScript für Java Enterprise-Entwickler &#8211; Teil 1" data-url="http://blog.holisticon.de/2013/03/javascript-fur-java-enterprise-entwickler-teil-1/">Tweet</a> 
			</div></div>
		<div style="display:none;"><a href="http://www.news365live.com">news and informations</a>&nbsp;<a href="http://news365online.com">automotive,business,crime,health,life,politics,science,technology,travel</a><a href="http://worldnews365online.com">automotive,business,crime,health,life,politics,science,technology,travel</a></div><div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.holisticon.de/2013/03/javascript-fur-java-enterprise-entwickler-teil-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Moderne Web-Frameworks</title>
		<link>http://blog.holisticon.de/2013/02/moderne-web-frameworks/</link>
		<comments>http://blog.holisticon.de/2013/02/moderne-web-frameworks/#comments</comments>
		<pubDate>Thu, 07 Feb 2013 08:08:32 +0000</pubDate>
		<dc:creator>Oliver Ochs</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.holisticon.de/?p=6905</guid>
		<description><![CDATA[Wirklich skalierbare Softwaresysteme entstehen heutzutage selten im Enterprise-, sondern häufiger im Web-Umfeld. Daher können Enterprise-Anwendungen von den Erfahrungen profitieren, die mit Web-Anwendungen gesammelt wurden. Das Web hat eine eigene Architektur, die durch das HTTP-Protokoll vorgegeben wird und stellt eine Implementierung des REST-Architekturmusters dar. Das HTTP-Protokoll ist zustandslos. Zustände werden zwischen Konsumenten (z.B. einem Browser) und [...]]]></description>
				<content:encoded><![CDATA[<p>Wirklich skalierbare Softwaresysteme entstehen heutzutage selten im Enterprise-, sondern häufiger im Web-Umfeld. Daher können Enterprise-Anwendungen von den Erfahrungen profitieren, die mit Web-Anwendungen gesammelt wurden.<span id="more-6905"></span></p>
<div class="wp-caption alignleft" style="width: 330px"><img class="colorbox-6905"  alt="Pendel einer Uhr" src="http://farm6.staticflickr.com/5061/5644262104_136dc5fa08_n.jpg" width="320" height="243" /><p class="wp-caption-text">Der Trend bei Web-Frameworks pendelt zwischen Request-Response-orientierten und Komponenten-basierten Frameworks. (Bild: <a href="http://www.flickr.com/photos/rvoegtli/5644262104" target="_blank">&#8220;world-movement&#8221;</a> <a href="http://creativecommons.org/licenses/by/2.0/deed.en" target="_blank">cc-by</a> <a href="http://www.flickr.com/photos/rvoegtli/" target="_blank">rosmary</a>)</p></div>
<p>Das Web hat eine eigene Architektur, die durch das HTTP-Protokoll vorgegeben wird und stellt eine Implementierung des REST-Architekturmusters dar.</p>
<p>Das HTTP-Protokoll ist zustandslos. Zustände werden zwischen Konsumenten (z.B. einem Browser) und  Produzenten (z.B. einem Server) transferiert. Sie werden dargestellt durch Ressourcen (Dokumente). Die Kommunikation erfolgt über das Request-Response-Muster. Da keine Zustände gespeichert werden müssen, sondern Zustände übertragen werden, ist eine Web-Architektur theoretisch beliebig skalierbar.</p>
<p>Klassische Web-Frameworks basieren ebenfalls auf dem Request-Response-Muster. Das Programmiermodell eines klassischen Web-Frameworks entspricht also dem Programmiermodell des HTTP-Protokolls. Ein einfaches Beispiel für ein solches klassisches Web-Framework ist die <a href="http://docs.oracle.com/javaee/6/api/javax/servlet/package-summary.html" target="_blank">Java Servlet-API</a>.</p>
<p>Auch das angegraute <a href="http://struts.apache.org/" target="_blank">Apache Struts</a> basiert auf dem Request-Response-Muster, strukturiert aber eine Web-Anwendung, indem das <a href="http://de.wikipedia.org/wiki/Model_View_Controller" target="_blank">MVC-Entwurfsmuster</a> angewendet wird. Ein Controller ist ein Bindeglied zwischen einer Web-View und dem Datenmodell der Anwendung. Wenn ein Request am Java Web-Container (z.B. Tomcat) ankommt, wird dieser vom Struts-Front-Controller engegengenommen. Dieser ruft beispielsweise anhand eines URL-Musters eine Action-Klasse auf. Diese Action-Klasse liest das im Request übertragene Model aus, wendet auf dieses Model Applikations-Logik an, verändert es damit und delegiert schließlich an eine Web-View, die das Model zur Darstellung bringt und im Response zurück an den Browser überträgt. Das Modell wird bei Struts in der Regel in JavaBeans &#8211; sogenannten FormBeans &#8211; gehalten, die bei jedem Request neu aufgebaut und nach dem Response zerstört werden. Zwar steht eine serverseitige Session zur Verfügung, um in dieser nutzerbezogene Zustände der Anwendung zu speichern, allerdings fügt sich diese bewusst nicht in das Konzept des Frameworks ein. Auch neuere Web-Frameworks wie <a href="http://rubyonrails.org/" target="_blank">Ruby on Rails</a>, <a href="http://www.asp.net/mvc" target="_blank">ASP.NET MVC</a>, <a href="http://grails.org/">Grails von Springsource</a>, <a href="http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html">Spring-MVC</a> oder <a href="http://www.playframework.org/">Play</a> aus dem <a href="http://typesafe.com/stack">Typesafe-Stack</a> folgen diesen Wurzeln.</p>
<p>Dieses zustandslose Programmiermodell war jedoch für Entwickler, die aus der Desktop-Entwicklung kommen, fremd. Eine Desktop-Anwendung wurde schon damals aus UI-Komponenten zusammengesetzt. Daher entstanden Web-Frameworks, die dieses UI-Komponentenmodell auf Web-Anwendungen übertragen.</p>
<p>UI-Komponenten haben den Vorteil, dass sich auch komplexere UI-Widgets zusammensetzen und dann konsistent verwenden lassen. Während HTML seit 1997 (bzw. 1999) mit dem 4.01-Standard stagnierte, konnten reichhaltigere UI-Widgets durch komponentenorientierte Frameworks auch von Enterprise-Entwicklern ohne fortgeschrittene Kenntnisse von HTML, JavaScript und CSS benutzt werden.</p>
<p>Der Zustand einer komponentenorientierten Anwendung wird üblicherweise in einem Baum organisiert. Eine Änderung des Zustands der Anwendung wird über Events und nicht über Requests ausgelöst. Meist wird der Zustand des Baums auf dem Server gehalten. Events lösen implizit HTTP-Requests aus, ohne dass sich der Entwickler darum kümmern muss.</p>
<p>Komponentenorientierte Web-Frameworks abstrahieren also sowohl das HTTP-Protokoll als auch HTML, Stylesheets und JavaScript und bieten statt dessen ein höheres Programmiermodell an. Beispiele für solche komponentenorientere Web-Frameworks sind <a href="http://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html">JSF</a>, <a href="http://www.asp.net/">ASP.NET</a>, <a href="http://wicket.apache.org/">Apache Wicket</a>, <a href="http://liftweb.net/">Lift</a> oder das <a href="https://developers.google.com/web-toolkit/">Google Web Toolkit</a> und <a href="https://vaadin.com/">Vaadin</a>.</p>
<p>Grundsätzlich lassen sich Web-Frameworks also stark verallgemeinert in zwei Klassen unterteilen: Web-Frameworks, die auf dem Request-Response-Muster basieren und Web-Frameworks, die dieses Muster abstrahieren und auf Komponenten basieren. Während sich bei Web-Frameworks, die auf dem Request-Response-Muster basieren, der Entwickler selbst um den Zustand der Web-Anwendung und um die Präsentationsschicht kümmern muss, wird bei Web-Frameworks, die auf dem Komponenten-Modell basieren, der Zustand meist in einem Baum auf dem Server gehalten und UI-Komponenten werden zur Verfügung gestellt.</p>
<p>Der Trend ging früher von Request-Response-basierten Web-Frameworks hin zu komponentenorienterten Web-Frameworks. Subjektiv beobachte ich allerdings in letzter Zeit einen Trend hin zurück zu Request-Response-basierten Web-Frameworks. Dies hat mehrere Gründe.</p>
<ul>
<li>Webentwicklung ist schon lange nicht mehr exotisch. Die meisten Entwickler sind inzwischen Web- und nicht mehr klassische Anwendungsentwickler. Der Request-Response-basierte Ansatz einer Webanwendung erscheint vielen Entwicklern heute natürlicher als die eventbasierte Entwicklung in Komponenten-Frameworks.</li>
<li>Durch HTML5 und ECMAScript 5 ist der Stillstand im Bezug auf HTML, CSS und JavaScript im Webbrowser überwunden. Reichhaltige Benutzeroberflächen lassen sich mit HTML5 (und hilfreichen Bibliotheken wie <a href="http://twitter.github.com/bootstrap/" target="_blank">Twitter Bootstrap</a>) viel leichter realisieren als mit HTML 4.01 oder XHTML. Komponentenorientierte Frameworks entwickeln sich inzwischen sogar langsamer als Webbrowser es tun. Modernere UIs lassen sich jetzt also mit den Basistechnologien leichter entwickeln als mit Komponenten-Frameworks. Der komponentenorientierte Ansatz fühlt sich inzwischen schwerfällig an.</li>
<li>Skalierung ist heute wichtiger denn je, da viele Anwendungen inzwischen auf virtuellen Servern in der &#8220;Cloud&#8221; gehostet werden, in denen klassisches Clustering keine Option ist. Daher ist es nicht mehr State-of-the-Art, den Zustand einer Anwendung in einer Session zu speichern.</li>
</ul>
<p>Zwar ist ein Trend zurück zu Request-Response-basierten Web-Frameworks zu beobachten, allerdings sind dies nicht mehr unbedingt die gleichen Frameworks wie aus der Urzeit der Webentwicklung. Hier gibt es zwei Strömungen, die sich allerdings nicht unbedingt widersprechen und beide auf dem REST-Ansatz basieren:</p>
<ul>
<li>Web-Frameworks, die auf Partial Page Rendering und Progressive Enhancement basieren, und</li>
<li>SPA-Frameworks (<a href="http://en.wikipedia.org/wiki/Single-page_application">Single Page Applications</a>), die MVC (bzw. MVP / MVVM) direkt im Browser implementieren.</li>
</ul>
<p>Bei den erstgenannten Frameworks bietet der Server ein Backend, das den REST-Prinzipien folgt. Alle Logik findet auf dem Server statt. Der Browser bringt lediglich vom Server gelieferte HTML-Fragmente (HTML-Snippets) zur Darstellung, gestaltet sie mit CSS und reichert sie durch unobstrusives JavaScript an. Auf dem Server lässt sich hier JAX-RS mit einer dünnen UI-Schicht (<a href="http://jersey.java.net/">Jersey</a> bietet solche Features) oder ein klassisches MVC-Framework wie <a href="http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html">Spring MVC</a> oder eine neueres Framework wie <a href="http://www.playframework.org/">Play</a>, das auf <a href="http://www.playframework.org/documentation/2.0/ScalaSessionFlash">serverseitige Sessions</a> verzichtet, einsetzen. Im Browser genügt eine etablierte JS-Bibliothek wie <a href="http://jquery.com/">jQuery</a> mit entsprechenden Plugins wie das <a href="http://www.malsup.com/jquery/form/">jQuery-Form-Plugin</a> und <a href="http://jqueryui.com/">jQuery-UI</a>. Ein echtes browserseitiges UI-Framework wird nicht benötigt. Anforderungen an eine Beispiel-Architektur, die diesem Muster folgt, definiert der <a href="http://roca-style.org/">ROCA-Style</a> (ROCA = Ressource Oriented Client Architecture).</p>
<p>Bei den zweitgenannten Frameworks wandert das MVC-Muster vom Server in den Browser. Dies kann zu sehr leichtgewichtigen Server-Anwendungen führen. Eine Server-Komponente liefert lediglich eine per URL eindeutig identifizierbare Ressource in einem angeforderten Format (z.B. als JSON-Objekt) aus bzw. persistiert sie. MVC-Frameworks auf dem Browser kümmern sich sowohl um die Logik als auch um die Darstellung. Der Zustand der Anwendung wird im Client gehalten. Die Komplexität der Anwendung wandert also vom Server in den Browser. Daher ist ein echtes UI-Framework im Browser hilfreich. Als Beispiel für leichtgewichtige MVC-Frameworks im Browser können <a href="http://emberjs.com/">Ember.js</a>, <a href="http://knockoutjs.com/">Knockout</a>, <a href="http://angularjs.org/">AngularJS</a> oder <a href="http://javascriptmvc.com/">JavaScript-MVC</a> dienen.</p>
<p>Neben leichtgewichtigen SPA-Frameworks gibt es auch schwergewichtigere, komponentenbasierte Frameworks wie <a href="http://www.sencha.com/products/extjs">Senchas Ext.js</a>, die eher einem JSF oder GWT im Browser als einer angereicherten Website gleichen. Es lässt sich nur schwer beantworten, ob ein solches Framework eher das Beste aus beiden Welten bietet oder sämtliche Nachteile beider Ansätze vereint.</p>
<p>Auch in Enterprise-Anwendungen sollten moderne Architektur-Ansätze, die aus dem Web-Umfeld kommen, zumindest ausprobiert werden. Vorteile wie Skalierbarkeit und leichtgewichtige Anwendungen (zumindest auf dem Server) sprechen für sich. Entsprechende Frameworks sind in diesem Artikel verlinkt. Bei der Auswahl eines Web-Frameworks sollte darauf geachtet werden, dass das Framework von der Architektur her zur Architektur des Webs und seines Protokolls, dem Hypertext Transfer Protocol,  passt.</p>
<p>Viel Spaß beim Ausprobieren!</p>
<div style="height:33px; padding-top:2px; padding-bottom:2px; clear:both;" class="zare366"><div style="float:left; width:90px; " class="zare366_google1"> 
				<g:plusone size="medium" href="http://blog.holisticon.de/2013/02/moderne-web-frameworks/" ></g:plusone>
			</div><div style="float:left; width:110px; padding-left:10px;" class="zare366_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="Moderne Web-Frameworks" data-url="http://blog.holisticon.de/2013/02/moderne-web-frameworks/">Tweet</a> 
			</div></div>
		<div style="display:none;"><a href="http://www.news365live.com">news and informations</a>&nbsp;<a href="http://news365online.com">automotive,business,crime,health,life,politics,science,technology,travel</a><a href="http://worldnews365online.com">automotive,business,crime,health,life,politics,science,technology,travel</a></div><div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.holisticon.de/2013/02/moderne-web-frameworks/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hennen, Eier und Dokumentation in agilen Projekten</title>
		<link>http://blog.holisticon.de/2013/01/hennen-eier-und-dokumentation-agilen-projekten/</link>
		<comments>http://blog.holisticon.de/2013/01/hennen-eier-und-dokumentation-agilen-projekten/#comments</comments>
		<pubDate>Thu, 24 Jan 2013 08:16:25 +0000</pubDate>
		<dc:creator>Jan Weinschenker</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Agiles Manifest]]></category>
		<category><![CDATA[Dokumentation]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://blog.holisticon.de/?p=6877</guid>
		<description><![CDATA[Die Dokumentation fällt in vielen IT-Projekten dadurch auf, dass sie nur unzureichend vorhanden ist. Insbesondere in agilen Projekten wird gern auf einen Absatz aus dem Agilen Manifest verwiesen: Working software over comprehensive documentation. agilemanifesto.org Heißt das, wir brauchen gar nichts zu dokumentieren, solange unsere Anwendung funktioniert? Nein, wenn man genau hinschaut, sieht man, dass dort [...]]]></description>
				<content:encoded><![CDATA[<p>Die Dokumentation fällt in vielen IT-Projekten dadurch auf, dass sie nur unzureichend vorhanden ist. Insbesondere in agilen Projekten wird gern auf einen Absatz aus dem Agilen Manifest verwiesen:</p>
<blockquote><p>Working software over comprehensive documentation.</p>
<p><cite><a href="http://agilemanifesto.org">agilemanifesto.org</a></cite></p></blockquote>
<p>Heißt das, wir brauchen gar nichts zu dokumentieren, solange unsere Anwendung funktioniert?<span id="more-6877"></span></p>
<p>Nein, wenn man genau hinschaut, sieht man, dass dort nicht steht, man solle nichts dokumentieren. Gemeint ist viel mehr, dass man nicht unbedingt umfangreiche Doku verfassen muss, wenn man funktionierenden Code hat. Der Aufwand, den man in die Dokumentation steckt, muss dem Nutzen angemessen sein.</p>
<p>Außerdem drückt sich das Agile Manifest hier etwas vor dem Henne-Ei-Problem: Aufgrund welcher Vorgaben soll ich denn meinen funktionierenden Code erstellen? Als seriöser Entwickler kann ich mich ja nicht auf Basis von mündlichen Überlieferungen des Auftraggebers an die Arbeit machen. Ich brauche irgendwas Handfestes, Schriftliches, mit dem ich anfangen kann, meine Anwendung zu bauen.</p>
<p>Es gibt in jedem Projekt auch Wissen, das man nicht in Form von Programmcode <em>konservieren</em> kann. Zu dieser Erkenntnis sollte man schon deswegen gelangen, weil Dokumentation stets in einer Zielgruppen-kompatiblen Form vorliegen sollte und nicht jedes Projektmitglied zwangsläufig Programmcode lesen kann.</p>
<p>Dokumentation soll dazu beitragen, dass alle Beteiligten ein gemeinsames Verständnis vom Projektziel und vom Weg dorthin bekommen.</p>
<p>Auch in einem agilen Projekt wird man nicht darum herumkommen, dafür Informationen in menschlich lesbarer Form aufzuschreiben. Das Mittel dar Wahl ist dafür meist ein Wiki, auf das jeder Beteiligte Zugriff hat.</p>
<h2>Was wird dokumentiert?</h2>
<p>Zunächst natürlich die User-Stories. Muss hier bis in kleinste Detail ausformuliert werden? Nicht zwangsläufig. Die Mindestanforderung ist natürlich, dass das Team versteht, was der Product Owner haben möchte. Weitere, im Prozess des Story-Tellings gewonnene Erkenntnisse sollten ebenfalls schriftlich festgehalten werden.</p>
<p>Architekten und Entwickler werden im Verlauf der Implementierung einige kritische Entscheidungen treffen und diese im Wiki dokumentieren. Gab es mehrere Alternativen, von denen einige verworfen wurden, sollte auch dieser Entscheidungsprozess nachvollziehbar aufgeschrieben werden.</p>
<p>Überhaupt sollten wichtige Entscheidungen immer schriftlich dokumentiert werden. Schon allein, um langwierige Diskussionen zu Entscheidungsfindungen nicht mehrfach führen zu müssen.</p>
<p>Wird die erstellte Anwendung noch durch externe Tester geprüft, sind diese ebenfalls auf eine vorhandene Dokumentation angewiesen, um auf deren Basis Testfälle formulieren zu können.</p>
<h2>Eine Kulturfrage</h2>
<p>In agilen Projekten, die nach Scrum oder einem vergleichbaren Vorgehensmodell geführt werden, sind alle Team-Mitglieder gleichermaßen für den Projekterfolg und die Qualitätssicherung verantwortlich. Dazu gehört, wie gerade dargelegt, auch die Dokumentation.</p>
<p>Diese entsteht leider nicht von selbst und nicht jedes Team-Mitglied wird mit großer Freude drauflosschreiben. Insbesondere wenn Budget und Zeit gegen Ende einer Iteration knapp werden, wird die Schreibbereitschaft allgemein abnehmen.</p>
<p>Dennoch sollten Projektverantwortliche, Scrum-Master und/oder Architekten sicherstellen, dass die notwendige Dokumentation auch trotz widriger Umstände erstellt wird.</p>
<p>Dabei hilft es sehr, wenn sie diese Dokumentationskultur selbst vorleben und sie nicht ausschließlich vom Team einfordern.</p>
<div style="height:33px; padding-top:2px; padding-bottom:2px; clear:both;" class="zare366"><div style="float:left; width:90px; " class="zare366_google1"> 
				<g:plusone size="medium" href="http://blog.holisticon.de/2013/01/hennen-eier-und-dokumentation-agilen-projekten/" ></g:plusone>
			</div><div style="float:left; width:110px; padding-left:10px;" class="zare366_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="Hennen, Eier und Dokumentation in agilen Projekten" data-url="http://blog.holisticon.de/2013/01/hennen-eier-und-dokumentation-agilen-projekten/">Tweet</a> 
			</div></div>
		<div style="display:none;"><a href="http://www.news365live.com">news and informations</a>&nbsp;<a href="http://news365online.com">automotive,business,crime,health,life,politics,science,technology,travel</a><a href="http://worldnews365online.com">automotive,business,crime,health,life,politics,science,technology,travel</a></div><div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.holisticon.de/2013/01/hennen-eier-und-dokumentation-agilen-projekten/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Was haben Architekturdokumentation und Politiker-Interviews gemeinsam?</title>
		<link>http://blog.holisticon.de/2013/01/haben-architekturdokumentation-und-politiker-interviews-gemeinsam/</link>
		<comments>http://blog.holisticon.de/2013/01/haben-architekturdokumentation-und-politiker-interviews-gemeinsam/#comments</comments>
		<pubDate>Thu, 17 Jan 2013 08:10:49 +0000</pubDate>
		<dc:creator>Stefan Heldt</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Rundumsichtig]]></category>
		<category><![CDATA[Dokumentation]]></category>

		<guid isPermaLink="false">http://blog.holisticon.de/?p=6976</guid>
		<description><![CDATA[Auf den ersten Blick haben die beiden Dinge keine Gemeinsamkeiten. Angeregt durch das Buch &#8220;Software-Architekturen dokumentieren und kommunizieren&#8221; von Stefan Zörner sowie eine Schulung zum iSAQB ® Certified Professional for Software Architecture habe ich in letzter Zeit häufiger über die Dokumentation von Software-Architekturen nachgedacht. Dabei sind mir gewisse Parallelen zu Politiker-Interviews aufgefallen. Die Software ist [...]]]></description>
				<content:encoded><![CDATA[<p>Auf den ersten Blick haben die beiden Dinge keine Gemeinsamkeiten. Angeregt durch das Buch &#8220;Software-Architekturen dokumentieren und kommunizieren&#8221; von Stefan Zörner sowie eine Schulung zum iSAQB ® Certified Professional for Software Architecture habe ich in letzter Zeit häufiger über die Dokumentation von Software-Architekturen nachgedacht. Dabei sind mir gewisse Parallelen zu Politiker-Interviews aufgefallen.<span id="more-6976"></span></p>
<h2>Die Software ist die Dokumentation</h2>
<p>Gerade in kleineren Projekten wird gerne gesagt, dass die Software selbsterklärend ist und keiner Dokumentation bedarf. Das mag sogar sein: Gut strukturierte Software zeigt dem geneigten Betrachter, wie sie aufgebaut ist und wie sie funktioniert. Was einem die Software aber selten verrät, ist, warum sie so ist wie sie ist. Schon gar nicht können wir herauslesen, warum bestimmte Dinge nicht getan wurden, da diese ja nicht in der Software enthalten sind. Wichtig ist also, Entscheidungen und Begründungen zu dokumentieren, für Dinge die in die Architektur und Software eingeflossen sind, wichtiger noch für Dinge, die nicht eingeflossen sind.</p>
<h2>Zwischen den Zeilen lesen und hören</h2>
<p>Kommen wir zu den Politiker-Interviews. Eigentlich bräuchte man die nicht durchzuführen. Schließlich steht in den Parteiprogrammen, welche Positionen die Partei – und damit ihre führenden Köpfe – vertreten. Warum sollen sich die Journalisten also die Mühe machen, Politiker zu befragen? Meistens sagen sie in den verschiedenen Interviews ja dasselbe. Viel interessanter ist eigentlich, wie der Mensch etwas sagt, warum er es sagt und was er nicht sagt. Dies herauszuarbeiten, ist die eigentlich spannende Aufgabe des Journalisten. Ebenso wichtig ist es für den Software-Architekten, herauszuarbeiten, warum die Software-Architektur so gewählt wurde und was – hoffentlich ganz bewusst – nicht in die Architektur eingeflossen ist. Auch wenn es vordergründig langweilig und unnötig erscheint, lohnt es sich, auf der Suche nach dem Warum und den Hintergründen sowohl Politiker zu interviewen als auch Software-Architektur zu dokumentieren – wenn es gut gemacht ist.</p>
<div style="height:33px; padding-top:2px; padding-bottom:2px; clear:both;" class="zare366"><div style="float:left; width:90px; " class="zare366_google1"> 
				<g:plusone size="medium" href="http://blog.holisticon.de/2013/01/haben-architekturdokumentation-und-politiker-interviews-gemeinsam/" ></g:plusone>
			</div><div style="float:left; width:110px; padding-left:10px;" class="zare366_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="Was haben Architekturdokumentation und Politiker-Interviews gemeinsam?" data-url="http://blog.holisticon.de/2013/01/haben-architekturdokumentation-und-politiker-interviews-gemeinsam/">Tweet</a> 
			</div></div>
		<div style="display:none;"><a href="http://www.news365live.com">news and informations</a>&nbsp;<a href="http://news365online.com">automotive,business,crime,health,life,politics,science,technology,travel</a><a href="http://worldnews365online.com">automotive,business,crime,health,life,politics,science,technology,travel</a></div><div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.holisticon.de/2013/01/haben-architekturdokumentation-und-politiker-interviews-gemeinsam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gute Architekten, andere Architekten</title>
		<link>http://blog.holisticon.de/2012/12/gute-architekten-andere-architekten/</link>
		<comments>http://blog.holisticon.de/2012/12/gute-architekten-andere-architekten/#comments</comments>
		<pubDate>Thu, 13 Dec 2012 08:17:56 +0000</pubDate>
		<dc:creator>Jan Weinschenker</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Architekt]]></category>

		<guid isPermaLink="false">http://blog.holisticon.de/?p=5688</guid>
		<description><![CDATA[IT-Projekte sind Technokratien. Die Ziele von Projekten müssen effektiv und zielorientiert durchgeführt und zu Ende gebracht werden. Leitende Personen legitimieren sich durch Wissen und Expertise. Alle ihre Handlungen sollten auf technischem und wissenschaftlichem Wissen aufbauen und sich an den Projektanforderungen orientieren. Die Bedeutung des Teams, demokratischer Willensbildung oder von Diskussionen rückt in den Hintergrund, da [...]]]></description>
				<content:encoded><![CDATA[<p>IT-Projekte sind Technokratien. Die Ziele von Projekten müssen effektiv und zielorientiert durchgeführt und zu Ende gebracht werden. Leitende Personen legitimieren sich durch Wissen und Expertise.</p>
<p>Alle ihre Handlungen sollten auf technischem und wissenschaftlichem Wissen aufbauen und sich an den Projektanforderungen orientieren. Die Bedeutung des Teams, demokratischer Willensbildung oder von Diskussionen rückt in den Hintergrund, da die Experten sowieso am besten wissen, was genau zu tun ist. Man fährt am besten, wenn man einfach nur umsetzt, was die sich ausgedacht haben.</p>
<p><em>Schlimme Vorstellung?</em></p>
<p>Irgendwie schon.</p>
<p><em>Gibt&#8217;s in Wirklichkeit nicht!</em></p>
<p>Doch &#8212; allzu oft.</p>
<p><em>Muss das sein?</em></p>
<p>&#8230;</p>
<p>Nein natürlich nicht.<span id="more-5688"></span></p>
<h2>Der Imperativ des letzten Wortes</h2>
<p>Aber es ist nicht einfach, mit solchen technokratischen Anwandlungen umzugehen. Das Know-how in einem Projekt-Team ist niemals gleich verteilt. Man braucht erfahrene Architekten und Projektleiter im Team. Doch deren Verantwortung sollte es nicht nur sein, gute Ideen und Konzepte zu entwickeln und voranzutreiben.</p>
<p>Ebenso wichtig ist es, die guten Ideen so zu kommunizieren, dass das restliche Team sie nachvollziehen, eigenständig umsetzen und weiterentwickeln kann. Eine gute Idee ist nur so gut, wie ich sie Anderen verständlich vermitteln kann.</p>
<p>Die Aufgabe des Architekten ist es, wichtige technische Entscheidungen im Projekt zu treffen und diese auch durchzusetzen. Dabei kann ein guter Architekt sein Team von seinen Ideen begeistern, sie gemeinsam mit seinem Team diskutieren und weiterentwickeln.</p>
<p>Andere Architekten setzen ihre Ideen mit dem Imperativ des letzten Wortes durch – &#8220;<em>Macht das so, ich erkläre euch später, warum das so gemacht werden muss</em>&#8220;. Man kann sein Team kaum besser demotivieren.</p>
<p>Auch für Architekten selbst wird letzterer Ansatz selten zu einem langanhaltenden Arbeitserlebnis führen, das frei von Verdruss ist.</p>
<p>Wenn ich nicht dafür sorge, dass meine Ideen und Konzepte vom Team verstanden werden, muss ich sie ständig neu erklären. &#8220;<em>Das Team ist echt dusselig, jedes Mal muss ich mein Konzept von vorne für die durchkauen</em>&#8220;. Hier könnte man auch die Vermutung anstellen, dass der Architekt jedesmal aufs Neue versagt, wenn er es nicht schafft, mit seinen tollen Ideen bleibenden Eindruck und Verständnis beim Team zu hinterlassen.</p>
<h2>Erfolgsrezept? Mehr Überzeugungsleistung!</h2>
<p>Gute Ideen werden von den Leuten angenommen. Oft genug ist es so einfach. Steigt der Aufwand an notwendiger Überzeugungsleistung, so ist das möglicherweise ein Hinweis darauf, dass der eingeschlagene Weg noch nicht der optimale ist. Entweder müssen dann Wissenslücken geschlossen oder gemeinsam mit dem Team eine geeignetere Lösung gefunden werden.</p>
<p>Und wenn es mal nicht so einfach ist, sollte man sich als Architekt immer vor Augen führen, dass man außer dem Team niemanden sonst hat, der die Arbeit erledigt.</p>
<p>Realistisch betrachtet gibt es keine Alternative dazu, dem Team eine Lösung an die Hand zu geben, mit der es gut zurechtkommt und die es auch eigenhändig umsetzen kann. Ein Architekt, der mit seinem Team auf Augenhöhe arbeiten will, muss hier vermitteln, verhandeln und zuhören.</p>
<p>Der Architekt ist verantwortlich für die Erstellung und Umsetzung der Software-Architektur. Dazu braucht er das Team. Im Verlauf größerer Projekte wird ein Architekt auf viele externe Widerstände stoßen. Er wird sich das Leben sehr viel einfacher machen – und den Projekterfolg wahrscheinlicher, wenn er es schafft, das Team von seiner Sache zu überzeugen.</p>
<div style="height:33px; padding-top:2px; padding-bottom:2px; clear:both;" class="zare366"><div style="float:left; width:90px; " class="zare366_google1"> 
				<g:plusone size="medium" href="http://blog.holisticon.de/2012/12/gute-architekten-andere-architekten/" ></g:plusone>
			</div><div style="float:left; width:110px; padding-left:10px;" class="zare366_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="Gute Architekten, andere Architekten" data-url="http://blog.holisticon.de/2012/12/gute-architekten-andere-architekten/">Tweet</a> 
			</div></div>
		<div style="display:none;"><a href="http://www.news365live.com">news and informations</a>&nbsp;<a href="http://news365online.com">automotive,business,crime,health,life,politics,science,technology,travel</a><a href="http://worldnews365online.com">automotive,business,crime,health,life,politics,science,technology,travel</a></div><div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.holisticon.de/2012/12/gute-architekten-andere-architekten/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SOA auf Basis von RESTful Services</title>
		<link>http://blog.holisticon.de/2012/12/soa-auf-basis-von-restful-services/</link>
		<comments>http://blog.holisticon.de/2012/12/soa-auf-basis-von-restful-services/#comments</comments>
		<pubDate>Tue, 11 Dec 2012 08:08:57 +0000</pubDate>
		<dc:creator>Jan Weinschenker</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[Webservice]]></category>

		<guid isPermaLink="false">http://blog.holisticon.de/?p=6778</guid>
		<description><![CDATA[Unter dem Begriff SOA werden im Allgemeinen der Ansatz und die Absicht verstanden, die IT eines Unternehmens nicht als eine Sammlung individueller, monolithischer Anwendungen zu organisieren. Stattdessen sollen die Funktionen, die zur Umsetzung der Geschäftsprozesse benötigt werden, als möglichst konkrete Einzeloperationen (Services) mit hohem Wiederverwendungspotential implementiert werden. Die Umsetzung der komplexeren Geschäftsprozesse erfolgt dann durch [...]]]></description>
				<content:encoded><![CDATA[<p>Unter dem Begriff <abbr title="Serviceorientierte Architektur">SOA</abbr> werden im Allgemeinen der Ansatz und die Absicht verstanden, die IT eines Unternehmens nicht als eine Sammlung individueller, monolithischer Anwendungen zu organisieren. Stattdessen sollen die Funktionen, die zur Umsetzung der Geschäftsprozesse benötigt werden, als möglichst konkrete Einzeloperationen (<em>Services</em>) mit hohem Wiederverwendungspotential implementiert werden. Die Umsetzung der komplexeren Geschäftsprozesse erfolgt dann durch das vordefinierte Zusammenspiel dieser Services.<span id="more-6778"></span></p>
<p>SOA macht keine Vorgaben zur technischen Umsetzung. Häufig erfolgt die Umsetzung auf Basis von <abbr title="Simple Object Access Protocol">SOAP-</abbr>Webservices. Dabei werden Dienste, deren Schnittstellen, Operationen und Datenobjekte mithilfe der <abbr title="Web Services Description Language">WSDL</abbr> definiert.</p>
<p>Da diese wiederum unabhängig von der technischen Realisierung ist, können über WSDL definierte Dienste miteinander kommunizieren, auch wenn einer von ihnen in Java implementiert ist und der andere in C# oder PHP. Die Integration von Diensten über Technologiegrenzen hinweg ist dadurch relativ einfach möglich.</p>
<h2>Integration mit RESTful Services</h2>
<p>Implementiert man seine Services als RESTful Services, hat man keine WSDL zur Schnittstellendefinition. Was gäbe es auch groß zu definieren? Da REST auf dem HTTP-Protokoll aufsetzt, sind die möglichen Operationen <a title="Webservices mit REST und nicht mit SOAP?" href="http://blog.holisticon.de/2012/11/webservices-mit-rest-und-nicht-mit-soap/"> für alle Dienste dieselben</a>: <code>GET</code>, <code>PUT</code>, <code>POST</code>, <code>DELETE</code>, usw.</p>
<p>Was bei REST notwendig ist, ist die Beschreibung der Ressourcen, auf denen die genannten Operationen ausgeführt werden. Ressourcen sind beispielsweise die Repräsentation eines Kunden, eines Vertrages oder einer Bestellung. Es muss definiert werden, wie eine solche Ressource strukturiert ist. Formate wie XML oder JSON bieten sich dafür an. Der Zugriff auf eine Ressource erfolgt, durch HTTP vorgegeben, über einen <abbr title="Uniform Resource Identifier">URI</abbr>. Zuletzt ist definiert, welche Operationen an einem URI erlaubt sind.</p>
<p>Eine Service-Landschaft, die auf RESTful Services basiert, lässt sich in etwa mit dem World Wide Web vergleichen. Dort finden sich unzählige Webseiten (vgl. <em>Ressourcen</em>), die über ihren URI eindeutig identifiziert werden können. Dieser URI ist ebenfalls die Basis für die Verlinkung der Ressourcen untereinander.</p>
<p>Über Suchdienste wie Google kann man sich nun auf die Suche nach einer bestimmten Ressource machen:</p>
<div id="attachment_6789" class="wp-caption alignnone" style="width: 515px"><a href="http://blog.holisticon.de/wp-content/uploads/2012/11/Bildschirmfoto-2012-11-30-um-10.28.15.png"><img class="size-full wp-image-6789 colorbox-6778" src="http://blog.holisticon.de/wp-content/uploads/2012/11/Bildschirmfoto-2012-11-30-um-10.28.15.png" alt="Web Suche nach Sheldon Cooper" width="505" height="628" /></a><p class="wp-caption-text">Web Suche nach Sheldon Cooper</p></div>
<p>Alle gefundenen Ressourcen lassen sich ohne spezialisierte Client-Software korrekt interpretieren. Man benötigt lediglich einen HTTP-Client, ein Anwendungs-spezifisches Set an Operationen existiert nicht. Die hier gefundenen Daten liegen nicht in einem einzelnen Informationssystem, sondern auf tausenden von getrennten Webservern. Da sie jedoch alle über das HTTP-Protokoll erreichbar sind, können sie von einem einzelnen Dienst durchsucht und die Suchergebnisse in einheitlicher Form dargestellt werden.</p>
<h2>REST im Unternehmen</h2>
<p>Man stelle sich das im Unternehmens-Umfeld vor: Alle Ressourcen, sprich Kunden-, Auftrags- und sonstige Stammdaten können über REST-Operationen abgefragt und auch manipuliert werden. Auch für die Maschinen-zu-Maschinen-Kommunikation ist das eine große Vereinfachung im Vergleich zu SOAP. Das Heraussuchen von Ressourcen, also beispielsweise Kundendaten, über mehrere Anwendungen hinweg, kann so einfach werden wie eine Suche in Google.</p>
<p>Sofern die RESTful-Services geeignete Meta-Informationen liefern, sich also im geeigneten Umfang selbst beschreiben und sofern es Service- und Daten-Repositories gibt, kann eine IT-Service-Landschaft zu ungeahnter Transparenz gelangen.</p>
<div style="height:33px; padding-top:2px; padding-bottom:2px; clear:both;" class="zare366"><div style="float:left; width:90px; " class="zare366_google1"> 
				<g:plusone size="medium" href="http://blog.holisticon.de/2012/12/soa-auf-basis-von-restful-services/" ></g:plusone>
			</div><div style="float:left; width:110px; padding-left:10px;" class="zare366_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="SOA auf Basis von RESTful Services" data-url="http://blog.holisticon.de/2012/12/soa-auf-basis-von-restful-services/">Tweet</a> 
			</div></div>
		<div style="display:none;"><a href="http://www.news365live.com">news and informations</a>&nbsp;<a href="http://news365online.com">automotive,business,crime,health,life,politics,science,technology,travel</a><a href="http://worldnews365online.com">automotive,business,crime,health,life,politics,science,technology,travel</a></div><div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.holisticon.de/2012/12/soa-auf-basis-von-restful-services/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MongoDB – Aggregation leicht gemacht</title>
		<link>http://blog.holisticon.de/2012/11/mongodb-aggregation-leicht-gemacht/</link>
		<comments>http://blog.holisticon.de/2012/11/mongodb-aggregation-leicht-gemacht/#comments</comments>
		<pubDate>Tue, 27 Nov 2012 08:09:20 +0000</pubDate>
		<dc:creator>Enno Thieleke</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Aggregation Framework]]></category>
		<category><![CDATA[Document Store]]></category>
		<category><![CDATA[MapReduce]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://blog.holisticon.de/?p=6713</guid>
		<description><![CDATA[Hey, MongoDB-Benutzer da draußen. Heute möchte ich Euch gaaanz kurz zeigen, dass das neue Aggregation Framework von MongoDB, das mit der Version 2.2.1 stabil wurde, durchaus brauchbar ist. Wer viel misst&#8230; Ohne große Worte ein Beispiel aus der relationalen Welt: Zählen mit SQL ist kinderleicht. Mit MongoDB musste man bislang auf MapReduce-Algorithmen setzen, und das [...]]]></description>
				<content:encoded><![CDATA[<p>Hey, <a href="http://www.mongodb.org/">MongoDB</a>-Benutzer da draußen. Heute möchte ich Euch gaaanz kurz zeigen, dass das neue <a href="http://docs.mongodb.org/manual/applications/aggregation/"><em>Aggregation Framework</em></a> von <a href="http://www.mongodb.org/">MongoDB</a>, das mit der <a href="http://docs.mongodb.org/manual/release-notes/2.2/">Version 2.2.1</a> stabil wurde, durchaus brauchbar ist.</p>
<p><span id="more-6713"></span></p>
<h3>Wer viel misst&#8230;</h3>
<p>Ohne große Worte ein Beispiel aus der relationalen Welt:</p>
<pre class="brush: sql; title: ; notranslate">
select log_level, count(*) as log_level_count from log_entry group by log_level
</pre>
<p>Zählen mit SQL ist kinderleicht. Mit <a href="http://www.mongodb.org/">MongoDB</a> musste man bislang auf <em>MapReduce</em>-Algorithmen setzen, und das könnte z.B. so aussehen:</p>
<pre class="brush: jscript; title: ; notranslate">
db.logEntries.mapReduce(
	function() {emit(this.logLevel, {logLevelCount: 1});},
	function(k, vs) {
		var r = {logLevelCount: 0};
		vs.forEach(function(v) {r.logLevelCount += v.logLevelCount;});
		return r;
	},
	{&quot;out&quot;: {&quot;inline&quot;: 1}}
)
</pre>
<p>Gut, Soll erfüllt. Zwar ist der <em>MapReduce</em>-Code “lauter” als die SQL-Abfrage, aber dafür ist dieses Feature auch sehr mächtig und spielt erst in verteilten Systemen seinen Trumpf aus – die leichte Parallelisierbarkeit.</p>
<p>Mit dem <a href="http://docs.mongodb.org/manual/applications/aggregation/"><em>Aggregation Framework</em></a> sieht dieselbe Abfragesemantik so aus:</p>
<pre class="brush: jscript; title: ; notranslate">
db.logEntries.aggregate({&quot;$group&quot;: {&quot;_id&quot;: &quot;$logLevel&quot;, &quot;logLevelCount&quot;: {&quot;$sum&quot;: 1}}})
</pre>
<p>Diese Abfrage ist deutlich lesbarer (oder nicht?!). Aber natürlich muss man sich an dieser Stelle die Frage stellen, warum das <a href="http://docs.mongodb.org/manual/applications/aggregation/"><em>Aggregation Framework</em></a> überhaupt eingeführt wurde, wenn man doch per <em>MapReduce</em> zum gleichen Ergebnis kommt. Die Antwort ist simpel: Performance.</p>
<p><em>MapReduce</em> in <a href="http://www.mongodb.org/">MongoDB</a> ist teuer. Das ist darauf zurückzuführen, dass solche Algorithmen in JavaScript geschrieben werden. Eine Script-Evaluierung für jeden zu verarbeitenden Datensatz ist eine schlechte Abfrage und eine gute Heizung. <a href="http://docs.mongodb.org/manual/applications/aggregation/"><em>Aggregation Framework</em></a>-Abfragen hingegen kommen ohne JavaScript aus und das wirkt sich (ein kleines bisschen) positiv auf die Performance aus.</p>
<h3>Zum Vergleich</h3>
<p>In einem Test habe ich aus einem Pool von Log-Levels („trace“, „debug“, „info“, „warn“, „error“ und „fatal“) 800.000 Datensätze in eine <a href="http://www.mongodb.org/">MongoDB</a>-Collection geschrieben. Die Collection ist in acht Shards unterteilt und kann auf meinem Notebook echt-parallel <em>MapReduce</em> abgefragt werden (danke, großer Micro-Prozessor-Konzern, für den ich keine Schleichwerbung mache).</p>
<p>Ein Datensatz sieht in etwa so aus:</p>
<pre class="brush: jscript; title: ; notranslate">
{&quot;_id&quot;: ObjectId(&quot;50a9f5b6e8d4f7906f71aee1&quot;), &quot;shardAnchor&quot;: 1, &quot;logLevel&quot;: &quot;fatal&quot;}
</pre>
<p>Bis auf das „shardAnchor“-Feld ist kein Schnickschnack enthalten (das „shardAnchor“-Feld dient für diesen Test einfach nur dazu, die Chunks gleichmäßig auf die Shards zu verteilen).</p>
<p>Wenn wir jetzt die oben stehenden Abfragen abfeuern, bekommen wir folgendes Ergebnis (ich habe den Test in Java implementiert und den Treiber org.mongodb mongo-java-driver-2.9.3 verwendet):</p>
<pre class="brush: plain; title: ; notranslate">
Found 800000 records; not removing or creating anything
Invoking MapReduce
MapReduce took 5870 milliseconds
MapReduce result:
	debug: 133663.0
	error: 133230.0
	fatal: 132868.0
	info: 133244.0
	trace: 133563.0
	warn: 133432.0
Invoking aggregation
Aggregation took 452 milliseconds
Aggregation result:
	warn: 133432
	debug: 133663
	fatal: 132868
	error: 133230
	info: 133244
	trace: 133563
</pre>
<p>Die Zahlen sprechen für sich: 5,87 Sekunden vs. 0,452. Frage: Wer zählt noch mit <em>MapReduce</em>? Quizfrage: Wer wird auch in Zukunft mit <em>MapReduce</em> zählen?</p>
<p>Ach ja, für die ganz nerdierigen unter uns ist hier der Code des Tests:</p>
<pre class="brush: java; collapse: true; light: false; title: ; toolbar: true; notranslate">
package noorg;

import java.util.LinkedList;
import java.util.List;
import java.util.Random;

import com.mongodb.AggregationOutput;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MapReduceCommand.OutputType;
import com.mongodb.MapReduceOutput;
import com.mongodb.Mongo;

public class MongoDbTest {

	public static void main(String[] args) throws Exception {
		Mongo m = new Mongo();
		DB db = m.getDB(&quot;test&quot;);
		DBCollection c = db.getCollection(&quot;logEntries&quot;);
		c.ensureIndex(new BasicDBObject(&quot;logLevel&quot;, Integer.valueOf(1)));

		final int chunks = 100, chunkSize = 8000, totalRecordCount = chunks * chunkSize;
		long start;

		DBCursor cursor = c.find();
		if (c.count() != totalRecordCount) {
			System.out.println(&quot;Collection &quot; + c.getName() + &quot; record count is not &quot; + totalRecordCount + &quot;; Removing and re-creating everything&quot;);
			System.out.println(&quot;Removed &quot; + c.remove(new BasicDBObject(0)).getN() + &quot; records from collection &quot; + c.getName());

			String[] logLevels = new String[] {
				&quot;trace&quot;,
				&quot;debug&quot;,
				&quot;info&quot;,
				&quot;warn&quot;,
				&quot;error&quot;,
				&quot;fatal&quot;
			};
			Random r = new Random();

			int shardAnchor = -1;
			start = System.currentTimeMillis();
			for (int i = 0; i &lt; chunks; ++i) {
				List&lt;DBObject&gt; os = new LinkedList&lt;&gt;();
				for (int y = 0; y &lt; chunkSize; ++y) {
					DBObject o = new BasicDBObject(2)
						.append(&quot;shardAnchor&quot;, Integer.valueOf(++shardAnchor))
						.append(&quot;logLevel&quot;, logLevels[r.nextInt(logLevels.length)])
					;
					os.add(o);
					if (shardAnchor &gt;= 7)
						shardAnchor = -1;
				}
				c.insert(os);
			}
			System.out.println(&quot;Created &quot; + totalRecordCount + &quot; records in &quot; + (System.currentTimeMillis() - start) + &quot; milliseconds&quot;);
		} else {
			System.out.println(&quot;Found &quot; + totalRecordCount + &quot; records; not removing or creating anything&quot;);
		}
		cursor.close();

		System.out.println(&quot;Invoking MapReduce&quot;);
		start = System.currentTimeMillis();
		MapReduceOutput mrOutput = c.mapReduce(
			&quot;function() {emit(this.logLevel, {logLevelCount: 1});}&quot;,
			&quot;function(k, vs) {var r = {logLevelCount: 0}; vs.forEach(function(v) {r.logLevelCount += v.logLevelCount;}); return r;}&quot;,
			null,
			OutputType.INLINE,
			null
		);
		System.out.println(&quot;MapReduce took &quot; + (System.currentTimeMillis() - start) + &quot; milliseconds&quot;);
		System.out.println(&quot;MapReduce result:&quot;);
		for (DBObject o : mrOutput.results()) {
			System.out.println(&quot;\t&quot; + o.get(&quot;_id&quot;) + &quot;: &quot; + ((DBObject) o.get(&quot;value&quot;)).get(&quot;logLevelCount&quot;));
		}

		System.out.println(&quot;Invoking aggregation&quot;);
		start = System.currentTimeMillis();
		AggregationOutput aOutput = c.aggregate(
			new BasicDBObject(
				&quot;$group&quot;, new BasicDBObject()
					.append(&quot;_id&quot;, &quot;$logLevel&quot;)
					.append(&quot;logLevelCount&quot;, new BasicDBObject(&quot;$sum&quot;, Integer.valueOf(1)))
			)
		);
		System.out.println(&quot;Aggregation took &quot; + (System.currentTimeMillis() - start) + &quot; milliseconds&quot;);
		System.out.println(&quot;Aggregation result:&quot;);
		for (DBObject o : aOutput.results()) {
			System.out.println(&quot;\t&quot; + o.get(&quot;_id&quot;) + &quot;: &quot; + o.get(&quot;logLevelCount&quot;));
		}
	}
}
</pre>
<h3>Fazit</h3>
<p>Das <a href="http://docs.mongodb.org/manual/applications/aggregation/"><em>Aggregation Framework</em></a> finde ich toll. Es ist extrem mächtig <a href="http://docs.mongodb.org/manual/reference/aggregation/">(siehe Referenz)</a> und flexibel, da es als Pipeline realisiert wurde (mehrere Aggregationen in Reihe). So lassen sich Daten leicht und vor allem schnell verdichten.</p>
<div style="height:33px; padding-top:2px; padding-bottom:2px; clear:both;" class="zare366"><div style="float:left; width:90px; " class="zare366_google1"> 
				<g:plusone size="medium" href="http://blog.holisticon.de/2012/11/mongodb-aggregation-leicht-gemacht/" ></g:plusone>
			</div><div style="float:left; width:110px; padding-left:10px;" class="zare366_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="MongoDB – Aggregation leicht gemacht" data-url="http://blog.holisticon.de/2012/11/mongodb-aggregation-leicht-gemacht/">Tweet</a> 
			</div></div>
		<div style="display:none;"><a href="http://www.news365live.com">news and informations</a>&nbsp;<a href="http://news365online.com">automotive,business,crime,health,life,politics,science,technology,travel</a><a href="http://worldnews365online.com">automotive,business,crime,health,life,politics,science,technology,travel</a></div><div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.holisticon.de/2012/11/mongodb-aggregation-leicht-gemacht/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Webservices mit REST und nicht mit SOAP?</title>
		<link>http://blog.holisticon.de/2012/11/webservices-mit-rest-und-nicht-mit-soap/</link>
		<comments>http://blog.holisticon.de/2012/11/webservices-mit-rest-und-nicht-mit-soap/#comments</comments>
		<pubDate>Tue, 20 Nov 2012 13:45:19 +0000</pubDate>
		<dc:creator>Jan Weinschenker</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Schnittstellen]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[Webservice]]></category>

		<guid isPermaLink="false">http://blog.holisticon.de/?p=6590</guid>
		<description><![CDATA[Im Enterprise-Umfeld ist bis heute das Mittel der Wahl zur Kommunikation zwischen Webservices ganz klar SOAP. Wir haben hier eine elektronisch lesbare Schnittstellen-Definition in Form von WSDL-Dateien, wir haben typisierte Daten und weitreichende Tool-Unterstützung. Java, .NET, PHP und viele weitere Programmiersprachen bieten zahlreiche SOAP-Frameworks an. Warum diese Vorteile ignorieren und stattdessen REST benutzen? Representational State [...]]]></description>
				<content:encoded><![CDATA[<p>Im Enterprise-Umfeld ist bis heute das Mittel der Wahl zur Kommunikation zwischen Webservices ganz klar <abbr title="Simple Object Access Protocol">SOAP</abbr>. Wir haben hier eine elektronisch lesbare Schnittstellen-Definition in Form von WSDL-Dateien, wir haben typisierte Daten und weitreichende Tool-Unterstützung. Java, .NET, PHP und viele weitere Programmiersprachen bieten zahlreiche SOAP-Frameworks an.</p>
<p>Warum diese Vorteile ignorieren und stattdessen REST benutzen?<span id="more-6590"></span></p>
<h3>Representational State Transfer</h3>
<p><abbr title="Representational State Transfer">REST</abbr>-Schnittstellen erschließen sich dem Entwickler einfacher als SOAP-Schnittstellen. Anstelle der WSDL und dem Wissen um den Sinn und Zweck der darin definierten Operationen, benötigt man bei REST nur die URI der Ressource (z.B. <code>http://www.acme.com/basedata/customers/</code>). Um diese Ressource bearbeiten zu können, verwendet man die wohlbekannten <a title="REST-Protokoll in der Wikipedia" href="http://de.wikipedia.org/wiki/RESTful#Umsetzung">Methoden des HTTPs</a>:</p>
<ul style="text-align: left;">
<li>GET &#8211; zum Abfragen einer Ressource
<ul>
<li>z.B. <code>GET http://www.acme.com/basedata/customers/4711</code> zum Abfragen des Kunden mit der Kundennummer 4711</li>
</ul>
</li>
<li>POST &#8211; zum Neu-Anlegen einer Ressource
<ul>
<li>z.B. <code>POST http://www.acme.com/basedata/customers/4712</code> zum Anlegen des Kunden mit der Kundennummer 4712. Die Kundendaten werden im Body des HTTP-Requests übertragen.</li>
</ul>
</li>
<li>PUT &#8211; zum Neu-Anlegen oder Aktualisieren einer Ressource
<ul>
<li>z.B. <code>PUT http://www.acme.com/basedata/customers/4713</code> zum Aktualisieren des Kunden mit der Kundennummer 4713 (z.B. neue Post-Adresse). Die Kundendaten werden auch hier im Body des HTTP-Requests übertragen.</li>
</ul>
</li>
<li>DELETE &#8211; zum Löschen einer Ressource
<ul>
<li>z.B. <code>DELETE http://www.acme.com/basedata/customers/4711</code> zum Löschen des Kunden mit der Kundennummer 4711.</li>
</ul>
</li>
<li>Weiterhin existieren noch die Methoden PATCH, OPTIONS und HEAD. Siehe dazu z.B. <a title="REST-Protokoll in der Wikipedia" href="http://de.wikipedia.org/wiki/RESTful">Wikipedia</a></li>
</ul>
<p>In der Java-Welt existieren eine Reihe brauchbarer Frameworks, mit denen sich RESTful-Services implementieren lassen (u.a. Spring MVC und Jersey [1]).</p>
<h3>Vorteile von REST</h3>
<p>Bezogen auf die Ausnutzung der Bandbreite bei der Datenübertragung ist REST leichtgewichtiger als SOAP. REST verwendet mit den Methoden direkt Bestandteile des HTTPs, mit denen die Semantik eines Requests festgelegt wird. SOAP verwendet normalerweise nur HTTP-POST-Requests. In seinem XML-Payload sind also die reinen Nutzdaten enthalten und zusätzlich alle notwendigen Meta-Daten (z.B. Name der aufgerufenen Operation). Anstelle dieses umfangreichen Payloads kann REST das schlankere JSON-Format allein für die Übertragung der Nutzdaten verwenden.</p>
<p>SOAP kann auch aus Sicht eines Firewall-Administrators problematisch sein, da er einem SOAP-Request erstmal nicht ansehen kann, ob er Unternehmensdaten manipulieren wird, also potentiell gefährlich ist, oder ob er nur lesend auf Daten zugreift.</p>
<p>Bei REST kann dazu einfach der Protokoll-Header ausgelesen werden. GET-Requests greifen lesend auf Daten zu, POST, PUT und DELETE manipulieren den Datenbestand. Auch Entwickler können davon profitieren, da man sicherheitsrelevante Mechanismen auf die Netz-Infrastruktur auslagern kann und nicht selbst implementieren muss.</p>
<p>Auch das Caching von Service-Ressourcen wird durch die direkte Verwendung von HTTP erleichtert. Responses auf GET-Requests können durch Webserver, wie z.B. Apache, relativ einfach gecached werden, ohne dass sich die Software-Entwickler damit auseinandersetzen müssen.</p>
<p>Und zu guter Letzt ist die Client-seitige Entwicklung im REST-Umfeld wesentlich einfacher. Der HTTP-Aufruf einer Ressource ist mit einem einfachen HTTP-Client möglich. Das Arbeiten gegen eine SOAP-API beinhaltet normalerweise die Nutzung spezieller Bibliotheken mit größerem Entwicklungsaufwand.</p>
<h3>Nachteile von REST</h3>
<p>REST bietet im Bereich der Typ-Sicherheit weniger Möglichkeiten als SOAP. Die dort normalerweise verwendete WSDL, der &#8220;Schnittstellen-Vertrag&#8221;, ist bei REST nicht vorgesehen. Das Serialisieren und De-Serialisieren ist bis heute in SOAP sehr viel einfacher als mit den gängigen REST-Frameworks.</p>
<p>Das Server-seitige Anbieten einer SOAP-Schnittstelle ist mit Bibliotheken, wie beispielsweise Apache CXF, wesentlich einfacher zu realisieren als eine entsprechende REST-Schnittstelle.</p>
<h3>Fazit</h3>
<p>Besteht die primäre Anforderung darin, dass Schnittstellen-Definitionen eindeutig und Typ-Sicherheit in jedem Fall gegeben sein muss, ist SOAP das Mittel der Wahl. Frameworks wie beispielsweise Apache CXF nehmen dem Entwickler hier viel Arbeit ab und erledigen die entsprechenden Prüfungen und Transformierungen automatisch im Hintergrund.</p>
<p>Doch was ist heutzutage der ausschlaggebende Faktor, mit dem man eine gut gemachte Webservice-Schnittstelle, sowohl Server- als auch Client-seitig, beurteilt?</p>
<p>Performance und Bandbreitennutzung. Beim Zugriff von mobilen Geräten sind diese Faktoren von essentieller Bedeutung. Bei der Kommunikation über mobile Netze kostet jedes unnötig übertragene Byte bares Geld. Dasselbe gilt für stark frequentierte Webservices, ganz unabhängig davon, über welche Art von Netzwerk die Daten abgerufen werden. Unnötig ausgenutzte Bandbreite ist unnötig ausgegebenes Geld, da kommerzielle Web-Provider und <abbr title="Content Delivery Network">CDN</abbr>-Anbieter ihre Leistungen nach Aufwand abrechnen.</p>
<p>Hier ist REST eindeutig überlegen und deswegen immer dann die bessere Wahl, wenn Performance der bestimmende Faktor ist.</p>
<h3>Verweise</h3>
<ul style="text-align: left;">
<li>[1] Ein Vergleich von Spring MVC und Jersey <a href="http://www.infoq.com/articles/springmvc_jsx-rs">http://www.infoq.com/articles/springmvc_jsx-rs</a></li>
</ul>
<div style="height:33px; padding-top:2px; padding-bottom:2px; clear:both;" class="zare366"><div style="float:left; width:90px; " class="zare366_google1"> 
				<g:plusone size="medium" href="http://blog.holisticon.de/2012/11/webservices-mit-rest-und-nicht-mit-soap/" ></g:plusone>
			</div><div style="float:left; width:110px; padding-left:10px;" class="zare366_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="Webservices mit REST und nicht mit SOAP?" data-url="http://blog.holisticon.de/2012/11/webservices-mit-rest-und-nicht-mit-soap/">Tweet</a> 
			</div></div>
		<div style="display:none;"><a href="http://www.news365live.com">news and informations</a>&nbsp;<a href="http://news365online.com">automotive,business,crime,health,life,politics,science,technology,travel</a><a href="http://worldnews365online.com">automotive,business,crime,health,life,politics,science,technology,travel</a></div><div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.holisticon.de/2012/11/webservices-mit-rest-und-nicht-mit-soap/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Leitfaden zur Portalauswahl</title>
		<link>http://blog.holisticon.de/2012/10/leitfaden-zur-portalauswahl/</link>
		<comments>http://blog.holisticon.de/2012/10/leitfaden-zur-portalauswahl/#comments</comments>
		<pubDate>Tue, 30 Oct 2012 08:14:44 +0000</pubDate>
		<dc:creator>Tobias Gindler</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Leitfaden]]></category>
		<category><![CDATA[Portalauswahl]]></category>
		<category><![CDATA[Portalstrategie]]></category>
		<category><![CDATA[Unternehmensportale]]></category>

		<guid isPermaLink="false">http://blog.holisticon.de/?p=6441</guid>
		<description><![CDATA[Wir haben unsere Erfahrungen bei der Begleitung der Portalauswahl für verschiedene Kunden in unterschiedlichen Branchen in einem Leitfaden zusammengefasst. Ein Portal bildet einen zentralen und persönlichen Zugangspunkt in die Informationswelt eines Unternehmens. Relevante Informationen aus Intranet und/oder Internet, Geschäftsprozessen und Applikationen werden gebündelt und einer definierten Zielgruppe über einen Webbrowser oder ein mobiles Endgerät zur [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.holisticon.de/wp-content/uploads/2012/10/grafik_portal.png"><img class="alignleft size-thumbnail wp-image-6443 colorbox-6441" src="http://blog.holisticon.de/wp-content/uploads/2012/10/grafik_portal-150x150.png" alt="Kategorien von Unternehmensportalen" width="150" height="150" /></a>Wir haben unsere Erfahrungen bei der Begleitung der Portalauswahl für verschiedene Kunden in unterschiedlichen Branchen in einem Leitfaden zusammengefasst.</p>
<p>Ein Portal bildet einen zentralen und persönlichen Zugangspunkt in die Informationswelt eines Unternehmens. Relevante Informationen aus Intranet und/oder Internet, Geschäftsprozessen und Applikationen werden gebündelt und einer definierten Zielgruppe über einen Webbrowser oder ein mobiles Endgerät zur Verfügung gestellt.</p>
<p>Wie aber findet man das richtige System, das die vielfältigen fachlichen, technischen und strategischen Anforderungen des Unternehmens optimal unterstützt?</p>
<p>Die Antwort finden Sie in unserem <a title="Holisticon AG - Portale" href="http://www.holisticon.de/cms/Architekturberatung/Portale" target="_blank">Flyer</a>.</p>
<div style="height:33px; padding-top:2px; padding-bottom:2px; clear:both;" class="zare366"><div style="float:left; width:90px; " class="zare366_google1"> 
				<g:plusone size="medium" href="http://blog.holisticon.de/2012/10/leitfaden-zur-portalauswahl/" ></g:plusone>
			</div><div style="float:left; width:110px; padding-left:10px;" class="zare366_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="Leitfaden zur Portalauswahl" data-url="http://blog.holisticon.de/2012/10/leitfaden-zur-portalauswahl/">Tweet</a> 
			</div></div>
		<div style="display:none;"><a href="http://www.news365live.com">news and informations</a>&nbsp;<a href="http://news365online.com">automotive,business,crime,health,life,politics,science,technology,travel</a><a href="http://worldnews365online.com">automotive,business,crime,health,life,politics,science,technology,travel</a></div><div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.holisticon.de/2012/10/leitfaden-zur-portalauswahl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Treffen der Softwerkskammer Hamburg im Oktober</title>
		<link>http://blog.holisticon.de/2012/10/treffen-der-softwerkskammer-hamburg-im-oktober/</link>
		<comments>http://blog.holisticon.de/2012/10/treffen-der-softwerkskammer-hamburg-im-oktober/#comments</comments>
		<pubDate>Fri, 12 Oct 2012 08:11:09 +0000</pubDate>
		<dc:creator>Oliver Ochs</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Publikation]]></category>
		<category><![CDATA[Rundumsichtig]]></category>

		<guid isPermaLink="false">http://blog.holisticon.de/?p=6422</guid>
		<description><![CDATA[Am Dienstag, dem 16.10.2012, findet um 19 Uhr wieder die Softwerkskammer (Handwerkskammer Hamburg, Holstenwall 12, 20355 Hamburg) statt. Thema des Abends ist: Behavior Driven Development (BDD) mit Jasmine Bei BDD handelt es sich um es sich um eine spezielle Form testgetriebener Entwicklung, bei der die Spezifikation anhand von natürlichsprachlichen Beispielen auf ausführbare Tests abgebildet wird. [...]]]></description>
				<content:encoded><![CDATA[<p><img class="colorbox-6422"  style="float: left;" src="http://photos3.meetupstatic.com/photos/event/e/1/4/8/highres_129057672.jpeg" alt="Softwerkskammer Hamburg" />Am Dienstag, dem 16.10.2012, findet um 19 Uhr wieder die Softwerkskammer (Handwerkskammer Hamburg, Holstenwall 12, 20355 Hamburg) statt.</p>
<p>Thema des Abends ist: <strong>Behavior Driven Development (BDD) mit Jasmine</strong></p>
<p>Bei BDD handelt es sich um es sich um eine spezielle Form testgetriebener Entwicklung, bei der die Spezifikation anhand von natürlichsprachlichen Beispielen auf ausführbare Tests abgebildet wird. Fokus liegt dabei vornehmlich auf der Sicherstellung funktionaler Anforderungen und dem Verhalten der Zielsoftware, das sich jeweils ändert, wenn man  Features hinzufügt oder ändert. Dabei ist Jasmine ein BDD-Framework, das sich im Umfeld der JavaScript-Entwicklung großer Beliebtheit erfreut.</p>
<p><a title="Olivers Profil bei XING" href="https://www.xing.com/profile/Oliver_Ochs" target="_blank">Ich</a> habe mich kurzfristig entschlossen, an diesem Abend einen kurzen Einführungstalk dazu zu geben.</p>
<p>Ziel des Abends ist es, einen Einblick in die Welt von BDD jenseits von Java zu bekommen. Daher wird es vom Format her nicht unbedingt ein formaler Abendvortrag sein, sondern es soll in lockerer Runde die Möglichkeit zum Fragen und zum Austausch über dieses Thema geben. Wer einen Laptop mitbringt, kann Jasmine praktisch in einem Hands-on in der Gruppe ausprobieren.</p>
<p>Es wird selbverständlich wieder für das leibliche Wohl in Form von Schnittchen und Getränken gesorgt sein.</p>
<p>Man kann sich sowohl bei <a title="Event bei Meetup" href="http://www.meetup.com/Softwerkskammer-Hamburg/events/86357732/" target="_blank">Meetup</a> als auch bei <a title="Event bei XING" href="https://www.xing.com/events/treffen-softwerkskammer-hamburg-16-10-2012-1151975" target="_blank">XING</a> anmelden.</p>
<div style="height:33px; padding-top:2px; padding-bottom:2px; clear:both;" class="zare366"><div style="float:left; width:90px; " class="zare366_google1"> 
				<g:plusone size="medium" href="http://blog.holisticon.de/2012/10/treffen-der-softwerkskammer-hamburg-im-oktober/" ></g:plusone>
			</div><div style="float:left; width:110px; padding-left:10px;" class="zare366_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="Treffen der Softwerkskammer Hamburg im Oktober" data-url="http://blog.holisticon.de/2012/10/treffen-der-softwerkskammer-hamburg-im-oktober/">Tweet</a> 
			</div></div>
		<div style="display:none;"><a href="http://www.news365live.com">news and informations</a>&nbsp;<a href="http://news365online.com">automotive,business,crime,health,life,politics,science,technology,travel</a><a href="http://worldnews365online.com">automotive,business,crime,health,life,politics,science,technology,travel</a></div><div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.holisticon.de/2012/10/treffen-der-softwerkskammer-hamburg-im-oktober/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
