<?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>techblog.tilllate.com &#187; Web Development</title>
	<atom:link href="http://techblog.tilllate.com/category/web-development/feed/" rel="self" type="application/rss+xml" />
	<link>http://techblog.tilllate.com</link>
	<description>it and development at europe's leading clubbing community</description>
	<lastBuildDate>Sat, 15 Oct 2011 13:56:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<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>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[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<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 yahoo performance-team proved this very well. Also, pages (like tilllate.com) more often make heavy use of JavaScript [...]]]></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 yahoo performance-team <a href="http://developer.yahoo.com/performance/rules.html#num_http" target="_blank">proved this very well</a>.</p>
<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 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>
<p><span id="more-528"></span></p>
<p>The conclusion out of this is:</p>
<ul>
<li>We have to optimize our page following yahoo’s findings.</li>
<li>We have to optimize our JavaScript-execution.</li>
</ul>
<h2>Where to start?</h2>
<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>
<p><img class="aligncenter size-full wp-image-529" src="http://techblog.tilllate.com/wp-content/uploads/2009/04/homepage.png" alt="homepage" width="200" height="198" /></p>
<p style="text-align: left;"><em>User comes to homepage&#8230;</em></p>
<p><img class="aligncenter size-full wp-image-530" src="http://techblog.tilllate.com/wp-content/uploads/2009/04/thumbnails.png" alt="thumbnails" width="200" height="198" /></p>
<p style="text-align: left;"><em>&#8230;goes to the a photoalbum&#8230;</em></p>
<p><img class="aligncenter size-full wp-image-531" src="http://techblog.tilllate.com/wp-content/uploads/2009/04/photo.png" alt="photo" width="200" height="198" /></p>
<p style="text-align: left;"><em>&#8230;clicks through the photos</em></p>
<h2>Tweaks</h2>
<p>We then did the following things:</p>
<ul>
<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>
<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>
<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>
<p>Also with the photo album being a JavaScript app we went through the code and implemented the following improvements:</p>
<ul>
<li>reduced DOM-operations</li>
<li>reduced amount of written code by refactoring</li>
<li> found and removed some common memory leak-patterns</li>
<li> removed fancy fading-effects as they were useless and took a lot of CPU time</li>
</ul>
<h2>The results</h2>
<p>For example on IE7 (50% of our users are using it) we had following improvements:</p>
<ul>
<li>time loading and set up the photoalbum decreased from 4.8 to 2.9 seconds</li>
<li>time switching between thumbnailpages decreased from<strong> </strong>1.3 to 0.3<strong> </strong>seconds</li>
<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>
<p>Once we released the tweaks, the pageviews per visit increased by 20%.</p>
]]></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>
		<item>
		<title>Webtuesday Lightning Talk Slides</title>
		<link>http://techblog.tilllate.com/2008/08/14/webtuesday-lightning-talk-slides/</link>
		<comments>http://techblog.tilllate.com/2008/08/14/webtuesday-lightning-talk-slides/#comments</comments>
		<pubDate>Thu, 14 Aug 2008 07:07:41 +0000</pubDate>
		<dc:creator>Maarten Manders</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[IT Infrastructure]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Webtuesday]]></category>
		<category><![CDATA[css history hack]]></category>
		<category><![CDATA[stupidDB]]></category>
		<category><![CDATA[webtuesday lightning talk]]></category>

		<guid isPermaLink="false">http://techblog.tilllate.com/?p=358</guid>
		<description><![CDATA[This week, there was another webtuesday with lightning talks in Zürich. Leo and I each did a little talk: &#8220;StubidDB&#8221; by Leo Leo still dreaming about dumber databases. His own creation StupidDB might sound familiar to you&#8230; &#8220;I&#8217;m in Ur Browzerz&#8230;&#8221; by Maarten Harry had the idea to locate your users based on their history. [...]]]></description>
			<content:encoded><![CDATA[<p>This week, there was another <a href="http://www.webtuesday.ch/meetings/20080812">webtuesday</a> with <a href="http://en.wikipedia.org/wiki/Lightning_Talk">lightning talks</a> in Zürich. Leo and I each did a little talk:</p>
<p><strong>&#8220;StubidDB&#8221; by Leo</strong></p>
<p>Leo still dreaming about dumber databases. His own creation <a href="http://techblog.tilllate.com/wp-content/uploads/2008/08/stupiddb.pdf">StupidDB</a> might sound familiar to you&#8230;</p>
<p><strong>&#8220;I&#8217;m in Ur Browzerz&#8230;&#8221; by Maarten</strong></p>
<p><a href="http://webtuesday.ch/members/harryf">Harry</a> had the idea to locate your users based on their history. I tried it out, giving another 8 minutes of fame to an <a href="http://ha.ckers.org/weird/CSS-history-hack.html">old and well-known hack</a>. The slides can be found <a href="http://techblog.tilllate.com/wp-content/uploads/2008/08/css-history-hack-to-scan-users.pdf">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.tilllate.com/2008/08/14/webtuesday-lightning-talk-slides/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Static + Unit Tests = Arrrghhh!</title>
		<link>http://techblog.tilllate.com/2008/08/07/static-unit-tests-arrrghhh/</link>
		<comments>http://techblog.tilllate.com/2008/08/07/static-unit-tests-arrrghhh/#comments</comments>
		<pubDate>Thu, 07 Aug 2008 16:42:47 +0000</pubDate>
		<dc:creator>Maarten Manders</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Webtuesday]]></category>
		<category><![CDATA[unit tests testing static dependency injection independ]]></category>

		<guid isPermaLink="false">http://techblog.tilllate.com/?p=352</guid>
		<description><![CDATA[All I needed to do was renaming Trevi_Auth to Tilllate_Auth. Sure, it affected some 41 files, but that&#8217;s nothing a little bit of search &#038; replace can&#8217;t do. The big headache started when I ran the unit tests. Shuffle Unit Tests = Fail. It&#8217;s absolutely amazing how much you can mess up unit tests just [...]]]></description>
			<content:encoded><![CDATA[<p>All I needed to do was renaming Trevi_Auth to Tilllate_Auth. Sure, it affected some 41 files, but that&#8217;s nothing a little bit of search &#038; replace can&#8217;t do. The big headache started when I ran the unit tests.</p>
<p><strong>Shuffle Unit Tests = Fail.</strong></p>
<p>It&#8217;s absolutely amazing <strong>how much you can mess up unit tests just by changing their order</strong>! (Trevi_* comes after Tilllate_*) Everyone knows that tests are supposed to be independent. But we all know how it is. <strong>People get lazy, mocks are complicated and testing is boring anyway.</strong> And don&#8217;t forget about that cool pattern called <strong>&#8220;Singleton&#8221;</strong> that we&#8217;ve all read about in an inflight magazine!</p>
<p><strong>Punish Me!</strong></p>
<p>Obviously we can&#8217;t do testing right without getting beaten with a stick. So where&#8217;s that stick? <strong>Is there a way to reset all static variables in PHP? Is there a PHPUnit hack that forks a separate PHP process for each test?</strong></p>
<p>What is your solution to keep your tests from sticking together like spit ? I&#8217;m happy to learn about it!</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.tilllate.com/2008/08/07/static-unit-tests-arrrghhh/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Nine ways to obfuscate e-mail addresses compared</title>
		<link>http://techblog.tilllate.com/2008/07/20/ten-methods-to-obfuscate-e-mail-addresses-compared/</link>
		<comments>http://techblog.tilllate.com/2008/07/20/ten-methods-to-obfuscate-e-mail-addresses-compared/#comments</comments>
		<pubDate>Sun, 20 Jul 2008 16:41:05 +0000</pubDate>
		<dc:creator>Silvan Mühlemann</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[spam]]></category>

		<guid isPermaLink="false">http://techblog.tilllate.com/?p=346</guid>
		<description><![CDATA[When displaying an e-mail address on a webpage you obviously want to obfuscate it to avoid it getting harvested by spammers. But which obfuscation method is the best one? I drove a test with 10 methods. Here are the results.]]></description>
			<content:encoded><![CDATA[<p><strong>When displaying an e-mail address on a website you obviously want to obfuscate it to avoid it getting harvested by spammers. But which obfuscation method is the best one? I drove a test to find out. Here are the results:</strong></p>
<p>In 2006 I opened nine different e-mail addresses. On <a href="http://ch.tilllate.com/061101_emailtest.php">this</a> page I published the nine e-mail addresses. But every address has been obfuscated by a different method. I made sure it&#8217;s getting indexed by <a href="http://www.google.ch/search?hl=de&#038;q=techblog.tilllate.com-E-Mail-Harvester-Test&#038;btnG=Google-Suche&#038;meta=">Google</a> by putting a link to that page on the <a href="http://www.tilllate.com">tilllate.com homepage</a>.</p>
<p>Then I waited 1.5 years (<a href="http://techblog.tilllate.com/2006/11/01/im-test-8-methoden-die-e-mail-adresse-zu-verstecken/">see the original post</a>). </p>
<p>For each e-mail address I counted the amount of spam I received. The amount of spam received started by 21MB (for no obfuscation and a total of over 1800 spam mails) and went down to absolutely no spam.</p>
<p><a href='http://techblog.tilllate.com/wp-content/uploads/2008/07/obfuscation_methods.png'><img src="http://techblog.tilllate.com/wp-content/uploads/2008/07/obfuscation_methods.png" alt="" title="obfuscation_methods" width="430" height="317" class="alignnone size-full wp-image-349" /></a></p>
<p>The following three methods are absolutely rock-solid and keep your addresses safe from the harvesters.<br />
<span id="more-346"></span></p>
<h2>1. Changing the code direction with CSS</h2>
<p>Here&#8217;s how you do it:</p>
<style type="text/css">
span.codedirection { unicode-bidi:bidi-override; direction: rtl; }
</style>
<p><span class="codedirection">moc.etalllit@7raboofnavlis</span></p>
<h2>2. Using CSS display:none</h2>
<p>&lt;style type=&#8221;text/css&#8221;&gt;<br />
p span.displaynone { display:none; }<br />
&lt;/style&gt;<br />
&lt;p&gt;silvanfoobar8@&lt;span class=&#8221;displaynone&#8221;&gt;null&lt;/span&gt;tilllate.com&lt;/p&gt;</p>
<h2>3. ROT13 Encryption</h2>
<p>ROT13 encode the e-mail address with <a href="http://rot13.de/">this tool</a> or use the <a href="http://ch2.php.net/str_rot13">str_rot13</a> function of PHP and decode it via Javascript.</p>
<p>&lt;script type=&#8221;text/javascript&#8221;&gt;<br />
document.write(&#8220;&lt;n uers=\&#8221;znvygb:fvyinasbbone10@gvyyyngr.pbz\&#8221; ery=\&#8221;absbyybj\&#8221;&gt;&#8221;.replace(/[a-zA-Z]/g, function(c){return String.fromCharCode((c&lt;=&#8221;Z&#8221;?90:122)&gt;=(c=c.charCodeAt(0)+13)?c:c-26);}));<br />
&lt;/script&gt;silvanfoobar&#8217;s Mail&lt;/a&gt;</p>
<p>Thanks, <a href="http://emcons.net/blog/">Christoph Burgdorfer</a> for this idea.</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.tilllate.com/2008/07/20/ten-methods-to-obfuscate-e-mail-addresses-compared/feed/</wfw:commentRss>
		<slash:comments>126</slash:comments>
		</item>
	</channel>
</rss>

