<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.microsoft.co.il/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Nightmare on ALM Street</title><link>http://blogs.microsoft.co.il/blogs/assafstone/</link><description>Best practices and experiences while implementing ALM solutions, especially with TFS 2010</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>TFS 2010 Training Kit is Out!</title><link>http://blogs.microsoft.co.il/blogs/assafstone/archive/2011/08/29/tfs-2010-training-kit-is-out.aspx</link><pubDate>Mon, 29 Aug 2011 19:35:26 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:890329</guid><dc:creator>Assaf Stone</dc:creator><slash:comments>0</slash:comments><description>&lt;p align="justify"&gt;After an intense three months of work, the training kit that my colleague &lt;a href="http://blogs.microsoft.co.il/blogs/yuvmaz/" target="_blank"&gt;Yuval Mazor&lt;/a&gt;, and I developed for Microsoft has finally been published! You can download it at &lt;a href="http://www.microsoft.com/download/en/details.aspx?id=27152"&gt;http://www.microsoft.com/download/en/details.aspx?id=27152&lt;/a&gt;. The training kit is designed to take novices to level 200 knowledge, i.e. to enable users, developers and administrators to competently use the most important features and understand how the various parts work with each other.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/assafstone/image_4DA866C3.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" align="right" src="http://blogs.microsoft.co.il/blogs/assafstone/image_thumb_51660B93.png" width="223" height="303" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3 align="justify"&gt;What Does it Cover?&lt;/h3&gt;  &lt;p align="justify"&gt;The training kit contains presentations about the following topics:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Introduction&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Architecture&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Project and document management&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Using and querying against work items&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Running reports&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Accessing TFS from the web&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Source control&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Security&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Using the power tools&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Additionally there are demos and hands on labs covering the subjects of project creation, security, requirement management, running reports and queries, using the source control, and bulk editing of work items with Excel and MS Project.&lt;/p&gt;  &lt;p align="justify"&gt;Be sure to try it out! There are some gems hidden in there, including some things that I learned only when I researched the subjects for our writing.&lt;/p&gt;  &lt;p align="justify"&gt;See you at Build!&lt;/p&gt;  &lt;p align="justify"&gt;Assaf&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=890329" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/ALM/default.aspx">ALM</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/version+control/default.aspx">version control</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Project+Collection/default.aspx">Project Collection</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Team+Project/default.aspx">Team Project</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Agile/default.aspx">Agile</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Agile+MSF/default.aspx">Agile MSF</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Team+Foundation+Server/default.aspx">Team Foundation Server</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Training+Kit/default.aspx">Training Kit</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Training/default.aspx">Training</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/2010/default.aspx">2010</category></item><item><title>A Step Towards Distributed Version Control in the Upcoming TFS 11!</title><link>http://blogs.microsoft.co.il/blogs/assafstone/archive/2011/08/11/a-step-towards-distributed-version-control-in-the-upcoming-tfs-11.aspx</link><pubDate>Thu, 11 Aug 2011 17:40:10 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:882950</guid><dc:creator>Assaf Stone</dc:creator><slash:comments>0</slash:comments><description>&lt;p align="justify"&gt;As previously hinted by Microsoft’s Brian Harry, in a &lt;a href="http://blogs.msdn.com/b/bharry/archive/2009/04/08/team-system-2010-overview.aspx?PageIndex=2#comments" target="_blank"&gt;comment&lt;/a&gt; on his blog distributed version control (or DVCS) is on the TFS team’s backlog. Now, with last week’s &lt;a href="http://blogs.msdn.com/b/bharry/archive/2011/08/02/version-control-model-enhancements-in-tfs-11.aspx" target="_blank"&gt;announcement&lt;/a&gt;, the upcoming version of TFS will take a step towards distributed VCS. This change comes in the form of a new concept: &lt;strong&gt;Local Workspaces&lt;/strong&gt;. What this means, in simple words, is that rather than having to make all your changes in a TFS approved environment (Visual Studio, Team Explorer, Source Control Explorer, etc.), you will be able to make all your changes (i.e. rename, move, delete and edit files) locally, and TFS will figure out what needs to be checked in, when you choose to do so!&lt;/p&gt;  &lt;p align="justify"&gt;That’s right folks! No more scenarios where you fail to check out one item, and then get hit on the head when you want to check in one or two days worth of changes (some environments will easily allow you to change files regardless of them being marked as &lt;em&gt;read only&lt;/em&gt;). &lt;/p&gt;  &lt;p align="justify"&gt;How is that possible? Well, TFS is moving from a &lt;strong&gt;Checkout –&amp;gt; Edit –&amp;gt; Checkin&lt;/strong&gt; model to the &lt;strong&gt;Edit –&amp;gt; Merge –&amp;gt; Commit&lt;/strong&gt; model that is prevalent among many modern version control systems (like subversion, for example). Of course, the old way of doing things will still be available, but the new way will be the default.&lt;/p&gt;  &lt;p align="justify"&gt;In Brian Harry’s blog post, he states that with regards to the question “but did you implement DVCS?” the answer is still “&lt;strong&gt;No,&lt;/strong&gt; not yet. You still can’t &lt;strong&gt;checkin &lt;/strong&gt;while you are &lt;strong&gt;offline&lt;/strong&gt;” (Emphasis mine). &lt;strong&gt;&lt;em&gt;However&lt;/em&gt;&lt;/strong&gt;, I believe that this will now be &lt;strong&gt;easily solved &lt;/strong&gt;with a new and improved as soon as a &lt;strong&gt;&lt;a href="https://github.com/spraints/git-tfs" target="_blank"&gt;Git-to-TFS Bridge&lt;/a&gt;&lt;/strong&gt; (or mercurial, my personal favorite) will be developed!&lt;/p&gt;  &lt;p align="justify"&gt;The main problem with the various &lt;em&gt;vcs&lt;/em&gt;-to-TFS bridges, is the fact that the changes must be applied to the workspace, and require us to checkout the items – an act that defeats the main purpose of a DVCS: Working in a manner that is disconnected, neither affecting nor being affected by other developers efforts, or the status of the server. Of course, once we no longer need to checkout files, the obstacle is removed, and we can easily work with our DVCS of choice locally and extend them (at least the open source ones) to add a command to publish to TFS. &lt;strong&gt;I promise to develop one as soon as I get my hands on a CTP of TFS 11&lt;/strong&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Finally, I want you all to join me and lets give a warm hand to TFS 11, welcoming Microsoft to the 21st century! Hurray!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=882950" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/ALM/default.aspx">ALM</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/version+control/default.aspx">version control</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Mercurial/default.aspx">Mercurial</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Git/default.aspx">Git</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/DVCS/default.aspx">DVCS</category></item><item><title>How to Write a Robust TFS Server Plugin, with Job Extensions</title><link>http://blogs.microsoft.co.il/blogs/assafstone/archive/2011/07/29/how-to-write-a-robust-tfs-server-plugin-with-job-extensions.aspx</link><pubDate>Fri, 29 Jul 2011 16:42:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:877605</guid><dc:creator>Assaf Stone</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;A client of mine came to me with the following problem: She has several server plugins that manipulate work items, one which I wrote, and another that was downloaded from &lt;a href="http://www.codeplex.com" target="_blank"&gt;codeplex&lt;/a&gt;. When applied to one work item, e.g. via the Team Explorer, everything works fine. However, when applying to a bulk of work items (via Excel publishing, for example), the process freezes for several minutes, until it completes and is only then freed.&lt;/p&gt;  &lt;p&gt;I came up with the following solution: A &lt;strong&gt;server plugin&lt;/strong&gt; that queues a job for the &lt;strong&gt;TFS Job Agent&lt;/strong&gt;, and a &lt;strong&gt;Job Extension&lt;/strong&gt; to handle the work, at its leisure.&lt;/p&gt;  &lt;h2&gt;The Server Plugin&lt;/h2&gt;  &lt;p&gt;A server plugin runs before and/or after an event, depending on the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.framework.server.notificationtype.aspx" target="_blank"&gt;Notification Type&lt;/a&gt; you choose to use. It does so synchronously, so it doesn’t free the resource or the process until it completes. Therefore, like any other event you write, you will want to free it as soon as possible, and hand off any long-running work to a separate thread or process. &lt;/p&gt;  &lt;p&gt;The template for writing a server plugin is rather&amp;#160; simple and straight forward. This is the template I use. &lt;/p&gt;  &lt;p&gt;First you have to add some references, and “using” statements. Most blog posts I read don’t mention them, which is a bit of a pain, in my opinion, so I’ll add them here:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/assafstone/image_1BF8D6C6.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/assafstone/image_thumb_4F549A22.png" width="512" height="87" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:861c40ff-bdde-4cb9-ae2a-a0071a7e0f20" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.IO;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Xml;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Microsoft.TeamFoundation.Common;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Microsoft.TeamFoundation.Framework.Server;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Microsoft.TeamFoundation.WorkItemTracking.Server;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Next, we need to take care of a few properties. This is simple enough, and rather standard:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:901043c8-15d4-4dfb-aaa2-abb0cded7d81" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:500px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; ServerPlugins&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SampleWorkItemChangedServerPlugin&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;ISubscriber&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;#region&lt;/span&gt; Implementation of ISubscriber&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt;[] SubscribedTypes()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;[]{&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;WorkItemChangedEvent&lt;/span&gt;)}; &lt;span style="color:#008000;"&gt;// For Example&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Name&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;Sample WI Server Plugin&amp;quot;&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SubscriberPriority&lt;/span&gt; Priority&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SubscriberPriority&lt;/span&gt;.Low; }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Finally, we’ve got the Process Event callback method – this is where we handle the event. We start by making sure that we’re handling the right event. That’s right: Every &lt;strong&gt;ISubscriber&lt;/strong&gt; class gets called for every event. You want to make sure as soon as possible that you’re dealing with the right type of event:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:107d06df-f3ff-4782-8d23-944ae3f96fea" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventNotificationStatus&lt;/span&gt; ProcessEvent(&lt;span style="color:#2b91af;"&gt;TeamFoundationRequestContext&lt;/span&gt; requestContext, &lt;span style="color:#2b91af;"&gt;NotificationType&lt;/span&gt; notificationType, &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; notificationEventArgs, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; statusCode, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; statusMessage, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ExceptionPropertyCollection&lt;/span&gt; properties)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;    statusCode = 0;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    properties = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;    statusMessage = &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Empty;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#008000;"&gt;// Check whether the notification is what we are waiting for&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (notificationType != &lt;span style="color:#2b91af;"&gt;NotificationType&lt;/span&gt;.DecisionPoint)&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventNotificationStatus&lt;/span&gt;.ActionPermitted;&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; notification = notificationEventArgs &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;WorkItemChangedEvent&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (notification == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventNotificationStatus&lt;/span&gt;.ActionPermitted;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Note that since we’re queuing a job to be handled asynchronously our notification type will &lt;em&gt;always&lt;/em&gt; be a &lt;strong&gt;Notification&lt;/strong&gt;, rather than a &lt;strong&gt;DecisionPoint&lt;/strong&gt;. It doesn’t make much sense to queue something that must happen before the original event occurs. You &lt;em&gt;do&lt;/em&gt; see that, right?&lt;/p&gt;  &lt;p&gt;I prefer to make multiple return points in my code to reduce cyclamatic complexity, rather than nesting if statements. It is purely a matter of style, but I find code easier to read if you can separate control from logic.&lt;/p&gt;  &lt;p&gt;Next comes the interesting part. This is where you would normally place your logic. However, in order to be able to return the control as soon as possible, you will instead queue a job to handle your logic, as follows:&lt;/p&gt;  &lt;p&gt;   &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c620e461-5cc0-4992-914c-20f0f078092f" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#008000;"&gt;// Prepare the data we need for handling the notification in a job&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; workItemId = notification.CoreFields.IntegerFields[0].NewValue;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; reader = &lt;span style="color:#2b91af;"&gt;XmlReader&lt;/span&gt;.Create(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;StringReader&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;lt;WorkItem&amp;gt;&amp;quot;&lt;/span&gt; + workItemId.ToString() + &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;lt;/WorkItem&amp;gt;&amp;quot;&lt;/span&gt;));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; xmlData = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;XmlDocument&lt;/span&gt;().ReadNode(reader);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#008000;"&gt;// Handle the notification by queueing the information we need for a job&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; jobService = requestContext.GetService&amp;lt;&lt;span style="color:#2b91af;"&gt;TeamFoundationJobService&lt;/span&gt;&amp;gt;();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    jobService.QueueOneTimeJob(requestContext, &lt;span style="color:#a31515;"&gt;&amp;quot;Sample TFS Job&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;JobExtentions.SampleWorkItemJob&amp;quot;&lt;/span&gt;, xmlData,&lt;/li&gt; &lt;li&gt;                               &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/p&gt;  &lt;p&gt;In this code block we do two things: First, in lines 4-6, we prepare the data we want to pass to the job. The &lt;a href="http://msdn.microsoft.com/en-us/library/ff736811.aspx" target="_blank"&gt;QueueOneTimeJob&lt;/a&gt; method accepts an XmlNode of data that can be passed on to the job. For my example, as I am listening to the WorkItemChangedEvent, I will pass the Work Item ID, in an XmlElement. In lines 9-11, we queue a job. &lt;/p&gt;  &lt;p&gt;Two things need to be mentioned. First is that since we are going to queue each job with &lt;em&gt;different&lt;/em&gt; data, we use the QueueOneTimeJob. It is used when we don’t have a known job that we wish to activate (that would require knowing its GUID), therefore each call creates a new job, and two successive calls won’t merge accidentally, causing one job to get lost. Once again, this is an implementation issue that needs to be circumvented – and luckily can be done so easily.&lt;/p&gt;  &lt;p&gt;The other thing, is that you need to pass it the &lt;strong&gt;domain name&lt;/strong&gt; and&lt;strong&gt;&amp;#160; class&lt;/strong&gt; of the job extension (see line 10). This tells the TFS Job Agent which extension to activate for each job. Unfortunately, it is passed as text, and therefore runs the risk of causing a runtime error.Double check your plugin name. Don’t say I didn’t warn you!&lt;/p&gt;  &lt;p&gt;Another important thing to note, is that you &lt;strong&gt;must&lt;/strong&gt; &lt;strong&gt;not&lt;/strong&gt; throw an exception. If you do, your plugin will get disabled, and will not get restarted until you restart TFS. make sure you catch and swallow every exception your code raises. Log it, and check it, but don’t allow it to escape.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:20feb238-c1e7-43f2-9b6e-40177613ef86" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;Exception&lt;/span&gt; exception)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#2b91af;"&gt;TeamFoundationApplication&lt;/span&gt;.LogException(&lt;span style="color:#a31515;"&gt;&amp;quot;Sample Server Plugin failed while processing&amp;quot;&lt;/span&gt;, exception);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Finally, return a result. Given you won’t be handling the event here, you will always return the same status result:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4bc1adb7-9ecc-4703-a067-952a541039d1" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventNotificationStatus&lt;/span&gt;.ActionPermitted;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;h2&gt;The Job Extension&lt;/h2&gt;  &lt;p&gt;Next comes the job extension. Similarly, there’s an interface to implement. Remember to make sure that the namespace and class match the one used in the server plugin when queuing the job:&lt;/p&gt;  &lt;p&gt;As above, here are the references and “using” statements you’ll need:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/assafstone/image_05761272.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/assafstone/image_thumb_3D485695.png" width="415" height="93" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e203229e-202a-4dbc-aa59-7ea8ccf1ab8f" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Linq;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Xml.Linq;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Microsoft.TeamFoundation.Client;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Microsoft.TeamFoundation.Framework.Server;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Microsoft.TeamFoundation.WorkItemTracking.Client;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;   &lt;p&gt;Note that the Client namespaces are used because of my specific example. Yours might vary. Of course, the Linq to XML namespaces are also a matter of personal choice. If you decide to parse your XML differently, you’ll use another library. You &lt;em&gt;really&lt;/em&gt; didn’t need me to tell you that, right?&lt;/p&gt;  &lt;p&gt;So now you should define your class (did I mention that you should make sure you got the FQDN right?):&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:cba8f58f-cc78-4790-9b82-289bd855277b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; JobExtensions&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SampleWorkItemJob&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;ITeamFoundationJobExtension&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; _jobLock = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;();&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Wait a minute! What’s that lock about in line #5? I&amp;#39;ll get to it later. &lt;/p&gt;  &lt;p&gt;Anyway, the &lt;a href="http://msdn.microsoft.com/en-us/library/gg245665.aspx" target="_blank"&gt;ITeamFoundationJobExtension&lt;/a&gt; has one method to implement, conveniently named &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.framework.server.iteamfoundationjobextension.run.aspx" target="_blank"&gt;Run&lt;/a&gt;:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:68e6f944-0fb8-42ff-8c9d-14a326635cb1" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TeamFoundationJobExecutionResult&lt;/span&gt; Run(&lt;span style="color:#2b91af;"&gt;TeamFoundationRequestContext&lt;/span&gt; requestContext, &lt;span style="color:#2b91af;"&gt;TeamFoundationJobDefinition&lt;/span&gt; jobDefinition, &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt; queueTime, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; resultMessage)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;    resultMessage = &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Empty;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Once again, we have an out parameter so we set it up. We will change it if there’s some information we wish to log (such as an exception).&lt;/p&gt;  &lt;p&gt;Next we write the logic to handle the job.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:da14a7e5-78b7-480d-b413-9e22fccf0902" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;lock&lt;/span&gt; (_jobLock)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; jobDataXmlNode = jobDefinition.Data;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#008000;"&gt;// Expects node like &amp;lt;WorkItem&amp;gt;31&amp;lt;/WorkItem&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; workItemIdString = (&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; wi &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;XDocument&lt;/span&gt;.Parse(jobDataXmlNode.OuterXml).Elements()&lt;/li&gt; &lt;li&gt;                                &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; wi.Value).First();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; workItemId = &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;.Parse(workItemIdString);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#008000;"&gt;// In this example we want to work on the work item whose ID we added to the job, so let&amp;#39;s get it&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; tpc = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TfsTeamProjectCollection&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Uri&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;http://localhost:8080/tfs/defaultcollectiton&amp;quot;&lt;/span&gt;));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; store = tpc.GetService&amp;lt;&lt;span style="color:#2b91af;"&gt;WorkItemStore&lt;/span&gt;&amp;gt;();&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; workItem = store.GetWorkItem(workItemId);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#008000;"&gt;// Do something with the work item&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Like with the server plugin, if we let an exception slip through the cracks, so we have to surround our handler with a try..catch clause here as well. As for the lock, in order to avoid collisions such as from trying to write to the work item store 50 times at once from 50 different job extensions, you’ll need to protect your resources. Job extensions will run at the same time, each in its own thread. They will all however run in the same process, the &lt;strong&gt;TFS Job Agent&lt;/strong&gt;, of which you have only one on each &lt;strong&gt;Application Tier&lt;/strong&gt;. Therefore a static lock object will do the job nicely.&lt;/p&gt;  &lt;p&gt;the rest of the code in the block is of little interest; I use Linq to parse my XML node and deserialize the work item ID, which I need for my example. Your mileage may vary.&lt;/p&gt;  &lt;p&gt;Not much more to it – You have your exception handling:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:fb6e4ae1-60d7-47a6-a0ea-0bdd3cf9ddbb" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;RequestCanceledException&lt;/span&gt;)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TeamFoundationJobExecutionResult&lt;/span&gt;.Stopped;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;Exception&lt;/span&gt; exception)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;    resultMessage = exception.ToString();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TeamFoundationJobExecutionResult&lt;/span&gt;.Failed;&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;What you want to do is to return a status of failure (or stopped if the request got cancelled). Additionally, you can return the exception details in the &lt;strong&gt;result message&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;Finally, if everything went well, you’ll return a success status:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e721449e-fda6-4d28-a3f6-792d0db3326f" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TeamFoundationJobExecutionResult&lt;/span&gt;.Succeeded;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;That’s all there is to it!&lt;/p&gt;  &lt;p&gt;You can download the complete solution here: &lt;a href="https://skydrive.live.com/?cid=13389367fec74dc1&amp;amp;sc=documents&amp;amp;uc=1&amp;amp;id=13389367FEC74DC1%21228#" target="_blank"&gt;RobustServerPlugin.zip&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=877605" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/ALM/default.aspx">ALM</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Server+Plugin/default.aspx">Server Plugin</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Job/default.aspx">Job</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Extension/default.aspx">Extension</category></item><item><title>Building Software with TFS, from Start to Finish</title><link>http://blogs.microsoft.co.il/blogs/assafstone/archive/2011/06/28/building-software-with-tfs-from-start-to-finish.aspx</link><pubDate>Tue, 28 Jun 2011 20:41:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:846960</guid><dc:creator>Assaf Stone</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shmuliksegal/" target="_blank"&gt;Shmulik Segal&lt;/a&gt;, the head of the ALM team at Sela delivered a presentation on building software with &lt;strong&gt;TFS 2010&lt;/strong&gt;. With a true-to-life story about a fictitious team of developers trying to deliver a product, he took us through the steps to creating a robust automatic build infrastructure for our product: from relying on drops provided by a developer, generated on his local machine, to an automatic build on a dedicated build server.&lt;/p&gt;  &lt;p&gt;From this point, Shmulik showed us how to make our build stronger, by adding rules and policies that must be satisfied, such as architectural decisions, coding standards and the like, we can make &lt;em&gt;code-reviews&lt;/em&gt; easier, by relegating the validation to the build-server, and providing feedback on the quality of our code within minutes of checking it in, rather than at the end of the release (if ever).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/assafstone/2011-06-28-16.03.25_5E200E02.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="2011-06-28 16.03.25" border="0" alt="2011-06-28 16.03.25" src="http://blogs.microsoft.co.il/blogs/assafstone/2011-06-28-16.03.25_thumb_79484136.jpg" width="488" height="367" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h1&gt;&lt;/h1&gt;    &lt;p&gt;The talk also included:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;how to customize build definitions&lt;/li&gt;    &lt;li&gt;how to create and customize TFS build workflows with WF 4.0&lt;/li&gt;    &lt;li&gt;Comparisons between xml scripts of previous versions and other build systems, and the TFS workflow-based engine&lt;/li&gt;    &lt;li&gt;How to create your own custom build activities&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Thanks Shmulik for a deep and advanced presentation on end to end building with TFS 2010&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=846960" width="1" height="1"&gt;</description></item><item><title>Our Talk at Sela Dev-Days–ALM Best Practices with TFS 2010</title><link>http://blogs.microsoft.co.il/blogs/assafstone/archive/2011/06/28/our-talk-at-sela-devdays-alm-best-practices-with-tfs-2010.aspx</link><pubDate>Tue, 28 Jun 2011 18:48:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:846928</guid><dc:creator>Assaf Stone</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;Today &lt;a href="http://blogs.microsoft.co.il/blogs/yuvmaz/" target="_blank"&gt;Yuval Mazor&lt;/a&gt; and I gave the talk above in front of ~20 people, as part of the ALM day of &lt;a href="http://www.sela.co.il" target="_blank"&gt;Sela Group&lt;/a&gt;’s &lt;a href="http://www.sela.co.il/s/minisdp/index.html" target="_blank"&gt;Dev Days 2011&lt;/a&gt;. People were quite receptive – and I believe we got them to understand not only how you do things in TFS 2010, but also why. Some of the things we talked about:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Best practices for managing software development projects with TFS 2010&lt;/li&gt;    &lt;li&gt;What are work items and how to use them (including customizations and links) &lt;/li&gt;    &lt;li&gt;How to properly build a branching plan &lt;/li&gt;    &lt;li&gt;Where and how to apply automated builds and CI &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Unfortunately, we didn’t have enough time to cover TFS 2010 reports in detail – which means another talk is in order!&lt;/p&gt;  &lt;p&gt;The presentation is available online &lt;a href="https://skydrive.live.com/redir.aspx?cid=13389367FEC74DC1&amp;amp;resid=13389367FEC74DC1%21225&amp;amp;page=view" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Thanks to &lt;a href="http://blogs.microsoft.co.il/blogs/shair/" target="_blank"&gt;Shai Raiten&lt;/a&gt; for the photography:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/assafstone/ALMBestPracticesSelaDevDays2011_7F19D7D8.jpg"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="ALMBestPracticesSelaDevDays2011" border="0" alt="ALMBestPracticesSelaDevDays2011" src="http://blogs.microsoft.co.il/blogs/assafstone/ALMBestPracticesSelaDevDays2011_thumb_136F7797.jpg" width="670" height="503" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A big thank-you to our audience – it was great having you!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=846928" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/ALM/default.aspx">ALM</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Branch/default.aspx">Branch</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/version+control/default.aspx">version control</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Dev+Days/default.aspx">Dev Days</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Sela/default.aspx">Sela</category></item><item><title>How to Localize the Agile MSF Iteration Backlog’s Weekends</title><link>http://blogs.microsoft.co.il/blogs/assafstone/archive/2011/03/31/how-to-localize-the-tfs-iteration-backlog-in-agile-msf.aspx</link><pubDate>Thu, 31 Mar 2011 15:41:58 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:815364</guid><dc:creator>Assaf Stone</dc:creator><slash:comments>0</slash:comments><description>&lt;p align="justify"&gt;If you’re using the Agile MSF process template in TFS 2010, you might be using the built in Iteration Backlog document. If not, you might really want to. It’s a nice and simple to use Excel document, backed up with some macros for calculations (.xlsm file). If you’re already using it, you may have come across the following problem: &lt;strong&gt;some days that you mark as planned interruptions from work do not affect your remaining days!&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/assafstone/image_4DFC66A1.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/assafstone/image_thumb_4B7334E3.png" width="533" height="72" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;This problem occurs in countries where the work-week is &lt;strong&gt;&lt;u&gt;not&lt;/u&gt;&lt;/strong&gt; Monday-through-Friday. Notice that the marked &lt;strong&gt;Days&lt;/strong&gt; and &lt;strong&gt;Remaining Days&lt;/strong&gt; are zero. Also, note that the date (03/04/2011 – that’s in dd/mm/yyyy format) is Sunday. In Israel, for example, Sunday is a workday, and should therefore count as one day.&lt;/p&gt;  &lt;p align="justify"&gt;To fix that, you need to change the function that calculates the two fields.&lt;/p&gt;  &lt;p align="justify"&gt;The default function for &lt;strong&gt;Days&lt;/strong&gt;, which applies to the U.S. and countries with a Mon-Fri work week looks like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;=IF(AND(ISNUMBER([@[Start Date]]),ISNUMBER([@[End Date]]), [@[Start Date]]&amp;lt;=[@[End Date]]),&lt;font style="background-color:#ffff00;"&gt;NETWORKDAYS&lt;/font&gt;([@[Start Date]],[@[End Date]]),&amp;quot;&amp;quot;)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;You need to replace the NETWORKDAYS function, with &lt;strong&gt;NETWORKDAYS.INTL &lt;/strong&gt; (international) which accepts an optional parameter for declaring when the &lt;strong&gt;weekend&lt;/strong&gt; is, as follows:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;IF(AND(ISNUMBER([@[Start Date]]),ISNUMBER([@[End Date]]), [@[Start Date]]&amp;lt;=[@[End Date]]),&lt;font style="background-color:#ffff00;"&gt;NETWORKDAYS.INTL&lt;/font&gt;([@[Start Date]],[@[End Date]]&lt;font style="background-color:#ffff00;"&gt;,7&lt;/font&gt;),&amp;quot;&amp;quot;)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The added &lt;strong&gt;“,7”&lt;/strong&gt; is the enumerated value of the kind of &lt;strong&gt;Weekend&lt;/strong&gt;. I’ve added the look up table from Excel’s help, for your convenience:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/assafstone/image_0F15A309.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/assafstone/image_thumb_3CD34601.png" width="281" height="382" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Likewise, you need to replace the function for &lt;strong&gt;Remaining Days&lt;/strong&gt; from:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;=IF(AND(ISNUMBER([@[Start Date]]),ISNUMBER([@[End Date]]), [@[Start Date]]&amp;lt;=[@[End Date]]),IF(OR(IterationStart&amp;gt;[@[End Date]],[@[Start Date]]&amp;gt;IterationEnd,[@[Start Date]]&amp;gt;[@[End Date]],TODAY()&amp;gt;MIN(IterationEnd,[@[End Date]])), 0, &lt;font style="background-color:#ffff00;"&gt;NETWORKDAYS&lt;/font&gt;(MAX(IterationStart,[@[Start Date]],TODAY()),MIN(IterationEnd,[@[End Date]]),Holidays[Date])),&amp;quot;&amp;quot;)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;to:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;=IF(AND(ISNUMBER([@[Start Date]]),ISNUMBER([@[End Date]]), [@[Start Date]]&amp;lt;=[@[End Date]]),IF(OR(IterationStart&amp;gt;[@[End Date]],[@[Start Date]]&amp;gt;IterationEnd,[@[Start Date]]&amp;gt;[@[End Date]],TODAY()&amp;gt;MIN(IterationEnd,[@[End Date]])), 0, &lt;font style="background-color:#ffff00;"&gt;NETWORKDAYS.INTL&lt;/font&gt;(MAX(IterationStart,[@[Start Date]],TODAY()),MIN(IterationEnd,[@[End Date]])&lt;font style="background-color:#ffff00;"&gt;,7&lt;/font&gt;,Holidays[Date])),&amp;quot;&amp;quot;)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;That’s all there is to it! Now you can enjoy properly reported &lt;em&gt;Agile&lt;/em&gt; development even if your country has different work habits!&lt;/p&gt;  &lt;p&gt;Hope this helps,&lt;/p&gt;  &lt;p&gt;Assaf.&lt;/p&gt;  &lt;p&gt;   &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:6ae336a6-6255-4d1b-a01d-c1c138e99308" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/TFS" rel="tag"&gt;TFS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Agile" rel="tag"&gt;Agile&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Agile+MSF" rel="tag"&gt;Agile MSF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Iteration+Backlog" rel="tag"&gt;Iteration Backlog&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Reports" rel="tag"&gt;Reports&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Localization" rel="tag"&gt;Localization&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=815364" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/ALM/default.aspx">ALM</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Reports/default.aspx">Reports</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Agile/default.aspx">Agile</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Agile+MSF/default.aspx">Agile MSF</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Localization/default.aspx">Localization</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Iteration+Backlog/default.aspx">Iteration Backlog</category></item><item><title>Security Considerations with Team Project Collections</title><link>http://blogs.microsoft.co.il/blogs/assafstone/archive/2011/02/13/security-considerations-with-team-project-collections.aspx</link><pubDate>Sun, 13 Feb 2011 19:57:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:786454</guid><dc:creator>Assaf Stone</dc:creator><slash:comments>1</slash:comments><description>&lt;p align="justify"&gt;   &lt;p&gt;The decision to store &lt;i&gt;team projects &lt;/i&gt;(TPs) in separate &lt;i&gt;team project collections&lt;/i&gt; (TPCs) has implicit security aspects to it. Separating projects into multiple collections promotes security. To understand this, one must understand TFS’s topology.&lt;/p&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/assafstone/clip_image002_2FEF752B.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="clip_image002" border="0" alt="clip_image002" src="http://blogs.microsoft.co.il/blogs/assafstone/clip_image002_thumb_444514E9.png" width="518" height="289" /&gt;&lt;/a&gt;    &lt;p&gt;Figure 1: TFS Logical Hierarchy&lt;/p&gt; &lt;/p&gt;  &lt;p align="justify"&gt;In TFS 2008 all of the team projects were stored in the same database. In 2010 this has changed; team projects are stored in &lt;i&gt;team project collections&lt;/i&gt;, and each collection is stored in its own database.&lt;/p&gt;  &lt;p align="justify"&gt;This is often stated as a disadvantage of splitting projects into multiple collections, due to the fact that application-wise, you cannot cross the collection boundary. You cannot branch or merge code, query or link work-items, share project templates (though you obviously can clone definitions from one collection to the other). Also, Visual Studio can only connect to one collection at a time.&lt;/p&gt;  &lt;p align="justify"&gt;These disadvantages have a silver lining though: Security through isolation. Each collection runs in its own sandbox, and information in one collection doesn’t run the risk of leaking into another. Say, for example, that you split your TPCs along the lines of customers (each customer has his own collection). As a client, you’d want to be sure that work items and code will not be available to other clients – imagine what would happen if a client could gain information through the web-access or SharePoint portal!&lt;/p&gt;  &lt;p align="justify"&gt;Beyond the security afforded at the application level by the aforementioned “limitations”, and the fact that each collection has its own security and permission management (as does each project), the security can be further tightened by constraining access to the data at the database level, or even storing each collection on &lt;b&gt;&lt;u&gt;physically&lt;/u&gt;&lt;/b&gt; separate database altogether.&lt;/p&gt;  &lt;p align="justify"&gt;To summarize, separating projects into different collections, isolates them and thus promotes the security of the information stored there.&lt;/p&gt;  &lt;p align="justify"&gt;Tags: &lt;a href="http://technorati.com/tag/ALM" rel="tag"&gt;ALM&lt;/a&gt; &lt;a href="http://technorati.com/tag/TFS" rel="tag"&gt;TFS&lt;/a&gt; &lt;a href="http://technorati.com/tag/Team%20System" rel="tag"&gt;Team System&lt;/a&gt; &lt;a href="http://technorati.com/tag/Architecture" rel="tag"&gt;Architecture&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=786454" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/ALM/default.aspx">ALM</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Security/default.aspx">Security</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Project+Collection/default.aspx">Project Collection</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Team+Project/default.aspx">Team Project</category></item><item><title>How to Make Merging Code with TFS Easier</title><link>http://blogs.microsoft.co.il/blogs/assafstone/archive/2010/11/18/how-to-make-merging-code-with-tfs-easier.aspx</link><pubDate>Thu, 18 Nov 2010 19:42:47 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:745089</guid><dc:creator>Assaf Stone</dc:creator><slash:comments>5</slash:comments><description>&lt;p align="justify"&gt;In my &lt;a href="http://blogs.microsoft.co.il/blogs/assafstone/archive/2010/11/08/freeze-yoghurt-not-code.aspx" target="_blank"&gt;previous post&lt;/a&gt; I described a VCS branching plan that will remove the need to initiate &lt;strong&gt;code freezes&lt;/strong&gt;. A few of my friends pointed out that their teams do not use that or similar methodologies not because they were unaware of such simple possibilities, but because performing reverse integrations (or any kind of &lt;strong&gt;merge&lt;/strong&gt;) is so difficult with TFS (their ALM tool of choice), that most developers do everything they can (e.g. initiate code freezes) to avoid having to perform a lengthy and painful merge.&lt;/p&gt;  &lt;p align="justify"&gt;My advice is twofold. First, methodology-wise: &lt;strong&gt;Merge often!&lt;/strong&gt; The more often you merge, the smaller and simpler the merge will be. As a rule of thumb, and assuming you are using the simple branching plan I suggested &lt;a href="http://blogs.microsoft.co.il/blogs/assafstone/archive/2010/11/08/freeze-yoghurt-not-code.aspx" target="_blank"&gt;last week&lt;/a&gt;, you will want to merge every time you fix a bug (remember – you only merge when doing a reverse integration from a release branch to the main branch). For more complex plans, that have the actual development done on a separate branch from Main, requiring &lt;strong&gt;forward integration&lt;/strong&gt; merges (i.e. from “Main” to “Dev”), you will want to merge on a daily basis, or whenever you know that there’s something to merge (from a release branch or a &lt;em&gt;different&lt;/em&gt; development branch). &lt;/p&gt;  &lt;p align="justify"&gt;My second advice, to which I will dedicate the rest of this post, is to &lt;strong&gt;replace the diff / merge tool!&lt;/strong&gt; &lt;/p&gt;  &lt;p align="justify"&gt;It is a well known fact, to those who know it well, that Microsoft have outfitted TFS with a less-than-adequate &lt;strong&gt;diff/merge tool&lt;/strong&gt;, especially when compared to those available to users of &lt;strong&gt;SVN&lt;/strong&gt;, &lt;strong&gt;Git&lt;/strong&gt;, and &lt;strong&gt;Mercurial&lt;/strong&gt; (to name a few).&lt;/p&gt;  &lt;p align="justify"&gt;How so? The primary issue I have with TFS’ default &lt;strong&gt;diff tool&lt;/strong&gt;, is that it shows me which lines are conflicting, but it’s up to me to find out just &lt;strong&gt;how&lt;/strong&gt; they differ from each other.&lt;/p&gt;  &lt;p align="justify"&gt;This is how the default tool shows the difference:    &lt;br /&gt;&lt;a&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image_thumb13" border="0" alt="image_thumb13" src="http://blogs.microsoft.co.il/blogs/assafstone/image_thumb13_59AFF901.png" width="754" height="360" /&gt;&lt;/a&gt;&amp;#160; Found the difference? Difficult, isn’t it? The default diff-tool provided with TFS marks the lines that are different; it doesn’t show you what the actual change is.&lt;/p&gt;  &lt;p align="justify"&gt;Here’s what it looks like in &lt;a href="http://kdiff3.sourceforge.net/" target="_blank"&gt;KDiff3&lt;/a&gt;:     &lt;br /&gt;&lt;a&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image_thumb111" border="0" alt="image_thumb111" src="http://blogs.microsoft.co.il/blogs/assafstone/image_thumb111_4E7648EA.png" width="754" height="347" /&gt;&lt;/a&gt;     &lt;br /&gt;See the difference now? The actual &lt;strong&gt;changes&lt;/strong&gt; are marked, not just the line. Makes comparing the code with the other version &lt;em&gt;much &lt;/em&gt;simpler. By the way, in case you are visually impaired, what I did was replace the word “TFS” with “custom”.&lt;/p&gt;  &lt;p align="justify"&gt;The second, and more important part of the tool, is the actual &lt;strong&gt;merging capabilities&lt;/strong&gt;. I’ve got a major gripe with the default tool as well. TFS’ merge tool performs a &lt;strong&gt;2-way &lt;/strong&gt;merge, where as other tools (KDiff3, for one) performs a &lt;strong&gt;3-way&lt;/strong&gt; merge. &lt;/p&gt;  &lt;p align="justify"&gt;What’s the difference you ask? Basically, a 2-way merge compares two files and attempts to &lt;em&gt;best-guess&lt;/em&gt; what the differences between them are – this is rather error-prone, and thus requires more human intervention. 2-Way merges are good enough for simple merges, like those done every time you commit (or check in) changes to your code base. When you are trying to resolve a conflict between your changes, and the changes somebody else made, you just might be in for what is (dis)affectionately known as &lt;strong&gt;merge-hell&lt;/strong&gt;. This happens when two developers made changes to the same source file, especially when the changes are located close to each other (i.e. same or consecutive lines of code).&lt;/p&gt;  &lt;p align="justify"&gt;3-way merges, on the other hand, compare &lt;strong&gt;both&lt;/strong&gt; versions of the file to their &lt;strong&gt;parent&lt;/strong&gt; version, and therefore can focus on comparing the &lt;strong&gt;changes made&lt;/strong&gt;, rather than the &lt;strong&gt;complete files&lt;/strong&gt;. This allows for a more reliable automatic merge, which means that the merge will be much simpler. Even if an automatic change is not possible, the tool’s focus on the actual changes helps the developer decide whether to include one or both changes.&lt;/p&gt;  &lt;h4&gt;Okay, I’m Convinced! Give Me the Goods!&lt;/h4&gt;  &lt;p align="justify"&gt;Good! Luckily, it is very easy to replace the Diff/Merge tool in TFS. This is done on the client side, from within visual studio. &lt;/p&gt;  &lt;p align="justify"&gt;Following is a step-by-step guide for how to do replace the merge tool. I know that most of you don’t need this level of detail, but for those beginning developers or those of you whose brains have been terminally damaged by long hours of merge-hell, here it is:&lt;/p&gt;  &lt;p align="justify"&gt;Open the Tools | Options menu.    &lt;br /&gt;&lt;a&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image_thumb1" border="0" alt="image_thumb1" src="http://blogs.microsoft.co.il/blogs/assafstone/image_thumb1_6D0E1976.png" width="373" height="440" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;This will bring up the Visual Studio configuration window.    &lt;br /&gt;&lt;a&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image12_thumb" border="0" alt="image12_thumb" src="http://blogs.microsoft.co.il/blogs/assafstone/image12_thumb_219E4FE5.png" width="463" height="272" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;Now select the Source Control &amp;gt; Visual Studio Team Foundation Server menu. At the bottom, press the &lt;strong&gt;Configure User Tools…&lt;/strong&gt; button.&lt;/p&gt;  &lt;p align="justify"&gt;This will open the (surprisingly named) Configure User Tools window    &lt;br /&gt;&lt;a&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image_thumb9" border="0" alt="image_thumb9" src="http://blogs.microsoft.co.il/blogs/assafstone/image_thumb9_164515DB.png" width="432" height="261" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Press on the &lt;strong&gt;Add…&lt;/strong&gt; button to add diff and merge custom tools. Doing so will open the following window (so many windows; I hope you aren’t confused):     &lt;br /&gt;&lt;a&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image_thumb11" border="0" alt="image_thumb11" src="http://blogs.microsoft.co.il/blogs/assafstone/image_thumb11_3E94482F.png" width="434" height="233" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;Filling in the information is rather simple; You add the file extensions for which you wish the tool to be used (comma separated, prefixed with a period like “&lt;strong&gt;.cs&lt;/strong&gt;”). You then select the &lt;strong&gt;&lt;em&gt;operation&lt;/em&gt;&lt;/strong&gt; you wish to associate with the tool. &lt;em&gt;Note that for diff/merge tools there are two commands you wish to use – &lt;strong&gt;Compare&lt;/strong&gt; and &lt;strong&gt;Merge&lt;/strong&gt;. Remember to do both. &lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Next you select the &lt;strong&gt;command&lt;/strong&gt; – that’s the actual tool you are going to use. &lt;a href="http://kdiff3.sourceforge.net/" target="_blank"&gt;KDiff3&lt;/a&gt; is a great tool, both free and powerful (not to mention popular with the &lt;a href="http://git-scm.com/" target="_blank"&gt;Git&lt;/a&gt; and &lt;a href="http://mercurial.selenic.com/" target="_blank"&gt;Mercurial&lt;/a&gt; crowd. If &lt;em&gt;they&lt;/em&gt; like it must be cool), and is my tool of choice. Other popular choices include Beyond Compare (&lt;strong&gt;version 3&lt;/strong&gt; and up only, as prior versions do not support 3-way merges, and you really want that for your &lt;strong&gt;reverse-integration merges&lt;/strong&gt;), &lt;a href="http://www.sourcegear.com/diffmerge/downloads.html" target="_blank"&gt;DiffMerge&lt;/a&gt;, and &lt;a href="http://tortoisesvn.tigris.org/TortoiseMerge.html" target="_blank"&gt;TortoiseMerge&lt;/a&gt; (especially if you were dragged away from SVN kicking and screaming).&lt;/p&gt;  &lt;p align="justify"&gt;Finally you enter the command &lt;strong&gt;arguments&lt;/strong&gt;. If you are daunted (as I often am) by having to find out what arguments you need, then fear not! I found this &lt;a href="http://blogs.msdn.com/b/jmanning/archive/2006/02/20/diff-merge-configuration-in-team-foundation-common-command-and-argument-values.aspx" target="_blank"&gt;great post&lt;/a&gt; from a few years back, that lists a whole bunch of tools with the command-line arguments you need in order to use for &lt;strong&gt;TFS&lt;/strong&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;For KDiff3, use the following argument values: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;Compare: &lt;/strong&gt;%1 --fname %6 %2 --fname %7&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;Merge:&lt;/strong&gt; %3 --fname %8 %2 --fname %7 %1 --fname %6 -o %4&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Selecting a &lt;strong&gt;better diff/merge tool &lt;/strong&gt;will greatly improve your merging experience, and hopefully alleviate most of your pain when performing those &lt;strong&gt;reverse integrations&lt;/strong&gt;. Remember to merge &lt;strong&gt;as often as you can&lt;/strong&gt;, so that each merge will be small and painless.&lt;/p&gt;  &lt;p align="justify"&gt;If anybody has any other ideas, experiences on how to make using TFS’ version control system easier, please share!&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:65a4adc6-06ee-4698-94f1-fb3c51cccd8c" class="wlWriterSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/ALM" rel="tag"&gt;ALM&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Version+Control" rel="tag"&gt;Version Control&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Merge" rel="tag"&gt;Merge&lt;/a&gt;,&lt;a href="http://technorati.com/tags/tools" rel="tag"&gt;tools&lt;/a&gt;,&lt;a href="http://technorati.com/tags/TFS" rel="tag"&gt;TFS&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=745089" width="1" height="1"&gt;</description></item><item><title>Freeze Yogurt, not Code!</title><link>http://blogs.microsoft.co.il/blogs/assafstone/archive/2010/11/08/freeze-yoghurt-not-code.aspx</link><pubDate>Mon, 08 Nov 2010 18:27:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:738946</guid><dc:creator>Assaf Stone</dc:creator><slash:comments>8</slash:comments><description>&lt;p align="justify"&gt;It never ceases to amaze me, that to this day, I come across so many development teams that still initiate &lt;strong&gt;code freezes&lt;/strong&gt; every time they release software. In this post I will show you why this is &lt;strong&gt;wasteful&lt;/strong&gt; and how the need can be &lt;strong&gt;avoided&lt;/strong&gt; altogether!&lt;/p&gt;  &lt;p align="justify"&gt;&lt;b&gt;Code Freezing&lt;/b&gt; is the act of temporarily stopping all &lt;i&gt;new development&lt;/i&gt; while focusing all of the resources on maintenance of the latest release. While releasing the latest feature set is usually the highest priority, it is often the case that the development team must divide their efforts between fixing the latest version (&lt;b&gt;V-latest&lt;/b&gt;) and developing the next version (&lt;b&gt;V-next&lt;/b&gt;).&lt;/p&gt;  &lt;p align="justify"&gt;Development teams and managers initiate &lt;b&gt;code freezes&lt;/b&gt; because they cannot find a good, simple way to handle both development efforts at the same time. &lt;/p&gt;  &lt;p align="justify"&gt;Code freezes &lt;b&gt;waste valuable time and resources&lt;/b&gt;. Each code freeze means that developers working on new features must either delay checking-in their code (until the freeze is lifted), or avoid working on the features altogether. Adding up the amount of time &lt;b&gt;each&lt;/b&gt; developer is &lt;b&gt;not working&lt;/b&gt;, or spending on &lt;b&gt;complex check-ins &amp;amp; merges&lt;/b&gt; is the total amount of time &lt;b&gt;&lt;u&gt;wasted&lt;/u&gt;&lt;/b&gt; for each code freeze! &lt;/p&gt;  &lt;p align="justify"&gt;Fortunately, with most modern version control systems (TFS, SVN, etc.), it is possible to solve this problem, with a &lt;b&gt;proper branching plan&lt;/b&gt;!&lt;/p&gt;  &lt;p align="justify"&gt;The following branching plan is &lt;b&gt;just the core&lt;/b&gt; plan, which may be refactored to allow for multiple development and testing configurations, as well as more complex &lt;b&gt;release mechanisms&lt;/b&gt; (e.g. releases, service packs, hot-fixes, etc.):&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/assafstone/image_2EAF340F.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/assafstone/image_thumb_3108B60D.png" width="539" height="148" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;The plan consists of (at least) the following branches:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;Main&lt;/b&gt; – On this branch the &lt;b&gt;&lt;i&gt;latest&lt;/i&gt;&lt;/b&gt; features are developed and tested. Your &lt;b&gt;nightly build&lt;/b&gt; or &lt;b&gt;cutting-edge version&lt;/b&gt; is built from this branch. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;Release / Version&lt;/b&gt; – Whenever it is time to release a version, or &lt;b&gt;before&lt;/b&gt; beginning to work on a feature for the &lt;b&gt;next&lt;/b&gt; version, a &lt;b&gt;&lt;i&gt;new&lt;/i&gt;&lt;/b&gt; branch is made from &lt;b&gt;Main&lt;/b&gt;. A release branch is made for &lt;b&gt;each release version&lt;/b&gt;. &lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h4 align="justify"&gt;Working with the Basic Plan&lt;/h4&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="justify"&gt;The development team develops new features on the &lt;b&gt;Main&lt;/b&gt; branch. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;When it is time to release a version (to QA, end of sprint, etc.), and before developing features for the next release / sprint, make a &lt;b&gt;Release&lt;/b&gt; branch (branch off main). &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;From this point on, the team keeps developing new features &lt;b&gt;only on Main&lt;/b&gt;. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;The team fixes issues with the &lt;b&gt;latest release&lt;/b&gt;, &lt;b&gt;&lt;u&gt;only on the Release branch&lt;/u&gt;&lt;/b&gt;. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Important fixes from the &lt;b&gt;version&lt;/b&gt; branch are &lt;b&gt;reverse-integrated (RI)&lt;/b&gt; – i.e. merged back – into &lt;strong&gt;Main&lt;/strong&gt;. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;This process is repeated for each new version to be released. &lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;Simple, isn’t it? I showed a friend of mine a draft of this post, and he asked “Isn’t this trivial? Why are you talking about this?”. I had to agree. It &lt;strong&gt;&lt;em&gt;is&lt;/em&gt;&lt;/strong&gt; trivial. But too few teams do this. I personally think that most teams simply do what they always did, because that’s how their managers did it when &lt;em&gt;they&lt;/em&gt; were developers, a long, long time ago… &lt;/p&gt;  &lt;p align="justify"&gt;If you keep this up (dare I say &lt;em&gt;religiously&lt;/em&gt;?) you will &lt;strong&gt;never&lt;/strong&gt; have to freeze your code again; new features will never affect older versions. Developers can maintain old versions and develop new ones at the same time.&lt;/p&gt;  &lt;p align="justify"&gt;I think that once you try this, you will agree that this is a simple easy win. &lt;/p&gt;  &lt;p align="justify"&gt;If you want to learn more about branching plans for version control systems, a group called the &lt;strong&gt;VSTS Rangers&lt;/strong&gt; (catchy, eh?) put together a great guide for branching with &lt;strong&gt;TFS&lt;/strong&gt;. This guide can be easily applied to any VCS.&lt;/p&gt;  &lt;p align="justify"&gt;As for freezing yogurt, Please make mine with strawberries. It tastes great.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:b4da681a-9744-43f5-bd46-976fa9904eea" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/ALM" rel="tag"&gt;ALM&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Branching" rel="tag"&gt;Branching&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Version+Control" rel="tag"&gt;Version Control&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Agile" rel="tag"&gt;Agile&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=738946" width="1" height="1"&gt;</description></item><item><title>TDD Doesn’t Have to be So Difficult (part 2)</title><link>http://blogs.microsoft.co.il/blogs/assafstone/archive/2010/05/18/tdd-doesn-t-have-to-be-so-difficult-part-2.aspx</link><pubDate>Tue, 18 May 2010 16:25:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:621875</guid><dc:creator>Assaf Stone</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Hello all,&lt;/p&gt;
&lt;p&gt;Last week I gave a lecture at Microsoft on the subject. It was a great experience for me, and I’d like to thank everybody who was there, and gave feedback. I hope to see you all again soon and &lt;strong&gt;&lt;em&gt;really&lt;/em&gt;&lt;/strong&gt; get to dig into the subject of &lt;strong&gt;exploratory tests with &lt;a href="http://research.microsoft.com/en-us/projects/pex/" target="_blank"&gt;Pex&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As promised at before, here is the presentation and code samples I showed. Leave a comment or email me, if there are any questions regarding the code or the content.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://cid-13389367fec74dc1.skydrive.live.com/self.aspx/.Public/Moles%20%5E0%20Pex%20for%20ALM%20Usergroup%20May-2010/TDD%20-%20Moles%20%5E0%20Pex.ppsx?authkey=T0rBo4GBGPg%24" target="_blank"&gt;The Presentation&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://cid-13389367fec74dc1.skydrive.live.com/self.aspx/.Public/Moles%20%5E0%20Pex%20for%20ALM%20Usergroup%20May-2010/BasicTDD1.rar?authkey=T0rBo4GBGPg%24" target="_blank"&gt;Basic TDD Example&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://cid-13389367fec74dc1.skydrive.live.com/self.aspx/.Public/Moles%20%5E0%20Pex%20for%20ALM%20Usergroup%20May-2010/TDDExampleWithStubs.rar?authkey=T0rBo4GBGPg%24" target="_blank"&gt;Example of Dependency Injection for TDD&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://cid-13389367fec74dc1.skydrive.live.com/self.aspx/.Public/Moles%20%5E0%20Pex%20for%20ALM%20Usergroup%20May-2010/NondeterministicTDD.rar?authkey=T0rBo4GBGPg%24" target="_blank"&gt;Example of a Nondeterministic Dependency Problem&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://cid-13389367fec74dc1.skydrive.live.com/self.aspx/.Public/Moles%20%5E0%20Pex%20for%20ALM%20Usergroup%20May-2010/ClassicTDD.rar?authkey=T0rBo4GBGPg%24" target="_blank"&gt;Classic TDD Solution to Nondeterministic Dependencies&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://cid-13389367fec74dc1.skydrive.live.com/self.aspx/.Public/Moles%20%5E0%20Pex%20for%20ALM%20Usergroup%20May-2010/TDDwithMoles.rar?authkey=T0rBo4GBGPg%24" target="_blank"&gt;Using Pex &amp;amp; Moles&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks,&lt;/p&gt;
&lt;p&gt;Assaf.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=621875" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/TDD/default.aspx">TDD</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Unit+Tests/default.aspx">Unit Tests</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Moles/default.aspx">Moles</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Pex/default.aspx">Pex</category></item><item><title>TDD: It Doesn’t Have to Be So Difficult</title><link>http://blogs.microsoft.co.il/blogs/assafstone/archive/2010/04/21/tdd-it-doesn-t-have-to-be-so-difficult.aspx</link><pubDate>Wed, 21 Apr 2010 04:08:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:589792</guid><dc:creator>Assaf Stone</dc:creator><slash:comments>0</slash:comments><description>&lt;p align="justify"&gt;Test Driven Development, or TDD for short. Some developers swear by it, others – &lt;em&gt;at&lt;/em&gt; it. Few development teams in Israel practice it, much less do so successfully. The reason is that it is a whole new way to &lt;em&gt;design&lt;/em&gt; software. TDD is a lot more than merely writing your test-code before writing your production code. It enforces a design paradigm on its practitioners, that is often radically different from how they would normally design their software, without the constraints imposed by TDD. Chief among them is the need to fake the dependencies of the unit under test.&lt;/p&gt;
&lt;p align="justify"&gt;In order to test a unit in isolation each and every &lt;em&gt;other&lt;/em&gt; unit it depends on must be stubbed, or faked to return a canned response, so that a single determinable path will be executed, and that if any error occurs in the test, it must be in the unit under test, because everything else simply isn’t tested. This requirement can be extremely difficult, as soon as you need to test code whose dependencies aren’t accessed through an interface, are not virtual, or are static methods. Fortunately, there are techniques to get it done. Unfortunately, they complicate the code to a seemingly unreasonable degree.&lt;/p&gt;
&lt;p align="justify"&gt;This limitation often chafes at those who are not willing to accept the requirements “just for the sake of automating a test”, especially when doing so greatly increases the complexity of the code in order to appease the Gods of Unit Tests. Subsequently, many would-be TDDers abandon the benefits granted by it, in favor of the “normal” way they always did things – test last, if ever.&lt;/p&gt;
&lt;p align="justify"&gt;But it doesn’t have to be that way! Recent developments from Microsoft Research, allow developers to eat the cake and leave it whole. Enter Microsoft Moles. A mole is a piece of code – a method, or a getter/setter for a property – that replaces another, similar piece of code, in runtime, for the duration of the test, without affecting the production code. This technique works with the same ease regardless of the nature of the code that needs to be “dug under” (virtual or not, static or not, abstract or concrete). &lt;/p&gt;
&lt;p align="justify"&gt;The result is, that developers can go back to writing code as they would, regardless of their decision to use TDD, and still enjoy the benefit of an automated suite of tests guiding their efforts.&lt;/p&gt;
&lt;p align="justify"&gt;On May 10th, at the next session of the ALM User Group at Microsoft’s offices in Ra’anana, I will demonstrate this, and other techniques to alleviate the pains usually associated with test driven development. Check it out &lt;a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032449286&amp;amp;culture=he-IL" target="_blank"&gt;here&lt;/a&gt;, and register today. It’s free.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=589792" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/TDD/default.aspx">TDD</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Unit+Tests/default.aspx">Unit Tests</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/Moles/default.aspx">Moles</category><category domain="http://blogs.microsoft.co.il/blogs/assafstone/archive/tags/ALM/default.aspx">ALM</category></item></channel></rss>