<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/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>Progressive Development : build</title><link>http://blogs.msdn.com/progressive_development/archive/tags/build/default.aspx</link><description>Tags: build</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Motley says: “Slow down to go fast? Do I look like a tortoise?”</title><link>http://blogs.msdn.com/progressive_development/archive/2009/04/21/motley-says-slow-down-to-go-fast-do-i-look-like-a-tortoise.aspx</link><pubDate>Wed, 22 Apr 2009 08:23:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9561327</guid><dc:creator>James Waletzky</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/progressive_development/comments/9561327.aspx</comments><wfw:commentRss>http://blogs.msdn.com/progressive_development/commentrss.aspx?PostID=9561327</wfw:commentRss><description>&lt;UL style="MARGIN-TOP: 0in; unicode-bidi: embed; DIRECTION: ltr; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.074in"&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt; TEXT-DECORATION: underline"&gt;Summary&lt;/P&gt;
&lt;DIV style="DIRECTION: ltr"&gt;
&lt;TABLE style="BORDER-BOTTOM: #a3a3a3 0pt solid; BORDER-LEFT: #a3a3a3 0pt solid; BORDER-COLLAPSE: collapse; DIRECTION: ltr; BORDER-TOP: #a3a3a3 0pt solid; BORDER-RIGHT: #a3a3a3 0pt solid" border=0 cellSpacing=0 cellPadding=0 valign="top"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD style="PADDING-BOTTOM: 4pt; BORDER-RIGHT-WIDTH: 0pt; PADDING-LEFT: 4pt; WIDTH: 0.667in; PADDING-RIGHT: 4pt; BORDER-TOP-WIDTH: 0pt; BORDER-BOTTOM-WIDTH: 0pt; VERTICAL-ALIGN: top; BORDER-LEFT-WIDTH: 0pt; PADDING-TOP: 4pt"&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;&amp;nbsp;&lt;IMG src="http://waletzky.smugmug.com/photos/483462002_Vdpau-60x70.jpg" mce_src="http://waletzky.smugmug.com/photos/483462002_Vdpau-60x70.jpg"&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD style="PADDING-BOTTOM: 4pt; BORDER-RIGHT-WIDTH: 0pt; PADDING-LEFT: 4pt; WIDTH: 5.864in; PADDING-RIGHT: 4pt; BORDER-TOP-WIDTH: 0pt; BORDER-BOTTOM-WIDTH: 0pt; VERTICAL-ALIGN: top; BORDER-LEFT-WIDTH: 0pt; PADDING-TOP: 4pt"&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;Motley:&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;There is no harm shortcutting a few steps of development to meet a deadline. Some up-front check-in steps just take too much time. &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="PADDING-BOTTOM: 4pt; BORDER-RIGHT-WIDTH: 0pt; PADDING-LEFT: 4pt; WIDTH: 0.667in; PADDING-RIGHT: 4pt; BORDER-TOP-WIDTH: 0pt; BORDER-BOTTOM-WIDTH: 0pt; VERTICAL-ALIGN: top; BORDER-LEFT-WIDTH: 0pt; PADDING-TOP: 4pt"&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;&amp;nbsp;&lt;IMG src="http://waletzky.smugmug.com/photos/483461992_S6kZz-60x70.jpg" mce_src="http://waletzky.smugmug.com/photos/483461992_S6kZz-60x70.jpg"&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD style="PADDING-BOTTOM: 4pt; BORDER-RIGHT-WIDTH: 0pt; PADDING-LEFT: 4pt; WIDTH: 5.864in; PADDING-RIGHT: 4pt; BORDER-TOP-WIDTH: 0pt; BORDER-BOTTOM-WIDTH: 0pt; VERTICAL-ALIGN: top; BORDER-LEFT-WIDTH: 0pt; PADDING-TOP: 4pt"&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;Maven: Slow down to go fast. Obey check-in checklists or you will pay for it later in the development cycle. Pre-check-in tasks such as code reviews, unit testing, static analysis, and buddy builds of various flavors must not be avoided.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;______________________________&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;[Context: The code check-in deadline is approaching. Motley has code that is in progress and he is hurrying to get his change in prior to the build snap]&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Maven: Hey, Mot. How's it-&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Motley: Quiet! I have to get this code checked-in by the end of the day to meet the deadline. I don't have time to chat and need to rush to get this code in.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Maven: Whoa - maybe we &lt;SPAN style="FONT-STYLE: italic"&gt;should&lt;/SPAN&gt; chat. Please just give me a few minutes here - it won't affect anything in the bigger scheme of things. What do you mean you have to "rush"?&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Motley: The daily build starts at 6pm and it's 5:35pm. I only have 25 minutes to get the code checked-in so I have to take a few shortcuts.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Maven: I cannot stand the word "shortcut". Care to clarify?&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Motley: It doesn't really matter what you can and cannot stand. But since you asked, I am going to skip writing unit tests for this last class, I am going to forgo code review because my code is always perfect anyway, and I am going to skip running FxCop just this once.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Maven: Have you ever heard the phrase, "Pay me now, or pay me &lt;SPAN style="FONT-STYLE: italic"&gt;more&lt;/SPAN&gt; later"? What you are doing is akin to racking up credit card debt. On the outside it looks like a $5000 purchase, but in the long run it is going to cost you a lot more in interest if you do not pay off the debt as soon as the bill comes due.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Motley: Oh, no. More Maven analogies. I can do without those. And by the way, Boyz II Men called - they want their shirt back.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Maven: Always insulting my clothes! This blue and pink sweater combo isn't that bad, is it? Anyway, taking shortcuts now when the code is cheap to fix pays off in the long run and leads to quicker ship cycles and shorter bug-fix cycles later in the development cycle. &lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Motley: How so? Bugs are bugs, I need to fix them anyway.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Maven: It's much cheaper to fix bugs now than later. Fixing them later usually involves someone else creating and maintaining bugs in a bug database, fixing them when the code is no longer in context and fresh in your memory, and the tendency to bolt-on fixes and shortcut fixes. Additionally, if the test team does not find an issue, the cost of fixing it post-release is large due to the overhead in working with the customer, the bug getting back to the product group, deploying the fix, the negative press, and other factors.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;If you find an issue that modifies the design later, you may have to change a lot of code possibly destabilizing the product.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Motley: Yeah, yeah - the cost of change curve. I know it.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Maven: Then you know that you shouldn't rush your development. Would you rather fix bugs later when they are more expensive or now when they are cheap without the overhead of a post-check-in bug? Leaving bugs until later forces long "stabilization" periods on the team, which, in my opinion, are evil and can be avoided by a diligent team.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;It is well worth pushing back on the deadline to ensure that you can adhere to the following code check-in checklist:&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0in; unicode-bidi: embed; DIRECTION: ltr; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.375in" type=circle&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;Unit tests&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;. We have talked about &lt;/SPAN&gt;&lt;A href="http://blogs.msdn.com/progressive_development/archive/tags/unit+testing/default.aspx" mce_href="http://blogs.msdn.com/progressive_development/archive/tags/unit+testing/default.aspx"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;unit testing&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt; at length in other discussions. This is the number one quality-driven developer technique. You must have a set of unit tests in place that exercise all of your new code and you can check-in when all the tests pass. This items should be bolded on a checklist.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;Code coverage. &lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Hand-in-hand with unit testing is &lt;/SPAN&gt;&lt;A href="http://blogs.msdn.com/progressive_development/archive/2007/05/01/motley-says-100-code-coverage-tells-me-there-is-nothing-left-to-test.aspx" mce_href="http://blogs.msdn.com/progressive_development/archive/2007/05/01/motley-says-100-code-coverage-tells-me-there-is-nothing-left-to-test.aspx"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;code coverage&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;. Aim for 70%+ code coverage for all of your code. More important than the coverage number is the feedback you receive from the coverage tool regarding source lines that were missed in testing so that you can add new tests.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;Debug and retail builds. &lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;A debug build is generally different than a retail build, particularly when you make use of debug-time primitives such as assertions. You need to build both flavors to ensure the build succeeds either way. Broken builds are not tolerable as they block the entire team. In fact, do a clean build (vs. incremental build) to be safe.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;Static analysis. &lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;A &lt;/SPAN&gt;&lt;A href="http://blogs.msdn.com/progressive_development/archive/2007/03/25/motley-says-rely-on-the-debugger-to-write-solid-code.aspx" mce_href="http://blogs.msdn.com/progressive_development/archive/2007/03/25/motley-says-rely-on-the-debugger-to-write-solid-code.aspx"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;static analysis&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt; tool like FxCop finds bugs for you. Per the cost of change discussion, why not fix them now instead of later when it is more expensive? Why risk security defects escaping your defenses and being released into the wild where hackers and customers will find them?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;Reliability tools. &lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Running a tool like &lt;/SPAN&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ms220948.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms220948.aspx"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;AppVerifier&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt; is more relevant to C++ applications. Running this tool is a must prior to check-in as it will help identify heap corruptions, improper use of handles, and misuse of critical sections. Additionally, for native code it will point out memory leaks.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;Warning level. &lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Crank up the compiler to generate warnings at level 4 (or whatever is highest for your compiler) to ensure that you have addressed all possible compiler-identified issues. Get into the habit of perpetually building at the highest warning level. Get clean and stay clean.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;Other tools. &lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Run any other organization-wide tools such as a copyright header checker, XML documentation checker, or coding style checker (e.g. &lt;/SPAN&gt;&lt;A href="http://code.msdn.microsoft.com/sourceanalysis" mce_href="http://code.msdn.microsoft.com/sourceanalysis"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Source Analysis&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;) prior to check-in. You don't want to be the grunt fixing a ton of these issues later. Trust me on this one.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;Code reviews. &lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;All code should be at least peer-reviewed, with larger changes (e.g. new features) being put through a &lt;/SPAN&gt;&lt;A href="http://blogs.msdn.com/progressive_development/archive/2007/10/30/motley-says-inspections-suck-time-that-is.aspx" mce_href="http://blogs.msdn.com/progressive_development/archive/2007/10/30/motley-says-inspections-suck-time-that-is.aspx"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;code inspection&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;. Having at least one other pair of eyes look at your code is likely to find many issues before even the test team gets their hands on the code.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;Change list description. &lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Include complete descriptions for check-in change lists, including how you tested the code, why the change was made, how you built, possible regressions, and other risks.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;Buddy build. &lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;To ensure you did not forget to add a file to your change list and to protect against other bad assumptions, package up your change and pass it to a buddy for her to build. Most source control systems allow you to package up a change list for distribution. If you have a continuous integration system that builds changes before check-in, this is less necessary. &lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Motley: You cannot possibly be serious! If I do all that now there is no way I would ever make the deadline, let alone make a check-in. &lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Maven: All of the above is necessary, particularly in a large, quality-focused organization. We want to exterminate bugs before they are even checked-in. The checklist above helps with that. &lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Motley: Can you say "Sloooooooooooooowwwwww"? I knew you could.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Maven: Get in touch with your inner tortoise. I heard that in a &lt;A href="http://www.ted.com/" mce_href="http://www.ted.com/"&gt;TED&lt;/A&gt; talk on &lt;A href="http://www.ted.com/index.php/talks/carl_honore_praises_slowness.html" mce_href="http://www.ted.com/index.php/talks/carl_honore_praises_slowness.html"&gt;Slowing Down in a World Built for Speed&lt;/A&gt; by Carl Honore. Going a little slower up front will save time in the overall development cycle, and I would claim that you ship sooner as a result.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Of course, that was not the specific theme of the talk, but the lesson can be applied here. Also, be pragmatic. Perhaps you avoid a step or two for small bug fixes.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Motley: One thing I do not quite buy is the lack of long stabilization periods at the end of the development cycle. We still need to put all the pieces together!&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Maven: Ultimately we want to avoid long stabilization cycles and instead be stable when you check-in. A tail of the development cycle needs to be dedicated to integration and overall acceptance test validation, but is not the same thing as "stabilization". We talked about this before in our discussion on &lt;A href="http://blogs.msdn.com/progressive_development/archive/2007/03/29/motley-says-i-am-a-developer-i-don-t-test-testing-is-for-the-test-team.aspx" mce_href="http://blogs.msdn.com/progressive_development/archive/2007/03/29/motley-says-i-am-a-developer-i-don-t-test-testing-is-for-the-test-team.aspx"&gt;developer testing&lt;/A&gt;.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Motley: So you are telling me that I need to pay my boss a visit as soon as possible to tell him that I am going to miss the deadline? He is going to kill me.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Maven: Well, seeing as you only have 5 minutes to the build snap-&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Motley: &amp;lt;POW&amp;gt;. You deserved that shot in the nose for wasting all my time and missing the build snap!&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Maven: Ouch! Okay, I deserved that. But seriously, your boss is a reasonable person and will understand. Firstly, you are communicating bad news as soon as possible (well, not really, but let's pretend), which all managers appreciate. Secondly, present it such that you are focused on quality and want to avoid taking shortcuts, and that you feel this course of action is best for the product. I will bet you lunch that he understands.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Motley: There are some days where I wish I stayed in bed...&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;______________________________&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;&lt;SPAN style="COLOR: navy; FONT-WEIGHT: bold"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;&lt;SPAN style="COLOR: navy; FONT-WEIGHT: bold"&gt;James' Pointer:&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The checklist items I mention above are from a real team in at Microsoft in Windows Mobile. Quality is our #1 value as a team. We want solid check-ins that adhere to the checklist to ensure we don't have a long tail of bugs later. Yes, it is a lot of work but ultimately saves time in the long run. Slow down. Don't rush. Nail the checklist on &lt;SPAN style="FONT-STYLE: italic"&gt;every&lt;/SPAN&gt; check-in. You will thank yourself later. Okay, maybe not, but you should.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;&lt;SPAN style="COLOR: navy; FONT-WEIGHT: bold"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;&lt;SPAN style="COLOR: navy; FONT-WEIGHT: bold"&gt;James' Double Pointer Indirection:&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;A good developer knows how much work goes into each and every check-in and factors these things into their estimates. These things take time.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;&lt;SPAN style="COLOR: navy; FONT-WEIGHT: bold"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;&lt;SPAN style="COLOR: navy; FONT-WEIGHT: bold"&gt;James' Triple Pointer Indirection:&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;"Slow down to go fast" is real advice in car racing circles. Intuitively it does not make a lot of sense. However, if I go into the corner too fast I have to brake to avoid the wall and then take a lot of time and gas to come back up to speed exiting the corner. If I slow down on entry, roll through the corner and smoothly apply the accelerator on exit, I actually go faster even though I slowed down entering the corner.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;&lt;SPAN style="COLOR: navy; FONT-WEIGHT: bold"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;&lt;SPAN style="COLOR: navy; FONT-WEIGHT: bold"&gt;Maven's Resources:&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0in; unicode-bidi: embed; DIRECTION: ltr; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.375in" type=circle&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;TED (&lt;/SPAN&gt;&lt;A href="http://www.ted.com/" mce_href="http://www.ted.com"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;http://www.ted.com&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;): A great web site of some of the world's best speakers. There are talks on a multitude of topics. You are guaranteed to find something of interest.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;AppVerifier (&lt;/SPAN&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ms220948.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms220948.aspx"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;http://msdn.microsoft.com/en-us/library/ms220948.aspx&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;): A mandatory tool for C++ developers on the Microsoft Windows platform.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Source Analysis (&lt;/SPAN&gt;&lt;A href="http://code.msdn.microsoft.com/sourceanalysis" mce_href="http://code.msdn.microsoft.com/sourceanalysis"&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;http://code.msdn.microsoft.com/sourceanalysis&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;): A customizable tool that validates coding standards and is a good complement to FxCop.&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/UL&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9561327" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/progressive_development/archive/tags/unit+testing/default.aspx">unit testing</category><category domain="http://blogs.msdn.com/progressive_development/archive/tags/quality/default.aspx">quality</category><category domain="http://blogs.msdn.com/progressive_development/archive/tags/build/default.aspx">build</category><category domain="http://blogs.msdn.com/progressive_development/archive/tags/checklists/default.aspx">checklists</category></item><item><title>Motley says: “Branches are for trees, not source code”</title><link>http://blogs.msdn.com/progressive_development/archive/2009/03/03/motley-says-branches-are-for-trees-not-source-code.aspx</link><pubDate>Tue, 03 Mar 2009 19:08:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9453626</guid><dc:creator>James Waletzky</dc:creator><slash:comments>10</slash:comments><comments>http://blogs.msdn.com/progressive_development/comments/9453626.aspx</comments><wfw:commentRss>http://blogs.msdn.com/progressive_development/commentrss.aspx?PostID=9453626</wfw:commentRss><description>&lt;P mce_keep="true"&gt;&lt;U&gt;Summary&lt;/U&gt;&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0in; unicode-bidi: embed; DIRECTION: ltr; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.074in"&gt;
&lt;DIV style="DIRECTION: ltr"&gt;
&lt;TABLE style="BORDER-RIGHT-WIDTH: 0px; BORDER-COLLAPSE: collapse; DIRECTION: ltr; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" top?&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD style="BORDER-BOTTOM: #a3a3a3 1pt solid; BORDER-LEFT: #a3a3a3 1pt solid; PADDING-BOTTOM: 4pt; PADDING-LEFT: 4pt; WIDTH: 0.667in; PADDING-RIGHT: 4pt; VERTICAL-ALIGN: top; BORDER-TOP: #a3a3a3 1pt solid; BORDER-RIGHT: #a3a3a3 1pt solid; PADDING-TOP: 4pt"&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;&amp;nbsp;&lt;IMG src="http://waletzky.smugmug.com/photos/483462002_Vdpau-60x70.jpg" mce_src="http://waletzky.smugmug.com/photos/483462002_Vdpau-60x70.jpg"&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a3a3a3 1pt solid; BORDER-LEFT: #a3a3a3 1pt solid; PADDING-BOTTOM: 4pt; PADDING-LEFT: 4pt; WIDTH: 5.864in; PADDING-RIGHT: 4pt; VERTICAL-ALIGN: top; BORDER-TOP: #a3a3a3 1pt solid; BORDER-RIGHT: #a3a3a3 1pt solid; PADDING-TOP: 4pt"&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;Motley:&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Branches are too complicated. The last thing we need is a copy of the code that has to be maintained in two or more places!&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="BORDER-BOTTOM: #a3a3a3 1pt solid; BORDER-LEFT: #a3a3a3 1pt solid; PADDING-BOTTOM: 4pt; PADDING-LEFT: 4pt; WIDTH: 0.667in; PADDING-RIGHT: 4pt; VERTICAL-ALIGN: top; BORDER-TOP: #a3a3a3 1pt solid; BORDER-RIGHT: #a3a3a3 1pt solid; PADDING-TOP: 4pt"&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;&amp;nbsp;&lt;IMG src="http://waletzky.smugmug.com/photos/483461992_S6kZz-60x70.jpg" mce_src="http://waletzky.smugmug.com/photos/483461992_S6kZz-60x70.jpg"&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a3a3a3 1pt solid; BORDER-LEFT: #a3a3a3 1pt solid; PADDING-BOTTOM: 4pt; PADDING-LEFT: 4pt; WIDTH: 5.864in; PADDING-RIGHT: 4pt; VERTICAL-ALIGN: top; BORDER-TOP: #a3a3a3 1pt solid; BORDER-RIGHT: #a3a3a3 1pt solid; PADDING-TOP: 4pt"&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;Maven: Branches are source code copies with a tie back to a mainline set of code that allow for easy integration between copy and original set (and vice versa). Branches bring a level of isolation from mainline as well as keep the quality of mainline (and the daily builds) high.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;______________________________&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;&amp;nbsp;[Context: The company has been having lots of trouble with build breaks in mainline of late. General quality of the product mid-way through the development cycle is lower than expected]&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Motley: Somebody is going to get crazy glue stuck to their cup! The quality of our daily builds has been crap lately. Too many people checking in lousy code. Too may conflicts. Not enough time to get our mainline build stable and of high quality before the next check-in goes in.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Something has to be done.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Maven: Crazy glue? Ouch. If some moron did that to me I would pay them back big time - when they least expect it. Anyway, I agree with you - having a daily build of poor quality slows down everyone. The key is to isolate all the feature teams from one another giving them freedom to check-in yet keep the main build high quality.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Motley: Thanks for stating the obvious, Mave. Your haircut sucks. Now I stated the obvious too.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Maven: I thought I fixed that crooked sideburn! Ugh. There is a good way to accomplish this isolation. If you have a good source control system (like we do) such as Perforce or CVS, you can leverage a &lt;SPAN style="FONT-STYLE: italic"&gt;branch&lt;/SPAN&gt;.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Motley: Branches are for trees. What do they have to do with source code? Should I start working outside in the shade?&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Maven: Think of a branch as a more-involved copy of a collection of source code.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Motley: Why would I want to make a copy? Copies are fraught with problems, such as keeping multiple copies synchronized. And to think, I was expecting a good idea from you. Although pigs don't fly quite yet.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Maven: The digs keep coming! A branch is more than a copy. When you branch a source tree, you still maintain the tie to the original source code. Think of it like the trunk that a tree branch is connected to. You can bring forward changes in mainline to your branch, and bring back changes in your branch to mainline relatively easily. You can even work on the same source files in both places and merge the changes together in either direction. &lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Motley: And how would I do that? Keep them tied together, I mean.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Maven: You bring code forward to your branch from mainline and back to mainline from your branch through an &lt;SPAN style="FONT-STYLE: italic"&gt;integration&lt;/SPAN&gt;, or more specifically, a &lt;SPAN style="FONT-STYLE: italic"&gt;forward integration&lt;/SPAN&gt; (FI) and &lt;SPAN style="FONT-STYLE: italic"&gt;reverse integration&lt;/SPAN&gt; (RI) respectively. Here is an example of a tree structure I used in a previous role.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;&lt;A href="http://blogs.msdn.com/blogfiles/progressive_development/WindowsLiveWriter/MotleysaysBranchesarefortreesnotsourceco_130EB/clip_image001_6.jpg" mce_href="http://blogs.msdn.com/blogfiles/progressive_development/WindowsLiveWriter/MotleysaysBranchesarefortreesnotsourceco_130EB/clip_image001_6.jpg"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image001 border=0 alt=clip_image001 src="http://blogs.msdn.com/blogfiles/progressive_development/WindowsLiveWriter/MotleysaysBranchesarefortreesnotsourceco_130EB/clip_image001_thumb_1.jpg" width=508 height=248 mce_src="http://blogs.msdn.com/blogfiles/progressive_development/WindowsLiveWriter/MotleysaysBranchesarefortreesnotsourceco_130EB/clip_image001_thumb_1.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0in 0.375in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Mainline: The main source code depot where daily builds take place from&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0in 0.375in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Feature Branches: As many of these as necessary to support isolated feature teams&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0in 0.375in; FONT-FAMILY: calibri; FONT-SIZE: 11pt"&gt;Feature Sub-branches: Use only as necessary (e.g. a developer making major changes as part of a feature team)&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;Motley: That looks more complicated your morning routine! Do the benefits of a structure like that really outweigh the costs of doing all those integrations?&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Maven: As the consultant always says, "it depends". For a small overall team where not too many people are checking in to mainline, perhaps the structure is too much overhead. However, for larger teams, branches bring a level of isolation allowing features teams the freedom to do what they need to get the job done. In addition, a central build team could maintain mainline and have a very high quality bar for check-ins to mainline. Teams are only allowed to reverse integrate into mainline when they meet that bar.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Motley: And what does that bar typically involve?&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Maven: It depends on the team. For us, we may have a &lt;SPAN style="FONT-STYLE: italic"&gt;quality gate &lt;/SPAN&gt;in place that mandates the following when an RI is done:&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0in; unicode-bidi: embed; DIRECTION: ltr; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.75in" type=circle&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;All changes must have been code reviewed&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;All changes must have been gone through a test pass&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Test automation is in place for new features (if applicable)&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;New features have been stress and performance tested&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;No memory leaks have been detected by our tools&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;FxCop has been run and is violation-free on all changed code&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Unit tests have been executed and pass at 100%&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P style="MARGIN: 0in 0in 0in 0.75in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;You can basically go as thorough as you like. As you move up the branch hierarchy, the criteria to check-in gets lighter and lighter so as not to slow down the team. RI operations get stricter and stricter as you get closer to mainline. &lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Motley: Should every team have its own branch?&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Maven: Teams making changes to an isolated part of the code base with relatively few check-ins may not need a branch. Teams working on radical and risky changes or in common parts of the code base would likely benefit from a branch. Keep in mind, though, that the more levels of branching you have, the more overhead there is for integration operations. I recommend trying to stick to 1-2 levels of branching at most.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Motley: What about builds? We lose the advantage of having a central build team generate a daily build?&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Maven: Yes, that can be true. Hopefully you can take their infrastructure on a couple of machines that your feature team owns and duplicate the build there so that you have your own daily build and verification going for your feature. For small features, this may not be necessary. For large features, it is a huge benefit as you nail down problems quicker. If a build break happens due to a bad check-in, you catch it long before you hit mainline. As a result, you block fewer people. Everyone wins!&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Motley: Ok, Einstein. I have a you now. What if feature team A is working on some changes that feature team B needs to make further progress? You cannot go across branches. Hah!&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Maven: You have several options:&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0in; unicode-bidi: embed; DIRECTION: ltr; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.75in" type=circle&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Feature team A can &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;pack&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt; up the changes and pass them to Feature team B. Most source control systems support packing up a change list for distribution.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;You can do what's called a &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;baseless merge. &lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;I don't recommend doing this as it loses your source history. Essentially you do an integration across branches but lose the tie to mainline. Yuck.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;You can RI the changes of note to mainline with a test pass and then FI them up into Feature team B's branch. This doesn't work as well if the changes are in progress and not fully baked.&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P style="MARGIN: 0in 0in 0in 0.75in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Motley: I can think of another problem - my work in my branch can get out-of-date with what is going on with other teams. That may cause problems later.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Maven: True. The onus is on the feature team to ensure it FIs on a regular basis to keep up. Additionally, teams should not "go dark" from mainline for too long. Regular RIs to mainline should be happening, say, at the end of each sprint. For feature teams practicing Scrum, the code at the end of each sprint should be of shippable quality and can be RId back to mainline.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Motley: Also, merging in conflicting changes could be a real pain!&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Maven: Yes, but not if you have the right tools. A good merge tool automatically merges isolated changes in the same file (the majority case), and allows you to easily resolve conflicting changes. &lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Motley: You seem to have an answer for everything. Let me see if I understand this branching thing:&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0in; unicode-bidi: embed; DIRECTION: ltr; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.75in" type=circle&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Branching helps keep mainline quality high&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;A feature teams considers a branch to isolate its changes&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Branching provides more freedom for check-ins&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Quality gates are more strict the closer your branch is to mainline&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Branching ensures you don't lose ties to the original source code via integrations&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;A good tool makes integrations and merges relatively painless&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Maven: Nice summary. Why don't you go approach our beloved development manager and propose that our team undertake a branching model?&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Motley: I think I'll do just that.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt; FONT-WEIGHT: bold"&gt;______________________________&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;&lt;SPAN style="COLOR: navy; FONT-WEIGHT: bold"&gt;James' Pointer:&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;I am always amazed at how little discussion there is around source code branching. Branches are an incredibly useful software tool employed all over Microsoft for the reasons discussed above. Branches are particularly useful when you are an agile team in a large waterfall-based organization. They give you that level of isolation needed to follow your own effective processes yet still merge your changes in with mainline on a regular basis. Our team would be much less efficient without branches.&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;&lt;SPAN style="COLOR: navy; FONT-WEIGHT: bold"&gt;Maven's Resources:&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0in; unicode-bidi: embed; DIRECTION: ltr; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.75in" type=circle&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Wikipedia definition of branching: &lt;/SPAN&gt;&lt;A href="http://en.wikipedia.org/wiki/Branching_(software)"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;http://en.wikipedia.org/wiki/Branching_(software)&lt;/SPAN&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;(Tool) Beyond Compare: &lt;/SPAN&gt;&lt;A href="http://www.scootersoftware.com/moreinfo.php"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;http://www.scootersoftware.com/moreinfo.php&lt;/SPAN&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;(Tool) Araxis Merge: &lt;/SPAN&gt;&lt;A href="http://www.araxis.com/merge/"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;http://www.araxis.com/merge/&lt;/SPAN&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;(Paper) &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;Streamed Lines: Branching Patterns for Parallel Software Development&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;, by Appleton et al, 1998, &lt;/SPAN&gt;&lt;A href="http://www.hillside.net/plop/plop98/final_submissions/P37.pdf"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;http://www.hillside.net/plop/plop98/final_submissions/P37.pdf&lt;/SPAN&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;UL style="MARGIN-TOP: 0in; unicode-bidi: embed; DIRECTION: ltr; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.375in" type=disc&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-FAMILY: Calibri; FONT-SIZE: 11pt"&gt;This paper has many good branching tips embedded within it.&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/UL&gt;&lt;/UL&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9453626" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/progressive_development/archive/tags/quality/default.aspx">quality</category><category domain="http://blogs.msdn.com/progressive_development/archive/tags/build/default.aspx">build</category></item><item><title>Motley says: "The best way to control build breaks is to slap around the responsible developer"</title><link>http://blogs.msdn.com/progressive_development/archive/2007/09/11/motley-says-the-best-way-to-control-build-breaks-is-to-slap-around-the-responsible-developer.aspx</link><pubDate>Tue, 11 Sep 2007 19:03:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4850969</guid><dc:creator>James Waletzky</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/progressive_development/comments/4850969.aspx</comments><wfw:commentRss>http://blogs.msdn.com/progressive_development/commentrss.aspx?PostID=4850969</wfw:commentRss><description>&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri; TEXT-DECORATION: underline"&gt;Summary&lt;/P&gt;
&lt;P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Motley:&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The best way to control build breaks is to slap around the responsible developer.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Maven: Continuous integration is an agile technique that minimizes daily build failures and minimizes integration problems in real-time.&lt;/P&gt;
&lt;P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;______________________________&lt;/P&gt;
&lt;P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;[Context:&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Motley is expressing some frustration that his team keeps breaking the daily build]&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Motley: Damn! Yet another broken build last night. What is going on with this team? Lately we've had some really bad check-ins to source control causing issues with our daily build. The daily build is our lifeline here&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;- if a build is broken that means a good portion of the team is blocked. ARRRRGGGHHH!&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Maven: Calm down, bud. Why are the builds breaking?&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Motley: Combination of things. Sometimes people are sloppy and forget to add a file to their source control change list. The build works locally on their machine, but once another machine syncs and builds, all hell breaks loose. Other times, it is obvious the developer has not run the unit test suite prior to check-in and there is a functionality break. A further problem is conflicting check-ins between developers causing havoc when the central build runs. In addition, there are times when the developer obviously has not run static analysis tools, which could have found a few problems even before check-in.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Maven: All common problems in many software companies. And all should be preventable.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Motley: I agree! It's just sloppiness and I am getting tired of it. You trust devs to do the right thing and it doesn't happen. Time for the hammer to come down.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Maven: Don't jump to conclusions just yet. Devs get put under lots of pressure to meet deadlines and periodically things get overlooked. What we need to do is put a system in place that helps them limit their mistakes without much in the proactive action relying on memory.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Motley: Me slapping them upside the head ought to be enough for them to remember!&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Maven: The only time violence solves any problems is, well, I can't think of a scenario. Anyway, have you heard of "continuous integration"?&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Motley: I'm not quite ready to live with my girlfriend, thank you very much.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Maven: Always the comedian! One recommended practice in agile development circles, most notably Extreme Programming, is continuous integration. The idea is that developers should be integrating their code together at regular intervals to head off build breaks before the daily build takes place. Leaving integration until the daily build happens or worse, until the end of a coding cycle, is a proven recipe for disaster.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Motley: I agree, in principle. But, how do you do it? Do I have to walk around and make sure syncs and builds happen on a regular basis?&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Maven: Definitely not - tools to the rescue! One popular application in the .NET community is a free tool called &lt;A href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET"&gt;CruiseControl.NET&lt;/A&gt;. You set it up on a server somewhere and have it monitor your source control&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;system for check-ins. It works with many different types of source control systems, including Perforce, CVS, SourceSafe and others.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Once a check-in happens, the server takes over and performs whatever actions you want it to - most notably, a sync and build of the complete system. You can even set it up to run other actions like a unit test suite, static analysis, or others.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Motley: Sweet! You mean once the server is set up it will do all of this on its own without manual intervention??&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Maven: You bet! Individual developers can monitor the results by using either (a) a web site that they hit for integration status; (b) a Windows tray application that always indicates current build status (red icon = failure; green icon = successful run); or (c) an e-mail notification. It will track historical runs and tell you what change list triggered the run. &lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Motley: Oh, I must say, that is way cool! Now we don't have to babysit developers, and the code is being integrated constantly. That should definitely cut down on build breaks. How long does it take to set up?&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Maven: All you need is a machine capable of performing builds, the CC.NET installation package, and an installation of IIS and ASP.NET if you want to use the web portal. Give it an hour or so to set up and you'll be off and running.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Motley: I am definitely going to try this out. It would be even cooler if Visual Studio had this kind of functionality built in.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Maven: Your wish is Microsoft's command! Visual Studio 2008 ("Orcas") Team Foundation Server supports&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;continuous integration. You can specify a trigger for a build when you create a new build definition or modify an existing one. You can use on-demand builds, rolling builds, and continuous integration where each check-in starts a build.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;This all integrates with Visual Studio source control support.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Motley: Not bad, Mave. Now give me some more information on how I can get you out of my hair for a couple of hours so I can get this stuff implemented and communicated to the team.&lt;/P&gt;
&lt;P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;______________________________&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: navy"&gt;Maven's Pointer:&lt;/SPAN&gt; Continuous integration (CI) is quickly becoming a mandatory practice for all development shops. Risk of breaking the software is substantially decreased, and as a result, the team becomes more efficient by minimizing blockages due to build breaks. In addition, you integrate as you go and avoid the "big bang" integration at the end. Also, since build breaks flagged by a CI tool are immediate and generally tied to one or two changes to the source, it is easy to narrow down the problem and fix it.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: navy"&gt;Maven's Resources:&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0in; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.375in; DIRECTION: ltr; unicode-bidi: embed" type=circle&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;A href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET"&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"&gt;CruiseControl.NET&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"&gt; - &lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-STYLE: italic; FONT-FAMILY: Calibri"&gt;free &lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"&gt;server-based continuous integration for .NET projects&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;A href="http://blogs.msdn.com/buckh/archive/2007/04/23/orcas-beta-1-has-shipped-summary-of-team-build-beta-1-features-and-links.aspx"&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"&gt;Blog summary&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"&gt; describing changes in Visual Studio 2008 Team System for builds&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"&gt;Extreme Programming practice description for &lt;/SPAN&gt;&lt;A href="http://extremeprogramming.org/rules/integrateoften.html"&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"&gt;continuous integration&lt;/SPAN&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"&gt;Martin Fowler's description of &lt;/SPAN&gt;&lt;A href="http://www.martinfowler.com/articles/continuousIntegration.html"&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"&gt;continuous integration&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"&gt; (&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-STYLE: italic; FONT-FAMILY: Calibri"&gt;great &lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"&gt;write-up)&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4850969" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/progressive_development/archive/tags/agile/default.aspx">agile</category><category domain="http://blogs.msdn.com/progressive_development/archive/tags/build/default.aspx">build</category></item></channel></rss>