Ausgabe Frühjahr 2013 - Gedoplan
Ausgabe Frühjahr 2013 - Gedoplan
Ausgabe Frühjahr 2013 - Gedoplan
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>Ausgabe</strong> Frühjahr <strong>2013</strong><br />
www.gedoplan.de<br />
Das Kundenmagazin<br />
In dieser <strong>Ausgabe</strong>:<br />
JBoss7 als Plattform für<br />
hochverfügbare Anwendungen<br />
Vergleich der Netzwerklast -<br />
Vaadin vs. JSF<br />
Systeme für den Anwender -<br />
User Centered Design
EDITORIAL<br />
Liebe Leserin, lieber Leser,<br />
Im ersten Artikel unserer Frühjahrsausgabe beschäftigt<br />
sich Dirk Weil mit der Clusterfähigkeit<br />
des JBoss Applikationsservers. Sowohl unter dem<br />
Aspekt der Ausfallsicherheit als auch unter dem<br />
Aspekt der Lastverteilung betrachtet, bietet die<br />
aktuelle Version fast alle notwendigen Features.<br />
Allerdings mit einigen Einschränkungen, auf die<br />
im Artikel eingegangen wird. Der Autor erwartet<br />
daher gerade in diesem Bereich noch einige<br />
Verbesserungen in der nächsten, der 7.2 Version.<br />
Hendrik Jungnitsch hat Ihnen in der letzten<br />
<strong>Ausgabe</strong> das Java-Webframework vorgestellt:<br />
Vaadin. Ein häufiges Argument gegen serverseitig<br />
gesteuerte Webframeworks ist der erhöhte<br />
Netzwerkverkehr. Aber wie hoch ist der eigentlich<br />
und gibt es Unterscheide zum Konkurrenten<br />
JSF? Auf beide Fragen finden Sie eine Antwort in<br />
dem Artikel Vaadin vs. JSF.<br />
User Centered Design sollten sich Softwareentwicklung<br />
immer verpflichtet fühlen. Was ist aber<br />
unter diesem abstrakten Begriff zu verstehen?<br />
Der Artikel Systeme für Anwender - User Centered<br />
Design von Reinhard Brüggemeyer gibt darauf<br />
eine Antwort, indem er die Frage nach dem<br />
Anwender, seinen Arbeitsbedingungen, seinen<br />
Verhaltensmustern etc. und den Folgen beleuchtet.<br />
Eine spannende und lohnende Lektüre<br />
wünscht Ihnen Ihr<br />
Termine<br />
Expertenkreis Java<br />
Thema: jBPM und Drools -<br />
Prozess- und Regelgestützte Fachanwendungen<br />
Ort: GEDOPLAN GmbH, Stieghorster Str. 60, 33605 Bielefeld<br />
Termin: Donnerstag, 04.07.<strong>2013</strong> | 18:00-20:00 Uhr<br />
Referent: Kai Jemella, S&N AG, Paderborn<br />
Thema: Desktop Usability im Browser -<br />
GWT in Business Anwendungen<br />
Ort: GEDOPLAN GmbH, Stieghorster Str. 60, 33605 Bielefeld<br />
Termin: Donnerstag, 16.05.<strong>2013</strong> | 18:00-20:00 Uhr<br />
Referent: Christian Vögtle, S&N AG, Paderborn<br />
Thema: JBoss 7 als Plattform für hochverfügbare Anwendungen<br />
Ort: GEDOPLAN GmbH, Stieghorster Str. 60, 33605 Bielefeld<br />
Termin: Donnerstag, 14.03.<strong>2013</strong> | 18:00-20:00 Uhr<br />
Referent: Dirk Weil, GEDOPLAN GmbH<br />
Java User Group Berlin Brandenburg<br />
Thema: Optimierung von JPA-Anwendungen<br />
Termin: Mittwoch, 30.01.<strong>2013</strong> | 18:30-20:30 Uhr<br />
Referent: Dirk Weil, GEDOPLAN GmbH<br />
JAX, 23. - 26.04.<strong>2013</strong>, Mainz<br />
Thema: Java EE hochverfügbar<br />
Termin: Freitag, 26.04.<strong>2013</strong> | 09:00 -10:30 Uhr<br />
Thema: Java Persistence in Action –<br />
Features jenseits des EntryLevels<br />
Termin: Dienstag, 23.04.<strong>2013</strong> | 14:45-15:45 Uhr<br />
Referent: Dirk Weil, GEDOPLAN GmbH<br />
HR-User-Group<br />
Thema: Das BEM ExpertenSystem<br />
- Betriebliches Eingliederungsmanagement im Portal<br />
Ort: GEDOPLAN GmbH, Stieghorster Str. 60, 33605 Bielefeld<br />
Termin: Mittwoch, 29.05.<strong>2013</strong> | 14:30-16:30 Uhr<br />
Referent: Frank Schlinkheider, ITSD Consulting GmbH<br />
Ulrich Hake | ulrich.hake@gedoplan.de<br />
Power Workshop Java EE 6<br />
Ort: IPS IT-Schulungen, Berlin<br />
Termin: 03. - 07.06.<strong>2013</strong><br />
2
JBoss 7 als Plattform<br />
für hochverfügbare Anwendungen<br />
Unternehmensanwendungen sollen zügig arbeiten und ausfallsicher sein. Der Parallelbetrieb in einem<br />
Cluster kann das mit Lastverteilung, Replikation und verteilten Caches erreichen, hält aber auch<br />
einige Stolperfallen bereit. JBoss 7 bietet u. a. in seinem Domain Modus die Möglichkeit, mehrere<br />
Serverinstanzen zu einem Cluster zu verbinden. Darin laufende Web-, Remote-(EJB-) und Messaging-Anwendungen<br />
können von Load Balancing und Failover profitieren, DB-Zugriffe können einen<br />
clusterweiten Cache verwenden.<br />
Von Dirk Weil<br />
Der Begriff „Hochverfügbarkeit“ kann im Sinne zweier Ziele interpretiert<br />
werden, die zwar unabhängig voneinander angestrebt werden<br />
können, sich teilweise aber auch gegenseitig beeinflussen: Durch<br />
Lastverteilung werden die Anfragen auf mehrere Cluster-Knoten verteilt,<br />
idealerweise so, dass die einzelnen Systeme optimal ausgelastet<br />
werden und somit der Gesamtdurchsatz im Vergleich zu einem einzelnen<br />
Server vervielfacht wird. Man muss dabei immer das große<br />
Ganze im Blick haben: Eine Einzelanfrage wird durch die Verwaltung<br />
der Lastverteilung bestenfalls nicht spürbar beeinflusst, in der Praxis<br />
aber etwas verlangsamt.<br />
Clusterarchitekturen<br />
Im einfachsten Fall bilden alle betroffenen Server einen Cluster, in<br />
dem jeder Knoten die Anwendungen komplett enthält.<br />
Alternativ ist auch ein mehrschichtiger Cluster denkbar, in dem Anwendungsschichten<br />
wie bspw. Web-Präsentation und Geschäftslogik<br />
auf mehrere Cluster deployt werden. Darüber hinaus ist es auch möglich,<br />
den Cluster so zu segmentieren, dass Teile davon unabhängig<br />
vom Rest bspw. zu Wartungszwecken heruntergefahren oder mit einem<br />
Anwendungsupdate versehen werden können.<br />
Der zweite Aspekt von Hochverfügbarkeit ist die Sicherheit gegen<br />
Ausfälle des Systems. Wird eine Anwendung redundant auf mehreren<br />
Cluster-Knoten betrieben und ihre Sitzungsdaten repliziert, kann<br />
beim Ausall eines Knotens ein zweiter transparent übernehmen. Im<br />
Idealfall bemerkt der Anwender dieses „Fail-over“ nicht. Die Replikation<br />
der Sitzungsdaten belastet die Systeme allerdings teilweise spürbar.<br />
Zudem nutzt man üblicherweise ein sog. Sticky-Session-Verfahren,<br />
bei dem Folgerequests immer dem Knoten zugewiesen werden,<br />
der schon den ersten Request der Session verarbeitet hat, solange<br />
dieser nicht ausfällt. Somit hat der Lastverteiler hier nicht mehr „freie<br />
Hand“, was der optimalen Systemauslastung entgegen wirkt.<br />
JBoss 7 im Clusterbetrieb<br />
Wie schon bei den Vorversionen enthält auch die Version 7 des JBoss<br />
umfangreiche Cluster-Features. Vieles davon ist allerdings noch<br />
„Work in Progress“, was man z. B. an der vielfach lückenhaften und<br />
teilweise auch fehlerhaften Dokumentation erkennen kann.<br />
Ein JBoss-7-Cluster kann zwar auf Basis des Standalone-Modus aufgebaut<br />
werden, der dem Laufzeitmodus der Vorversionen entspricht.<br />
Besser geeignet ist jedoch der mit der Version 7 neu eingeführte<br />
Domänenmodus, da hier eine gemeinsame Administration der Cluster-Server<br />
web- oder kommandozeilenbasiert mittels Administration<br />
Console bzw. Admin CLI möglich ist, was auch das clusterweite<br />
3
Deployment von Anwendungen umfasst. Als Konfigurationsprofil ist<br />
„ha“ oder „full-ha“ zu wählen für clusterfähige Anwendungen im<br />
Web bzw. Full Profile der Java EE 6.<br />
Web-Anwendungen im JBoss-7-Cluster<br />
Für den Zugriff mittels Webbrowser wird ein Load Balancer benötigt,<br />
der die Web-Requests annimmt und an einen der Clusterserver weiterleitet.<br />
JBoss bringt hierfür ein Plugin namens mod_cluster mit, das<br />
in einen Apache-HTTP-Server integriert werden kann. Es bietet eine<br />
dynamische Konfiguration, d. h. über ein Handshaking mit den Clusterservern<br />
konfiguriert es sich automatisch als lastverteilendes Proxy<br />
für die aktuell deployten, clusterfähigen Webanwendungen. Ebenso<br />
erkennt es selbstständig ausgefallene oder hinzugekommene Knoten.<br />
Die Lastverteilung kann zyklisch gleichverteilt geschehen oder auch<br />
gesteuert durch diverse serverseitige Metriken wie bspw. die akuelle<br />
Last der Clusterserver. Alternative Load Balancer sind natürlich auch<br />
einsetzbar, bspw. mod_jk – ebenfalls ein Apache-Plugin – oder separate<br />
Hardware.<br />
Die Sitzungsdaten der Anwendung können im Cluster repliziert werden,<br />
dazu nutzt JBoss 7 Infinispan, eine ebenfalls als JBoss-Projekt<br />
entwickelte Open-Source-Implementierung eines verteilten Caches.<br />
Die Daten können dabei auf alle anderen Server des Clusters repliziert<br />
werden. Obwohl hierfür Multicast eingesetzt werden kann,<br />
skaliert diese Standard-Replikation nicht gut, da der Speicherbedarf<br />
auf jedem Server linear mit der Anzahl der Knoten im Cluster wächst.<br />
Infinispan bietet als Lösung für größere Cluster ein Verteilungsverfahren<br />
an, bei dem nur eine definierbare, kleine Anzahl von Replikaten<br />
erstellt wird. Dieses Verfahren skaliert recht gut, verfügt aber<br />
naturgemäß über nicht ganz so hohe Ausfallsicherheit. In der Version<br />
7.1 des JBoss ist es allerdings noch nicht fehlerfrei implementiert.<br />
Dies sollte aber mit der derzeit im Pre-Release befindlichen Version<br />
7.2 der Fall sein.<br />
Weitere Dienste im JBoss-7-Cluster<br />
Die Sitzungsdaten von Stateful EJBs können analog zur Web Session<br />
repliziert werden. Die Remoting-Komponente von EJBs enthält zudem<br />
einen Load Balancer in Form eines Proxies, der Remote-Aufrufe<br />
der EJBs an die verschiedenen Knoten des Clusters verteilt und sich<br />
ähnlich zu mod_cluster anpasst, wenn Server ausfallen oder hinzukommen.<br />
4
Der Messaging-Dienst des JBoss 7 – HornetQ – ist ebenfalls clusterfähig:<br />
Der Versand von Point-to-Point-Meldungen geschieht lastverteilt<br />
auf die verschiedenen Server. Im Publish/Subscribe-Modus<br />
werden die Meldungen auf alle Server repliziert, wenn dort ein<br />
entsprechender Empfänger vorhanden ist. Der Meldungsempfang<br />
geschieht immer nur von einem Knoten – dem, an dem der Empfänger<br />
sich angemeldet hat. Im Falle eines Serverausfalls organisiert<br />
sich HornetQ automatisch neu, d. h. die Meldungsverteilung bezieht<br />
immer die derzeit laufenden Server ein. Die Meldungen des ausgefallenen<br />
Knotens sind nicht verloren, wenn sie persistent versendet<br />
wurden. Sie können nach dem späteren Start des ggf. reparierten<br />
Servers weiter verarbeitet werden.<br />
Der Java-Persistence-Provider im JBoss 7 – Hibernate – kann als Second<br />
Level Cache Infinispan nutzen. Der Cache ist damit auch clusterfähig,<br />
wobei hier i. d. R. keine Replikation der Daten genutzt wird<br />
– die sind ja ohnehin in der DB. Vielmehr wird nach der Veränderung<br />
eines persistenten Objektes auf einem Knoten Infinispan zur Invalidierung<br />
der entsprechenden Cache-Einträge der restlichen Knoten<br />
genutzt. Die Infinispan-Integration in der Version 7.1 des Servers<br />
enthält allerdings noch einige Bugs, die die Nutzung des Second Level<br />
Caches derzeit verhindern. Hier liegt die Hoffnung also ebenso<br />
wie zuvor auf der angekündigten Version 7.2.<br />
Fazit<br />
JBoss 7 enthält eine umfangreiche Unterstützung für das Clustering<br />
von Java-EE-Anwendungen, die alle wesentlichen Bereiche abdeckt.<br />
Die Cluster-Features sind allerdings erst spät integriert worden und<br />
befinden sich teilweise noch in der (Weiter-) Entwicklung, so dass<br />
in Teilen noch Einschränkungen zu beachten sind. Die kommende<br />
Version 7.2 wird diese Mängel voraussichtlich beheben.<br />
Zum Thema JBoss 7 führen wir in Kooperation mit unseren Seminarpartnern<br />
Seminare durch, die auch das Thema Clustering abdecken.<br />
Sprechen Sie uns gerne dazu an!<br />
Dirk Weil [ dirk.weil@gedoplan.de ]<br />
Geschäftsführer GEDOPLAN GmbH, darüber hinaus ist er Autor in Fachmagazinen, hält<br />
Vorträge und leitet Seminare und Workshops aus einem eigenen Java-Curriculum.<br />
5
Vergleich der Netzwerklast -<br />
Vaadin vs. JSF<br />
Bei Vaadin und JSF handelt es sich um serverseitig gesteuerte Webframeworks, welche einen Großteil<br />
der Steuerungslogik auf dem Server verrichten und den Client (Browser) hauptsächlich für eine reine<br />
Darstellung der GUI verwenden. Diese Architektur könnte daher für einen erhöhten Netzwerkverkehr<br />
gegenüber einer Rich-Client-Anwendung (z. B. GWT) sorgen. Insbesondere im Zusammenhang mit<br />
Vaadin wird dieser Aspekt oft als ein Nachteil des Frameworks aufgeführt. Dementsprechend lag<br />
es nahe, einmal genauer zu untersuchen, wie sich die Webframeworks bezüglich ihrer verursachten<br />
Netzwerklast verhalten.<br />
Von Hendrik Jungnitsch<br />
Testumgebung<br />
Zuerst muss eine geeignete Testanwendung für den Vergleich konzipiert<br />
werden. Diese soll zwar nicht allzu komplex sein, da eine<br />
vergleichbare Implementierung sowohl in Vaadin als auch in JSF<br />
notwendig ist, allerdings ist es natürlich wünschenswert, dass die<br />
Anwendung möglichst viele verschiedene Anwendungsfälle abdeckt.<br />
Somit soll die Testanwendung folgende Elemente beinhalten, um einen<br />
einigermaßen umfassenden Vergleich zu gewährleisten:<br />
• Zwei verschiedene Seiten (Seitenwechsel) (Seiten müssen<br />
„bookmarkable“ sein)<br />
• Anzeigen von Datensätzen (Tabelle) (laden vom Server)<br />
• Auswahl von Datensätzen<br />
• Bearbeiten von Datensätzen (speichern auf Server)<br />
• Validierung der Eingaben<br />
• Felder mit Validierung bei Verlassen des Feldes validieren<br />
• Formatierung von Feldinhalten<br />
• Ein-/Ausblenden eines Bereichs<br />
• Hinzufügen, Entfernen von Elementen<br />
• De-/aktivieren von Feldern<br />
• Anzeigen von Bildern<br />
Testanwendung<br />
Bei der aus diesen Überlegungen entstandenen Mini-Anwendung<br />
handelt es sich um eine Kundenstammdaten-Verwaltung, welche auf<br />
der ersten Seite eine Übersichtstabelle über alle Datensätze bietet.<br />
In der Tabelle kann ein Datensatz ausgewählt und anschließend über<br />
einen Button „Bearbeiten“ auf einer neuen Seite verändert werden.<br />
Alle zu validierenden Felder werden jeweils gleich nach Verlassen<br />
ausgewertet. Um das Formular etwas komplexer zu gestalten, gibt<br />
es einen Bereich für das Verwalten der Kontaktdaten des Kunden,<br />
welcher aus- und eingeklappt werden kann. In der tabellarischen<br />
Ansicht besteht die Möglichkeit, Kontakte zu ändern, zu löschen und<br />
hinzuzufügen.<br />
Die Anwendungen sind gegen ein gemeinsames Backend, welches<br />
die Daten- und Serviceklassen umfasst, programmiert.<br />
Für die Vaadin-Variante kommt das neue View-und-Navigator-Konzept<br />
von Vaadin 7 zum Einsatz, um den Seitenwechsel zu realisieren.<br />
Das Template für die Seiten ist über die entsprechende Implementierung<br />
der UI-Klasse realisiert. Um den Vergleich realistisch zu<br />
gestalten, wird JSF nicht „pur“, sondern mit der Aufsatzbibliothek<br />
Primefaces verwendet. Dies zum einen aus dem Grund, dass in der<br />
Praxis JSF meist mit entsprechenden Komponentenbibliotheken zusammen<br />
genutzt wird und zum anderen, um ein ähnlich komplexes<br />
Theming und vergleichbare Ajax-Funktionalitäten zu erhalten, wie<br />
dies bei Vaadin der Fall ist. Denn es ist wohl davon auszugehen, dass<br />
durch die dafür benötigten CSS- und JavaScript-Dateien ein nicht<br />
unbedeutender Teil der Netzwerklast verursacht wird. Die Navigation<br />
in der JSF-Anwendung erfolgt, wie man es in der Praxis wohl auch<br />
umsetzen würde, mit Hilfe von Outcomes und Navigation-Rules.<br />
8
Testaufbau<br />
Die Testanwendungen laufen auf einem JBoss-Server, die Testzugriffe<br />
erfolgen von einer anderen Maschine aus, um „echten“ Netzwerkverkehr<br />
zu generieren. Um dabei die anfallende Netzwerklast<br />
festzuhalten, kommt das Programm Wireshark zum Einsatz. Zugriffe<br />
von mehreren Clients gleichzeitig werden mit Hilfe von JMeter simuliert.<br />
Alle Daten werden vorerst in nichtkomprimierter Form zwischen<br />
Client und Server ausgetauscht.<br />
Ein Testdurchlauf beinhaltet insgesamt 22 verschiedene Aktionen,<br />
die auf der Web-GUI ausgeführt werden.<br />
Vermutungen vor dem Test<br />
Wahrscheinlich werden sich Vaadin und JSF +Primefaces nicht großartig<br />
unterscheiden, was das verursachte Datenvolumen angeht. Auf<br />
der einen Seite müssen erst einmal die Funktionalität (JavaScript)<br />
und das Theme (CSS, Bilder) geladen werden, zum anderen müssen<br />
in beiden Fällen die zu verarbeitenden Daten in gleichem Umfang an<br />
den Server bzw. zum Client übertragen werden.<br />
Ein Blick auf die IO-Graphen aus Wireshark bestätigt diese Vermutung:<br />
Abbildung1 : IO-Graph Vaadin<br />
Testergebnisse<br />
Bei 100 Durchläufen ergaben sich folgende Werte für das jeweilige<br />
gesamte Datenvolumen:<br />
Vaadin: 140,52 MB<br />
JSF+Primefaces : 178,20 MB<br />
Traffic Vaadin JSF<br />
Gesamtvolumen 140,52 MB 178,20 MB<br />
HTTP-Requests 4500 4100<br />
Pakete 143251 178607<br />
durchschn. Paketgröße 1028 106<br />
Der erste Eindruck nach diesem Ergebnis ist wohl, dass Vaadin zwar<br />
weniger Traffic in diesem Test verursacht hat, allerdings nicht wirklich<br />
so viel weniger, als dass man daraus jetzt sofort eine notwendig<br />
optimalere Netzwerklast gegenüber JSF schlussfolgern könnte. Die<br />
Unterschiede könnten sich zum Beispiel allein aus dem Umfang der<br />
jeweils verwendeten Themes ergeben. Um also eine genauere Aussage<br />
treffen zu können, liegt es nahe, einen Blick auf die Größe der<br />
Dateien zu werfen, welche zu Beginn bei Aufruf der Seite geladen<br />
werden.<br />
Bei Erstaufruf der JSF Seite ergeben sich insgesamt 444 KB, wovon<br />
407 KB für die Primefaces Styles und JavaScript-Dateien anfallen.<br />
Nun würde man vielleicht vermuten, dass diese anfängliche „Ladelast“<br />
bei Vaadin etwas geringer ausfällt, was allerdings nicht der Fall<br />
ist. Bei Vaadin werden zu Beginn 1,3 MB übertragen, wovon gut 1<br />
MB für die JavaScript-Engine und 200 KB für den Style bei draufgehen.<br />
Die am Anfang zu ladenden Daten sind also bei Vaadin deutlich<br />
umfangreicher als dies bei JSF der Fall ist. Was dann natürlich die<br />
Frage aufwirft, wie es dann möglich ist, dass Vaadin unter dem Strich<br />
doch ein geringeres Datenvolumen verursacht.<br />
Die nächstliegende Erklärung ist wohl, dass alle weiteren Aktionen,<br />
die auf der Vaadin-Anwendung aufgerufen werden, einfach entsprechend<br />
weniger Netzwerkverkehr verursachen.<br />
Abbildung2 : IO-Graph JSF<br />
Das dargestellte Szenario hat sich durch Nutzung von 100 JMeter<br />
Threads, die innerhalb einer Ramp-up-Zeit von 120s gestartet wurden,<br />
ergeben. Daran ist deutlich zu sehen, dass Vaadin nach dem<br />
anfänglichen Laden für alle weiteren Aktionen wesentlich weniger<br />
Bandbreite benötigt, als dies bei JSF der Fall ist. Das führt dazu, dass<br />
für die JSF-Anwendung zum einen, auch nach Initialisieren aller Sessions<br />
der Netzwerkverkehr nicht so stark abfällt, zum anderen aber<br />
auch die Höchstwerte deutlich über denen der Vaadin-Applikation<br />
liegen.<br />
Wie aber kommt es zu diesem doch recht deutlichen Unterschied?<br />
Da davon auszugehen ist, dass wohl die meisten Daten bei Seitenwechsel<br />
übertragen werden, schauen wir uns diesen genauer an: Bei<br />
der Vaadin-Anwendung werden bei dem Wechsel von der Übersicht<br />
in die Detailbearbeitung 7,2 KB übertragen, bei JSF sind es dagegen<br />
255 KB. Dies liegt zum einen daran, das hier noch eine Primefaces<br />
JavaScript-Bibliothek nachgeladen wird, die erst auf dieser Seite<br />
zum Einsatz kommt, zum anderen ist aber auch die Seite selber mit<br />
28 KB doch deutlich größer. Die größere Datenmenge für die Seite<br />
selbst kann durch die Art und Weise, wie die Navigation in Vaadin<br />
und JSF realisiert ist, erklärt werden. Bei JSF wird bei Nutzung der<br />
standardmäßigen Navigationsfunktion (mit Redirekt) die komplette<br />
Seite neu geladen, was auch durch die Nutzung eines Templates<br />
nicht geändert wird. Dagegen arbeitet Vaadin 7 in der Art, dass das<br />
Template (UI) erhalten bleibt und nur der Inhaltsbereich gegen die<br />
aktuelle View ausgetauscht wird. Dies gilt wie bereits angemerkt unter<br />
der Voraussetzung, dass jeweils die Standardmechanismen für die<br />
Navigation zum Einsatz kommen.<br />
Allerdings ist der Navigationsaspekt hier nicht der einzige Unterschied<br />
zwischen den beiden Frameworks. Die Datenmenge, die bei<br />
einer Aktion zu übertragen ist, wird auch durch die unterschiedlichen<br />
Datenaustauschmechanismen beeinflusst. Während, im Falle von<br />
JSF, auch bei AJAX-Anfrage immer XHTML-Fragmente zurückgelie-<br />
9
fert werden, um einen Bereich zu aktualisieren, findet der Austausch<br />
bei Vaadin mit Hilfe der Frameworkeigenen UIDL, welche auf JSON<br />
Basis realisiert ist, statt. Mit Hilfe dieser UIDL ist es möglich, die<br />
Informationen in einer deutlich kompakteren Form auszutauschen.<br />
Optimierung Vaadin<br />
Ein extrem großer Teil des Datenverkehrs wird allein von der JavaScript-Engine<br />
und insbesondere dem sogenannten Widgetset,<br />
welches die Clientseitige Implementierung der Oberflächenkomponenten<br />
beinhaltet, verursacht. Um also die Netzwerklast einer Vaadin-Anwendung<br />
zu reduzieren, kann es sinnvoll sein, das Widgetset<br />
noch einmal mit dem GWT-Compiler zu übersetzen. Mit Hilfe einer<br />
eigenen BundleLoaderFactory kann für die einzelnen Komponenten<br />
festgelegt werden, ob diese sofort bei Anwendungsstart oder „lazy“<br />
im Programmverlauf geladen werden sollen. Wenn nur die Widgets,<br />
die auch wirklich in der Anwendung benötigt werden, für das Eager-<br />
Loading gekennzeichnet sind, so reduziert sich die Größe des Widgetsets<br />
deutlich. Bei der hier vorgestellten Testanwendung konnte<br />
eine Reduktion von ca. 1 MB auf gut 600 KB erzielt werden. Insgesamt<br />
belief sich das Datenvolumen bei 100 Durchläufen nun nur<br />
noch auf 101,17 MB gegenüber den vorher gemessenen 140,52 MB.<br />
Optimierung JSF<br />
Hier ist kein so offensichtlicher Optimierungsansatz gegeben. Sicher<br />
würde die Anwendung anfänglich weniger Daten laden müssen, würde<br />
man auf Primefaces verzichten, allerdings stände dann auch bei<br />
weitem nicht der Funktionsumfang, wie er von Vaadin geboten wird,<br />
zur Verfügung. Eine Möglichkeit, die Datenlast etwas zu senken,<br />
bestünde darin, auf das Navigieren mit Redirect zu verzichten und<br />
dafür zu sorgen, dass bei Seitenwechsel auch nur der Inhaltsbereich<br />
per AJAX ausgetauscht wird, was dann allerdings erst einmal den<br />
Verzicht auf Bookmarkable-URLs nach sich ziehen würde.<br />
Optimierung Allgemein<br />
Um für eine deutliche Absenkung der zu übermittelnden Datenmenge<br />
zu sorgen, können die Seiteninhalte auch in gzip-komprimierter<br />
Form an den Client ausgeliefert werden, sofern dieser das unterstützt.<br />
Mit Hilfe der Datenkompression ist es gelungen, das gesamte<br />
übertragene Datenvolumen, das in dem Testszenario angefallen ist,<br />
im Falle von JSF auf 58,25 MB und bei der optimierten Vaadin-Anwendung<br />
auf 36,92 MB zu drücken.<br />
Überblick Datenmenge mit und ohne Optimierung:<br />
Datenvolumen<br />
Vaadin 140,52<br />
JSF 178,20<br />
Vaadin optimiert 101,17<br />
Datenvolumen<br />
durchschn. Paketgröße 58,25<br />
Vaadin optimiert + GZIP 36,92<br />
Fazit<br />
Vaadin hat in diesem Testszenario eine geringere Netzwerklast verursacht<br />
als JSF, was hauptsächlich über den AJAX-gestützten Seitenwechsel<br />
und die UIDL, für den Informationsaustausch zwischen<br />
Server und Client, zu erklären ist. Allerdings kann daraus natürlich<br />
nicht allgemeingültig geschlossen werden, dass Vaadin-Programme<br />
immer einen Vorteil in dieser Hinsicht gegenüber JSF-Anwendungen<br />
haben. Schon allein der Einsatz einer anderen Komponentenbibliothek<br />
für JSF oder das Implementieren einer AJAX-gestützten Navigation<br />
könnten hier für einen großen Unterschied sorgen. Auch über<br />
Nutzung eines anderen Themes könnte die Menge und Größe der zu<br />
übertragenden Dateien beeinflusst werden.<br />
Auffällig war vor allem bei Vaadin, dass der bei weitem größte Teil<br />
der Datenmenge allein von dem anfänglichen Laden der Anwendung<br />
herrührt. Das ist insofern interessant, als im Allgemeinen davon ausgegangen<br />
wird, dass es sich bei der Datenlast, die durch das Verarbeiten<br />
aller Aktionen auf dem Server entsteht, um einen der großen<br />
Nachteile dieses Frameworks handelt. Natürlich ist bei solch einer<br />
AJAX-gestützten Vorgehensweise die Anzahl der Anfragen an den<br />
Server insgesamt größer, die Datenmengen, die dabei entstehen, fallen<br />
allerdings wohl verhältnismäßig gering aus.<br />
Es bleibt also festzuhalten, dass die Serverseitige Steuerung, die Vaadin<br />
und JSF zu Grunde liegt, nicht unbedingt zu einer unverhältnismäßig<br />
hohen Datenmenge führen muss. Daten für den Aufbau von<br />
Seiten/Views und Styles sowie natürlich auch die in der Anwendung<br />
darzustellenden und zu verarbeitenden Daten müssen bei jeder Webanwendung<br />
zwischen Client und Server ausgetauscht werden. Wobei<br />
es natürlich sehr schwer ist, hier allgemeine Aussagen diesbezüglich<br />
zu treffen. Wenn man z. B. bei einer Webanwendung davon ausgeht,<br />
dass diese von den Benutzern nur einmal am Tag geladen wird und<br />
anschließend zehntausende verschiedene Aktionen darauf ausgeführt<br />
werden, dann fällt natürlich auch irgendwann das Übertragen<br />
jeweils kleiner Datenmengen (z. B. Validierung eines einzelnen Wertes)<br />
stärker ins Gewicht.<br />
Zur Optimierung von Webanwendungen empfiehlt es sich auf jeden<br />
Fall, diese auch mit GZIP-Encoding anzubieten, da dies vor allem bei<br />
den großen JavaScript-/CSS-/XML-/JSON-Dateien zu einer erheblichen<br />
Reduktion des Datenvolumens führen kann.<br />
Hendrik Jungnitsch [hendrik.jungnitsch@gedoplan.de ]<br />
Entwickler und Trainer im Bereich Java bei der <strong>Gedoplan</strong> GmbH. Sein Tätigkeitsschwerpunkt<br />
ist das Realisieren von Java-EE-basierten Webanwendungen.<br />
10
Systeme für die Anwender<br />
- User Centered Design<br />
Bei einer neuen Anwendung steht die Funktionalität im Mittelpunkt. Die Anforderungen werden mit<br />
verschiedenen Methoden wie Use Cases, Klassendiagrammen und Prototypen der Masken definiert.<br />
So wird sichergestellt, dass jede Aufgabe des Anwenders irgendwie mit dem System durchgeführt<br />
werden kann. Aber ist das ausreichend für ein erfolgreiches System? Es ist nicht nur wichtig, was<br />
ein System leistet, sondern auch, wie es die Anwender unterstützt. Das System soll die Aufgaben der<br />
Anwender optimal aus ihrer Sicht unterstützen. Der Anwender ist ebenso wichtig wie die Funktionalität.<br />
Nur so wird ein System akzeptiert und damit erfolgreich.<br />
Von Reinhard Brüggemeyer<br />
Vom Modell zum Design<br />
Die Klassenmodelle beschreiben genau die Objekte, die im System<br />
verwaltet werden sollen. Dabei liefert das Modell auch die Beziehungen<br />
zwischen den Objekten. So hat eine Person verschiedene<br />
abhängige Objekte wie Anschriften, Bankverbindungen und Konten.<br />
Der Name, das Geburtsdatum und weitere Angaben zur Person werden<br />
auf dem Hauptschirm verwaltet. Für jedes Unterobjekt der Person<br />
gibt es einen eigenen Reiter. So können Anschriften, Bankverbindungen<br />
und Konten zur Person verwaltet werden. Das User Interface<br />
entspricht exakt dem Klassenmodell. Spezielle Sichten der Anwender<br />
sind allerdings nicht berücksichtigt.<br />
Use Cases beschreiben die Funktionen, die die Anwender benötigen.<br />
Wie können die Use Cases im UI Design abgebildet werden? Es ist<br />
sicherlich zu einfach, alle Use Cases zu einem Objekt zusammenzufassen<br />
und in einem Dialog abzubilden. Ein Antrag muss geprüft, korrigiert,<br />
berechnet und abgeschlossen werden. Evtl. muss der Antrag<br />
storniert werden. Es ist nicht sinnvoll, die gesamte Funktionalität<br />
in einem Dialog abzubilden. Der Dialog würde viel zu komplex. Die<br />
Funktionen werden ja auch nicht alle von denselben Personen ausgeführt.<br />
Es macht also Sinn, Personen in Anwendergruppen aufzuteilen<br />
und dafür Rollen zu bilden. Für die Verwaltung des Antrages gibt es<br />
dann mehrere Sichten, die jeweils die speziellen Anforderungen einer<br />
Rolle berücksichtigen.<br />
Usability, wie wird der Anwender unterstützt<br />
Anwenderfreundliche Systeme sind unbestritten das Ziel der Softwareentwicklung<br />
– doch wie kann dies beurteilt werden? Die ISO<br />
9241 Software Ergonomie liefert folgende Definition: Usability ist<br />
das Ausmaß, in dem ein Produkt durch bestimmte Benutzer in einem<br />
bestimmten Nutzungskontext genutzt werden kann, um bestimmte<br />
Ziele effektiv, effizient und zufriedenstellend zu erreichen. Die Anwendung<br />
soll …<br />
• die Ziele des Anwenders unterstützen<br />
• Selbsterklärend sein<br />
• standardgemäße Oberflächenelemente bieten<br />
• Dem Benutzer die Steuerung überlassen, nicht umgekehrt<br />
• Möglichkeiten zur Individualisierung bieten<br />
Usability Engineering stellt in den Vordergrund, wie ein System gestaltet<br />
wird. User Centered Design stellt die Sicht des Anwenders in<br />
den Mittelpunkt. Aber wer ist überhaupt unser Anwender? Ein Modell<br />
des Anwenders wird durch „Personas“ erstellt.<br />
User Centered Design, der Anwender steht im Mittelpunkt<br />
User Centered Design betrachtet die verschiedenen Nutzungsszenarien<br />
einer Anwendung. Szenarien werden von verschiedenen Anwendergruppen<br />
aufgerufen. Die Navigation und das Design sind für die<br />
gesamte Anwendung einheitlich. Die Interaktion mit dem System ist<br />
durchaus abhängig von der Anwendergruppe. Ein Anwender, der permanent<br />
mit dem System arbeitet, erwartet eine andere Interaktion<br />
als jemand, der sporadisch das System zu Recherchezwecken nutzt.<br />
Die Erwartungen der User an das System sind der entscheidende Input<br />
beim User Centered Design.<br />
Eine Anwendung zeichnet sich durch einfache Navigation, freundliches<br />
Design und intuitive Interaktion aus. Die Navigation ist einfach<br />
zu finden und auf allen Seiten gleich. Alle Seiten sind klar benannt<br />
und der Anwender weiß über den „breadcrumb“ immer, wo er<br />
sich befindet. Das Design von Seiten mit ähnlicher Funktionalität<br />
ist weitgehend identisch. Der Seitenaufbau entspricht einer festen<br />
Struktur. Meldungen und Kontextinformationen erscheinen immer<br />
an derselben Position. Farben, Schriftgrößen und Schriftarten sind<br />
11
für die gesamte Anwendung vorgegeben. Die Benutzerinteraktion<br />
legt den Focus auf die wichtigsten Funktionen. Sie werden zentral,<br />
möglichst oben auf der Maske dargestellt. Der Anwender kann Informationen<br />
von „high level“ nach „low level“ verfolgen. Die natürliche<br />
Bedienungsreihenfolge ist offensichtlich. Die Anzahl der Steuerungselemente<br />
ist minimiert. Es werden Standardelemente mit exakten<br />
Bezeichnungen genutzt.<br />
Moderne Systeme entlasten Anwender von Routineaufgaben. Standardfälle<br />
werden automatisch durch eine Dunkelverarbeitung abgewickelt.<br />
Die Steuerung erfolgt über ein integriertes Workflowsystem.<br />
In Ausnahmefällen, die durch Regeln vom Workflowsystem erkannt<br />
werden, wird eine manuelle Bearbeitung erforderlich. Das System<br />
stellt die Vorgänge in anwenderspezifische Postkörbe. Die jeweilige<br />
Ausnahme wird transparent dargestellt. Der Anwender ruft vom<br />
Postkorb direkt die Funktionalität auf, die er zur manuellen Bearbeitung<br />
benötigt. So ist bei Workflowsystemen eine spezifische Benutzerinteraktion<br />
implementiert, die den Anwender direkt zur benötigten<br />
Funktionalität führt.<br />
„Persona“, wer ist unser Anwender<br />
In welchen Szenarien arbeitet unser Anwender, wie sind seine Arbeitsbedingungen<br />
und welche Funktionen benötigt er überwiegend?<br />
Diese und ähnliche Fragen stellen wir uns, um eine Vorstellung von<br />
den zukünftigen Anwendern des Systems zu bekommen. Wir wollen<br />
ein Modell von unseren Anwendern entwerfen. Bereits 1995 hat<br />
Alan Cooper die Methode „Personas“ beschrieben. „Personas“ sind<br />
erdachte Personen, die auf den Verhaltensmustern und Zielen der<br />
Anwender basieren. Es sind Beschreibungen von fiktiven Anwendern<br />
für ein interaktives System. Sie entstehen aus der Diskussion mit den<br />
Projektbeteiligten und liefern ein grundlegendes Verständnis von den<br />
Anwendergruppen. „Personas“ sind Kommunikationswerkzeuge. Im<br />
Normalfall hat ein Projekt maximal 3 – 5 „Personas“. Eine „Persona“<br />
ist stellvertretend für eine Gruppe von Mitarbeitern. Über eine Matrix<br />
der unterschiedlichen Mitarbeitergruppen und zugeordneten Aufgaben<br />
werden die verschiedenen „Personas“ ersichtlich.<br />
12
Die Unterscheidung der Anwendergruppen erfolgt in erster Linie<br />
durch Gruppierung der notwendigen Funktionalität. Darüber hinaus<br />
ist aber auch der Anwendertyp von Bedeutung. Wie häufig benutzt er<br />
das System? Benötigt er detaillierte oder verdichtete Informationen?<br />
Ist schnelle oder selbsterklärende Navigation gewünscht? Soll das<br />
System, wenn möglich, Werte vorschlagen?<br />
Nach diesen Kriterien definieren wir „Personas“ für die Sachbearbeitergruppen<br />
und Anwendertypen. Eine „Persona“ bekommt einen<br />
Namen und bestimmte Eigenschaften. Anhand dieser Beschreibung<br />
wird überprüft, ob das Anwendungsdesign unsere „Persona“ optimal<br />
unterstützt. So benötigt unser Antragssachbearbeiter in bestimmten<br />
Situationen Zusatzinformationen aus der Stammdatenverwaltung.<br />
Dazu musste aufwendig in die Stammdatenverwaltung navigiert<br />
werden. Das Design wurde so geändert, dass der Sachbearbeiter aus<br />
der Antragsbearbeitung direkt ein Kontextmenu mit den entsprechenden<br />
Informationen aufrufen kann.<br />
System zu gestalten ist. Sie gelten übergreifend für alle Funktionen<br />
und treffen keine Unterscheidung nach Anwendergruppen. In<br />
der Praxis zeigt sich aber, dass ein System von unterschiedlichen<br />
Gruppen genutzt wird. User Centered Design berücksichtigt diesen<br />
Aspekt. „Personas“ liefern ein Konzept, unterschiedliche Anwendergruppen<br />
zu definieren und zu beschreiben. Sie liefern den Input für<br />
das Anwendungsdesign. Nach den Grundsätzen des Usability Engineering<br />
werden das Navigations- , Design- und Interaktionskonzept<br />
entwickelt. Das erstellte Design kann jederzeit gegen die „Personas“<br />
verifiziert werden.<br />
Fazit<br />
Im klassischen Requirements Engineering wird zwischen funktionalen<br />
und nicht funktionalen Anforderungen unterschieden. Die nicht<br />
funktionalen Anforderungen sollen den Input dafür liefern, wie das<br />
Reinhard Brüggemeyer [ reinhard.brueggemeyer@gedoplan.de ]<br />
Seniorberater GEDOPLAN GmbH. Seine Schwerpunkte sind Anforderungsanalyse, Modellierung<br />
von Geschäftsprozessen und Projektmanagement – insbesondere agile Vorgehensweisen.<br />
13
- Anzeige -<br />
Java-Schulungsprogramm <strong>2013</strong><br />
Objektorientierung, Java SE, Java EE, Tools, Testing & mehr.<br />
IPS bietet professionelle Einsteiger- und Umsteigerschulungen für Java und die Java Enterprise Edition (Java EE). Auf Wunsch organisieren<br />
wir für Entwicklerteams auch Projektworkshops.<br />
"Java ist eine zuverlässige Plattform zur objektorientierten Softwareentwicklung, die eine weitreichende Standardisierung mit der<br />
notwendigen Offenheit kombiniert und die durch eine große Community getragen und weiterentwickelt wird. Zum Erfolg von Java<br />
tragen sicher auch die hervorragenden Entwicklungswerkzeuge und die große Menge frei verfügbarer Tools und Bibliotheken bei."<br />
Dirk Weil, IPS-Trainer, Fachautor und Leiter des Enterprise Java Teams.<br />
JJava und Java EE<br />
Java - Programmierung (Java SE) Tage € zzgl. MwSt. Kurscode<br />
Java für Programmierer ohne Vorkenntnisse der Objektorientierung 5 1.940,-- JAV-100-OOJ<br />
Java für Umsteiger einer objektorientierten Programmiersprache 4 1.680,-- JAV-105-OOU<br />
Java Effective 2 1.070,-- JAV-130-EFF<br />
Java Performance Tuning 3 1.290,-- JAV-120-JPT<br />
Refactoring 2 1.080,-- JAV-350-REF<br />
Grundlagen Java SE Security 1 520,-- JAV-500-SEC<br />
Java - Java Edition (Java EE) Tage € zzgl. MwSt. Kurscode<br />
Power Workshop Java EE 6 5 2.125,-- JAV-310-JEE<br />
Java-EE-Überblick: Workshop mit Dirk Weil 1 590,-- JAV-300-JEE<br />
Enterprise JavaBeans (EJB 3) mit JPA 4 1.790,-- JAV-321-EJB<br />
Java-Anwendungsentwicklung mit CDI 2 960,-- JAV-360-CDI<br />
Liferay 2 960,-- JAV-900-LRP<br />
Java Persistence API (JPA) 3 1.390,-- JAV-330-JPA<br />
Java-Webanwendungen mit JavaServer Faces (JSF) 4 1.790,-- JAV-350-JSF<br />
Enterprise Java für Architekten 2 1.070,-- JAV-305-JEE<br />
Java EE Design Patterns 3 1.590,-- JAV-340-DES<br />
Java - Entwicklerwerkzeuge Tage € zzgl. MwSt. Kurscode<br />
Eclipse - Grundlagen 1 520,-- DEV-120-ECL<br />
Eclipse Modeling Framework (EMF) 2 1.100,-- DEV-140-EMF<br />
Apache-Maven-Grundlagen 1 520,-- DEV-300-MVN<br />
Build- und Release-Management mit Apache Maven 2 960,-- DEV-310-MVMB<br />
Hudson / Jenkins- Grundlagen 1 520,-- DEV-400-HUD<br />
IPS IT-Schulungen - Ihr deutschlandweiter Partner für IT-Schulungen<br />
Nutzen Sie die Erfahrung aus mehr als 20 Jahren IT-Schulungen für Einsteiger, Umsteiger und Professionals. Der IPS-Kurskatalog 2012/<strong>2013</strong><br />
umfasst über 300 Kurse zu aktuellen IT-Themen. Das IPS-Team unterstützt Sie persönlich, professionell und lernzielorientiert.<br />
Berlin - Bielefeld - Hamburg - Hannover - Köln - Krefeld - Nürnberg - Wiesbaden - Stuttgart<br />
Sprechen Sie uns an – wir beraten Sie gerne! Tel. (0521) 2088930 Beratung@IPS-IT-Schulungen.de www.IPS-IT-Schulungen.de
- Anzeige -<br />
Individuelle Firmenschulungen<br />
Viele Unternehmen nutzen die Kursbeschreibungen im offenen IPS-Schulungsprogramm als Ausgangspunkt für die Planung individueller Firmenschulungen.<br />
Unter Berücksichtigung von Vorkenntnissen, Unternehmensvorgaben und gewünschten Zielen erarbeiten wir daraus gemeinsam mit<br />
Ihnen maßgeschneiderte Weiterbildungsangebote. Durchführung bei IPS oder bei Ihnen vor Ort.<br />
Java Application Server<br />
JBoss Tage € zzgl. MwSt. Kurscode<br />
Entwicklung und Betrieb von Anwendungen auf JBoss AS 7 3 1.520,-- JBO-AS-ADM7<br />
Hochverfügbarkeit mit dem JBoss AS 7 3 1.390,-- JBO-AS-HOCH7<br />
JBoss - Clustering 2 960,-- JBO-AS-CLUS<br />
JBoss EAP6 – Eintägige Update-Schulung 1 520,-- JBO-AS-UPD6<br />
Java und SAP Tage € zzgl. MwSt. Kurscode<br />
SAP NetWeaver - Entwicklung von Java EE - Anwendungen 5 auf Anfrage SAP-NETW-JEE71<br />
Softwareentwicklung und Datenbanken<br />
Java Frameworks Tage € zzgl. MwSt. Kurscode<br />
Spring Framework Grundlagen 3 1.490,-- JAV-600-SPR<br />
Spring Web-Service 2 990,-- JAV-610-SPR<br />
Java-Webanwendungen mit Vaadin 3 1.490,-- DEV-400-VAA<br />
Google Web Toolkit (GWT) - Grundlagen 3 1.520,-- JAV-150-GWT<br />
Grails 2 1.130,-- JAV-130-GRA<br />
Java Software Testing Tage € zzgl. MwSt. Kurscode<br />
Java Software Testing-Grundlagen 1 520,-- JAV-400-STG<br />
Java Software Testing in der Praxis 4 1.790,-- JAV-410-STP<br />
Java Software Testing für die Enterprise Edition 4 1.790,-- JAV-420-STE<br />
Oracle Tage € zzgl. MwSt. Kurscode<br />
Oracle - Datenbankprogrammierung mit PL/SQL Grundlagen 5 1.890,-- DB-ORA-02<br />
Oracle - Datenbankprogrammierung mit PL/SQL Aufbau 3 1.290,-- DB-ORA-34<br />
Oracle - Real Application Cluster (RAC) und Grid Infrastructure 5 1.990,-- DB-ORA-08<br />
IPS-Kurse im Internet suchen und buchen<br />
Mehr über Inhalte, Termine, Voraussetzungen etc. unter www.ips-it.de/< Kurscode><br />
Suchbeispiel: www.ips-it.de/JAV-100-OOJ<br />
Berlin - Bielefeld - Hamburg - Hannover - Köln - Krefeld - Nürnberg - Wiesbaden - Stuttgart<br />
Sprechen Sie uns an – wir beraten Sie gerne! Tel. (0521) 2088930 Beratung@IPS-IT-Schulungen.de www.IPS-IT-Schulungen.de
GEDOPLAN ist seit über 30 Jahren spezialisiert auf die Entwicklung<br />
von IT-Systemen. Unsere Experten haben langjährige Erfahrung<br />
in der Analyse, Konzeption und Realisierung von Unternehmenssoftware.<br />
Individuallösungen realisieren wir auf Basis objektorientierter<br />
Techniken. Die leistungsfähige und umfangreiche Plattform Java<br />
EE bildet dafür schon seit über 10 Jahren einen unserer Schwerpunkte.<br />
Es ist unser Anspruch, gut strukturierte und wartbare<br />
Anwendungen zu entwickeln. Mit modernen Entwicklungsumgebungen<br />
und entwicklungsbegleitenden, automatisierten Tests<br />
stellen wir eine hohe Softwarequalität sicher.<br />
Im Bereich der Standardsoftware unterstützen wir Sie bei der<br />
Einführung und Anpassung von SAP®-Lösungen, insbesondere in<br />
Fragen der Basis-Administration und des Personalmanagements.<br />
Anpassungen oder Erweiterungen können wir mit ABAP und<br />
Java auf Basis von SAP® NetWeaver durchführen.<br />
Wir entwickeln IT-Systeme als Komplettpakete, unterstützen unsere<br />
Kunden aber auch vor Ort. Unsere Experten geben ihr Wissen<br />
gerne weiter – in Form von projektbegleitenden Coachings<br />
oder Seminaren bei unseren Schulungspartnern.<br />
GEDOPLAN<br />
Unternehmensberatung und<br />
EDV-Organisation GmbH<br />
Stieghorster Straße 60<br />
33605 Bielefeld<br />
Fon: 0521 2 08 89 10<br />
Fax: 0521 2 08 89 45<br />
E-Mail: info@gedoplan.de<br />
Herausgeber: GEDOPLAN Unternehmensberatung und EDV-Organisation GmbH | Stieghorster Straße 60 | 33605 Bielefeld<br />
Verantwortlich: Dipl.-Inform. Dirk Weil | Redaktionsleitung: Ulrich Hake | Fon: 0521 2088910 | E-Mail: info@gedoplan.de<br />
Produktion: networker Medienfabrik GmbH | Nachdruck, auch auszugsweise, nur nach Rücksprache mit der Redaktion.<br />
www.gedoplan.de