<?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/"
	xmlns:series="http://unfoldingneurons.com/"
	>

<channel>
	<title>MettaProgramming</title>
	<atom:link href="http://mettadore.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://mettadore.com</link>
	<description>Thoughts on Software and Technology</description>
	<lastBuildDate>Fri, 03 Feb 2012 17:39:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>New to testing? Just wash one dish</title>
		<link>http://mettadore.com/analysis/new-to-testing-just-wash-one-dish/</link>
		<comments>http://mettadore.com/analysis/new-to-testing-just-wash-one-dish/#comments</comments>
		<pubDate>Fri, 03 Feb 2012 17:39:26 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Miscellany]]></category>
		<category><![CDATA[one-dish theory]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://mettadore.com/?p=957</guid>
		<description><![CDATA[I have a team I&#8217;m working with of great tactical programmers. These guys take the craziest specs you&#8217;ve ever seen from clients and turn them into shit that actually works. Tactical programmers are great, they are needed in every organization. Nothing will get you to a deliverable better than a solid tactical programmer. One thing [...]]]></description>
			<content:encoded><![CDATA[<p>I have a team I&#8217;m working with of great tactical programmers. These guys take the craziest specs you&#8217;ve ever seen from clients and turn them into shit that actually works. Tactical programmers are great, they are needed in every organization. Nothing will get you to a deliverable better than a solid tactical programmer. One thing I&#8217;ve found with many tactical programmers– it&#8217;s almost a universal trait– they don&#8217;t often write tests.</p>
<p>It&#8217;s not that a tactical programmer will <em>never</em> write tests, it&#8217;s just not their focus. They are on the front lines, working, well, tactically. Tests are a strategic issue. To many tactical programmers, tests are not something that are necessary. To the tactical programmer, unit tests are this vague, unimportant, time-consuming thing that someone else tells you that <em>you really should do if you want to have good dental health into your later years.</em> They are not something you need to make this feature work, they are something someone else wants for some unimportant reason.<em><br />
</em></p>
<p>I&#8217;m not going to argue why testing is important. There are enough flies on that carcass. What I want to give, to my team of great tactical programmers, especially, is a concept about writing tests that will make it more palatable.<sup><a href="http://mettadore.com/analysis/new-to-testing-just-wash-one-dish/#footnote_0_957" id="identifier_0_957" class="footnote-link footnote-identifier-link" title="This is not news for seasoned developers, I&amp;#8217;m not saying that it&amp;#8217;s new">1</a></sup></em></p>
<h3>Why Starting To Write Tests Sucks</h3>
<p>The fundamental thing is this: The best way to actually accomplish testing is to start writing tests.</p>
<p>The problem is that you look at this huge codebase you&#8217;ve written without a single test, and you start feeling sick to your stomach and grumpy about your chair and angry at the fact that you&#8217;re coffee is too cold and you say &#8220;Screw that, I don&#8217;t have time for that stupid shit.&#8221;</p>
<p>So, what do you do? You write another feature, that adds more untested code to your codebase, that makes you even <em>more</em> sick to your stomach the next time you think about tests.</p>
<p>And before you know it, the only thing you actually <em>know</em> about tests is this: Those fucking things make me sick to my stomach!</p>
<h3>The One-Dish Theory of Work</h3>
<p>When I clean my house, I don&#8217;t start and say &#8220;I&#8217;m going to clean the house.&#8221; There&#8217;s too much to do, too much to even think about. I start in the kitchen– but I hate cleaning, so I can&#8217;t even think about <em>the kitchen</em>. When I clean my house, I start by going to the sink and washing, not everything in the sink, but one, single dish.</p>
<p>I tell myself, &#8220;I&#8217;m going to wash one dish and see where I go.&#8221;</p>
<p>The thing is, of course, that soaping the sponge, washing that dish, and putting it away requires a small amount of set-up. Thus, when I&#8217;m done washing that one dish, it&#8217;s much easier to wash <em>just one <strong>more</strong> dish.</em> I mean, I&#8217;m already there, and I&#8217;ve got the sponge in my hand.</p>
<p>Before I know it, all the dishes are washed, and the counter next to my sink is clean. Well, with one clean counter, it&#8217;s easier to clean off this other counter. I&#8217;ll just clean <em>this one other counter</em>.</p>
<h3>Just Write One Test</h3>
<p>That&#8217;s how a non-test writing, tactical programmer can think about writing tests. Just write <em>one</em>. Because here&#8217;s the thing: It&#8217;s not that bad. The reason it&#8217;s not that bad is that <em>the best way to accomplish testing is to start writing tests</em>.</p>
<p>Not <em>all</em> of the tests. Just <em>one</em> test.</p>
<p>The beauty of testing is that they work no matter how many you have. You don&#8217;t have to wait until you have time to go back and write tests for <em>everything</em> all at once. If you just start writing tests for the things you work on <em>today</em>, <strong><em>now</em></strong>, then it&#8217;s not such a big task. Don&#8217;t write tests for every class in your codebase, but write tests for this one, small class you&#8217;re working on today.</p>
<p>Write <em>one test</em>, for just this <em>one method</em> in this one, small class, that you are working on <em>today</em>. Tomorrow, write <em>one</em> test for what you&#8217;re working on then. Maybe write <em>two</em> if you&#8217;re feeling cheeky.</p>
<p>What you&#8217;ll find is that, as you write tests here and there, for just the thing you&#8217;re working on, it gets easier and easier. Very soon, you&#8217;ll say &#8220;Well, I was going to just write a test for just that one method, but since I&#8217;m here in the test class, it&#8217;ll only take me another 20 minutes to write tests for _all_ the methods, so I might as well.&#8221; By the time you have a few weeks to actually fill in the rest of the tests, it might only take a few days, because you&#8217;ve been doing it and are more familiar.</p>
<p>Just write <em>one</em> test. Just one. You can decide after you write that one whether you want to write another, but at least write one.</p>
<p>Today.</p>
<ol class="footnotes"><li id="footnote_0_957" class="footnote">This is not news for seasoned developers, I&#8217;m not saying that it&#8217;s <em>new</li></ol>]]></content:encoded>
			<wfw:commentRss>http://mettadore.com/analysis/new-to-testing-just-wash-one-dish/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Ever-Deployable Github Workflow, v2.0: Branches and Issues</title>
		<link>http://mettadore.com/analysis/the-ever-deployable-github-workflow-part-2-branches-and-issues/</link>
		<comments>http://mettadore.com/analysis/the-ever-deployable-github-workflow-part-2-branches-and-issues/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 19:31:33 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Miscellany]]></category>

		<guid isPermaLink="false">http://mettadore.com/?p=878</guid>
		<description><![CDATA[Here at CHOAM, we love to live at the junction of creating and learning. In fact, it&#8217;s one of the primary reasons I became a programmer. As a little kid with my TI 99/4A I could create software I never dreamed possible. Sitting down with my BASIC compiler, I could type a few lines of [...]]]></description>
			<content:encoded><![CDATA[<p>Here at <a title="Combine Honnete Ober Advancer Mettadore" href="https://github.com/mettadore">CHOAM</a>, we love to live at the junction of <em>creating</em> and <em>learning</em>. In fact, it&#8217;s one of the primary reasons I became a programmer. As a little kid with my TI 99/4A I could create software I never dreamed possible. Sitting down with my BASIC compiler, I could type a few lines of code and suddenly do something that I could never do before. I&#8217;ve been creating ever since, the ability to create was too addictive to let go.</p>
<p>Software is a world where you need to improve your skills everyday.<sup><a href="http://mettadore.com/analysis/the-ever-deployable-github-workflow-part-2-branches-and-issues/#footnote_0_878" id="identifier_0_878" class="footnote-link footnote-identifier-link" title="Admittedly, there are those who don&amp;#8217;t. But I try to keep them far away from my projects. Nothing is more dangerous than a developer who is happy at being stale">1</a></sup> That&#8217;s a heavy toll, but a wonderful one, because you&#8217;re always <em>just about underwater</em>, you&#8217;re always challenged. But, and this is the wonderful part, you&#8217;re always discovering. Every day as a developer is a day that I am doing something that I haven&#8217;t done before. Whether it&#8217;s creating a new architecture, or just improving a workflow. Everyday is about improvement.</p>
<h3>Problems with The Ever-Deployable Git Workflow</h3>
<p>I&#8217;ve been using my <a title="The Ever-Deployable Github Workflow" href="http://mettadore.com/analysis/the-ever-deployable-github-workflow/">Ever-Deployable Git Workflow</a> for a few months now with much success. It&#8217;s been a great way to keep a project up to speed with multiple people working on multiple issues with barely any conflict. Still, nothing is perfect.</p>
<p>One thing I&#8217;ve found is that naming branches is problematic. Few people want to type &#8220;git checkout -b make-javascript-popups-easier-to-maintain,&#8221; it&#8217;s just too long. Also, searching through a long list of issues with names like that just gets troublesome. What is John working on? Oh, something about making Javascript popups better. Well, is that Issue #216? The one about JS file location? Or is it Issue #384?</p>
<p>This brings up two ways that we can make the Ever-Deployable Github workflow better. First, unify with the issue tracker, and second, make better branch names.</p>
<h3>The Github Issue Tracker</h3>
<p>Github&#8217;s issue tracker is probably one of the least functional issue trackers I&#8217;ve ever used. It basically has nothing you&#8217;d expect or want. It&#8217;s little more than a title, some text, and maybe a label.</p>
<p>For that reason, it&#8217;s the best issue tracker I&#8217;ve ever used.</p>
<p>How many of us get sucked into the feature set of a piece of software and end up spending all of our time maintaining the software. Github&#8217;s issue tracker forces us to avoid that tendency by not <em>giving</em> us that feature set. It&#8217;s brilliant. All I can do is write a title, write a description, and then <em>get back to work</em>. It makes logging issues super fast. So recently, I&#8217;ve started to take advantage of that. I log issues for nearly every small, atomic change I want to make.</p>
<p>Furthermore, you can close issues with commit messages like &#8220;Fixes #216 by shuffling the JS files as if they were a deck of cards,&#8221; and the commit then gets linked to the closed issue automagically. It&#8217;s really a great system.</p>
<h3>10 Steps to a Better Workflow</h3>
<p>So, we have a way that we can quickly make issues to log things we want to change. And we want to get rid of insanely long branch names. Why don&#8217;t we branch the issue? This means our branch name is <em>minimally descriptive</em>, but there is as much description as we want in the actual issue. Using this methodology, our new Github Workflow is this:</p>
<ol>
<li>Only work on documented issues. The idea here is that no one is ever just blindly mucking about in the code without a documented reason<sup><a href="http://mettadore.com/analysis/the-ever-deployable-github-workflow-part-2-branches-and-issues/#footnote_1_878" id="identifier_1_878" class="footnote-link footnote-identifier-link" title="or at least without creating an issue like &amp;#8220;Issue #516: Blindly mucking about in the code&amp;#8221;">2</a></sup></li>
<li>Look to see if anyone else is working on the issue you are going to start.</li>
<li>Create an issue describing work to be done, or use an existing issue</li>
<li>Create a branch using that issue number. We use &#8220;issueNUM&#8221; as the branch name, so something like &#8220;git checkout -b issue516&#8243;</li>
<li>Immediately, before doing any work, push that branch back to master: &#8220;git push origin issue516.&#8221; This tells everyone that someone is <em>actively working on this issue</em>. This is why you don&#8217;t work on undocumented issues. It&#8217;s very easy to know what the entire team is working on.</li>
<li>Work on your code following The Ever-Deployable Github Workflow. Making commits fairly atomically, or as atomically as your team decides.<sup><a href="http://mettadore.com/analysis/the-ever-deployable-github-workflow-part-2-branches-and-issues/#footnote_2_878" id="identifier_2_878" class="footnote-link footnote-identifier-link" title="I like smaller commits, since they are easier to review and revert">3</a></sup></li>
<li>Rebase to master</li>
<li>Commit the branch with a final message like &#8220;Fixes #517 by doing lots of stuff.&#8221;</li>
<li>Push to remote, submit your pull request, and &#8220;git checkout -b &lt;nextIssueNumber&gt;&#8221;</li>
<li>Lather, rinse, and repeat</li>
</ol>
<h3>Fixing other things along the way</h3>
<p>This workflow has done a few things for us. One, it encourages <em>atomic work on the code</em>. By that, I mean it encourages us to stay away from commits that change &#8220;a little of this, little of that.&#8221; We are working on a single issue, and our branch is named with that issue. So we focus on that issue.</p>
<p>If we want to fix other, most often very small, issues during the work, we fix them in a single commit, and log that in the commit message &#8220;Fixes #214 by changing something, since I&#8217;m here already.&#8221; If we want to fix bigger issues, we do it a bit differently.</p>
<p>For instance, say we are working on our issue #516, and during that, we come up with a decent way to correct another issue, say issue #212, that comes up because of our work on this one, but which we don&#8217;t want to dump right into production- maybe we have to test it more:</p>
<pre class="brush: plain; title: ; notranslate">
git checkout -b issue516
git push origin issue516
… do some work and decide to fix issue 212, but not to push it to production without first finishing 516
git checkout -b issue212
git push origin issue212
… fix 212 and commit
git commit -am &quot;Fixes #212 by mucking about in the code&quot;
git push origin issue212
git checkout issue516
… continue working on issue 516
git commit -am &quot;Fixes #516&quot;
… then do the standard git rebase workflow:
git checkout master
git pull origin master
git checkout issue516
git rebase master
… Then submit your pull request for Issue 516. Now, it's a good time to push up 212
git checkout issue212
git rebase issue516
git push origin issue212
</pre>
<p>With this, issue212 is fixed <em>on top of issue516</em> and is ready for either a pull request or more review and work. From a git log perspective, it appears that issue 516 was completed, <em>and then</em> issue 212 was completed. Nice and clean.</p>
<h3>Coda</h3>
<p>I&#8217;ve been using this workflow on various teams for about 2 months now, and it&#8217;s working out extremely well. I&#8217;d be interested in what you think.</p>
<ol class="footnotes"><li id="footnote_0_878" class="footnote">Admittedly, there are those who don&#8217;t. But I try to keep them far away from my projects. Nothing is more dangerous than a developer who is happy at being stale</li><li id="footnote_1_878" class="footnote">or at least without creating an issue like &#8220;Issue #516: Blindly mucking about in the code&#8221;</li><li id="footnote_2_878" class="footnote">I like smaller commits, since they are easier to review and revert</li></ol>]]></content:encoded>
			<wfw:commentRss>http://mettadore.com/analysis/the-ever-deployable-github-workflow-part-2-branches-and-issues/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Git Workflow]]></series:name>
	</item>
		<item>
		<title>Hourly work, fairness, and the scamming of lawyers</title>
		<link>http://mettadore.com/analysis/hourly-work-fairness-and-the-scamming-of-lawyers/</link>
		<comments>http://mettadore.com/analysis/hourly-work-fairness-and-the-scamming-of-lawyers/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 23:32:58 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Miscellany]]></category>

		<guid isPermaLink="false">http://mettadore.com/?p=938</guid>
		<description><![CDATA[I&#8217;ve been working full-time as a contract programmer for a few years now, and have recently begun to realize something very disheartening: My clients get a lot of shit for free. Now, that&#8217;s not disheartening in a &#8220;they get stuff I don&#8217;t get&#8221; sort of way. I mean, good for them. I&#8217;m a happy person [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working full-time as a contract programmer for a few years now, and have recently begun to realize something very disheartening:</p>
<p>My clients get <em>a lot</em> of shit for free.</p>
<p>Now, that&#8217;s not disheartening in a &#8220;they get stuff I don&#8217;t get&#8221; sort of way. I mean, good for them. I&#8217;m a happy person who likes spreading happiness, so I&#8217;m not against them getting shit for free on principle. The problem here is that my clients get a lot of shit for free that <em>I</em> do– and thus, it means that I&#8217;m doing <em>a lot of work for free</em>.</p>
<p>Today is a perfect example of this. Today I did some quick work for a client that submitted a request using my ticketing system. Since I wasn&#8217;t actually working for someone else at the time, I went ahead and tackled it. The time I spent on that, from initially seeing the email to completing it barely scraped 20 minutes. I loosely round to 15 minute increments, and generally don&#8217;t charge for a quick 5-15 minute bit of work. Thus, I did that for free.</p>
<p>Then, since I was already outside of a context, I checked my email, and there was another request. Similar thing, similar outcome. A wee bit of unbilled work.</p>
<p>Then, there was another request from another client. This one took about 45 minutes. So, I went into FreshBooks and went to bill them, only to realize that it was the first time I was billing them this month. I&#8217;ve worked for that client almost 4 times already this month, and this is the first time I&#8217;ve billed them.</p>
<p>I am extremely hesitant at this point to back calculate just how many of these little things I do without billing.</p>
<h3>Metric billing</h3>
<p>When I was working in environmental consulting<sup><a href="http://mettadore.com/analysis/hourly-work-fairness-and-the-scamming-of-lawyers/#footnote_0_938" id="identifier_0_938" class="footnote-link footnote-identifier-link" title="during my short, foolish attempt to convince myself that I&amp;#8217;m not a developer in my heart">1</a></sup>, I had this ridiculous billing sheet that I had to keep. It was 10ths of an hour, which makes sense from a percentage perspective– easy calculations– but becomes mind-numblingly frustrating when you have to actually write down the fact that you used two billing increments because it took you 10 minutes to go to the bathroom!</p>
<p>I mean, think about that: 10ths of an hour: 6 minute increments. Imagine tracking what you do by looking at every 6 minutes! &#8220;No, I don&#8217;t have time to glance at your stupid Star Wars link, that&#8217;s like 2 whole minutes!!&#8221;</p>
<p>I thought I would go crazy at that job. And yet, oddly, lately I&#8217;ve become to realize that it makes an insane sort of sense. My base rate is $85/hr, which means that one of those billing increments is effectively $8.50, which means that my &#8220;barely scraping 20 minute&#8221; task that I did for my client was worth $25.50.</p>
<p>Again, I am extremely hesitant at this point to back calculate just how many of these little things I do without billing.</p>
<h3>Small clients, hourly work, and the fallacy of &#8216;free&#8217;</h3>
<p>And so we have a problem. I basically refuse to bill more harshly– admittedly out of my own laziness– but continue to have lots of small contracts which, by their very nature, necessitate harsh billing. It makes my relationship with my clients more lopsided, which doesn&#8217;t stay positive. I&#8217;m starting to realize that this is far from a &#8220;good deal&#8221; for my clients. In fact, it&#8217;s a pretty bad thing.</p>
<p>Think about it. I do work for my clients for free, and I do this free work all the time, right? That&#8217;s great because my clients are getting stuff and not paying for it, right? Wrong. The more I do work for free, the more working for this client becomes a burden, either real or perceived, and the worse my work gets. I get less engaged, and more frustrated, with every task.</p>
<p>That&#8217;s not good for either of us. Good business isn&#8217;t about getting shit freely. That&#8217;s a fallacy. Good business is about getting shit fairly.</p>
<h3>I understand the lawyers</h3>
<p>Lawyers. Those bastards.They do this thing which I always thought was really shitty and unfair. They charge you for work they don&#8217;t do. It&#8217;s this scam they have called &#8220;being on retainer.&#8221;<sup><a href="http://mettadore.com/analysis/hourly-work-fairness-and-the-scamming-of-lawyers/#footnote_1_938" id="identifier_1_938" class="footnote-link footnote-identifier-link" title="Yes, I realize they are not the only ones who use the retainer, but they are my foil for this article, so shut up.">2</a></sup> They charge you this monthly amount for work they &#8220;might&#8221; do. If you call them, you pay. And if you <em>don&#8217;t</em> call them, you pay. Then, if you want them to do <em>a lot</em> of work, you pay more!</p>
<p>I understand this now.</p>
<p>Lawyers aren&#8217;t bastards at all, and they are not scamming at all. It may not be perfect, but what they are doing is trying to get as close as possible to &#8220;fair.&#8221;</p>
<p>This is why my lawyer doesn&#8217;t charge me when I call to ask a simple question, yes. But more importantly, this is why my lawyer <em>is actually engaged</em> when I call to ask that simple question. I now realize why the lawyers do what they do, and I have to say that it&#8217;s a seriously good idea.</p>
<p>I&#8217;ve got a couple clients that I don&#8217;t hear from for months, who will then call with work for me to do. This is a bad situation. Since I&#8217;m not getting paid <em>unless</em> they call me, I have to take on other work, so I fill my schedule, book myself up, then get this call from someone asking me to do work, and I can&#8217;t.</p>
<p>At that point, I have no time for work. It&#8217;s not like I set aside time <em>just in case</em> they called me. I can&#8217;t do that and survive. So we&#8217;re screwed. There&#8217;s no good solution, and anything we come up with is the least crappy choice of either &#8220;fitting it in&#8221; or doing a less than perfect job just to &#8220;get it out of the way&#8221; or even saying &#8220;sorry, you&#8217;re out of luck.&#8221;</p>
<h3>From now on, I&#8217;m on retainer</h3>
<p>Here&#8217;s the thing: I want clients who value their own work, who take their own work seriously– seriously enough that they <em>demand</em> that I take it seriously. Because I take my own work seriously. I spend enormous amounts of time working to improve myself, to work better. I value my work, and I want clients who value me.</p>
<p>I&#8217;m no longer working hourly for any contract that is not a significant portion of my time. My plan is to set a &#8220;retainer rate&#8221; at some fraction of my base rate, which my client will pay monthly in exchange for me <em>guaranteeing</em> that they have a certain amount of hours. Those are hours that I don&#8217;t have to fill with other work. Those are hours I can set aside for my client, and if I don&#8217;t use them for my client, then great, I use them to work anyway, learning another framework, or another language, or just playing with a design pattern, or refactoring something in their code. All of which makes me better, and more valuable to my clients.</p>
<p>It&#8217;s all about value.</p>
<p>Retainer doesn&#8217;t mean &#8220;I&#8217;m charging you for work I might not do.&#8221; Not at all. I see that now. Retainer means &#8220;I have to find work, and you&#8217;re going to get shoved aside and treated like shit, unless I <em>don&#8217;t</em> have to find work.&#8221; Retainer means &#8220;You value your business enough that you don&#8217;t want stuff to &#8216;maybe get fit in.&#8217;&#8221; Retainer guarantees access, but more than that, it guarantees <em>fairness</em>.<sup><a href="http://mettadore.com/analysis/hourly-work-fairness-and-the-scamming-of-lawyers/#footnote_2_938" id="identifier_2_938" class="footnote-link footnote-identifier-link" title="or, at least, comes as close as we can get easily in our system.">3</a></sup> It says &#8220;I care about my product, and I care about it enough that when I want you to work, I don&#8217;t want to wonder whether you can.&#8221;</p>
<p>It shows that the client values their product, it certainly shows that the client values me, but most of all it shows that I&#8217;d damn-well better value this client.</p>
<p>That, my friend, is good business.</p>
<ol class="footnotes"><li id="footnote_0_938" class="footnote">during my short, foolish attempt to convince myself that I&#8217;m not a developer in my heart</li><li id="footnote_1_938" class="footnote">Yes, I realize they are not the only ones who use the retainer, but they are my foil for this article, so shut up.</li><li id="footnote_2_938" class="footnote">or, at least, comes as close as we can get easily in our system.</li></ol>]]></content:encoded>
			<wfw:commentRss>http://mettadore.com/analysis/hourly-work-fairness-and-the-scamming-of-lawyers/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Don&#8217;t be an idiot like me, mock your services!</title>
		<link>http://mettadore.com/analysis/dont-be-an-idiot-like-me-mock-your-services/</link>
		<comments>http://mettadore.com/analysis/dont-be-an-idiot-like-me-mock-your-services/#comments</comments>
		<pubDate>Sat, 17 Dec 2011 19:02:28 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Miscellany]]></category>

		<guid isPermaLink="false">http://mettadore.com/?p=930</guid>
		<description><![CDATA[You know the old saying, a derivative of: &#8220;Test are like flossing, we all know we should write them, but no-one does.&#8221; That&#8217;s an old saying because, while it was true 10-20 years ago, it&#8217;s not so true now. For the most part, the modern development world is a beautifully tested one. These days, nearly [...]]]></description>
			<content:encoded><![CDATA[<p>You know the old saying, a derivative of: &#8220;Test are like flossing, we all know we should write them, but no-one does.&#8221; That&#8217;s an old saying because, while it was true 10-20 years ago, it&#8217;s not so true now. For the most part, the modern development world is a beautifully tested one. These days, nearly everyone flosses.</p>
<p>Still, there are always improvements. Sure, we test, but maybe we don&#8217;t really test the web interactions, or test the controllers as well as we should, or whatever. We&#8217;re flossing, but we&#8217;re not really flossing as well as we could be. We&#8217;re missing some teeth.</p>
<p>Today, I got a toothache.</p>
<h3>Mock your services</h3>
<p>My company, Hydrasi, has what is a fairly common architecture these days. We have a front-end website (in Rails) that sessions users and does various pretty things, and we have various back-end servers (our main is in Scala) that do things like manage data, send messages, etc. Everything connects to everything else via messaging and API calls. This is basic &#8220;concern separated&#8221; design. The Rails site shouldn&#8217;t care what the hell happens in the Scala server, it should just care that when it says &#8220;give me a monkey,&#8221; it get&#8217;s a monkey. It&#8217;s a nice separation because I &#8220;own&#8221; the front end, and my partner &#8220;owns&#8221; the back end.</p>
<p>And yet, with all of this architectural decision making and best practices, today I&#8217;m at a work-stoppage point because my front-end tests are failing. Why? Because I&#8217;m an idiot and built them all while I had a back-end server that was functional. Today, that service is *not* functional, and my partner is out, probably doing what he should be doing on a Saturday– having fun.</p>
<p>Yes, I feel really stupid. I spent an hour trying to hack around and get the back-end services running so I could work.</p>
<p>Yes, I already feel stupid, and yes, it&#8217;s obvious that I haven&#8217;t really been flossing.</p>
<p>So now, instead of working on what I thought I was going to work on, I&#8217;m heading over to grab the <a href="http://fakeweb.rubyforge.org/">FakeWeb </a>gem so that <em>next</em> time I work, it won&#8217;t matter whether any other servers are running.</p>
<p>(in a month, I&#8217;ll write a post about how I forgot to write integration tests <img src='http://mettadore.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://mettadore.com/analysis/dont-be-an-idiot-like-me-mock-your-services/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Farewell To Facebook, Reason #3: Obsession &amp; Stupidity</title>
		<link>http://mettadore.com/analysis/a-farewell-to-facebook-reason-3-obsession-stupidity/</link>
		<comments>http://mettadore.com/analysis/a-farewell-to-facebook-reason-3-obsession-stupidity/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 18:52:58 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Miscellany]]></category>

		<guid isPermaLink="false">http://mettadore.com/?p=927</guid>
		<description><![CDATA[This is the last in my posts about why I left Facebook. No, really, I promise! Like many things I write, they&#8217;ve come off a bit as &#8220;explanation&#8221; and/or &#8220;justification,&#8221; but– also like many things I write– they were meant more as &#8220;exploration.&#8221; They are a personal exploration, through writing, of my own decisions and [...]]]></description>
			<content:encoded><![CDATA[<p>This is the last in my posts about why I left Facebook.</p>
<p>No, really, I promise!</p>
<p>Like many things I write, they&#8217;ve come off a bit as &#8220;explanation&#8221; and/or &#8220;justification,&#8221; but– also like many things I write– they were meant more as &#8220;exploration.&#8221; They are a personal exploration, through writing, of my own decisions and motivations. That is what writing is to me. That ability to use it as a forum, not with others, but with myself. It&#8217;s as much an internal dialog as an external representation. It is more-so that, actually.</p>
<p>And that&#8217;s the point of this post.</p>
<h3>Longform writing</h3>
<p>I&#8217;m going to be honest with myself and not describe the way I like to write as &#8220;essay.&#8221; It often doesn&#8217;t have the deep research and editing that such writing would require. Still, it is longform writing. It&#8217;s not sound bites, it&#8217;s analysis. It allows me– forces me, really– to dive deeply into myself to ascertain my own thoughts and motivations. Whether I&#8217;m writing about myself, or about someone else, or about some arbitrary situation removed from me completely. Writing is analysis.</p>
<p>Facebook is not writing as analysis. Facebook is a focus on the soundbite. Facebook is a headline. Headlines are catchy. They are short and pithy. Headlines grab people&#8217;s attention, and Facebook is really good at that. But that was the limit. Longform writing is the actual story, and <a title="inadequacies: The meaning of literature" href="http://positivelyglorious.com/easy-listening/inadequacies-the-meaning-of-literature/">I truly believe in &#8220;story.&#8221;</a></p>
<p>Longform writing is what I want to do, but Facebook writing is what I <em>did</em>.</p>
<p>Strangely, I would find that I was spending almost as much time internally preparing a Facebook post as I would spend preparing a longform blog post such as this. And no, that&#8217;s not to say that I spend only a few minutes preparing a blog post. What that means is that a stupid Facebook post would take, quite literally, <em>days to prepare</em>.</p>
<p>Just think for a moment about how incredibly fucking stupid that is.</p>
<p>I mean, seriously, did you read the previous posts where I describe how I <em>don&#8217;t take Facebook seriously</em>? Good. So I&#8217;m not the other one who realizes that I&#8217;m completely full of shit. I take it <em>too fucking seriously!</em></p>
<h3>A day to swim, a week to post about it</h3>
<p>Think about this small post:</p>
<blockquote><p>The Hood River pool, where you learn that no matter how out of shape you thought you were, you&#8217;re more out of shape than that.</p></blockquote>
<p>Which took me almost a week to write. Yes, you read that correctly, almost a week.</p>
<p>I&#8217;ve written before about <a title="Pool Monsters" href="http://positivelyglorious.com/easy-listening/pool-monsters/">trying to learn how to swim</a> with the masters swimmers. It&#8217;s difficult, but it&#8217;s also amazing who&#8217;s there. There are 60+ year old women who, despite my best efforts at focusing on what I&#8217;m doing, I can&#8217;t help but notice are really in shape and… well… hot! There are people who are so in shape and so good in the water that it&#8217;s difficult to believe that I&#8217;ll ever be that good.</p>
<p>So, I&#8217;m there watching people who I can&#8217;t help but compare myself to– me, this former martial arts loving competitive cyclist who is now little more than an out-of-shape middle-aged oaf. I watch them while meanwhile I can barely make it back and forth across the pool once before I&#8217;m out of breath and dizzy enough to pass out.</p>
<p>And there&#8217;s this aspect of body preparedness, which I&#8217;ve never thought of, but which explains why I can get on a bicycle after two years of doing basically no riding, and still hold my own in the Tour de Hood. It&#8217;s the reason I keep thinking of myself as &#8220;fairly fit&#8221; despite all the evidence to the contrary. It&#8217;s not that I&#8217;m &#8220;fit.&#8221; It&#8217;s just that my body, after an entire lifetime of doing this sport, is uniquely prepared to, well, do <em>this</em> sport.</p>
<p>But any other sport is up for grabs. I can ride 40 miles at the drop of a hat, but jogging around the block is deadly, and swimming kicks my ass.</p>
<p>That&#8217;s a sampling of the analysis I did before writing that Facebook post. It&#8217;s a sampling of what I <em>wanted</em> to write about. But, of course, on Facebook, you&#8217;re not going to write all of that. So, I took a couple days thinking about that, then a couple more deciding whether I was going to write about 60 year old women who look hot in bathing suits, and how I could do that in a way that was funny, but still appropriate and respectful to them, and then a while deciding whether I was going to mention body preparedness or just feeling out of shape, and a couple days to…</p>
<p>And what do I get out of that? One fucking sentence that doesn&#8217;t express <em>any</em> of that.</p>
<h3>Don&#8217;t give up writing for writing</h3>
<p>Here in Hood River, wind sports are big. The windsurfers and kiteboarders here have a saying: &#8220;Don&#8217;t give up wind for wind.&#8221; There&#8217;s a lot I learned from that saying.</p>
<p>Say you&#8217;re out on the river, and you have wind, and you&#8217;re windsurfing, but then you look way up the gorge and it looks windier. You might be tempted to go there, but you shouldn&#8217;t. You have wind here, and you don&#8217;t <em>know</em> that the wind is better up there. Furthermore, even if it <em>is</em> better up there, by the time you get off the water, break down, get there, rig up, and get back on the water, that wind could be gone. That wind could have left by that time– and the wind you had at the first place could have left <em>too</em>.</p>
<p>Don&#8217;t give up wind for wind.</p>
<p>I realized that what I was doing was just that. I was obsessing about posts. Do they capture everything I want them to capture, do they have enough comedy, do they poke at, or not poke at, family members who will be upset, or not upset, at being poked at. I&#8217;d spend a week thinking about how I was going to post a short two sentence statement on Facebook, and I found that I had no mental energy for actually writing the longform analysis that I wanted to do, so I didn&#8217;t do it. I was doing all the longform analysis for shortform writing.</p>
<p>I gave up writing for writing.</p>
<h3>Archery and The Final Twist</h3>
<p>But that&#8217;s not even the real, really real, reason I gave up Facebook.</p>
<p>I obsessed over Facebook posts. I would literally sit with someone in conversation and think about how I was going to relate that conversation– or maybe even think about how I was going to relate <em>a completely different conversation</em> on Facebook. At the pool, I thought just as much about how I was going to relate my experience at the pool on Facebook as I did about how I was actually <em>experiencing</em> the pool.</p>
<p>I had inklings of this for a while, but it hit home when I was practicing archery one day. Coming from a martial arts background, I have a consciousness of <em>focus</em> and <em>presence.</em> I use that in many things, of course, but I&#8217;m more conscious of them when I do martial arts-like things, of which archery is one. So one day, I&#8217;m out shooting, and I shoot a really beautiful quiver. I was calm, focused, present, and 5 of 8 arrows are all virtually dead center and spaced about the distance of two quarters. Beautiful.</p>
<p>Now, what I should have done, what I knew I <em>wanted</em> to do, was to ignore those arrows that I&#8217;ve already shot. They don&#8217;t exist. I needn&#8217;t think of the two arrows still in my quiver either, because they don&#8217;t exist. The only thing that exists is this arrow I have nocked and the target. There is nothing but this shot. Quiet, peace, breath, and this one shot are all that exist in the world. That is what I should have thought.</p>
<p>But what I <em>did</em> think is this: <em>Wouldn&#8217;t it be awesome to post a picture of 8 perfectly shot arrows in the target! I&#8217;d love to post that on Facebook.</em></p>
<p><em></em>The next shot I fired was almost a foot off. The shot after that missed the target all together. My final shot even missed my backboard and hit my shed. I realized at that point that I hadn&#8217;t given up writing for writing. I&#8217;d given up the presence of my life for Facebook.</p>
<p>I unstrung my bow, collected my arrows, came inside, and deleted my account.</p>
<h3>A Farewell To Facebook</h3>
<p>Me leaving Facebook had nothing to do with the concept of friends, or with the concept of interaction. It had to do with the concept of presence. Specifically, with my inability to have that presence while I was focused on my obsessive, stupid desire to <em>describe</em> that presence to others.</p>
<p>Sure, I think about how I&#8217;m going to post something on my blog, but it&#8217;s different. I can&#8217;t explain how it&#8217;s different except to say that when I think about my blog, I don&#8217;t actually think about <em>how will I say this on my blog</em>, but rather I think <em>how do I feel about this</em>– and then I <em>write</em> about those feelings on my blog.</p>
<p>Maybe it&#8217;s because longform is the process of understanding of how I feel about something, and then the writing of those feelings. It&#8217;s focused on the feeling, the understanding. Shortform writing is, for me, often focused on just the writing.</p>
<p>I can&#8217;t explain it, really. But I know that when I was standing there with my bow in my hand, looking thirty feet beyond my target at a fletching sticking out of my shed, I wanted to cry. I wanted to cry not because I missed a good shot, or because I missed the opportunity to describe that good shot, but because I was thinking so much about Facebook that I missed the experience of <em>living</em> that shot.</p>
<p>And of so much other living.</p>
]]></content:encoded>
			<wfw:commentRss>http://mettadore.com/analysis/a-farewell-to-facebook-reason-3-obsession-stupidity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Farewell to Facebook, Reason #2: Interaction</title>
		<link>http://mettadore.com/analysis/a-farewell-to-facebook-reason-2-interaction/</link>
		<comments>http://mettadore.com/analysis/a-farewell-to-facebook-reason-2-interaction/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 16:15:27 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Miscellany]]></category>

		<guid isPermaLink="false">http://mettadore.com/?p=923</guid>
		<description><![CDATA[In a previous post, I described the confusion of the term &#8220;friend&#8221; as a primary reason I left Facebook. Another reason I left was confusion over the term &#8220;interact.&#8221; It just seems that much of Facebook is not &#8220;interaction.&#8221; It&#8217;s short anecdotes that people comment on. That&#8217;s not interaction. Interaction is real conversation with someone, [...]]]></description>
			<content:encoded><![CDATA[<p>In a previous post, I described the confusion of the term &#8220;friend&#8221; as a primary reason I left Facebook. Another reason I left was confusion over the term &#8220;interact.&#8221;</p>
<p>It just seems that much of Facebook is not &#8220;interaction.&#8221; It&#8217;s short anecdotes that people comment on. That&#8217;s not interaction. Interaction is real conversation with someone, where you learn about what&#8217;s going on in their lives, in their head. More importantly, interaction is where you learn what&#8217;s going on in your own head.</p>
<p>It&#8217;s growing, it&#8217;s changing, it&#8217;s becoming. It&#8217;s not talking about your cat and having someone else comment on it.</p>
<p>But that&#8217;s what I kept feeling. I felt as though we&#8217;d all sit with our Facebook comments and think that we&#8217;d really interacted with someone because we read about them being sick, or read about them mowing the lawn. I&#8217;d see people that I hadn&#8217;t seen for some time, and they&#8217;d start talking about things that happened a couple weeks ago that they&#8217;d read about on my Facebook page. Most of the time, this would not be comfortable- not because I was uncomfortable with them knowing details of my life, but because they didn&#8217;t know details about my life.</p>
<p>When someone reads a quick Facebook post about something anecdotal that happened in someone&#8217;s life, all they have is an anecdote about what happened. They don&#8217;t have the story, they have a soundbite. They just have a meaningless quip, because they haven&#8217;t actually interacted with the person, with the information.</p>
<p>This is especially true for me and my information. Since I felt that way about Facebook– that it&#8217;s not real interaction– I would liberally sprinkle my anecdotes with comedy, or spice them up to make them much more funny than they&#8217;d otherwise be.</p>
<p>Rate these two possible Facebook posts for comic value:</p>
<p>    I didn&#8217;t feel too hot this morning, but after I ate breakfast, I felt a little better.<br />
    While sickness sucks in general, throwing up immediately after breakfast is a surprisingly effective weight loss strategy</p>
<p>See? Number one is boring. I generally shy away from boring– or at least things that make me feel like I&#8217;m being boring. So I&#8217;d… embellish a bit… and add some comedy… because really, it&#8217;s Facebook, no-one&#8217;s going to actually take it seriously, right?</p>
<p>Wrong. I&#8217;d see someone and they&#8217;d start talking about what&#8217;s going on in my life as if they know about it, and I would often think &#8220;Eh, yeah. Uh, so, that&#8217;s not even really close to what&#8217;s going on. You take Facebook seriously, don&#8217;t you?&#8221;</p>
<p>After enough of these interaction, I start thinking that either a) I need to start taking Facebook seriously too, or b) this is not the best place for my type of semi-realistic humor.<br />
The joy of rumor</p>
<p>So, one day, my wife, Jessica, get&#8217;s a call from her sister saying that shit has hit the fan and she really needs to call her mom.</p>
<p>So she calls her mother, who starts immediately bitching at Jessica for keeping her in the dark and not telling her what&#8217;s going on and why does she have to learn about me getting fired by having Jessica&#8217;s aunt call to gloat about how maybe her son-in-law is not so great after all and maybe she&#8217;ll know what it&#8217;s like to have kids who are unemployed and maybe when one of us gets unemployed Jessica could think to call her mother and tell her her mother instead of giving her aunt a reason to call and gloat!</p>
<p>Now, I&#8217;m a contractor. I have a small business– me– that provides services to other companies that they cannot provide for themselves– software development. Most of the time, those services eventually, well, end. Not in a bad way, mind you, because hopefully I&#8217;ve actually done my job, which is to do something, afterwhich, since there&#8217;s nothing else to do, I leave. So, you could say that I am a complete failure unless I leave a job, because if I don&#8217;t leave, it&#8217;s probably because I never actually finish what I&#8217;m supposed to do.</p>
<p>But sometimes– most of the time really– I really like the people I work with, and grow to think of them as friends, and miss them when I&#8217;m gone. Also, quite often, I&#8217;m not sure about how my work is going to live in the context of the company. Usually, I build something near completion and then the company has to take it and finish it and/or use it. So, because I care about what I make, I worry that it&#8217;s good enough, that it lasts, that it solves the problem I wanted to solve.</p>
<p>So, one day, thinking about all of this, I posted something on Facebook:</p>
<p>&#8220;Last day on the job. Always a bittersweet experience. Gonna really miss it here and the people, and worried about what&#8217;s going to happen next&#8221;</p>
<p>This post is read by my wife&#8217;s cousin, who apparently tells his mom that I&#8217;m leaving my job. His mom, apparently assuming that I&#8217;m only leaving because I&#8217;ve been fired– which is good because she&#8217;s constantly in competition with her sister– i.e. my wife&#8217;s mother– so she calls her sister to gloat. This makes Jessica&#8217;s mom freak out because her daughter&#8217;s husband has been fired, so she naturally calls Jessica&#8217;s sisterto freak out and complain about how she&#8217;s been left in the dark about me being fired because her daughter doesn&#8217;t care to tell her anything.</p>
<p>Jessica&#8217;s response to learning all of this was &#8220;Huh, what?&#8221;<br />
You could just ask, people</p>
<p>Now, admittedly, this isn&#8217;t Facebook&#8217;s fault. The family political firestorm that swept through Jessica&#8217;s family was entirely fed by the dry tinder that is &#8220;Jessica&#8217;s family members relationships with Jessica&#8217;s other family.&#8221; Which is to say that it&#8217;s basically the norm if not exactly normal. Facebook was, at worst, a match carelessly thrown from a car into a pile of dry grass.</p>
<p>Still, the family is flammable, and so we need to be exceptionally careful with sparks. We, I, need to be ever conscious of my matches. And it&#8217;s not just hers. My own family has mis-read sometime comic, sometimes off-color, posts on my Facebook wall and assumed the worst. The thing about all this is that, if it were honestly interaction, then there would be… well… interaction. Think of the two ways the situation above could have been handled:</p>
<p>    Freak out and immediately assume the worst. Call all the other members of your family to ensure the firestorm is as big and as violent as possible. Start preparing your daughter&#8217;s spare room for her post-divorce life, and prep yourself for your unemployed son-in-law to start borrowing large sums of money and never paying them back<br />
    Actually talk to your daughter and find out that they are celebrating over a glass of Oregon Pinot Noir.</p>
<p>One of these really stupid and childish, the other is thoughtful and involves interaction. The thing about Facebook is that it encourages us all to take the stupid and childish path. Facebook does this because it tells us that it is providing interaction- and we all, me included, are dumb enough to believe it.</p>
<p>You see, true interaction would be &#8220;call your daughter and find out that everything is fine.&#8221; That would be interaction. But Facebook has already provided &#8220;interaction.&#8221; So we assume that the actual interaction has already taken place, so the next logical step is to freak the fuck out, right?<br />
Another twist</p>
<p>Of course it&#8217;s an exaggeration. Just as with Facebook, I&#8217;m going for comedy as much as anything. Still, the point remaint, and the point is that if Facebook, as a system, honestly was interaction, freakouts probably wouldn&#8217;t occur at all. And if Facebook honestly encouraged interaction, then the freakout would be avoided because we would all… well… interact!</p>
<p>Rather, Facebook encourages us to assume we have the whole story. It encourages us to assume that the soundbite is all the information that we need. This is bad enough, but it&#8217;s worse when someone like me doesn&#8217;t take it seriously at all, and further obscures reality with comedy and embellishment.</p>
<p>But there&#8217;s another twist. Similar to the first. This wasn&#8217;t the reason I had for leaving. It wasn&#8217;t other people freaking out that caused me to have second thoughts, it was my own change.</p>
<p>I found that I had to be really conscious of what I posted. &#8220;Can I post this? Will her family freak out?&#8221; &#8220;If I post this, can I make it comedic without fallout?&#8221; It was becoming troublesome to make sure that what I posted was… safe.</p>
<p>And so I actually swung the other way, purposely posting stuff that was unsafe just because I shouldn&#8217;t have to worry about it being safe. I&#8217;d post about Jessica walking around wearing nothing but cellophane, not because it has (or ever actually would) happen, but because &#8220;dammit, if I have to worry about posting something that might upset her mother, that pisses me off, so I&#8217;m going to post something that will surely upset her mother.&#8221;</p>
<p>So I went from posting whatever I wanted, to posting only what I thought was safe, to posting what I hoped was unsafe. Which means I went from being angry at other people being stupid to actually being more stupid.</p>
<p>No. Stop. Time to leave.</p>
<p>That&#8217;s the real reason. Because, apparently, I don&#8217;t have the wisdom and self-control to fight stupidity with integrity. Maybe one day I&#8217;ll learn, but until then, I just thought it best for me to go away.</p>
]]></content:encoded>
			<wfw:commentRss>http://mettadore.com/analysis/a-farewell-to-facebook-reason-2-interaction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[A Farewell To Facebook]]></series:name>
	</item>
		<item>
		<title>A Farewell To Facebook, Reason #1: Friends</title>
		<link>http://mettadore.com/analysis/a-farewell-to-facebook-reason-1-friends/</link>
		<comments>http://mettadore.com/analysis/a-farewell-to-facebook-reason-1-friends/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 17:03:10 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Miscellany]]></category>

		<guid isPermaLink="false">http://mettadore.com/analysis/a-farewell-to-facebook-reason-1-friends/</guid>
		<description><![CDATA[Recently, I deleted my Facebook account. Deleted. Completely.1 When I did this, many friends and family expressed surprise, sometimes outright frustration, that I would leave Facebook. According to them, there were a number of reason I should not have left, but primary among them was that I&#8217;d be eliminating that important way to communicate with [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, I deleted my Facebook account.</p>
<p>Deleted. Completely.<sup><a href="http://mettadore.com/analysis/a-farewell-to-facebook-reason-1-friends/#footnote_0_919" id="identifier_0_919" class="footnote-link footnote-identifier-link" title="or, as completely as Facebook will delete any account, which is likely not very complete">1</a></sup> When I did this, many friends and family expressed surprise, sometimes outright frustration, that I would leave Facebook. According to them, there were a number of reason I should not have left, but primary among them was that I&#8217;d be eliminating that important way to communicate with me and see what I&#8217;m doing.<sup><a href="http://mettadore.com/analysis/a-farewell-to-facebook-reason-1-friends/#footnote_1_919" id="identifier_1_919" class="footnote-link footnote-identifier-link" title="This, I state clearly, is patently ridiculous. Twitter, blog, web, I have a rather active internet profile. Google John Metta to see why anyone can get a hold of me, and know almost everything I&amp;#8217;m doing in real-time. I suspect that the real reason for any frustration is more honestly that it won&amp;#8217;t be as easy to get a hold of me.">2</a></sup></p>
<p>I&#8217;ve been thinking a lot about writing a &#8220;why I&#8217;ve left Facebook&#8221; post and almost didn&#8217;t. After all, I dropped off the radar on a random day, at a random time, without any warning. I wanted a clean break, and writing a &#8220;why&#8221; isn&#8217;t really clean. But, I do want to express my reasons for leaving. They amount to three fundamental things</p>
<ol>
<li>Confusion over what it means to be <em>a friend</em></li>
<li>Confusion over what it means to <em>interact.</em></li>
<li><em></em>My own personal tendency to <em>obsess</em>.</li>
</ol>
<p>Because I&#8217;m a loquacious SOB, I decided that each of these warrants it&#8217;s own post. Here&#8217;s the first.</p>
<h3>The meaning of &#8220;Friend&#8221;</h3>
<p>One big reason Facebook drove me crazy is that way too many people just got way too caught up pouring as much emotional meaning into <em>friending</em> as they possibly could. I didn&#8217;t see Facebook&#8217;s use of &#8220;Friend&#8221; as meaningful as others did. When I started using Facebook, I made a rule for myself that I&#8217;d have no more than 100 &#8220;friends.&#8221; Why? Because I personally couldn&#8217;t honor more than that many people with the real, honest communication that I wanted to.</p>
<p>Now, this is a personal decision, I admit. Many people friend everyone on Facebook and don&#8217;t feel they have to &#8220;honor&#8221; them at all. I may seem ridiculous when I say this, but I truly believe that everything we use, we should use in the way that best supports our own personality and personal growth. Everything we do, we should do mindfully and with intention. For some people, that means friending everyone. That&#8217;s fine. My mindful– my personal– decision was to friend a small enough number of people that I could truly interact with them all.</p>
<p>I also made a conscious decision to friend only family, and people whom I actually considered friends in person. People whom I saw regularly, or for whom continuous strong communication was important. If I would regularly go out of my way in everyday life to see you, or to be with you, or to contact you (or you, me) then I&#8217;d probably friend you. If I didn&#8217;t have that opportunity (because, say, you lived far away), but wanted to, I&#8217;d probably friend you. If you lived in the same very small town as me, and I only saw you when we bumped into each other accidentally, then no, I probably won&#8217;t friend you.</p>
<p>Again, not the way many others use it, and that&#8217;s fine, because that&#8217;s the way I, mindfully, intentionally decided to use it in a way that best supported my own personal convictions.</p>
<p>What I found, however, was that people were often offended and angry with me because I didn&#8217;t not want to <em>friend</em> them.<sup><a href="http://mettadore.com/analysis/a-farewell-to-facebook-reason-1-friends/#footnote_2_919" id="identifier_2_919" class="footnote-link footnote-identifier-link" title="It&amp;#8217;s an unfortunate reality that many people on Facebook expect you to use Facebook the way they use Facebook, and if you don&amp;#8217;t, then you are #doingitwrong.">3</a></sup> So, I would ignore friend requests from people whom I didn&#8217;t actually know, or from people whom I didn&#8217;t consider an actual <em>friend</em>, or people who I very occasionally saw around town but whom I never really interacted with. This caused a surprising number of &#8220;why won&#8217;t you friend me?&#8221; problems.</p>
<p>I would also <em>un-friend</em> people whom I had been &#8220;friends&#8221; with, but whom I had not interacted with. Let&#8217;s call this &#8220;the normal dissolution of a relationship that&#8217;s happened quite naturally for at least 1.5 million years before Facebook existed.&#8221; I mean, seriously, I don&#8217;t read what you post, you don&#8217;t read what I post, yet you&#8217;re angry when I suddenly disappear from your stream? (A stream that might be active enough that you can&#8217;t actually read what I&#8217;m posting <em>anyway</em>).</p>
<p>Then there was what I would call &#8220;the regular culling.&#8221; I would end up with 150 &#8220;friends,&#8221; and decided to pare it down to my decided maximum 100. And people got surprisingly angry with my decisions, angry with my reasoning for why I would un-friend them vs. someone else. People would ask other people if I dropped them because of something that they posted that I never even read. It was ridiculous.</p>
<h3>Facebook as emotional support mechinism</h3>
<p>The result of all my mindful decisions on how I wanted to use Facebook was that I found myself needing to justify my decision on how I would use this piece of software strictly so that I could appease other people&#8217;s emotional security. If I un-friended someone, I would often get very stern demands for an explanation of why I unfriended them.</p>
<p>Really? I need to <em>justify</em> myself?</p>
<p>I found myself not wanting to explain, but to shout. Look people, it&#8217;s fucking software. It&#8217;s a goddamned tool. It&#8217;s like a wrench. It&#8217;s useful for some forms of communication. You don&#8217;t get all sobs and whines when I say I don&#8217;t have your phone number, do you? No! You don&#8217;t get upset and demand an explanation of my reasoning when I say I lost your email address, do you? No! Why? Because it&#8217;s not a statement of your worthiness as a human being for fuck&#8217;s sake! It&#8217;s a fucking tool!</p>
<p>I used Facebook as a tool. As another in a large suite of communication methodologies which I could use to transmit thoughts and information to and from people with whom I wanted to communicate. It&#8217;s nothing more than that, to me.<sup><a href="http://mettadore.com/analysis/a-farewell-to-facebook-reason-1-friends/#footnote_3_919" id="identifier_3_919" class="footnote-link footnote-identifier-link" title="Well, that and a comic platform, but that&amp;#8217;s the topic of another post">4</a></sup> I realized however, that to many other people, it was a statement of whether you cared about them as a person, or whether they were good enough, or whether their emotions could handle the personal decisions of other people– decisions which have nothing whatsoever to do with them.</p>
<p>I realized that it often felt like high school all over again. &#8220;You don&#8217;t want to take 5th period english?! But you know I&#8217;m in 5th period english! Did you drop it because you don&#8217;t like me?!&#8221;</p>
<p>No, I dropped you because I had 120 &#8220;friends&#8221; and chose 20 almost at random, and you happened to be one of them. Grow up, put on your big-boy panties, and</p>
<p>Get over it.</p>
<h3>The truth of Reason #1</h3>
<p>But here&#8217;s the plot twist at the end of the movie: That&#8217;s all bullshit– well, it&#8217;s all true, but it&#8217;s not the real reason.</p>
<p>I didn&#8217;t leave Facebook because because people were being emotionally childish about my arbitrary decisions at all. I left Facebook because <em>I, myself</em>, was becoming caught up in the personal politics. It wasn&#8217;t that people were demanding reasoning for my decisions anymore. It was because I, myself, was making decisions based on whether they <em>might</em> demand my reasoning.</p>
<p>I would look at my friend count and see &#8220;150&#8243; and think &#8220;there are only about 90 that I&#8217;d really like to keep, but the other 60 will get grumpy if I un-friend them.&#8221; Even worse, I would friend people just because I knew that if I didn&#8217;t, there&#8217;d be fallout.</p>
<p>Really?</p>
<p>So, I&#8217;m all mad at people for playing stupid, emotionally immature political games because of a piece of software, and how do I fight that? I play stupid, emotionally immature political games!</p>
<p>No. Stop. Time to leave.</p>
<p>So, that&#8217;s my real, honest Reason #1 for leaving Facebook. Not that other people were being ridiculous, but be <em>I</em> was being ridiculous. It was affecting not only the decisions I made, but it was affecting <em>why </em>I was making decisions.</p>
<p>And I decided that wasn&#8217;t positive.</p>
<ol class="footnotes"><li id="footnote_0_919" class="footnote">or, as completely as Facebook will delete <em>any</em> account, which is likely not very complete</li><li id="footnote_1_919" class="footnote">This, I state clearly, is patently ridiculous. Twitter, blog, web, I have a rather active internet profile. Google John Metta to see why anyone can get a hold of me, and know almost everything I&#8217;m doing in real-time. I suspect that the real reason for any frustration is more honestly that it won&#8217;t be as <em>easy</em> to get a hold of me.</li><li id="footnote_2_919" class="footnote">It&#8217;s an unfortunate reality that many people on Facebook expect you to use Facebook the way <em>they</em> use Facebook, and if you don&#8217;t, then you are #doingitwrong.</li><li id="footnote_3_919" class="footnote">Well, that and a comic platform, but that&#8217;s the topic of another post</li></ol>]]></content:encoded>
			<wfw:commentRss>http://mettadore.com/analysis/a-farewell-to-facebook-reason-1-friends/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[A Farewell To Facebook]]></series:name>
	</item>
		<item>
		<title>Censorship</title>
		<link>http://mettadore.com/analysis/censorship/</link>
		<comments>http://mettadore.com/analysis/censorship/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 17:07:49 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Miscellany]]></category>

		<guid isPermaLink="false">http://mettadore.com/?p=913</guid>
		<description><![CDATA[Dear friends, I just emailed Congress to urge them to oppose the Internet Blacklist Legislation, known as the PROTECT-IP Act in the Senate and the Stop Online Piracy Act (SOPA) in the House. This legislation seeks to give the executive branch power to conduct slash-and-burn campaigns against websites that allegedly host – or even link [...]]]></description>
			<content:encoded><![CDATA[<p>Dear friends,</p>
<p>I just emailed Congress to urge them to oppose the Internet Blacklist Legislation, known as the PROTECT-IP Act in the Senate and the Stop Online Piracy Act (SOPA) in the House. This legislation seeks to give the executive branch power to conduct slash-and-burn campaigns against websites that allegedly host – or even link to – content that infringes on intellectual property rights. That would “disappear” whole domain names, fundamentally undermining Internet security, and/or choke off their financial support. The Internet Blacklist Legislation puts more sites than ever at risk, effectively upending the DMCA safe harbors that have been crucial to the growth of Internet innovation and creativity.</p>
<p>Sadly, these short-sighted and dangerous bills won’t do much to stop online infringement – but they will jeopardize our ability to speak and read online with the kind of freedom we cherish in the offline world. Deep-pocketed Hollywood lobbyists are aggressively pushing to control and censor the open Internet, willing to sacrifice free speech and our Internet culture in hopes of controlling how people view their movies and products.</p>
<p>We need to stop this bill before it goes any further. Will you contact your representatives in Congress and urge them to oppose the Internet Blacklist Legislation? Visit: https://eff.org/r.C8A</p>
]]></content:encoded>
			<wfw:commentRss>http://mettadore.com/analysis/censorship/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Polymorphic :has_many, :through in Rails modules</title>
		<link>http://mettadore.com/ruby/polymorphic-has_many-through-in-rails-modules/</link>
		<comments>http://mettadore.com/ruby/polymorphic-has_many-through-in-rails-modules/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 19:28:49 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://mettadore.com/?p=895</guid>
		<description><![CDATA[[Update: Stephan Wehner actually showed me how to get this working (see his branch). Something else was wrong in the program I was actually using, which went away when I built this simplified version- I just never really tested with the simplified version. Thus, this post is now pointless. Thanks Stephan.] Recently, I had need [...]]]></description>
			<content:encoded><![CDATA[<h3>[Update: <a href="http://stephan.sugarmotor.org/">Stephan Wehner</a> actually showed me how to get this working (see <a href="https://github.com/johnmetta/polymorphic_plugin/tree/class-name">his branch</a>). Something else was wrong in the program I was actually using, which went away when I built this simplified version- I just never really tested with the simplified version. Thus, this post is now pointless. Thanks Stephan.]</h3>
<p>Recently, I had need to create a plugin that held a polymorphic :has_many, :through relationship. I spent a day or so trying to get this to work, only to realize that it is essentially impossible to do inside a pluggable Rails module, but possible if you templatize the classes.</p>
<h3>PolymorphicPlugin Example Project</h3>
<p>There&#8217;s a <a href="http://stackoverflow.com/questions/8130537/polymorphic-has-many-through-as-module-in-rails-3-1-plugin">StackOverflow thread</a> that describes this problem and the solution a bit; however, Based on the difficulty, and the fact that I couldn&#8217;t find any documentation specific to this problem, I figured I&#8217;d write it up as an example, and create a PolymorphicPlugin gem to illustrate it better.</p>
<p>The <a href="https://github.com/johnmetta/polymorphic_plugin/tree/side-module">PolymorphicPlugin inside-module branch</a> is an example of the way you&#8217;d distribute a pluggable Rails module with all classes contained in the module. The generator only creates a migration in the Rails project.</p>
<p>The <a href="https://github.com/johnmetta/polymorphic_plugin/tree/outside-module">PolymorphicPlugin outside-module</a> branch is an example of the way you&#8217;d distribute a pluggable Rails module in such a way that the generator creates a migration in <em>and also copies model files to</em> the Rails project.</p>
<h3>Problem Description</h3>
<p>The idea is that there&#8217;s an &#8220;acts_as&#8221; like plugin that I want to add to my Rails models:</p>
<pre class="brush: ruby; title: ; notranslate">
module PolymorphicPlugin
  module PolymorphicHolder

    def self.included(base)
      base.extend ClassMethods
    end

    module ClassMethods
      def holds_things
        has_many :thing_groupings, :as =&gt; :thingable
        has_many :things, :through =&gt; :thing_groupings
        include PolymorphicPlugin::PolymorphicHolder::InstanceMethods
      end
    end

    module InstanceMethods

      def has_things?
        true
      end

    end
  end
end
</pre>
<p>You can see that anything that calls <code>holds_things</code> should have a :has_many relationship with <code>Thing</code> through the <code>ThingGrouping</code> join table. This is a standard paradigm for a polymorphic :has_many, :through relationship.</p>
<p>Basically, I want to do this:</p>
<pre class="brush: ruby; title: ; notranslate">
class User &lt; ActiveRecord::Base
  holds_things
end

class Admin &lt; ActiveRecord::Base
  holds_things
end

user = User.new
user.has_things? -&gt; true

admin = Admin.new
admin.has_things? -&gt; true
</pre>
<div id="attachment_897" class="wp-caption alignleft" style="width: 210px"><a href="http://mettadore.com/files/2011/11/Screen-Shot-2011-11-15-at-10.51.18-AM.png"><img src="http://mettadore.com/files/2011/11/Screen-Shot-2011-11-15-at-10.51.18-AM-300x283.png" alt="" title="Screen Shot 2011-11-15 at 10.51.18 AM" width="200" class="size-medium wp-image-897" /></a><p class="wp-caption-text">inside-module plugin layout</p></div>
<h3>The failing case</h3>
<p>Seems pretty simple, right?</p>
<p>Turns out it&#8217;s not. Take a look at the directory layout that I tried to use. This seems like a standard for a gemmable plugin. The model files are contained in the gem library, and accessed as part of the module. When you use <code>gem 'polymorphic_plugin'</code>, the only thing that gets copied to your Rails project is the migration file. Nice and clean.</p>
<p>Unfortunately, that doesn&#8217;t work. If you clone this branch and run <code>rake test</code> you&#8217;ll get exceptions. Specifically, a <code>NameError: uninitialized constant User::ThingGrouping</code> because our <code>User</code> model, by extending the <code>PolymorphicHolder</code> module, doesn&#8217;t have access to this unknown model called <code>ThingGrouping</code>.</p>
<p>And no, using things like <code>:class_name</code> and <code>:source</code> were no help. <a href="http://stackoverflow.com/questions/8130537/polymorphic-has-many-through-as-module-in-rails-3-1-plugin">I tried everything, or seemingly everything</a>. Nothing would make this work.</p>
<div id="attachment_898" class="wp-caption alignleft" style="width: 210px"><a href="http://mettadore.com/files/2011/11/Screen-Shot-2011-11-15-at-10.52.40-AM.png"><img src="http://mettadore.com/files/2011/11/Screen-Shot-2011-11-15-at-10.52.40-AM-300x281.png" alt="" title="Screen Shot 2011-11-15 at 10.52.40 AM" width="200" class="size-medium wp-image-898" /></a><p class="wp-caption-text">outside-module plugin layout</p></div>
<h3>The passing case</h3>
<p>That is until I pulled the models outside of the plugin module. </p>
<p>Take a look at the directory layout now and you&#8217;ll notice that the <code>Thing</code> and <code>ThingGrouping</code> models are no longer in the plugin&#8217;s lib directory. Moving them to the templates directory is the unfortunate answer.</p>
<p>I say &#8220;unfortunate&#8221; because this means that the models need to be distributed by copying them to the Rails project. In other words, there&#8217;s a line in my <code>PolymorphicPluginGenerator</code> that reads: <code>    template "thing.rb", File.join('app/models', "thing.rb")</code>. In other words: Copy the <code>Thing</code> model into this project so it can be accidentally futzed with by users and maybe, if we&#8217;re lucky, cause some interesting name collisions.</p>
<p><code>Thing</code> and <code>ThingGroup</code> are no longer contained inside my PolymorphicPlugin module. They are top-level classes equivalent to anything generated with <code>rails generate model</code>. Not a solution that I&#8217;m fond of, but one that passes my tests. We can at least have a polymorphic :has_many, :through relationship now.</p>
<h3>Outcome</h3>
<p>Polymorphic :has_many, :through relationships are available in pluggable Rails modules, but it&#8217;s a bit of a kludge. You&#8217;ll need to make sure you name your polymorphic classes smartly to avoid name collisions with the calling Rails project. You&#8217;d hate to create a plugin with a model like <code>Book</code> only to find that <code>Book</code> already exists in someone&#8217;s Rails project!</p>
<p>I&#8217;d love to be proven wrong on this, by the way. Go ahead and <a href="https://github.com/johnmetta/polymorphic_plugin">grab the Github repository</a> and play with the inside-module branch. If you can make it work, I&#8217;ll buy you a beer!</p>
]]></content:encoded>
			<wfw:commentRss>http://mettadore.com/ruby/polymorphic-has_many-through-in-rails-modules/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails 3.1 Gemmable Plugins with RSpec</title>
		<link>http://mettadore.com/ruby/rails-3-1-gemmable-plugins-with-rspec/</link>
		<comments>http://mettadore.com/ruby/rails-3-1-gemmable-plugins-with-rspec/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 19:41:27 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://mettadore.com/?p=888</guid>
		<description><![CDATA[I&#8217;ve had a bitch of a time lately getting the new Rails 3.1 plugin architecture to play nicely with RSpec. I actually gave up and coded an entire plugin with Test::Unit before finally figuring out a decent way to do it. Currently, the new Rails 3.1 mountable plugin architecture will not work with RSpec. There&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve had a bitch of a time lately getting the new Rails 3.1 plugin architecture to play nicely with RSpec. I actually gave up and coded an entire plugin with Test::Unit before finally figuring out a decent way to do it.</p>
<p>Currently, the new Rails 3.1 mountable plugin architecture <a href="https://github.com/rspec/rspec-rails/issues/258">will not work with RSpec</a>. There&#8217;s a gem called <a href="https://github.com/josevalim/enginex">Enginex</a> that will work with RSpec, but it <a href="https://github.com/josevalim/enginex/issues/35">won&#8217;t work with Rails 3.1</a>. So it looks like you either get RSpec or Rails 3.1. What&#8217;s the deal?</p>
<p>Playing around, I figured out that combining the two will work:</p>
<pre class="brush: bash; title: ; notranslate">
$ gem install enginex
…
$ enginex my_plugin --test-framework=rspec
…
$ rails -v
Rails 3.1.1
$ rails plugin new stock_plugin --full
…
$ rm -rf my_plugin/spec/dummy
$ cp -r stock_plugin/test/dummy my_plugin/spec
</pre>
<p>After that, it&#8217;s just a matter of modifying my_plugin/spec/dummy/config/application.rb to require your gem, and clean up the spec_helper.rb file. I also changed the Gem files so that my_plugin.gemspec held the dependencies, and Gemfile just called that. This is the way the stock Rails 3.1 generator works. Enginex uses Gemfile as the canonical source, and I like the new way better.</p>
<p>Using this I&#8217;ve currently got a Rails 3.1 gemmable plugin with RSpec, Cucumber, Capybara, Spork, Guard, and Simplecov working just fine.</p>
]]></content:encoded>
			<wfw:commentRss>http://mettadore.com/ruby/rails-3-1-gemmable-plugins-with-rspec/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

