Recent Content

Microservice Architecture, anligning principles, practices, and culture

posted on

To stay on the right track with microservices, I wanted to revisit the philosophy and organizational recomendations on how to do them right. After reading Building Microservices in april this year, I got Microservice Architecture, aligning principles, practices, and culture by Irakli Nadareishvili et al.; O'Reilly Media, Inc., 2016.

The book can be read on one week-end as the content is very well condensed to 118 pages.

What did I get from the book?

The book provides a lot of information on the culture and organizational requirements to successfully implement a microservice architecture.

[C]ulture is perhaps the most intangible [domain] yet may also be the most important. We can broadly define culture as a set of values, briefs, or ideals that are shared by all of the workers.

Microservice Architecture, page 29

It was very interesting to me to compare the presented observations with how we are doing microservices at work. One thing was especially interesting for me, as I did not read of this before, was the mention of the paper The Social Brain Hypothesis, 1998 in which Robin Dunbar writes about observations that there are several sizes of groups, that work better then others.

[T]he various human groups that can be identified in any society seem to cluster rather tightly around a series of values (5, 12, 35, 150, 500, and 2,000).

The Social Brain Hypothesis, Robin I. M. Dunbar, 1998

I can definetly recommend this book to everyone that already does microservices, or that plans to implement them. It does not present nor recommend any specific software product, but talks about the social and organizational requirements to succeed with this type of architecture. And it notes that they are not always the right way to go. In the book there is also a detailed list of further sources to deepen on various aspects of the topic.

Links to the book

Developing Web Components, UI from JQuery to Polymer

posted on

It's hard to find sources how to do front-end micro-services in a single page application (SPA). Having a single front-end that faces the user makes it hard to impossible to exploid the full power of going micro-services in the back-end. For every new function you cannot just deploy the corresponding service, but you have the dependency to update and redeploy the service as well.

So I was looking around how to go micro in an SPA. One of the ideas I found on the web was to do so using web components. To evaluate this idea as someone working mainly on the backend I thought I should get some literature and bought the book Developing Web Components by Jarrod Overson and Jason Strimpel, O'Reilly Media, Inc., 2015.

What did I get from the book?

The end-to-end theme of the book is to develop a dialog box web component. As a familar entry to the component it starts doing so in JQuery. Afterwards the component gets ported to using plain HTML5 APIs (templates, shadow DOM, custom elements, and imports). In the last part of the book, it gets converted to using Polymer. This makes the implementation much cleaner and easier to do.

As I don't do much front-end development it was very interesting to see what is possible in modern browsers by now. I like how web components bring back some of the strengts of HTML: marking the structure and semantics of a text instead of building interfaces by just styling a bunch of <div/>s. I like to see hightly semantic pages on the web. But I see so many web developers only taking care of the visual impression in a browser. Therefore it's always a requirement, that the way to get there also results in the work being done easier. The ease of using components built with polymer may achieve this goal.

But pertaining to my initial motivation to read the book, I have to say, that I didn't find a good match for doing micro-services in using web components.

Recommended links

VDSL von der Telekom mit IPv6 und Debian

posted on

IPv6 is the new normal

Meine letzten IPv6-Tunnel werden langsam überflüssig. Seit letzter Woche haben wir auch im Büro natives IPv6. Die Telekom hat uns auf einen NGN-Anschluss umgestellt.

Setup

IPv6 aktivieren

Kurz zusammengefasst

Für den IPv6-Zugang muss der pppd IPv6 auf der PPP-Verbindung aktivieren. Die Telekom benutzt dann Router-Advertisements (radv) um dem ppp0-Device eine IPv6-Adresse zu geben. Soll IPv6 im LAN weiterverteilt werden, bekommen wir Präfixe hierfür über Präfix-Delegation per DHCPv6. Letzteres kann aber nicht als Ersatz für die Router-Advertisements genutzt werden, da die Telekom nur Präfixdelegation darüber macht.

pppd konfigurieren

Nachdem der IPv4-Internetzugang konfiguriert ist muss nur noch IPv6 im pppd aktiviert werden. Hierzu muss an das Ende von /etc/ppp/options eine Zeile +ipv6 eingefügt werden.

echo "+ipv6" >> /etc/ppp/options

poff
pon dsl-provider

Das ppp0-Device sollte jetzt eine link local IPv6-Adresse haben (fe80:…). Wir können das mit ifconfig ppp0 kontrollieren.

IPv6-Adresse per Router Advertisement (radv) erhalten

Wir benutzen das Linux-System als Router. Wenn wir das Routing von IPv6-Traffic einschalten bezieht Linux seine IPv6-Adressen normalerweise nicht mehr automatisch. Über den Config-Wert 2 für die Einstellung accept_ra lässt sich dies jedoch überschreiben:

echo net.ipv6.conf.all.forwarding = 1 > /etc/sysctl.d/01-ipv6-forward.conf
echo net.ipv6.conf.ppp0.accept_ra = 2 >> /etc/sysctl.d/01-ipv6-forward.conf

echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
echo 2 > /proc/sys/net/ipv6/conf/ppp0/accept_ra

Wir müssen jetzt gegebenfalls auf das nächste Router Advertisement der Telekom warten. Dies kommt nur alle fünf Minuten. Haben wir diese Gedult nicht, können wir mit poff und pon dsl-provider uns nochmals neu einwählen. Danach sollte unser Interface ppp0 auch eine öffentliche IPv6-Adresse haben (2003:…).

Präfixe für die Subnetzs von DHCPv6

Als DHCPv6-Client habe ich dibbler-client und wide-dhcpv6-client ausprobiert letzterer war in der Lage deutlich schneller zu starten und zu stoppen, so dass ich mich für die WIDE-Implementierung des DHCPv6-Clients entschieden habe:

apt update
apt install wide-dhcpv6-client

Folgende Konfiguration habe ich als /etc/wide-dhcpv6/dhcp6c.conf angelegt:

interface ppp0 {
        send ia-pd 0;
};

id-assoc pd 0 {
        prefix-interface eth1 {
                sla-len 8;
                sla-id 1;
        };
        prefix-interface eth2 {
                sla-len 8;
                sla-id 2;
        };
};

Mit dieser Konfiguration wird ein Präfix über das Interface ppp0 vom DHCPv6-Server der Telekom angefordert. Dieses Präfix wird dann benutzt um Subnetze für eth1 und eth2 abzuleiten. Hierzu wird das von der Telekom erhaltene Präfix um 0001 verlängert für eth1 (sla-id 1) und entsprechend um 0002 für eth2.

Abschließend muss der wide-dhcpv6-client noch über die Datei /etc/default/wide-dhcpv6-client für das Interface ppp0 aktiviert werden:

# Defaults for dhcpv6 client initscript
# Used by /etc/init.d/wide-dhcpv6-client

# Interfaces on which the client should send DHCPv6 requests and listen to
# answers. If empty, the client is deactivated.
INTERFACES="ppp0"
service wide-dhcpv6-client restart

Jetzt sollten auch unsere Netzwerkinterfaces eth1 und eth2 IPv6-Adressen (und zugehörige Subnetze /64) erhalten haben.

Den Rechnern im LAN eine IPv6-Adresse zuweisen

(Genauer: Den Rechnern im LAN ihr Präfix mitteilen, so dass diese sich eine IPv6-Adresse geben können.)

Wir müssen auf dem Linux-Router hierzu selbst Router Advertisements auf unseren LANs verschicken. Dies geschieht mit dem Router Advertisement Daemon radvd:

apt install radvd

Für diesen Dämon legen wir die Konfigurationsdatei /etc/radvd.conf an:

interface eth1
{
        AdvSendAdvert on;
        prefix ::/64
        {
                AdvOnLink on;
                AdvAutonomous on;
                AdvRouterAddr on;
        };

        RDNSS 2001:4860:4860::8888  2001:4860:4860::8844
        {
        };
};

interface eth2
{
        AdvSendAdvert on;
        prefix ::/64
        {
                AdvOnLink on;
                AdvAutonomous on;
                AdvRouterAddr on;
        };

        RDNSS 2001:4860:4860::8888  2001:4860:4860::8844
        {
        };
};

Das Präfix ::/64 in dieser Konfiguration ist ein spezieller Wert. Der radvd benutzt für die Advertisements die auf dem jeweiligen Interface konfigurierten IPv6-Adressen um den Präfix selbst zu erreichnen. Die IPv6-Adresse hat uns im vorherigen Schritt der DHCPv6-Client automatisch gesetzt.

Der radvd muss noch mit der neuen Konfiguration aktiviert werden:

service radvd restart

Rechner im LAN vor eingehenden Verbindungen schützen (optional)

Wer es wirklich will und NAT bisher als Schutz seiner Rechner angesehen hat, kann über ip6tables noch einrichten, dass auch über IPv6 nur Verbindungen vom LAN ins Internet aufgebaut werden. TCP-Verbindungen aus dem Internet ins LAN werden damit abgewiesen. Hier die Datei /etc/init.d/ipv6-firewall anlegen:

#!/bin/sh
# kFreeBSD do not accept scripts as interpreters, using #!/bin/sh and sourcing.
if [ true != "$INIT_D_SCRIPT_SOURCED" ] ; then
    set "$0" "$@"; INIT_D_SCRIPT_SOURCED=true . /lib/init/init-d-script
fi
### BEGIN INIT INFO
# Provides:          ipv6-firewall
# Required-Start:    $network $remote_fs $syslog
# Required-Stop:     $network $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Starting IPv6 firewall
# Description:       This are some firewalling rules for our
#                    IPv6 connection to the internet.
### END INIT INFO

DESC="Starting IPv6 firewall"


case "$1" in
  start)
     /sbin/ip6tables -A FORWARD -m state --state NEW -i eth1 -o ppp0 -j ACCEPT
     /sbin/ip6tables -A FORWARD -m state --state NEW -i eth2 -o ppp0 -j ACCEPT
     /sbin/ip6tables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
     /sbin/ip6tables -A FORWARD -p tcp -j REJECT

     /sbin/ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
     /sbin/ip6tables -A INPUT -p tcp -j REJECT
     ;;
  stop)
     /sbin/ip6tables -F INPUT
     /sbin/ip6tables -F OUTPUT
     /sbin/ip6tables -F FORWARD
     ;;
  force-reload|restart)
     $0 stop
     $0 start
     ;;
  *)
     echo "Usage: /etc/init.d/ipv6-firewall {start|stop|restart}"
     exit 1
esac

exit 0

Dieses Skript installieren und aktivieren:

update-rc.d ipv6-firewall enable
service ipv6-firewall start

Das war's … die lokalen Netze haben jetzt IPv6-Zugang.

Worin ich mich 2016 verbessere: Clojure und Softwaretests

posted on

Mein einer Vorsatz für dieses Jahr ist es die Philosophie von Clojure zu denken. Seit 2011 spiele ich mit Lisp und 2014 hatte ich meinen ersten Kontakt zu Clojure, einem der Dialekte von Lisp. Der andere ist, ich möchte meine Erfahrungen mit Softwaretests ausbauen. Bisher hatte ich vor allem an meinen Fähigkeiten mit Unit-Tests gearbeitet und hierfür meinen Stil gefunden. Jetzt will ich automatische Integrationstests in mein Standardrepertoire von Entwicklungstechniken aufnehmen.

Jetzt im Mai?

Du kennst es bestimmt: an Silvester hast du gute Vorsätze für das neue Jahr und ab Neujahr ist es schwer diese einzuhalten. Die letzten Jahre bin ich gut damit gefahren mir nichts konkretes vorzunehmen, stattdessen ist mein Ziel etwas neues zu erreichen. Das heißt Anfang des Jahres bin ich noch auf der Suche was in diesem Moment das richtige für mich ist. Ich probiere verschiedene Dinge und experimentiere damit. Merke ich, dass es nicht das richtige ist, so muss ich nicht mit meinem Vorsatz brechen, sondern mache mich auf die Suche nach etwas anderem.

Für dieses Jahr bin mir inzwischen sicher, dass ein großes Thema für mich ist, dass ich in den beiden genannten Gebieten mehr Erfahrung sammeln will.

Lisp/Clojure

Web Deelopment with Clojure

Funktionale Programmierung fasziniert mich seitdem ich im ersten Semester an der TUM davon gehört habe. Auch wenn mein täglicher Berufsalltag objektorientiert ist, schreibe ich in diesem Rahmen funktional: Seiteneffekte wo nicht nötig vermeiden, bevorzugt verwende ich unveränderliche Value-Objekte und genieße wie ich in Java8 mit Streams ausdrücken kann was ich mit Daten machen möchte und nicht sagen muss, wie das geschehen soll.

Zu kämpfen habe ich noch damit herauszufinden wie ich ohne Klassen meine Programme auf höherer Ebene möglichst sauber strukturiere. Ich merke den Vorsprung, den die objektorientierte Denkweise in meinem Kopf hat: was ich in Java schreibe hat einfach noch die schönere Globalstruktur, es gelingt mir besser zusammen zu halten was zusammen gehört („high cohesion“) und getrennte Konzepte getrennt zu halten („loose coupling“). Ich denke, es liegt daran, dass ich schon deutlich mehr gute Beispiele für OOP als für funktionale Programme gesehen habe.

Clojure Applied

Vorwärts gebracht haben mich hier dieses Jahr bisher vorallem die Bücher Web Development with Clojure von Dmitri Sotnikov und Michael Swaine am Beispiel von Webanwendungen und Clojure Applied von Alex Miller und Ben Vandgrift für allgemeine Clojure-Programme. Nun muss ich in der Praxis probieren was ich gelesen habe. Hierzu schreibe ich ein Tool das ich brauche gerade als Clojure-Webanwendung. Mal schauen wie ich mit dem Ergebnis zufrieden sein werde …

Service- und Akzeptanztests

Nachdem ich meine Muster für Unittests mit jUnit, Hamcrest und Mockito gefunden habe arbeite ich jetzt daran die richtigen Werkzeuge und Muster für Tests auf höherer Ebene zu finden. Schon vor einiger Zeit hatte ich mit Fit einige Versuche unternommen. Inzwischen ist dieses Werkzeug Teil von FitNesse geworden. Tests werden hierbei in HTML-Dateien geschrieben. Diese können wahlweise zum Beispiel auch in Word oder einem Wiki erstellt werden. „Richtig“ fühlt sich das für mich bisher aber nicht an. Seit ein paar Monaten experimentiere ich stattdessen mit Cucumber. Die Tests werden dabei in (einigermaßen) natürlicher Sprache geschrieben und in einem Textdokument abgelegt. Für mich als Entwickler fühlt sich das sehr viel besser an.

In Fit wird damit argumentiert, dass ein Kunde/Auftraggeber besser in der Lage sei eine Spezifikation zu editieren, wenn er dies in seiner gewohnten Textverarbeitung tun kann. Ich denke aber, dass es immer ein Wunsch bleiben wird, dass man als Entwicklungsteam eine fertige Spezifikation erhält. Es ist wichtiger ein Tool in der Hand zu haben, das es mir ermöglicht mit dem Kunden/Auftraggeber zusammen dies zu erarbeiten. Das ist aber genauso in einem Texteditor möglich. Wichtig ist vielmehr, dass der Kunde ein Verständnis dafür hat, was niedergeschrieben wird. Hierfür eigent sich Gherkin, die Sprache von Cucumber, ausgezeichnet: die Spezifikation kann er als normalen Text lesen.

Vim, Emacs oder IDE (IntelliJ)?

posted on

In welchem Editor kann ich den besten Code schreiben? Vim wie bisher, doch vielleicht besser Emacs oder gar wie meine Kollegen mit einer IDE? Die letzten Wochen habe ich getestet: zwei Wochen nur Emacs und zwei Wochen nur IntelliJ als IDE

Emacs – der andere Texteditor

Mir gefällt, dass er mit Lisp erweitern wird. Ich mag Lisp. Größter Unterschied zu Vim: Keine Unterscheidung zwischen Eingabemodus und Befehlsmodus. Dadurch werden alle Befehle über irgendwelche Tastenkombinationen aufgerufen. Spötter übersetzen Emacs deswegen als Escape-Meta-Alt-Control-Shift. Ja, etwas stört mich das auch, insbesondere wenn ich gerade an einem Mac sitze und viele der Tastenkombinationen erstmal vom Betriebssystem abgefangen werden. Andererseits kenne ich das Problem in VIM, dass ich in den Einfügemodus wechseln woll, obwohl ich schon darin bin. Das führt dann zu so manchem überflüssigen „a“, „i“ oder „A“ im Text.

Beste positive Eigenschaft für mich: ich habe begonnen es zu lieben mit Buffern und Fenstern zu arbeiten. Per Tastenkürzel kann ich in kürzester Zeit die Dateien wechseln, die ich bearbeite und an mehreren Dateien gleichzeitig arbeiten. Bei VIM auch möglich, aber bei Emacs habe ich es wirklich gemacht: der Editor blieb gestartet und wurde nur mit Strg-Z in den Hintergrund gelegt, wenn ich auf der Shell zu tun hatte. Danach „fg“ auf der Shell eingetippt und im Editor war alles wie davor.

Am wenigsten gefiel mir im Vergleich zu Vim hat das Navigieren im Text. Wenn ich per regulärem Ausdruck in VIM etwas suche, so kann ich die Suche jederzeit mit „n“ (vorwärts weitersuchen) oder „N“ (rückwärts weitersuchen) fortsetzen. Das nutze ich beispielsweise gerne, wenn ich Kleinkram ändere. Ich kann nach jeder Änderung mit „n“ zur nächsten Stelle springen. In Emacs dagegen kann ich nur solange weitersuchen wie ich nichts editiere. Danach muss ich erneut die Suche starten.

IDE – IntelliJ

Wie habe ich zu einem Kollegen sagt: es fühlt sich an, wie wenn es nur ein etwas besserer Texteditor ist. – stutze und denke mir: müsste ich das nicht eher von Vim und Emacs behaupten?

Was ich damit meine ist aber: ich habe nicht den Eindruck, dass mein Editor wirklich Struktur im Text erkennt. Ich kann nur Zeichen einfügen und den Cursor bewegen. Alle Funktionen, die verstehen was ein Wort, ein Satz oder ein Absatz in meinem Programm ist wirken nur wie Makros auf höherer Ebene.

Was mich stört: ich habe mich wirklich bemüht alles mit der Tastatur und ohne Maus zu machen, dann der stetige Griff zur Maus nervt mich. Aber es klappt einfach nicht. Zwar scheint es immer auch ein Tastenkürzel zu geben, aber anstatt es zu suchen greift man eben doch zur Maus. Was ich zum Beispiel nicht gefunden habe:

Wenn ich mir meine Kollegen anschaue ist das auch nichts was sich mit der Zeit ändert: ich sehe (und höre im ganzen Büro!) wie oft die Maus im Spiel ist. Meine ideale Entwicklungsumgebung lässt sich gar nicht mit Maus bedienen und zwingt mich zu jedem Tastenkürzel: steile Lernkurve aber danach ein geiles Werkzeug.

Sehe ich einfach nur alles negativ weil es anders als das gewohnte ist? Nein! Es gibt auch Dinge die mir in IntelliJ gefallen haben. Einige Refactorings machen mit IDE mehr Spaß:

Beispielsweise ist es toll einen Codeabschnitt zu markieren und per Tastenkürzel in eine eigene Methode auszulagern. IntelliJ weißt mich auch gleich darauf hin, wenn es ähnliche Codestellen gibt und fragt, ob es diese durch einen Methodenaufruf ersetzen soll. Super! Dennoch lege ich hinterher Hand an und muss die Methode nochmals an die Stelle in der Klasse verschieben wo sie hingehört. IntelliJ fügt sie einfach immer unter der Methode ein von der ich extrahiere.

Prima ist auch, wieviel schneller die Unit-Tests laufen als ein Aufruf von „mvn test“. Das erhöht die Geschwindigkeit eines rot-grün-refactor-Zykluses erheblich.

Das große ABER für mich: schon nach zwei Wochen hatte ich den Eindruck, dass ich schlechteren Code schreibe:

Fazit (für mich)

Code werde ich weiterhin im Texteditor schreiben. Dabei greife ich die letzten Tage mal zu Vim und mal zu Emacs. Ich fühle mich in beiden wohl.

IntelliJ ist nicht schlecht, aber nicht das Werkzeug meiner Wahl zum programmieren. Aber ich kann mir vorstellen, in Zukunft bei größeren Refactorings auf dieses Werkzeug zurückzugreifen.

Mein Weg zur testgetriebenen Entwicklung

posted on

Testgetriebene Entwicklung (TDD) funktioniert – überall. Sie scheitert nicht am Kunden, den nicht Qualität sondern Tempo interessiert. Sie steht nicht im Widerspruch zum jungen Projekt mit wenig Budget, das schnell Kunden gewinnen muss um zu überleben. Sie hindert nicht daran schnell Features umsetzen zu können. Ja, sie macht mir auch nicht (mehr) langsamer.

Es ist keine neun Monate her, dass ich das nicht glauben konnte. Mehrere Anläufe hatte ich unternommen neben Code auch Tests zu schreiben. Länger als zwei Monate ging das nie gut:

Die entscheidenden Hinweise

Test-Driven Development by Example, Kent Beck

Zwei mal klick hat es in meinem Kopf gemacht als ich das Buch „Test Driven Development by Example“ von Kent Beck gelesen habe:

  1. TDD einzuführen ist keine Entscheidung des Kunden, Chefs oder Teams. Das kann jeder für das was er macht selbst tun. Es ist einfach ein Stück persönlicher Programmierstil. Wie ich entscheide, ob ich mir erst auf ein Blatt Papier skizziere was ich programmiere, kann ich auch entscheiden das erst in einem Test zu skizzieren.
  2. Ich hatte davor versucht mit Unit-Tests mehr zu erreichen als ich sollte. Es reicht wenn ich prüfe, dass meine Klasse (Unit) ihre Funktion erbringt und die erwarteten Ergebnisse liefert. Es war falsch zu prüfen, ob mehrere Klassen sich zusammenfügen lassen und gemeinsam richtig arbeiten. Für diese Dinge gibt es Integrations- und Akzeptanztests. Mein Unit-Test stellt nur sicher, dass ich keinen Sonderfall vergesse und sich bei einem Refactoring meiner Klasse (Unit) nichts im Ergebnis ändert.

Mir war klar geworden, dass nicht die Beispiele mit JUnit zu simpel sind, die in fast allen Java-Büchern zu finden sind. Vielmehr war das was ich als Unit betrachtet habe zu komplex. Der Fehler lag nicht in den Beispielen sondern bei mir. Ich hatte meine Probleme nicht so sehr in kleinere Probleme zerlegt, dass sie einfach zu testen sind.

Die ersten sieben Monate

Ein gutes halbes Jahr entwickle ich nur noch testgetrieben. Den Umstieg habe ich geschafft, ich kann mir nicht vorstellen nochmals in die Zeit davor zurückzufallen. Nach einigen Monaten Umstellung habe ich nicht mehr langsamer entwickelt als ohne Tests. Wie bei jeder neuen Technik musste ich am Anfang lernen sie einzusetzen. Das kostet die ersten Wochen und Monate zusätzlich. Dennoch war der Aufand auch damals nicht so hoch wie ich zuvor dachte.

Warum kostet es mich jetzt keine zusätzliche Zeit mehr? Zuerst Tests zu schreiben ist nun eine Struktur in der ich mir Gedanken mache was ich schreiben möchte. Das musste ich auch zuvor tun indem ich Skizzen gemalt, einen Prototypen gebaut oder auch nur Code geschrieben habe, den ich nochmals ändern musste.

Ohne Zusatzaufwand bekomme ich aber die folgenden Dinge frei Haus geliefert:

Was mir sonst noch geholfen hat

Weniger Schlecht Programmieren, Kathrin Passig und Johannes Jander Becoming a Better Programmer, Pete Goodliffe

Zwei Bücher aus den Weihnachtsferien haben meinen Entschluss nur noch mit Tests zu entwickeln gestärkt. In „Weniger schlecht programmieren“ und „Becomming a Better Programmer“ ist mir klar geworden, dass die Professionalität der Entwicklung meine Aufgabe als Entwickler ist. Ich bin der Profi in diesem Bereich und nicht die Geschäftsführung. Diese hat mich dafür angestellt professionell zu arbeiten. Sie verlässt sich darauf, dass ich weiß was notwendig ist und ich dies tue. Wenn ich ihr den Eindruck gebe, es geht auch ohne, wenn es mal sein muss, dann ist klar, dass sie das bevorzugt. Wenn ich der Überzeugung bin, dass es der falsche Weg ist, dann muss ich das vermitteln und darf nicht auf andere schieben, dass es „bei uns“ eben nicht anders geht. Würde ich gegen mein besseres Wissen arbeiten, so hätte zuerst ich versagt und nicht das Management.

Clean Code, Robert C. Martin

Ebenso hat mich der Klassiker „Clean Code“ auf meinem Weg weiter gebracht. Einerseits weil ich durch die Tests erst einiges daraus richtig umsetzen konnte. Vorallem aber weil ich damit gelernt habe auch meine Tests so zu schreiben, dass sie lesbar sind, jederzeit geändert und erweitert werden können.

Tatort, una película alemana especial

posted on

Tatort es una palabra alemana que significa «lugar del crimen». Pero para un alemán en primer lugar es el nombre de una serie de películas policíacas que se emiten cada domingo a las ocho y cuarto en la televisión pública. Esta serie se emite desde 1970.

Su particularidad de esta telenovela es que no solo tiene un protagonista. La serie tiene lugar en 20 ciudades de Alemania, Austria y Suiza. Cada ciudad tiene un protagonista y también lo que ocurre en los episodios rodados en cada ciudad es muy diferente. En todos ellos se puede apreciar las peculiaridades de cada región. Algunos episodios tratan temas muy serios y otros son cómicos.

Esta serie es vista especialmente por la gente con un nivel de sociedad muy bien educada. Cuando llegaba a la universidad hablábamos cada lunes sobre el último capitulo de la serie.

Desde 1990 algunos episodios de Tatort tienen el nombre de «Polizeiruf 110». Porque ese fue el nombre que se le dío en la República Democrática Alemana. Además Alemania se reunificó en este año y se utilizan los dos nombres desde entonces.

Los autobuses con tráiler

posted on

Aquí en Múnich hay varios medios de transporte público: el autobús y el autobús articulado, el tranvía, el metro y el tren metropolitano. La diferencia entre estos medios es el aforo y si necesiten caminos especiales.

Desde el año pasado tenemos una variación nuevo: el autobús con tráiler. Tiene un aforo más grande que el autobús articulado. Pueden entrar unos 133 pasajeros (en comparación: tranvía 220, autobús articulado 100).

Es un renacimiento: hace 60 años hubo autobuses con tráiler en Múnich también.

El último martes vi este vehículo por primera vez. Aquí una foto.

El tráiler a la izquierda y el autobús a la derecha. La barrera en medio.

La vuelta Costa Calma a Múnich

posted on

Rotonda en Costa Calma Estación central de Stuttgart

Hoy es el día de la vuelta. Las vacaciones han terminado. Eran sólo ocho días pero fue un tiempo buenísimo para escapar del estrés y del invierno.

Me gusta mucho Fuerteventura. La gente siempre fue amable. Pero este vez fue más amable. Es un otro acceso si se puede comunicar en la legua nacional.

La vuelta a Múnich es un poquito caótico. Me ha equivocado con el horario de guaguas (los autobuses en Canarias). Por eso necesitamos ir un tercero del recorrido al aeropuerto con el taxi. La mujer de la oficina de información y turismo en Costa Calma me ayudó mucho llegar a tiempo al aeropuerto. Buscó la conexión con taxi y guagua y llamó por teléfono el taxi.

A partir de Gran Tarajal fuimos con la línea 16. Es una ruta muy atractivo tras esa isla bonita. Se pasa muchas urbanizaciones no turísticas. Hemos prendido el avión a Stuttgart. Cuando compré los billetes no quedó unos a Múnich. Por eso estamos yendo en tren ICE. Van a llegar en una hora. En total utilizamos el taxi, la guagua, el avión, el tren y la metro para volver.

Quería ir a Fuerteventura otra vez este año.

El desfile de los Reyes Magos

posted on

Supe que el día de los Reyes Magos es más importante en España que la noche santo. Pero no creí que hubiere un desfile en una urbanización de una mayoría de turistas.

Iríamos al restaurante cuando viera la Policía local cerrando la calle. Poco después tres camellos y mucha gente nacional. Nos unimos con los otros.

Creo que eso seré el recuerdo mejor de este vacaciones. Una situación original y no intentando.

El desfile de los Reyes Magos


Unless otherwise credited all material Creative Commons License by Matthias Wimmer