2014-03-02
The Power of Java 8
An Java wird häufig kritisiert, wie viel Code selbst für einfache Aufgaben notwendig ist. Sehr beliebt sind Vergleiche mit Skript-Sprachen oder Abkömmlingen auf der JVM. Ob diese Vergleiche nun fair sind, sei dahingestellt. Nichtsdestotrotz schließt Java 8 auf. Ein Beispiel.
2014-02-23
Lambda-Ausdrücke und Methoden-Referenzen: Vergleich von Java 7 mit Java 8
Es gibt zahlreiche Leute, die sich kritisch zu den mit Java 8 eingeführten Lambda-Ausdrücken und Methoden-Referenzen äußern. Außer Frage steht, dass der übermäßige Einsatz kontraproduktiv ist. Das sollte einem jedoch nicht den Blick auf die Vorteile verstellen, die Vergleiche zwischen Java 7 und Java 8 deutlich zeigen. Zwei Beispiele.
2014-02-16
Die 5 wichtigen Neuerungen in Subversion 1.8
Apache Subversion 1.8 wurde bereits vor über sechs Monaten veröffentlicht. Höchste Zeit also sich mit der neuen Version auseinanderzusetzen und die wichtigsten Neuerungen hervorzuheben. Zusammengefasst: Im Mittelpunkt stehen Verbesserungen bei der Usability, um die effiziente und effektive Verwendung von Subversion zu unterstützen.
2014-02-09
C++1y: Quoted Strings
Hinter dem qualifizierten Bezeichner std::quoted werden sich in der kommenden C++-Version drei überladene Funktionstemplates verbergen. Diese Erweiterung ist als "Quoted Strings" bekannt und erfüllt eigentlich nur einen einzigen Zweck: Sie erleichtert Anfängern den Einstieg in C++. Ein Beispiel.
2014-02-02
Die dunkle Seite der Non-Blocking I/O
Non-Blocking I/O and single-threaded Event Loop: Dieses Programmiermodell hat mit vielen guten Beispielen einen wahrhaften Hype ausgelöst. Doch klar ist auch: "Wo viel Licht ist, ist starker Schatten." Ein paar unterschätzte und vergessene Probleme.
2014-01-26
java.time: Der 3. Versuch
Zuerst Date, dann Calendar, GregorianCalendar und ZimeZone, und nun über 1 600 Methoden verteilt auf knapp 70 öffentliche Klassen, Schnittstellen und Enums im Paket java.time. Muss das wirklich sein?
2014-01-19
Java: Multithreading ganz einfach!
Parallelprogrammierung mit Threads und Shared-Memory ist einfacher als Viele denken. Am Beispiel eines minimalen Webcrawlers zeige ich, dass das auch für untypische Fälle gilt – vorausgesetzt der Code hat eine klare Struktur.
2014-01-12
Entwurfsprinzip: Best Effort
Der Ausdruck "Best Effort" steht in der Informatik für das Prinzip der Wertsteigerung durch bewusst geringere Güte aufgrund beschränkter Kapazitäten. In vielen Bereichen hat sich dieses Prinzip bewährt. Beim Softwareentwurf wird es jedoch häufig vernachlässigt. Ein Beispiel zur Motivation.
2014-01-05
Technologiewechsel 2014: Dos & Don'ts
Der Jahreswechsel ist ein guter Zeitpunkt, um über Veränderungen innerhalb der nächsten 12 Monaten nachzudenken. Daher gebe ich in diesem Artikel einige Ratschläge zu Technologiewechseln, die man 2014 in größeren Softwareprojekten angehen sollte, und zu solchen, von denen man besser die Finger lässt.
2013-12-29
Das Ende der Checked Exception
Die "Checked Exceptions" von Java gehören in die Kategorie "Gut gemeint". Die Probleme waren schon lange offensichtlich, doch mittlerweile sind die Schmerzen so groß, dass eine Abkehr unumgänglich ist. Und tatsächlich deutet sich dieser Weg mit Java 8 an.
2013-12-22
Java 8 und java.util.Optional<T>
Java 8 führt die generische Klasse Optional<T> ein, mit der sich interessanterweise viele NullPointerExceptions vermeiden ließen – zumindest bei konsequenter Verwendung. Letzteres ist nicht absehbar, und dennoch lohnt sich ein Blick auf diesen Ansatz.
2013-12-15
Java 8: Erweiterung von java.util.Comparator
Java 8 erweitert die Comparator-Schnittstelle um zahlreiche statische und Default-Methoden. In Zusammenhang mit Lambda-Ausdrücken und Methoden-Referenzen soll dadurch die Implementierung der Schnittstelle deutlich einfacher werden. Wie das aussieht, zeige ich an einigen Beispielen.
2013-12-08
Java 8: Beispiele zur Stream-API
Die Einführung der sogenannten Stream-API ist die größte Änderung der Standardbibliothek in Java 8. Mit ihr sollen Zugriffe auf Daten vereinfacht werden. Doch lohnt sich dafür tatsächlich eine so komplexe API? Fünf Beispiele mit einer Gegenüberstellung zu SQL-Abfragen verschaffen einen ersten Eindruck.
2013-12-01
Java 8: Iterable, Collection und List
Java 8 bessert mit Default-Methods an zahlreichen Stellen die in die Jahre gekommene Standardbibliothek nach. Die entsprechenden Erweiterungen von Iterable, Collection und List beschreibe ich in diesem Artikel.
2013-11-24
Java 8: Erweiterung von java.util.Map
Lambda-Expressions und Default-Methods machen es möglich: Die Schnittstelle Map erfährt mit Java 8 zahlreiche Erweiterungen, um die Verwendung für Entwickler deutlich zu vereinfachen. In diesem Artikel gebe ich einen kurzen Überblick über die wichtigsten Änderungen.
2013-11-17
Java 8: Anonyme Funktionen, Lambdas und Closures
In wenigen Monaten wird die kommende Version von Java veröffentlicht. Dominiert wird Java 8 von der Einführung anonymer Funktionen. Dabei handelt es sich wohl um die bedeutendste Erweiterung seit Java 5. Das ist ein guter Grund sich wieder einmal mit dem Thema auseinanderzusetzen.
2013-11-10
Clang: Vollständige Unterstützung von C++14
Als erster Compiler unterstützt Clang vollständig die voraussichtlichen Erweiterungen von C++14. Ein Blick auf die wichtigsten Features, die zu den deutlichen Vereinfachen führen.
2013-11-03
Trennzeichen für numerische Literale
Sowohl in Java als auch in C++ wurden sie erst vor Kurzem eingeführt: Trennzeichen für numerische Literale. Ein unscheinbares Feature, das man dennoch kennen muss. Denn falls man lange Ziffernfolgen benötigt, können sie die Lesbarkeit retten.
2013-10-27
Meta-Beispiel: Die Fibonacci-Funktion
Die Fibonacci-Funktion ist eines der am Häufigsten verwendeten Programmierbeispiele – doch leider auch ein Irreführendes für Programmieranfänger. Ein Appell für bessere Beispiele.
2013-10-20
Java: Vollständige Liste der -XX:-Optionen
Die Optionen -help und -X geben nur wenige Kommandozeilenoptionen wieder. Dabei kennen die meisten Java‑VMs über 700 unterschiedliche Konfigurationsparameter, die sich über die Kommandozeile einstellen lassen. Ein versteckter Schalter fördert sie zu Tage.
2013-10-13
C++: Was kostet std::atomic<int>?
Lohnt es sich in C++ den Typ int statt std::atomic<int> zu verwenden, um die parallele Performance zu verbessern? Unwahrscheinlich. Denn Beispiele zeigen, dass beide in vielen Fällen zu beinahe identischem Assembler-Code führen.
2013-10-06
Sortierverfahren in C++
Wie lassen sich Sortierverfahren in C++ implementieren? Eine kleine Übung zur Auffrischung von Algorithmen in und um die Standardbibliothek.
2013-09-29
C++: Komposition mit std::bind
Mit dem Funktionstemplate std::bind lassen sich Argumente an Funktionen binden. Dieser Mechanismus ist als partielle Anwendung bekannt. Dabei geht std::bind über die gängige Funktionalität hinaus und unterstützt auch die Komposition. Ein Beispiel.
2013-09-22
C++: Algorithmen statt Schleifen
Die Standardbibliothek von C++ enthält zahlreiche generische Algorithmen, die sich anstelle von Schleifen verwenden lassen. Dieses Thema kommt immer wieder auf, denn so klar ist die Aussage nicht – auch nicht mit C++11/14.
2013-09-15
Nachlese: Going Native 2013
Anfang September fand in Redmond die Going Native 2013 statt. Die größte und bedeutendste Konferenz zu C++ zeichnet sich durch ein ausgezeichnetes Programm mit den angesehensten Sprechern aus. Aus den zahlreichen Vorträgen empfehle ich drei, die man sich nicht entgehen lassen sollte.
2013-09-08
C++11: Thread-safe Lazy Initialization
Double-checked Locking für Lazy Initialization? Nicht in C++11. Denn die Sprache und die Bibliothek unterstützen diese Anforderung, und erledigen ihre Aufgabe in der Regel besser als viele Entwickler.
2013-09-01
Java, Data Races und Sequential Consistency
Viele Entwickler tun sich unnötig schwer mit Parallelprogrammierung, weil sie in Begriffen wie Caches, Umordnungen, Memory-Barriers und verzögerter Sichtbarkeit denken. Die wichtigen Begriffe sind jedoch Data Races und Sequential Consistency. Damit könnte alles so einfach sein.
2013-08-25
Java: Zugriffsmodifikatoren bei überladenen Methoden
Zugriffsmodifikatoren beschränken den Zugriff und Überladung ermöglicht statische Polymorphie. Diese beiden Konzepte sind nur scheinbar unabhängig voneinander. Tatsächlich ist die Überladung sehr eng an die Zugriffsbeschränkungen gekoppelt. Was das bedeutet zeige ich an einem Beispiel.
2013-08-18
Java: Grundregeln der Änderbarkeit von Methoden
Es ist eine Sache effiziente und klare Methoden zu realisieren. Das erfordert Erfahrung und Wissen. Es ist eine andere Sache, einfach änderbare Methoden zu implementieren. Das erfordert lediglich die Berücksichtigung einiger grundlegender Regeln. Ein Beispiel.
2013-08-11
Parameterübergabe in C++11
Ändert sich durch C++11 der Programmierstil für die Parameterübergabe? Sollte man Funktionen für L‑Value- und R‑Value-Referenzen überladen? Eine Antwort auf zwei Fragen: By-Value!
2013-08-04
RESTful Web APIs mit HTTP-Caching in der Praxis
Was leistet HTTP-Caching für RESTful APIs in der Praxis? Dieser Frage gehe ich nach und betrachte dazu drei repräsentative Beispiele, anhand derer ich die Cache-Effekte genauer erkläre. Eine nüchterne Beobachtung.
2013-07-28
CRTP in Java
Die Kombination von Generics und Vererbung führt zu interessanten Mustern. Ein verbreitetes Idiom aus dieser Reihe ist das sogenannte CRTP, das auch in Java anzutreffen ist. Eine Beschreibung.
2013-07-21
C10K – Ein Schein-Problem
Wie kann man zehntausend Clients gleichzeitig bedienen? Diese Fragestellung ist unter dem Numeronym C10K bekannt. Doch bei genauerer Betrachtung zeigt sich, dass es überhaupt kein Problem gibt – auch wenn das häufig anders dargestellt wird.
2013-07-14
PRISM: Exabyte, Zettabyte oder Yottabyte?
Die NSA speichert im Rahmen ihres PRISM-Programms anscheinend verdachtsunabhängig Daten in großen Maße. Dabei ist in der Berichterstattung sowohl von Exabyte, Zettabyte als auch Yottabyte die Rede. Doch was davon ist wirklich realistisch? Eine Plausibilitätsprüfung.
2013-07-07
Datenstrukturen in C: Beispiel ALLOC_GROW
Wie sieht moderner Code in C aus? Dieser Frage gehe ich anhand des Quellcodes von Git nach. Dabei betrachte ich insbesondere, wie Git den Umgang mit dynamischen Arrays unterstützt.
2013-06-30
Über Premature Optimization
"Premature Optimization is the root of all evil." Diese plakative Aussage hat Generationen von Entwicklern geprägt. Doch die Softwareentwicklung hat sich in den letzten 40 Jahren verändert, und so stehen wir heute vor dem Problem der "Premature Pessimization".
2013-06-23
Variationen variadischer Templates in C++
Eine Aufgabe für variadische Funktionstemplates und drei unterschiedliche Lösungsansätze: Das Beispiel der zip-Funktion zeigt, wie einfach und effektiv variadische Templates sind.