<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>techblog.tilllate.com</title>
	
	<link>http://techblog.tilllate.com</link>
	<description>it and development at europe's leading clubbing community</description>
	<lastBuildDate>Thu, 25 Apr 2013 19:35:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/TilllateComTechblog" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="tilllatecomtechblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>ORM tool or handwritten SQL?</title>
		<link>http://techblog.tilllate.com/2010/09/18/orm-tool-or-handwritten-sql/</link>
		<comments>http://techblog.tilllate.com/2010/09/18/orm-tool-or-handwritten-sql/#comments</comments>
		<pubDate>Sat, 18 Sep 2010 07:43:37 +0000</pubDate>
		<dc:creator>Silvan Mühlemann</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://techblog.tilllate.com/?p=667</guid>
		<description><![CDATA[We recently had a discussion about whether to use an ORM tool or code the SQL manually. These are discussions like &#8220;Apple vs. Nokia&#8221; or &#8220;Spaces vs. Tabs&#8220;. Very emotional. You should know that tilllate is using a self-made &#8220;ORM&#8221; tool: Our ORM framework maps table columns to object properties. But it is agnostic of [...]]]></description>
			<content:encoded><![CDATA[<p>We recently had a discussion about whether to use an ORM tool or code the SQL manually. These are discussions like &#8220;Apple vs. Nokia&#8221; or &#8220;<a href="http://www.jwz.org/doc/tabs-vs-spaces.html">Spaces vs. Tabs</a>&#8220;. Very emotional.</p>
<p>You should know that tilllate is using a self-made &#8220;ORM&#8221; tool: Our ORM framework maps table columns to object properties. But it is agnostic of relationships between tables. And when you want to write a complex query, you end up programming long lines of native SQL. Unreadable.</p>
<p><span id="more-667"></span></p>
<h2>ORM tools increase productivity</h2>
<p>I brought up the discussion as we have to make technology decisions for a new project. I know <a href="http://www.doctrine-project.org">Doctrine</a> 1.2 very well from a spare time project. I am <em>very </em>satisfied with it:</p>
<ul>
<li>No need to think about how the objects are mapped to the database. You just <code>save()</code> them (or <code>persist()</code> them as <a href="http://www.doctrine-project.org/projects/orm/2.0/docs/en">Doctrine2</a> calls the function more accurately). You can navigate along the object graph without caring on what exact SQL statements and DB calls are needed.</li>
<li>The code is more readable as there is no mix between PHP and SQL</li>
<li>Because of the query language is integrated in PHP the IDE can help you with autocompletion.</li>
<li>Useful features like data validation or event listeners (&#8220;<code>onSave</code>&#8220;, &#8220;<code>onCreate</code>&#8220;) become possible.</li>
</ul>
<h2>Just like back in 1975</h2>
<p>The advocates of the &#8220;ORM framework&#8221; we&#8217;re currently using argue that with an ORM tool hiding all SQL from you you lose control of what happens. Also they are worried about performance. Funny, exactly that&#8217;s what developers objected 35 years ago against high-level languages like PL/I or APL when they had to switch from assembler. &#8220;It does not let you do what you want and it is slow.&#8221; <sup><a href="#citation-1">1</a></sup></p>
<p>As to function, after a learning phase I was able to do whatever I wanted to with it.</p>
<p>As to speed, I believe that the additional abstraction layers certainly cause some performance loss. But for one part the loss is absorbed by built-in caching. And for the rest: With the time you save on development and maintenance you can buy additional hardware.</p>
<h2>What do you think?</h2>
<p>What is your opinion on ORM tools? Is there a way around them when you do OOP? Are there occasions when writing plain SQL makes sense? Or should we forget about relational databases altogether and switch to NoSQL as <a href="http://twitter.com/jpkoenig/status/24580862783">jpkoenig suggests</a>?</p>
<p><a name="citation-1">1.</a> Brooks, Frederick P., Jr (1975). &#8220;The Mythical Man-Month&#8221;. Addison Wesley,  pp. 135</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.tilllate.com/2010/09/18/orm-tool-or-handwritten-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Make them feel welcome</title>
		<link>http://techblog.tilllate.com/2010/09/08/make-them-feel-welcome/</link>
		<comments>http://techblog.tilllate.com/2010/09/08/make-them-feel-welcome/#comments</comments>
		<pubDate>Wed, 08 Sep 2010 07:42:20 +0000</pubDate>
		<dc:creator>Silvan Mühlemann</dc:creator>
				<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://techblog.tilllate.com/?p=660</guid>
		<description><![CDATA[Recently a friend of mine had his first day of work with a new employer. The company was famous to be very employer-friendly. Surprisingly, my friend experienced the opposite: When he came, his boss was not around. No one told him what he had to do. An initial training was not announced. And when he [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-709" title="Unwelcome" src="http://www.muehlemann.com/wp-content/uploads/2010/08/unwelcome.png" alt="" width="300" height="136" align="left"/>Recently a friend of mine had his first day of work with a new employer. The company was famous to be very employer-friendly. Surprisingly, my friend experienced the opposite: When he came, his boss was not around. No one told him what he had to do. An initial training was not announced. And when he wanted to go to lunch, he found himself alone in the office. He just felt lost at his new workplace. Bad start.<br />
<span id="more-660"></span><br />
Probably this was just bad luck: Some urgent issue came in on that very morning. Or the whole staff was on an external training. We don&#8217;t know. Nevertheless that report made me think on the importance of the first day of work from a manager&#8217;s perspective.</p>
<p>In my position as team leader I attach great importance to the first day of work for new members in my team. A good first impression is a foundation for a good relationship with the direct report. Here&#8217;s what I do for new employees on their first day:</p>
<ol>
<li>I make sure that his desk, computer, email-account etc. is ready.</li>
<li>I organize a welcome card and a small gift if put on his or her desk.</li>
<li>I organize an introduction program where the new team member meets someone from every department.</li>
<li>I introduce him to every staff member. I am making sure that everyone knows his role. And the he knows what people are relevant to him. Him being able to build an internal network quickly is essential to become productive quickly.</li>
<li>I make sure that I am available for him.</li>
<li>I organize a lunch with the team.</li>
</ol>
<p>By observing these points I make sure that the new staff member feels comfortable and welcome. And that he knows what to do. That extra effort is worth it.</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.tilllate.com/2010/09/08/make-them-feel-welcome/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Remote system cloning</title>
		<link>http://techblog.tilllate.com/2009/10/13/remote-system-cloning/</link>
		<comments>http://techblog.tilllate.com/2009/10/13/remote-system-cloning/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 14:33:03 +0000</pubDate>
		<dc:creator>Steven Varco</dc:creator>
				<category><![CDATA[Arbeit]]></category>
		<category><![CDATA[IT Infrastructure]]></category>

		<guid isPermaLink="false">http://techblog.tilllate.com/?p=653</guid>
		<description><![CDATA[Wieder mal ein Tipp aus der Linux-Admin Trickkiste. In diesem Fall ging es darum ein System komplett auf ein anderes zu klonen. Sind die beiden Systeme baugleich, ist das mit dd und ssh relativ einfach einfach möglich. Dazu müssen zuerst beide Systeme mit einer Linux-BootCD (z.B. sysrescuecd) gebootet- und das Netzwerk konfiguriert werden. Dann gibt [...]]]></description>
			<content:encoded><![CDATA[<p>Wieder mal ein Tipp aus der Linux-Admin Trickkiste. <img src='http://techblog.tilllate.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>In diesem Fall ging es darum ein System komplett auf ein anderes zu klonen. Sind die beiden Systeme baugleich, ist das mit dd und ssh relativ einfach einfach möglich.</p>
<p>Dazu müssen zuerst beide Systeme mit einer Linux-BootCD (z.B. sysrescuecd) gebootet- und das Netzwerk konfiguriert werden.</p>
<p>Dann gibt man auf dem Quell-System einfach:</p>
<pre class="brush: jscript;">quelle~ # dd if=/dev/sda | ssh root@zielsystem &quot;dd of=/dev/sda&quot;</pre>
<p>ein und wartet bis der Vorgang abgeschlossen ist. Wer sich noch einen Status des Kopiervorganges anzeigen lassen möchte:</p>
<pre class="brush: jscript;">ziel~ # kill -USR1 $(pgrep '^dd$')</pre>
<p>-Die Ausgabe erfolgt dabei auf der Konsole vom Quellsystem.</p>
<p>Nach dem Kopiervorgang sollte man das System mounten und die Netzwerk-, sowie Hostname noch anpassen; sonst gibt es danach einen IP-Adresskonflikt im Netzwerk.</p>
<p>Achtung: Dass das ganze klappt sollten beide Systeme (zumindest die Disks) relativ baugleich sein &#8211; Und natürlich gehen die Daten auf dem Zielsystem unwiderruflich verloren. <img src='http://techblog.tilllate.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h2>Erweiterungen</h2>
<p><strong>Komprimieren:</strong> Es wäre nun noch Möglich die Daten durch gzip zu pipen um Bandbreite zu sparen.</p>
<p><strong>Erweiterter Status:</strong> Mit pv kann man sich erweiterte Statusinformationen über den Kopiervorgang zusammenbasteln.<br />
﻿</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.tilllate.com/2009/10/13/remote-system-cloning/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>From the for loop to the generator in JavaScript</title>
		<link>http://techblog.tilllate.com/2009/05/22/for-loop-to-generator-javascript/</link>
		<comments>http://techblog.tilllate.com/2009/05/22/for-loop-to-generator-javascript/#comments</comments>
		<pubDate>Fri, 22 May 2009 12:09:07 +0000</pubDate>
		<dc:creator>Leo Büttiker</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://techblog.tilllate.com/?p=554</guid>
		<description><![CDATA[I recently spent some time writing JavaScript code and do reviews of JavaScript features. JavaScript has some nice language features that make it easy to write short and readable code. (On the other hand it is also quite easy to write horrible code with it.) In this article I try to show you how you [...]]]></description>
			<content:encoded><![CDATA[<p><strong>I recently spent some time writing JavaScript code and do reviews of JavaScript features. JavaScript has some nice language features that make it easy to write short and readable code. (On the other hand it is also quite easy to write horrible code with it.) In this article I try to show you how you can refactor your code to something more readable.</strong></p>
<p>We may start with this non-fictional example:</p>
<pre class="brush: jscript;">
/**
* Returns array of uids of selected items
*/
getSelected:function() {
	var returnArray = new Array();
	var modelFriendListItems = this.modelFriendListItems.getSelected();

	for (var index = 0 ; index &lt; modelFriendListItems.length ; ++index) {
		if(!modelFriendListItems[index].isFacebookUser)
			returnArray.push(modelFriendListItems[index].id);
	}

	return returnArray;
},
</pre>
<p>It&#8217;s just one function out of a class that does quite something typical. This function goes over a list of items (iterate) and builds an array out of some of this items (filter). A friend of mine does some ruby coding and in ruby this would look something like this:</p>
<pre class="brush: jscript;">
this.modelFriendListItems.getSelected().select{|item| !item.isFacebookUser}.collect {|item| item[:id]}
</pre>
<p>This is quite short and still yet readable. In JavaScript you can go as well in the direction of more functional programming. So let us refactor the JavaScript example above over some iterations.  The following examples use <a href="http://www.prototypejs.org">prototype.js</a> because this framework extends the JavaScript array with <a href="http://www.prototypejs.org/api/enumerable">some fancy functions</a>.<br />
<span id="more-554"></span></p>
<p>First we replace the &#8220;new Array()&#8221; term with the shorter term &#8216;[]&#8216;. Then we try to get rid of the for loop which is quite a easy place to create a bug. Prototype does extend each iterable object (array is one of them) with a set of functions. One of them is the &#8220;<a href="http://www.prototypejs.org/api/enumerable/each">each</a>&#8221; function which does apply the anonymous function given as a parameter to each element of the iterable.</p>
<pre class="brush: jscript;">
/**
* Returns array of uids of selected items
*/
getSelectedFB:function() {
	var result = [];
	this.modelFriendListItems.getSelected().each(function(item) {
		if(item.isFacebookUser){ result.push(item.id);  }
	});
	return result;
},
</pre>
<p>This is in my point of view already easier to read and it might be harder to create bugs as in a for loop. I do not like that you have to define a result array &#8216;outside&#8217; of the main function. So the following code will do exactly the same in a more recursive style. You give as a starting value a empty array to <a href="http://www.prototypejs.org/api/enumerable/inject">inject </a>and the anonymous function does now have to parameter where the first one is the array with the values and the second one is again the current item. You have to return the array at the end of the function. This makes the code again a bit shorter.</p>
<pre class="brush: jscript;">
getSelected:function() {
	return this.modelFriendListItems.getSelected().inject([], function(array,item) {
		if(!item.isFacebookUser){ array.push(item.id);  }
		return array;
	});
},
</pre>
<p>You get the code might get a bit more readable it you use two other functions of prototype. &#8216;<a href="http://www.prototypejs.org/api/enumerable/findAll">findAll</a>&#8216; does return a array of all items that do match the given filter function. &#8216;<a href="http://www.prototypejs.org/api/enumerable/pluck">pluck</a>&#8216; does return an array with the values of a given field from all  items.</p>
<pre class="brush: jscript;">
getSelected:function() {
	return this.modelFriendListItems.getSelected().findAll(funtion(item){
	return !item.isFacebookUser;}).pluck('id');
},
</pre>
<p>The only way, I can think of, to make this short and more readable would be to have the function &#8216;filterAllBy&#8217; and &#8216;filterAllByNot&#8217; in prototype. This is currently not the case, so the example bellow <strong>will not work</strong>.</p>
<pre class="brush: jscript;">
getSelected:function() {
	return this.modelFriendListItems.getSelected().filterAllByNot('isFacebookUser').pluck('id');
},
</pre>
<p>Some people did ask me if this code is not slower. Well it is! During the iteration of refactoring you lose some speed, but that should usually not matter in a real world application. But I spend also some time on how you could make your code faster with smart functional programing. I found out that generators (the one from python) are quite a good way to save cpu time under some circumstances.</p>
<p>For this I made up this ridiculous example. It&#8217;s the same thats in the article about phyton in the <a href="http://heise.de/ct">german computer magazin c&#8217;t</a> (<a href="http://www.heise.de/kiosk/archiv/ct/2009/5/198_kiosk">&#8220;Neues aus der Schlangengrube&#8221;, c&#8217;t 5.2009, p. 198</a>).</p>
<pre class="brush: jscript;">
var squares = $R(1, 1000000).map(function(n) {
	return n * n;
});

var result = [];
squares.each(function(n) {
	if (n &gt; 100) throw $break;
	result.push(n);
});

$(&quot;output&quot;).innerHTML += result;
</pre>
<p>Off course this example is horible slow and will nearly crash your browser. I measured something like 24 seconds on a IE 8, something around 6.5 seconds on a Firefox 3 and around 400 milliseconds on chrome.  A lot of the numbers you generate into the array squares are never used. With a generator you only generate the numbers you actually need.</p>
<p>I actually implemented a generator for prototype.js. It&#8217;s quite easy to create a own enumerable in prototype you just have to extend enumberable and implement the &#8216;<a href="http://www.prototypejs.org/api/enumerable">_each</a>&#8216; method. I did this in the following example with the class Generator. I also did implement the method mapGen directly into the Enumerable, it does have the same function as prototype.</p>
<pre class="brush: jscript;">
var Generator = Class.create();

[...]
 mapGen: function(iterator, context) {
		var result = new Generator(iterator, this);
		return result;
	},
[...]

Object.extend(Generator.prototype, Enumerable);
Object.extend(Generator.prototype, {

	initialize: function(generator, enumerable) {
		this.generator = generator;
		this.enumerable = enumerable;
	},

	_each: function(iterator) {
		this.enumerable.each(function(item){
			iterator(this.generator(item));
		}, this);

	},
});
</pre>
<p>The code looks afterwards still nearly the same:</p>
<pre class="brush: jscript;">
var squares = $R(1, 1000000).mapGen(function(n) {
  return n * n;
});

var result = [];
squares.each(function(n) {
  if (n &gt; 100) throw $break;
  result.push(n);
});

$(&quot;output&quot;).innerHTML += result;
</pre>
<p>The real difference is the execution time. As the first example took some seconds on the most browser, this code here runs in around 1 millisecond on all browsers. Nice looking code does not have to be slow, with some smart tricks you can write short, readable and fast code.</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.tilllate.com/2009/05/22/for-loop-to-generator-javascript/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>20 Notizen zum Silicon Valley</title>
		<link>http://techblog.tilllate.com/2009/05/18/20-notizen-zum-silicon-valley/</link>
		<comments>http://techblog.tilllate.com/2009/05/18/20-notizen-zum-silicon-valley/#comments</comments>
		<pubDate>Mon, 18 May 2009 17:39:13 +0000</pubDate>
		<dc:creator>Silvan Mühlemann</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[svt2009]]></category>

		<guid isPermaLink="false">http://techblog.tilllate.com/?p=561</guid>
		<description><![CDATA[Because I did not plan to post this article in this blog, it is in German. This should be an exception. Sorry for the English readers. Die letzte Woche habe ich im Silicon Valley verbracht. Mit einer Gruppe von 12 Leuten haben wir verschiedene Firmen und Organisationen besucht. Hier zähle ich ein paar wild zusammengewürfelte [...]]]></description>
			<content:encoded><![CDATA[<p><em>Because I did not plan to post this article in this blog, it is in German. This should be an exception. Sorry for the English readers.</em></p>
<p>Die letzte Woche habe ich im <a href="http://de.wikipedia.org/wiki/Silicon_Valley">Silicon Valley</a> verbracht. Mit einer <a href="http://www.siliconvalley.ch/tours/">Gruppe von 12 Leuten</a> haben wir verschiedene Firmen und Organisationen besucht. Hier zähle ich ein paar wild zusammengewürfelte persönliche Eindrücke auf: </p>
<ol>
<li>Die zwei heissesten Themen in US-Firmen sind <em><a href="http://de.wikipedia.org/wiki/Cloud_Computing">Cloud Computing</a></em> und <em>Green IT</em>. </li>
<li>Trotz Green IT ist die durchschnittliche Temperatur im Sitzungszimmer nie höher als 18°. Warme Kleidung ist empfohlen.
</li>
<li>Je niedriger die Temperatur im Sitzungszimmer, desto grösser das Unternehmen.
</li>
<li>Die NASA arbeitet mit Original-Anlagen aus den 50er-Jahren. Gut amortisiert!<br />
<table style="width:auto;">
<tr>
<td><a href="http://picasaweb.google.ch/lh/photo/ptLxA98nGvcjFj6QVc1tJw?feat=embedwebsite"><img src="http://lh5.ggpht.com/_i1BAZRgj8A8/ShFsiWf2UDI/AAAAAAAABs8/8r_utk8Adv4/s144/DSC03075.JPG" /></a></td>
</tr>
<tr>
<td style="font-family:arial,sans-serif; font-size:11px; text-align:right">Von <a href="http://picasaweb.google.ch/silvanm75/SiliconValleyTour2009?feat=embedwebsite">Silicon Valley Tour 2009</a></td>
</tr>
</table>
</li>
<li>Google ist jene Firma, welche am häufigsten unsere Fragen mit <em>&#8220;I cannot comment on that&#8221;</em> beantwortet hat.
</li>
<p><span id="more-561"></span></p>
<li><em>Executive Briefing Center</em> sind Gebäude, wo grosse Corporation ihre Kunden mit blinkender Hardware, PowerPoint-Präsentationen und Donuts von ihren Produkten überzeugen wollen. Diese Gebäude sind in sicherem Abstand zu den Anlagen, wo ernsthaft gearbeitet wird. </li>
<li>PowerPoint-Folien von US-Firmen enthalten mehr Text als eine Telefonbuchseite.</li>
<li>Mozilla Corporation&#8217;s Stolz ist (neben alter Netscape-Memorabilia) deren Sammlung an Alkoholika.<br />
<table style="width:auto;">
<tr>
<td><a href="http://picasaweb.google.ch/lh/photo/r8qTcACVIXVUtzwHpGagVw?feat=embedwebsite"><img src="http://lh3.ggpht.com/_i1BAZRgj8A8/ShFsbBpxazI/AAAAAAAABsY/2nQaZ1EMd1M/s144/DSC03045.JPG" /></a></td>
</tr>
<tr>
<td style="font-family:arial,sans-serif; font-size:11px; text-align:right">Von <a href="http://picasaweb.google.ch/silvanm75/SiliconValleyTour2009?feat=embedwebsite">Silicon Valley Tour 2009</a></td>
</tr>
</table>
</li>
<li>Will man Security-Guards kennenlernen, so packe man auf den Geländen von Apple, Google oder Sun den Foto-Apparat aus (Quelle: <a href="http://twitter.com/marcammann">@marcammann</a>).
</li>
<li>Die meisten Firmengebäude sind ein- bis zweistöckig und sehen aus wie Bungalows. Das verleiht dem Valley den Groove eines Club Med Feriendorfs.
</li>
<li>Ein echtes IT-Startup hat ein wandfüllendes Whiteboard und ein Kühlschrank voller Gratis-Getränke.
</li>
<li>Ein Semester an der Stanford University kostet $20&#8217;000 an Studiengebühren. Man kauft sich damit in ein Kontaktnetz.<br />
<table style="width:auto;">
<tr>
<td><a href="http://picasaweb.google.ch/lh/photo/OYjxCoAaAxIqDRoRWaw-CQ?feat=embedwebsite"><img src="http://lh4.ggpht.com/_i1BAZRgj8A8/ShFsUNHGWzI/AAAAAAAABr8/SmRqct08x18/s144/DSC03016.JPG" /></a></td>
</tr>
<tr>
<td style="font-family:arial,sans-serif; font-size:11px; text-align:right">Von <a href="http://picasaweb.google.ch/silvanm75/SiliconValleyTour2009?feat=embedwebsite">Silicon Valley Tour 2009</a></td>
</tr>
</table>
</li>
<li>Die Stanford University besitzt 2 Olympische Schwimmbecken, ein Stadion, und um 6 Uhr morgens sind die umliegenden Hügel übersät mit Joggern.
</li>
<li>Man joggt im Baumwoll-Shirt. Damit wird anhand der Schweissflecken die Leistung für das Umfeld sichtbar.
</li>
<li>Party auf amerikanisch: Ein 30-Pack Bud Lite kaufen und im Zug, auf der Fähre oder im Park konsumieren (Gilt für Männer <em>und </em>Frauen).
</li>
<li>Parkieren in San Francisco kostet $7.50 pro Stunde.<br />
<table style="width:auto;">
<tr>
<td><a href="http://picasaweb.google.ch/lh/photo/Xo70ktSQ1jl34u3gZrmXdg?feat=embedwebsite"><img src="http://lh5.ggpht.com/_i1BAZRgj8A8/ShFsnYXiBQI/AAAAAAAABtc/_Q5N0xfZLXU/s144/DSC03110.JPG" /></a></td>
</tr>
<tr>
<td style="font-family:arial,sans-serif; font-size:11px; text-align:right">Von <a href="http://picasaweb.google.ch/silvanm75/SiliconValleyTour2009?feat=embedwebsite">Silicon Valley Tour 2009</a></td>
</tr>
</table>
</li>
<li>Es gibt den Öffentlichen Verkehr. Er ist langsam (Zug fährt rund 30km/h) und unpünktlich.<br />
<table style="width:auto;">
<tr>
<td><a href="http://picasaweb.google.ch/lh/photo/us396UdUJ3EeJfdlU3nbtw?feat=embedwebsite"><img src="http://lh4.ggpht.com/_i1BAZRgj8A8/ShFskpcs7kI/AAAAAAAABtM/HWF7dPcaeN4/s144/DSC03090.JPG" /></a></td>
</tr>
<tr>
<td style="font-family:arial,sans-serif; font-size:11px; text-align:right">Von <a href="http://picasaweb.google.ch/silvanm75/SiliconValleyTour2009?feat=embedwebsite">Silicon Valley Tour 2009</a></td>
</tr>
</table>
</li>
<li>Die Varianz der Kundenfreundlichkeit ist weitaus grösser als in der Schweiz: In einigen Geschäften wird man keines Blickes gewürdigt. In anderen wird man umarmt, wenn man erwähnt, dass man aus der Schweiz kommt.
</li>
<li>Jedes zweite Auto im Silicon Valley ist ein Toyota Prius.
</li>
<li>Nur die Obdachlosen rauchen.
</li>
</ol>
<p>Weitere Fotos sind <a href="http://picasaweb.google.ch/silvanm75/SiliconValleyTour2009?feat=directlink">hier</a> zu finden.</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.tilllate.com/2009/05/18/20-notizen-zum-silicon-valley/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Website performance optimization: Don’t forget the client-side!</title>
		<link>http://techblog.tilllate.com/2009/04/23/website-performance-optimization-don%e2%80%99t-forget-the-client-side/</link>
		<comments>http://techblog.tilllate.com/2009/04/23/website-performance-optimization-don%e2%80%99t-forget-the-client-side/#comments</comments>
		<pubDate>Thu, 23 Apr 2009 08:34:13 +0000</pubDate>
		<dc:creator>Riv-Alain Vakili</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[front-end]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Website Optimization]]></category>

		<guid isPermaLink="false">http://techblog.tilllate.com/?p=528</guid>
		<description><![CDATA[Regarding the topic “optimizing page-loading-times” too many people still set the focus only on the server-side, ignoring the fact that most of the loading time is spent getting all the components of the page(CSS, JavaScript, images, ads).The buy viagra without prescription yahoo performance-team proved this very well. Also, pages (like tilllate.com) more often make heavy [...]]]></description>
			<content:encoded><![CDATA[<p>
Regarding the topic “optimizing page-loading-times” too many people still set the focus only on the server-side, ignoring the fact that most of the loading time is spent getting all the components of the page(CSS, JavaScript, images, ads).<BR>The
<div><a href='http://genericviagraorder.com/' title='buy viagra without prescription'>buy viagra without prescription</a></div>
<p> yahoo performance-team <A href="http://developer.yahoo.com/performance/rules.html#num_http" target="_blank">proved this very well</A>.</P><br />
<P>Also, pages (like tilllate.com) more often make heavy use of JavaScript with the goal of providing a better user experience. The problem is, that most developers work on modern hardware and develop on their favourite web browser – which is usually a recent one. They forget that a big amount of visitors still
<div><a href='http://buy-levitra-on.com/'>cheap levitra</a></div>
<p> surf with their first computer bought 7 years ago at Interdiscount and is mostly surfing on the developers least favourite browser (like IE 6). As a result, those visitors often do not get the optimal user-experience and the website loses traffic (=money).</P><br />
<P><IMG class="mceWPmore mceItemNoResize" alt="" src="http://techblog.tilllate.com/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif"></P><br />
<P>The conclusion out of this is:</P><br />
<UL><br />
<LI>We have to optimize our page following yahoo’s findings.</LI><br />
<LI>We have to optimize our JavaScript-execution.</LI></UL><br />
<H2>Where to start?</H2><br />
<P>Most of our traffic is generated through the photo album. We analyzed and improved following use-case in terms of loading-speed and responsiveness:</P><br />
<P><IMG class="aligncenter size-full wp-image-529" alt="homepage" src="http://techblog.tilllate.com/wp-content/uploads/2009/04/homepage.png" width="200" height="198"></P><br />
<P><EM>User comes to homepage&#8230;</EM></P><br />
<P><IMG class="aligncenter size-full wp-image-530" alt="thumbnails" src="http://techblog.tilllate.com/wp-content/uploads/2009/04/thumbnails.png" width="200" height="198"></P><br />
<P><EM>&#8230;goes to the a photoalbum&#8230;</EM></P><br />
<P><IMG class="aligncenter size-full wp-image-531" alt="photo" src="http://techblog.tilllate.com/wp-content/uploads/2009/04/photo.png" width="200" height="198"></P><br />
<P><EM>&#8230;clicks through the photos</EM></P><br />
<H2>Tweaks</H2><br />
<P>We then did the following things:</P><br />
<UL><br />
<LI>Reduced HTTP requests needed to load the JavaScript files: from 45 to 1-2 requests by merging the multiple files into a single one.</LI><br />
<LI>reduced file sizes of CSS- and JavaScript files by using <A href="http://developer.yahoo.com/yui/compressor/" target="_blank">yui-compressor</A></LI><br />
<LI>reduced amount of external scripts (like Google Analytics) or load them after everything else to reduce the dependency on third party hosts</LI></UL><br />
<P>Also with the photo album being a JavaScript app we went through the code and implemented the following improvements:</P><br />
<UL><br />
<LI>reduced DOM-operations</LI><br />
<LI>reduced amount of written code by refactoring</LI><br />
<LI>found and removed some common memory leak-patterns</LI><br />
<LI>removed fancy fading-effects as they were useless and took a lot of CPU time</LI></UL><br />
<H2>The results</H2><br />
<P>For example on IE7
<div><a href='http://ccialisonlinee.com' title='cialis online'>cialis online</a></div>
<p> (50% of our users are using it) we had following improvements:</P><br />
<UL><br />
<LI>time loading and set up the photoalbum decreased from 4.8 to 2.9 seconds</LI><br />
<LI>time switching between thumbnailpages decreased from<STRONG> </STRONG>1.3 to 0.3<STRONG> </STRONG>seconds</LI><br />
<LI>the general loading/parsing-time of JavaScript decreased from 1,2 to 0.6 respectively 0.5 to 0.3 seconds (Firefox).</LI></UL><br />
<P>Once we released the tweaks, the pageviews per visit increased by 20%.</p>
<div>a video of someone having a babyare you ready to have a baby  <a href="http://beachplastic.com/">pregnant, How do you get</a>  baby must haveswhen you get pregnant</div>
]]></content:encoded>
			<wfw:commentRss>http://techblog.tilllate.com/2009/04/23/website-performance-optimization-don%e2%80%99t-forget-the-client-side/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Job opening: Web developer (PHP / AJAX)</title>
		<link>http://techblog.tilllate.com/2009/03/31/job-opening-web-developer/</link>
		<comments>http://techblog.tilllate.com/2009/03/31/job-opening-web-developer/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 19:41:53 +0000</pubDate>
		<dc:creator>Silvan Mühlemann</dc:creator>
				<category><![CDATA[Arbeit]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[job]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://techblog.tilllate.com/?p=496</guid>
		<description><![CDATA[Are you enthusiastic about web technologies? Do you have strong PHP, Javascript and SQL skills? Would you like to work with a team of smart and passionate people? Are you open to advanced development methodologies like Scrum or Test Driven Development? Would you like help further develop one of the biggest Swiss website? Then you [...]]]></description>
			<content:encoded><![CDATA[<p>Are you enthusiastic about web technologies? Do you have strong PHP, Javascript and SQL skills? Would you like to work with a team of smart and passionate people? Are you open to advanced development methodologies like Scrum or Test Driven Development? Would you like help further develop one of the biggest Swiss website?</p>
<p>Then you should apply for a job at tilllate.com: Our team is looking for dedicated web developers. You&#8217;ll find more information in our <a href="/jobs/job-offering-software-engineer/">job ad</a>:</p>
<ul>
<li><a title="Web developer" href="/jobs/job-offering-software-engineer/">Web developer</a> (English) </li>
<li><a href="/jobs/software-entwickler-gesucht/">Web-Entwickler</a> (Deutsch)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://techblog.tilllate.com/2009/03/31/job-opening-web-developer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scrum: How we do Sprint Retrospectives</title>
		<link>http://techblog.tilllate.com/2009/03/17/scrum-how-we-do-sprint-retrospectives/</link>
		<comments>http://techblog.tilllate.com/2009/03/17/scrum-how-we-do-sprint-retrospectives/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 21:33:44 +0000</pubDate>
		<dc:creator>Silvan Mühlemann</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://techblog.tilllate.com/?p=484</guid>
		<description><![CDATA[Four weeks have passed since the last sprint planning meeting. Sprint number two has come to an end. It&#8217;s time for the sprint retrospective. The motivation for the sprint retrospective is: Visualize the accomplishment &#8211; important for the team morale Review any impediments and discuss measures on how to avoid them in the next sprint [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Four weeks have passed since the <a href="/2009/02/16/implementing-scrum-at-tilllatecom/">last sprint planning meeting</a>. Sprint number two has come to an end. It&#8217;s time for the sprint retrospective. </strong></p>
<p>The motivation for the <a href="http://www.mountaingoatsoftware.com/sprint-review-meeting">sprint retrospective</a> is:</p>
<ul>
<li>Visualize the accomplishment &#8211; important for the team morale</li>
<li>Review any impediments and discuss measures on how to avoid them in the next sprint</li>
</ul>
<p>Here&#8217;s how we are structuring the sprint retrospecives: </p>
<h2>The set up</h2>
<p>The team and the product owner are allocating one hour in the meeting room. We&#8217;re looking at the wall with the <a href="http://www.mountaingoatsoftware.com/task-boards">task board</a>  showing the user stories, the burn down chart and  the <em>impediment backlog</em>. This is a big paper with a post it for every impediment encountered during the sprint. We collected the impediments during the bi-weekly scrum meetings (aka <em>daily scrum</em>).</p>
<h2>Visualize the achievements</h2>
<p>First, I go through all <em>done</em> user stories and say a few words about every story. Time for <em>praising</em> the team. Developers often think &#8220;we haven&#8217;t achieved anything&#8221;. So it&#8217;s important to visualize the finished user stories.</p>
<p><span id="more-484"></span></p>
<h2>Getting the metrics</h2>
<p>Second, we update the burn down chart and calculate the achieved velocity (<tt>[accomplished story points] / [available man days] = [velocity]</tt>). In our case we had 74 man days available. We accomplished 38 story points. That&#8217;s a velocity of 51%. Better than last time (39%). But still quite low as we committed for 50 story points. Fail. No praise here.</p>
<p><a href="http://techblog.tilllate.com/wp-content/uploads/2009/03/burndown-chart.jpg"><img src="http://techblog.tilllate.com/wp-content/uploads/2009/03/burndown-chart-300x286.jpg" alt="burndown-chart of sprint 2" title="burndown-chart of sprint 2" width="300" height="286" class="alignnone size-medium wp-image-486" /></a></p>
<h2>Learning the lessons</h2>
<p>Third, we do the the retrospection round: This round is split in two parts. </p>
<p>First, we look at the conclusions from the last sprint retrospection a month ago. Were we able to implement the lessons learned? For example: We found that the product owner Martina did not have enough time to quickly reply to the questions of the team. As a measure we gave her an assistant. Did it help? -<em> &#8220;Yes&#8221;, </em>the team confirms, <em>&#8220;Martina was did have a lower response time than during the former sprint&#8221;.</em>. Good.</p>
<p>Then, we go through all the impediments we collected during the <a href="http://www.mountaingoatsoftware.com/daily-scrum">daily scrums</a>. We discuss what we can do to avoid them during the next sprint. Example: &#8220;The changes on the CSS were much more complicated than expected because our CSS is the mess&#8221;. The conclusion is: &#8220;We plan a CSS clean-up&#8221;. </p>
<h2>Results</h2>
<p>This meeting took about one hour. The result is:</p>
<ul>
<li>key metrics about the past sprint (expected velocity vs. actual velocity etc)</li>
<li>A list of impediments along with the measures to avoid them during the next sprint</li>
</ul>
<p>The team now has one day of slack time before we do our third sprint planning on Thursday. </p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.tilllate.com/2009/03/17/scrum-how-we-do-sprint-retrospectives/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>MVC for Javascript Controls</title>
		<link>http://techblog.tilllate.com/2009/03/01/mvc-for-javascript-controls/</link>
		<comments>http://techblog.tilllate.com/2009/03/01/mvc-for-javascript-controls/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 11:43:50 +0000</pubDate>
		<dc:creator>Silvan Mühlemann</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[oop]]></category>

		<guid isPermaLink="false">http://techblog.tilllate.com/?p=439</guid>
		<description><![CDATA[I recently had to take over an unfinished project. It was an AJAX control to select multiple friends as you can find it on Facebook. &#8220;It&#8217;s 99% complete&#8221;, I was told. Yeah, right. I counted 2 story points (without looking at the code). Soon I knew I was too optimistic: Classes calling other classes without [...]]]></description>
			<content:encoded><![CDATA[<p>I recently had to take over an unfinished project. It was an AJAX control to select multiple friends as you can find it on Facebook. </p>
<p><a href="http://techblog.tilllate.com/wp-content/uploads/2009/03/friendselector_facebook.gif"><img src="http://techblog.tilllate.com/wp-content/uploads/2009/03/friendselector_facebook-285x300.gif" alt="friendselector_facebook" title="Friend selector control how you can find it on facebook" width="285" height="300" class="alignnone size-medium wp-image-455" /></a></p>
<p>&#8220;It&#8217;s 99% complete&#8221;, I was told. Yeah, right. I counted 2 story points (without looking at the code). Soon I knew I was too optimistic: Classes calling other classes without logic. Randomly named variables. Data, creation of DOM elements, AJAX calls spread all over the place:</p>
<div id="attachment_449" class="wp-caption alignnone" style="width: 310px"><a href="http://techblog.tilllate.com/wp-content/uploads/2009/03/pic3.gif"><img src="http://techblog.tilllate.com/wp-content/uploads/2009/03/pic3-300x254.gif" alt="Architecture before refactoring (dramatized)" title="Architecture before refactoring (dramatized)" width="300" height="254" class="size-medium wp-image-449" /></a><p class="wp-caption-text">Architecture before refactoring (dramatized)</p></div>
<p>That&#8217;s not going to be easy. To make things worse: I am a Javascript beginner. What I did up to now was procedural Javascript code. </p>
<p><span id="more-439"></span></p>
<p>I felt the urge to begin everything from scratch. But I remember <a href="http://www.joelonsoftware.com/articles/fog0000000069.html">Joel Spolsky</a> saying that we should resist so I decided to go for a refactoring. </p>
<p>As <a href="/2008/05/20/tilllatecom-is-now-all-zend-framework/">I know</a> the <a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller">MVC </a>pattern very well from Zend Framework I tried to apply this pattern. Separation of concern! Each class has a well defined purpose. Here&#8217;s the architecture I refactored the code to:</p>
<p><a href="http://techblog.tilllate.com/wp-content/uploads/2009/03/friendselector_object_model.gif"><img src="http://techblog.tilllate.com/wp-content/uploads/2009/03/friendselector_object_model-300x206.gif" alt="Friend Selector object model after refactoring" title="Friend Selector object model after refactoring" width="300" height="206" class="alignnone size-medium wp-image-450" /></a></p>
<ol>
<li><strong>Model:</strong> All operation on <em>data</em> (i.e. the friends to be selected) is in the classes &#8220;ModelFriendListItems&#8221; (which aggregates &#8220;ModelFriendListItem&#8221;). The Ajax request fetching the friend objects from the server is located ther as AJAX is about data.</li>
<li><strong>View:</strong> The three views for the panes &#8220;Parent container&#8221;, &#8220;All friends&#8221; and &#8220;selected friends&#8221;. DOM manipulation only in these classes.</li>
<li>A <strong>controller</strong> in charge of instancing and <em>controlling</em> the model and the views. The controller handles all events. No AJAX.</li>
</ol>
<p>Here&#8217;s the sum up of the concerns of the parts:</p>
<table>
<tr>
<td></td>
<td><strong>DOM manipulation</strong></td>
<td><strong>AJAX calls</strong></td>
<td><strong>Event and input handling</strong></td>
</tr>
<tr>
<td><strong>Model</strong></td>
<td>No</td>
<td><strong>Yes</strong></td>
<td>No</td>
</tr>
<tr>
<td><strong>View</strong></td>
<td><strong>Yes</strong></td>
<td>No</td>
<td>No</td>
</tr>
<tr>
<td><strong>Controller</strong></td>
<td>No</td>
<td>No</td>
<td><strong>Yes</strong></td>
</tr>
</table>
<p>As every class has his well defined concern you quickly know where to look when you need to maintain or extend the control. The name of the class and files reflects the role (<tt>ViewAllFriends.js</tt>, <tt>ModelFriendsListItems.js</tt>). Logical event and data flows.</p>
<p>You can try it <a href="http://techblog.tilllate.com/wp-content/uploads/2009/friendselector/local_files/friendselector.htm">here</a>. Here&#8217;s how the final version looks:</p>
<p><a href="http://techblog.tilllate.com/wp-content/uploads/2009/03/friendselector_screenshot.gif"><img src="http://techblog.tilllate.com/wp-content/uploads/2009/03/friendselector_screenshot-300x227.gif" alt="Screenshot of friend selector control" title="Screen shot of friend selector control" width="300" height="227" class="alignnone size-medium wp-image-451" /></a></p>
<p>Well&#8230; It took much more than the 2 story points I counted in the beginning. But it feels much better having clean code! And my colleagues having to extend this control (<a href="http://leo.freeflux.net/">Leo</a>?) are surely happy for this clean up <img src='http://techblog.tilllate.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>I am sure there are other ways to model a Javascript control. What is your best practice?</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.tilllate.com/2009/03/01/mvc-for-javascript-controls/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Implementing scrum at tilllate.com</title>
		<link>http://techblog.tilllate.com/2009/02/16/implementing-scrum-at-tilllatecom/</link>
		<comments>http://techblog.tilllate.com/2009/02/16/implementing-scrum-at-tilllatecom/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 21:14:27 +0000</pubDate>
		<dc:creator>Silvan Mühlemann</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://techblog.tilllate.com/?p=421</guid>
		<description><![CDATA[The first sprint is done! Yes we finally started doing Scrum at tilllate.com*. Well, it&#8217;s not exactly how Schwaber and Sutherland would expect it. But our way fits our team. And the acceptance in both the IT team and the rest of the organization is high. It improves motivation and therewith the performance of the [...]]]></description>
			<content:encoded><![CDATA[<p><strong>The first sprint is done! Yes we finally started doing <a href="http://en.wikipedia.org/wiki/Scrum_(development)">Scrum</a> at tilllate.com*. Well, it&#8217;s not exactly how Schwaber and Sutherland would expect it. But our way fits our team. And the acceptance in both the IT team and the rest of the organization is high. It improves motivation and therewith the performance of the team. And that&#8217;s what matters.<br />
</strong></p>
<div id="attachment_426" class="wp-caption alignnone" style="width: 310px"><a href="http://techblog.tilllate.com/wp-content/uploads/2009/02/dsc02648-2.jpg"><img src="http://techblog.tilllate.com/wp-content/uploads/2009/02/dsc02648-2-300x225.jpg" alt="Sprint planning meeting" title="Sprint planning meeting" width="300" height="225" class="size-medium wp-image-426" /></a><p class="wp-caption-text">Sprint planning meeting</p></div>
<p><span id="more-421"></span></p>
<p>Here&#8217;s how we do it: <a href="http://ch.tilllate.com/EN/member/4288/">Martina</a>, our product manager for the website is the <em>product owner</em>. She collects all feature requests from the clients. In the case of tilllate this might be photographers, sales guys, visitors from the website. These features make up the <em>user stories</em>. She prioritizes these user stories lets the CEO sign them off. This creates the <em>product backlog</em>. </p>
<h2>Sprint planning</h2>
<p>Enters the IT team: During the <em>sprint planning</em> we go through every item on the product backlog. Martina explains each user story. The team does an estimate in <em>story points</em>. Once the estimation is done, every team member can <em>choose</em> which user story he would like to implement. This takes roughly 2 hours for a 3 week sprint.</p>
<p>This information is tracked on our <em>scrum board</em> which has a swim lane for every developer. Every user story is a post-it. </p>
<div id="attachment_428" class="wp-caption alignnone" style="width: 310px"><a href="http://techblog.tilllate.com/wp-content/uploads/2009/02/dsc02649.jpg"><img src="http://techblog.tilllate.com/wp-content/uploads/2009/02/dsc02649-300x168.jpg" alt="Scrum board" title="Scrum board" width="300" height="168" class="size-medium wp-image-428" /></a><p class="wp-caption-text">Scrum board</p></div>
<p>At the end of the sprint planning every developer knows what he has to do in the upcoming sprint. </p>
<h2>Daily scrums?</h2>
<p>No, we don&#8217;t do daily scrums. Yet. As my developers are not used to daily meetings I did not want to shock them (&#8220;Change management&#8221;). We started with bi-weekly meetings where we update the scrum board and the burn down chart.</p>
<h2>Sprint review</h2>
<p>At the end of the sprint we are doing a <em>demo </em>and a <em>review </em>of the sprint. In the demo every developer shows what he has accomplished during the sprint. This anticipates the feeling of &#8220;I did not get anything done&#8221; that so many of us have. The sprint review is a performance and problem analysis of the sprint. Did we meet our goals in term of story points? Why not? What can we do to meet them in the next sprint?</p>
<h2>First experience</h2>
<p>Today we had the sprint review for the sprint &#8220;1&#8243; and had the sprint planning for sprint &#8220;2&#8243;. Here&#8217;s our first experience:</p>
<ul>
<li><b>Hot:</b> The IT team is much more motivated than before we used scrum: They can choose themselves, what they would like to work on. And they have a goal</li>
<li><b>Hot:</b> As the IT team is doing the estimates they are committed to meet them. They are more focused.</li>
<li><b>Hot:</b> The product owner and the customer is happy as they have a high transparency. They always know what the team is up to. This increases trust in the IT team</li>
<li><b>Not:</b> We committed to 58 story points. At the end we only accomplished 23. That&#8217;s an awful velocity 39%. Bad. We had to take a number of measures for sprint two. For example: Decrease velocity down to 70% and better estimations.</li>
</ul>
<div id="attachment_437" class="wp-caption alignnone" style="width: 310px"><a href="http://techblog.tilllate.com/wp-content/uploads/2009/02/dsc02646.jpg"><img src="http://techblog.tilllate.com/wp-content/uploads/2009/02/dsc02646-300x225.jpg" alt="Burndown chart of the first sprint" title="Burndown chart of the first sprint" width="300" height="225" class="size-medium wp-image-437" /></a><p class="wp-caption-text">Burndown chart of the first sprint</p></div>
<p>*Thanks, <a href="http://www.sierra-charlie.com/">Peter Stevens</a>, <a href="http://leo.buettiker.org/">Leo Büttiker</a> and <a href="http://ch.tilllate.com/de/member/maarten">Maarten Manders</a> for motivating me to try it.</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.tilllate.com/2009/02/16/implementing-scrum-at-tilllatecom/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
