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.

.NET Usergroup Karlsruhe: .NET 4 und Visual Studio 2010

Freitag, 23. April 2010, 18:46 Uhr
Permalink | Kommentare (1) | Kommentare als RSSRSS

Gestern Abend war ich erstmalig bei der .NET Usergroup Karlsruhe zu Gast. Als Thema des Abends hatten wir im Vorfeld

.NET 4 und Visual Studio 2010

ausgewählt, das ich bereits am 1. März 2010 der .NET Usergroup Nordwestschweiz und am 11. März 2010 der .NET Usergroup Konstanz-Kreuzlingen präsentiert habe. Zu meiner großen Freude waren 44 Teilnehmer dabei – das Thema stößt also durchaus auf großes Interesse in der Entwicklergemeinde.

Wie auch bei den vorigen Terminen habe ich die aus meiner Sicht wichtigsten Aspekte herausgegriffen und in einem kompakten, aber detaillierten Überblick zusammengefasst:

  • Visual Studio 2010 als Editor
  • Visual Studio 2010 als Plattform
  • CLR 4.0
  • Visual C# 4.0
  • Visual F#
  • Parallelprogrammierung
  • Managed Extensibility Framework
  • Historical Debugging

Neben der reinen Vorstellung dieser Aspekte bin ich dabei aber auch auf potenzielle Nachteile eingegangen, insbesondere C# 4.0 bietet mit den neuen Sprachkonstrukten doch Anlass für einige Kritikpunkte.

Eingebettet in all dies habe ich auch zahlreiche Detailverbesserungen angesprochen – von Verbesserungen in der grafischen Oberfläche von Visual Studio bis hin zu verbesserten Best Practices.

Im Anschluss an den rund zweistündigen Vortrag gab es noch einige interessante Gespräche, so dass mir auch der gestrige Abend wieder sehr viel Spaß gemacht hat – und den Teilnehmern augenscheinlich ebenfalls.

.NET Professionals im Profil: Golo Roden

Donnerstag, 15. April 2010, 09:37 Uhr
Permalink | Kommentare (2) | Kommentare als RSSRSS

Golo Roden arbeitet auf freiberuflicher Basis als Wissensvermittler und Technologieberater für .NET, Codequalität und agile Methoden. Im Rahmen von .NET hat er sich auf die Sprache C# und die Architektur von Webanwendungen spezialisiert. Seit dem Jahr 2010 ist er Microsoft Most Valuable Professional (MVP) für C#, außerdem ist er zweifacher Microsoft Certified Professional (MCP), unter anderem für die Entwicklung .NET-basierter Webanwendungen. Sie erreichen ihn über seine Webseite und sein Blog.

N.N.: Golo, wie bist Du zur Softwareentwicklung gekommen? Wie und wann hast Du angefangen?

Golo Roden: Meinen ersten Kontakt zu Computern hatte ich, als ich zwölf Jahre alt war. Die Firma, in der mein Papa arbeitete, stellte damals auf PCs um, und er wollte sich besser einarbeiten können – also kaufte er sich einen PC. Ich weiß noch genau, dass ich eines Tages von der Schule nach Hause kam, die im Flur stehenden Pakete sah und fragte, ob ich die Pakete am Nachmittag auspacken dürfe, da meine Eltern beide wieder in die Firma gehen und arbeiten mussten.

Da sie nichts dagegen hatten, packte ich die Pakete nachmittags aus und schloss die einzelnen Kabel an und – schaltete den PC ein. Da Windows damals noch kaum verbreitet war, hatten wir nur MS-DOS zur Verfügung: Mir blinkte also ein Cursor auf der Kommandozeile entgegen und wartete auf Eingaben.

Ich hatte überhaupt keine Ahnung, was ich machen musste – wie gesagt, es war das erste Mal, dass ich überhaupt vor einem Computer saß – kannte aber die Enter-Taste von der Schreibmaschine. Also fing ich an, Befehle zu raten. Irgendwann habe ich durch Zufall „break“ eingegeben, woraufhin die Meldung „break on“ erschien. Durch Ausprobieren habe ich dann auch noch herausgefunden, dass man diesen Zustand mit Hilfe von „break on“ und „break off“ verändern konnte.

Den ganzen Nachmittag über habe ich nichts anderes mehr gemacht, als weiterhin Befehle zu raten, und gelegentlich auf meinen ersten Befehl zurückzugreifen – ohne auch nur ansatzweise zu verstehen, wofür er gut war.

Im Gegensatz zu meinen Altersgenossen, die größtenteils nur an Computerspielen und daher auch eher am C64 als an PCs interessiert waren, wollte ich etwas anderes: Ich hatte auf dem Firmen-PC meines Papas gesehen, dass man zu Beginn ein Kennwort eingeben musste. Das fand ich spannend! Und was ich wollte, war nichts anderes, als „unseren“ PC ebenfalls durch ein Kennwort zu schützen.

Zu Gute kam mir dann, dass mein Opa in Basic programmieren konnte. Er hatte zwar eigentlich ein Geschäft für Badmintonsport, hatte sich aber sein eigenes System für Warenwirtschaft und Rechnungsverwaltung entwickelt. Er zeigte mir bei einem Besuch, wie man Basic startete, ein kleines Programm eingab, es ausführte und Basic wieder beendete: Mehr als PRINT und INPUT kannte ich dann zwar noch nicht, aber ich war meinem Vorhaben, ein Programm zum Abfragen des Kennworts zu entwickeln, einen Schritt näher gekommen.

Ich weiß nicht, wie es damals weitergegangen wäre, wenn nicht auch mein Papa das Bedürfnis gehabt hätte, seine Kenntnisse zu erweitern: Gemeinsam haben wir einige Bücher zu MS-DOS durchgearbeitet, und uns irgendwann auch an GW-Basic gewagt.

Mein Interesse an Programmierung wuchs und wuchs, je mehr ich darüber lernte. Irgendwann kam dann der Umstieg auf QuickBasic, und irgendwann war auch der Punkt erreicht, an dem ich alleine weitermachen musste – schließlich wollte mein Papa kein Programmierer werden, sondern eigentlich nur seine Kenntnisse als Anwender für die Firma verbessern.

Ein Schritt hat dann zum nächsten geführt, und ich hatte das Glück, dass mich meine Eltern dabei unterstützt haben – zum einen im materiellen Sinne, da sie mir Bücher und Zeitschriften finanziert haben, zum anderen aber auch, weil sie sich so gut wie nie darüber beschwert haben, dass ich so viel Zeit vor dem Computer verbracht habe.

Während der nächsten Jahre bin ich an die Grenzen von QuickBasic gestoßen, außerdem wollte ich unbedingt die vermeintlich kryptische Syntax von C und C++ verstehen. Nach einem kurzen Ausflug zu Assembler habe ich daher begonnen, mich in C++ einzuarbeiten.

Zeitgleich bekam ein Klassenkamerad von seinen Eltern zum Geburtstag ein Modem geschenkt, mit dem es uns erstmals möglich war, in Mailboxen nach Gleichgesinnten zu suchen, und uns zusätzliche Software herunterzuladen. Auch meine Eltern zogen irgendwann nach, so dass ich zu Hause Zugriff auf das Internet hatte, was für das Lernen und den Austausch mit Gleichgesinnten enorm hilfreich war. Außerdem habe ich in dieser Zeit begonnen, mich mit den verschiedenen Webtechnologien wie HTML, CSS und JavaScript auseinanderzusetzen.

Nach meinem Abitur und einem Jahr als Zivildienstleistender lag auf der Hand, dass ich Informatik studieren würde. Meine Eltern haben mir unter anderem des Praxisbezugs wegen empfohlen, die FH zu wählen, ich wollte aber auf die Uni und mich mit den theoretischen Grundlagen beschäftigen – wenn ich damals geahnt hätte, worauf ich mich damit eingelassen habe, bin ich mir nicht sicher, ob ich genauso entschieden hätte.

Kurzum: Die Uni hat meine Erwartungen kaum erfüllt, wobei das eher an meinen Erwartungen als an der Uni lag. Wirklich spannend und von praktischem Nutzen war eigentlich nur ein halbjähriges Praktikum im Hauptstudium, in dessen Rahmen wir paarbasiert eine webbasierte Auktionsplattform entwickeln sollten. Trotzdem bin ich im Nachhinein froh, auf der Uni gewesen zu sein, denn auch wenn ich keinen direkten Nutzen daraus ziehen konnte, so glaube ich doch, dass die Zeit dort mein abstraktes, analytisches und systematisches Denken geschult hat.

N.N.: Du hast Dich auf die .NET-Plattform spezialisiert. Warum gerade .NET und nicht beispielsweise JEE (Java Enterprise Edition)?

Golo Roden: Als technische Grundlage für besagtes Praktikum diente damals J2EE mit Eclipse als Entwicklungsumgebung. Dass wir einige technische Probleme mit unseren Benutzerkonten hatten und die Versionsverwaltung nicht zuverlässig funktionierte, war dabei allerdings die kleinere Herausforderung: Sich in eine derart komplexe Technologie wie J2EE einzuarbeiten, war das eigentliche Kunststück.

Ich hatte immer das Gefühl, dass – egal an welchem Ende man anfängt – jede Antwort gleich wieder zehn neue Fragen nach sich zieht, und der Grad des Nichtwissens somit immer größer statt kleiner wird. So wohl mein Praktikumspartner wie auch ich hatten aber den Ehrgeiz, verstehen zu wollen, wie und warum diese Technologie funktionierte: Es hat uns verdammt viel Zeit gekostet. Wir haben jeden Tag von morgens bis spät Nachts ausschließlich für dieses Praktikum gearbeitet, aber wir haben unglaublich viel gelernt.

Bevor ich anfing, zu studieren, hatte ich noch einige Wochen Zeit, in denen ich mich zwar auch um Dinge wie Wohnungssuche und ähnliches kümmern musste, aber dennoch blieb viel Freizeit: Irgendwo habe ich damals auch zum ersten Mal davon gehört, dass Microsoft eine neue Entwicklungsplattform namens .NET mitsamt einer neuen Sprache namens C# plant.

Da ich Zeit hatte und ohnehin auf der Suche nach einem vernünftigen und sinnvollen Inhalt für meine Webseite war, beschloss ich, mir C# näher anzugucken und dazu ein kleines Tutorial – quasi vom Einsteiger für den Einsteiger – zu schreiben. Das Ergebnis war guide to C#, das meines Wissens nach erste deutschsprachige größere Tutorial zu C#.

Auf diese Weise hatte ich während der Zeit an der Uni einen direkten Vergleich zwischen C# und Java – und je geübter ich in C# wurde, desto mehr missfiel mir Java. Nach meinem Praktikum habe ich mir dann auch ASP.NET und ADO.NET als Alternativen zu J2EE angesehen und schließlich beschlossen, mich auf .NET und C# zu spezialisieren. Obwohl ich für diese Entscheidung und für meine generelle Begeisterung für Microsoft an der Uni stets schief angeguckt wurde, glaube ich im Nachhinein, dass es die richtige Entscheidung war.

Vergangenes Jahr habe ich mein Wissen um J2EE, das inzwischen übrigens nur noch JEE heißt, auf Vordermann gebracht – und bin dabei zu dem gleichen Ergebnis gekommen: Ich würde nicht wieder zu JEE zurück wechseln wollen.

N.N.: Deine Schwerpunkte liegen auf .NET, Codequalität und agilen Methoden. Wie hängen diese Bereiche zusammen?

Golo Roden: Die Plattform .NET bildet zusammen mit der Sprache C# die Basis. Beide zusammen befähigen einen Entwickler erst, überhaupt Anwendungen entwickeln zu können. Essenziell dabei ist, dass man als Entwickler seine Werkzeuge beherrscht. Dass dies bei .NET als Plattform nicht umfassend möglich ist, liegt auf der Hand – dafür ist .NET inzwischen viel zu umfangreich und komplex geworden.

Aus diesem Grund ist es empfehlenswert, sich auf einige wenige Bereiche zu spezialisieren. In meinem Fall sind dies die Sprache C# an sich sowie ASP.NET. Dennoch versuche ich, alle anderen Bereiche von .NET zumindest so weit zu kennen, dass ich beurteilen kann, welche Technologie ich wofür in welchem Kontext einsetzen könnte. Ich versuche auch, mich in jedem Bereich zumindest so weit auszukennen, dass es für einen ersten Einstieg genügt. Insofern bin ich in gewissem Sinne gleichzeitig ein Generalist und ein Spezialist.

Alleine der Wunsch, C# nicht nur irgendwie zu können, sondern diese Sprache wirklich zu beherrschen, ist eine Herausforderung: Angefangen bei nicht-alltäglichen Schlüsselwörtern wie yield bis hin zu Besonderheiten in der Sprachspezifikation wie dem null-Typ oder dem beforefieldinit-Flag bietet C#, aller Konsistenz zum Trotz, viel Potenzial für Stolperfallen.

Erst, wenn man eine Sprache als Entwickler wirklich beherrscht und verstanden hat, wie und warum sie intern auf ihre Art aufgebaut ist, erst dann ist man in der Lage, nicht nur effektiven, sondern auch effizienten Code zu schreiben. Das ist der erste Schritt.

Der zweite Schritt liegt darin, die Sprache in einen Kontext einzubetten. In meinem Fall ist das ASP.NET – denn eine Sprache alleine genügt noch nicht, um komplexe Anwendungen zu entwickeln. Natürlich muss jeglicher Code eine gute Architektur aufweisen, um wart- und evolvierbar zu sein. Das gilt für ASP.NET ebenso wie für jede andere Technologie. Deshalb liegt mir auch das Thema der Architektur von Webanwendungen sehr am Herzen.

Obwohl ein Entwickler mit diesen Bausteinen – C#, ASP.NET und Webarchitektur – bereits produktiv arbeiten kann, ist das Ergebnis noch nicht zwingend qualitativ hochwertig. Dazu gehört für mich nicht nur, dass das Produkt eine hübsche Fassade aufweist, auch das Innenleben muss gepflegt sein: Die Rede ist von sauberem Code, der ebenfalls wesentlich zu langfristiger Wart- und Evolvierbarkeit beiträgt.

Deshalb beschäftige ich mich auch mit dem Thema Codequalität. Dazu gehört für mich auf jeden Fall die Orientierung an CCD (Clean Code Developer), das Schreiben von Unittests, die Durchführung von Codereviews, der Einsatz von Werkzeugen zur statischen Codeanalyse, …

All dies mag aufwändig und vor allem teuer erscheinen. Allerdings ist es ein Trugschluss, zu glauben, dass man durch den Verzicht auf diese Themen Zeit oder Geld sparen könnte – denn letztlich werden die gleichen Fehler trotzdem gemacht, sie fallen nur erst später auf. Dann jedoch kostet ihre Behebung ein Vielfaches von dem, was eine von Anfang an durchgehaltene saubere Arbeitsweise gekostet hätte.

Daher ist es so wichtig, dass Entwickler ihr Augenmerk auch auf Codequalität richten – denn nur dann sind sie in der Lage, nicht nur effektiven und effizienten, sondern auch qualitativ hochwertigen Code zu schreiben.

Zu guter Letzt ist es ideal, wenn das Ausleben von Codequalität auch von einem entsprechenden Rahmenwerk getragen wird. Dieses Rahmenwerk betrifft dabei das Management, aber auch den Entwickler und dessen Team. Aus diesem Grund erachte ich es für wichtig, sich mit agilen Methoden zu befassen – denn sie bieten ein solches geeignetes Rahmenwerk. Scrum stellt dazu die äußere Hülle zur Verfügung, Extreme Programming (XP) füllt Scrum mit dem notwendigen Innenleben.

Nimmt man all diese Aspekte zusammen, dienen also alle drei Themen – .NET, Codequalität und agile Methoden – letztlich der Steigerung der Codequalität. Und genau darum geht es mir: Entwickler zu befähigen, rundum guten Code zu schreiben, anstatt sich mit halbgarem und ausgereiftem zufrieden zu geben.

N.N.: Ein wesentliches Merkmal der IT ist, dass man beständig mit neuen Entwicklungen konfrontriert wird, und diesen folgen muss. Woher nimmst Du die Motivation, Dich quasi jeden Tag weiterzubilden und mit Neuem zu beschäftigen?

Golo Roden: Um ehrlich zu sein: Ich weiß es nicht. In mir verspüre ich einen stetigen inneren Drang, mich verbessern zu wollen, mehr lernen zu wollen, immer weiter voranzukommen und dabei etwas zum Guten zu bewegen. Deswegen muss ich die Motivation nirgendwo hernehmen – ich habe sie einfach.

Natürlich gibt es auch immer mal Tage, an denen man sich nicht aufraffen kann. Mir hilft an solchen Tagen, mir zu sagen, dass es sehr schwer sein kann, einen Stein erst einmal ins Rollen zu bringen – ihn aber am Rollen zu halten, sobald er einmal am Rollen ist, ist deutlich einfacher. Übertragen auf die Softwareentwicklung soll das heißen: Auch wenn man sich zu nichts Großem aufraffen kann, genügt es häufig, mit Kleinigkeiten loszulegen.

Erstens summieren diese sich über den Tag verteilt auch auf, zweitens fällt es leichter, sich an große Aufgaben zu wagen, wenn man bereits im Fluss ist und einfach nur die nächste Aufgabe vom Stapel nehmen muss.

N.N.: Wenn sich ein Anfänger heute mit dem Thema Softwareentwicklung befassen will – welche Voraussetzungen sollte er Deiner Meinung nach dafür mitbringen, und was siehst Du als No-Go an?

Golo Roden: Ich glaube, dass es nur drei Voraussetzungen gibt, die einen guten Softwareentwickler ausmachen: Zum einen der eben erwähnte innere Drang, immer weiter vorankommen zu wollen. Wem das fehlt, der wird über kurz oder lang schlichtweg keinen Spaß mehr daran haben, ständig etwas Neues machen zu müssen. Das sind dann jene Entwickler, die sich Neuerungen per se verschließen, immer mit dem Argument spielend, dass ihre Vorgehensweise „früher auch schon so funktioniert“ habe.

Wer also von sich aus diesen inneren Drang verspürt, hat eine der drei größten Hürden meines Erachtens bereits genommen. Alles andere ist dann nur noch eine Frage der Zeit und des Aufwands, aber prinzipiell ist diese Motivation eine Schlüsselqualifikation. Das ist die gute Nachricht.

Zugleich ist es aber auch die schlechte Nachricht. Denn wer diesen inneren Drang nicht verspürt, der wird ihn sich, zumindest meines Erachtens, auch nie wirklich aneignen können. Entweder ist man so – oder man ist es eben nicht. Daran ändern kann man in der Regel kaum etwas – ebenso wenig wie an der Tatsache, ob man Links- oder Rechtshänder ist.

Als zweite Voraussetzung ist für einen guten Softwareentwickler Liebe zum Detail erforderlich. Zum einen, weil auch vermeintliche Kleinigkeiten sehr komplexe Auswirkungen haben können, zum anderen aber auch, weil sich Kleinigkeiten so schnell summieren – und das sofortige Beheben eines Fehlers so wohl zeitlich wie auch finanziell deutlich günstiger ist als wenn es zu einem späteren Zeitpunkt erfolgt.

Als Softwareentwickler muss man jederzeit exakt und mit Präzision arbeiten, wie wenn man ein Schweizer Uhrwerk zusammensetzen würde – und nur einen Versuch hätte. Das fängt bei einer wohlüberlegten und durchdachten Namensgebung an und hört bei der Rechtschreibung innerhalb von Kommentaren auf. Dies wird desto wichtiger, je eher man nicht als einzelner Entwickler, sondern im Team arbeitet.

Die dritte und letzte Voraussetzung ist meines Erachtens eine gewisse konstruktive und zugleich reflektierte Einstellung. Tritt ein Problem auf, so ist es für den Kunden zunächst einmal irrelevant, welcher Entwickler des Teams dafür verantwortlich ist – wichtig ist zunächst, dass der Fehler auf saubere Art behoben wird, auch hier spielt also wieder die Liebe zum Detail mit hinein. Zunächst gilt es also, konstruktiv nach vorne zu blicken und zu überlegen, was man machen kann, um die Situation zu verbessern.

Natürlich muss auch überlegt werden, wie es zu dem Fehler kam und wie man zukünftig mit solchen Situationen umgehen will. Eine Retrospektive tut also Not, in der rückblickend bewertet wird, was gut und was schlecht lief. Dies sollte jedoch regelmäßig und zu dedizierten Zeitpunkten stattfinden, um die konstruktive Arbeit nicht ständig zu unterbrechen.

Wer diese drei Voraussetzungen – einen stetigen Verbesserungsdrang, Liebe zum Detail wie auch eine konstruktive und zugleich reflektierte Einstellung – erfüllt, hat gute Chancen, als Softwareentwickler erfolgreich zu sein.

N.N.: Bei der Vielzahl an Technologien, die es heute gibt: Womit sollte ein Anfänger heutzutage anzufangen?

Golo Roden: Das Hauptproblem ist inzwischen, dass viele Anfänger zu viel auf einmal wollen: Da genügt es nicht mehr, eine statische Webseite zu entwickeln, sondern es muss von vornherein eine dynamische Webseite mit Datenbankanbindung und RIA-Frontend sein. Natürlich ist es möglich, sich in die dafür benötigten Technologien auf die Schnelle irgendwie einzuarbeiten – aber die Genauigkeit und Präzision geht dabei verloren.

Paradox an dieser Situation ist, dass die heute verfügbaren Technologien sehr stark von den Grundlagen abstrahieren und somit Glauben machen, man könnte sie so leicht erlernen. Gleichzeitig werden aber genau diese Grundlagen immer stärker gefragt, um mit Ungenauigkeiten in der Abstraktion umgehen zu können. Es schadet also auch heute nicht, sich mit gewissen Basics zu befassen.

Daher würde ich einem Anfänger raten, eine ähnliche Richtung einzuschlagen wie sie die Entwicklung der Technologien an sich genommen hat. Das heißt, er sollte mit kleinen Konsolenanwendungen beginnen und zunächst die jeweilige Sprache lernen. Erst wenn er das beherrscht, sollte er den Schritt zu grafischen Oberflächen oder Webtechnologien wagen. Erst danach sollte er sich mit Datenbankanbindung befassen – und auch hier wieder zuerst mit SQL, erst dann mit O/R-Mappern. Und so weiter …

Letztlich würde ich also dazu raten, Geduld zu haben, und Schritt für Schritt aufeinander aufzubauen, um sich solides Wissen als Fundament anzueignen. Auf anderem Wege kommt man auf den ersten Blick zwar deutlich schneller voran, scheitert aber auch wesentlich schneller – weil die besagten notwendigen Grundlagen fehlen.

N.N.: Welchen Rat würdest Du einem Anfänger abschließend mit auf den Weg geben?

Golo Roden: Wenn ein Anfänger die genannten Voraussetzungen erfüllt und bereit ist, eine gehörige Portion Zeit und Aufwand zu investieren, dann ist das bereits eine sehr gute Ausgangsbasis. Wer zudem nicht so schnell aufgibt und dazu neigt, allen Widerständen zum Trotz beharrlich und geduldig nach Lösungswegen zu suchen, der ist ebenfalls gut beraten.

Letztlich bleibt dann nur noch zu sagen: Auf geht’s!

dotnetpro Powerday am 22. Juni 2010

Donnerstag, 8. April 2010, 21:11 Uhr
Permalink | Kommentare (1) | Kommentare als RSSRSS

Sie sprechen diese Sprache jeden Tag, sie ist Ihnen fast so vertraut wie ihre eigene Muttersprache – und doch gibt es Kleinigkeiten, die Ihnen das Leben immer wieder unnötig schwer machen.

Die Palette reicht dabei von exotischen und selten verwendeten Schlüsselwörtern bis hin zu unerklärlichem und scheinbar widersprüchlichem Verhalten. Fakt ist – obwohl C# als Sprache bedeutend einfacher zu lernen ist als viele andere Sprachen, ist es nicht per se einfach.

Doch es gibt Abhilfe: Am 22. Juni 2010 findet in München ein dotnetpro Powerday unter dem Titel

C# für Profis

statt. Dieser Powerday führt Sie detailliert in die Feinheiten der Sprache C# ein und vermittelt Ihnen fundiertes Wissen: Subtile Eigenarten der Sprache werden dabei ebenso beleuchtet wie bemerkenswerte Interna.

Außerdem wird der Einsatz von C# als Multiparadigmensprache – von objektorientiert bis funktional – vorgestellt. Dabei wird auch auf die neuen Sprachmerkmale von C# 4.0 eingegangen und erläutert, wann und in welchem Kontext diese verwendet werden sollten und wann nicht.

Nach dieser eintägigen Veranstaltung wissen und verstehen Sie, wie sich C# wann verhält – und vor allem auch, warum.

Freiberuflicher Wissensvermittler und Technologieberater

Samstag, 3. April 2010, 20:24 Uhr
Permalink | Kommentare (4) | Kommentare als RSSRSS

Am 1. Juni 2010 wird es so weit sein: Ich mache den Schritt in die endgültige und vollständige Selbständigkeit. Ab diesem Tag werde ich auf freiberuflicher Basis als Wissensvermittler und Technologieberater für .NET, Codequalität und agile Methoden arbeiten.

Im Rahmen von .NET habe ich mich dabei auf die Sprache C# und die Architektur von Webanwendungen spezialisiert. Meine Auszeichnung als Microsoft Most Valuable Professional (MVP) für C# am 1. April 2010 wie auch meine zweifache Zertifizierung als Microsoft Certified Professional (MCP), unter anderem für die Entwicklung .NET-basierter Webanwendungen, unterstützen diese Schwerpunkte.

Besonderes Augenmerk richte ich bei der Entwicklung einer Webanwendung auf eine auch in der Zukunft tragfähige Architektur wie auch auf die Erreichung einer sehr guten Wartbarkeit und Evolvierbarkeit des Codes. Zu diesem Zweck lege ich besonderen Wert auf hohe Codequalität, von der Einhaltung etablierter Coderichtlinien über testgetriebene Entwicklung bis hin zu Codeanalyse und -reviews.

Dabei unterstützen mich mein akkurates, präzises und reflektiertes Vorgehen wie auch ausgeprägte analytische Fähigkeiten: Ich plane, entwerfe und entwickle mit Liebe zum Detail und achte stets auch auf Feinheiten. Als bekennender Clean Code Developer trete ich zudem für Professionalität in der Softwareentwicklung ein.

Meine Arbeitsweise richtet sich dabei nach den agilen Werten, die durch das Agile Manifest definiert werden, zu dessen Unterzeichnern ich gehöre. Inbesondere schätze ich Extreme Programming (XP) und Scrum als einander ergänzende agile Methoden zur Durchführung von Projekten.

Zu all diesen Themen vermittle ich Wissen und berate Firmen, die auf Basis von .NET Softwareentwicklung durchführen, bei der Evaluierung, Erforschung und Verwendung geeigneter Technologien und Methoden, wobei mir meine langjährige Erfahrung als Softwarearchitekt und Technologieberater wie auch als Autor, Referent und Trainer zu Gute kommt.

Darüber hinaus werde ich auch zukünftig journalistisch für Fachzeitschriften wie auch als Referent und Content Manager für Konferenzen tätig sein. .NET-affinen Usergroups stehe ich als INETA-registrierter Referent ebenfalls zur Verfügung. Weiterhin werde ich außerdem Webcasts für die deutschsprachige MSDN erstellen.

Wenn Sie meine Unterstützung bezüglich Beratung oder Training zu den Themen .NET, Codequalität und agilen Methoden anfordern möchten, können Sie mich gerne jederzeit per E-Mail oder telefonisch kontaktieren. Ich freue mich auf Ihre Anfrage!

Unit- vs Integrationtests

Freitag, 2. April 2010, 12:53 Uhr
Permalink | Kommentare (5) | Kommentare als RSSRSS

Warum der Einsatz von Unittests generell Sinn ergibt, habe ich in vor einigen Tagen in meinem Blogeintrag Vom Saulus zum Paulus beschrieben. Doch was ist überhaupt ein Unittest? Wie grenzt er sich von anderen Arten von Tests ab?

Häufig werden insbesondere Unit- und Integrationtests vermischt – doch um überhaupt eine Trennung erreichen zu können, ist zunächst eine Klärung des Begriffs Unit nötig, ist sie schließlich das individuelle Merkmal eines Unittests. Es gilt also, zwei Fragen zu beantworten:

  • Wie wird der Begriff Unit definiert?
  • Welcher Unterschied besteht zwischen Unit- und Integrationtests?

Einen ersten Anhaltspunkt liefert die deutschsprachige Wikipedia auf ihrer Seite zum Thema Unittest, werden Unittests dort nämlich als

Modultest[s] (auch Komponententest[s])

bezeichnet. Ein Unittest testet also eine Komponente. Dieser Begriff hat nicht zuletzt dank der zunehmenden Verbreitung des Entwurfsmusters Inversion of Control und entsprechenden Dependency Injection-Containern wie beispielsweise LightCore eine gewisse Verbreitung erfahren.

Eine Komponente wird in diesem Zusammenhang in der Regel als ein Softwarepart definiert, der folgende Anforderungen erfüllt:

  • Unabhängig: Eine Komponente ist unabhängig von einem konkreten Projekt, sondern kann flexibel in verschiedenen Projekten genutzt und nach Bedarf hinzugefügt werden. Komponenten dürfen dabei natürlich Abhängigkeiten auf andere Komponenten aufweisen, wobei diese jedoch die gleichen Anforderungen erfüllen müssen.
  • Kontrakt: Eine Komponente verfügt über einen wohldefinierten Kontrakt, der neben der Syntax auch eine gewisse Semantik vorgibt. Der Verwender einer Komponente kennt nur deren Kontrakt, weshalb Komponenten gegen andere Komponenten austauschbar sind, sofern von beiden der gleiche Kontrakt erfüllt wird.
  • Blackbox: Eine Komponente fungiert als Blackbox, das heißt, die Interna – auf welche Art ist welche Funktionalität implementiert – spielen für den Verwender keine Rolle. Da der Verwender eine Komponente nur auf Basis ihres Kontrakts verwendet, interessieren ihn diese Interna in der Regel auch nicht.

Unittests sind zunächst lediglich ein weiterer Verwender von Komponenten. Das heißt, dass die Unittests die an eine Komponente gestellten Anforderungen respektieren und keinen Weg suchen, diese zu umgehen.

Insbesondere bedeutet das, dass ein Unittest nur den Teil einer Komponente testet, der über ihren Kontrakt öffentlich erreichbar ist. Konkrete Implementierung ist gemäß dem Blackbox-Prinzip von Komponenten nicht nach außen – also auch nicht für Unittests – sichtbar.

Außerdem muss ein Unittest eine Komponente unabhängig von anderen Komponenten testen – ansonsten könnten Fehler nicht nur von der Komponente an sich, sondern auch von der Interaktion zwischen verschiedenen Komponenten verursacht werden. Stubs und Mocks sind aus diesem Grund essenziell für die Entwicklung von Unittests.

Zusammengefasst garantiert ein Unittest also, dass eine Komponente ihrem Kontrakt in syntaktischer und semantischer Hinsicht entspricht, Ein Integrationtest hingegen testet das Zusammenspiel verschiedener Komponenten, wobei implizit von der Korrektheit der einzelnen Komponenten ausgegangen wird.

Wann immer also eine Komponente nicht isoliert, sondern im Verbund mit anderen Komponenten getestet wird, handelt es sich bei einem Test um einen Integration- und nicht mehr um einen Unittest. Daraus ergibt sich, dass sich Unit- und Integrationtests ergänzen, aber sauber getrennt werden sollten – schließlich handelt es sich auch um verschiedene Arten von Tests.

Microsoft Most Valuable Professional (MVP) für C#

Donnerstag, 1. April 2010, 21:14 Uhr
Permalink | Kommentare (5) | Kommentare als RSSRSS

Heute erhielt ich die Nachricht von Microsoft, dass ich für mein Engagement in der Community und mein Wissen zu C# als Microsoft Most Valuable Professional (MVP) ausgezeichnet wurde.

Für diese Ehre bedanke ich mich bei Microsoft von ganzem Herzen, denn ich freue mich sehr darüber und weiß diese ganz besondere Anerkennung sehr zu schätzen!

Funktional oder objektorientiert?

Donnerstag, 1. April 2010, 09:37 Uhr
Permalink | Kommentare (8) | 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. April 2010, ist es nun wieder so weit, und unser Thema für diesen Monat lautet:

Funktional oder objektorientiert?

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:

Nicht-objektorientierten Sprachen wurde in den vergangenen Jahren eine deutlich höhere Aufmerksamkeit als davor zuteil: JavaScript als dynamische Sprache hat im Rahmen von AJAX daran ebenso Anteil gehabt wie F# als funktionale Sprache und Ableger von OCaml und ML.

Doch auch außerhalb von .NET haben beispielsweise Ruby im Rahmen von Rails und Python – jeweils als dynamische Sprachen – zunehmende Verbreitung erfahren. Inzwischen stehen mit IronRuby und IronPython auch entsprechende .NET-Vertreter dieser Sprachen auf Basis der Dynamic Language Runtime zur Verfügung.

Darüberhinaus führt der Tiobe-Index statische Sprache nur noch bei rund 60 Prozent, und auch der Anteil der objektorientierten Sprachen ist im Vergleich zum Vorjahr um knapp drei Prozent gefallen.

Auf den ersten Blick scheinen funktionale Sprachen also kräftig auf dem Vormarsch zu sein, ebenso wie dynamische Sprachen. Ist es also ratsam, sich mit diesen Sprachen auseinanderzusetzen?

Bevor man diese Frage beantworten kann, soll noch einmal deutlich darauf hingewiesen werden, dass funktionale Sprachen ein anderes Paradigma verfolgen als objektorientierte Sprachen – nämlich das funktionale an Stelle des objektorientierten Paradigmas – , dynamische Sprachen aber nicht per se: Während sich das funktionale von funktionalen Sprachen auf die Art der Entwicklung bezieht, weisen dynamische Sprachen einfach nur ein flexibles Typsystem auf.

Das bedeutet, dass eine dynamische Sprache sehr wohl objektorientiert sein kann, aber nicht muss, und dass eine funktionale Sprache nicht zwingend dynamisch sein muss – aber kann.

Über die Bedeutung von dynamischen Sprachen haben Peter und ich uns schon in unserem ersten Streitgespräch unter dem Titel Dynamic Language Runtime: .NET, quo vadis? Gedanken gemacht – funktionale Sprachen bislang allerdings noch nicht. Spätestens seit F# als neue Sprache in Visual Studio 2010 enthalten ist, wird es aber Zeit, sich die Frage zu stellen, inwiefern sich die Beschäftigung mit funktionalen Sprachen lohnt.

Liest man die Definition von funktionaler Programmierung, die in Wikipedia gegeben wird, ist die Nähe zur Mathematik unübersehbar. Auch die Sprachkonstrukte von F#, wie beispielsweise explizite Unterstützung von Rekursion, die Unterstützung von Funktionen höherer Ordnung und die Fähigkeiten zur Listenverarbeitung und –manipulation, legen nahe, dass der Fokus von F# auf der Verarbeitung von Datenstrukturen liegt.

Da für funktionale Sprachen die Turing-Vollständigkeit bewiesen wurde, ist klar, dass sich jedes programmatisch lösbare Problem auch in einer funktionalen Sprache lösen lässt – die Frage ist nur, wie elegant: Natürlich können grafische Oberflächen auch in funktionalen Sprachen entwickelt werden – wirklich Spaß macht das aber nicht. Hierbei merkt man allzu häufig, dass F# andere Schwerpunkte setzt.

So gesehen stellt F# also eine hochspezialisierte und äußerst gut geeignete Sprache für algorithmische Probleme dar – als Allzwecksprache für den tagtäglichen Einsatz eignet sie sich jedoch weniger. Andere funktionale Sprache verhalten sich in dieser Eigenschaft ähnlich wie F#.

Ein interessanter Aspekt ist zudem, dass das objektorientierte Paradigma mehr bietet als nur eine Art, wie Code geschrieben wird. Die Objektorientierung gibt von Haus aus nämlich außerdem bereits ein hierarchisches Modell vor, wie Code organisiert wird – in Methoden, Klassen und Namensräume, die auf Grund von Vererbung und Komposition miteinander in Beziehung stehen und durch abstrakte Basisklassen und Schnittstellen mit Kontrakten versehen werden können.

Funktionaler Programmierung fehlt ein solcher Ansatz: Hier ist schlichtweg alles eine Funktion – was auf der einen Seite gerade die Stärke funktionaler Programmierung begründet, auf der anderen Seite aber auch viel mehr Disziplin und die Existenz eines eigenen Ordnungssystems erfordert.

So gesehen kann man mit Fug und Recht behaupten, dass objektorientierte Sprachen für den tagtäglichen Einsatz die geeigneteren Sprachen sind, da sie universeller und besser strukturierend sind. Für algorithmische Spezialaufgaben mag es aber durchaus lohnenswert sein, eine funktionale Sprache zur Problemlösung in Betracht zu ziehen.

Insofern fällt mein Fazit daher ähnlich wie zu den dynamischen Sprachen aus: Die Koexistenz beider Welten dürfte .NET insgesamt voranbringen, da es besser möglich wird, das am besten geeignete Werkzeug für die jeweilige Aufgabe zu wählen, ohne eine ausgereifte Plattform wie .NET verlassen zu müssen.