<?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>YsA.Net</title>
	<atom:link href="http://blogs.microsoft.co.il/ysa/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.microsoft.co.il/ysa</link>
	<description>Let the games begin</description>
	<lastBuildDate>Tue, 07 Oct 2014 16:09:28 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.0.2</generator>
	<item>
		<title>HOUSE of CODE</title>
		<link>http://blogs.microsoft.co.il/ysa/2014/10/07/house-of-code/</link>
		<comments>http://blogs.microsoft.co.il/ysa/2014/10/07/house-of-code/#respond</comments>
		<pubDate>Tue, 07 Oct 2014 16:07:41 +0000</pubDate>
		<dc:creator><![CDATA[ysa]]></dc:creator>
		
		<guid isPermaLink="false">http://blogs.microsoft.co.il/ysa/?p=921120</guid>
		<description><![CDATA[After seven years in the MS blogging community, I’m moving on to an independent road – my own self hosted blog. Check it out at http://blog.house-of-code.com. All the old posts have been moved to the new blog (and the old posts will redirect to their new URL). If you follow me with RSS, please re-subscribe [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>After seven years in the MS blogging community, I’m moving on to an independent road – my own self hosted blog.</p>
<p>Check it out at <a href="http://blog.house-of-code.com">http://blog.house-of-code.com</a>.</p>
<p>All the old posts have been moved to the new blog (and the old posts will redirect to their new URL).</p>
<p>If you follow me with RSS, please re-subscribe to <a href="http://blog.house-of-code.com/rss">http://blog.house-of-code.com/rss</a>.</p>
<p>Thank you all for reading!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.microsoft.co.il/ysa/2014/10/07/house-of-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gamifying Your R&#038;D</title>
		<link>http://blogs.microsoft.co.il/ysa/2014/06/03/gamifying-your-rd/</link>
		<comments>http://blogs.microsoft.co.il/ysa/2014/06/03/gamifying-your-rd/#comments</comments>
		<pubDate>Tue, 03 Jun 2014 10:41:00 +0000</pubDate>
		<dc:creator><![CDATA[ysa]]></dc:creator>
				<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Culture]]></category>
		<category><![CDATA[DEV]]></category>
		<category><![CDATA[Gamification]]></category>

		<guid isPermaLink="false">http://blogs.microsoft.co.il/ysa/?p=921066</guid>
		<description><![CDATA[Continuous Integration means a lot to me. It&#8217;s like my second child. I found out the hard way that this sort of cultural thing is very hard to rely on and maintain inside an ever growing company. My latest crusade was about ignored tests. When I first came aboard the company, we had many. Since [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://martinfowler.com/articles/continuousIntegration.html" target="_blank">Continuous Integration</a> means a lot to me. It&#8217;s like my second child. I found out the hard way that this sort of cultural thing is very hard to rely on and maintain inside an ever growing company.  </p>
<p>My latest crusade was about <i>ignored tests</i>. When I first came aboard the company, we had many. Since I considered them a <a href="http://www.artima.com/intv/fixit.html" target="_blank">broken window</a>, I started handling them one by one.&nbsp; <br />After a couple of days – <b>Great Success</b> – no more ignored tests.&nbsp; Since then it has been two years, and we&#8217;ve been trying to get the ignored tests in check… unsuccessfully:&nbsp; <br />First we started to register the ignored tests introduced in each commit. <br />Next we sent a daily personal email to each developer with their own ignored tests.&nbsp; <br />Then, we sent it to their managers.&nbsp; <br />And, as a final move – we went directly to the developers. Then we heard them say: “I know,&nbsp; I’ll fix them once I finish my super-urgent feature…”.&nbsp; <br />Days, weeks and months passed by, and nothing was fixed. </p>
<p>I then realized something simple: you can’t make people do things. Even if they understand the importance of the issue at hand, they will assign it a different priority than you. And most of these issues are <i>seemingly&nbsp; </i>not something they enjoy doing. <br />I wanted to find a way to encourage developers and rally them to my cause. </p>
<p>I started with small &#8220;hackathon&#8221;-like days during which we solved a specific issue, like dead code or improving tests execution time. <br />It worked for a short time, but it didn&#8217;t achieve the impact I wanted (not too many people are excited about “hey, we deleted a bunch of code… hurray for us!”). The worst part was that it was a <b>one-time thing</b>: the developers stopped addressing those issues once the hackathon was over. </p>
<p>I needed to return to the basics – understand the user.</p>
<p>For starters, if you don’t know how to do something, at least make sure you are measuring it. So we started to measure some statistics about the issues (number of ignored tests per team, number of dead endpoints, etc…) and <a href="http://guide.agilealliance.org/guide/information-radiator.html" target="_blank">display them on our office monitors</a>.&nbsp; <br />Although it was very helpful to me, it was not clear enough for other people in the company what those stats meant. <br />Next, I started to create a backlog of our technical debt tasks. This didn’t work as well (I got the “it&#8217;s in the backlog” answer from both developers and team leads all the time, but no one seemed to try and get things out of the backlog). </p>
<p>Finally, it struck me: <b>Why not create a </b><b>healthy </b><b>competition between the groups and teams?</b> This way, we’ll exterminate the “threat” and reward people for doing good deeds for our ecosystem and codebase.&nbsp; <br />People love to win – and&nbsp; even better – hate to lose. This can create the momentum I wanted and it will go all the way up to the group leads. </p>
<p>So I started thinking about the concept for the first competition –&nbsp; exterminating ignored tests. I wanted a cool and funny way to display it on the boards and make everyone connected, resulting in &#8220;Game of Code&#8221;: </p>
<p><img src="https://dchtm6r471mui.cloudfront.net/hackpad.com_o9ZahbMveHX_p.102156_1401698573522_game-of-code-pixelated.png"> <br />Next to each group&#8217;s sigil, you can see the number of ignored tests, with the leading group painted green. </p>
<p>I’m getting great feedback, and many questions and discussions about this issue – <b>which is exactly what I wanted</b>: developers, product and managers are all talking about ignored tests, trying to understand what &#8220;this cool Game of Thrones thing on the monitor&#8221; is all about.  </p>
<p>And, of course, the groups are starting to churn the ignored tests at a high rate – after two weeks we are left with only a few remaining tests, and as the deadline nears, the rate increases. </p>
<p>I also spotted a few tricksters who tried to cheat the system (our developers are very creative), but&nbsp; this is fine as well – the important thing is that people are paying attention and trying to understand the underlying issue. </p>
<p>People also mentioned that the competition itself is not fair &#8211; it&#8217;s not meant to be. It&#8217;s not meant to be fair or balanced. The competition is only an excuse.&nbsp; It is meant to be a fun game for all to play, and at the end, we all win! </p>
<h3><font color="#4f81bd">So, what is the difference?</font></h3>
<p><b>Clear, single goal </b>everyone can understand easily.</p>
<p><b>Display</b><b>ing</b><b> the goal and expos</b><b>ing</b><b> it to everyone</b> (including the company’s CEO) in a clear, understandable manner, creates a larger impact, raises awareness and puts the effort in everyone&#8217;s faces. </p>
<p><b>Competition </b>and <a href="http://en.wikipedia.org/wiki/Gamification" target="_blank">Gameplay</a> are very good motivators. It&#8217;s a constructive way to encourage engagement in the most unexpected ways. </p>
<p>How does it all unfold in the long run? <br />I’ll let you know.&nbsp; <br />All I know is when you play the Game of Code, <strong>we all win</strong>. </p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.microsoft.co.il/ysa/2014/06/03/gamifying-your-rd/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Through the Looking Glass: Google Glass as a Lean Startup case study</title>
		<link>http://blogs.microsoft.co.il/ysa/2014/05/23/through-the-looking-glass-google-glass-as-a-lean-startup-case-study/</link>
		<comments>http://blogs.microsoft.co.il/ysa/2014/05/23/through-the-looking-glass-google-glass-as-a-lean-startup-case-study/#respond</comments>
		<pubDate>Fri, 23 May 2014 13:38:38 +0000</pubDate>
		<dc:creator><![CDATA[ysa]]></dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Google Glass]]></category>
		<category><![CDATA[Lean]]></category>
		<category><![CDATA[Lean Startup]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blogs.microsoft.co.il/ysa/?p=921062</guid>
		<description><![CDATA[After a long time, I finally got my hands on Google Glass. I got one to try out for a couple of days and I must say I am very impressed. I think they are a technological achievement. What impresses me even more is the way Google are handling the product. If you ever read [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>After a long time, I finally got my hands on <a href="http://www.google.com/glass/start/" target="_blank">Google Glass</a>. I got one to try out for a couple of days and I must say I am very impressed. I think they are a technological achievement. </p>
<p>What impresses me even more is the way Google are handling the product. If you ever read “<a href="http://www.amazon.com/Lean-Startup-Innovation-Successful-Businesses-ebook/dp/B004J4XGN6/ref=sr_1_1?ie=UTF8&amp;qid=1400843913&amp;sr=8-1&amp;keywords=lean+startup+eric+ries" target="_blank">The Lean Startup</a>” by Eric Ries (if you didn’t, you should…), you can see a lot of concepts that are used to develop this innovation.</p>
<h3><font color="#4f81bd">Sell your product</font></h3>
<p>First concept that is introduced in the book is to charge money for your product. It creates a commitment from the clients, establishes the product has valuable in the eyes of the customer and creates an environment in which people who use the product actually want it.</p>
<p>An added benefit to this is that you can get immediate feedback from the ones who purchased it. Since the customer pied for it, he will not ignore things that are bothering him.</p>
<p>Although in this case the price is pretty steep, I think it donates to the feeling of exclusivity of the product (more on that later).</p>
<h3><font color="#4f81bd">MVP</font></h3>
<p>Glass is a great MVP. It achieved what many products before tried and failed – on the go display in front the user.</p>
<p>The purpose of a MVP is to create the minimum requirements for the product, and then throwing it to the real world to see if it answers the users expectations.</p>
<p>In this case you get a HUD (Heads Up Display) which connects to the internet and your phone, which is still quite awkward to use. </p>
<p>But that’s the point – I’m sure someone thought <em>“Hey, wouldn’t it be nice to use Head gestures to scroll?” </em>– but once it was out in the field, he got the feedback from the user saying: <em>“Hey, when I’m on a bus or in a meeting, I can’t really start to bob my head to scroll for what I need”.</em></p>
<p>The amazing thing here, that the MVP by itself is a platform for change by the actual users. Apps are being develop to enrich and fill the blanks Google left or missed. Some of them, in turn, will become part of the system, thus improving the product by the community knowledge and experience.</p>
<h3><font color="#4f81bd">Use the Power Users</font></h3>
<p><font color="#000000">One of my eureka moments when reading the Lean Startup book was that although we strive to build a product to accommodate most users, we need the power users to give us feedback. </font><font color="#000000">They will be the most invested users. They will give the best feedback (uncensored and uncompromising). </font></p>
<p><font color="#000000">And when they feel they are heard, they will be the ones who will advocate your product and help you to spread it.</font></p>
<p><font color="#000000">In this case, Google has done a wonderful job by creating an exclusive group of users for there product (as they are doing all the time – remember Gmail beta?), which are invested (since they pied a lot of money for it) and are not afraid to criticize it when it doesn’t meet their expectations.</font></p>
<p><font color="#000000">Although it seems trivial, think how hard it was for you to get users to use your product (and pay for it).</font></p>
<h3><font color="#4f81bd">Feedback loop</font></h3>
<p>All of the above serves only one purpose: <strong>to get feedback</strong>. To <strong>experiment</strong>. To understand what the user really <strong>need</strong>, not what <strong>we think he wants</strong>.</p>
<p>When you search the web about Glass, you get a ton of reviews, criticism and suggestions – good and bad. I’m sure the developers of Glass are gaining a lot from the feedback (UX, looks, app development, etc…).</p>
<p>But it’s not only a technical experiment. It’s also a grand social experiment meant to see how we, as humans, will react to this sort of product. This is a kind of product which changes our way of thinking and behavior – <em>someone is always recording us, search data about us and our conversation topics while we talk to him</em>. How will people react to this? How will governments and security agencies will? A very interesting question that I’m sure the management at Google are looking at the world wide reaction with a magnifying Glass (pun intended).</p>
<h3><font color="#4f81bd">Entrepreneurship</font></h3>
<p>Although almost everyone considers Google as one of the world’s trendsetters and a very innovative company, it is still amazing to see projects like this – which has a lot of risk and I’m guessing costs quite a lot, can happen within such a big company.</p>
<p>Lean Startup talks about how entrepreneurship can happen inside a big company or enterprise – islands of innovation, and how to create a culture for think and executing these kind of things. </p>
<p>It amazes me that Google is doing these all the time (with quite a lot of failures) and continuing to do so to find the next grand thing.</p>
<h3><font color="#4f81bd">In conclusion</font></h3>
<p>I don’t know if Glass will be successful or not, but I’m quite sure that from this experiment, Google (and other companies) are learning a lot.</p>
<p>I believe this is the way developing products should work, since the road to creating a successful one, is bumpy and long. What makes a successful product? This is the question all of us are trying to answer all the time.</p>
<p>&nbsp;</p>
<p>Now, think about it for a minute. Can you use this concepts on your next idea? For your next feature? </p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.microsoft.co.il/ysa/2014/05/23/through-the-looking-glass-google-glass-as-a-lean-startup-case-study/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How I Coded my Costume</title>
		<link>http://blogs.microsoft.co.il/ysa/2014/04/01/how-i-coded-my-costume/</link>
		<comments>http://blogs.microsoft.co.il/ysa/2014/04/01/how-i-coded-my-costume/#respond</comments>
		<pubDate>Tue, 01 Apr 2014 18:24:36 +0000</pubDate>
		<dc:creator><![CDATA[ysa]]></dc:creator>
				<category><![CDATA[.Net Micro Framework]]></category>
		<category><![CDATA[DEV]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[Netduino]]></category>

		<guid isPermaLink="false">http://blogs.microsoft.co.il/ysa/?p=921046</guid>
		<description><![CDATA[A few weeks ago we had our annual costume party at the office. This year I had no idea what am I going to do… I thought about it a bit, tossed around some ideas, but I was blocked. Then a friend at work gave me a great idea: Why not dress up as H.A.L. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>A few weeks ago we had our annual costume party at the office. This year I had no idea what am I going to do… I thought about it a bit, tossed around some ideas, but I was blocked.</p>
<p>Then a friend at work gave me a great idea: Why not dress up as <a href="http://en.wikipedia.org/wiki/HAL_9000" target="_blank">H.A.L. 9000</a>? I’ve used H.A.L. character to brand our <a href="http://blogs.microsoft.co.il/ysa/tag/continuous-deployment/" target="_blank">Continuous Deployment</a> efforts (especially in the launch day we had for the process a few months back), so this sounded like a <strong>awesome</strong>.</p>
<p><img alt="HAL's camera eye" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f6/HAL9000.svg/220px-HAL9000.svg.png" /></p>
<p>I had two ways to go: the easy way, and the cool way.</p>
<p>The easy way was to print H.A.L. on a t-shirt – cool but mundane. Why not create a working version – with the halo and all??!!</p>
<p>So, I started to collect the parts I needed:</p>
<p>For the halo: <a href="http://netduino.com/" target="_blank">Netduino</a> and a very bright red LED (“Wait!”, you might think, “Why not simply use a blinking light from Christmas decorations, or something from a kid’s toy? Well, I wanted the halo to be random and soft, and I couldn’t find one that matches my needs… And again, much cooler doing it with <a href="http://netduino.com/" target="_blank">Netduino</a>!), some long copper wires to connect it all, a 9V battery and a power connector for <a href="http://netduino.com/" target="_blank">Netduino</a> which a friend patched up.</p>
<p>I’ve used <a href="http://netduino.com/netduinoplus2/specs.htm" target="_blank">Netduino Plus 2</a> that I had for some time now. The challenge here was to create the halo so the light will be smoothly dimmed – in just the right way. For that I couldn’t just use a simple digital port, since it will create only an on-off effect. I consulted a friend which suggested using <a href="http://en.wikipedia.org/wiki/Pulse-width_modulation" target="_blank">PWM</a>, which is available as part of the <a href="http://netduino.com/" target="_blank">Netduino</a> framework (not the .Net micro framework). In essence, what it does is to blink the LED for short interval to create a virtual change in the light’s strength. playing with the interval with a sin function creates the dimming effect I wanted:</p>
<pre class="csharpcode">var led = <span class="kwrd">new</span> PWMPWMChannels.PWM_ONBOARD_LED, <span class="rem">/*Frequency*/</span> 1000, <span class="rem">/* Duty cycle - aka interval */</span> .5, <span class="kwrd">false</span>);
led.Start();

<span class="kwrd">while</span>(<span class="kwrd">true</span>)
{
    <span class="rem">/* One on-off cycle */</span>
    <span class="kwrd">for</span> (var startValue = <span class="rem">/* Low end of the sin wave */</span> 5.212; startValue &lt; 10.495; startValue = startValue + 0.1)
    {
        var ledIntensity = Math.Sin(startValue) * .5 + .5;
        led.DutyCycle = ledIntensity;
    }
}</pre>
<p>To add the randomness I added Thread.Sleep at the top of the sin and in the beginning of a cycle:</p>
<pre class="csharpcode"><span class="kwrd">const</span> <span class="kwrd">double</span> initialIntensity = 5.212;
<span class="kwrd">const</span> <span class="kwrd">double</span> topIntesity = 7.8;
<span class="kwrd">const</span> <span class="kwrd">double</span> finalIntensity = 10.495;

var led = <span class="kwrd">new</span> PWM(channel, 1000, .5, <span class="kwrd">false</span>);
led.Start();

<span class="kwrd">while</span> (<span class="kwrd">true</span>)
{
    Thread.Sleep(RandomSleepTime(MaxOffTime));

    <span class="kwrd">for</span> (var startValue = initialIntensity; startValue &lt; finalIntensity; startValue = startValue + 0.1)
    {
        var ledIntensity = Math.Sin(startValue) * .5 + .5;
        led.DutyCycle = ledIntensity;

        Thread.Sleep(FadeInterval);

        <span class="rem">// While Sin is in max value, so is the led intensity. So, to create the random pulsing affect, we need to pause.</span>
        <span class="kwrd">if</span> (startValue &gt; topIntesity - 0.09 &amp;&amp; startValue &lt; topIntesity + 0.09)
            Thread.Sleep(RandomSleepTime(MaxOnTime));
    }
}</pre>
<p>The entire code needed for this available at <a title="https://github.com/ysa23/Netduino-HAL" href="https://github.com/ysa23/Netduino-HAL">https://github.com/ysa23/Netduino-HAL</a></p>
<p>For the actual construct, I used a piece of cardboard to hold the LED and wiring. To create the halo effect to spread evenly, I created a cone from a piece of black paper, cut a hole in the middle (for the LED) and covered it with a printed picture of H.A.L. All of this will be based on a lid from a coffee cup, which I’ve cut to let the wires through:</p>
<p><iframe width="600" height="600" frameborder="0" src="https://vine.co/v/MhZ3dQveU5Q/embed/simple"></iframe></p>
<p>The hardest part in all this was to find the transparent dome to create the final touch. For this I have to thank my wife who found a top from a milkshake cup.</p>
<p>The frame is constructed from a piece of flexible cardboard I colored in silver, shaped it as a cone, and cut a hole to fit the construct in.</p>
<p>After a couple of hours of glue (three types of glue!!!), I came up with this:</p>
<p><iframe width="600" height="600" frameborder="0" src="https://vine.co/v/MhmnlbVn1v0/embed/simple"></iframe></p>
<p>All of this was sewed on a black t-shirt I bought by my wife (at 1AM). The wires were also sewed from within the shirt running to the waist. The wires were connected to the <a href="http://netduino.com/" target="_blank">Netduino</a> which I put in a small pack attached to my belt. The end result was:</p>
<p><iframe width="600" height="600" frameborder="0" src="https://vine.co/v/Mhm33rjAu2M/embed/simple"></iframe></p>
<p>After it was all done, we went to sleep happy and excited about the accomplishment. At 10:00AM we woke up – late as hell to the party…</p>
<p>I can’t wait for next year… Do you have any ideas? <img class="wlEmoticon wlEmoticon-smile" style="border-style: none" alt="Smile" src="http://blogs.microsoft.co.il/ysa/wp-content/uploads/sites/241/2014/04/wlEmoticon-smile.png" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.microsoft.co.il/ysa/2014/04/01/how-i-coded-my-costume/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Deploy &#038; Deliver</title>
		<link>http://blogs.microsoft.co.il/ysa/2013/11/28/deploy-deliver/</link>
		<comments>http://blogs.microsoft.co.il/ysa/2013/11/28/deploy-deliver/#respond</comments>
		<pubDate>Thu, 28 Nov 2013 12:25:42 +0000</pubDate>
		<dc:creator><![CDATA[ysa]]></dc:creator>
				<category><![CDATA[Continuous Delivery]]></category>
		<category><![CDATA[Continuous deployment]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[DEV]]></category>

		<guid isPermaLink="false">http://blogs.microsoft.co.il/ysa/?p=921034</guid>
		<description><![CDATA[Previously, we’ve discussed the Vision of Continuous Deployment. when starting out implementing Continuous Deployment, I’ve noticed that people confuse it with Continuous Delivery. Both concepts are used a lot, and have several ways to defining them: Jezz Hubmble, Martin Fowler , Crisp&#8217;s Blog I’ll try to redefine these from another point of view – the [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Previously, we’ve discussed <a href="http://blogs.microsoft.co.il/ysa/2013/11/11/vision/" target="_blank">the Vision of Continuous Deployment</a>. when starting out implementing Continuous Deployment, I’ve noticed that people confuse it with Continuous Delivery.</p>
<p>Both concepts are used a lot, and have several ways to defining them: <a href="http://continuousdelivery.com/2010/08/continuous-delivery-vs-continuous-deployment">Jezz Hubmble</a>, <a href="http://martinfowler.com/bliki/ContinuousDelivery.html">Martin Fowler</a> , <a href="http://blog.crisp.se/2013/02/05/yassalsundman/continuous-delivery-vs-continuous-deployment">Crisp&#8217;s Blog</a></p>
<p>I’ll try to redefine these from another point of view – the product’s point of view:</p>
<p><strong>Continuous Delivery:</strong> The ability to deliver features to production whenever we want</p>
<p><strong>Continuous Deployment: </strong>The ability to deploy our current without ANY manual intervention</p>
<p>The way I think about it is that Continuous Delivery defines the requirement and Continuous Deployment is an implementation. Deliver is a more abstract term</p>
<p>Another type of implementation for Continuous Delivery is <strong>Releasable Trunk </strong>– In this implementation our trunk/master branch is always in a state in which it is verified and valid for production deployment, but the deployment it self is triggered manually while someone is “over sighting” the deployment.</p>
<p>The decision to use one implementation or another is a product decision.</p>
<p>Remember that whatever you do, before you deploy, the version you want to deploy needs to be validated and verified (Site down == no money).</p>
<h3><span style="color: #4f81bd">Why should we have someone behind the wheel?</span></h3>
<p><strong>Manual processes are slow! </strong><strong>Manual processes are error prone!</strong></p>
<p>When someone asks you the annoying question – “Why do you need to automate?” &#8211;  recite this statements above.</p>
<p>Besides these, automation has positive side effects on our process:</p>
<h4><span style="color: #4f81bd">Improves the process</span></h4>
<p>Automation requires us to take a deep look into the process and its components which usually results in finding the weak spots. This in turn makes us fix and improve them.</p>
<h4><span style="color: #4f81bd">Improves code quality</span></h4>
<p>Automatic build of our code leads to less mistakes heading to everyone’s work space (you’ll kick someone for committing code which breaks compilation). Continuous Integration of our features leads us to fix integration errors sooner in the development process, forces us to change design and code (and sometimes spec) very early in the process. Continuous Deployment causes us to deal with backward compatibility in a granular level – feature level, instead of a version level. This in turn, makes us to create “safer” code (feature switches, silent deployments/gradual rollout).</p>
<h4><span style="color: #4f81bd">Improves testing quality</span></h4>
<p>Since  we don’t have a man in the middle, validation of a version is done using automated testing. When we start to automate the validations we need to do for each version, we are actually making sure they will happen in each version before deployment (repetitive testing). If we fix a bug and we usually don’t want it to happen again, we write a test for it, and that’s it. It won’t happen again. If one test runs wild – causes missed validation (aka flakiness) and the whole automated process stops because of that – you’ll have to improve the test if you want your feature in production.</p>
<h4><span style="color: #4f81bd">Sense of ownership</span></h4>
<p>We feel safe if the ownership of the deployment is in someone (usually else&#8217;s) hands. It create a sense of virtual safety – “he is responsible for what is going to happen with the version. If there’s a bug, he is responsible to find it.”. This is called the <a href="http://en.wikipedia.org/wiki/Bystander_effect" target="_blank">bystander effect</a>. As you can understand, this is not the culture you want. Collective ownership – everyone is responsible for production and the codebase. If we remove that someone that deploys the version, imagine how it will make the developers feel. We want to create a sense of – “no one is their – so I’ll need to be their” – this in turn makes the ownership of a version to become collective – among many people (or a blamefest…).</p>
<h4><strong><span style="color: #4f81bd">The need for speed</span></strong></h4>
<p>Imagine you had 200 testers, and 1000 test cases. How long would it take you to validate a version? What if you had 10 servers you need to remove from the Load Balancer, stop, copy-paste (at best) your new code, restart the site, add back to the LB? How long would it take you? What if you had 20?</p>
<p>A developer wants to automate because, well, we are a lazy bunch &#8211; “first time do it manually, second time write a script, third time write a framework”. We want to do our job – which is to code features. Everything else is waste. This is why we love Continuous Integration – it reduces the waste of integration. While Continuous Delivery = give us product power, Continuous Deployment = removing waste from the process.</p>
<p><strong>Continuous Deployment: from commit to production automatically. </strong>(In other words – all you need is to code).</p>
<p>In the next post, we’ll take a deeper dive into the building blocks that composes Continuous Deployment.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.microsoft.co.il/ysa/2013/11/28/deploy-deliver/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Vision</title>
		<link>http://blogs.microsoft.co.il/ysa/2013/11/11/continuous-deployment-vision/</link>
		<comments>http://blogs.microsoft.co.il/ysa/2013/11/11/continuous-deployment-vision/#respond</comments>
		<pubDate>Mon, 11 Nov 2013 01:23:27 +0000</pubDate>
		<dc:creator><![CDATA[ysa]]></dc:creator>
				<category><![CDATA[Continuous deployment]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[DEV]]></category>

		<guid isPermaLink="false">http://blogs.microsoft.co.il/ysa/?p=921012</guid>
		<description><![CDATA[I have a dream… In my dream each commit a developer does, is automatically tested and deployed to production without any manual intervention, without affecting the users of our app. Each commit is tested in the CI before it is deployed. Once the CI is green, the deployment starts automatically (including all the commits in [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I have a dream…</p>
<p>In my dream each commit a developer does, is automatically tested and deployed to production without any manual intervention, without affecting the users of our app.</p>
<p>Each commit is tested in the CI before it is deployed. Once the CI is green, the deployment starts automatically (including all the commits in that successful build). Version is deployed on a staging server on which smoke tests are performed to validate the version on real data, and only after they pass the version is deployed to production gradually.</p>
<p>This vision is called <strong>Continuous Deployment – </strong>every developer’s dream…</p>
<p>Why is this dream so appealing to so many in the software industry?</p>
<p><strong>Product wise – </strong>We want to expose features to our users as fast as we can and create an effective feedback loop, so our product will get better all the time, quickly.</p>
<p><strong>Development wise – </strong>I always like to say that developers are a lazy bunch (in a good way). We don’t like repeating the same thing again and again. Deployments are like that – a repeatable task – before you go you want to validate your version with a suite of tests (usually the same suite is used + the tests you just wrote for your feature) and deploy it (without breaking our product). So we will automate the tests – both intrusive tests (ones that create data) that will run on our CI and smoke tests to validate that the changes did not break the product in production, and automate the deployment process. We only want to be involved if there is a problem in one of these.</p>
<p>In the next couple of weeks I’ll explain the road we are taking in order to bring us closer to this dream.</p>
<p>The <a href="http://blogs.microsoft.co.il/ysa/2013/11/28/deploy-deliver/">next post</a> will discuss the differences between continuous deployment and continuous delivery.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.microsoft.co.il/ysa/2013/11/11/continuous-deployment-vision/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inspecting request from an IIS server</title>
		<link>http://blogs.microsoft.co.il/ysa/2011/10/27/inspecting-request-from-an-iis-server/</link>
		<comments>http://blogs.microsoft.co.il/ysa/2011/10/27/inspecting-request-from-an-iis-server/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 09:13:18 +0000</pubDate>
		<dc:creator><![CDATA[ysa]]></dc:creator>
				<category><![CDATA[Debug]]></category>
		<category><![CDATA[DEV]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blogs.microsoft.co.il/?p=921008</guid>
		<description><![CDATA[Let’s say we have a web application which makes calls to other services via http. We want to inspect the calls for bug hunting. If the calls where made from the browser on the client side then it is simple – use fiddler in order to inspect and analyze the calls. If you try to [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Let’s say we have a web application which makes calls to other services via http. We want to inspect the calls for bug hunting.</p>
<p>If the calls where made from the browser on the client side then it is simple – use <a href="http://www.fiddler2.com" target="_blank">fiddler</a> in order to inspect and analyze the calls.</p>
<p>If you try to do the same with calls made from IIS, you will see nothing by default. Why?</p>
<p><a href="http://www.fiddler2.com/" target="_blank">Fiddler</a> is a proxy server for your calls. When you open it it creates a simple listener on 127.0.0.1:8888 and listens for calls. It also registers it self in the registry under HKCU so all calls from processes of the current user are first redirected to fiddler’s address.</p>
<p>You see where I getting at?</p>
<p>IIS runs under a different user and as windows service, so the calls are not redirected to fiddler.</p>
<p>The most simple solution for this problem is to configure your app to use a proxy for it’s calls in the web.config file:</p>
<div id="codeSnippetWrapper">
<div id="codeSnippet" style="text-align: left;line-height: 12pt;background-color: #f4f4f4;width: 100%;font-family: 'Courier New', courier, monospace;direction: ltr;color: black;font-size: 8pt;overflow: visible;border-style: none;padding: 0px">
<pre style="text-align: left;line-height: 12pt;background-color: white;margin: 0em;width: 100%;font-family: 'Courier New', courier, monospace;direction: ltr;color: black;font-size: 8pt;overflow: visible;border-style: none;padding: 0px"><span id="lnum1" style="color: #606060">   1:</span> <span style="color: #0000ff">&lt;</span><span style="color: #800000">system.net</span><span style="color: #0000ff">&gt;</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left;line-height: 12pt;background-color: #f4f4f4;margin: 0em;width: 100%;font-family: 'Courier New', courier, monospace;direction: ltr;color: black;font-size: 8pt;overflow: visible;border-style: none;padding: 0px"><span id="lnum2" style="color: #606060">   2:</span>       <span style="color: #0000ff">&lt;</span><span style="color: #800000">defaultProxy</span><span style="color: #0000ff">&gt;</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left;line-height: 12pt;background-color: white;margin: 0em;width: 100%;font-family: 'Courier New', courier, monospace;direction: ltr;color: black;font-size: 8pt;overflow: visible;border-style: none;padding: 0px"><span id="lnum3" style="color: #606060">   3:</span>              <span style="color: #0000ff">&lt;</span><span style="color: #800000">proxy</span> <span style="color: #ff0000">usesystemdefault</span><span style="color: #0000ff">="False"</span> <span style="color: #ff0000">proxyaddress</span><span style="color: #0000ff">="http://127.0.0.1:8888"</span> <span style="color: #0000ff">/&gt;</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left;line-height: 12pt;background-color: #f4f4f4;margin: 0em;width: 100%;font-family: 'Courier New', courier, monospace;direction: ltr;color: black;font-size: 8pt;overflow: visible;border-style: none;padding: 0px"><span id="lnum4" style="color: #606060">   4:</span>       <span style="color: #0000ff">&lt;/</span><span style="color: #800000">defaultProxy</span><span style="color: #0000ff">&gt;</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left;line-height: 12pt;background-color: white;margin: 0em;width: 100%;font-family: 'Courier New', courier, monospace;direction: ltr;color: black;font-size: 8pt;overflow: visible;border-style: none;padding: 0px"><span id="lnum5" style="color: #606060">   5:</span> <span style="color: #0000ff">&lt;/</span><span style="color: #800000">system.net</span><span style="color: #0000ff">&gt;</span></pre>
<p><!--CRLF--></p>
</div>
</div>
<p>This configuration make all the external calls IIS makes to <a href="http://www.fiddler2.com/" target="_blank">fiddler</a>. Just make sure that fiddler is running when this configuration is set – if not your site will not work…</p>
<p>You can read more about it <a href="http://www.fiddler2.com/Fiddler/help/hookup.asp#Q-IIS" target="_blank">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.microsoft.co.il/ysa/2011/10/27/inspecting-request-from-an-iis-server/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>My new ideal workplace</title>
		<link>http://blogs.microsoft.co.il/ysa/2011/09/18/my-new-ideal-workplace/</link>
		<comments>http://blogs.microsoft.co.il/ysa/2011/09/18/my-new-ideal-workplace/#respond</comments>
		<pubDate>Sun, 18 Sep 2011 22:54:12 +0000</pubDate>
		<dc:creator><![CDATA[ysa]]></dc:creator>
				<category><![CDATA[OFFTOPIC]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blogs.microsoft.co.il/?p=902587</guid>
		<description><![CDATA[In my last post (which was way too long ago), I&#8217;ve wrote what is my ideal workplace. After a while I found it! After a series of interviews I was hired by Sears Israel as a software developer for Sears Social. Sears Social is a new social experience which creates a new shopping experience using [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>In <a href="http://blogs.microsoft.co.il/blogs/ysa/archive/2011/06/10/moving-on.aspx" target="_blank">my last post</a> (which was way too long ago), I&#8217;ve wrote what is my ideal workplace. After a while I found it!</p>
<p>After a series of interviews I was hired by <a href="http://www.sears.co.il" target="_blank">Sears Israel</a> as a software developer for <a href="http://social.sears.com/" target="_blank">Sears Social</a>.</p>
<p><a href="http://social.sears.com/" target="_blank">Sears Social</a> is a new social experience which creates a new shopping experience using your social connections.</p>
<p>After only a couple of months, I have to tell you – I made the right choice. This place is amazing! Great professional people, Agile practices and great atmosphere. </p>
<p>It was pretty amazing for me to see first hand how to practice continues deployment, informative DSM with 25 participants which takes less then 10 minutes and a great bunch of people which makes you smile when you go to the office in the morning and even a bigger smile when you leave in the evening.</p>
<p>So stay tuned…</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.microsoft.co.il/ysa/2011/09/18/my-new-ideal-workplace/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Moving on…</title>
		<link>http://blogs.microsoft.co.il/ysa/2011/06/10/moving-on/</link>
		<comments>http://blogs.microsoft.co.il/ysa/2011/06/10/moving-on/#comments</comments>
		<pubDate>Fri, 10 Jun 2011 15:16:57 +0000</pubDate>
		<dc:creator><![CDATA[ysa]]></dc:creator>
				<category><![CDATA[DEV]]></category>
		<category><![CDATA[OFFTOPIC]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blogs.microsoft.co.il/?p=842003</guid>
		<description><![CDATA[In a month I will be leaving my current position in my company. After six and so years it is time to move on. In the last couple of months I&#8217;ve been thinking about where I would like to work – what is the ideal workplace for me? Experienced and talented people from whom I [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>In a month I will be leaving my current position in my company. After six and so years it is time to move on.</p>
<p>In the last couple of months I&#8217;ve been thinking about where I would like to work – what is the ideal workplace for me?</p>
<ul>
<li>Experienced and talented people from whom I can learn </li>
<li>An interesting an compelling product – I think it is very important to believe I what you do.</li>
<li>Agile environment, a team and management which believes in the agile process </li>
<li>A place where I can have fun doing what I love – writing lots of code </li>
</ul>
<p>If you are looking for a developer who loves the job and wants to write great code, and you are in Israel , you can <a href="http://blogs.microsoft.co.il/blogs/ysa/contact.aspx" target="_blank">contact me</a> and I will send you my CV.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.microsoft.co.il/ysa/2011/06/10/moving-on/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Transaction trouble with Cache</title>
		<link>http://blogs.microsoft.co.il/ysa/2011/06/10/transaction-trouble-with-cache/</link>
		<comments>http://blogs.microsoft.co.il/ysa/2011/06/10/transaction-trouble-with-cache/#respond</comments>
		<pubDate>Fri, 10 Jun 2011 10:39:07 +0000</pubDate>
		<dc:creator><![CDATA[ysa]]></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Debug]]></category>
		<category><![CDATA[DEV]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Tips and Tricks]]></category>

		<guid isPermaLink="false">http://blogs.microsoft.co.il/?p=841971</guid>
		<description><![CDATA[Consider the following problem: We have a web app which can send messages between the users that are connected to it. A user can send a message to any number of users. The implementation is simple: When a user sends a message: The message is saved in the database Cache value is inserted for each [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Consider the following problem:</p>
<p>We have a web app which can send messages between the users that are connected to it. A user can send a message to any number of users.</p>
<p>The implementation is simple:</p>
<ul>
<li>When a user sends a message:
<ul>
<li>The message is saved in the database </li>
<li>Cache value is inserted for each recipient. The saved value is a time stamp which indicates when the user last received a message.</li>
</ul>
</li>
<li>Users that are suppose to see the message: </li>
<ul>
<li>The client is polling the server and asks if the server has new messages. It does that with an initial time which is loaded when the page is loaded and saved in JavaScript. </li>
<li>If there is something new the client asks the server for the new messages (according to saved time) and the server returns the messages from the database and the last received time from the cache.</li>
<li>Client time stamp is updated with the received time and continues polling</li>
</ul>
</ul>
<p>Pretty simple…</p>
<p>Unfortunately the implementation has a critical bug which causes clients to lose messages. </p>
<p>Consider this code:</p>
<div id="codeSnippetWrapper">
<div id="codeSnippet">
<pre><span style="color: #0000ff">using</span> (var t = OpenTransaction())</pre>
<p><!--CRLF--></p>
<pre>{</pre>
<p><!--CRLF--></p>
<pre>    SaveMessageToDb(message);</pre>
<p><!--CRLF--></p>
<pre>    </pre>
<p><!--CRLF--></p>
<pre>    <span style="color: #0000ff">foreach</span>(var user <span style="color: #0000ff">in</span> message.Recipients)</pre>
<p><!--CRLF--></p>
<pre>    {</pre>
<p><!--CRLF--></p>
<pre>        Cache[user.Code] = message.SendDate;</pre>
<p><!--CRLF--></p>
<pre>    }</pre>
<p><!--CRLF--></p>
<pre>    </pre>
<p><!--CRLF--></p>
<pre>    t.Commit();</pre>
<p><!--CRLF--></p>
<pre>}</pre>
<p><!--CRLF--></div>
</div>
<p>Can you spot the bug?</p>
<p>Let say we have 1000 users that will receive the message. After saving the message to the db the code updates the cache for each client. Each client polls the server at a constant interval. Let say that user AAA polls the server – his cache key is updated but the loop that updates the cache is not yet over. The user send a request to get the new messages but because the transaction wasn&#8217;t committed so the new messages will not be returned from a query – the loop that updates the cache is still going. The client then updates the last received time – and so the user will never get the message.</p>
<p>I must say that this was a very frustrating bug…</p>
<p>The solution was composed with changes in both the client and the server:</p>
<p><strong>Client:</strong></p>
<p>We changed the client script so that if the server claims that there are new messages but the clients receives an empty list of messages then the received time is not updated and another request is sent to the server until new messages are received.</p>
<p><strong>Server:</strong></p>
<p>What we need to do here is to make the cache join the transaction. In this case we couldn&#8217;t because the transaction was a local oracle transaction – not a distributed transaction. If it was we could use System.Transactions to implement a transactional cache.</p>
<p>In this case we used an event which is triggered when the transaction is commited (in TransactionScope there is the AfterCommit event, in our case we had to implement this ourselves). It looks something like this:</p>
<div id="codeSnippetWrapper">
<div id="codeSnippet">
<pre><span style="color: #0000ff">using</span> (var t = OpenTransaction())</pre>
<p><!--CRLF--></p>
<pre>{</pre>
<p><!--CRLF--></p>
<pre>    SaveMessageToDb(message);</pre>
<p><!--CRLF--></p>
<pre>    </pre>
<p><!--CRLF--></p>
<pre>    t.AfterCommit = (sender,e) =&gt; </pre>
<p><!--CRLF--></p>
<pre>                    {</pre>
<p><!--CRLF--></p>
<pre>                        <span style="color: #0000ff">foreach</span>(var user <span style="color: #0000ff">in</span> message.Recipients)</pre>
<p><!--CRLF--></p>
<pre>                        {</pre>
<p><!--CRLF--></p>
<pre>                            Cache[user.Code] = message.SendDate;</pre>
<p><!--CRLF--></p>
<pre>                        }</pre>
<p><!--CRLF--></p>
<pre>                    }</pre>
<p><!--CRLF--></p>
<pre>    </pre>
<p><!--CRLF--></p>
<pre>    t.Commit();</pre>
<p><!--CRLF--></p>
<pre>}</pre>
<p><!--CRLF--></div>
</div>
<p>Way not simply update the cache outside the transaction?</p>
<p>Because we don&#8217;t actually know when the transaction is committed. Maybe another method calls this method with a transaction of her own and the commit is actually done there (the OpenTransaction method actually returns a current transaction if one exists already).</p>
<p><strong>Important:</strong></p>
<p>Our solution was infect a little more complex because we wanted other modules that are in the transaction to be able to get the updated value from the cache even if the transaction wasn&#8217;t committed yet:</p>
<div id="codeSnippetWrapper">
<div id="codeSnippet">
<pre><span style="color: #0000ff">using</span> (var t = OpenTransaction())</pre>
<p><!--CRLF--></p>
<pre>{</pre>
<p><!--CRLF--></p>
<pre>    SaveMessageToDb(message);</pre>
<p><!--CRLF--></p>
<pre>    </pre>
<p><!--CRLF--></p>
<pre>    t.AfterCommit = (sender,e) =&gt; </pre>
<p><!--CRLF--></p>
<pre>                    {</pre>
<p><!--CRLF--></p>
<pre>                        <span style="color: #0000ff">foreach</span>(var user <span style="color: #0000ff">in</span> message.Recipients)</pre>
<p><!--CRLF--></p>
<pre>                        {</pre>
<p><!--CRLF--></p>
<pre>                            Cache[user.Code] = message.SendDate;</pre>
<p><!--CRLF--></p>
<pre>                        }</pre>
<p><!--CRLF--></p>
<pre>                    }</pre>
<p><!--CRLF--></p>
<pre>                    </pre>
<p><!--CRLF--></p>
<pre>    DoSomthingThatUsesCache();</pre>
<p><!--CRLF--></p>
<pre>    </pre>
<p><!--CRLF--></p>
<pre>    t.Commit();</pre>
<p><!--CRLF--></p>
<pre>}</pre>
<p><!--CRLF--></div>
</div>
<p>So we created a class which wraps the cache, and contains a local dictionary which contains updated values, and access them when needed. If a value is updated in a transaction then wrapper registered to the event and updates the real cache when the transaction is committed. We called the class TransactiveCache:</p>
<div id="codeSnippetWrapper">
<div id="codeSnippet">
<pre><span style="color: #0000ff">using</span> (var t = OpenTransaction())</pre>
<p><!--CRLF--></p>
<pre>{</pre>
<p><!--CRLF--></p>
<pre>    SaveMessageToDb(message);</pre>
<p><!--CRLF--></p>
<pre>    </pre>
<p><!--CRLF--></p>
<pre>    <span style="color: #0000ff">foreach</span>(var user <span style="color: #0000ff">in</span> message.Recipients)</pre>
<p><!--CRLF--></p>
<pre>    {</pre>
<p><!--CRLF--></p>
<pre>        TransactiveCache[user.Code] = message.SendDate;</pre>
<p><!--CRLF--></p>
<pre>    }    </pre>
<p><!--CRLF--></p>
<pre>                    </pre>
<p><!--CRLF--></p>
<pre>    DoSomthingThatUsesCache();</pre>
<p><!--CRLF--></p>
<pre>    </pre>
<p><!--CRLF--></p>
<pre>    t.Commit();</pre>
<p><!--CRLF--></p>
<pre>}</pre>
<p><!--CRLF--></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blogs.microsoft.co.il/ysa/2011/06/10/transaction-trouble-with-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
