Pages

Wednesday, October 23, 2013

Get Random Documents from MongoDB

While finalizing my first draft of nodecards, I stumbled on retrieving random documents from MongoDB. Nodecards is my small open source project which I usually take to try some technologies out. It is a simple Flashcard application, written in node.js. It is kind of dirty quick coded stuff, so don’t expect clean lines of code, yet. Because it was not so easy and I am not really sure that I have taken the right way I want to present you my implementation of retrieving random documents from MongoDB.

Get random within the range of a collection


To get the random document i just call count() at the collection.
After that I used skip() within the find to skip a number of documents. The skip is based on Math.random() and the previous estimated max range. Moreover I added a limit(1) to retrieve just one document. In a nutshell: My way to get random documents is by skipping documents based on a random number and limit the size to one. If you have some better and more efficient ways to do, please let me know.

Get random within a custom scope


Furthermore I had the idea to reduce the number on documents by adding a specific user defined condition. I passed in a max value that has been chosen by a user. Based on that max value I count how much elements are in the db.coll.correct array and retrieve only documents where the number of containing elements is lower than the max value. Cheers, Frank

Wednesday, November 28, 2012

Java 8 - Closures, Lambda Expressions Demystified

Project Lambda, Closures - JSR 335 (Part 1)
Lambda Expressions are probably one of the most interesting changes of the Java Language. They will add totaly different syntactical elements like the Arrow Operator, Method References, Defender Methods etc. Java gains functional aspects to reduce verbosity and improve parallel processing and stability.

Why Lambda
We all know Java Language is an object oriented programming language and we are using it with passion. But sometimes we want to pass some code to a method instead of an object. To make this happen we are implementing Callbacks. This leads us to develop verbose code and it feels not like to be well supported by Java. An additional use case is dealing with groups of data. Sometimes it is necessary to execute a specific algorithm to a group of data. Functional programming langues support things like "forAllDo". In Java you need to implement that by yourself or have to use some utility classes from third party libraries. This might be verbose and creepy.
Java 8 Blog Series

   1. Closures, Lambda Part 1 - Demystified
   2. Closures, Lambda Part 2 - Deep dive
   3. Project Jigsaw
   4. Date and Time API
   5. Annotiations, Checker Framework
   6. Concurrent Collection Framework

Setting Up Lambda
Because the development of Java 8 has not finished yet and the IDE Support is in an rudimental state, I recommand following environment set-up:

Download

Proceed following steps to set up your environment and run Java 8:
  1. Download NetBeans and Java 8 (use Links above)
  2. Unzip NetBeans and Java 8 JDK
  3. Run NetBeans (with command line param: --jdkhome YourJava8Dir)
  4. Check if your sources compile in java8

At the following I want to give you a short overview what is possible with Closures and Lambda Expressions. After that I will explain Lambda systematically to show up what happends behind the scenes.

Part 1: Lambda in Action

Anonymous Inner Classes

Classic approach
At the following snippet you can see how we use Anonymous Inner Classes in Java all the time. Adding an ActionListener to an UI Element is an usual use case. NetBeans shows a big warning: This anonymouse inner class creation can be turned into a lambda expression. If you press Alt+Enter to fix it, NetBeans will convert the source code into a lambda expression.

The Lambda way
By using lambda the source code looks like this: Notice that our code is les verbose. Furthermore it is not necessary to import "java.awt.event.ActionListener" any more. Moreover it is possible to get rid of class casting and some verbosity by using type inference: The Type of "ae" depends on the context in which it appears (Target Typing). That allows us to delete the import of "java.awt.event.ActionEvent" and we are happy to see a little less dependency. I explain more about the SAM-Types and what happens there later.
 
Method References

Lambda Expressions provide far more than dealing with anonymous methods. It is possible to adress the invocation of static and non static methods by using "::" operator.

Static methods
Non static methods
Arrays.sort will invoke the compareTo method of myObj because it has the reference of that method.
 
Virtual Extension Methods

Extension Methods alias Defender Methods alias Default Methods exists to integrate the new previous introduced features of Java 8 into Java 7 and grant backwards compatibility. All the functional features would have no use if we could not find them as a part of Java langauge core, so there has to be a way to change things like the Collection-Framework but ensure same behavior in legacy code without compile errors. Virtual Extension Methods are highly discussed because of an insane impact to the language. (e. g. interfaces with method bodys)
List is an well known interface and it became again an victim of Java language extensions. Besides some confusing abstract wildcard generic types, we can find method bodys within the interface definition. So what tells us the code now? We now have an optional implementation contract between interfaces and classes, like we have in abstract classes with implemented methods. Every implementation of List has the opportunity to overwrite "sort" but it is not obligatory. This is by far the most strange language extension of Java I have seen so far. I understand that such abominations are necessary for compatibility reasons. However I feel bad to see the highest abstraction level becomming a concrete implementation.
 
JDK integration and improvement  
 
JDK improvement starts in "java.util.functions". You can see the current content of the package at the right image. I picked some interesting interfaces that I discuss briefly.

BinaryOperator.class - combines two operands
Mapper.class - maps from class a to class b (within a chain)
Predicate.class - determines if the input object matches some criteria
Besides new packages and classes Lambda Expressions will improve existing code. Probably the collection framework will change a lot. A functional way of handling groups of data could be a big advantage. Less verbose code leads to more stability and functional processing without sideeffects makes parallel processing much easier.

Example: Collection.removeAll (with filter) Lambda way to use That's it for now. I hope you enjoyed my first part of my Java 8 Blog series. Please notice that "Lambda Part 2: Deep Dive" is currently in work. I will publish as soon as I can. I will show you some technical specifications, rules and compiler behavior to make the demystification perfect. So long.

Java 8 Blog Series

Tuesday, November 27, 2012

My Top 5 Books of 2012

This is one of my favorite post of the year to write. It gives me the opportunity to look back on some of the great books I read during the past year. Most of them are highly coupled to my current job as a Software Engineer within an architecture deparment. Nevertheless I have chosen one book into the top that is more management driven, because it is the best thing I have read so far (about project management).

No. 1  The Passionate Programmer 
Creating a Remarkable Career in Software Development
by Chad Fowler

Chad Fowler is a great "Programming Lifestyle Engineer". He tells us what we need to do to be successfull as an IT-Spezialist. The book contains tons of stunning wisdoms like the "Broken Window Theory" or statements like "You can't win if you just try not to lose." It is so common for developers to be unsatisfied because they only try not to lose. They do not push thier own skill and never try to win a knowledge race. I recommend this book to everyone who is working at the IT.


No. 2  A Guide to the Project Management Body of Knowledge 
4th Edition
by Project Management Institute

A Guide to the Project Management Body of Knowledge (PMBOK Guide) is a book which presents a set of standard terminology and guidelines for project management. The Fourth Edition (2008) is the document resulting from work overseen by the Project Management Institute (PMI). The Guide recognizes 42 processes that fall into five basic process groups and nine knowledge areas that are typical of almost all projects. By that the PMBOK Guide is a very complete systematical approach to handle project specific complexity. Moreover PMI has an practical orientation. It is made by practitioner for practitioner. And that is what I appreciate. "Hands-on" project management.





No. 3  Patterns of Enterprise Application Architecture
Martin Fowler Signature Series
by Martin Fowler

This outstanding collection of Enterprise Patterns leads into the topic of Enterprise Architecture and describes some handpicked design patterns. Each pattern describes details of how it works and when to use it, together with code examples. The main topic areas are: how to layer an enterprise application, how to organize domain logic, how to tie that logic to a relational database, how to design a web based presentation, some important principles in distributed design, and handling of what we call "offline concurrency" - concurrency that spans transactions. This book helped me a lot to understand unknown frameworks as well as designen and developing enterprise software.




No. 4  Java Puzzlers: Traps, Pitfalls, and Corner Cases
by Joshua Bloch, Neal Gafter

The topic tells everthing about the book. It is just a crazy collection of traps, pitfalls and corner cases of the Java Language 2.0. For me as an big Java Fan it has been a lot of fun to read this book and try to solve or figure out the snippets. It is as an brainteaser almost as good as the concurrency courses of Heinz Kabutz.






 


No. 5  Java Web Services in der Praxis
Realisierung einer SOA mit WSIT, Metro und Policies
by Oliver Heuser, Andreas Holubek

This is a german book that I have to mention. I used it to prepare for my "Oracle Certified Expert - Java EE 6 Web Services Developer" Exam. I was looking for informativ stuff, that could help me to learn all the things that I needed. And this is by far the best thing I found. It covers almost everything you need to know if you take it serious with Web Services and you want to use them in an enterprise environment.


Saturday, October 27, 2012

Dispatching Web Service calls (Async, Sync, OneWay)

If you decide to work with Web Services as a possible SOA implementation, you have to read and understand very much specifications. In Java you may start with JAX-WS and JAX-RS as a SOAP and RESTful way to get your things done. In this Blog I jump deep into JAX-WS to use the Dispatch API. You can see the different synchronous and asynchronous ways to send and recieve messages from a Web Service. Most important goal is to unterstand how "OneWay" dispatching works.


Setting up the environment


To keep things as simple as possible I build up a small Web Service Endpoint and Web Service Client using Java SE. (No EE Container needed) A simple JAXB annotation binded message class will be the communication artifact. This leads us to simple Szenario:
  • Java SE Web Server (Endpoint, JAX-WS)
  • Java SE Client (Dispatch, JAX-WS)
  • JAXB compatible Message Class


JAXB compatible Message Class


First we create a class that can deliver our messages. It has to be JAXB friendly, so we use  corresponding annotations to declare Java and XML Binding.

MyJaxbMessage.java


Java SE Web Server (Endpoint, JAX-WS)


Then we create a simple server instance that will respond to our client dispatcher. The server will wait 3 seconds to simulate some work.

MessagingServer.java


Java SE Client (Dispatch, JAX-WS)


Now we build up our simple client that calls the server in four different ways.

MessagingClient.java - Part 1


Dispatch a synchronous call. Blocking and waiting for server response 3 seconds.

MessagingClient.java - Part 2

Result Log

1 - Normal - Start: Sat Oct 27 20:42:44 CEST 2012
1 - Normal - End: Sat Oct 27 20:42:47 CEST 2012 response: Hello, Foo 1 from server: Sat Oct 27 20:42:47 CEST 2012



Dispatch a OneWay call. Important: The call is synchronous!

MessagingClient.java - Part 3

Result Log

2 - OneWay - Start: Sat Oct 27 20:42:47 CEST 2012
2 - OneWay - no response End: Sat Oct 27 20:42:50 CEST 2012


As shown in result log the OneWay call was synchronous. The server responded just an empty message. This is usefull to reduce network communication but will NOT make a call asynchronous. Same counts for the @OneWay annotation.


Asynchronous call with Response

MessagingClient.java - Part 4

Result Log

3 - Asynchronous - Start: Sat Oct 27 20:42:50 CEST 2012
3 - Asynchronous - End: Sat Oct 27 20:42:50 CEST 2012
 - 3.1 simulating async work
 - 3.1 simulating async work
 - 3.1 simulating async work
 - 3.1 simulating async work
 - 3.2 Asynchronous request respondet at: Sat Oct 27 20:42:54 CEST 2012 with Response: Hello, Foo 4 from server: Sat Oct 27 20:42:53 CEST 2012



Asynchronous call with Future

MessagingClient.java - Part 5

Result Log

4 - Asynchronous with Future Start: Sat Oct 27 20:42:54 CEST 2012
4 - Asynchronous with Future End: Sat Oct 27 20:42:54 CEST 2012
 - 4.1 simulating async work
 - 4.1 simulating async work
 - 4.1 simulating async work
 - Future responded asynchronous Hello, Foo 3 from server: Sat Oct 27 20:42:57 CEST 2012
 - 4.1 simulating async work
4 - Asynchronous request with Future respondet at: Sat Oct 27 20:42:57 CEST 2012 with Response: de.hinkel.jaxws.MyJaxbMessage@ee51b2c



As shown in the result logs we sucessfully made 4 diffierent kinds of Web Service calls just by invoking different methods an the Dispatch class. 1. Synchronous with response, 2. Synchronous without response, 3. Asynchronous with response, 4. Asynchronous with future. Moreover we could see how Java SE enables advanced Web Service Endpoint- and Client testing by a programmatically approach of JAXB and JAX-WS usage.

Tuesday, January 31, 2012

PMBOK und PRINCE2 - Ein systematischer Vergleich im Projektmanagement

Nachdem ich im Rahmen einer Fallstudie die beiden Themen erarbeitet habe, möchte ich einige gewonne Erkentnisse veröffentlichen. Überraschend für mich war die enorme Verbreitung und Community rund um PMBOK, die ich in dem Ausmaß nicht erwartet hatte. Vorab möchte ich noch kurz als Einführung die Begriffe PMBOK und PRINCE2 erläutern:

Grundlagen

PMBOK
Die Abkürzung steht für "Project Management Body of Knowledge" und gemeint ist in der Regel der PMBOK Guide, welcher als ein Rahmenwerk im Bereich Projektmanagement zu verstehen ist. Urheber des PMBOK Guide ist PMI, ein nicht gewinnorientierter Verband zu dem weltweit über 400.000 Mitglieder zählen. Das Ziel von PMI ist es das Berufsbild als "Projektmanagers" weiter wachsen zu lassen und die eigenen Methoden kontinuierlich zu verbessern. Neben Projektmanagement-Techniken und Vorgehensweisen die über 25 Jahre praktische Erfahrung gereift sind, gibt es wissenschaftliche Akkreditierungen von PMI, sowie Colleges, Zertifizierungen, virtuelle Netzwerke und lokale Chapter in einzelnen Regionen.

PRINCE2
Der Begriff steht für "Projects in Controlled Environments" und ist die Weiterentwicklung der PRINCE-Methode, welche Prozesse, Techniken und Komponenten im Bereich Projektmanagement anbietet. Die Historie ist ähnlich lang wie bei PMBOK, dennoch liegen die Wurzeln von PRINCE2 in der IT-Branche. Die Methode ist Eigentum der Regierung Großbritanniens und wird vor allem dort und in politisch verbundenen Ländern wie Australien, Indien oder Südafrika eingesetzt. In Deutschland gibt es diesbezüglich einen steigenden Trend. Im Jahre 2011 wurden deutschlandweit 3.500 PRINCE2 Foundation Schulungen gehalten. Diesbezüglich stellt das Cabinet Office auch ein ausgefeiltes Zertifizierungskonzept bereit.

Projekt
Das Ziel von Wirtschaftsunternehmen ist die Leistungserstellung in Form von Produkten und Dienstleistungen, sowie der dazugehörige Vertrieb. Der sich dabei wiederholende Routineprozess wird als Linienarbeit bezeichnet. Diese spiegelt sich meist in Form einer Linienorganisation wieder, welche auf den Leistungserstellungsprozess optimiert ist. Im Gegensatz dazu müssen sich Unternehmen Innovationsprozessen stellen. Diese können sehr vielgestaltig ausfallen und dabei unterschiedlich strukturiert werden. Entsprechen sie neben der Neuartigkeit noch den Kriterien der zeitlichen Begrenzung und Komplexität, können diese Aufgaben als Projekte realisiert und organisiert werden.

Projektmanagement
Die fundamentale Aufgabe von Projektmanagement ist die Sicherstellung der Erreichung von definierten Projektzielen. Dabei umfasst Projektmanagement Instrumente und Methoden zur Planung und Steuerung sowie Methoden zur Führung und Modelle zur Organisation der Projektstruktur. Die Instrumente sind dabei auf eine ganzheitliche Betrachtung des Projektes ausgelegt. Es haben sich Methoden und Erfahrungswerte im Rahmen von Projektmanagement angesammelt und erlaubten das Etablieren von verschieden Projektmanagement-Rahmenwerken wie der PMBOK und Projektmanagement-Methoden PRINCE2.


Systematischer Vergleich

Vergleichskriterien
Anlässlich der langen Historie und dem entstandenen Aufbau von fundierten Erfahrungswerten beider Methoden, werden zunächst Hintergründe und Entstehungen betrachtet. Anschließend werden die federführenden Institutionen und Umgebungen welche hinter PRINCE2 und PMBOK stehen untersucht. Beide bieten eine unterschiedliche Vielfalt von Integration und Kollaboration zum Urheber der Methode und der Community. Somit trägt die Umgebung zur Auswahl der geeigneten Methodik bei. Im Anschluss daran wird die Verbreitung und Anwendung betrachtet und um aktuelle Relevanz- und Trendanalysen ergänzt. Danach werden die inhaltlichen Kriterien von PRINCE2 und PMBOK diskutiert und die wesentlichen Merkmale herausgearbeitet. Dabei sollen Konflikte und Gemeinsamkeiten identifiziert werden. Im Abschluss der analytischen Ausarbeitung werden die Ziele beider Methoden betrachtet.

Analytische Ausarbeitung - PMBOK

Historie
Am neunten Oktober 1969 wurde die Gründung des Project Management Instituts (PMI) offiziell bekannt gegeben. Zu diesem Zeitpunkt hatte sich das Tätigkeitsfeld des Projektmanagements wenig etabliert. Mit der Erkenntnis, dass viele verschiedene Projektmanagement Methoden und Techniken angewendet werden können entwickelte sich PMI zur weltweit größten Projektmanagementorganisation. Dabei spielten freiwillige, welche Interesse an der Entwicklung des Berufsbildes im Bereich Projektmanagement hatten, eine entscheidende Rolle. Im Jahre 1981 wurde vom PMI Board of Directors ein Projekt genehmigt, welches unter anderem die Entwicklung einer Projektmanagementnorm beinhalteten sollte. Darauf folgte 1983 die Veröffentlichung einer ersten Normierungsrichtlinie für Projektmanagement. Diese Basis resultierte 1987 in dem Project Management Body of Knowledge (PMBOK) welcher nach zahlreichen Feedbacks und Erkenntnissen aus praktischer Anwendung zu einer aktualisierten Auflage führte. Diese wurde 1996 unter dem Namen „A Guide to the Project Management Body of Knowledge“ (PMBOK Guide) veröffentlicht. Es folgten in vierjährigen Zyklen weitere Ausgaben, sodass 2000, 2004 und 2008 vier Aktualisierungen mit praktischen Erfahrungen angereichert wurden. Als Resultat beinhaltet der PMBOK Guide wissen aus 25 Jahren praktischer Erfahrung im Bereich Projektmanagement.

Federführende Institutionen und Umgebung
PMI ist die federführende Institution hinter dem PMBOK Guide und agiert dabei weltweit als nicht gewinnorientierter Berufsverband. Dabei verfolgt PMI das Ziel das Thema Projektmanagement in den Bereichen der Forschung, praktischer Anwendung und Erschaffung des Berufsbildes im Bereich Projektmanagement voran zu treiben. PMI und die verbundenen Initiativen beruhen auf einer kleinen Gruppe hauptamtlicher Mitarbeiter welche für die Verwaltung zuständig sind und einer großen Mehrheit von Freiwilligen. Hierin spiegelt sich der Grundsatz von PMI wieder, welcher lautet „Für seine Mitglieder – durch seine Mitglieder“.

Verbreitung und Trend
PMI ist weltweit verbreitet und hat einen durchschnittlichen Mitgliederzuwachs von rund 20% pro Jahr. Diese Angabe basiert auf den Mitgliederzahlen ab dem Jahr 1975 mit rund 1000 Mitgliedern. 1984 betrug die Zahl bereits 10.000 und erlebte einen rapiden Anstieg, sodass bis 2009 die Anzahl der Mitglieder gegen 400.000 ging. Zur Untermalung dieser Angaben werden Stichproben von Google Trends und einem zentralen Sozial Business Internet Portal zu Rate gezogen. PMI breitet sich in Form von unterschiedlichen Einrichtungen aus. Dazu gehören die Chapter, welche lokale Ortsgruppen sind und für die Mitglieder örtlich erreichbare Fachkräfte beinhalten. Es existieren weltweit über 250 aktive PMI Chapter in über 70 Ländern. Zusätzlich existieren virtuelle Communities, welche PMI für die Bereitstellung einer reichhaltigen Wissensbasis konzipiert hat. Zur Unterstützung einer effektiven Kommunikation unter den Mitgliedern und Stakeholdern stellt PMI Regionalzentren für die Regionen Asien, Indien und EMEA. Entsprechend der Verbreitung gibt es neben der englischen Fassung des PMBOK Guide Übersetzungen in zehn weitere Sprachen. Darüber hinaus verfügt PMI über einen speziellen Forschungsbereich in den bis zum Jahr 2011 an die 16 Millionen US Dollar investiert wurden um innerhalb einer aktiven Projektmanagementforschung mehr als 350 Veröffentlichungen tätigen zu können und den eigenen Standard auch wissenschaftlich reifen zu lassen. Dazu passen auch die PMI spezifischen Colleges, welche sich dem Schwerpunktthema Projektmanagement gewidmet haben, sowie die wissenschaftliche Akkreditierungen an dem „PMI Global Accreditation Center for Project Management“ (GAC). Um hochwertige Trainings zum Thema Projektmanagement und PMBOK sicherzustellen, unterstützt PMI auch ein „Netzwerk registrierter Trainingsanbieter“ (R.E.P.).

Inhaltliche Kriterien
Der PMBOK Guide beinhaltet 42 Projetmanagementprozesse. Dabei handelt es sich um bewährte Verfahren, welche in Projekten angewendet werden können. PMI fasst diese Prozesse in fünf Prozessmanagementgruppen zusammen: Initiierung, Planung, Ausführung, Überwachung/Steuerung und Abschluss. Ein zentraler Aspekt ist die Ergänzung der Prozesse um eine Struktur, welche aus neun Wissensgebieten besteht. Alle Prozesse werden hinsichtlich dieser Wissensgebiete ausführlich dokumentiert. Dabei werden bezüglich der Prozesse jeweils die Eingangswerte, sowie die Werkzeuge und Techniken zur Durchführung und die Ausgangswerte und Resultate betrachtet. Folgende Tabelle stellt alle Prozesse, sowie deren Tätigkeiten innerhalb der jeweiligen Wissensgebiete dar.

Wissensgebiet Initiierung Planung Ausführung Überwachung/ Steuerung Abschluss
Integrationsmanagement Projektauftrag entwickeln Projektmanagentplan entwickeln Projektdurchführung lenken und managen Projektarbeit überwachen und steuern Projekt oder Phase abschließen
Inhalts- und Umfangsmanagement Anforderungen sammeln, Inhalt und Umfang Definieren, Projektstrukturplan erstellen Inhalt und Umfang verifizieren, Inhalt und umfang steuern
Zeitmanagement Vorgänge festlegen, Vorgangsfolge festlegen, Ressourcen für Vorgänger schätze, Vorgangsdauer schätzen, Terminplan entwickeln Terminplan steuern
Kostenmanagement Kosten schätzen, Budget festlegen Kosten steuern
Qualitätsmanagement Qualität planen Qualitätssicherung durchführen Qualitätslenkung durchführen
Personalmanagement in Projekten Personalbedarfsplan entwickeln Projektteam zusammenstellen, entwickeln, managen
Kommunikations- management Stakeholder identifizieren Kommunikation planen Informationen verteilen, Stakeholder Erwartungen managen Projektleistung berichten
Risikomanagement Risikomanagement planen, Risiken identifizieren, Qualitative Risikoanalyse durchführen, Quantitative Risikoanalyse durchführen, Risikobewältigungsmaßnahmen planen Risiken überwachen und steuern
Beschaffungsmanagement Beschaffung planen Beschaffung durchführen Beschaffung verwalten Beschaffung abschließen

Ziele
Der PMBOK Guide erhebt nicht den Anspruch eines dogmatischen Projektmangement-Rezeptbuchs. Vielmehr sollen die Prozesse und Wissensgebiete von Projektleitern und Projektteam zielgerichtet ausgewählt werden, da jedes Unternehmen eine einzigartige Kultur hat und unterschiedlichen Herausforderungen gegenübersteht. Hierbei sollte ausreichend Wissen über die Prozesse aufgebaut werden und auf Erfahrung anderer zurückgegriffen werden können. Die von PMI etablierte Community sollte hier Anwendung finden. Ein maßgebliches Ziel von PMI ist es dabei den Beruf im Bereich Projektmanagement weiter voran zu treiben und die im PMBOK Guide enthaltenen Methoden kontinuierlich zu verbessern. Dabei werden Erfahrungswerte aus Praxis sowie aus wissenschaftlichen Untersuchungen berücksichtigt.

Analytische Ausarbeitung - PRINCE2

Historie
Im Jahre 1989 veröffentlichte die “Central Computer and Telecommunications Agency” (CCTA) einen Standard im Bereich Projekt Management Methodik mit dem Namen PRINCE. Nachdem die CCTA umbenannt wurde in „Office of Government Commerce“ (OGC), zog diese im Juni 2010 als britische Regierungsinstitution in das Cabinet Office. PRINCE basiert auf der Projekt Management Methode PROMPT, welche 1979 von der CCTA übernommen wurde, da ein Nutzen für die Projekte der britischen Regierung im informationstechnischen Bereich erwartet wurde. Die britische Krone hält bis heute die Rechte an PRINCE und PRINCE2. Im Jahre 1996 wurde in Zusammenarbeit mit einem virtuellen Komitee – bestehend aus 150 Unternehmen – der PRINCE2 Standard verabschiedet. In den Jahren 2002 und 2005 gab es zwei Aktualisierungen der Methode. Dies war das Ergebnis einer Zusammenarbeit mit einer internationalen PRINCE2 Gemeinschaft. Um Projektmanagern ein besseres Toolset an die Hand zu geben und Projekte im zeitlichen und wirtschaftlichen Rahmen hochwertig fertig zu stellen, wurde im Jahr 2009 PRINCE2 einer größeren Aktualisierung unterzogen, welche die Methode um sieben Prinzipien erweiterte.

Federführende Institutionen und Umgebung
PRINCE2 ist eine geschützte und eingetragene Handelsmarke des Cabinet Office der britischen Regierung. Diese treibt die Weiterentwicklung zusammen mit der internationalen PRINCE2 Gemeinschaft voran. Neben Einrichtungen der britischen Regierung existiert weltweit eine Vielzahl von unabhängigen Institutionen, mit dem Ziel in der jeweiligen Region PRINCE2 weiter zu etablieren und reifen zu lassen. Oft handelt es sich dabei um nicht gewinnorientierte Vereine, sondern Gemeinschaften mit rein fachlichem Interesse an der Thematik. Darüber hinaus existiert ein ausgefeiltes Zertifizierungskonzept, welches eine Umgebung mit Prüfungen, Schulungen und Literatur mit sich bringt. Insbesondere in Großbritannien werden solche Zertifizierungen explizit bei der Einstellung von Projektmanagern verlangt. Aber auch in anderen Ländern wirken sich diese Titel positiv auf das eigene Profil aus.

Verbreitung und Trend
In Großbritannien gilt PRINCE2 als De-Facto Standard für Projektmanagement und wird darüber hinaus in über 50 Ländern weltweit angewendet. Im Jahr 2009 erschein eine größere Aktualisierung der PRINCE2 Methode. Insbesondere im informationstechnischen Bereich hat sich PRINCE2 etabliert, da dort die Wurzeln der Methode liegen. Dennoch ist dem Cabinet Office gelungen über diese Grenze hinauszuwachsen und in anderen Branchen und Bereichen PRINCE2 Projekte erfolgreich durchzuführen. Länder welche mit Großbritannien politisch verbunden sind, setzen ebenfalls die PRINCE2 Methode schwerpunktmäßig ein. Deswegen ist die Akzeptanzrate in Australien, Indien und Südafrika hoch. In Jahren 2008 bis 2011 stieg allerdings auch die Verbreitung der Methoden in den europäischen Ländern. Dementsprechend wurden in Deutschland im Jahr 2011 an die 3.500 PRINCE2 Foundation Schulungen absolviert. Bis Ende 2011 wurden weltweit mehr als 900.000 PRINCE2 Zertifikate ausgestellt. Jährlich kommen ca. 70.000 neue hinzu. PRINCE2 ist offiziell in 10 Sprachen verfügbar.

Inhaltliche Kriterien
Die PRINCE2 Methode ist in drei Arten von Strukturelementen ausgeteilt: Prozesse, Komponenten und Techniken. Die Prozesse umschließen Aktivitäten und Rollen mit dem Ziel festzulegen welches Ergebnis zu welchem Zeitpunkt von wem durchgeführt werden soll. Die Komponenten liegen als Querschnittsthemen auf den Prozessen und beinhalten Aspekte wie Pläne, Risiko und Qualität. Um dieses zu realisieren beschreibt PRINCE2 einen Satz von Techniken, welche als reine Vorschläge verstanden werden und gegen andere und bevorzugte Techniken ersetzt werden können. Es muss allerdings sichergestellt werden, dass die Komponentenziele dabei eingehalten werden. Die folgende Übersicht zeigt das fest definierte Fundament von PRINCE2, bestehend aus acht Prozessen, acht Komponenten und drei Techniken:

Techniken
  • Produktgrundplanung
    • Produktanalyse, Produktbeschreibung, Produktflussdiagram
  • Qualitätsbewertung
    • Vorbereitung, Bewertung, Nachfolge
  • Änderungskontrolle
    • Erfassung, Protokollierung, Abschätzung, Endscheidung
  • Projektabwicklungsstruktur
    • Managementakte, Spezialisierungsakte, Qualitätsakte
Komponenten
  • Organisation
    • Beschreibung von Rollen u. Struktur
  • Planung
    • Produkte, Aktivitäten, Ressourcen
  • Steuerung
    • Management, Team, Qualität
  • Phasen
    • Management und technische Phasen
  • Risikomanagement
    • Risikoabschätzung und Management
  • Qualität der Projektumgebung
    • Qualität der Anforderungen und Rückmeldungen
  • Konfigurationsmanagement
    • Produktüberwachung und Dokumentation
  • Änderungssteuerung
    • Erfassung und Beurteilung
Prozesse
  • Projektvorbereitung (SU)
  • Projektinitiierung (IP)
  • Projektlenkung (DP)
  • Phasensteuerung (CS)
  • Management der Produktlieferung (MP)
  • Phasenübergangmanagement (SB)
  • Projektabschluss (CP)
  • Planen (PL)

Ziele
Das Ursprüngliche Ziel von PRINCE2 große IT-Projekte zu managen hat sich erweitert. Die PRINCE2 Methode findet Anwendung in Projekten aller Branchen und wird regelmäßig durch neue Erkenntnisse angereichert. Dabei werden Grundsätze und fundamentale Komponenten und Prozesse definiert. Dynamik wird insbesondere bei der Auswahl von konkreten Techniken gewünscht. Hier möchte PRINCE2 nicht zu dogmatisch werden, sondern einen Zielorientierten Rahmen schaffen der es Projektmanagern ermöglicht auch komplexe Projekte fristgerecht, innerhalb des Budgets und hochwertig fertig zu stellen. Zusätzlich soll die Methode weltweit weiter etabliert werden. Dazu werden Zertifizierungen, Schulungen und Vereine außerhalb Großbritanniens willkommen geheißen.

Zusammenfassende Gegenüberstellung

Historie
PMBOK PRINCE2
  • 25 Jahre praktische Erfahrung
  • branchenunabhängig
  • 22 Jahre praktische Erfahrung
  • Schwerpunkt: IT-Projekte

Federführende Institution und Umgebung
PMBOK PRINCE2
  • PMI (weltweiter Berufsverband)
  • nicht Gewinnorientiert
  • Colleges
  • Wissenschaftliche Akkreditierungen
  • Lokale Chapter
  • Gehört der Regierung Großbritanniens
  • Weltweit unabhängige Institutionen vorhanden
  • Ausgefeilte Zertifizierungsprogramme

Verbreitung und Trend
PMBOK PRINCE2
  • Weltweit etabliert
  • 20% Mitglieder Zuwachs pro Jahr
  • 400.000 Mitglieder im PMI
  • 250 aktive PMI Chapter
  • In über 70 Länder vertreten
  • Virtuelle Communites
  • mehr als 350 wissenschaftliche Veröffentlichungen
  • De-Facto Standard in Großbritan-nien
  • Hohe Verbreitung in politisch ver-bundenen Ländern zu Großbritan-nien
  • Tendenziell weniger verbreitet in Europa
  • Weltweit 900.000 PRINCE2 Zerti-fikate ausgestellt
  • In Deutschland wurden 2011 3.500 PRINCE2 Foundationen Schulun-gen absolviert

Um die Zahlen der analytischen Ausarbeitung zu untermalen wurden Stichproben aus den online Quellen Google Trends und der webbasierten Business Plattform XING verwendet, welche Informationen über Stellengesuche und Fähigkeiten ermitteln lässt.

Google Trends - Stichprobe
Die suche innerhalb von Google Trends nach den Begriffen „PMBOK“ und „PRINCE2“ führt zur Grafik welche in Abb. 1 dargestellt ist. Der dabei auf der Y-Achse verwendet „Search Volume Index“ ist ein von Google festgelegter Wert, der die aktuellen Suchbegriffe in Relation zum Gesamtvolumen der Suchanfragen setzt. Entscheidend ist demnach der Trend. Dabei ist zu erkennen, dass PMBOK und PRINCE2 einen ähnlich abnehmenden Trend aufweisen. Zusätzlich kann festgestellt werden, dass der Index zum „News Reference Volume“ insbesondere bei PRINCE2 in den Jahren 2009 und 2010 auffällig angestiegen ist. Der „News Reference Volume“ gibt Auskunft darüber wie oft der Suchtbegriff – in dem Fall PRINCE2 – in den Google News Themen aufgetreten ist. Nach Angaben von Google tauchte der Begriff „PRINCE2 2009 Launched“ zu diesem Zeitpunkt vermehrt auf.


Abbildung 1: Google Trends, Stand 28.01.2012


XING - Stichprobe
Neben dieser Stichprobe ergab eine Recherche in XING folgendes Ergebnis:
PMBOK PRINCE2
Anzahl Mitglieder mit Begriff im Profil Mehr als 10.000 Mehr als 10.000
Anzahl Jobs 9 13
Anzahl Gruppen 29 41
Anzahl Unternehmen 210 143
Anzahl Events 79 101
Abbildung 2: XING Recherche, Stand 28.01.2012

Beide Methoden sind ebenfalls hier auf Augenhöhe. Zu erkennen ist jedoch ein größeres Angebot an Gruppen und Events im Bereich PMI, was der hohen Verbreitung des Gemeinschafts und Community Gedankens der Institution entspricht. Wenig aussagekräftig ist hier die ungenaue Anzahl der Mitglieder.


Inhaltliche Kriterien
PMBOK PRINCE2
  • Satz von 42 Prozessen, welche für sieben Wissensgebiete eingesetzt werden sollen
  • Nicht alle müssen eingesetzt wer-den. Der Projektleiter und das Team entscheiden.
  • Drei Arten von Strukturelementen: Prozesse, Komponenten, Techniken.
  • Insbesondere die Techniken können ausgetauscht werden.

Ziele
PMBOK PRINCE2
  • Kein Rezeptbuch, sondern Anleitung.
  • Berufsbild im Bereich Projektmanagement vorantreiben.
  • Weiter wachsen und Erfahrungen sammeln.
  • Die Schaffung eines Rahmens
  • Vorschläge zu Techniken gegeben
  • Weltweite Verbreitung vorantrei-ben


Schlussbetrachtung
Sowohl PRINCE2 als auch PMBOK glänzen mit einer ausführlichen Historie. Beide basieren auf einem Fundament reichhaltiger Erfahrungen in Großprojekten. Besonders im IT-Bereich ist hier PRINCE2 aufgrund seiner Wurzeln ernst zu nehmen. PMBOK hingegen ist unter der Federführung von PMI und einer großen weltweit agierenden Gemeinschaft vertreten. Wenn der Wunsch an aktivem Austausch und Eingliederung in die Welt des Projektmanagements besteht, kann hier sogar bis auf Tätigkeiten in wissenschaftlichen Bereichen zurückgegriffen werden. PRINCE2 und PMBOK unterscheiden sich in einigen Details, Begriffsdefinitionen und Handlungsempfehlungen. Diese Unterschiede sehen Snijders, Wuttke und Zandhaus also Argumente PMBOK nicht mit anderen Methoden zu verbinden. Es mache „keinen Sinn die [Projektbeteiligten] mit verschiedenen Methoden und unterschiedlichen Hintergründen sowie Definitionen zu konfrontieren, und dann auch noch von jedem Einzelnen eine eigene Integrationsübung zu verlangen.“ Dies könne zu Fehlern führen, Missverständnisse oder Irritationen verursachen. Entgegen dieser Meinung wäre rein technisch allerdings eine Integration mit PRINCE2 denkbar, da diese Methode es willkommen heißt die vorgeschlagenen Techniken durch andere zu ersetzen.



Literaturverzeichnis

Monographien
  • Kraus G., Westermann R. (2010): Projektmanagement mit System, 4. Aufl., Wiesbaden (2010)
  • Snijders P., Wuttke T., Zandhuis A. (2011): Eine Zusammenfassung des PMBOK Guide, 1. AUfl., Zaltbommel (2011)
  • Heemst G., Hedeman H., Bon M. (2006): Project Management Based on PRINCE2, 3rd Edition, 3. Aufl., Van Haren (2005)
  • Köhler P. (2006): PRINCE2, Heidelberg 2006

Internetquellen
  • prince2.com (2012), What is PRINCE2?, URL: http://www.prince2.com/what-is-prince2.asp, Abruf am 29.01.2012
  • projectsmart (2012), 2009 PRINCE2 Major Revision, URL: http://www.projectsmart.co.uk/history-of-prince2.html, Abruf am 29.01.2012
  • prince2-deutschland (2012), Verein, URL: http://www.prince2-deutschland.de/content/verein, Abruf am 29.01.2012
  • copargo (2012), PRINCE2 ist ein "shooting star", URL: http://www.copargo.de/de/downloads/prince2-details/verbreitung, Abruf am 30.01.2012
  • Google (2012), Trend, URL: Google Trends, http://www.google.com/trends/?q=pmbok,+prince2&ctab=0&geo=all&date=all&sort=0, Abruf am 28.01.2012
  • XING (2012) , Suche, URL: http://www.xing.com, Abruf am 28.01.2012

Tuesday, December 13, 2011

Spring Web and SmartGWT integration

While working on my current open source project called "openKanban", I got surprised how easy and smooth integration between SmartGWT and Spring Web was.

Server (Spring Web)

I use standard Spring Web Dispatcher Servlet with some controller on server side, which I register by using a component scan. Hence, this is all I need except a scan entry in the applicationContext.xml:

BoardController.java (class header)

To get into action I need a simple Method which is configured by the standard Spring Request Mapping and Request Path Parameter:

BoardController.java (POST method)

There is nothing special about "@RequestMapping" and "@PathVariable". In combination with the class header mapping annotation it means:

Listen to all HTTP-POST requests that address the rescource:
/service/board/[0-n]/activity/add
take the Parameter [0-n] out of the Uri and put it into a variable called parentBoardId.

A little bit more magic comes into play when you watch that method returning a DTO-Object serialized as a JSON String. And that's what SmartGWT or any other requesting client that is calling this method gets. There is no need to configure JSON at any application context. Spring itself checks the classpath and if it finds a JSON serializer, @ResponseBody will return JSON.


I do not use Spring Security in openKanban. To keep it small and simple I decided to use the "JSR-299 CDI Interceptors for Spring Bean"-Implementation and run a self-made @SecurityInterception on any controller method to check if the user is authenticated. I will provide more information about this interceptor in a further posting. For now it's enough to know, that every controller method will be checked for authentication.


In order to demonstrate SmartGWT DataBinding integration I add another HTTP-GET method example:


BoardController.java (GET method)

Summary

There are two available rescources:
  1. /service/board/[0-n]/activity/add (on POST)
  2. /service/board/[0-n]/contact/get (on GET)
Both will call a method that is returning an "automagically" serialized JSON String.

Client (SmartGWT)

SmartGWT provides a very versatile communication. The following example will show you what worked really great in the scope of my project. In this context I preferred using two different kinds of request usage:
  1. Configurated DataBinding on SmartGWT
  2. Using standard GWT RequestBuilder

Configurated DataBinding on SmartGWT

Any SmartGWT widget that implements the interface DataBoundComponent provides a databinding mechanism. In this case it is necessary to define a DataSource, corresponding DataSourceFields and wire it together:

BoardContactTileGrid.java (constructor)

TileGrid is a DataBoundComponent. That's why it is possible to add a DataSource. As usual SmartGWT offers you some configurations. This widget will automatically fetch data when the object of the widget is rendered at the client. That means that it is necessary to have a correct DataSource configured at object creation time.
Let's see what the DataSource looks like:

BoardContactDS.java (constructor)

This is a simple DataSource configuration. After rendering the corresponding widget, an autofetch will trigger a HTTP-GET request to the configured URL. The server response has to be serialized as JSON. We discussed that already in the server section of this posting. It is possible to change the required response to REST, XML or some other custom format. Because I did not need a wsdl contract I decided to use a simple JSON format.

Using standard GWT RequestBuilder

The com.google.gwt.http.client.RequestBuilder seems powerful but some lines of code are necesarry to get data serialized and send to the server. A request is built in four steps:
  1. Creation of RequestBuilder object and passing the HTTP-Method and URL
  2. Configure HTTP-Header
  3. Configure HTTP-Parameters
  4. Send Requests and add a Callback
As there are many different requests needed and as they look pretty much the same, abstraction and generic are very helpful in order to reduce duplicate lines of code. So instead of having around 40 LoC on every call I encapsulated it down to this:

Two lines of Code for a request

This leads us to the following request:
  1. uri: service/user/remove/
  2. parameters: contactMail=stop@hammertime.de&id=42

This works for self defined content as well as for whole objects.


Two lines of code for a request

As you can see I used two ways to wrap all the HTTP stuff. It is either possible to pass static URL parameters or to pass complete Data Transfer Objects (DTO's) to the PreparedRequest to get things done. This has been enabled by using generic typedef, varargs and polymorphism:

PreparedRequest conctructor for static parameters

Java 5 varargs provides flexibility to add as much parameter as I like. The generic DTO to string serialization looks like:

PreparedRequest conctructor for DTO's

The PreparedRequest parameter needs to be typed as a subclass of RequestParameterMap. This relationship enables a polymorphic call to the method "valuesToMap()" which has to be implemented by every DTO.

RequestParameterMap

For a better understanding find below a simple example of an implementation:

ActivityDTO valuesToMap implementation

Although I implemented some level of abstraction, some weak points still remain. If there is a new DTO attribute, it must be added to the valuesAsMap method and there is no "compiletime safety" to make sure it has not been forgotten. Because I could not use Java Reflection API on client side code (remember I am talking about code that is converted to JavaScript), things may get a little bit harsh. Anyway I am still positive about an easy, robust and practicable integration between Spring Web and SmartGWT over HTTP.

Saturday, November 19, 2011

Ceylon - Eine neue Sprache für die JVM

Ceylon befindet sich aktuell in der Entwicklung aber ein Blick auf den Sprachumfang gewährt einem jetzt schon tiefe Einblicke in Konzepte und Funktionsweisen. Außerdem sind Diskussionen und Entscheidungen zu konkreten Elementen der Sprache transparent. Die Ziele der Entwickler von Ceylon sind hoch gesteckt. Nach eigenen Angaben liegt der Fokus von Ceylon auf:

  1. Eleganz
  2. Lesbarkeit
  3. Typsicherheit
  4. Meta-Programmierung

Die Programmierung soll wesentlich einfacher sein als mit Java. Besonders in Bereichen von generischer Typsicherheit räumt Ceylon auf. Die Sprache ist mit funktionalen Bestandteilen angereichert, verliert sich aber nicht in verketteten Operationen ohne Seiteneffekte sondern versucht das Beste aus den Welten der Objektorientierung und der funktionalen Programmierung zu vereinen.


Entwicklung

Aktuell existiert ein Plug-In für Eclipse, sodass diese IDE jetzt schon für Ceylon zur Verfügung steht:

Obwohl man bereits einfache Applikationen schreiben kann, stolpert man früh auf kleinere Bugs in der Sprache und Ungereimtheiten in der IDE. Beispielsweise funktioniert das Autoboxing und -unboxing derzeit nicht konsistent.
Derzeit wird kein offizieller Release-Termin für Ceylon veröffentlicht. Konkrete zeitliche Angaben über die Erreichung von Meilensteinen fehlen ebenso. Inhaltlich ist jedoch ausreichend Transparenz vorhanden um sich ausmalen zu können wie zukünftig Ceylon aussehen wird:

Wörterbuch

Java               Ceylon
implements         satisfies
public             shared (kontextabhängig)
protected          - 

private            -
abstract           formal (Attribute/Methoden)


Merkmale (Ceylon vs Java)

Im Folgenden habe ich die aus meiner Sicht interessantesten Merkmale von Ceylon zusammengefasst.

Keine NullPointerException:
  • Typsicherheit bei null
  • Nullwerte sind Inkarnationen der Klasse Nothing
  • Mögliche null-Werte müssen den Datentyp bei der Deklaration erweitern:  
    • String? vorname  = "Frank"
    • String|Nothing vorname = "Frank";
  • Korrespondierendes exists-Konstrukt
    • if (exists vorname) {...}

Nur ein Zugriffsmodifikator: shared
  • Gültigkeitsbereich von shared ist dynamisch
  • Kontextabhängig Funktionsweise
  • Klassen sind standardmäßig Paketlokal, shared muss explizit deklariert werden
  • Eine shared Klasse kann keine Paketlokalen Attribute besitzen
  • Protected kann nicht abgebildet werden

Enumerierte Ableitungen:
  • Es kann über enumerierte Subtypen eine direkte Verknüpfung der Basisklasse zu der Anzahl der entsprechenden Subtypen hergestellt werden
  • Dadurch wird zur Compile-Zeit sichergestellt, dass alle Ableitungen in polymorphen Aufrufen explizit im Code behandelt werden 
Beispiel:
abstract class Tier() of Hund | Katze | Maus { ... }
...
void sagHallo(Tier tier) {
    switch (tier)
    case (is Hund) { //wuff... }
    case (is Maus) { //pief... }
    // compile Error: Katze muss ebenfalls behandelt werden
}
 

Attribute:
  • Können einfache Zustände halten
  • Können getter/setter implizieren ohne sie explizit zu deklarieren 
  • Sind polymorph und überschreibbar
  • Können in Verbindung mit Closures verwendet werden

Initialisierung:

  • Fokus liegt auf einem einheitlichen Initialisierungs Look-And-Feel von Klassenattributen und lokalen Variablen. (anders als in Java)
  • Keine Konstruktoren, Initialisierung wird aufgeteilt in:
    • Initialisierungsparameter (werden hinter den Klassennamen geschrieben)
    • Initialisierungscode wird direkt in die Klasse geschrieben

Frage: Wie führe ich unterschiedliche Initialisierungen durch z.B. für Testklassen die in Java über den Good Citizen Konstruktor abgebildet werden?
"Am Easy to test- all dependent object I use can be passed to me, often in my constructor (typically as Mock Objects)."

Funktionale Ausrichtung:
  • Klassendeklarationen ähneln eher Methodendeklarationen
  • Eine Klasse kann auch als eine Funktion verstanden werden welche ein Closure mit den eigenen lokalen Variablen liefert.

Type Aliase und Type Inferenzen
  • Für lokale Variablen kann der Typ geschlussfolgert werden
    • value tiere = LinkedList { "Hund", "Katze", "Maus" }; 
  • Typedefs sind möglich, sollten aber sparsam verwendet werden
    • interface tiere = List<Tier>;

High-Order functions
  • Funktionen können andere Funktionen als Parameter entgegen nehmen
    • void fuettern(Essen essen, void fressen())

Vereinfachte Generics
  • Keine Java Wildcards
  • Keine Raw-Types
  • Vergegenständlichte Deklaration

Operanden Polymorphismus
  • Es existiert eine feste Zuordnung von Operanden zu Interfaces
    • == zu Equality
    • < zu Comparable
    • * zu Numeric
  • Alle Klassen, welche Equality implementieren können mit == verglichen werden


Fazit

Die Typsicherheit bei Nullwerten und die Wertsicherheit bei Subklassen sind auf den ersten Blick sehr interessant. Ob die Generics wesentlich einfacher geworden sind, ist meiner Ansicht nach fraglich, da die "declaration-site variance" von Ceylon - Generics um eine neues Konzept erweitert.
Den Ansatz shared als einzigen Zugriffsmodifikator zu verwenden, betrachte ich ebenfalls skeptisch. In Java ermöglichen public, protected, default und private das Setzen von feineren Nuancen und damit Designabsichten ausdrucksstark zu untermalen. Deshalb geht die gewonnene Dynamik von shared auf kosten der ausdrucksstarken Lesbarkeit. Der Reflection API von Java stellt Ceylon ein typsicheres Meta-Programmiermodell entgegen, welches ich als weiteres Highlight sehe und für mich die größte Stärke der Sprache bedeutet. So ist es beispielsweise möglich Objektinstanziierungen oder Methodenaufrufe zu "intercepten" ohne Code zu implementieren welcher nach entsprechenden Interecption Annotationen sucht. Das Metamodell von Ceylon erledigt das "out of the box" zur Class-Loading-Time.