<?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, 10 Apr 2012 20:37:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Bilder asynchron nachladen</title>
		<link>http://www.artofcode.de/2012/04/07/bilder-asynchron-nachladen/</link>
		<comments>http://www.artofcode.de/2012/04/07/bilder-asynchron-nachladen/#comments</comments>
		<pubDate>Sat, 07 Apr 2012 14:27:39 +0000</pubDate>
		<dc:creator>mlaug</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[Webentwicklung]]></category>

		<guid isPermaLink="false">http://www.artofcode.de/?p=612</guid>
		<description><![CDATA[Ich habe schon länger nach einem Plugin gesucht, dass mir auf einfache Art und Weise Bilder nachlädt, sobald sie der Benutzer erst in seinem Browserfenster zu sehen bekommt. Vorher soll das Bild nicht geladen werden und somit Ressourcen auf dem Webserver schonen. Die meisten Möglichkeiten, die ich gefunden habe waren jedoch eher kompliziert und umständlich. [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Ich habe schon länger nach einem Plugin gesucht, dass mir auf einfache Art und Weise Bilder nachlädt, sobald sie der Benutzer erst in seinem Browserfenster zu sehen bekommt. Vorher soll das Bild nicht geladen werden und somit Ressourcen auf dem Webserver schonen. Die meisten Möglichkeiten, die ich gefunden habe waren jedoch eher kompliziert und umständlich. Mit Hilfe des <a href="https://developer.mozilla.org/en/Canvas_tutorial/Using_images" target="_blank">canvas Elements</a> und dem<a href="http://remysharp.com/2009/01/26/element-in-view-event-plugin/" target="_blank"> inview Plugin für Jquery</a> ist es nun ziemlich einfach.</p>
<p>Dazu definiert man ein Canvas Element im HTML Code</p>
<pre class="brush:xml">&lt;canvas class="canvas-image-loader" id="canvas-image-loader-1" width="100" height="100" data-url="URL TO YOUR IMAGE"&gt;&lt;/canvas&gt;</pre>
<p>und setzt auf jedes dieser canvas Elemente das <em>inview</em> Event. Sobald ein Canvas in den Sichtbereich des Benutzers kommt wird das Canvas mit dem Bild aus <em>data-url</em> gefühlt</p>
<p><script src="https://gist.github.com/2331490.js?file=index.html"></script></p>
<fb:like 
		href="http://www.artofcode.de/2012/04/07/bilder-asynchron-nachladen/" 
		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/2012/04/07/bilder-asynchron-nachladen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>FizzBuzz und die Bewerber</title>
		<link>http://www.artofcode.de/2012/04/02/fizzbuzz-und-die-bewerber/</link>
		<comments>http://www.artofcode.de/2012/04/02/fizzbuzz-und-die-bewerber/#comments</comments>
		<pubDate>Mon, 02 Apr 2012 14:07:41 +0000</pubDate>
		<dc:creator>mlaug</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.artofcode.de/?p=606</guid>
		<description><![CDATA[Es sollte eigentlich keine große Magie sein neue Programmierer für sein Team zu finden. Doch gestalten sich die meisten Bewerbungsgespräche doch immer wieder sehr zäh. Selten reichen ein paar Fragen im persönlichen Gespräch und ein Lebenslauf aus um die Qualität festzustellen. Hier ein Tipp, wie man innerhalb kürzester Zeit in einem Gespräch ermitteln kann, ob [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Es sollte eigentlich keine große Magie sein neue Programmierer für sein Team zu finden. Doch gestalten sich die meisten Bewerbungsgespräche doch immer wieder sehr zäh. Selten reichen ein paar Fragen im persönlichen Gespräch und ein Lebenslauf aus um die Qualität festzustellen.</p>
<p>Hier ein Tipp, wie man innerhalb kürzester Zeit in einem Gespräch ermitteln kann, ob jemand in die Firma passt und die passende Qualität mitbringt</p>
<p>Der FizzBuzz Test ist ein kleines Programm, das folgende Aufgabe erledigen soll</p>
<ol>
<li>Ausgabe der Zahlen von 0 &#8230; 100</li>
<li>Bei jeder Zahl, die durch 3 teilbar ist „Fizz“ sagen</li>
<li>Bei jeder Zahl, die durch 5 teilbar ist „Buzz“ sagen</li>
<li>Bei jeder Zahl, die durch beiden Zahlen teilbar ist „FizzBuzz“</li>
</ol>
<p>Es ist erstaunlich, wie viele selbst ernannten Programmierer, die direkt von der Uni kommen, diesen Test <strong>nicht</strong> schaffen. Selbst die freie Wahl der Programmiersprache hilft ihnen bei der Lösung nicht und erbringt keine sehenswerten Resultate. Mir per <a href="http://de.wikipedia.org/wiki/Landau-Symbole" target="_blank">O-Notation</a> die Effizienz von Code berechnen zu können ist zwar schön und gut, bringt mir aber in der Entwicklung nichts, wenn die Person Operatoren wie Modulo völlig unbekannt sind und sie bei einfachen Problemen scheitere.</p>
<p>Und immer auf die Reaktion achten, wenn man ihnen ein<a href="http://programmers.stackexchange.com/questions/7656/do-you-ever-write-code-with-pen-and-paper-and-should-we-do-it-more-often" target="_blank"> leeres Blatt Papier und eine Stift hinlegt</a>. Hat einer von ihnen schon einmal ohne eine IDE gearbeitet? Autocomplete gibt es leider noch nicht in der analogen Welt <img src='http://www.artofcode.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Wer selbst meint diese noch leichte Aufgabe ist für einen gestandenen Entwickler viel zu einfach, der kann ja mal die <a href="http://codekata.pragprog.com/2007/01/code_kata_backg.html#more" target="_blank">Kata des Programmierens</a> durchgehen und prüfen, bei welchem Rang man selbst Probleme bekommt.</p>
<p>Nachtrag vom 07.04.2012:</p>
<p>Anbei auch noch ein Beispiel in PHP. Denke das sollte jeder mit einem Stift auf Papier kriegen können&#8230;</p>
<p><script src="https://gist.github.com/2332218.js?file=fizzbuzz.php"></script></p>
<fb:like 
		href="http://www.artofcode.de/2012/04/02/fizzbuzz-und-die-bewerber/" 
		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/2012/04/02/fizzbuzz-und-die-bewerber/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jede Seite braucht eine Meta Ebene</title>
		<link>http://www.artofcode.de/2012/03/22/jede-seite-brauch-eine-meta-ebene/</link>
		<comments>http://www.artofcode.de/2012/03/22/jede-seite-brauch-eine-meta-ebene/#comments</comments>
		<pubDate>Thu, 22 Mar 2012 15:50:59 +0000</pubDate>
		<dc:creator>mlaug</dc:creator>
				<category><![CDATA[Netzgemeinde]]></category>
		<category><![CDATA[Webentwicklung]]></category>

		<guid isPermaLink="false">http://www.artofcode.de/?p=595</guid>
		<description><![CDATA[Jede Seite macht Gebraucht von A/B Tests. Neben Google Website Optimizer und Visual Website Optimizer Code gibt es noch weitere Tools, die einem Webseitenbetreiber die Möglichkeit geben die Akzeptanz der Seite beim Endbenutzer zu testen. Dabei werden Ziele festgelegt, deren Erreichen als Massstab dafür dienen, welche Versionen mehr Umsatz erzeugen oder eine bessere Benutzererfahrung versprechen. [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Jede Seite macht Gebraucht von A/B Tests. Neben Google Website Optimizer und Visual Website Optimizer Code gibt es noch weitere Tools, die einem Webseitenbetreiber die Möglichkeit geben die Akzeptanz der Seite beim Endbenutzer zu testen. Dabei werden Ziele festgelegt, deren Erreichen als Massstab dafür dienen, welche Versionen mehr Umsatz erzeugen oder eine bessere Benutzererfahrung versprechen. Dabei wird der Benutzer meist im dunklen gehalten, dass er zur Zeit Teil eines Tests ist. Das hat zur Folge, dass eigentlich nur die unbewussten Reaktion des Benutzers auf verschiedene Farbnuancen eins Buttons oder die Akzeptanz eines Hintergrundbildes getestet werden. Was der Benutzer selbst aber bewusst von der Seite, hält erfährt man so aber nicht. Beispielhaft dafür war z.B. die <a href="http://www.spiegel.de/netzwelt/web/0,1518,684047,00.html">Testaktion von Microsoft</a>, die in ihrer Suchmaschine Bing mehrere Farbtöne für Links (hauptsächlich blau) ausprobiert haben. Dabei hat sich ergeben, dass ein bestimmter Farbton tatsächlich zu einer höheren Klickrate führte. In Form von Werbelinks bedeutet dies natürlich deutlich höhere Mehreinnahmen durch Werbegelder in die Kassen von Microsoft.</p>
<p>Was eine Seite aber imho nach benötigt ist eine Meta Ebene in der sich der Benutzer über die Seite auslassen kann und eigenständig Feedback geben kann. Dabei soll er nicht einen Fragebogen ausfüllen müssen sondern aus der Seite einen Sandkasten machen an der er was ändern würde. Oder einfach nur zum Ausdruck bringen will, dass diese Funktion gut ist und vielleicht noch erweitert werden soll.</p>
<p>Um diese Möglichkeit auch auf meinen Seiten einzusetzen habe ich auf GitHub ein Projekt gestartet, dessen Entwicklung auf jede Seite eine Meta Ebene zaubern soll.</p>
<p><a href="https://github.com/mlaug/Metar">Metar on Github</a></p>
<fb:like 
		href="http://www.artofcode.de/2012/03/22/jede-seite-brauch-eine-meta-ebene/" 
		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/2012/03/22/jede-seite-brauch-eine-meta-ebene/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>
	</channel>
</rss>

