<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Stephan Schmidt &#187; Software Entwicklung</title>
	<atom:link href="http://blog.schst.net/category/software-entwicklung/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.schst.net</link>
	<description>entwicklung / it management / privat</description>
	<lastBuildDate>Sun, 11 Jul 2010 08:15:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Webinale / IPC 2010 in Berlin</title>
		<link>http://blog.schst.net/2010/06/webinale-ipc-2010-in-berlin/</link>
		<comments>http://blog.schst.net/2010/06/webinale-ipc-2010-in-berlin/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 21:24:13 +0000</pubDate>
		<dc:creator>schst</dc:creator>
				<category><![CDATA[IT Management]]></category>
		<category><![CDATA[Software Entwicklung]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Konferenzen]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software Design]]></category>

		<guid isPermaLink="false">http://blog.schst.net/?p=648</guid>
		<description><![CDATA[Eine PHP Konferenz in Berlin war für mich die ideale Kombination, endlich mal wieder meinen Koffer zu packen, in einen Zug zu sitzen und mich vier Tage in einem Hotel mit einer Menge Entwickler aufzuhalten.
Berlin fand ich spitze, aber da das hier kein Blog über Städtereisen ist, schreibe ich heute „nur” eine kurze Zusammenfassung dessen, [...]]]></description>
			<content:encoded><![CDATA[<p>Eine PHP Konferenz in Berlin war für mich die ideale Kombination, endlich mal wieder meinen Koffer zu packen, in einen Zug zu sitzen und mich vier Tage in einem Hotel mit einer Menge Entwickler aufzuhalten.</p>
<p>Berlin fand ich spitze, aber da das hier kein Blog über Städtereisen ist, schreibe ich heute „nur” eine kurze Zusammenfassung dessen, was ich mit <a title="Blog von Nico Steiner" href="http://www.nicosteiner.de/">Nico</a> und <a title="Blog von Frank Kleine" href="http://blog.frankkleine.de/">Frank</a> auf der <a href="http://it-republik.de/php/phpconference/">International PHP Conference Spring Edition 2010</a> und der <a href="http://createordie.de/webinale2010/">Webinale 2010</a> erlebt und gelernt habe.</p>
<h2>Die Workshops</h2>
<p>Begonnen hat die Konferenz für mich mit einem Workshop am Sonntag nachmittag (morgens hatten wir eine Stadtrundfahrt, aber dazu wollte ich ja hier nichts schreiben). Der Workshop <em><a href="http://www.slideshare.net/mayflowergmbh/softwarearchitektur-vs-php">„Softwarearchitektur vs PHP”</a></em> von Johann-Peter Hartmann war sehr unterhaltsam und mit der Vorstellung von <a href="http://en.wikipedia.org/wiki/Architecture_Tradeoff_Analysis_Method">ATAM (Architecture Tradeoff Analysis Method)</a> habe ich auch etwas neues gelernt. Ich hatte zwar mit etwas mehr Inhalten zum Thema Architektur gerechnet und hätte auf den interaktiven Teil auch verzichten können, aber alles in allem war es ein interessanter Vortrag.</p>
<h2>Montag</h2>
<p>Der Montag startet mit zwei eher durchwachsenen Keynotes: Während der Vortrag „<em>Die Mensch-Maschine-Beziehung und ihre Folgen</em>” von <a href="http://www.ibrahimevsan.de/">Ibrahim Evsan</a> unterhaltsam war, obwohl er nichts Neues erzählt hatte, war die Google-Keynote „<em>Die Zukunft liegt in der Cloud</em>” einfach nur langweilig. Der Gipfel war, dass Petra Sonnenberg zeigen wollte, wie in Zukunft alle unsere Applikationen in der Cloud laufen, gleichzeitig aber eine Präsentation mit <a href="http://docs.google.com">Google Docs</a> erstellt hatte, die aussah wie die ersten Gehversuche mit Power Point. Geendet hat die Keynote mit einem Werbevideo von Google. Nicht gerade das, was ich mir von einem Unternehmen wie Google versprochen hatte.</p>
<p>Danach kam das Highlight des Tages: <a href="http://koschwitz.org/studio/">Julian Koschwitz</a> hat in seiner Session zu „<em>Augmented Editorial Design</em>” gezeigt, wie man klassische Printmedien mit dem Web verbinden kann und Magazine um dynamischen Content wie Videos oder Sound anreichern kann. Eine Webcam und ein Browser ist ausreichend. Ähnlich gut war die erste Session der IPC, die ich danach besucht habe. David Soria Parra hat sehr anschaulich dargestellt, wie „Git für Fortgeschrittene” Probleme beseitigt, die viele von uns mittlerweile mit Subversion haben.</p>
<p>Nachmittags ging es mit einem Vortrag zu „<em>Continuous Integration und Continuous Deployment</em>” von <a href="http://manuel-pichler.de/">Manuel Pichler</a> weiter, von dem ich mir auch mehr erhofft hatte. Manuel hat die zwar Bewegründe für CI und wie man es schrittweise einführt schön zusammengefasst, der Teil über Deployment ist leider sehr kurz ausgefallen und war für mich leider nicht hilfreich, da wir täglich und nicht nur wöchentlich deployen.</p>
<p>Abgeschlossen habe ich den Tag mit der für mich langweiligsten Session der Webinale: „<em>Positive User Experience durch User Centered Web Design</em>”. Meine Experience war in diesem Vortrag nicht sehr positiv, was zum Teil auch an der fortgeschrittenen Uhrzeit gelegen haben mag.</p>
<h2>Dienstag</h2>
<p>Der Dienstag morgen begann mit einem Vortrag zu „<em>Frontend Performance mit PHP</em>” von Frank und Nico, der sehr gut besucht war und mir auch noch ein paar neue Impulse gegeben hat, obwohl ich natürlich wußte, was auf mich zu kommt.</p>
<p><object id="__sse4394585" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=frontend-performance-php-100602174705-phpapp02&amp;stripped_title=frontendperformance-ipc-2010" /><param name="name" value="__sse4394585" /><param name="allowfullscreen" value="true" /><embed id="__sse4394585" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=frontend-performance-php-100602174705-phpapp02&amp;stripped_title=frontendperformance-ipc-2010" name="__sse4394585" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Da sich <a href="http://www.jvm.com/">Jung von Matt</a> für die aktuelle 1&amp;1 Kampagne verantwortlich zeigt, habe ich mir danach die Session „<em>Künftig entscheidend für den Erfolg (fast) jeder Marke: Produktinfo und -inszenierung</em>” von Michael Behrens angeschaut. Die Beispiele, die er gezeigt hat, waren interessant, jedoch weit weg von dem, was JvM für 1&amp;1 macht. Deutlich cooler waren auch die Beispiele, die <a href="http://codemoiunmouton.wordpress.com/">Michael Chaize</a> in seiner Session „<em>Ten Innovative Projects for the Flash Platform</em>” gezeigt hat. Von 3D-Grafiken über Gesichtserkennung bis hin zur Emulation von Spielekonsolen war da für jeden was dabei. Flash scheint (leider) trotz HTML5 immer noch nicht tot zu sein.</p>
<p>Durch das ständige Vertauschen von Sessions habe ich leider mittags einige Sessions verpasst und die Zeit genutzt, was für&#8217;s Büro zu programmieren. Abgeschlossen habe ich den Tag mit einer spontanen Session zu <a href="http://developer.yahoo.com/yql/">YQL</a> von Yahoo!, in der leider nur die Standard-Beispiele gezeigt wurden.</p>
<h2>Mittwoch</h2>
<p>Den Mittwoch habe ich nach dem Hotel-Checkout wieder mit zwei Keynotes auf der Webinale begonnen. David Carr hat in seiner Keynote „<em>The Speed of Now</em>” den Namen zum Programm gemacht und ist extrem schnell durch eine Masse an Slides gegangen, so dass man ihm kaum noch folgen konnte. Ossi Urchs Keynote „<em>Social Web oder Die neue Macht der Nutzer</em>” klang eher nach einer Keynote von 2008 als nach einer Keynote in der man Trends für 2011 erfahren hätte. Das allgegenwärtige „Twitter, Facebook und Smartphones beherrschen unser Leben!” wurde am dritten Tag der Webinale dann doch etwas alt.</p>
<p>Danach fand die Panel Diskussion „<em>Holy Code, holy Shit! &#8211; Die Developer-Designer-Hölle</em>” statt, an der ich auch beteiligt war. Leider war es organisatorisch nicht möglich, dass sich alle Teilnehmer vorher treffen, so dass hier keine wirkliche Diskussion entstand und es eher bei „Thema verfehlt” einzuordnen war. Sollte ich jemals wieder an einer Panel-Diskussion teilnehmen, dann nur, wenn es vorher auch möglich ist, sich mit den anderen Teilnehmern und vor allem dem Moderator abzustimmen.</p>
<p>Nach der Mittagspause war ich dann mit meinem Vortrag „<em>23 Dinge, die Sie über Software-Entwicklung in Teams wissen sollten”</em> dran.</p>
<p><object id="__sse4394605" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=schmidt-stephan-23-dinge-ueber-software-entwicklung-100602175022-phpapp01&amp;stripped_title=23-dinge-die-sie-ber-softwareentwicklung-in-teams-wissen-sollten" /><param name="name" value="__sse4394605" /><param name="allowfullscreen" value="true" /><embed id="__sse4394605" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=schmidt-stephan-23-dinge-ueber-software-entwicklung-100602175022-phpapp01&amp;stripped_title=23-dinge-die-sie-ber-softwareentwicklung-in-teams-wissen-sollten" name="__sse4394605" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Der Vortrag lief gut, ich habe mir auch meinen „<em>Cowboy/Indianer</em>”-Witz merken können und das Feedback war durchweg positiv. Abgeschlossen habe ich den Tag mit einem Vortrag von Frank zum Thema „<em>A better Approach for File System dependent tests</em>”, in dem Frank sein Projekt <a href="http://code.google.com/p/bovigo/wiki/vfsStream">vfsStream</a> vorgestellt hat.</p>
<p>Zusammenfassend hat sich der Besuch der Konferenzen für mich mehr gelohnt, als das in den letzten Jahren der Fall war. Tatsächlich habe ich während der Konferenz jedoch festgestellt, dass mich die Themen der Webinale mittlerweile mehr fesseln als die Sessions auf der PHP Conference.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schst.net/2010/06/webinale-ipc-2010-in-berlin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kleine Schritte sind besser als keine Schritte</title>
		<link>http://blog.schst.net/2010/02/kleine-schritte-sind-besser-als-keine-schritte/</link>
		<comments>http://blog.schst.net/2010/02/kleine-schritte-sind-besser-als-keine-schritte/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 06:55:40 +0000</pubDate>
		<dc:creator>schst</dc:creator>
				<category><![CDATA[IT Management]]></category>
		<category><![CDATA[Software Entwicklung]]></category>
		<category><![CDATA[Politiker]]></category>
		<category><![CDATA[Produktivität]]></category>
		<category><![CDATA[Teamarbeit]]></category>
		<category><![CDATA[Zitate]]></category>

		<guid isPermaLink="false">http://blog.schst.net/?p=356</guid>
		<description><![CDATA[Eigentlich hatte unter diesem Titel geplant, einen Eintrag über die Pfadfinder-Regel zu schreiben, die Robert C. „Uncle Bob” Martin in seinem Buch Clean Code vorstellt:
Leave the campground cleaner than you found it.
Genau an dem Tag, als ich den Eintrag schreiben wollte, kamen mir jedoch Nils und Holger zuvor. Mein erster Impuls war, meinen Eintrag einfach zu [...]]]></description>
			<content:encoded><![CDATA[<p>Eigentlich hatte unter diesem Titel geplant, einen Eintrag über die Pfadfinder-Regel zu schreiben, die Robert C. „<em>Uncle Bob</em>” Martin in seinem Buch Clean Code vorstellt:</p>
<blockquote><p>Leave the campground cleaner than you found it.</p></blockquote>
<p>Genau an dem Tag, als ich den Eintrag schreiben wollte, kamen mir jedoch <a href="http://www.phphatesme.com/blog/softwaretechnik/die-pfadfinderregel/">Nils</a> und <a href="http://rueprich.de/bloggt/2010/01/clean-code-mit-hilfe-der-pfadfinder-regel">Holger</a> zuvor. Mein erster Impuls war, meinen Eintrag einfach zu löschen und das Thema zu den Akten zu legen. Doch Schritt für Schritt (wer findet hier den Wortwitz?) bin ich wieder zu der Idee zurück gekehrt.</p>
<p><a href="http://de.wikipedia.org/wiki/Willy_Brandt"><img class="size-medium wp-image-396 alignright" title="Willy Brandt" src="http://blog.schst.net/wp-content/uploads/2010/02/Willy-Brandt-213x300.jpg" alt="" width="149" height="210" /></a> Die Überschrift „<strong><em>Kleine Schritte sind besser als keine Schritte</em></strong>” war das Motto von Willy Brandt (dt. Bundeskanzler von 1969 bis 1974), der damit seine Ostpolitik der langsamen Annäherung beschrieben hat.</p>
<p>Willy Brandt hat bei diesem Zitat sicher nicht an Uncle Bob, Coding Standards und kleine Refactorings gedacht. Sehr viele Entwickler, die sich die Pfadfinder Regel auf die Fahne schreiben, beschränken diese jedoch zu stark auf den Quellcode und wenden diese nicht ganzheitlich auf die eigene Arbeit und das Umfeld an. Richtig aufgefallen ist mir das auch erst in den letzten Wochen, in denen ich ausführlich mit <a href="http://rueprich.de/ist">Holger</a> über Clean Code und die Einührung der Prinzipien in unseren Teams gesprochen habe.</p>
<p>Wenn Willy Brandt diese Regel auf eine Ostpolitik angewandt hat und damit eine Annäherung an Polen und die damalige Sowjetunion damit geschafft hat, dann sollten wir diese Regel auch in unserem täglichen Arbeitsumfeld anwenden können.</p>
<p>Ein gutes Beispiel ist, dass ich auf Konferenzen, auf denen ich über Clean Code, Testgetriebene Entwicklung und eine Menge andere „<em>gute Dinge</em>” geredet habe, am Ende immer gefragt werde, wie man diese in Teams einführt. Für die Teilnehmer sieht das immer nach einem großen Schritt aus, ein Team, das kein Verständnis für eine geminesame Code-Basis, Qualität und Entwicklungsmethodik hat, in ein Team zu transformieren, das bei der Entwicklung <strong>und</strong> der Pflege des Codes harmonisiert. Meine Antwort ist auch hier immer die selbe: <em>Man muss es in kleinen Schritten angehen.</em> Sie werden es nicht schaffen, das Bewußtsein für neue Entwicklungsmethodiken bei allen Teammitgliedern sofort zu wecken, also wecken Sie es bei einem und schauen Sie, wie es sich danach entwickelt.</p>
<p>Ähnlich verhält es sich bei der klassischen Beförderung vom Entwickler zum Leiter eines Entwicklungsteam. Sie können planen, wie Sie als perfekter Teamleiter sein könnten und diesen Plan dann in einem Jahr umsetzen. Oder Sie fangen morgen an und erledigen eine Teilaufgabe Ihres neuen Jobs mit Bravour und gehen dann die nächste an.</p>
<p>Sei es also ein neues Projekt oder ein neuer Job, der eine große Veränderung bedeutet, so ist der erfolgsversprechende Weg der, der mit vielen kleinen Schritten auf ein Ziel führt, das sich vielleicht sogar während des Wegs verändert.</p>
<p>Und wäre das nicht zu dramatisch für das Ende eines Blog-Artikels, würde ich jetzt schreiben:</p>
<p><em>Danke Willy Brandt. Danke Uncle Bob. Danke Holger.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schst.net/2010/02/kleine-schritte-sind-besser-als-keine-schritte/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hip Hop Not For PHP</title>
		<link>http://blog.schst.net/2010/02/hip-hop-not-for-php/</link>
		<comments>http://blog.schst.net/2010/02/hip-hop-not-for-php/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 13:47:49 +0000</pubDate>
		<dc:creator>schst</dc:creator>
				<category><![CDATA[Audiovisuell]]></category>
		<category><![CDATA[Software Entwicklung]]></category>
		<category><![CDATA[Musik]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.schst.net/?p=379</guid>
		<description><![CDATA[Da im Moment jeder einen Blog-Eintrag zu HipHop schreibt, kann ich mich da natürlich nicht rausnehmen und blogge bei der Gelegenheit mal eines meiner Lieblings-Hip-Hop-Videos:

Streng genommen ist das ja wahrscheinlich noch nicht mal Hip Hop sondern Rap. Und ein Hip Hop Fan bin ich eigentlich auch nicht.
Falls jemand meine Meinung zu HipHop For PHP hören [...]]]></description>
			<content:encoded><![CDATA[<p>Da im Moment jeder einen Blog-Eintrag zu <a href="http://developers.facebook.com/news.php?blog=1&amp;story=358">HipHop</a> schreibt, kann ich mich da natürlich nicht rausnehmen und blogge bei der Gelegenheit mal eines meiner Lieblings-Hip-Hop-Videos:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="660" height="525" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/NlxLsGOemTw&amp;hl=en_GB&amp;fs=1&amp;rel=0&amp;color1=0x234900&amp;color2=0x4e9e00&amp;border=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="660" height="525" src="http://www.youtube.com/v/NlxLsGOemTw&amp;hl=en_GB&amp;fs=1&amp;rel=0&amp;color1=0x234900&amp;color2=0x4e9e00&amp;border=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Streng genommen ist das ja wahrscheinlich noch nicht mal Hip Hop sondern Rap. Und ein Hip Hop Fan bin ich eigentlich auch nicht.</p>
<p>Falls jemand meine Meinung zu HipHop For PHP hören möchte, ist die ganz einfach:</p>
<blockquote><p>Facebook hatte ein Problem, Facebook hat das Problem gelöst. Jetzt stellt Facebook die Lösung noch jedem zur Verfügung, der sie nutzen möchte. So funktioniert Open Source. Also ist alles bestens.</p></blockquote>
<p>Ich werde es wohl nicht nutzen, ich hab&#8217; andere Probleme als Facebook.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schst.net/2010/02/hip-hop-not-for-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Verwenden Sie keine Verneinung nicht!</title>
		<link>http://blog.schst.net/2010/01/verwenden-sie-keine-verneinung-nicht/</link>
		<comments>http://blog.schst.net/2010/01/verwenden-sie-keine-verneinung-nicht/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 21:41:42 +0000</pubDate>
		<dc:creator>schst</dc:creator>
				<category><![CDATA[Software Entwicklung]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Software Design]]></category>

		<guid isPermaLink="false">http://blog.schst.net/?p=322</guid>
		<description><![CDATA[Wenn ich es schaffe, eine if-Anweisung zu vermeiden, dann versüßt mir das immer meinen Tag. Aber leider kann man als Entwickler nicht darauf verzichten, Bedingungen in den Code einzubauen.
Was ich jedoch versuche, an allen Stellen zu vermeiden, ist der schreckliche „not”-Operator, der in den meisten Sprachen durch den Einsatz von „!” implementiert wird. Der Einsatz [...]]]></description>
			<content:encoded><![CDATA[<p>Wenn ich es schaffe, eine <em>if</em>-Anweisung zu vermeiden, dann versüßt mir das immer meinen Tag. Aber leider kann man als Entwickler nicht darauf verzichten, Bedingungen in den Code einzubauen.</p>
<p>Was ich jedoch versuche, an allen Stellen zu vermeiden, ist der schreckliche „<em>not</em>”-Operator, der in den meisten Sprachen durch den Einsatz von „!” implementiert wird. Der Einsatz dieses Operators macht den Quellcode immer schwerer zu lesen. Ich möchte keine Bedingungen wie die folgende in meinem Code haben:</p>
<pre name="code" class="php">
if (!$this-&gt;isUserAuthenticated()) {
    $this-&gt;requireLogin();
}
</pre>
<p>So ein kleines Ausrufezeichen übersieht man einfach viel zu leicht und da es die Logik des Ausdrucks komplett umdreht, ist es einfach <strong>viel zu wichtig</strong>, um übersehen zu werden. Noch schlimmer wird es, wenn Sie den Operator mehrfach in einer Bedingung einsetzen.</p>
<pre name="code" class="php">
if (!$this-&gt;isUserAuthenticated() &amp;&amp; !$this-&gt;isInternalIP()) {
    $this-&gt;requireLogin();
}
</pre>
<p>In solchen Code-Stellen kommt es gerne auch mal vor, dass man <em>UND</em> mit <em>ODER</em> verwechselt. Denn wenn man etwas negieren möchte, sollte man dran denken, auch die Verknüpfung zu negieren oder entsprechend zu klammern. Die obige Bedingung ist mit der folgenden identisch, statt einem logischen UND verwenden Sie jedoch ein logisches ODER:</p>
<pre name="code" class="php">
if (!($this-&gt;isUserAuthenticated() || $this-&gt;isInternalIP())) {
    $this-&gt;requireLogin();
}
</pre>
<p>Auf den ersten Blick erschließt sich mir nie, was die Bedingung aussagt, sobald ein „<em>not</em>”-Operator im Spiel ist.</p>
<p>Aber welche Möglichkeiten gibt es, um den ungeliebten Operator loszuwerden?</p>
<h2>Verneinen Sie den Methodennamen</h2>
<p>Statt einer Methode <em>isUserAuthenticated()</em> einen „<em>not</em>”-Operator voranzustellen, könnten Sie eine zweite Methode implementieren, die bereits auf das Gegenteil prüft und einen sprechenden Namen hat:</p>
<pre name="code" class="php">
if ($this-&gt;isUserUnknown()) {
    $this-&gt;requireLogin();
}
</pre>
<p>So liest sich der gesamte Code viel flüssiger und es kann nicht dazu kommen, dass der Operator übersehen wird oder das Ergebis im Kopf evaluiert werden muss.</p>
<h2>Prüfen Sie auf <em>false</em></h2>
<p>Statt den „<em>not</em>”-Operator zu verwenden, können Sie die Rückgabe der Methode auf <em>false</em> prüfen:</p>
<pre name="code" class="php">
if (false === $this-&gt;isUserAuthenticated()) {
    $this-&gt;requireLogin();
}
</pre>
<p>Der Code ist zwar nicht so lesbar wie im vorherigen Beispiel, aber wenn Sie die Bedingung nur einmal prüfen müssen, kann es sinnvoll sein, auf die Implementierung einer Methode für diesen einen Fall zu verzichten. Achten Sie übrigens immer darauf, bei einer Bedingung den konstanten Wert auf der linken Seite der Klammer zu setzen. Sollten Sie zu wenige Gleichheitszeichen verwenden, so kann aus der Bedingung nicht aus Versehen eine Zuweisung werden.</p>
<h2>Verwenden Sie <em>unless</em></h2>
<p>Sollten Sie Ruby verwenden, so haben Sie noch eine dritte, sehr elegante Möglichkeit. Ruby bietet Ihnen neben der <em>if</em>-Anweisung auch eine <em>unless</em>-Anweisung, die, wenn Sie sie als Modifier einsetzen, besonders elegant zu lesen ist.</p>
<pre name="code" class="ruby">
require_authentication unless user_is_authenticated
</pre>
<p>In diesem Beispiel ist der Code kaum noch von einem englischen Satz zu unterscheiden. Unterstützt wird das natürlich noch dadurch, dass Sie in Ruby keine Klammern verwenden müssen, wenn Sie keine Parameter an eine Methode übergeben wollen.</p>
<p>Wenn Sie also das nächste Mal eine Bedingung negieren, dann denken Sie darüber nach, ob es keine bessere Lösung gibt. Und falls Sie in einer Bedingung zweimal negieren müssen, dann denken Sie nochmal über eine Alternative nach. <strong>Es gibt sie sicher.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schst.net/2010/01/verwenden-sie-keine-verneinung-nicht/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ruby on Rails on Windows</title>
		<link>http://blog.schst.net/2010/01/ruby-on-rails-on-windows/</link>
		<comments>http://blog.schst.net/2010/01/ruby-on-rails-on-windows/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 18:58:00 +0000</pubDate>
		<dc:creator>schst</dc:creator>
				<category><![CDATA[Software Entwicklung]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.schst.net/?p=298</guid>
		<description><![CDATA[Nachdem ich Anfang des Jahres beschlossen hatte, Ruby zu lernen, habe ich das vor einer Woche in die Tat umgesetzt. Zusammen mit Holger entwickle ich eine webbasierte DVD- und Blu-Ray Verwaltung basierend auf Ruby on Rails. Dabei habe ich den Fehler gemacht, dass ich das auf einem Windows-Notebook machen wollte und erst mal fast einen [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem ich Anfang des Jahres beschlossen hatte, <a href="http://blog.schst.net/2010/01/jedes-jahr-eine-neue-programmiersprache/">Ruby zu lernen</a>, habe ich das vor einer Woche in die <a href="http://github.com/Holger/moco">Tat umgesetzt</a>. Zusammen mit Holger entwickle ich eine webbasierte DVD- und Blu-Ray Verwaltung basierend auf <a href="http://rubyonrails.org/">Ruby on Rails</a>. Dabei habe ich den Fehler gemacht, dass ich das auf einem Windows-Notebook machen wollte und erst mal fast einen Abend mit der Installation der neusten Ruby Version 1.8.7 verbracht.</p>
<p>Damit das anderen nicht auch so geht, versuche ich nochmal, zu rekapitulieren, welche Schritte dazu nötig waren:</p>
<ol>
<li>Laden Sie den <a href="http://rubyforge.org/frs/download.php/47082/ruby186-27_rc2.exe">Ruby One-Click Installer 1.8.6</a> von der Ruby Website herunter.</li>
<li>Installieren Sie Ruby 1.8.6 (zum Beispiel in <em>C:\ruby).</em></li>
<li>Laden Sie das <a href="ftp://ftp.ruby-lang.org/pub/ruby/binaries/mswin32/ruby-1.8.7-p72-i386-mswin32.zip">Ruby 1.8.7 Binary</a> von der Ruby Website herunter.</li>
<li>Entpacken Sie das Binary in den selben Ordner (<em>C:\ruby</em>), in den der Installer die Version 1.8.6 installiert hat.</li>
<li>Laden Sie <a href="http://www.zlib.net/zlib123-dll.zip">ZLib Packages</a> von der ZLib Website herunter und Entpacken Sie das Archiv.</li>
<li>Benennen Sie die Datei <em>zlib1.dll</em> nach <em>zlib.dll</em> um.</li>
<li>Kopieren Sie die Datei <em>zlib.dll</em> nach <em>C:\ruby\bin.</em></li>
<li>Laden Sie <a href="http://sourceforge.net/projects/gettext/files/libiconv-win32/1.9.1/libiconv-1.9.1.bin.woe32.zip/download">libiconv 1.91</a> herunter und Entpacken das Archiv.</li>
<li>Kopieren Sie die Datei <em>bin/iconv.dll</em> nach <em>C:\ruby\bin.</em></li>
<li>Laden Sie <a href="http://www.slproweb.com/download/Win32OpenSSL_Light-0_9_8l.exe">OpenSSL</a> herunter und installieren es. Bei der Installation kann es sein, dass Sie aufgefordert werden, zuerst das <a href="http://www.microsoft.com/downloads/details.aspx?familyid=9B2DA534-3E03-4391-8A4D-074B9F2BC1BF">Microsoft Visual C++ 2008 Redistributable Package</a> zu installieren.</li>
</ol>
<p>Damit sollte Ruby installiert sein. Überprüfen können Sie das einfach in der Konsole über:</p>
<pre name="code" class="bash">
C:\Users\schst> ruby --version
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]
</pre>
<p>Um Ruby on Rails zu verwenden, sollten Sie nun auch noch SQLite installieren. Während der Entwicklung können Sie Ihre Models sehr komfortabel in einer SQLite Datenbank persistieren. Sollten Sie SQLite noch nicht installiert haben, reichen dazu die folgenden Schritte aus:</p>
<ol>
<li>Laden Sie die <a href="http://www.sqlite.org/sqlite-3_6_22.zip">vorkompilierte Verson für Windows</a> herunter.</li>
<li>Entpacken Sie das Archiv</li>
<li>Kopieren Sie die Datei <em>sqlite3.exe</em> nach <em>C:\ruby\bin</em>.</li>
</ol>
<p>Als nächstes können Sie sich nun daran machen, den <em>gem</em> Installer für Ruby zu installieren:</p>
<ol>
<li>Laden Sie die <a href="http://rubyforge.org/frs/?group_id=126">aktuelle Version von RubyForge</a> herunter.</li>
<li>Entpacken Sie das Archiv.</li>
<li>Führen Sie ruby <em>setup.rb</em> aus.</li>
</ol>
<p>Alle weiteren Schritte erledigt nun gem für Sie:</p>
<pre name="code" class="bash">
C:\Users\schst&gt;gem install rails
C:\Users\schst&gt;gem install sqlite3-ruby
</pre>
<p>Danach können Sie mit Ihrer ersten Ruby on Rails Applikation loslegen:</p>
<pre name="code" class="bash">
C:\Users\schst&gt; rails my-app
C:\Users\schst&gt;     cd my-app
C:\Users\schst&gt;     ruby script/server
</pre>
<p>Ihre Anwendung öffnen Sie nun im Browser über <a href="http://localhost:3000">http://localhost:3000</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schst.net/2010/01/ruby-on-rails-on-windows/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>23 Dinge #0: Menschen</title>
		<link>http://blog.schst.net/2010/01/23-dinge-0-menschen/</link>
		<comments>http://blog.schst.net/2010/01/23-dinge-0-menschen/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 18:30:44 +0000</pubDate>
		<dc:creator>schst</dc:creator>
				<category><![CDATA[IT Management]]></category>
		<category><![CDATA[Software Entwicklung]]></category>
		<category><![CDATA[23 Dinge]]></category>
		<category><![CDATA[An meiner Wand]]></category>
		<category><![CDATA[Teamarbeit]]></category>

		<guid isPermaLink="false">http://blog.schst.net/?p=227</guid>
		<description><![CDATA[Bevor ich über 23 Dinge blogge, möchte ich noch einen Artikel voran stellen, der die folgenden Artikel meiner Serie in einen entsprechenden Kontext setzt. Sie bekommen hier sozusagen einen Tipp, wie Sie die folgenden Tipps anwenden sollten.
Beginnen möchte ich mit einem Yogiism von Dale „Yogi” Berra, einem der erfolgreichsten Baseball-Spieler der US-Major League:
„In theory, there [...]]]></description>
			<content:encoded><![CDATA[<div class='series_toc'><h3>Artikel der Serie &quot;23 Dinge&quot;</h3><ol><li><a href='http://blog.schst.net/2010/01/23-dinge-uber-software-entwicklung-in-teams/' title='23 Dinge über Software-Entwicklung in Teams'>23 Dinge über Software-Entwicklung in Teams</a></li><li>23 Dinge #0: Menschen</li></ol></div> <p>Bevor ich über <a href="http://blog.schst.net/2010/01/23-dinge-uber-software-entwicklung-in-teams/">23 Dinge</a> blogge, möchte ich noch einen Artikel voran stellen, der die folgenden Artikel meiner Serie in einen entsprechenden Kontext setzt. Sie bekommen hier sozusagen einen Tipp, wie Sie die folgenden Tipps anwenden sollten.</p>
<p>Beginnen möchte ich mit einem <em>Yogiism</em> von <a title="Website von Yogi Berra" href="http://www.yogiberra.com/">Dale „<em>Yogi</em>” Berra</a>, einem der erfolgreichsten Baseball-Spieler der US-Major League:</p>
<blockquote><p>„In theory, there is no difference between theory and practice. In practice, there is.”</p></blockquote>
<p>Frei übersetzt bedeutet dies so viel wie:</p>
<blockquote><p>„In der Theorie sind Theorie und Praxis das selbe, in der Praxis sind sie es nicht.”</p></blockquote>
<p>Meine 23 Dinge, die Sie über Software-Entwicklung ins Teams wissen sollten, entspringen zwar meiner praktischen Erfahrung, aber in diesem Blog werden sie auf Theorien reduziert. Die Tipps haben mir in den Teams, in denen ich bereits gearbeitet habe (sowohl in geschäftlichen, als auch im Open Source Umfeld), wertvolle Dienste geleistet. Das bedeutet jedoch nicht zwangsläufig, dass diese Tipps sklavisch bei Ihnen angewendet werden sollten. Manche Tipps müssen vielleicht an ihr Umfeld angepasst werden, andere funktionieren in Ihrem Umfeld überhaupt nicht.</p>
<p>Sobald Sie von Teamarbeit sprechen, sollten Sie nicht vergessen, dass es dabei auch immer um <strong>Menschen</strong> geht. Die Menschen sollten immer im Mittelpunkt Ihrer Bemühungen stehen, denn sie sind es, die Ihr Team formen und am Ende die Software produzieren.</p>
<p>Und Menschen sind nun mal verschieden. Also sind auch Teams verschieden und werden nicht genau gleich auf die Tipps in dieser Artikelserie reagieren. Achten Sie also beim Umsetzen der Tipps darauf, dass Ihnen nicht der Fehler auf diesem Poster passiert:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-249" title="Conformity - It's the one who is different, that get's left out in the cold." src="http://blog.schst.net/wp-content/uploads/2010/01/conformity-2.jpg" alt="Conformity - It's the one who is different, that get's left out in the cold." width="440" height="353" /></p>
<p style="text-align: left;">Schätzen Sie die Unterschiedlichkeit Ihres Teams und wenn ein Tipp nicht zu Ihnen oder Ihrem Team passt, <em>dann passen Sie ihn an</em>. Dieses Poster hängt im Büro übrigens auch in DIN A1 <a href="http://blog.schst.net/tag/an-meiner-wand">an meiner Wand</a>, um mich und andere jeden Tag daran zu erinnern.</p>
 <div class='series_links' style="padding-bottom: 12px;"><a href='http://blog.schst.net/2010/01/23-dinge-uber-software-entwicklung-in-teams/' title='23 Dinge über Software-Entwicklung in Teams'>Vorheriger Artikel der Serie</a> </div>]]></content:encoded>
			<wfw:commentRss>http://blog.schst.net/2010/01/23-dinge-0-menschen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Commercial Break: PHP Design Patterns</title>
		<link>http://blog.schst.net/2010/01/commercial-break-php-design-patterns/</link>
		<comments>http://blog.schst.net/2010/01/commercial-break-php-design-patterns/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 09:03:05 +0000</pubDate>
		<dc:creator>schst</dc:creator>
				<category><![CDATA[Lesestoff]]></category>
		<category><![CDATA[Software Entwicklung]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Dependency Injection]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Stubbles]]></category>

		<guid isPermaLink="false">http://blog.schst.net/?p=148</guid>
		<description><![CDATA[Die zweite Auflage meines Buches ist mittlerweile zwar fast schon ein Jahr alt, aber trotzdem darf natürlich ein bißchen Eigenwerbung in meinem Blog nicht fehlen.
„PHP Design Patterns” ist das erste deutschsprachige Buch zu Entwurfmustern in PHP. Neben einer Einführung in objektorientierte Programmierung im Allgemeinen und mit PHP im besonderen (Kapitel 1) sowie einem kurzen Ausflug [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.phpdesignpatterns.de/auflage-2/"><img class="alignleft size-full wp-image-179" style="margin-right: 8px; margin-bottom: 8px; margin-top: 16px;" title="PHP Design Patterns - Auflage 2" src="http://blog.schst.net/wp-content/uploads/2010/01/php-design-patterns.png" alt="" width="238" height="279" /></a>Die zweite Auflage meines Buches ist mittlerweile zwar fast schon ein Jahr alt, aber trotzdem darf natürlich ein bißchen Eigenwerbung in meinem Blog nicht fehlen.</p>
<p>„<strong>PHP Design Patterns</strong>” ist das erste deutschsprachige Buch zu Entwurfmustern in PHP. Neben einer Einführung in objektorientierte Programmierung im Allgemeinen und mit PHP im besonderen (Kapitel 1) sowie einem kurzen Ausflug in die SPL (Kapitel 2), zeigt das Buch auf grundlegende Regeln für gutes Software Design wie z.B. „<em>Vererbung sorgt für starre Stukturen. Verwenden Sie stattdessen Objektkomposition, um verschiedene Funktionen einfacher miteinander kombinieren zu können.” </em>Kapitel 3 behandelt weiterhin auch <em>Fluent Interfaces</em> und <em>Dependency Injection,</em> samt der Verwendung des DI-Containers in Stubbles.</p>
<p>Kapitel 4,5 und 6 behandeln dann einige der Standard <a href="http://de.wikipedia.org/wiki/Viererbande_%28Softwareentwicklung%29">Gang of Four</a> Entwurfsmuster, wie <em>Abstract Factory</em>, <em>Prototype</em>, <em>Composite</em>, <em>Facade</em>, <em>Flyweight</em>, <em>Command</em>, <em>State</em> oder auch <em>Chain-of-Responsibility</em>. Die letzten beiden Kapitel stellen das Schichtenmodell vor und zeigen, wie man dies mit Hilfe eines <em>Model-View-Controllers</em> und Patterns wie <em>Active-Record</em>, <em>Template-View</em>, <em>Registry</em> oder auch <em>Event-Dispatcher</em> implementiert.</p>
<p>Das PHP Magazin schreibt zur ersten Auflage (1/2007):</p>
<blockquote><p>Ein rundes, das anvisierte Themengebiet hervorragend ausfüllendes Buch, das vom Leser nur eins verlangt: Zeit und Konzentration auf den Inhalt. Der Lohn dieser geringfügigen Investition sind verschiedenste Aha-Effekte und ein echter Schub an neuen Kenntnissen und Ideen. Und ein Nachschlagewerk, das man nach dem ersten Lesen nicht mehr vom Schreibtisch nehmen möchte.</p></blockquote>
<p>Das Buch wurde für die zweite Auflage komplett überarbeitet und an PHP 5.3 angepasst. Dabei wurde ein Großteil der Kapitel erweitert:</p>
<ul>
<li>Komplett neue Abschnitte zu <a href="http://www.php.net/manual/de/language.namespaces.php">Namespaces</a>, <a href="http://php.net/manual/de/language.oop5.late-static-bindings.php">Late Static Binding</a> und <a href="http://php.net/manual/en/functions.anonymous.php">Closures</a></li>
<li>Neuer Abschnitt zur <a href="http://pecl.php.net/package/SPL_Types">SPL_Types</a> Erweiterung</li>
<li>Komplett neuer Abschnitt zu <a href="http://de.wikipedia.org/wiki/Fluent_Interface">Fluent Interfaces</a></li>
<li>Komplett neuer Abschnitt zu <a href="http://stubbles.net/wiki/Docs/IOC">Stubbles Depencency Injection</a></li>
<li>Neue Pattterns: Prototype, Facade, Flyweight, State, Chain of Responsibility, Identity Map und Data Mapper</li>
</ul>
<p>Details zu Buch:</p>
<ul>
<li>Gebundene Ausgabe: 496 Seiten</li>
<li>Verlag: O&#8217;Reilly; Auflage: 2. Auflage (27. Februar 2009)</li>
<li>Website zum Buch unter <a href="http://www.phpdesignpatterns.de">www.phpdesignpatterns.de</a></li>
<li>„PHP Design Patterns” auf der <a href="http://www.oreilly.de/catalog/phpdesignpat2ger/">O&#8217;Reilly Website</a></li>
<li><a href="http://www.amazon.de/gp/product/389721864X?ie=UTF8&amp;tag=schstnet-21&amp;linkCode=as2&amp;camp=1638&amp;creative=6742&amp;creativeASIN=389721864X">Buch bei Amazon bestellen</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.schst.net/2010/01/commercial-break-php-design-patterns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>In case of emergency&#8230;</title>
		<link>http://blog.schst.net/2010/01/in-case-of-emergency/</link>
		<comments>http://blog.schst.net/2010/01/in-case-of-emergency/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 16:23:36 +0000</pubDate>
		<dc:creator>schst</dc:creator>
				<category><![CDATA[Software Entwicklung]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>
		<category><![CDATA[Unit Testing]]></category>

		<guid isPermaLink="false">http://blog.schst.net/?p=48</guid>
		<description><![CDATA[Entwickler sind Menschen. Fehler passieren. Und wenn Entwicklern ein Fehler passiert, dann nennt man das Bug.
Das in einem Projekt nach dem Release nochmal Bugs auftreten, ist nicht wahrscheinlich, es ist absolut sicher. Meist haben diese Bugs dann eine (negative) finanzielle Auswirkung, oder zumindest ist das die Vermutung des Kunden. Der Kunde befürchtet einen Verdienstausfall, der [...]]]></description>
			<content:encoded><![CDATA[<p>Entwickler sind Menschen. Fehler passieren. Und wenn Entwicklern ein Fehler passiert, dann nennt man das Bug.</p>
<p>Das in einem Projekt nach dem Release nochmal Bugs auftreten, ist nicht wahrscheinlich, <strong><em>es ist absolut sicher</em></strong>. Meist haben diese Bugs dann eine (negative) finanzielle Auswirkung, oder zumindest ist das die Vermutung des Kunden. Der Kunde befürchtet einen Verdienstausfall, der natürlich so kurz wie möglich gehalten werden muss; und das rationale Denken beim Kunden, Manager und Entwickler setzt leider allzu häufig aus.</p>
<p>Die <em><a title="Buch &quot;Der Pragmatische Programmierer&quot;" href="http://www.amazon.de/gp/product/3446223096?ie=UTF8&amp;tag=schstnet-21&amp;linkCode=as2&amp;camp=1638&amp;creative=6742&amp;creativeASIN=3446223096">pragmatischen Programmierer</a></em> Andrew Hunt und David Thomas haben einige Tipps, wie man sich bei der Fehlersuche verhalten sollte:</p>
<h2><em>Lösen Sie das Problem, nicht die Schuldfrage.</em></h2>
<p>Der Bug ist bereits aufgetreten, es wird Ihnen jetzt nichts helfen, wenn Sie wissen, wer Schuld daran ist. Leider ist es oft viel einfacher, rauszufinden, wer schuld ist, als rauszufinden, wie der Bug gefixt werden kann. Deshalb tendieren viele Menschen eher zur ersten Alternative. Was man dagegen tun kann, habe ich bereits in „<a href="http://blog.schst.net/2010/01/denk-positiv/">Denk positiv!</a>” geschrieben.</p>
<p>Wenn Sie auf Grund von Verträgen oder SLAs wissen müssen, wer die Schuld trägt, so ist für die Klärung dieser Frage <em>nach Beseitigung des Fehlers</em> noch genug Zeit.</p>
<h2><em>Keine Panik!</em></h2>
<p>Wenn man so schnell wie möglich versucht, den Bug zu fixen, ohne genauer darüber nachzudenken, ist die Gefahr groß, dass weitere Bugs ins System eingeführt werden, während einer behoben wird. Und natürlich fügen diese Bugs Ihrem Kunden meist einen noch größeren Schaden zu, als der ursprüngliche Bug.</p>
<p>Das absolute Highlight ist, dass in solchen Situationen gerne auch die Unit-Tests (<em>die Folgefehler entdeckt hätten</em>) vor dem Deployment übersprungen werden, um den Fix möglichst schnell live zu bekommen. Näher werden Sie Kamikaze in Ihrem Leben wahrscheinlich nicht kommen. Ich selbst war leider schon so nahe dran.</p>
<p>Bleiben Sie also ruhig und stellen Sie sicher, dass Sie eine saubere Entwicklunsumgebung haben, bevor Sie mit dem Bugfixing beginnen. Fixen Sie den Bug also nicht in einem lokalen Checkout, der Modifikationen enthält, die noch nicht deployed wurden.</p>
<h2><em>Wenn Sie Hufabdrücke sehen, sollten Sie an Pferde denken, nicht an Zebras.</em></h2>
<p>Wenn ein Fehler auftritt, nachdem Sie den Code geändert haben, dann ist es wahrscheinlich, dass Ihre Änderung den Fehler verursacht hat. Suchen Sie also dort. Entwickler sind gerne der Ansicht, dass die letzte Änderung so marginal war, <em>dass sie keinen Fehler verursacht haben kann.</em> <em>„Sicher muss es ein Problem im Kernel sein, dass nur Donnerstags bei Regen auftritt und deshalb nicht entdeckt wurde.”</em> Sehr wahrscheinlich ist das <strong>nicht</strong> das Problem, sondern die marginale Änderung war der Auslöser.</p>
<p>(Die einzige Ausnahme von dieser Regel ist, wenn Sie mit Destrukturen in PHP arbeiten, hier habe ich schon Phänomene erlebt, die nur von Scully und Mulder gelöst werden können. Beim Einsatz von Destruktoren in PHP gilt also – <em>Trust No One</em>.)</p>
<h2><em>Nicht annehmen, sondern beweisen.</em></h2>
<p>Obwohl ein Bug einem Entwickler beweist, dass er nicht unfehlbar ist, verhält man sich oft weiterhin so, als wäre man unfehlbar. Ein Entwickler nimmt dann bei der Fehlersuche einfach an, dass eine bestimmte Methode auf jeden Fall fehlerfrei funktioniert und überspringt diese beim Debuggen. Tun Sie das nicht. Prüfen Sie jede kleine Eventualität, jede noch so einfache Methode und beweisen Sie, das diese mit den Eingaben, die produktiv zu einem Fehler führen, korrekt arbeitet. Auch dieses Thema hatte ich bereits in „<a href="http://blog.schst.net/2010/01/dont-assume/">Don&#8217;t assume!</a>” tiefergehend diskutiert.</p>
<p>Wenn Sie diese einfachen Regeln befolgen, dann haben Sie beim nächsten Bug deutlich höhere Chancen, diesen <em>schnell, nachhaltig und ohne Folgefehler</em> zu beseitigen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schst.net/2010/01/in-case-of-emergency/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Don&#8217;t assume!</title>
		<link>http://blog.schst.net/2010/01/dont-assume/</link>
		<comments>http://blog.schst.net/2010/01/dont-assume/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 19:40:56 +0000</pubDate>
		<dc:creator>schst</dc:creator>
				<category><![CDATA[IT Management]]></category>
		<category><![CDATA[Software Entwicklung]]></category>
		<category><![CDATA[An meiner Wand]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Requirements]]></category>
		<category><![CDATA[Teamarbeit]]></category>
		<category><![CDATA[Zitate]]></category>

		<guid isPermaLink="false">http://blog.schst.net/?p=73</guid>
		<description><![CDATA[Manche Weisheiten sind so einfach, dass man sie immer wieder vergisst. Aus diesem Grund hänge ich mir solche gerne bei mir im Büro an die Wand, damit ich regelmäßig mit der Nase drauf gestoßen werden.
In regelmäßigen (oder wahrscheinlich eher unregelmäßgen) Abständen werde ich diese jetzt auch in meinem Blog posten. Ihr findet diese Artikel dann [...]]]></description>
			<content:encoded><![CDATA[<p>Manche Weisheiten sind so einfach, dass man sie immer wieder vergisst. Aus diesem Grund hänge ich mir solche gerne bei mir im Büro an die Wand, damit ich regelmäßig mit der Nase drauf gestoßen werden.</p>
<p>In regelmäßigen (oder wahrscheinlich eher unregelmäßgen) Abständen werde ich diese jetzt auch in meinem Blog posten. Ihr findet diese Artikel dann alle unter dem Tag „<a href="http://blog.schst.net/tag/an-meiner-wand/">An meiner Wand</a>”. Den Anfang macht heute die folgende Weisheit von <a href="http://de.wikipedia.org/wiki/Oscar_Wilde">Oscar Wilde</a>:</p>
<blockquote><p>Don&#8217;t assume – it makes an «ass» of «u» and «me».</p></blockquote>
<p>Auf den ersten Blick klingt das in der Software-Entwicklung etwas seltsam, da wir alle wissen, dass in kaum einem Software-Entwicklungsprojekt immer alle Anforderungen klar auf dem Tisch liegen. Dabei bleibt uns als Entwicklern oft nichts anderes übrig, als Annahmen zu treffen.</p>
<p>Wichtig ist aber, dass man sich in solchen Moment <em>bewusst sein muss</em>, wo man nur Annahmen trifft. Sonst macht man ganz plötzlich Annahmen, von denen man annimmt, dass es Fakten sind. Und nichts ist schlimmer, als Annahmen über Annahmen zu treffen.</p>
<p>Und genau da beginnt das Problem. Sie treffen Entscheidungen auf Basis von Fakten, die nur in Ihrer Vorstellung existieren. Typische Annahmen, die zu Problemen führen sind:</p>
<ul>
<li>„Ich denke nicht, dass der Kunde diese Anforderung nochmal ändern wird. Die ist in Stein gemeißelt.”</li>
<li>„Unsere Applikation ist so langsam, weil wir Datenbank XXX verwenden, wir müssen stattdessen die Datenbank YYY einsetzen.”</li>
</ul>
<p>Während die erste Annahme dazu führt, dass Sie dem Kunden Flexibilität nehmen, investieren Sie bei der zweiten Annahme Zeit und Aufwand in eine Optimierung, die unter Umständen unnötig ist. Damit landen Sie nämlich bei <a title="Premature Optimization bei PHP Hates Me" href="http://www.phphatesme.com/blog/softwaretechnik/premature-optimization/">Premature Optimization</a>, und darüber hat Donald Knuth mal gesagt:</p>
<blockquote><p>Premature optimization is the root of all evil.</p></blockquote>
<p>Bevor Sie also annehmen, dass ein Kunde eine Anforderung in Stein gemeißelt hat und darauf hin eine Architektur-Entscheidung treffen, sprechen Sie doch lieber mit dem Kunden darüber. Erklären Sie ihm zur Not auch, welche Vor- und Nachteile hat, wenn er genau diese Anforderung unumstößlich festlegt und Ihnen damit eine bestimmte Architekturentscheidung ermöglicht.</p>
<p>Und bevor Sie annehmen zu wissen, wo das Performance-Problem Ihrer Anwendung liegt, fragen Sie doch einfach einen Profiler und stützen Ihre Entscheidungen auf Fakten.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schst.net/2010/01/dont-assume/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Jedes Jahr eine neue Programmiersprache</title>
		<link>http://blog.schst.net/2010/01/jedes-jahr-eine-neue-programmiersprache/</link>
		<comments>http://blog.schst.net/2010/01/jedes-jahr-eine-neue-programmiersprache/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 18:09:52 +0000</pubDate>
		<dc:creator>schst</dc:creator>
				<category><![CDATA[Software Entwicklung]]></category>

		<guid isPermaLink="false">http://blog.schst.net/?p=82</guid>
		<description><![CDATA[Chad Fowler schreibt in seinem Buch „Der leidenschaftliche Programmierer” (im Original „The Passionate Programmer”), dass man jedes Jahr eine neue Programmiersprache lernen sollte.
Da ich mich für einen leidenschaftlichen Programmierer halte, habe ich mir mal Gedanken dazu gemacht, ob ich diesen Tipp in meiner bisherigen Laufbahn befolgt habe. Dabei kam ich auf die folgende Liste von [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://chadfowler.com/">Chad Fowler</a> schreibt in seinem Buch „<a title="Buch bei Amazon" href="http://www.amazon.de/gp/product/382665885X?ie=UTF8&amp;tag=schstnet-21&amp;linkCode=as2&amp;camp=1638&amp;creative=6742&amp;creativeASIN=382665885X">Der leidenschaftliche Programmierer</a>” (im Original „<a href="http://www.amazon.de/gp/product/1934356344?ie=UTF8&amp;tag=schstnet-21&amp;linkCode=as2&amp;camp=1638&amp;creative=6742&amp;creativeASIN=1934356344">The Passionate Programmer</a>”), dass man jedes Jahr eine neue Programmiersprache lernen sollte.</p>
<p>Da ich mich für einen leidenschaftlichen Programmierer halte, habe ich mir mal Gedanken dazu gemacht, ob ich diesen Tipp in meiner bisherigen Laufbahn befolgt habe. Dabei kam ich auf die folgende Liste von Programmiersprachen, die ich bisher gelernt habe:</p>
<ul>
<li><strong>1987</strong>: <a href="http://de.wikipedia.org/wiki/BASIC">Basic</a><br />
Damit hat wohl jeder angefangen. Bei mir war es hauptsächlich die Grafik-Programmierung auf meinem Commodore 128D.</li>
<li><strong>1990</strong>: <a href="http://de.wikipedia.org/wiki/AmigaBASIC">Amiga Basic<br />
</a>Nachdem ich dann einen Amiga 500 hatte, ging es natürlich mit Amiga Basic weiter.</li>
<li><strong>1990</strong>: <a href="http://de.wikipedia.org/wiki/Assemblersprache">Assembler</a><br />
Demo-Programmierung auf dem Amiga 500 und 1200 war einige Jahre meine größte Liebe. Man findet heute sogar noch <a title="Demos von Arise (in den Demos nach Kyle suchen)" href="http://www.pouet.net/groups.php?which=2199">Demos von mir im Netz</a>.</li>
<li><strong>1991</strong>: <a href="http://de.wikipedia.org/wiki/ARexx">ARexx</a><br />
In ARexx habe ich etwas geschrieben, was man heute wohl als Chat-Bot bezeichnen würde. User, die sich auf unser BBS eingewählt haben, dachten, sie chatten mit unserem Admin, haben sich aber nur mit meinem Programm unterhalten.</li>
<li><strong>1992</strong>: <a href="http://de.wikipedia.org/wiki/Turbo_Pascal">Turbo Pascal</a><br />
Musste ich zwangsläufig in der Schule lernen, hat mich jedoch nie wirklich begeistert.</li>
<li><strong>1994</strong>: Gopher<br />
Im ersten (und einzigen) Semester meines Informatik-Studiums, seltsamerweise konnte ich im Netz gar nichts mehr dazu finden.</li>
<li><strong>1997</strong>: <a href="http://de.wikipedia.org/wiki/Visual_Basic">Visual Basic</a><br />
Das musste ich lernen, als ich eine Software, für den Comic-Laden, in dem ich gejobbt habe, in Access umgesetzt habe. Es war besser, als es klingt.</li>
<li><strong>1998</strong>: <a href="http://de.wikipedia.org/wiki/HTML">HTML</a><br />
Ich hatte das Internet entdeckt.</li>
<li><strong>1998</strong>: <a href="http://de.wikipedia.org/wiki/JavaScript">JavaScript</a><br />
Und ich hatte entdeckt, dass Webseiten auch interaktiv sein können.</li>
<li><strong>1998</strong>: <a href="http://www.php.net/manual/en/history.php.php">PHP3</a><br />
Und dann hatte ich entdeckt, dass Daten für Webseiten aus Datenbanken kommen sollen.</li>
<li><strong>2000</strong>: <a href="http://www.php.net/manual/en/history.php.php">PHP4</a><br />
Da bin ich dann ziemlich <a title="Meine ersten Open Source Projekte" href="http://www.php-tools.net/site.php">lange</a> <a title="Meine Projekte bei PEAR" href="http://pear.php.net/user/schst">bei PHP</a> <a title="Und das neuste PHP Open Source Projekt" href="http://stubbles.net/">hängen</a> geblieben.</li>
<li><strong>2001</strong>: <a href="http://de.wikipedia.org/wiki/ActionScript">ActionScript</a><br />
Wer zu dieser Zeit in einer <a title="Von 2000 bis 2004 war ich bei Metrix" href="http://www.metrix.de/">Agentur gearbeitet hat</a>, kam nicht drum rum, auch mal in Flash zu programmieren.</li>
<li><strong>2002</strong>: <a href="http://de.wikipedia.org/wiki/XSL_Transformation">XSLT</a><br />
Die Vermischung von Content, Layout und Logik hat mir noch nie gefallen, also musste ich was dagegen tun.</li>
<li><strong>2004</strong>: <a href="http://de.wikipedia.org/wiki/C">C</a><br />
Und wollte natürlich auch mal eine Extension für PHP schreiben. Das hat zwar <a title="Meine pecl-Extension id3" href="http://pecl.php.net/package/id3">funktioniert</a>, aber trotzdem habe ich C ziemlich schnell wieder aufgegeben.</li>
<li><strong>2004</strong>: <a href="http://www.php.net/manual/en/history.php.php">PHP5</a><br />
Und immer die aktuellste PHP Version einsetzen.</li>
<li><strong>2005</strong>: <a href="http://de.wikipedia.org/wiki/Java_%28Programmiersprache%29">Java</a><br />
Habe ich ursprünglich nur gelernt, weil ein Kollege der Meinung war, man könne eine PHP-Anwendung von mir nicht in Java schreiben und ich ihn vom Gegenteil überzeugen wollte. Mittlerweile fühle ich mich in Java mindestens genauso wohl, wie in PHP.</li>
<li><strong>2009</strong>: <a href="http://de.wikipedia.org/wiki/Groovy">Groovy</a><br />
Irgendwann wollte ich doch mal ausprobieren, wie es sich anfühlt, die Stärken von PHP und Java zu vereinen. Leider hat es sich für mich nicht so besonders angefühlt und besonders viel <a title="t3po - Ein Task Tracking System in Grails" href="https://www.ohloh.net/p/t3po">Code</a> ist nicht dabei raus gekommen.</li>
</ul>
<p>Wenn ich alles zusammenrechne, so schaffe ich es in 22 Jahren auf 17 Programmiersprachen, ich hatte also 5 leidenschaftslose Jahre. Ich hoffe mal, Mr. Fowler sieht das nicht so eng.</p>
<p>Tatsächlich hatte ich 1995 meine lang geplante Entwicklerlaufbahn an den Nagel gehängt und mich stattdessen für ein Pädagogik-Studium entschieden. Der Weg zurück zur Entwicklung war nicht sehr linear und hat gut 2 Jahre gedauert.</p>
<p><em>Doch nun haben wir 2010, wie soll es also weiter gehen?</em> Weiter geht es dieses Jahr mit <strong>Ruby</strong>; das Buch dazu habe ich heute bestellt. Es ist also nicht auszuschließen, dass Sie bald an dieser Stelle auch Artikel zu Ruby finden werden. Das wiederum wird Mr. Fowler sicher gefallen, schließlich ist der einer der Mitbegründer von <a href="http://rubycentral.org/">Ruby Central</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schst.net/2010/01/jedes-jahr-eine-neue-programmiersprache/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
