<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dutch Guy Building</title>
	<atom:link href="http://www.dutchguybuilding.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dutchguybuilding.com</link>
	<description>I build stuff on the Internet</description>
	<lastBuildDate>Mon, 10 May 2010 21:20:48 +0000</lastBuildDate>
	<generator>http://wordpress.org/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Subversion Branch/Merge Strategies</title>
		<link>http://www.dutchguybuilding.com/2010/04/29/subversion-branchmerge-strategies/</link>
		<comments>http://www.dutchguybuilding.com/2010/04/29/subversion-branchmerge-strategies/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 22:18:27 +0000</pubDate>
		<dc:creator>RvO</dc:creator>
				<category><![CDATA[build management]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[linkedin]]></category>

		<guid isPermaLink="false">http://www.dutchguybuilding.com/?p=95</guid>
		<description><![CDATA[
Subversion is many things, but it&#8217;s not all things to all people. The project set out to create a better CVS, and that is largely what Subversion has been so far.
As a result of design decisions made early on, and a firm commitment to backwards compatibility, the project &#8211; at least until a 2.0 release [...]]]></description>
			<content:encoded><![CDATA[
<p>Subversion is many things, but it&#8217;s not all things to all people. The project set out to create a better CVS, and that is largely what Subversion has been so far.</p>
<p>As a result of design decisions made early on, and a firm commitment to backwards compatibility, the project &#8211; at least until a 2.0 release &#8211; is locked in to its limitations. Merging, and more specifically merge tracking, has been a huge pain in the backside for large numbers of users.</p>
<p>The 1.5 release was mostly a lateral move from the <code>svnmerge.py</code> project, and subsequent releases did little more than patch a few of  the more glaring holes in the original implementation, although conflict handling has seen dramatic improvements.</p>
<p>So how do we play into Subversion&#8217;s strengths without playing into its weaknesses? My answer to that is 4-fold:<br />
<span id="more-95"></span><br />
1) Merge strategy</p>
<p>It may seem backwards to talk about this first rather than branching, but merging is way more complicated than branching, and so the peculiarities and limitations of merging in SVN may very well dictate you branch strategy, so I feel it&#8217;s important to understand the parameters of your options in this area, make the appropriate choices, and work backwards from there.</p>
<p>Merge tracking in SVN, although much improved over past releases, is still very much a work in progress. Your desired approach relies heavily on SVN&#8217;s ability to keep track of cherry-picked merges. To keep from hitting SVN&#8217;s current limitations, you&#8217;ll want to keep your merges very straight-forward, and be VERY careful to understand exactly what you&#8217;re doing when deviating from the model I&#8217;m outlining. SVN is very flexible and will let you get into all kinds of situations you&#8217;re not going to want to be in without adult supervision. The smart thing to do is to constantly ask yourself &#8220;I <em><strong>could</strong></em> do it this way, but <strong><em>should</em></strong> I?&#8221;</p>
<p>For example: you <strong><em>can</em></strong> merge files individually, but SVN is built around atomic revisions that generally contain changes to multiple files. SVN&#8217;s merge tracking feature attempts to keep track of partial merges of revisions, but is imperfect in this regard, so to avoid losing track of what has and hasn&#8217;t been merged, you <strong><em>should</em></strong>:</p>
<p>a) educate developers to not commit changes related to multiple issues at once<br />
b) only ever merge entire revisions. I can&#8217;t stress this enough: never merge partial revisions.<br />
c) if issues are or do happen to become legitimately intertwined, track them accordingly and not allow them to be merged/built/released independently.</p>
<p>2) Branch strategy</p>
<p>Now that we&#8217;ve established the parameters for how to keep merges manageable, the rest is fairly straight-forward in that it&#8217;s mostly dictated by this merge strategy.</p>
<p>You create a branch for a limited set of changes (project, set of bugs/enhancements, whatever the case may be). This in and of itself is smart. The concern is obviously that &#8220;what if I don&#8217;t want to merge/release/build everything on the branch, but rather a subset of these changes?&#8221;. The answer to that is &#8211; as is often the case &#8211; &#8220;it depends.&#8221;</p>
<p>You can either:</p>
<p>a) create a temporary integration branch (based on trunk), merge the changes you do want to it from the original branch, resolve any integration issues, and merge changes back to your trunk the same way you would otherwise. Scrap the integration branch (archive or remove) when it&#8217;s served its purpose. Branches are version-controlled in SVN, so you can always go back and restore one if need be.<br />
b) selectively merge revisions from your branch back to trunk and resolve any integration issues on trunk.<br />
c) merge trunk changes to your branch, resolve integration issues on the branch, and reintegrate your branch with trunk.</p>
<p>Following this model, you are never more than 1 step removed from trunk (i.e. you&#8217;re either on a trunk or on a branch, and a branch is always created from trunk), and changes never get merged more than twice (i.e. either from trunk to branch, from branch to trunk, or from branch to integration branch to trunk).</p>
<p>Depending on the scenario (changes in question, whether the merge is partial or complete) you *should* be going in one of these three directions. The important thing to remember, is that whenever you merge trunk changes into the branch, you should ALWAYS reintegrate that branch in its entirety. Of course, once you understand the rule, you can break the rule, but I wouldn&#8217;t go down that road unless I had an expert at SVN/SCM to manage the heavy lifting it will almost certainly involve, either immediately or eventually.</p>
<p>3) Hire an expert</p>
<p>Most companies still look at build/SCM work as something to volunteer a junior developer for. Few decisions will get you into trouble faster, or limit the effectiveness of the position more, than going this route. Build/configuration/release management is a skill set and I would even argue an art form all on its own. <a href="http://www.dutchguybuilding.com/2010/01/04/the-business-case-for-build-manager/">I cannot stress enough</a> the value the right resource in that chair will bring to the table. The time and money saved, not having to deal with the immediate and ripple effects of issues that shouldn&#8217;t or don&#8217;t need to be, can save a project, or even a business.</p>
<p>4) Tools</p>
<p>Possibly the most important tool in all of this is what you use to keep track of all the information involved in doing the above and not miss something along the way. You&#8217;ll want to be using a tool that can</p>
<p>a) keep track of your issues (should be obvious, right?)<br />
b) keep track of the relationships between your issues and use these relationships to automate notifications to developers when upstream issues change, possibly affecting downstream dependent issues (this eliminates the bulk of tools out there)<br />
c) relate SVN revisions to issues<br />
d) provide top-to-bottom traceability across all of the above</p>

]]></content:encoded>
			<wfw:commentRss>http://www.dutchguybuilding.com/2010/04/29/subversion-branchmerge-strategies/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>So you just became a build manager, now what?</title>
		<link>http://www.dutchguybuilding.com/2010/01/05/the-business-case-for-build-manager-part2/</link>
		<comments>http://www.dutchguybuilding.com/2010/01/05/the-business-case-for-build-manager-part2/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 13:00:17 +0000</pubDate>
		<dc:creator>RvO</dc:creator>
				<category><![CDATA[build management]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[linkedin]]></category>

		<guid isPermaLink="false">http://www.dutchguybuilding.com/?p=77</guid>
		<description><![CDATA[
(continued from here)
First and foremost, an organization&#8217;s choice to make build management a priority is a strategic one. So the role has to be filled by someone who can think and operate at that level, as well as get their hands dirty and do the work on a tactical level. It&#8217;s a careful balance of [...]]]></description>
			<content:encoded><![CDATA[
<p><em>(continued from <a href="http://www.dutchguybuilding.com/2010/01/04/the-business-case-for-build-manager/" target="_self">here</a>)</em></p>
<p><em>First and foremost, an organization&#8217;s choice to make build management a priority is a strategic one. So the role has to be filled by someone who can think and operate at that level, as well as get their hands dirty and do the work on a tactical level. It&#8217;s a careful balance of big picture vs. &#8220;stuff needs to get done today&#8221;. No matter how good you are, you&#8217;re not going to be able to do it all at once, all of the time, so planning and managing your time is critical, especially if you&#8217;re juggling a lot of different projects at once.</em></p>
<p>These are some of the key lessons I learned along the way.<br />
<span id="more-77"></span></p>
<h3>Not too much, not too fast</h3>
<p>Give yourself time to get your bearings and make sure you really understand the environment you&#8217;re in. Depending on experience and the complexity of the situation, this can take days or even weeks.</p>
<p>Once you feel ready to dive in, limit yourself to one project, or account, or application, and find something you can do in no more than a day, something that isn&#8217;t going to start a domino effect you won&#8217;t be able to control. The key concept here is bite-size. Whenever you notice something that just doesn&#8217;t look or feel right, but it&#8217;s too big or tangled up to tackle right then &amp; there, take notes. When you run out of things to fix, go back to your list and find something new to sink your teeth into. Make a habit of this. It&#8217;s a great way to stay fresh and productive once you have everything working just right and things just run along smoothly. The worst thing you can ever do is nothing. Slow is smooth, smooth is fast.</p>
<h3>Change is hard</h3>
<p>Humans are creatures of habit. Most people aren&#8217;t wired for rapidly changing, dynamic environments. And most people that do will generally prefer a solid foundation of routine for balance. The decision to start investing in build management can only mean that there&#8217;s going to be some changes, and they can fundamentally affect the way people do their jobs, and how and to what extent they&#8217;re going to be held personally accountable for the quality of their work. I find that the trick is to just start changing small, seemingly innocuous things, and pretty soon teams are used to the new routine of continuous improvement. The secret to making this work is to not screw up. If you are occasionally human and stumble, eat your humble pie, fix what you broke and make sure you don&#8217;t make the same mistake twice. You&#8217;ll be surprised at how much you can get away with if you follow these simple steps.</p>
<h3>If you can script it, you shouldn&#8217;t be doing it</h3>
<p>Nothing destroys the reliability of any process faster than having it be manual. People make mistakes, to expect them not to is fundamentally unfair. If your process is going to be predictable, repeatable, reliable, and fast, it simply has to be automated. It&#8217;s also the only way you&#8217;re going to be able to implement <a href="http://www.startuplessonslearned.com/2008/12/continuous-integration-step-by-step.html" target="_blank">continuous integration</a>, <a href="http://radar.oreilly.com/2009/03/continuous-deployment-5-eas.html" target="_blank">continuous deployment</a>, continuous anything.</p>
<h3>If you can&#8217;t script it, you&#8217;re not doing it right</h3>
<p>See above. I can&#8217;t stress enough how important this is.</p>
<h3>If it breaks once, something automated should catch it if it happens again</h3>
<p>There&#8217;s an old Dutch saying that roughly translates to: &#8220;even a donkey generally doesn&#8217;t knock into the same rock twice.&#8221; There are few things that will ruin my day faster than running into the same problem twice. Proponents of <a href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank">test-driven development</a> will be familiar with the concept: if something breaks, write a test that catches it, fix the problem, and now your test passes. If the problem ever regresses, the test should fail again, and you catch it before it gets any further.</p>
<p>In production environments, operational issues should be caught and reported on by monitoring tools such as <a href="http://www.nagios.org/" target="_blank">Nagios</a>. Again, if it happens once, find out how it could and should have been caught sooner, and put the necessary controls in place.</p>
<h3>It probably wasn&#8217;t your fault, but it is your problem to fix</h3>
<p>Being the bottleneck means everything the team does crosses your desk at some point. Generally the only other person on the project who touches everything is the project manager, but he or she is most likely not nearly as technical as you, and won&#8217;t be able to zero in on the root cause nearly as fast as you can. Make a habit of not passing the buck. The faster everyone gets to the bottom of what went wrong, the faster everything gets back to normal.</p>
<p>This puts you in a position to drive root cause analysis in a way that helps prevent future problems, especially those of a human/organizational nature. I like <a href="http://www.startuplessonslearned.com/2008/11/five-whys.html" target="_blank">this piece</a> on a concept called &#8220;Five Whys&#8221; a lot. It&#8217;s simple and elegant. If you&#8217;re not using this, you should be using something very much like this.</p>

]]></content:encoded>
			<wfw:commentRss>http://www.dutchguybuilding.com/2010/01/05/the-business-case-for-build-manager-part2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The business case for hiring a build manager</title>
		<link>http://www.dutchguybuilding.com/2010/01/04/the-business-case-for-build-manager/</link>
		<comments>http://www.dutchguybuilding.com/2010/01/04/the-business-case-for-build-manager/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 22:13:06 +0000</pubDate>
		<dc:creator>RvO</dc:creator>
				<category><![CDATA[build management]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[linkedin]]></category>

		<guid isPermaLink="false">http://www.dutchguybuilding.com/?p=69</guid>
		<description><![CDATA[
Lately, I&#8217;ve been thinking a lot about the discrepancy between the number of people in my network telling me &#8220;we could really use for you to come in and sort out  this mess of ours&#8221;, and the number of actual build management jobs/contracts that seem to be actually out there.
In the past, I&#8217;ve come across [...]]]></description>
			<content:encoded><![CDATA[
<p>Lately, I&#8217;ve been thinking a lot about the discrepancy between the number of people in my network telling me &#8220;we could really use for you to come in and sort out  this mess of ours&#8221;, and the number of actual build management jobs/contracts that seem to be actually out there.</p>
<p>In the past, I&#8217;ve come across a few cases where the position seemed so hard to recruit for, that a company would simply not bother to advertise the vacancy, and instead rely on either filling the position internally, or have someone referred to them. Over the past year, I&#8217;ve come to realize that this is simply not the predominant case.</p>
<p><span id="more-69"></span>The real problem seems to be that on the operational level, people understand the value a build manager brings to the table, either intuitively or by experience. On the decision-making level however, while that same understanding may also exist, the challenge is quantifying the benefit to justify the expense. Since</p>
<ol>
<li>a build  manager isn&#8217;t always perceived as contributing to the deliverable (software), but</li>
<li><em>is</em> billable (contributing to the client invoice),</li>
<li>the cost (i.e. salary) is obvious,</li>
<li>there is a generally accepted (at least in the agency/consulting world) non-monetary cost of teams working long days and even weekends as a result of those inefficiencies that would typically be mitigated by hiring a build manager (seeing as how non-trivial overtime compensation is rare, even in cases where the client <em>is</em> getting billed for these hours), and</li>
<li>the accountability for hiring a build manager (salary) and the cost of not doing so (project inefficiencies, overages, shrinking margins, etc.) is generally with different people (e.g. management and project management respectively),</li>
</ol>
<p>decision-makers are generally reluctant to explore the fuzzier benefit side of the equation, because all they see clearly is how much money it will cost in salary, which is all they&#8217;re likely to have to explain themselves for.</p>
<p>So let me try and summarize:</p>
<ul>
<li><span style="font-weight: normal; font-size: 13px;">The principal job of a build manager is to automate him/herself out of a job. Predictable builds make for predictable results, which makes setting and meeting deadlines a whole lot easier. </span></li>
<li><span style="font-weight: normal; font-size: 13px;">If you can actually count on X amount of work taking Y amount of time to complete, without the process of moving changes through the various test environments to production becoming a problem in and of itself, you can count on your margins, everyone makes money, and everyone gets to go home and have lives.</span></li>
<li><span style="font-weight: normal; font-size: 13px;">Happy employees don&#8217;t quit, so you can count on reduced turnover. </span></li>
<li><span style="font-weight: normal; font-size: 13px;">Since you can count on your timelines better than before, you can now be more aggressive in your estimates, making you more competitive when bidding on projects. </span></li>
<li><span style="font-weight: normal; font-size: 13px;">Better value for money makes for happier customers. Happy customers don&#8217;t shop for better deals. Now you can count on losing fewer clients, and having to spend less time and money attracting new ones. Your sales and marketing teams can now actually focus on growing your business, rather than fighting to sustain it.</span></li>
</ul>
<p>Now obviously, there is more to it than simply hiring someone marketing themselves for the role, or claiming to have the experience and/or expertise. So you will need to understand what you&#8217;re actually going to be expecting your build manager to do for you. Give them too little control, and they&#8217;ll be limited in what they can do to help. Give them too much responsibility, and they&#8217;ll be stretched too thin, and things start slipping through the cracks. In my experience, in small to medium-sized organizations, your build manager needs to have control and ownership over at least:</p>
<ol>
<li>Your version control environment(s), including but not limited to tool administration, branch/merge processes, standards and best practices.</li>
<li>Your automated build / continuous integration environment(s).</li>
<li>All Test, QA, UAT, etc. environments; this is critically important: if developers are permitted to manipulate these environments unsupervised, you <strong>will</strong> lose predictability of your process, which <em>will</em> severely limit and ultimately defeat the purpose of having a build manager in the first place. You do not want your build manager to be reduced to a crisis manager.</li>
<li>All builds and deployments to all non-development environments; again, this is critically important: the <em>only</em> way to guarantee that the process works, is to enforce it at all times. If the process is too restrictive, it needs to be adjusted, not circumvented.</li>
<li>In the case of web development, and if at all possible: setup and configuration of the production environment. All other environments are ultimately derivatives of this, so it&#8217;s ideally where the standard is set.</li>
</ol>
<p>At this point you may think to yourself: that&#8217;s an awful lot of responsibility for one person to carry. And you&#8217;d be right, it is. Which is why filling the position with a relatively junior developer, or worse, on a rotating basis, simply will not do. It is just a terrible idea on so many levels. You need someone with the obvious skills to do all of the above, and command the respect and deference of the team. You also need a strong enough personality to stand up to, and deal with any conflict or disagreement that is bound to occur in any high-pressure environment. And you need someone who does not already have an established place in the development team&#8217;s pecking order, unless that place is firmly at the top.</p>
<p>A build manager is a gatekeeper and, as a natural consequence, a potential bottleneck in the process. This takes a <em>lot</em> of practice, confidence, patience, humility, and ultimately a bond of mutual respect and trust that can only be forged over time. And last but not least, you need to expect some growing pains.</p>
<p><em>(to be continued)</em></p>

]]></content:encoded>
			<wfw:commentRss>http://www.dutchguybuilding.com/2010/01/04/the-business-case-for-build-manager/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Note to developers everywhere: you are not a snowflake, and neither is your project.</title>
		<link>http://www.dutchguybuilding.com/2010/01/01/note-to-developers-everywhere/</link>
		<comments>http://www.dutchguybuilding.com/2010/01/01/note-to-developers-everywhere/#comments</comments>
		<pubDate>Fri, 01 Jan 2010 19:49:44 +0000</pubDate>
		<dc:creator>RvO</dc:creator>
				<category><![CDATA[build management]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[linkedin]]></category>

		<guid isPermaLink="false">http://www.dutchguybuilding.com/?p=58</guid>
		<description><![CDATA[
Came across this rambling piece of Maven hatred, and it gave me a good chuckle. While the author makes some valid points, his argument is rather clouded by his obvious love affair with Rake and &#8211; to a lesser degree &#8211; Ant. In a few spots, he&#8217;s grossly misinformed, reaching, or just plain wrong. While [...]]]></description>
			<content:encoded><![CDATA[
<p>Came across <a href="http://kent.spillner.org/blog/work/2009/11/14/java-build-tools.html" target="_blank">this</a> rambling piece of <a href="http://maven.apache.org" target="_blank">Maven</a> hatred, and it gave me a good chuckle. While the author makes <em>some</em> valid points, his argument is rather clouded by his obvious love affair with <a href="http://rake.rubyforge.org/" target="_blank">Rake</a> and &#8211; to a lesser degree &#8211; <a href="http://ant.apache.org/" target="_blank">Ant</a>. In a few spots, he&#8217;s grossly misinformed, reaching, or just plain wrong. While there are certainly reasons to choose a tool other than Maven for a given project (i.e. any deliverable the format of which Maven doesn&#8217;t support out of the box), there is simply no denying that it has its place in the tool box.</p>
<p>What&#8217;s more interesting to me than his overtly subjective rant thinly disguised as analysis, is the overarching notion that every project has its own, unique needs. The reality is that in the overwhelming majority of cases, it doesn&#8217;t. It. Just. Doesn&#8217;t. Just because you <em>can</em> do something in a non-standard way, doesn&#8217;t mean there&#8217;s a need to, or that the benefit of doing something <em>your</em> way outweighs the cost of not following whatever the convention (tool-enforced or otherwise) is.<span id="more-58"></span></p>
<p>The author obviously comes from a consulting background (as alluded to <a href="http://kent.spillner.org/blog/life/work/2009/11/13/something-different.html" target="_blank">here</a>), and consultants generally have the luxury of only being around their handiwork for a limited amount of time, after which the hot mess of long-term maintenance and support &#8211; along with all the skeletons you had to cram in the closet to make your go-live date &#8211; become someone else&#8217;s problem. As a result, the true cost of implementing a custom, proprietary build process is mostly hidden from its creators. What makes sense initially and for the duration of an implementation track, doesn&#8217;t necessarily make sense in the long run, once you factor in the learning curve and the cost of supporting and maintaining your fancy homegrown build process.</p>
<p>Maybe, just maybe, conventional build processes work for conventional deliverables. Maybe, just maybe, the conventional wisdom is actually wisdom. I&#8217;ve spent enough time fixing other people&#8217;s build processes over the past decade or so to know that, generally speaking, when developers are let of the leash long enough to whip up something &#8216;custom&#8217;, the driving force is generally &#8216;to do something interesting or cool&#8217; before it is actually solving an actual problem. And while the solution may in and of itself be good, the very fact that it&#8217;s different from anything else often becomes its own world of trouble.</p>
<p>What I&#8217;ve learned more than anything is that building software &#8211; like developing it &#8211; is its own discrete art form, and one developers tend to suck at. Not for lack of skill, but for lack of focus, and oftentimes a blatant conflict of interest. There is virtue and value in doing things the &#8216;conventional&#8217; way, whatever that may be. And for all its faults, Maven lets you hit the ground running. You can&#8217;t honestly compare it to Rake/<a href="http://raven.rubyforge.org/" target="_blank">Raven</a>/Ant without considering the cost of building, maintaining and supporting a company-standard toolkit based on any of those three, that gives you the functionality you get from Maven out of the box. It&#8217;s entirely likely that there are organizations that have legitimately unique needs and requirements, or that operate on a scale where the benefit of a (relatively) custom tool stack outweighs its cost. I will however argue that you, the reader, are far more likely to not work for one.</p>

]]></content:encoded>
			<wfw:commentRss>http://www.dutchguybuilding.com/2010/01/01/note-to-developers-everywhere/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Distributed Version Control &#8211; Bridging the Gap to the Enterprise</title>
		<link>http://www.dutchguybuilding.com/2009/11/03/distributed-version-control-bridging-the-gap/</link>
		<comments>http://www.dutchguybuilding.com/2009/11/03/distributed-version-control-bridging-the-gap/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 20:21:49 +0000</pubDate>
		<dc:creator>RvO</dc:creator>
				<category><![CDATA[alm]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[linkedin]]></category>

		<guid isPermaLink="false">http://www.dutchguybuilding.com/?p=34</guid>
		<description><![CDATA[
I&#8217;ve been spending a lot of time reading about and playing with distributed version control tools (DSCM) recently, particularly Git and Mercurial, which seem to be the two primary players in this space at the moment.
While Git certainly has its followers (Android being a prominent one), Mercurial offers pretty much the same range of features, [...]]]></description>
			<content:encoded><![CDATA[
<p>I&#8217;ve been spending a lot of time reading about and playing with distributed version control tools (DSCM) recently, particularly <a href="http://git-scm.com/">Git</a> and <a href="http://mercurial.selenic.com/">Mercurial</a>, which seem to be the two primary players in this space at the moment.</p>
<p>While Git certainly has its followers (Android being a prominent one), Mercurial offers pretty much the same range of features, in a much more user-friendly package. The latter got a shot in the arm with Google Code <a href="http://googlecode.blogspot.com/2009/04/mercurial-support-for-project-hosting.html">announcing their support</a> for it earlier this year.</p>
<p>What I&#8217;ve been asking myself is: will this technology work in the enterprise?<br />
<span id="more-34"></span><br />
There are a number of obvious concerns, which are closely tied to the stated advantages of DSCMs:</p>
<ol>
<li><b>There is no server / Everyone is their own server.</b> Companies rely on the centralized repository concept to manage backups. The model ensures that anything that is committed to version control, lives in a safe place, and is accessible to all those who need and have appropriate permission. While DSCMs allow for the creation of de facto servers, and processes can be defined to enforce some measure of good order, any such scheme relies almost exclusively on individual cooperation, and tools offer little or no help by way of auditing compliance. In many ways, a DSCM&#8217;s greatest strength is its greatest weakness.
<li><b>What doesn&#8217;t exist, can&#8217;t be secured.</b> Without a centralized server that everyone is forced to read from and write to, how can fine-grained access control (particularly read access) be implemented? The current crop of tools doesn&#8217;t cater to this at all: every user essentially has read/write access to anything they can get their hands on. Only when pushing your changes to another user or &#8217;server&#8217; you may encounter write restrictions. This is going to be an instant deal breaker for a lot of organizations. Someone needs to come up with a solution to this problem for DSCMs to gain broad commercial appeal the way Subversion has.
<li><b>Who&#8217;s working on what, where and how do I get my hands on it?</b> If development is distributed, how is this then reconciled with a presumably centralized ALM (Application Life cycle Management, i.e. task/issue/defect/project/requirements management) solution? For development to be truly distributed, developers need a distributed ALM solution as well. How this looks in practice or even conceptually, now <b>that&#8217;s</b> where someone is going to make a name for themselves.<br />

]]></content:encoded>
			<wfw:commentRss>http://www.dutchguybuilding.com/2009/11/03/distributed-version-control-bridging-the-gap/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>AccessSVN 1.0.0 Released</title>
		<link>http://www.dutchguybuilding.com/2008/10/23/accesssvn-100-released/</link>
		<comments>http://www.dutchguybuilding.com/2008/10/23/accesssvn-100-released/#comments</comments>
		<pubDate>Thu, 23 Oct 2008 15:32:33 +0000</pubDate>
		<dc:creator>RvO</dc:creator>
				<category><![CDATA[news]]></category>
		<category><![CDATA[subversion]]></category>

		<guid isPermaLink="false">http://www.dutchguybuilding.com/2008/10/23/accesssvn-100-released/</guid>
		<description><![CDATA[
For the past few months I&#8217;ve been product-managing a new Subversion management tool called AccessSVN, and today it&#8217;s been officially released.
If you support a large number of SVN users, and you need to manage permissions, this is the only tool on the market for you today. I highly recommend you get yourself a 30-day evaluation [...]]]></description>
			<content:encoded><![CDATA[
<p>For the past few months I&#8217;ve been product-managing a new Subversion management tool called <a href="http://www.polarion.com/products/svn/access_svn.php">AccessSVN</a>, and today it&#8217;s been officially released.</p>
<p>If you support a large number of SVN users, and you need to manage permissions, this is the only tool on the market for you today. I highly recommend you get yourself a 30-day evaluation license and see for yourself at <a href="http://www.polarion.com/products/svn/access_svn.php">http://www.polarion.com/products/svn/access_svn.php</a>. When you do, let me know what you think in the comment thread of this post.</p>

]]></content:encoded>
			<wfw:commentRss>http://www.dutchguybuilding.com/2008/10/23/accesssvn-100-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Wasserman Principle, Part I</title>
		<link>http://www.dutchguybuilding.com/2008/09/25/the-wasserman-principle-part-i/</link>
		<comments>http://www.dutchguybuilding.com/2008/09/25/the-wasserman-principle-part-i/#comments</comments>
		<pubDate>Thu, 25 Sep 2008 18:32:26 +0000</pubDate>
		<dc:creator>RvO</dc:creator>
				<category><![CDATA[build management]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[entropy]]></category>
		<category><![CDATA[project management]]></category>

		<guid isPermaLink="false">http://www.dutchguybuilding.com/2008/09/25/the-wasserman-principle-part-i/</guid>
		<description><![CDATA[
There is this crazy theory I&#8217;ve been working on, on and off for probably over a year now. I&#8217;m calling it The Wasserman Principle. I got sidetracked for a while, but I&#8217;ve been wanting to finish this. In its present form it&#8217;s a rambling, unfinished document that needs some work. I&#8217;m going to start editing [...]]]></description>
			<content:encoded><![CDATA[
<p>There is this crazy theory I&#8217;ve been working on, on and off for probably over a year now. I&#8217;m calling it <b>The Wasserman Principle</b>. I got sidetracked for a while, but I&#8217;ve been wanting to finish this. In its present form it&#8217;s a rambling, unfinished document that needs some work. I&#8217;m going to start editing and revising from the top and release hopefully coherent bits and pieces as I go. So here it is, part 1 of TBD.</p>
<p>With every intended change to software, there is a probability that unintended, unforeseen or unrelated issues will be introduced, triggered or uncovered. These issues need to be addressed as part of the primary work at hand, or deferred. The probability of such issues arising is driven by a number of factors, including, but not necessarily limited to:</p>
<ol>
<li>Software that undergoes continuous change, such as having new functionality added to its original design, will eventually become more complex and can become disorganized as it grows, losing its original design structure. This is the <a href="http://www.webopedia.com/TERM/S/software_entropy.html">textbook definition</a> of <b>Software Entropy</b>.
<li>The tendency for a software development organization to be good at some things, and not as good at others. For example: a company may be good at building large applications, but not as good at supporting them (bug fixes, relatively minor enhancements; I&#8217;ve worked with and for a few consulting companies over the years that fit this bill), while another company may excel at smaller projects, but struggle with very large ones.
</ol>
<p><span id="more-15"></span></p>
<p>For the purpose of this theory, entropy (<i>E</i>) is defined as “the probability that intended changes (<i>C</i>) cause something else to break (<i>I</i>).” By keeping track of the actual values for <i>I</i> and <i>C</i>, you can deduce <i>E</i> for your project or organization:</p>
<p><code>E = I / C</code></p>
<p>With a historical value for E in hand, and for a given number of future changes, issues can be crudely forecasted:</p>
<p><code>I = C * E</code></p>
<p>So far the math is very simple but abstract, and as a result not very usable in any kind of real-life scenario. I&#8217;ll be adding more and more layers of complexity and detail as we get deeper into the subject matter, but this is enough for now.</p>

]]></content:encoded>
			<wfw:commentRss>http://www.dutchguybuilding.com/2008/09/25/the-wasserman-principle-part-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I need a hug</title>
		<link>http://www.dutchguybuilding.com/2008/09/25/i-need-a-hug/</link>
		<comments>http://www.dutchguybuilding.com/2008/09/25/i-need-a-hug/#comments</comments>
		<pubDate>Thu, 25 Sep 2008 17:30:05 +0000</pubDate>
		<dc:creator>RvO</dc:creator>
				<category><![CDATA[funny]]></category>

		<guid isPermaLink="false">http://www.dutchguybuilding.com/2008/09/25/i-need-a-hug/</guid>
		<description><![CDATA[
 

]]></description>
			<content:encoded><![CDATA[
<p><embed src="http://blip.tv/play/gYwjwZJqjdEh" type="application/x-shockwave-flash" width="640" height="390" allowscriptaccess="always" allowfullscreen="true"></embed> </p>

]]></content:encoded>
			<wfw:commentRss>http://www.dutchguybuilding.com/2008/09/25/i-need-a-hug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wagons West!</title>
		<link>http://www.dutchguybuilding.com/2008/03/11/wagons-west/</link>
		<comments>http://www.dutchguybuilding.com/2008/03/11/wagons-west/#comments</comments>
		<pubDate>Tue, 11 Mar 2008 21:01:31 +0000</pubDate>
		<dc:creator>RvO</dc:creator>
				<category><![CDATA[events]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[travel]]></category>

		<guid isPermaLink="false">http://www.dutchguybuilding.com/2008/03/11/wagons-west/</guid>
		<description><![CDATA[
I&#8217;ll be at EclipseCon next week as part of the Polarion delegation. For the most part I&#8217;ll be behind the scenes, but I should get a chance to open my mouth  in the Subversion BOF we&#8217;re hosting Monday night.


]]></description>
			<content:encoded><![CDATA[
<p>I&#8217;ll be at <a href="http://www.eclipsecon.org">EclipseCon</a> next week as part of the <a href="http://www.polarion.com">Polarion</a> delegation. For the most part I&#8217;ll be behind the scenes, but I should get a chance to open my mouth  in the <a href="http://www.eclipsecon.org/2008/?page=sub/&#038;id=607">Subversion BOF</a> we&#8217;re hosting Monday night.</p>
<p><a href="http://www.eclipsecon.org/2008/"><img src="http://www.eclipsecon.org/2008/image/138x38.gif" height="38" width="138" alt="EclipseCon 2008"/></a></p>

]]></content:encoded>
			<wfw:commentRss>http://www.dutchguybuilding.com/2008/03/11/wagons-west/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subversion DIY write-through-proxy &#8211; Lock/Unlock</title>
		<link>http://www.dutchguybuilding.com/2008/02/23/subversion-diy-write-through-proxy-lockunlock/</link>
		<comments>http://www.dutchguybuilding.com/2008/02/23/subversion-diy-write-through-proxy-lockunlock/#comments</comments>
		<pubDate>Sat, 23 Feb 2008 04:02:17 +0000</pubDate>
		<dc:creator>RvO</dc:creator>
				<category><![CDATA[subversion]]></category>
		<category><![CDATA[linkedin]]></category>

		<guid isPermaLink="false">http://www.dutchguybuilding.com/2008/02/23/subversion-diy-write-through-proxy-lockunlock/</guid>
		<description><![CDATA[
Something I didn&#8217;t cover in my original description was how to handle the distribution of pessimistic locking. This is a bit more of an edge-case than some of the others. You need to make sure you understand your options and their side effects.
There is no clean way to replicate the lock. There are two ways [...]]]></description>
			<content:encoded><![CDATA[
<p>Something I didn&#8217;t cover in my original description was how to handle the distribution of pessimistic locking. This is a bit more of an edge-case than some of the others. You need to make sure you understand your options and their side effects.</p>
<p>There is no clean way to replicate the lock. There are two ways to work around this:<span id="more-12"></span></p>
<h2>Propagating calls through the client</h2>
<p>Setup <code>pre-lock</code> and <code>pre-unlock</code> hooks on the master repository, and have them mimic the lock/unlock operations to each mirror. Reason we&#8217;re using <code>pre-lock</code> and <code>pre-unlock</code> rather than <code>post-lock</code> and <code>post-unlock</code> is because you need to know which user is running the operation, and that information is not available in the post- hooks.</p>
<p>You&#8217;ll need a separate password file for <code>http://mirror/repo-internal</code> in which you mirror each user, and give them all the same password. That way, you can grab the username in the hook script, and simply hardcode the password. You need real authentication on the internal mirror <code>&lt;Location&gt;</code>, because locking won&#8217;t work without it. </p>
<p>A side-effect of this approach is that the lock tokens on master and mirror(s) will be different. The working copy will have the same token as the master repository, so the lock will appear &#8217;stolen&#8217; to the client, because <code>'svn st -v'</code> will query the mirror and not proxy through to the master. Other than that, this configuration essentially works.</p>
<h2>Replicate the relevant parts of the repository database</h2>
<p>Setup <code>post-lock</code> and <code>post-unlock</code> hooks on the master repository, and have them rsync the contents of the <code>&lt;repository root&gt;/db/locks</code> directory from master to mirror(s). This ensures the lock token is the same between client, mirror and master. Of course, any untimely breakdown in connectivity between master and mirror(s) in this scenario could lead to unpredictable results and repository corruption. None of this should endanger the integrity of the master repository however, and recovery should be fairly straight-forward.</p>

]]></content:encoded>
			<wfw:commentRss>http://www.dutchguybuilding.com/2008/02/23/subversion-diy-write-through-proxy-lockunlock/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

