<?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>Peter Williams &#187; Uncategorized</title>
	<atom:link href="http://barelyenough.org/blog/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://barelyenough.org</link>
	<description>… and there is much to be learned</description>
	<lastBuildDate>Mon, 23 Jan 2012 18:32:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Backlogs considered harmful</title>
		<link>http://barelyenough.org/blog/2011/02/backlogs-considered-harmful/</link>
		<comments>http://barelyenough.org/blog/2011/02/backlogs-considered-harmful/#comments</comments>
		<pubDate>Tue, 22 Feb 2011 13:00:06 +0000</pubDate>
		<dc:creator>Peter Williams</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://barelyenough.org/?p=553</guid>
		<description><![CDATA[There are somethings we do under the pretense of being useful that are actually harmful. Unscheduled stories and bug reports in your ticket tracking system are an example. Creating a ticket is easy when you are in the moment. However, once produced these artifacts have to be read and understood multiple times in the future. [...]]]></description>
			<content:encoded><![CDATA[<p>There are somethings we do under the pretense of being useful that are actually harmful. Unscheduled stories and bug reports in your ticket tracking system are an example.</p>
<p>Creating a ticket is easy when you are in the moment. However, once produced these artifacts have to be read and understood multiple times in the future. Each time you read a ticket it costs time. How many times have you given up trying to find some ticket that you think you wrote a long time ago and just entered a new one? How much time have you spent sifting through the same tickets every iteration deciding repeatedly that they are not important enough to actually schedule?</p>
<p>I am not saying that you should not enter tickets in your issue tracker. I am saying that doing so is <em>not</em> free. Therefore, you should consider very carefully whether the story or bug you are about to write will have a net positive value over the life of the project. Most likely it will not.</p>
<p>My rule of thumb is this: do not write it down unless you are willing to schedule it right now.</p>
<p>Willingness to schedule a bit of work is proxy for its importance. It is easy to pretend everything is top priority. If you are not willing to prioritize a bit of work before something you have already decided you want, it is obviously not very important.</p>
<h3 id='if_it_is_important_you_will_not_forget'>If it is important you will not forget</h3>
<p>I think the idea that you will forget something important is the scariest part of this approach. That fear is just silly. If you are passionate about an idea you will not forget it. If it is important to your customers they will not let you forget it.</p>
<p>Let me ask you a question: if neither you nor the customers care enough about an issue to get it on the schedule should you be expending effort on it?</p>
<p>To me the answer is clearly no. If you see a potential issue or have an idea let it rest until it becomes important. Odds are it never will become important and you will have saved a good deal of every one&#8217;s time. If it ever does become important the fact that six months ago you wrote a ticket vaguely related to an issue people are having now will not help anyway. You probably will not even be able to find that old ticket.</p>
<h3 id='corollary_todo_comments_considered_extra_harmful'>Corollary: todo comments considered extra harmful</h3>
<p>Notice that my rule of thumb basically rules out todo comments altogether. Every todo comment is not only an unscheduled story, but an unscheduleable story. Even if the todo comment were a story in the ticketing system it would never, ever be scheduled. If it had a chance the developer would have written a story instead.</p>
<p>Todos are far worse than mere unshecheduled stories. Todo comments are a way for the developer to transfer some of the weight of the decisions that they made to future generations. A tax, in effect, on future generations of developers in order to assuage the author&#8217;s insecurities regarding decisions they have made in the code.</p>
<p>To the authors of todo comments i say, own your decisions. If you are not sure of what to do get a second pair of eyes now. Whatever you do, don&#8217;t burden future developers with your indecision. Right or wrong it will work out better if you make a reasonable decision and own it until there is some evidence that it was wrong.</p>
]]></content:encoded>
			<wfw:commentRss>http://barelyenough.org/blog/2011/02/backlogs-considered-harmful/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Task switching in Git</title>
		<link>http://barelyenough.org/blog/2010/08/task-switching-in-git/</link>
		<comments>http://barelyenough.org/blog/2010/08/task-switching-in-git/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 11:00:57 +0000</pubDate>
		<dc:creator>Peter Williams</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://barelyenough.org/?p=508</guid>
		<description><![CDATA[This thing happens to me pretty often: i start a story, work on it for a while then something urgent comes up.1 The urgent thing needs to be fixed right away but i have a lot of changes in my working directory. Unfortunately, the changes i have made are incomplete and non-functional. The usually suggested [...]]]></description>
			<content:encoded><![CDATA[<p>This thing happens to me pretty often: i start a story, work on it for a while then something urgent comes up.<sup id='fnref:1'><a href='#fn:1' rel='footnote'>1</a></sup> The urgent thing needs to be fixed right away but i have a lot of changes in my working directory. Unfortunately, the changes i have made are incomplete and non-functional.</p>
<p>The usually suggested way to handle this is with <a href='http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#interrupted-work'><code>git-stash</code></a>. For a long time, i used stash in this situation myself. However, i often found myself lost in the stash queue. If you use stash to store unfinished work your stash queue can become quite long. It is easy to forget you have stashed work. It is also easy to do a <code>git stash clear</code> and lose that work.</p>
<p>There are lots of situations in which it can be quite a while before you get back to your stashed changes. For example, if you switch tasks because the business deprioritized the feature. Or if the urgent issue gets interrupted by an emergency issue.</p>
<p>It recently occurred to me that git provides a much more elegant way to deal with unfinished work.</p>
<h2 id='the_steps'>The steps</h2>
<p>First, always work in a feature branch. You should be doing this anyway but it is required for this technique to work.</p>
<ol>
<li><code>git add -A</code> (on the feature branch)</li>
<li><code>git commit -m &#39;WIP&#39;</code></li>
<li>Switch branches and fix that urgent issue. Using git like you always do.</li>
<li><code>git checkout &lt;feature-branch&gt;</code></li>
<li><code>git reset HEAD~1</code></li>
<li>Continue where you left off. Once you are ready, commit.</li>
</ol>
<p>This approach commits you in-progress work on the branch to which it belongs, keeping it safe.</p>
<h2 id='how_it_works'>How it works</h2>
<p>Once you do your WIP commit your history will look something like:</p>
<p><img src='http://barelyenough.org/blog/uploads/task-switching-in-git/git-commits-wip.png' />
<p>That is great for temporarily storing your in-progress work. We definitely don&#8217;t want that nasty &#8220;WIP&#8221; commit in our history long term, though. The <code>git reset HEAD~1</code> command changes the HEAD pointer of the feature branch back to the commit immediately before the &#8220;WIP&#8221; commit. That leave a commit graph something like:</p>
<p><img src='http://barelyenough.org/blog/uploads/task-switching-in-git/git-commits-reset.png' />
<p>Once you have completed your changes and committed the HEAD pointer of the feature branch will be updated to point the new commits. This leaves the &#8220;WIP&#8221; commit out of the commit history of the branch forever.</p>
<p><img src='http://barelyenough.org/blog/uploads/task-switching-in-git/git-commits-final.png' />
<p>The &#8220;WIP&#8221; commit is now &#8220;unreachable&#8221; because no objects or references in the system point to it. It will be removed the next time you do a <code>git gc</code>.</p>
<p><code>git stash</code> definitely has it place but i reserve it for situations where i am going to pop the stash very quickly (eg, i stash, the checkout a different branch, then pop).</p>
<div class='footnotes'>
<hr />
<ol>
<li id='fn:1'>
<p>I do a lot of customer integration. Once a customer starts testing it is important to keep the turn around on their blocking issues to a minimum. If you don&#8217;t they get distracted and it&#8217;s no telling how long you&#8217;ll have to wait before they start testing again.</p>
<p><a href='#fnref:1' rev='footnote'>&#8617;</a></li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://barelyenough.org/blog/2010/08/task-switching-in-git/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mountain West RubyConf 2009</title>
		<link>http://barelyenough.org/blog/2009/03/mountain-west-rubyconf-2009/</link>
		<comments>http://barelyenough.org/blog/2009/03/mountain-west-rubyconf-2009/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 04:35:27 +0000</pubDate>
		<dc:creator>Peter Williams</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://barelyenough.org/?p=381</guid>
		<description><![CDATA[I going to Mountain West RubyConf this weekend. I am very excited. Last year this was a great conference and the schedule looks great this year too. If you are going to be there too let me know. One of the great things about these conferences is all the great people you get to meet, [...]]]></description>
			<content:encoded><![CDATA[<p><a href='http://mtnwestrubyconf.org/2009/'><br />
<img src='http://mtnwestrubyconf.org/2009/images/badges/attendee.png' border='0' alt='I&apos;m attending MountainWest RubyConf 2009!' width='150' style='float:right;' /><br />
</a>
<p>I going to <a href='http://mtnwestrubyconf.org/2009/'>Mountain West RubyConf</a> this weekend. I am very excited. Last year this was a great conference and <a href='http://mtnwestrubyconf.org/2009/schedule'>the schedule</a> looks great this year too. If you are going to be there too let me know. One of the great things about these conferences is all the great people you get to meet, so hopefully i&#8217;ll see you there.</p>
]]></content:encoded>
			<wfw:commentRss>http://barelyenough.org/blog/2009/03/mountain-west-rubyconf-2009/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Want a Job?</title>
		<link>http://barelyenough.org/blog/2008/06/want-a-job/</link>
		<comments>http://barelyenough.org/blog/2008/06/want-a-job/#comments</comments>
		<pubDate>Wed, 18 Jun 2008 01:48:45 +0000</pubDate>
		<dc:creator>Peter Williams</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://pezra.barelyenough.org/blog/?p=353</guid>
		<description><![CDATA[As you have probably noticed, I recently started a new job. Which means that I also recently left a job. The job I left was as at Absolute Performance, and it was a pretty good gig. The good news is that my leaving means that there is a spot for you. If you are interested [...]]]></description>
			<content:encoded><![CDATA[<p>As you have probably noticed, I recently started a new job. Which means that I also recently left a job.</p>
<p>The job I left was as at <a href='http://absolute-performance.com'>Absolute Performance</a>, and it was a pretty good gig. The good news is that my leaving means that <a href='http://www.absolute-performance.com/index.php?option=com_content&amp;task=view&amp;id=99&amp;Itemid=288#Ruby'>there is a spot for you</a>. If you are interested in working on some cool Ruby, Java and C++ code with a really great team you should send them a resume. Oh, and don&#8217;t forget to tell them I sent you, maybe they will buy me a lunch or something.</p>
]]></content:encoded>
			<wfw:commentRss>http://barelyenough.org/blog/2008/06/want-a-job/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTTP and XMPP</title>
		<link>http://barelyenough.org/blog/2008/06/http-and-xmpp/</link>
		<comments>http://barelyenough.org/blog/2008/06/http-and-xmpp/#comments</comments>
		<pubDate>Tue, 03 Jun 2008 21:36:02 +0000</pubDate>
		<dc:creator>Peter Williams</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://pezra.barelyenough.org/blog/?p=351</guid>
		<description><![CDATA[My new boss is contemplating whether or not HTTP will remain the protocol of choice in the future. He seems to have reached the conclusion that XMPP is a better protocol than HTTP for the network infrastructure we have today. With today&#8217;s connection characteristics, I wonder if HTTP would have been the weapon of choice [...]]]></description>
			<content:encoded><![CDATA[<p>My new boss is contemplating <a href='http://one.valeski.org/2008/06/sockets-http-xmpp-and-leap-frog.html'>whether or not HTTP will remain the protocol of choice in the future</a>. He seems to have reached the conclusion that XMPP is a better protocol than HTTP for the network infrastructure we have today.</p>
<blockquote>
<p>With today&#8217;s connection characteristics, I wonder if HTTP would have been the weapon of choice 15-20 years ago? I doubt it.</p>
</blockquote>
<p>Based on this conclusion Jud appears to believe that XMPP will replace HTTP in the future as the protocol of choice. I disagree with Jud on both points.</p>
<p>The Internet is much more reliable today than it has ever been before. It is so good, in fact, that there are many situations where you can trust the network these days. This is particularly true high levels of reliability are not required. However, the network is still not perfect, nor is it likely to ever be. Worse yet, the software that uses the network is still depressingly flaky.</p>
<p>More importantly, I don&#8217;t think HTTP &#8220;won&#8221; because of problems with the network. HTTP is ubiquitous today because it facilitates a programming model that can the use to solve some really hard problems reasonably easily. That programming model an implementation of the <a href='http://en.wikipedia.org/wiki/Representational_State_Transfer'>REST</a> architectural style. The constraints of REST allow building highly scalable and reliable systems far more easily than any other approach available today.</p>
<p>In his post Jud speaks of HTTP as if it where transport protocol. As a transport HTTP is not terribly compelling. It has fairly high overhead for individual requests. It&#8217;s connection model usually ends up creating more TCP connections absolutely necessary. It allows a lot of variability in the capabilities of clients. And so on.</p>
<p>However, HTTP is decidedly <em>not</em> a transport protocol. It is an application protocol. HTTP provides a sophisticated set of semantics specifically designed to facilitate the implementation, and optimization, of REST style applications.</p>
<p>XMPP is, on the other hand, is a transport protocol (unlike HTTP). To be precise it is a (near) real-time message transport protocol. If you need that XMPP is an excellent choice. Particularly if the messages you a dealing with have a limited duration of meaningfulness. For example, if your application loses it&#8217;s connectivity to the message sender for any significant period of time it is likely that the application will not receive at least some of the messages sent via XMPP during that time. The server may spool some messages but completely unreasonable to expect APIs to keep track of an arbitrary number of undelivered messages for an arbitrary number of clients. The cost of doing that are just too high for a high volume producer to be able to implement.</p>
<p>I think XMPP will continue to get more penetration and mind share. It is a good protocol. It is not a competitor to HTTP, though. The two protocols serve very different purposes. I expect that many systems will utilized both. If you have a need for real-time messaging and you have relatively weak reliability requirements, or you are willing and able to invest significant effort implementing reliability in your application, use XMPP. But real-time messaging do not an application make.</p>
<p>HTTP is not a &#8220;dinosaur&#8221;, as Jud puts it, it is a shocking advanced piece of alien technology we have only recently discovered (as an industry) how to fully utilize. Actually, I am pretty sure we have not yet figured out how to fully utilized it. We will continue to see more and more applications and data service APIs implemented using the wicked cool semantics of REST/HTTP.</p>
]]></content:encoded>
			<wfw:commentRss>http://barelyenough.org/blog/2008/06/http-and-xmpp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Vacation</title>
		<link>http://barelyenough.org/blog/2008/05/san-diego-vacation/</link>
		<comments>http://barelyenough.org/blog/2008/05/san-diego-vacation/#comments</comments>
		<pubDate>Wed, 28 May 2008 04:41:52 +0000</pubDate>
		<dc:creator>Peter Williams</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://pezra.barelyenough.org/blog/?p=348</guid>
		<description><![CDATA[My family and I are vacationing this week in San Diego. So far it has been pretty much perfect. Weather is really nice, if a bit cool for swimming. Our condo is nice and well located (a block off Mission Beach). The kids like the water, but the sand is where the fun really is [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://pezra.barelyenough.org/blog/wp-content/uploads/2008/05/mission-beach-1.jpg' /></p>
<p>My family and I are vacationing this week in San Diego. So far it has been pretty much perfect. Weather is really nice, if a bit cool for swimming. Our condo is nice and well located (a block off Mission Beach). The kids like the water, but the sand is where the fun really is as you can tell from the picture above.</p>
]]></content:encoded>
			<wfw:commentRss>http://barelyenough.org/blog/2008/05/san-diego-vacation/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Megalomania in Revision Control Systems</title>
		<link>http://barelyenough.org/blog/2006/08/megalomania-in-revision-control-systems/</link>
		<comments>http://barelyenough.org/blog/2006/08/megalomania-in-revision-control-systems/#comments</comments>
		<pubDate>Tue, 22 Aug 2006 17:22:17 +0000</pubDate>
		<dc:creator>Peter Williams</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Perforce]]></category>
		<category><![CDATA[SCM]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://pezra.barelyenough.org/blog/2006/08/megalomania-in-revision-control-systems/</guid>
		<description><![CDATA[The more I work with Perforce the more annoyed I get with it&#8217;s belief that it is the center of the software development process. Not that Perforce is not unique in believing this. In fact, many commercial revision control systems have this same megalomania. So, commercial revision control vendors, let me clue you in. Revision [...]]]></description>
			<content:encoded><![CDATA[<p>The more I work with Perforce the more annoyed I get with it&#8217;s belief that it is the center of the software development process. Not that Perforce is not unique in believing this. In fact, many commercial revision control systems have this same megalomania.</p>
<p>So, commercial revision control vendors, let me clue you in. Revision control systems are <em>not</em> the center of the software development universe, the file system on the developer&#8217;s machine is. Period. The primary job of a revision control system is to figure out what the developer did, after the developer has already done it, and to save that so that it can be applied to the other developers local file systems.</p>
<p>I am complaining about this because out of the box Perforce does not include a way to examine your working directories and get a list of what has changed since the last time you synchronized with the depot (Perforce&#8217;s word for a repository). This means that you must declare any changes you make to the source code tree before, or at the same time as, you make them. If you do not declare the changes up front it is almost certain that some required changes will be forgotten and will not get checked in.</p>
<p>The main problem with this approach is that it compels you to <a href='http://www.joelonsoftware.com/articles/fog0000000022.html'>break your flow</a>. You might not think that just having to execute one additional command would really be that bad. After all, executing a command could probably be incorporated into your personal process and thereby have little or on impact on your flow. In practice, however, it really does break the flow.</p>
<p>The true cost of declaring that a new file will exist with a particular name is not in the act of declaration. Rather, it is in the thought and commitment that such a declaration requires. Every day, I created new classes only to notice a couple of minutes later that it has morphed in to something quite different than what I originally intended. Declaring the name of a new file to the revision control system before I have even created it dramatically raises the cost of such emerging behaviors. To name a file well I need to understand it&#8217;s purpose and to do that I usually need to create it and put some code in it to see how it turns out.</p>
<p>Having to declare the name of the file first requires a significant amount of thought and, worse of all, it prematurely solidifies the design. This premature solidification of design is costly both in terms of the time it takes and the quality risks it introduces. Paul Graham makes a compelling case for a fluid approach to software design in <a href='http://www.paulgraham.com/hp.html'>Hackers and Painters</a>. Forcing stability on an immature design merely locks in its deficiencies and that is exactly the result of requiring the declaration a file before it is created.</p>
<p>The need to declare modifications and deletions up-front is less onerous. Deletions are easier because, generally, it is easy to understand the consequences of deleting a file because there is only one. Modifications are easier because marking a file at &#8220;to be edited&#8221; is quite forgiving. Even if you failed to actually modify the file checking it in will have no functional impact. None the less, having to declare you intentions up-front is still annoying, and wasteful since they could be determined after the fact.</p>
<p>If you are a commercial revision control system vendor please take note. You are not, nor will you ever be, the center of the software development universe. Pretending that you are just costs your users time and effort that could be better spent solving real problems.</p>
]]></content:encoded>
			<wfw:commentRss>http://barelyenough.org/blog/2006/08/megalomania-in-revision-control-systems/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

