<?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>The Art Of Code</title>
	<atom:link href="http://www.artofcode.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.artofcode.de</link>
	<description>Knowledge of Knights and Nerds</description>
	<lastBuildDate>Tue, 20 Dec 2011 21:52:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>The Line must be drawn here &#8211; Code Design braucht Diktatoren</title>
		<link>http://www.artofcode.de/2011/12/20/the-line-must-be-drawn-here-code-design-braucht-diktatoren/</link>
		<comments>http://www.artofcode.de/2011/12/20/the-line-must-be-drawn-here-code-design-braucht-diktatoren/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 21:44:34 +0000</pubDate>
		<dc:creator>mlaug</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[code design]]></category>

		<guid isPermaLink="false">http://www.artofcode.de/?p=567</guid>
		<description><![CDATA[Code Design ist ein schwieriges Unterfangen. Entscheidungen müssen früh gefällt werden um dem Entwickler Team einen Standard an die Hand zu geben, der es ermöglicht eine Software zu generieren, die auch nach langer Entwicklungszeit wartbar und testbar bleibt. Soll die Software monolithisch aufgebaut werden oder soll man die Komponenten doch lieber dezentral über eine Pipeline [...]]]></description>
			<content:encoded><![CDATA[<p></p><p><iframe src="http://www.youtube.com/embed/oGHorPRWx8I" frameborder="0" width="560" height="315"></iframe></p>
<p>Code Design ist ein schwieriges Unterfangen. Entscheidungen müssen früh gefällt werden um dem Entwickler Team einen Standard an die Hand zu geben, der es ermöglicht eine Software zu generieren, die auch nach langer Entwicklungszeit wartbar und testbar bleibt. Soll die Software monolithisch aufgebaut werden oder soll man die Komponenten doch lieber dezentral über eine Pipeline ihre Jobs abarbeiten lassen. Es gibt viele Möglichkeiten und grundsätzlich kann man sich sicher sein, dass man zu irgendeinem Zeitpunkt merkt, dass man Fehler gemacht hat und umdenken muss.</p>
<p><strong>Was aber klappt nie? Demokratie&#8230;</strong></p>
<p>Hinter einem guten und flexiblen Softwaredesign steht ein Diktator. Jemand der Ahnung vom Werk hat und beim Design ganz klar ansagt, wie die Software zu gestalten ist. Open Source ist eine super Sache und ich plädiere dafür, so viel wie möglich der Community zur Verfügung zu stellen. Ich würde aber niemals behaupten, dass man in der Open Source Gemeinde eine Software findet, die ein sauberes und elegantes Design besitzt. Beispiel? WordPress! Eine Blogsoftware, die so weit verbreitet ist und auf die ich hier selber setze. Aber möchte ich ein Plugin für WordPress schreiben? Um Himmels Willen, Nein! Das Konzept von Hooks und Plugins ist so verwoben, dass man teilweise einen Knoten im Kopf bekommt, wenn man mal einen Blick unter die Haube wagt.</p>
<p>Also, wenn ihr die Verantwortung für ein Softwareprojekt übernehmt und eine klare Vorstellung von der Software habt, dann lasst euch nicht rein reden. Lasst euch vorher beraten, holt euch Ideen von anderen, aber während der Entwicklung gebt klare Richtlinien und lasst niemanden ausbrechen. Denkt daran, Entwickler sind Schweine, die machen das Code stinkt! Euer Software Design ist dabei wie ein großer Besen, der von selber sauber macht&#8230;</p>
<p><strong>Zieht die Linie früh und lasst sie niemanden überschreiten!<br />
</strong></p>
<fb:like 
		href="http://www.artofcode.de/2011/12/20/the-line-must-be-drawn-here-code-design-braucht-diktatoren/" 
		layout="button_count" 
		show_faces="false" 
		width="450" 
		
		action="like" 
		colorscheme="light" 
		style="margin-top:5px;"
		class="fb_edge_widget_with_comment fb_iframe_widget"></fb:like>]]></content:encoded>
			<wfw:commentRss>http://www.artofcode.de/2011/12/20/the-line-must-be-drawn-here-code-design-braucht-diktatoren/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Tunnelblick &#8211; geringer Wissensstand</title>
		<link>http://www.artofcode.de/2011/10/16/tunnelblick-geringer-wissensstand/</link>
		<comments>http://www.artofcode.de/2011/10/16/tunnelblick-geringer-wissensstand/#comments</comments>
		<pubDate>Sun, 16 Oct 2011 18:42:08 +0000</pubDate>
		<dc:creator>mlaug</dc:creator>
				<category><![CDATA[Teamarbeit]]></category>

		<guid isPermaLink="false">http://www.artofcode.de/?p=554</guid>
		<description><![CDATA[Es ist zeitweise schwer gute Entwickler zu finden. Meiner Erfahrung nach lassen sich Juniors in Kombination mit ein oder zwei Seniors in ein Team am besten integrieren. Juniors sind zu Anfang erst einmal sehr pflegeintensiv, aber sie zeigen doch die stärkste Lernkurve. Auch die Kreativität kann hier durchaus mannigfaltiger sein als bei einem Senior, der [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Es ist zeitweise schwer gute Entwickler zu finden. Meiner Erfahrung nach lassen sich Juniors in Kombination mit ein oder zwei Seniors in ein Team am besten integrieren. Juniors sind zu Anfang erst einmal sehr pflegeintensiv, aber sie zeigen doch die stärkste Lernkurve. Auch die Kreativität kann hier durchaus mannigfaltiger sein als bei einem Senior, der meistens seine festgelegten Trampelpfade nimmt. Was der Bauer nicht kennt, das coded er nicht&#8230;</p>
<p>Schwierig wird es jedoch, wenn ab einem bestimmten Level der Wissensstand nicht mehr zunehmen möchte. Häufig stand ich vor dieser Situation und musste zusehen, wie ich dem Team neue Kenntnisse beibringe. Häufig stand ich als Lehrer vor ihnen und zeigte ihnen neue Sachen in der Hoffnung, dass auch sie zu einem späteren Zeitpunkt auf Dinge stoßen, die sie gerne präsentieren würden. Fehlanzeige, null Feedback, keine Reaktion, Nullkurve. Die Begeisterung wollte einfach nicht überspringen. Und so blieben die Juniors bei ihren vertrauten Themen und begaben sich selten auf neue Wege in unbekannte Regionen. Doch gerade das ist es, wo die größten Lerneffekte aufkommen, wo neue Ideen entstehen und neue Inspiration gefunden wird. Woran kann das liegen? Meiner Meinung nach liegt dies an einer häufigen Auslastung von 100% und keinen Pufferzeiten. Wann soll man mal die Möglichkeit haben abzuschweifen, einfach mal rumprobieren? Meistens ist der Zeitplan so knapp, das der Junior an den Lippen des Seniors hängt und um Anweisungen bittet, die er dann auch befolgt. Aber was ist den mit der Möglichkeit mal Fehler zu machen? Wozu sind QA, UnitTestcases und Staging Systeme da?</p>
<p>Also geht raus und macht Fehler und denkt ruhig auch erstmal 60 Sekunden über ein Problem selber nach, bevor ihr zu StackOverflow geht <img src='http://www.artofcode.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><em>Dies war der zweite Teil aus der Serie: <a title="Coding im Tunnel" href="../2011/09/25/coding-im-tunnel/">Coding im Tunnel</a></em></p>
<fb:like 
		href="http://www.artofcode.de/2011/10/16/tunnelblick-geringer-wissensstand/" 
		layout="button_count" 
		show_faces="false" 
		width="450" 
		
		action="like" 
		colorscheme="light" 
		style="margin-top:5px;"
		class="fb_edge_widget_with_comment fb_iframe_widget"></fb:like>]]></content:encoded>
			<wfw:commentRss>http://www.artofcode.de/2011/10/16/tunnelblick-geringer-wissensstand/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Der Springer &#8211; ein Resumee</title>
		<link>http://www.artofcode.de/2011/10/16/der-springer-ein-resumee/</link>
		<comments>http://www.artofcode.de/2011/10/16/der-springer-ein-resumee/#comments</comments>
		<pubDate>Sun, 16 Oct 2011 18:21:13 +0000</pubDate>
		<dc:creator>mlaug</dc:creator>
				<category><![CDATA[Teamarbeit]]></category>

		<guid isPermaLink="false">http://www.artofcode.de/?p=557</guid>
		<description><![CDATA[Ich habe vor ein paar Tagen bereits davon geschrieben, dass wir bei uns in der Firma einen Funktion &#8220;den Springer&#8221; eingeführt haben. Dieser sollte sich darum kümmern, dass andere Teammitglieder vollständig Störungsfrei arbeiten konnten. Schnell zeigten sich die Stärken und Schwächen des Prinzips Die Schwächen: Allen vorran gibt es hier Probleme mit Leuten, die ihre [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Ich habe vor ein paar Tagen bereits davon geschrieben, dass wir bei uns in der Firma einen Funktion &#8220;den Springer&#8221; eingeführt haben. Dieser sollte sich darum kümmern, dass andere Teammitglieder vollständig Störungsfrei arbeiten konnten. Schnell zeigten sich die Stärken und Schwächen des Prinzips</p>
<p><strong>Die Schwächen:</strong></p>
<p>Allen vorran gibt es hier Probleme mit Leuten, die ihre Aufgaben grundsätzlich als unberechenbar hoch priorisiert sehen. Diese sehen die Funktion des Springers als lästige Instanz, die doch nur eingeführt wurde um die für technische versierte Leute &#8220;dummen&#8221; Fragen zu filtern. Also gehen sie direkt zu den Personen, die sie als richtige Ansprechperson sehen und sprechen ihre Aufgabe/Problem durch. Da es sich hierbei meist um einen Vorgesetzten handelt, zögern viele mit der eigentlich korrekten Antwort: &#8220;Bitte wende dich an den Springer&#8221;. Hier ist der Teamleiter gefragt, der seinen Leuten regelmässig klar machen muss, dass ein &#8220;Nein&#8221; durchaus auch gefordert ist.</p>
<p><strong>Die Stärken:</strong></p>
<p>Ein unübertreffbarer Vorteil ist die Wissensverteilung der Software über das gesamte Team. Nie zuvor haben sie so viele Bereiche des Systems kennen lernen und sich aus ihrer Wohlfühlecke entfernen <strong>müssen</strong> als in der Funktion des Springers. Innerhalb von wenigen Wochen wussten viele deutlich mehr von der Software. Dieser Umstand wirkte sich auch Abseits der Springertätigkeiten ebenfalls positiv aus. Es wurden weniger Fragen in die Runde gestellt, man fühlte sich einfach sicherer im Umgang mit der bestehenden Code.</p>
<p>Alle anderen Dinge sind teilweise vom Team abhängig, dass mit der IT zusammen arbeiten darf. Macht hier eure eigenen Erfahrungen <img src='http://www.artofcode.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<fb:like 
		href="http://www.artofcode.de/2011/10/16/der-springer-ein-resumee/" 
		layout="button_count" 
		show_faces="false" 
		width="450" 
		
		action="like" 
		colorscheme="light" 
		style="margin-top:5px;"
		class="fb_edge_widget_with_comment fb_iframe_widget"></fb:like>]]></content:encoded>
			<wfw:commentRss>http://www.artofcode.de/2011/10/16/der-springer-ein-resumee/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tunnelblick &#8211; Der Springer</title>
		<link>http://www.artofcode.de/2011/09/25/tunnelblick-der-springer/</link>
		<comments>http://www.artofcode.de/2011/09/25/tunnelblick-der-springer/#comments</comments>
		<pubDate>Sun, 25 Sep 2011 11:57:15 +0000</pubDate>
		<dc:creator>mlaug</dc:creator>
				<category><![CDATA[Teamarbeit]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[springer]]></category>
		<category><![CDATA[team]]></category>

		<guid isPermaLink="false">http://www.artofcode.de/?p=541</guid>
		<description><![CDATA[Ich habe bei uns in der Firma ein Institut eingeführt, dass dafür sorgen soll, dass die anderen Entwickler Unterbrechungsfrei arbeiten können. Ich präsentiere euch: Den Springer Ein Springer (auch &#8220;der Springer&#8221;) ist eine Person, die sich um Aufgaben kümmert, dessen Arbeitsaufwand unter 1 Stunde liegt und akut dringend ist. Der Springer wird dabei meist aus [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Ich habe bei uns in der Firma ein Institut eingeführt, dass dafür sorgen soll, dass die anderen Entwickler Unterbrechungsfrei arbeiten können. Ich präsentiere euch: <strong>Den Springer</strong></p>
<p><em>Ein Springer (auch &#8220;der Springer&#8221;) ist eine Person, die sich um Aufgaben kümmert, dessen Arbeitsaufwand unter 1 Stunde liegt und akut dringend ist</em>. <em>Der Springer wird dabei meist aus dem Team durch ein visuelles Merkmal erkennbar und wechselt in einem festgelegtem Turnus innerhalb des IT Teams</em></p>
<p>Wir haben im Team gemerkt, dass unsere Arbeit immer wieder unterbrochen wurde. Anfragen für Statistiken, Auswertungen von Logdateien, Fehlersuche, kleine Hilfestellungen. In der Regel stand dann jemand bei der IT im Türrahmen, guckte erstmal mit großen Kuhaugen umher, bis jemand aus der IT Mitleid bekommen hat und fragt, was den sei. Diese Person war dann auch zumeist das arme Schwein, dass die Aufgabe erledigen musste. Manchmal wurde je nach Aufgabenbereich aber auch weiterdeligiert und es wurden gleich zwei Personen unterbrochen.</p>
<p>Was ist jetzt anders? Der Springer ist deutlich erkennbar, z.B. durch eine Leuchtweste, die jeder im Auto haben sollte. Somit weiß jeder ausserhalb der IT, wenn er ansprechen muss, wenn er im Tührramen steht. Die Situation wurde also bereits für beide Parteien entspannt. Der Springer nimmt die Aufgabe an, unterbricht seine aktuelle Arbeit und kümmert sich um das Problem. Wichtig ist dabei, dass der Springer nicht delegieren sondern Teamkollegen nur um Hilfe fragen darf. So wird sichergestellt, dass nach einer gewissen Zeit jeder im Team die kleinen Aufgaben alleine meistern und ohne Hilfe aus dem Team arbeiten kann. Ein schöne Methode zur Verbreitung der Wissensbasis über die Software.</p>
<p><a href="http://www.artofcode.de/2011/10/16/der-springer-ein-resumee/">Das Resultat</a> werde ich in Kürze ebenfalls vorstellen!</p>
<p><em>Dies war der erste Teil aus der Serie: <a title="Coding im Tunnel" href="http://www.artofcode.de/2011/09/25/coding-im-tunnel/">Coding im Tunnel</a><br />
</em></p>
<p>&nbsp;</p>
<fb:like 
		href="http://www.artofcode.de/2011/09/25/tunnelblick-der-springer/" 
		layout="button_count" 
		show_faces="false" 
		width="450" 
		
		action="like" 
		colorscheme="light" 
		style="margin-top:5px;"
		class="fb_edge_widget_with_comment fb_iframe_widget"></fb:like>]]></content:encoded>
			<wfw:commentRss>http://www.artofcode.de/2011/09/25/tunnelblick-der-springer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Coding im Tunnel</title>
		<link>http://www.artofcode.de/2011/09/25/coding-im-tunnel/</link>
		<comments>http://www.artofcode.de/2011/09/25/coding-im-tunnel/#comments</comments>
		<pubDate>Sun, 25 Sep 2011 11:40:13 +0000</pubDate>
		<dc:creator>mlaug</dc:creator>
				<category><![CDATA[Teamarbeit]]></category>
		<category><![CDATA[team]]></category>

		<guid isPermaLink="false">http://www.artofcode.de/?p=539</guid>
		<description><![CDATA[Schon einmal den Tunnelblick beim Coden bekommen? Nicht mehr ansprechbar gewesen und gereizt auf Unterbrechungen reagiert? Es gibt Momente im Leben von Programmierern, wo einfach alles von selber läuft und ausnahmsweise mal Google und StackOverflow nicht zur Unterstützung gebraucht werden. Dein Wesen und Geist verändert sich in einziges StackOverflow gefüllt mit eleganten und korrekten Antworten. [...]]]></description>
			<content:encoded><![CDATA[<p><a class="post_image_link" href="http://www.artofcode.de/2011/09/25/coding-im-tunnel/" title="Permanent link to Coding im Tunnel"><img class="post_image alignnone" src="http://www.artofcode.de/wp-content/uploads/2011/09/Tunnelblick-1-300x289.jpg" width="300" height="289" alt="Post image for Coding im Tunnel" /></a>
</p><p>Schon einmal den Tunnelblick beim Coden bekommen? Nicht mehr ansprechbar gewesen und gereizt auf Unterbrechungen reagiert? Es gibt Momente im Leben von Programmierern, wo einfach alles von selber läuft und ausnahmsweise mal Google und StackOverflow nicht zur Unterstützung gebraucht werden. Dein Wesen und Geist verändert sich in einziges StackOverflow gefüllt mit eleganten und korrekten Antworten. Ein Zustand, den jede Firma bei ihren Entwicklern fördern sollte. Für mich selber ist dies auch der effektivste Zustand beim Programmieren und ich schaffe nicht nur kreative sondern auch stabile Software. Leider stellt sich dieser Zustand nur zu selten ein. Warum?</p>
<ol>
<li><a title="Der Springer" href="http://www.artofcode.de/2011/09/25/tunnelblick-der-springer">Häufige Unterbrechungen und kleine Anfragen (oder Mini Aufgaben)</a></li>
<li>zu viel Ablenkung im Office in Form von Geräuschen</li>
<li><a href="http://www.artofcode.de/2011/10/16/tunnelblick-geringer-wissensstand/">geringer Wissensstand</a></li>
<li>schlechte Arbeitsatmosphäre</li>
<li>Stress und Zeitdruck</li>
</ol>
<p>Faktoren, die in jeder Firma nur zu häufig vorkommen. Patentlösungen gibt es gegen diese Problem nicht. Man muss mehr die Prozesse in seinem Unternehmen analysieren und Gegenmaßnahmen überlegen. Ich habe mir für dieses Jahr vorgenommen, diese 6 Probleme in meiner Firma anzugehen. Ich möchte daher in einer neuen Reihe vorstellen, welche Maßnahmen ich im Team ergriffen habe und ob sie erfolgreich waren oder gescheitert sind.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<fb:like 
		href="http://www.artofcode.de/2011/09/25/coding-im-tunnel/" 
		layout="button_count" 
		show_faces="false" 
		width="450" 
		
		action="like" 
		colorscheme="light" 
		style="margin-top:5px;"
		class="fb_edge_widget_with_comment fb_iframe_widget"></fb:like>]]></content:encoded>
			<wfw:commentRss>http://www.artofcode.de/2011/09/25/coding-im-tunnel/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Warum ich PHP liebe &#8211; aber Java beneide</title>
		<link>http://www.artofcode.de/2011/06/11/warum-ich-php-liebe-aber-java-beneide/</link>
		<comments>http://www.artofcode.de/2011/06/11/warum-ich-php-liebe-aber-java-beneide/#comments</comments>
		<pubDate>Sat, 11 Jun 2011 21:43:52 +0000</pubDate>
		<dc:creator>mlaug</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.artofcode.de/?p=516</guid>
		<description><![CDATA[Wenn man eine Webapplikation bauen möchte, ist, wenn man den Statistken glaubt, PHP die erste Wahl. PHP ist einfach und sein Stack in Apache macht auch den ersten Rollout sehr einfach. Mit PHP kann man komplizierte Sachverhalte sehr einfach ausdrücken und die Fülle an Beispielen und Erweiterungen im Netz sind einfach atemberaubend. Große Webprojekte habe [...]]]></description>
			<content:encoded><![CDATA[<p><a class="post_image_link" href="http://www.artofcode.de/2011/06/11/warum-ich-php-liebe-aber-java-beneide/" title="Permanent link to Warum ich PHP liebe &#8211; aber Java beneide"><img class="post_image alignnone" src="http://www.artofcode.de/wp-content/uploads/2011/06/6a0120a85dcdae970b01538e3ee72e970b-800wi.jpg" width="400" height="266" alt="Post image for Warum ich PHP liebe &#8211; aber Java beneide" /></a>
</p><p style="text-align: left;">Wenn man eine Webapplikation bauen möchte, ist, wenn man den Statistken glaubt, PHP die erste Wahl. PHP ist einfach und sein Stack in Apache macht auch den ersten Rollout sehr einfach. Mit PHP kann man komplizierte Sachverhalte sehr einfach ausdrücken und die Fülle an Beispielen und Erweiterungen im Netz sind einfach atemberaubend. Große Webprojekte habe ich bisher fast immer in PHP durchgeführt. Man kann sehr schnell einen Prototypen bauen und mit dem Kunden ins Feedback gehen. Die einfache Einbindung in HTML ist zwar Fluch und Segen zugleich, unterstützt einen jedoch sehr beim Erstellen von kleinen Beispielen. PHP ist mittlerweile auf einem Stand, wo man es wesentlich ernster nehmen muss. Warum man das bisher immer noch nicht macht?</p>
<p>Naja vielleicht aus den folgenden Gründen, die mich immer wieder zur Räson bringen und auch mal Python oder Java verwenden lassen. Man kann es vielleicht mit den Worten von Barney Stinsen und der &#8220;Hot and Crazy&#8221; Scale beschreiben. PHP war erst ganz weit unten im Bereich <em>crazy</em>, dann kam die Version 5.x raus und PHP wurde einiges <em>hotter</em>. Dann wurden Namespaces eingeführt und ich musste die böse Erfahrung machen, dass PHP bei seinen Funktion nicht <em>case-sensitive</em> ist =&gt; <em>crazy</em>. Dann kam Bergmann mit seinen PHPUnit Tests =&gt; <em>hot </em> <img src='http://www.artofcode.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>1. PHP verzeiht sehr viel</strong></p>
<p>Ja, PHP ist sehr gut zu uns. Der Intepreter baut die Variable noch unseren Vorgaben von String zu Integer zu Float zu Array zu Objekt. Wir sind hier  kaum an Konventionen gebunden. Kleine Scripte können dadurch sehr schnell Form annehmen, sind in der Regel jedoch anschließend unwartbar. Sobald man also größere Projekte mit mehr als 2 Entwicklern starten möchte, wäre eine Art optionale Typensicherheit in PHP sehr hilfreich. Nicht nur bei den Parameterlisten (das ist ja mittlerweile teilweise möglich), sondern gerade bei den Rückgabewerten einer Funktion.</p>
<pre class="brush:php">public function foo(array $a, My_Class $b) //das geht schon

public function foo(integer $a, string $b) //das schon wieder nicht

public array function foo() //und das schon gar nicht <img src='http://www.artofcode.de/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </pre>
<p>Ich kriege häufig die Krise, wenn ich eine Methode bekomme, die in einem Fall einen String zurück liefert und in einerm anderen Fall ein Array. Das macht einfach keinen Sinn und den Code, den man durch so eine Funktion <em>vielleicht</em> gespart hat, benöigt man wieder für die Fallunterscheidung beim Aufruf der Funktion. Bringt also nichts&#8230;</p>
<p><strong>2. Exceptions innerhalb von Methoden</strong></p>
<p>Wirft man innerhalb von PHP eine Exception (wenn überhaupt, viele bevorzugen ja doch eher die &#8220;return false&#8221; Methodologie) kann man diese Tatsache durch die Spezifikation der Methode nicht nach außen deutlich machen.</p>
<pre class="brush:php">public function blub() throws Exception //leider auch nicht</pre>
<p>Wer die Methode also nicht kennt und vorher nicht untersucht, weiß bis zu ihrem Auftreten erstmal nichts von der Exception. Und wer guckt sich schon fremde Methoden vor ihrer Verwendung an <img src='http://www.artofcode.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>3. Threads</strong></p>
<p>Meiner Meinung nach der zentrale Punkt, warum PHP immer noch nicht vollständig ernst genommen wird. Korrekter Einsatz und Synchronisation sind mit eine Disziplin in der IT, die nicht jeder versteht. Wenn die Möglichkeit nun in einer Sprache vollständig fehlt, könnte man auch meinen, dass man die Entwickler hier auch vor sich selbst schützen möchte. Nach dem Motto &#8220;Messer, Feuer, Threads und Licht, sind für PHPler nichts&#8221; schützt man hier den Entwickler vor sich selbst!? Und kommt mir jetzt nicht mit pcntl_fork, solange mir hier niemand auch eine vernünftige Art der Kommunikation zwischen Parent und Child Prozess zeigen kann&#8230;</p>
<p><strong>4. Performance</strong></p>
<p>Ich denke hier muss ich nicht groß darauf rumreiten. PHP wird immer schneller, aber an die Performance einer Sprache wie C++ oder Java wird es so schnell (wenn überhaupt) nicht rankommen.</p>
<p><strong>5. IDE</strong></p>
<p>Nach meinem Geschmack habe ich bisher noch keine IDE gefunden, die eine saubere Integration von PHP (zusammen mit PHPUnit und dem ganzen restlichen Bergmann Clan) zur Verfügung stellt. Man ist entweder auf kostenpflichte Tools wie die PHP IDE von Zend (die allerdings auch auf Eclipse basiert) gebunden oder erweitert eine IDE wie NetBeans um die nötigen Addons. Aus der Box kommt hier aber wenig.<strong> </strong></p>
<p><strong>6. Copy&amp;Paste, keine Innovation<br />
</strong></p>
<p>All diese hübschen Erfindungen zur Qualitätssicherung wie Jenkins oder Unittests kommen alle aus der Java Welt. Warum kommt keine Innovation in diese Richtung aus der PHP Welt? Warum muss erst nachgeahmt werden? PHP scheint sich aus allen anderen Sprachen die guten Sachen rauszupicken. Das ist gut, aber langweilig. Ich will auch mal was mit PHP machen, was andere nicht machen können.</p>
<p>Das sind all die Gründe, warum ich PHP immer weider untreu werde und manche Projekte in Java (oder auch gern mal ein bisschen Python) durchführe. Aber wer mag schon mit einer Sprache die ganze Zeit vorlieb nehmen. Monogamie ist schon genug Anstrengung in den Real Life Dingen.</p>
<fb:like 
		href="http://www.artofcode.de/2011/06/11/warum-ich-php-liebe-aber-java-beneide/" 
		layout="button_count" 
		show_faces="false" 
		width="450" 
		
		action="like" 
		colorscheme="light" 
		style="margin-top:5px;"
		class="fb_edge_widget_with_comment fb_iframe_widget"></fb:like>]]></content:encoded>
			<wfw:commentRss>http://www.artofcode.de/2011/06/11/warum-ich-php-liebe-aber-java-beneide/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Piwik Erweiterungen</title>
		<link>http://www.artofcode.de/2011/06/10/piwik-erweiterungen/</link>
		<comments>http://www.artofcode.de/2011/06/10/piwik-erweiterungen/#comments</comments>
		<pubDate>Fri, 10 Jun 2011 19:55:20 +0000</pubDate>
		<dc:creator>mlaug</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[Webentwicklung]]></category>

		<guid isPermaLink="false">http://www.artofcode.de/?p=507</guid>
		<description><![CDATA[Wer es noch nicht kennt sollte es umbedingt einmal ausprobieren. Piwik ist eine Open Source Alternative zu Google Analytics, ist mittlerweile in der Version 1.4 erschienen und in PHP geschrieben. Dabei liegen die Vorteile in der offenen Datenbankstruktur und der Möglichkeit Plugins selber zu schreiben. Auch die Integration in das eigene System gestaltet sich durch [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Wer es noch nicht kennt sollte es umbedingt einmal ausprobieren. <a href="http://piwik.org/" target="_blank">Piwik ist eine Open Source Alternative zu Google Analytics</a>, ist mittlerweile in der Version 1.4 erschienen und in PHP geschrieben. Dabei liegen die Vorteile in der offenen Datenbankstruktur und der Möglichkeit Plugins selber zu schreiben. Auch die Integration in das eigene System gestaltet sich durch die Widgets sehr einfach. Mächtig wird das ganze jedoch erst duch seine <a href="http://piwik.org/docs/analytics-api/segmentation/" target="_blank">API zur Segmentierung</a>. Um die Integration in das eigene System zu erleichtern, habe ich die PHP API Klasse erweitert und auch um die Möglichkeit erweitert mit Zielmetriken zu arbeiten. Da diese eigentlich immer erst in Piwik erstellt werden müssen habe ich einen etwas anderen Weg genommen. Wenn man ein Ziel tracken möchte und dieses existiert noch nicht wird die Klasse diese erstellen und die nötigen Assoziationen in einer lokalen Tabelle speichern.</p>
<pre class="brush:sql">create table `piwikGoals` (
    `id` INT NOT NULL auto_increment primary key,
    `goalId` INT NOT NULL,
    `goalName` VARCHAR(255) NOT NULL UNIQUE
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci</pre>
<p>Anschließend habe ich die vorhanden <a href="http://demo.piwik.org/index.php?module=SitesManager&amp;action=downloadPiwikTracker&amp;idSite={$IDSITE}&amp;piwikUrl=http://www.example.org/piwik/">Piwik Tracker Klasse</a> erweitert. Das ganze basiert auf Zend &#8230;</p>
<pre class="brush:php">&lt;?php

/**
 * Description of Tracker
 *
 * @author matthiaslaug
 */
class My_Piwik_Tracker extends Piwik_Tracker{

    /**
     *
     * @param string $name
     * @param integer $revenue
     */
    static function trackGoal($name, $revenue = 0){
        //add to your config
        //piwik.id = YOUR_PIWIK_ID
        //piwik.url = URL_TO_YOUR_PIWIK_INSTALLATION
        //piwik.token = YOUR_PIWIK_AUTH_TOKEN
        $config = Zend_Registry::get('configuration');
        try {
            $t = new Yourdelivery_Model_Piwik_Tracker($config-&gt;piwik-&gt;id, $config-&gt;piwik-&gt;url);
            $result = $t-&gt;doTrackGoalAndCreate($name, $revenue);
        } catch (Exception $e) {
        }
    }

    /**
     * track a goal but create relation if not existent
     * @author mlaug
     * @since 08.06.2011
     * @param string $name
     * @param integer $revenue
     * @return boolean
     */
    public function doTrackGoalAndCreate($name, $revenue = 0) {
        $table = new DbTable_Piwik_Goals();
        $row = $table-&gt;fetchRow('goalName="' . $name . '"');
        if ( !$row ){
            $goalId = $this-&gt;createGoal($name);
            if ( $goalId &lt;= 0 ){
                return false;
            }
            $table-&gt;createRow(array(
                'goalId' =&gt; $goalId,
                'goalName' =&gt; $name
            ))-&gt;save();
        }
        else{
            $goalId = (integer) $row-&gt;goalId;
            if ( $goalId &lt;= 0 ){
                return false;
            }
        }
        $this-&gt;doTrackGoal($goalId, $revenue);
        return $goalId;
    }

    /**
     * create a goal
     * @author mlaug
     * @since 08.06.2011
     * @param string $name
     * @param string $pattern
     * @param string $matchAttr
     * @param string $patternType
     * @param boolean $caseSensitive
     * @param integer $revenue
     * @param boolean $allowMultipleConversionsPerVisit
     * @return integer
     */
    public function createGoal($name, $pattern = '/', $matchAttr = 'manually', $patternType = 'contains', $caseSensitive = false, $revenue = 0, $allowMultipleConversionsPerVisit = false){
        $config = Zend_Registry::get('configuration');
        $url  = self::$URL . '?idSite=' . $this-&gt;idSite;
        $url .= '&amp;module=API';
        $url .= '&amp;method=Goals.addGoal';
        $url .= '&amp;matchAttribute=' . $matchAttr;
        $url .= '&amp;patternType=' . $patternType;
        $url .= '&amp;pattern=' . $pattern;
        $url .= '&amp;name=' . $name;
        $url .= '&amp;token_auth=' . $config-&gt;piwik-&gt;auth;
        $ret = $this-&gt;sendRequest($url);
        try{
            $xml = new DOMDocument();
            $xml-&gt;loadXML($ret);
            if ( $xml-&gt;getElementsByTagName('error')-&gt;length &gt; 0 ){
                return 0;
            }
            $goalId = (integer) $xml-&gt;getElementsByTagName('result')-&gt;item(0)-&gt;nodeValue;
            return $goalId;
        }
        catch ( Exception $e ){
            return 0;
        }
    }

    /**
     * @author mlaug
     * @since 08.06.2011
     * @param integer $idGoal
     * @return boolean
     */
    public function deleteGoal($idGoal){
        $config = Zend_Registry::get('configuration');
        $url  = self::$URL . '?idSite=' . $this-&gt;idSite;
        $url .= '&amp;module=API';
        $url .= '&amp;method=Goals.deleteGoal';
        $url .= '&amp;idGoal=' . $idGoal;
        $url .= '&amp;token_auth=' . $config-&gt;piwik-&gt;token;
        $ret = $this-&gt;sendRequest($url);
        try{
            $xml = new DOMDocument();
            $xml-&gt;loadXML($ret);
            if ( $xml-&gt;getElementsByTagName('error')-&gt;length &gt; 0 ){
                return false;
            }
            if ( $xml-&gt;getElementsByTagName('success')-&gt;length &gt; 0 ){
                $table = new Yourdelivery_Model_DbTable_Piwik_Goals();
                $table-&gt;delete('goalId='.$idGoal);
                return true;
            }
            return false;
        }
        catch ( Exception $e ){
            return false;
        }
    }

}

?&gt;</pre>
<p>Und noch die DbTable Klasse</p>
<pre class="brush:php">/**
 * Description of Goals
 *
 * @author matthiaslaug
 */
class DbTable_Piwik_Goals extends Zend_Db_Table {

    /**
     * name of the table
     * @param string
     */
    protected $_name = 'piwikGoals';
    //put your code here
}</pre>
<p>Ich hoffe das nützt jemandem <img src='http://www.artofcode.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<fb:like 
		href="http://www.artofcode.de/2011/06/10/piwik-erweiterungen/" 
		layout="button_count" 
		show_faces="false" 
		width="450" 
		
		action="like" 
		colorscheme="light" 
		style="margin-top:5px;"
		class="fb_edge_widget_with_comment fb_iframe_widget"></fb:like>]]></content:encoded>
			<wfw:commentRss>http://www.artofcode.de/2011/06/10/piwik-erweiterungen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SSI &#8211; Webserver und ihre alten Schätzchen</title>
		<link>http://www.artofcode.de/2011/02/20/ssi-webserver-und-ihre-alten-schatzchen/</link>
		<comments>http://www.artofcode.de/2011/02/20/ssi-webserver-und-ihre-alten-schatzchen/#comments</comments>
		<pubDate>Sun, 20 Feb 2011 14:36:12 +0000</pubDate>
		<dc:creator>mlaug</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[Sicherheit]]></category>

		<guid isPermaLink="false">http://www.artofcode.de/?p=489</guid>
		<description><![CDATA[Server Side Includes sind alt. Uralt! Aber trotzdem findet man sie auch noch heute in modernen Webserverimplementierungen wie Lighttpd oder Nginx. Brauchen tut man sie eigentlich nicht mehr, sind sie doch nicht ansatzweise so performant wie die heute eingesetzten Websprachen. Seit CGI sind SSI eigentlich überflüssig. Aber für manch ein Szenario findet sich auch heute [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Server Side Includes sind alt. Uralt! Aber trotzdem findet man sie auch noch heute in modernen Webserverimplementierungen wie Lighttpd oder Nginx. Brauchen tut man sie eigentlich nicht mehr, sind sie doch nicht ansatzweise so performant wie die heute eingesetzten Websprachen. Seit CGI sind SSI eigentlich überflüssig. Aber für manch ein Szenario findet sich auch heute noch ein guter Einsatz.</p>
<p>Lange habe ich darüber nachgedacht wie man mit einfachsten Mitteln den Wert eines Cookies absichern kann. Setzt man z.B. eine statische Landingpage ein um Server Ressourcen zu sparen, möchte später aber trotzdem über den im Cookie gespeicherten Wert eine Aktion in PHP auslösen, z.B. einen Gutschein im Bestellprozess hinzufügen, so sollte man den Informationen vertrauen können. Auch sollte es nicht möglich sein den Wert des Cookies zu rekonstruieren bzw. diesen zu speichern und wieder zu verwenden.</p>
<p>Also nochmal zusammengefasst:</p>
<ul>
<li>Der Inhalt des Cookies muss verifizierbar sein, dass dieser vom System generiert wurde und nicht von Dritten</li>
<li>Der Inhalt des Cookies soll innerhalb eines definierten Zeitraumes &#8220;ablaufen&#8221; und so nicht mehr gültig sein</li>
</ul>
<p>Und genau hier bin ich auf die SSI gekommen. Warum? Weil das verschlüsseln von Daten mit Javascript keinen Sinn macht, lässt sich die eingesetzte Algorithmik im Code doch mit einfachsten Mitteln auslesen! Und PHP (oder andere Script Sprachen) will ich aus Perfomanzgründen nicht einsetzen um die Seite auch bei hoher Frequentierung Erreichbar zu halten.</p>
<p>Die einfachen Anweisungen von SSI sind schonend zu den Serverresourcen und ermöglichen alles, was man brauch</p>
<pre class="brush:js">var token = '&lt;!--#exec cmd=""--&gt;';</pre>
<p>Und schon haben wir einen Wert generiert den wir auf der Gegenseite später im Bestellprozess mit PHP wieder verifizieren können</p>
<pre class="brush:php">&lt;?php
$cookie = $_COOKIE['token']; //enrypted value
$value = mcrypt($cookie);</pre>
<p>Oder habt ihr ne bessere Idee <img src='http://www.artofcode.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Was ich später noch behandeln werde ist eine perfomante und sichere Lösung für das Kommando, dass in den Include eingebaut werden sollte</p>
<fb:like 
		href="http://www.artofcode.de/2011/02/20/ssi-webserver-und-ihre-alten-schatzchen/" 
		layout="button_count" 
		show_faces="false" 
		width="450" 
		
		action="like" 
		colorscheme="light" 
		style="margin-top:5px;"
		class="fb_edge_widget_with_comment fb_iframe_widget"></fb:like>]]></content:encoded>
			<wfw:commentRss>http://www.artofcode.de/2011/02/20/ssi-webserver-und-ihre-alten-schatzchen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Regex from Hell</title>
		<link>http://www.artofcode.de/2011/02/19/regex-from-hell/</link>
		<comments>http://www.artofcode.de/2011/02/19/regex-from-hell/#comments</comments>
		<pubDate>Sat, 19 Feb 2011 18:38:14 +0000</pubDate>
		<dc:creator>mlaug</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.artofcode.de/?p=495</guid>
		<description><![CDATA[Reguläre Ausdrücke sind ja schon ganz nett und mächtig, aber das hier ist mal jetzt echt übertrieben. Wer kann so was den noch lesen geschweige den debuggen http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html]]></description>
			<content:encoded><![CDATA[<p></p><p>Reguläre Ausdrücke sind ja schon ganz nett und mächtig, aber das hier ist mal jetzt echt übertrieben. Wer kann so was den noch lesen geschweige den debuggen <img src='http://www.artofcode.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html" target="_blank">http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html</a></p>
<fb:like 
		href="http://www.artofcode.de/2011/02/19/regex-from-hell/" 
		layout="button_count" 
		show_faces="false" 
		width="450" 
		
		action="like" 
		colorscheme="light" 
		style="margin-top:5px;"
		class="fb_edge_widget_with_comment fb_iframe_widget"></fb:like>]]></content:encoded>
			<wfw:commentRss>http://www.artofcode.de/2011/02/19/regex-from-hell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google schafft sich selbst ab : Ein Nachtrag</title>
		<link>http://www.artofcode.de/2011/01/30/google-schafft-sich-selbst-ab-ein-nachtrag/</link>
		<comments>http://www.artofcode.de/2011/01/30/google-schafft-sich-selbst-ab-ein-nachtrag/#comments</comments>
		<pubDate>Sun, 30 Jan 2011 17:22:43 +0000</pubDate>
		<dc:creator>mlaug</dc:creator>
				<category><![CDATA[Netzgemeinde]]></category>

		<guid isPermaLink="false">http://www.artofcode.de/?p=483</guid>
		<description><![CDATA[Nachdem ich in zwei Artikeln kurz und knapp die Thematik angesprochen habe, das der Google Algorithmus zu wenig auf die ganzen Content Farmen eingeht, die professionell und massenweise SEO Optimierungen vornehmen, gab es im Google Blog eine Reaktion (nicht als Reaktion auf meine beiden Artikel (Google schafft sich ab: Grund1, Grund2), das wäre vielleicht etwas [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Nachdem ich in zwei Artikeln kurz und knapp die Thematik angesprochen habe, das der Google Algorithmus zu wenig auf die ganzen Content Farmen eingeht, die professionell und massenweise SEO Optimierungen vornehmen, gab es im <a href="http://googleblog.blogspot.com/2011/01/google-search-and-search-engine-spam.html" target="_blank">Google Blog eine Reaktion</a> (nicht als Reaktion auf meine beiden Artikel (Google schafft sich ab: <a href="http://www.artofcode.de/2010/10/24/google-schafft-sich-ab-grund-1/" class="broken_link">Grund1</a>, <a href="http://www.artofcode.de/2010/10/24/google-schafft-sich-ab-grund-2/">Grund2</a>), das wäre vielleicht etwas vermessen <img src='http://www.artofcode.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ). Die Algorithmen sollen jetzt stärker nach Web Spam suchen und diesen abstrafen. Wenn ein Artikel eine zu geringe Eigenleistung beinhaltet wird dieser herabgestuft.</p>
<p>Sehr richtig denke ich. Und wie ich in anderen Blogs lesen durfte, stehe ich auch nicht ganz alleine mit der Meinung</p>
<ul>
<li><a href="http://techcrunch.com/2011/01/01/why-we-desperately-need-a-new-and-better-google-2/">Why We Desperately Need a New (and Better) Google</a></li>
<li><a href="http://paul.kedrosky.com/archives/2009/12/dishwashers_dem.html">Dishwashers, and How Google Eats Its Own Tail</a></li>
<li><a href="http://www.readwriteweb.com/archives/content_farms_impact.php">Content Farms: Why Media, Blogs &amp; Google Should Be Worried</a></li>
<li><a href="http://broadstuff.com/archives/2370-On-the-increasing-uselessness-of-Google......html">On the increasing uselessness of Google</a></li>
<li><a href="http://shoeblogs.com/2010/12/20/google-google-why-hast-thou-forsaken-the-manolo/#more-13002">Google, Google, Why Hast Thou Forsaken the Manolo?</a></li>
</ul>
<fb:like 
		href="http://www.artofcode.de/2011/01/30/google-schafft-sich-selbst-ab-ein-nachtrag/" 
		layout="button_count" 
		show_faces="false" 
		width="450" 
		
		action="like" 
		colorscheme="light" 
		style="margin-top:5px;"
		class="fb_edge_widget_with_comment fb_iframe_widget"></fb:like>]]></content:encoded>
			<wfw:commentRss>http://www.artofcode.de/2011/01/30/google-schafft-sich-selbst-ab-ein-nachtrag/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

