Foundations for Professionals .NET Professionals im Profil guide to C# guidgen.de

Blog

Nutze den Augenblick
und teile der Welt mit, was Du zu sagen hast.

Basta! 2009 Spring Edition: Sicherer Code? Aber sicher!

Samstag, 28. Februar 2009, 12:55 Uhr
Permalink | Kommentare (0) | Kommentare als RSSRSS

Diese Woche fand in Darmstadt die Basta! 2009 Spring Edition statt, auf der ich am Mittwoch wieder mit einer eigenen Session vertreten war.

Thema meiner Session Sicherer Code? Aber sicher! waren die zehn häufigsten Sicherheitslücken in Web- und Desktopanwendungen. Außerdem habe ich einige einfache Werkzeuge und Maßnahmen vorgestellt, mit denen man sich entsprechend schützen kann.

Vor knapp 40 Teilnehmern habe ich also folgende Themen behandelt:

  • "All input is evil"
  • Filtern und kanonisieren von Eingaben
  • Dedizierte Sprachen
  • BBCode in .NET mit codeparser.net
  • SQL Injection und XML Injection
  • Maskieren von Ausgaben
  • Behandeln von Fehlern
  • Least Privileged User
  • Verschlüsseln und digitales Signieren

Ergänzt wurde die Theorie durch praktische Codebeispiele, an denen ich die Vermeidung typischer Fehler demonstriert habe.

Abschließend möchte ich mich an dieser Stelle noch einmal bei den Teilnehmern für die Aufmerksamkeit und die interessanten Fragen bedanken, und hoffe, dass für jeden neue und hilfreiche Anregungen enthalten waren.

Review von Suchmaschinen-Optimierung

Sonntag, 15. Februar 2009, 20:44 Uhr
Permalink | Kommentare (0) | Kommentare als RSSRSS

Nach meinem Review von jQuery in Action vor einigen Tagen habe ich inzwischen mit Suchmaschinen-Optimierung von Sebastian Erlhofer bereits das nächste Buch gelesen.

Im vergangenen Jahr habe ich mich sehr viel mit moderner Webentwicklung nach den aktuellen W3C-Standards beschäftigt, insbesondere aber mit der sauberen Trennung der einzelnen Aspekte in XHTML, CSS und JavaScript.

Als Ergebnis dessen habe ich im August 2008 so wohl meine persönliche Webseite wie auch mein Blog mit einem neuen Design ausgestattet, das nicht nur weitestgehend W3C-konform ist, sondern das in den gängigen Suchmaschinen auch eine bessere Positionierung bewirkt hat.

Da ich dieses Thema ausgesprochen spannend finde, war es nun an der Zeit, mich näher mit der Materie zu beschäftigen. Das Buch Suchmaschinen-Optimierung habe ich mir vor allem auf Grund der guten Bewertungen bei Amazon bestellt. Ebenso wie bereits jQuery in Action war es ein voller Erfolg.

Besonders gut gefallen hat mir, dass sich das Buch nicht nur mit dem Wie beschäftigt, sondern auch mit dem Warum. In den ersten Kapiteln geht es nämlich zunächst einmal darum, einen umfassenden Überblick zu erhalten, wie Suchmaschinen an sich überhaupt funktionieren - von der Suche nach neuen Dokumenten, deren Aufnahme in den Index, der Ermittlung relevanter Schlüsselwörter bis hin zu der Frage, wie Suchergebnisse sortiert werden.

Nachdem diese Grundlagen gelegt sind, geht es in den darauf folgenden vier Kapiteln ausführlich um die konkreten Optimierungsmöglichkeiten. Die einzelnen Kapitel beschäftigen sich dabei mit den folgenden Themen:

  • Keywords: Wie ermittelt man die für eine Webseite relevanten Keywords, wie bewerten Suchmaschinen die Keywords und wie optimiert man ein Dokument im Hinblick auf ausgewählte Keywords?
  • On-Page-Optimierung: Wie optimiert man eine Webseite durch Veränderung ihres XHTML-Codes und wie baut man eine sinnvolle semantische Struktur auf, die so wohl Suchmaschinen wie auch Anwendern zu Gute kommt?
  • Off-Page-Optimierung: Welche Möglichkeiten gibt es außerhalb der zu optimierenden Webseite, das Ranking zu verbessern? Hierzu zählen neben der Verlinkung auch technische Details wie die Auswahl eines geeigneten Webservers.
  • Spam: Welche vermeintlichen Optimierungen sollte man nicht nutzen, da sie von Suchmaschinen in der Regel als Spam gewertet und die entsprechende Webseite daher schlechter bewertet wird?

Ergänzt wurden diese Themen abschließend mit konkreten Tipps zur Verbesserung der Usability und Praxisbeispielen, unter anderem an Hand von Typo3 und WordPress.

Insgesamt - ein wirklich rundum gelungenes Buch, und durchaus eine Empfehlung für jeden interessierten Webentwickler wert!

Review von jQuery in Action

Donnerstag, 12. Februar 2009, 21:08 Uhr
Permalink | Kommentare (1) | Kommentare als RSSRSS

Nachdem ich in den vergangenen Wochen ausschließlich Bücher zu C#, .NET und Entwicklung im Allgemeinen gelesen habe, wende ich mich nun verstärkt dem Thema Web zu: Vor einigen Tagen hat mir Peter Bucher die Beschäftigung mit dem ASP.NET MVC-Framework empfohlen, außerdem hat Microsoft für Visual Studio 2010 angekündigt, das JavaScript-Framework jQuery integrieren und unterstützen zu wollen. Grund genug also, sich mit beiden Themen näher zu befassen.

Den Anfang habe ich dabei mit dem Buch jQuery in Action von Bear Bibeault und Yehuda Katz gemacht, das wie bereits einige andere ausgesprochen empfehlenswerte Bücher wie beispielsweise C# in Depth und LINQ in Action bei Manning erschienen ist.

Was soll ich sagen? Das Buch erfüllt genau die Erwartungen, die ich im Vorfeld hatte. Zunächst werden in einer sehr ausführlichen und detaillierten Einführung nicht nur das jQuery-Framework an sich, sondern auch dessen Konzepte erläutert. Ergänzt wird diese Einführung durch Richtlinien zum Schreiben von sogenanntem Unobtrusive JavaScript. All dies führt zu einem tragfähigen Verständnis für die darauf folgenden Kapitel.

In diesen werden in der Regel zunächst das klassische Vorgehen und die sich daraus ergebenden Nachteile erläutert, bevor die kompakte und verbesserte Lösung auf Basis von jQuery vorgestellt wird. Nach und nach wird dabei auf sämtliche Features von jQuery eingegangen, die jeweils mit zahlreichen Beispielen illustriert werden.

Auch dem Thema Erweiterbarkeit von jQuery wird Rechnung getragen: Während sich ein Kapitel voll und ganz der Entwicklung eigener Plugins und deren Integration in jQuery widmet, zeigt ein anderes exemplarisch an Hand von bereits bestehenden Plugins, wie diese verwendet werden können, um die Kernfunktionalität zu erweitern.

Ein weiteres, relativ langes Kapitel behandelt das Thema AJAX. jQuery verfügt nämlich auch für die Programmierung mit AJAX über einige sehr interessante Funktionen, die das Absenden und Behandeln von AJAX-Anfragen verhältnismäßig einfach machen.

Den Abschluss von jQuery in Action bildet ein Kapitel, in dem einige fortgeschrittene JavaScript-Techniken erläutert werden, die teilweise zum Verständnis notwendig sind: Unter anderem werden in diesem Kapitel die Themen Delegates und Closures auf kompakte, aber verständliche Art erklärt.

Alles in allem ist jQuery in Action ein rundum gelungenes Buch, das man ohne zu zögern weiter empfehlen kann.

Erste Schritte auf Windows Azure

Sonntag, 8. Februar 2009, 13:42 Uhr
Permalink | Kommentare (0) | Kommentare als RSSRSS

Nachdem ich am 27. Oktober 2008 über Windows Azure berichtet habe, habe ich heute meine ersten Schritte auf diesem Betriebssystem gewagt. Da Cloud Computing zukünftig eine ausgesprochen wichtige Rolle für diverse Aufgaben spielen wird, habe ich mir vorgenommen, meine bestehenden Webseiten nach und nach auf Windows Azure zu migrieren.

Den Anfang habe ich heute mit meiner persönlichen Webseite goloroden.de unternommen, die bereits auf ASP.NET 3.5 basiert, keine Datenbank erfordert und nur wenig dynamische Inhalte verwendet. Das Ergebnis findet sich unter cloud.goloroden.de - abgesehen von der Domain ist die Seite nicht vom Original zu unterscheiden.

Die Migration war ausgesprochen einfach durchzuführen, insgesamt habe ich ungefähr zwei Stunden benötigt. Allerdings habe ich einen Großteil dieser Zeit damit verbracht, auf das Deployment von Windows Azure zu warten: Zwischen dem Hochladen eines Packages und der Verfügbarkeit im Web können durchaus 15 bis 30 Minuten vergehen, in denen man lediglich abwarten kann.

Prinzipiell habe ich folgende Schritte durchgeführt:

  • Neues Cloud-Projekt anlegen: Dieser Vorgang ist in Visual Studio mit wenigen Klicks erledigt. Ein Cloud-Projekt besteht dabei aus einer Solution mit mindestens zwei Projekten. Das eine dieser beiden Projekte enthält die notwendigen Konfigurationsdateien für das Deployment auf Windows Azure, das andere stellt - zumindest im Falle einer Webrole - ein klassisches Web Application Project (WAP) dar.
  • Webseite zu WAP migrieren: Da die bestehende Webseite nicht als Web Application Project vorlag, sondern als einfache Webseite, habe ich dem Cloud-Projekt eine Webrole hinzugefügt und dort die bestehenden Dateien wieder eingeklinkt. Da die bestehende Webseite eine unveränderte Web.config verwendet, habe ich diese wie von Visual Studio erzeugt belassen. Wichtig bei diesem Schritt war, darauf zu achten, in allen .aspx-Dateien das Attribut CodeFile durch CodeBehind zu ersetzen, andernfalls kann die Webseite auf Windows Azure nicht ausgeführt werden.
  • Cloud-Project publishen: Auch dieser Vorgang ist in Visual Studio wiederum mit wenigen Klicks erledigt. Als Ergebnis erhält man zwei Dateien: Zum einen das Package, zum anderen eine Konfigurationsdatei. Beide müssen über das Azure Services Developer Portal in die Cloud hochgeladen und anschließend gestartet werden.

Sobald das Package vom Staging- in den Produktionsbereich verschoben wurde, dauert es noch die oben erwähnten 15 bis 30 Minuten, bis die Webseite tatsächlich erreichbar ist. Zunächst gilt diese Erreichbarkeit nur über eine von Microsoft vorgegebene Domain, das Einrichten eigener Domains ist in der CTP-Phase von Windows Azure noch nicht vorgesehen. Die Einrichtung eines CNAMEs für eine bestehende eigene Domain genügt allerdings als Workaround.

Diese ersten Schritte auf Windows Azure waren zwar noch nichts weltbewegendes, sind aber bestens geeignet, um sich mit den verwendeten Werkzeugen, Webseiten und Prozessen vertraut zu machen. Die nächste Herausforderung wird nun sein, neben einer Webseite auch eine Datenbank auf Windows Azure zu migrieren.

Die Forderung nach Softwarequalität

Sonntag, 1. Februar 2009, 09:37 Uhr
Permalink | Kommentare (4) | Kommentare als RSSRSS

Am 13. Oktober 2008 haben Peter Bucher und ich unter dem Titel Noch Fragen, Bucher? Ja, Roden! angekündigt, jeweils zum ersten eines jeden Monats einen Kommentar zu einem vorab gemeinsam gewählten Thema verfassen zu wollen. Bisher sind in dieser Reihe folgende Kommentare erschienen:

Heute, am 1. Februar 2009, ist es nun wieder so weit, und unser Thema für diesen Monat lautet:

Die Forderung nach Softwarequalität

So wohl Peter wie auch ich haben uns unabhängig voneinander im Vorfeld unsere Gedanken gemacht, wie wir diesem Thema gegenüberstehen. Peters Kommentar findet sich zeitgleich in seinem Blog, folgend nun mein Kommentar zu diesem Thema:

Den Begriff Softwarequalität zu definieren, ist keine große Herausforderung. Qualität ist bei einem Softwareprodukt dann gegeben, wenn die Software nicht nur ihre funktionalen, sondern auch ihre nicht-funktionalen Anforderungen ausreichend erfüllt. Je höher diese Anforderungen gelegt werden, desto besser die Qualität.

Wie wichtig das Thema ist, hat bereits im November 2007 die dotnetpro mit ihrer Konzeptkonferenz prio bewiesen, als sie den Begriff Softwarequalität als Leitthema für die Konferenz gewählt hat.

Außerdem kennt man die Forderung nach Softwarequalität so wohl von Entwicklern wie auch von Managern – in fast jeder Softwarefirma spielt dieses Thema eine gewichtige Rolle.

Man könnte meinen, dass ein Thema, dass zum einen von so großer Bedeutung und zum anderen auch von so vielen gefordert wird, nicht nur ausreichend erforscht, sondern vor allem auch mehr als ausreichend gelebt wird. Leider ist in der Praxis häufig weder das eine noch das andere der Fall.

Das Paradoxe an Softwarequalität ist nämlich, dass sie gleichzeitig Geld und Zeit kostet, aber auch Geld und Zeit spart: Wird während der Entwicklung bereits auf die Einhaltung gewisser Qualitätsregeln geachtet, ist das natürlich aufwändiger, als wenn dies nicht geschieht.

Leider wird die Argumentation in der Praxis häufig an dieser Stelle beendet, denn sobald Auslieferungstermine oder Kosten die Entwicklung beeinträchtigen könnten, wird in der Regel als erstes an der Qualität gespart, denn der Code könnte zu einem späteren Zeitpunkt noch überarbeitet werden.

Das Problem ist nur: Dieser Zeitpunkt wird so gut wie nie erreicht. Denn nach der Auslieferung der Software beginnen zumeist die Arbeiten an der nächsten Version – Zeit, die vorherige erst noch zu bereinigen, findet sich nicht.

Vordergründig mag dieses Vorgehen auch in Ordnung sein, denn auf den ersten Blick funktioniert alles, und es wurden sogar Zeit und Geld gespart. Zugleich wird akzeptiert, dass der ausgelieferte Code nicht fehlerfrei ist, weshalb später Zeit in die Behebung von Bugs fließen muss. Doch genau an dieser Stelle liegt der Hund begraben.

Auch und sogar speziell in der Informatik gilt: Je später ein Fehler behoben wird, desto teurer ist seine Behebung (warum das so ist, habe ich vor einigen Monaten bereits in dem Eintrag Architektur = Planen + Entwurfsmuster erläutert). Genau an dieser Stelle kostet die Entwicklung dann nämlich wiederum übermäßig viel Zeit und Geld: Es handelt sich also um einen dieser typischen Fälle, in denen sich Dinge desto stärker rächen, je mehr man sie hinausschiebt.

Hat man diese Problematik erst einmal erkannt, akzeptiert und beschlossen, etwas zu unternehmen, stellt sich die Frage, was genau man denn eigentlich machen könnte. Hierzu gibt es meiner Meinung nach in jeder Phase der Entwicklung ausreichend Möglichkeiten, aktiv zu werden – selbst, wenn man in der Firma ansonsten nicht wirklich etwas zu sagen hat: Getting Things Done When You’re Only a Grunt.

In der Anforderungsphase kann man als Entwickler zwar die eigentlichen Anforderungen nicht oder nur kaum beeinflussen, aber man hat die Möglichkeit, eigene Aufwandsabschätzungen durchzuführen und darauf hinzuweisen, dass ein bestimmtes Feature eventuell nicht so schnell umgesetzt werden kann, wie es der Kunde gerne hätte.

Eine meiner Meinung nach ausgezeichnete Methode, wie man Aufwände überhaupt schätzen kann, ist das sogenannte Evidence Based Scheduling. Neben der Beschreibung der eigentlichen Methode enthält diese Webseite auch Tipps, wie man dem eigenen Zeitplan die Aufmerksamkeit verschafft, die er verdient hat.

In der Designphase kann ein Entwickler dann mitreden, wenn er sich nicht nur als einfacher Programmierer sieht, sondern sich auch aktiv mit dem Thema Softwarearchitektur auseinandersetzt. An dieser Stelle zeigt sich der essenzielle Unterschied zwischen Programmierern, Entwicklern und Architekten:

Während sich die Programmierung mit dem reinen Was auseinandersetzt, beschäftigt sich Architektur mit dem Wie. Und die Schnittstelle zwischen beidem - quasi die architekturbewusste Programmierung - ist die Entwicklung.

Den größten Einfluss hat ein Entwickler selbstverständlich auf die Entwicklungsphase einer Software, denn dies ist die Phase, mit der er selbst die meiste Zeit zubringt, und in der er sich am besten auskennt. Doch auch hier wissen viele Entwickler nicht recht, wie sie vorgehen sollen, um die Qualität ihres Codes zu verbessern (mir selbst ging es vor einigen Jahren ebenso).

Obwohl es kein Patentrezept für die Verbesserung der Qualität des eigenen Codes gibt, haben sich in der Praxis doch einige Vorgehensweisen als sinnvoll erwiesen, die ich im Folgenden noch ein bisschen näher beschreiben möchte:

  • Coderichtlinien: Der Einsatz von Coderichtlinien hilft, konsistenten Code zu schreiben, was nicht nur im Team sinnvoll ist. Auch als Einzelkämpfer profitiert man von solchen Richtlinien, denn man beginnt, sich aktiv mit dem Code auseinanderzusetzen, was zu mehr Disziplin während der Entwicklung führt Speziell zu .NET hat Microsoft in der MSDN zahlreiche Coderichtlinien veröffentlicht – angefangen bei Namensgebung über Klassendesign bis hin zu Best Practices, wie gewisse Konstrukte in .NET optimal eingesetzt werden. Ein ausgesprochen gutes und sehr empfehlenswertes Buch zu dem Thema ist Framework Design Guidelines, zu dem ich im Dezember 2008 einen Review geschrieben habe.
  • Werkzeuge: Coderichtlinien nützen nur dann etwas, wenn sie eingehalten werden. Außerdem stellt sich immer die Frage, welche Richtlinien man befolgen sollte und welche nicht. Aus Gründen der Kompatibilität zu anderen Entwicklern und auf Grund ihrer Konsistenz bietet es sich an, sich an die von Microsoft gegebenen Richtlinien zu halten. Visual Studio hilft hierbei schon ein wenig, indem es beispielsweise die Codeformatierung weitestgehend automatisch durchführt. Dennoch ist es hilfreich, ein dediziertes Programm zu nutzen, wobei hier an erster Stelle FxCop zu nennen ist. Der Einsatz von FxCop kann zunächst sehr frustrierend sein, nimmt man die Warnungen dieses Werkzeugs jedoch ernst und beschäftigt sich vor allem mit den Begründungen der Warnungen, dann lernt man im Lauf der Zeit, gewisse Regeln zu beachten.
  • Unittests: Codequalität zeichnet sich nicht nur durch formal ausgezeichneten Code aus, sondern auch dadurch, dass Code über die Zeit funktional stabil bleibt – sprich, dass sich seine Semantik nicht unabsichtlich verändert, weil Seiteneffekte unerwartete Auswirkungen haben: Dies kann zu guten Teilen mit Unittests sichergestellt werden. Dazu empfiehlt sich der Einsatz eines entsprechenden Testframeworks wie beispielsweise MBUnit, und zusätzlich die Beschäftigung mit mindestens einem Teststil, wie beispielsweise TDD oder BDD. Interessant ist, dass sich diese beiden nicht gegenseitig ausschließen, sondern sich sogar gegebenenfalls wunderbar ergänzen können.
  • Code Reviews: Vier Augen sehen bekanntlich mehr als zwei. Deshalb ist es fast immer hilfreich, eigenen Code noch einmal von einem zweiten Entwickler auf Schwachstellen überprüfen zu lassen. Hierzu sind weder spezielle Werkzeuge noch eine besondere Vorgehensweise notwendig – ein einfacher Austausch per E-Mail über den Code genügt im einfachsten Fall bereits.
  • Pair Programming: Pair Programming ist das Konzept der Code Reviews auf die Spitze getrieben. Man reviewed Code nicht nur gemeinsam, sondern man schreibt ihn direkt gemeinsam. Pair Programming ist eines der Kernkonzepte des sogenannten Extreme Programmings und bedeutet schlussendlich, dass zwei Entwickler gemeinsam vor einem Computer arbeiten – der eine entwickelt, der andere denkt aktiv mit und macht gegebenenfalls Verbesserungsvorschläge oder hinterfragt den geschriebenen Code. Das typische Argument gegen Pair Programming ist, dass zwei Entwickler gemeinsam nicht so viel Code schreiben wie ein Entwickler alleine. Rein an der Zeilenanzahl gemessen, stimmt das – die Qualität ist jedoch um Längen besser, und es gibt auf Grund der gegenseitigen Motivation weniger Leerlauf, was sich letzten Endes in weniger Zeitaufwand niederschlägt.
  • Architektur: Dass die Beschäftigung mit Softwarearchitektur ausgesprochen lohnend für eine Verbesserung der eigenen Codequalität sein kann, habe ich bereits angesprochen. Da die Frage, wie man als Entwickler denn einen Einstieg in das Thema Architektur finden, häufig gestellt wird, sei an dieser Stelle noch einmal explizit auf meinen Eintrag Architektur lernen hingewiesen.

Das Schöne an diesen Punkten ist, dass man sie größtenteils sogar in eigener Initiative durchführen kann – selbst, wenn die eigene Firma diese nicht explizit fordert oder unterstützt.

In diesem Sinne: Auf geht’s!