<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>The Coding Hillbilly</title>
    <link>http://kyle.baley.org/</link>
    <description>Our standards are very low</description>
    <language>en-us</language>
    <copyright>Kyle Baley</copyright>
    <lastBuildDate>Thu, 25 Jun 2009 22:01:32 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.0.7226.0</generator>
    <managingEditor>kyle@baley.org</managingEditor>
    <webMaster>kyle@baley.org</webMaster>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/TheCodingHillbilly" type="application/rss+xml" /><item>
      <trackback:ping>http://kyle.baley.org/Trackback.aspx?guid=f357332f-f144-4a39-9b09-9ba0222ba6e9</trackback:ping>
      <pingback:server>http://kyle.baley.org/pingback.aspx</pingback:server>
      <pingback:target>http://kyle.baley.org/PermaLink,guid,f357332f-f144-4a39-9b09-9ba0222ba6e9.aspx</pingback:target>
      <dc:creator>The Coding Hillbilly</dc:creator>
      <wfw:comment>http://kyle.baley.org/CommentView,guid,f357332f-f144-4a39-9b09-9ba0222ba6e9.aspx</wfw:comment>
      <wfw:commentRss>http://kyle.baley.org/SyndicationService.asmx/GetEntryCommentsRss?guid=f357332f-f144-4a39-9b09-9ba0222ba6e9</wfw:commentRss>
      
      <title>Becoming a better developer, or &amp;ldquo;How to sidestep a question&amp;rdquo;</title>
      <guid isPermaLink="false">http://kyle.baley.org/PermaLink,guid,f357332f-f144-4a39-9b09-9ba0222ba6e9.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheCodingHillbilly/~3/uMUhoEf_rzU/BecomingABetterDeveloperOrLdquoHowToSidestepAQuestionrdquo.aspx</link>
      <pubDate>Thu, 25 Jun 2009 22:01:32 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
This post is over a week in the making. I attended &lt;a href="http://ukdotnet.ning.com/xn/detail/2391280:Event:5286"&gt;AltNetBeers&#xD;
#9&lt;/a&gt; last week in London which is making a quick rise in my list of top developer-related&#xD;
events, big or small. And that’s not just because I got one of the best compliments&#xD;
ever from someone who claims his non-IT friend reads a single IT-related blog (take&#xD;
that, Hanselman!). Anyway, it’s nice to know I’m reaching my target audience.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The event was not altogether removed from what &lt;a href="http://serialseb.blogspot.com/"&gt;Sebastien&lt;/a&gt; outlined&#xD;
at the one I attended &lt;a href="http://codebetter.com/blogs/kyle.baley/archive/2008/06/19/london-alt-net-beers-recap.aspx"&gt;last&#xD;
year&lt;/a&gt; which shows a degree of vision to which I only aspire. We spent a couple&#xD;
of hours talking on a topic of choice (as voted by attendees), then socialized until&#xD;
the place closed down at the unreasonable hour of 11pm. I’m told much merriment ensued&#xD;
afterward but, after &lt;a href="http://img34.yfrog.com/i/55x.jpg/"&gt;posing for a picture&lt;/a&gt;,&#xD;
I made my way back to the hotel.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The topic at hand, and I’m paraphrasing: How do we become better developers today,&#xD;
and how do we create them tomorrow? Nice and subjectively vague, just how I like my&#xD;
open spaces. The runner up topic, brownfield applications, seemed suspiciously planted&#xD;
so I threw my weight behind the one we eventually chose.&#xD;
&lt;/p&gt;&#xD;
        &lt;div style="border-bottom: black 1px solid; border-left: black 1px solid; padding-bottom: 0.25em; background-color: #dddddd; margin: 0.25em; padding-left: 0.25em; width: 245px; padding-right: 0.25em; float: right; font-size: 8pt; border-top: black 1px solid; border-right: black 1px solid; padding-top: 0.25em"&gt;&#xD;
          &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" src="http://kyle.baley.org/content/binary/WindowsLiveWriter/c385c5157c18_EB80/image_3.png" width="244" height="164"&gt;&lt;/img&gt; Kinda&#xD;
concerned at how often this image is relevant to my posts&#xD;
&lt;/div&gt;&#xD;
        &lt;p&gt;&#xD;
Conversation ran the usual gamut from apprenticeship programs (and thanks to &lt;a href="http://neildoesdotnet.blogspot.com/"&gt;Neil&lt;/a&gt; for&#xD;
the extensive historical thesis into the concept) to showing passion to defining professions&#xD;
to just going out there and doing it. My position through most of it was to focus&#xD;
more on the non-technical skillz, to the point where I think I pooh-poohed actual&#xD;
book learning more than I should have. If you decided, based on my advice, to drop&#xD;
out of university, I’d advise you to politely grovel to your dean to get back in.&#xD;
It’s still important. But take a psyche course or two when you go back.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Alas, we didn’t offer as much practical advice to the first part of the question as&#xD;
I would have liked so I’m expanding on the closing comment I made. It was essentially:&#xD;
Follow your instincts.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Now, there’s a danger with throwing out a broad statement like this because I made&#xD;
it in a very specific context. Namely, in a crowd of people who had taken time out&#xD;
of their lives to come to an IT-related event (albiet, one with more social activities&#xD;
than your average code camp; it *is* held in a pub after all). These are people who,&#xD;
at some level, have made a conscious decision to improve themselves on their own time.&#xD;
They could have had much better things to do but their instincts told them that this&#xD;
was an event that was more important than attending the new West End show, Deliverance:&#xD;
The Musical. (Side note: I know I just made that up now but MAN, the Duellin’ Banjoes&#xD;
scene would rock live; I suspect they’d lose a lot of people at intermission though.)&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
A lot of people have questions like, well, how do I make myself a better developer.&#xD;
The fact that they are asking those questions is the first step. The next step is&#xD;
to trust that they can muddle their way through their own answer. Because as we proved&#xD;
last Wednesday night, the same answer may not work for everybody. Me? I’m not much&#xD;
of a book learner. Nor, ironically, do I get much out of scanning blog posts (other&#xD;
than creating my own internal Google index so I know where to look later when the&#xD;
topic becomes relevant to me).&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
It’s dead simple to make yourself a better developer nowadays. Resources are plentiful&#xD;
and mostly free. And the ones you pay for, like conferences and training courses,&#xD;
are easy enough to rank with a little research (e.g. JP’s Nothin’ But .NET, Oredev,&#xD;
NDC). All it takes is a focused effort to make yourself better and to put some thought&#xD;
into how you go about it. You alone know which bloggers out there speak the same language&#xD;
you do. And you alone know which technologies will help you in your daily life and&#xD;
which ones interest you. Yes, SharePoint developers are in high demand but is it a&#xD;
product you want to learn and spend eight hours a day working with? (That’s not meant&#xD;
to be facetious actually, stop laughing.)&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
There will be much second-guessing and wondering which way you should go. And that’s&#xD;
fine. I won’t pretend I’ve made the right decisions all the time but like the software&#xD;
we’re supposed to be writing, most decisions are reversible. Humming or hawing about&#xD;
a contract in Dubai? Go for it. If you don’t like it, go home when it’s done. Worried&#xD;
about being away from your family that long? Well, you have some soul-searching to&#xD;
do but once you’ve made the decision, move on to the next one.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Was it the right decision? In my experience, unless you have direct and obvious evidence&#xD;
to the contrary, the answer is always yes.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Like I said, the topic is generic enough that pretty much everyone’s opinion will&#xD;
be valid, likely because it has worked for them personally. The underlying message&#xD;
I want to get across isn’t so much how to improve yourself (because you already know&#xD;
how to do it), but rather, if you’re in the London area, AltNetBeers is not to be&#xD;
missed. Many thanks to Neil, Toby, Scott, Andrew, Chris (both of them), Paul, Christian,&#xD;
and Lorenzo for the conversations and, of course, to the incredibly humble and reticent&#xD;
Sebastien Lambla for organizing and chairing the event, and also to Neil Robbins for&#xD;
the geek lunch two days later.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Kyle the Well-Shod&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://kyle.baley.org/aggbug.ashx?id=f357332f-f144-4a39-9b09-9ba0222ba6e9"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=uMUhoEf_rzU:qjBhMZNDs6w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=uMUhoEf_rzU:qjBhMZNDs6w:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=uMUhoEf_rzU:qjBhMZNDs6w:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?i=uMUhoEf_rzU:qjBhMZNDs6w:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=uMUhoEf_rzU:qjBhMZNDs6w:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheCodingHillbilly/~4/uMUhoEf_rzU" height="1" width="1"/&gt;</description>
      <comments>http://kyle.baley.org/CommentView,guid,f357332f-f144-4a39-9b09-9ba0222ba6e9.aspx</comments>
      <category>Career</category>
    <feedburner:origLink>http://kyle.baley.org/BecomingABetterDeveloperOrLdquoHowToSidestepAQuestionrdquo.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://kyle.baley.org/Trackback.aspx?guid=fcab55ae-5369-4daa-80f1-47bb2ae69ec8</trackback:ping>
      <pingback:server>http://kyle.baley.org/pingback.aspx</pingback:server>
      <pingback:target>http://kyle.baley.org/PermaLink,guid,fcab55ae-5369-4daa-80f1-47bb2ae69ec8.aspx</pingback:target>
      <dc:creator>The Coding Hillbilly</dc:creator>
      <wfw:comment>http://kyle.baley.org/CommentView,guid,fcab55ae-5369-4daa-80f1-47bb2ae69ec8.aspx</wfw:comment>
      <wfw:commentRss>http://kyle.baley.org/SyndicationService.asmx/GetEntryCommentsRss?guid=fcab55ae-5369-4daa-80f1-47bb2ae69ec8</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>T before A, except after Views</title>
      <guid isPermaLink="false">http://kyle.baley.org/PermaLink,guid,fcab55ae-5369-4daa-80f1-47bb2ae69ec8.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheCodingHillbilly/~3/UTksZvv7kPI/TBeforeAExceptAfterViews.aspx</link>
      <pubDate>Thu, 11 Jun 2009 12:30:43 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I got an e-mail from someone wondering why his ASP.NET page was getting bigger and&#xD;
bigger and what this huge hidden INPUT tag was in the source. I smiled knowingly and&#xD;
went about my reply. That’s not the reason for this post but it is the context which&#xD;
led to it.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
If you have an iTouch or iPhone with auto-correct turned on, here’s a little typing&#xD;
exercise for you. Type the following two words without having to press backspace to&#xD;
correct them:&#xD;
&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
ViewState &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
RedWings&lt;sup&gt;1&lt;/sup&gt;&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
Capitalization doesn’t matter.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
If you have the same issue I have, this will be impossible. In any application, whether&#xD;
it be Safari, Notes, Lucky Ladies of the Ozarks, or Twitteriffic. As soon as you type&#xD;
“viewst”, it is impossible to press the A or D keys. Similarly, when you type “redw”,&#xD;
the next key can not be I or J. In order to type these words out, you must enter some&#xD;
other letter, then backspace to correct it. Then it will let you type the one you&#xD;
want.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
A quick BinG/oogle didn’t provide any answers but the iridescent &lt;a href="http://twitter.com/scottcreynolds/status/2111248536"&gt;Scott&#xD;
Reynolds&lt;/a&gt; provided one clue by suggesting that auto-correct was the culprit, which,&#xD;
of course, it was. That said, I’ve never had auto-correct actually prevent me from&#xD;
typing anything, only suggest.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
No solution for me as yet except to turn off auto-correct, which I should do anyway,&#xD;
given the number of times I type tunderin’. Of course, the fact that it’s trying to&#xD;
prevent me from typing ViewState in the first place suggests that this is actually&#xD;
desired behaviour.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Kyle the Touched&#xD;
&lt;/p&gt;&#xD;
        &lt;p style="font-size: 8pt"&gt;&#xD;
          &lt;sup&gt;1&lt;/sup&gt;Those of you who know about my knowledge of sports may wonder how I discovered&#xD;
this one. Easy: I didn’t. Twas the mighty &lt;a href="http://twitter.com/HuntJason/status/2111200758"&gt;@HuntJason&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://kyle.baley.org/aggbug.ashx?id=fcab55ae-5369-4daa-80f1-47bb2ae69ec8"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=UTksZvv7kPI:nZGlpussuCc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=UTksZvv7kPI:nZGlpussuCc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=UTksZvv7kPI:nZGlpussuCc:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?i=UTksZvv7kPI:nZGlpussuCc:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=UTksZvv7kPI:nZGlpussuCc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheCodingHillbilly/~4/UTksZvv7kPI" height="1" width="1"/&gt;</description>
      <comments>http://kyle.baley.org/CommentView,guid,fcab55ae-5369-4daa-80f1-47bb2ae69ec8.aspx</comments>
      <category>Sundry</category>
    <feedburner:origLink>http://kyle.baley.org/TBeforeAExceptAfterViews.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://kyle.baley.org/Trackback.aspx?guid=e782b745-3a43-4234-a5cf-99df9182b0be</trackback:ping>
      <pingback:server>http://kyle.baley.org/pingback.aspx</pingback:server>
      <pingback:target>http://kyle.baley.org/PermaLink,guid,e782b745-3a43-4234-a5cf-99df9182b0be.aspx</pingback:target>
      <dc:creator>The Coding Hillbilly</dc:creator>
      <wfw:comment>http://kyle.baley.org/CommentView,guid,e782b745-3a43-4234-a5cf-99df9182b0be.aspx</wfw:comment>
      <wfw:commentRss>http://kyle.baley.org/SyndicationService.asmx/GetEntryCommentsRss?guid=e782b745-3a43-4234-a5cf-99df9182b0be</wfw:commentRss>
      
      <title>A different shade of rose, or &amp;ldquo;How to&amp;hellip;actually, I&amp;rsquo;m not up for subtitling this one&amp;rdquo;</title>
      <guid isPermaLink="false">http://kyle.baley.org/PermaLink,guid,e782b745-3a43-4234-a5cf-99df9182b0be.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheCodingHillbilly/~3/X9eMq7Vrqvw/ADifferentShadeOfRoseOrLdquoHowTohellipactuallyIrsquomNotUpForSubtitlingThisOnerdquo.aspx</link>
      <pubDate>Fri, 05 Jun 2009 17:09:46 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
To me, nothing is more disheartening than having my optimistic view of the world negated.&#xD;
Yes, sometimes people do irrational things on a regular basis but in the back of my&#xD;
mind, I always think there is a middle ground that can be achieved somehow. That hope&#xD;
is never lost. Or at the very least, that it won’t affect me personally. (Side note:&#xD;
I jest. Look it up.)&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So here’s a question: What would you do if people more experienced than you were brought&#xD;
in to your team to work with on a project? Would you react with fear that you wouldn’t&#xD;
be able to keep up, or that your job was in jeopardy, or that they’d go crazy trying&#xD;
to implement “new-fangled” ideas like MVP? Or would you welcome the opportunity to&#xD;
learn and advance your craft.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
What happens when they start introducing concepts that they know in their heart of&#xD;
hearts will make the application better but that you don’t agree with at first glance?&#xD;
Do you dig in your heels and violently oppose them? Or engage in a debate to come&#xD;
to some common understanding?&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
These are leading questions, obviously, and you know what my answers are to these&#xD;
questions. This post is more about the people, the ones that answer yes to the former&#xD;
questions rather than the latter above, even if they do it subconsciously.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Simply put, it’s frustrating. I’ve tried to rationalize the responses I get but the&#xD;
only conclusion I can come to the fits is that there are people in this world who&#xD;
are not only unteachable but are also steadfastly against even &lt;em&gt;trying&lt;/em&gt; to&#xD;
learn. I was so &lt;em&gt;sure&lt;/em&gt; that these people didn’t exist.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
For someone who always thinks people want to do their best and always want to improve&#xD;
themselves and their craft, it’s depressing. Maybe I’ve just been lucky in my career&#xD;
that I’ve never encountered them, or maybe I’m just insulated from them because the&#xD;
people that I hang with, that go to or speak at user groups and conferences, are pre-inclined&#xD;
to the continuous learning disposition. But it’s not just in my industry. I can’t&#xD;
think of a single person I know well that doesn’t want to be better at what they do,&#xD;
whether it’s accounting, or land surveying, or nursing.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
It’s not the lack of knowledge that bothers me so much as it is the close-mindedness.&#xD;
Listening to barely concealed sarcastic comments like “how many cool patterns can&#xD;
we put into this app?” Counter-arguments like “We’ve always done it this way” or “we&#xD;
need to be consistent with our other applications” or simply “I don’t like it.”&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I can deal with disagreement. There are others on my same team that I don’t always&#xD;
agree with but that I respect. When we debate the merits and pitfalls of one method&#xD;
vs. another, it’s based on experience and rationality.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
But here’s the distinction: if, at the end of these rational debates, we end up &lt;em&gt;not&lt;/em&gt; using&#xD;
my method, I’m still happy with the code I’ve written. And that I’ve gained a new&#xD;
perspective. Being forced to go back and remove all INNER JOINs from our stored procedures&#xD;
because they’re “too confusing” makes me feel like I’m losing some &lt;a href="http://www.imdb.com/title/tt0387808/"&gt;unseen&#xD;
war&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
And it’s one that I didn’t think even existed, let alone had to fight.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Kyle the Disenchanted&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://kyle.baley.org/aggbug.ashx?id=e782b745-3a43-4234-a5cf-99df9182b0be"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=X9eMq7Vrqvw:cmiGV6AMxHM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=X9eMq7Vrqvw:cmiGV6AMxHM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=X9eMq7Vrqvw:cmiGV6AMxHM:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?i=X9eMq7Vrqvw:cmiGV6AMxHM:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=X9eMq7Vrqvw:cmiGV6AMxHM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheCodingHillbilly/~4/X9eMq7Vrqvw" height="1" width="1"/&gt;</description>
      <comments>http://kyle.baley.org/CommentView,guid,e782b745-3a43-4234-a5cf-99df9182b0be.aspx</comments>
      <category>Conscientious Coding</category>
    <feedburner:origLink>http://kyle.baley.org/ADifferentShadeOfRoseOrLdquoHowTohellipactuallyIrsquomNotUpForSubtitlingThisOnerdquo.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://kyle.baley.org/Trackback.aspx?guid=10230c79-2b2d-42e7-a74e-ba3d78bcc4a1</trackback:ping>
      <pingback:server>http://kyle.baley.org/pingback.aspx</pingback:server>
      <pingback:target>http://kyle.baley.org/PermaLink,guid,10230c79-2b2d-42e7-a74e-ba3d78bcc4a1.aspx</pingback:target>
      <dc:creator>The Coding Hillbilly</dc:creator>
      <wfw:comment>http://kyle.baley.org/CommentView,guid,10230c79-2b2d-42e7-a74e-ba3d78bcc4a1.aspx</wfw:comment>
      <wfw:commentRss>http://kyle.baley.org/SyndicationService.asmx/GetEntryCommentsRss?guid=10230c79-2b2d-42e7-a74e-ba3d78bcc4a1</wfw:commentRss>
      <slash:comments>3</slash:comments>
      
      <title>Delayed execution with yield, or &amp;ldquo;How to abdicate, cede, and relent&amp;rdquo;</title>
      <guid isPermaLink="false">http://kyle.baley.org/PermaLink,guid,10230c79-2b2d-42e7-a74e-ba3d78bcc4a1.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheCodingHillbilly/~3/cRADN3HYpaY/DelayedExecutionWithYieldOrLdquoHowToAbdicateCedeAndRelentrdquo.aspx</link>
      <pubDate>Tue, 02 Jun 2009 14:47:26 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
“Yield” is not generally a word we hillbillies understand all too well as my meanderings&#xD;
yesterday can attest to. I’ve been using the yield keyword for nigh on three years&#xD;
now while having only a vague understanding of how it works behind the scenes. And&#xD;
even now, I’m not quite sure where my logical fallacy is but I’m sure that over the&#xD;
time it takes to write this all out, I’ll have formed an opinion.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Here is a the first test I wrote for a new class:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c-sharp" name="code"&gt;[TestMethod]&#xD;
[ExpectedException( typeof( ArgumentException ) )]&#xD;
public void Should_throw_exception_if_search_term_is_not_provided()&#xD;
{&#xD;
    var sut = new VacationDestinationService();&#xD;
    sut.FindDestinationsByRegion(string.Empty);&#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Bear with me on the ExpectedException. I’m pretty sure my problem is that I’m writing&#xD;
the wrong tests but for now, let’s just follow the “thought” process.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
To get this test to pass, I created the following class:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c-sharp" name="code"&gt;public class VacationDestinationService&#xD;
{&#xD;
    public void FindDestinationsByRegion( string region )&#xD;
    {&#xD;
        if (string.IsNullOrEmpty(region))&#xD;
        {&#xD;
            throw new ArgumentException("C'mon, feller. You gotta pick a place.");&#xD;
        }&#xD;
    }&#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Of course, I don't want this class to return void in the long run, but it gets the&#xD;
test passing.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Here's the next test:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c-sharp" name="code"&gt;[TestMethod]&#xD;
public void Should_retrieve_search_results()&#xD;
{&#xD;
    var sut = new VacationDestinationService();&#xD;
    var results = sut.FindDestinationsByRegion("North America");&#xD;
    Assert.IsTrue(results.Count() &amp;gt; 0);&#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Again, don't get semantic on me. This isn't *really* the actual test. But like most&#xD;
developers, I don't want to get bogged down in dependencies and explaining context.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
To pass this test, I modified my VacationDestinationService accordingly:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c-sharp" name="code"&gt;public class VacationDestinationService&#xD;
{&#xD;
    public IEnumerable&amp;lt;string&amp;gt; FindDestinationsByRegion( string region )&#xD;
    {&#xD;
        if (string.IsNullOrEmpty(region))&#xD;
        {&#xD;
            throw new ArgumentException("C'mon, feller. You gotta pick a place.");&#xD;
        }&#xD;
&#xD;
        var destinations = new List&amp;lt;string&amp;gt;(new[] {&#xD;
            "Ozarks",&#xD;
            "Appalachia",&#xD;
            "Western Manitoba"&#xD;
        });&#xD;
        foreach ( var destination in destinations )&#xD;
        {&#xD;
            yield return destination;&#xD;
        }&#xD;
    }&#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
And lo! This passes our test. So I re-run all my tests again before checking in, and&#xD;
lo!:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://kyle.baley.org/content/binary/WindowsLiveWriter/bd0560ef25d8_8993/image_2.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://kyle.baley.org/content/binary/WindowsLiveWriter/bd0560ef25d8_8993/image_thumb.png" width="644" height="298"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
“What?!” says I, “Why is the first test failing?” Reaching for the debugger yields&#xD;
(teehee) no help because setting a breakpoint in FindDestinationsByRegion doesn’t&#xD;
do anything. That is, for all intents and purposes (pet peeve: NOT “intensive purposes”),&#xD;
the code in FindDestinationsByRegion is not called in the first test anymore. Hence,&#xD;
the exception isn’t thrown. Hence, the test fails.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
If you’re the type of guy/gal to dive into the IL for this kind of thing, then you&#xD;
may know where this is heading. From what I can gather, the yield causes this method&#xD;
to execute &lt;em&gt;only when the results are iterated&lt;/em&gt;. That is, even if we call this&#xD;
method and gather up the results in a variable, the code still won’t execute. But&#xD;
as soon as you throw it in a foreach loop, then you’ve got gold, baby.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Maybe this is what smarter people mean when they throw out terms like “delayed execution”.&#xD;
Maybe this is the cornerstone of lambdas. All I know is that I can’t check in my code&#xD;
until I’ve solved this problem to my liking.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
As a test for this theory, I modified the first test slightly:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c-sharp" name="code"&gt;[TestMethod]&#xD;
[ExpectedException( typeof( ArgumentException ) )]&#xD;
public void Should_throw_exception_if_search_term_is_not_provided()&#xD;
{&#xD;
    var sut = new VacationDestinationService();&#xD;
    sut.FindDestinationsByRegion(string.Empty).Count();&#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Note the extra call to Count() at the end of the second line. Now we are not only&#xD;
retrieving the results, we are iterating over them. This test passes.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So what is the big picture? Is the code wrong or my tests? Assuming I *do* want to&#xD;
throw an exception if the argument is wrong, is the code correct? What if someone&#xD;
provides an empty string to this method and never iterates over the collection? Apparently,&#xD;
this method won't fail in that case, but that may not be a bad thing. Or it could&#xD;
be because then we have code that's kind of useless.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
It seems to me that the test should be modified to cause the iteration to happen and&#xD;
force the exception. If someone wants to call this method without iterating, I see&#xD;
no problem with that. I don't think.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Another thing I did was to replace the yield and return the List&lt;string&gt;&#xD;
itself. This worked too but I don't like the idea of modifying my code for what appears&#xD;
to be a faulty test.&#xD;
&lt;/string&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Was expecting to have formed an opinion by now but it's still kind of fuzzy. I'll&#xD;
let it sit for a while and perhaps a solution will present itself to me in the form&#xD;
of a better developer fixing it.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Kyle the Iterative&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://kyle.baley.org/aggbug.ashx?id=10230c79-2b2d-42e7-a74e-ba3d78bcc4a1"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=cRADN3HYpaY:nPEpLhhBIeQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=cRADN3HYpaY:nPEpLhhBIeQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=cRADN3HYpaY:nPEpLhhBIeQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?i=cRADN3HYpaY:nPEpLhhBIeQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=cRADN3HYpaY:nPEpLhhBIeQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheCodingHillbilly/~4/cRADN3HYpaY" height="1" width="1"/&gt;</description>
      <comments>http://kyle.baley.org/CommentView,guid,10230c79-2b2d-42e7-a74e-ba3d78bcc4a1.aspx</comments>
      <category>.NET General</category>
      <category>Development</category>
    <feedburner:origLink>http://kyle.baley.org/DelayedExecutionWithYieldOrLdquoHowToAbdicateCedeAndRelentrdquo.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://kyle.baley.org/Trackback.aspx?guid=f64cbb3c-7794-4a74-bfdc-f59fe82c336a</trackback:ping>
      <pingback:server>http://kyle.baley.org/pingback.aspx</pingback:server>
      <pingback:target>http://kyle.baley.org/PermaLink,guid,f64cbb3c-7794-4a74-bfdc-f59fe82c336a.aspx</pingback:target>
      <dc:creator>The Coding Hillbilly</dc:creator>
      <wfw:comment>http://kyle.baley.org/CommentView,guid,f64cbb3c-7794-4a74-bfdc-f59fe82c336a.aspx</wfw:comment>
      <wfw:commentRss>http://kyle.baley.org/SyndicationService.asmx/GetEntryCommentsRss?guid=f64cbb3c-7794-4a74-bfdc-f59fe82c336a</wfw:commentRss>
      <slash:comments>2</slash:comments>
      
      <title>Refactoring guard clauses, or &amp;ldquo;How to ask politely&amp;rdquo;</title>
      <guid isPermaLink="false">http://kyle.baley.org/PermaLink,guid,f64cbb3c-7794-4a74-bfdc-f59fe82c336a.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheCodingHillbilly/~3/3lZmnF9G40E/RefactoringGuardClausesOrLdquoHowToAskPolitelyrdquo.aspx</link>
      <pubDate>Mon, 01 Jun 2009 15:51:21 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
This post is brought to you by the letters M and V and P. I mention that at the beginning&#xD;
to set the pre-requisites.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I woke up this morning, broke open our application, and am currently staring at this&#xD;
method in our presenter.&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c-sharp" name="code"&gt;public void Start( )&#xD;
{&#xD;
    if ( !IsAuthorized( ) ) return;&#xD;
    if ( !ValidateHeritage( ) ) return;&#xD;
&#xD;
    if ( !IsCousin( ) ) return;&#xD;
    if ( HasSiblings( ) ) return;&#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
My first reaction to this was that it didn’t actually do anything. The way it’s currently&#xD;
set up, it appears to check a bunch of guard clauses and exit if they are met. But&#xD;
there isn’t any actual code being executed if the guard clauses aren’t met.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Digging deeper, I discovered that the guard clauses are actually doing more than guarding.&#xD;
They are calling methods on the View and otherwise changing state. For example, the&#xD;
IsCousin method:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c-sharp" name="code"&gt;public bool IsCousin( )&#xD;
{&#xD;
    if ( _user.AuntsAndUncles.Contains( _prospect.Mother ) &#xD;
         || _user.AuntsAndUncles.Contains( _prospect.Father ) )&#xD;
    {&#xD;
        _viabilityCount++;&#xD;
        View.DisableSafetyChecks( );&#xD;
        return true;&#xD;
    }&#xD;
&#xD;
    return false;&#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Clearly, this is ain’t your mother’s guard clause. It’s updating a local variable&#xD;
and doing some fanciness in the UI as well as guarding.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So maybe it’s just an issue with naming. Obviously, it’s not a guard clause, so maybe&#xD;
I could rename it to make that clearer. An obvious name isn’t leaping out but in any&#xD;
case, something &lt;em&gt;feels&lt;/em&gt; wrong about having all these methods return a boolean.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
An alternative I’m considering is separating the guard clauses from the actions:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c-sharp" name="code"&gt;public void Start()&#xD;
{&#xD;
    if ( IsAuthorized( ) == false )&#xD;
    {&#xD;
        SetNotAuthorized( );&#xD;
        return;&#xD;
    }&#xD;
    if ( ValidHeritage( ) == false ) return;&#xD;
&#xD;
    if ( IsCousin( ) == false ) return;&#xD;
&#xD;
    if ( HasSiblings( ) == false ) return;&#xD;
    &#xD;
    IncreaseViability( );&#xD;
    DisableSafetyChecks( );&#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Clearly, this is more verbose. But it looks better to me because the guard clauses&#xD;
don’t actually do anything except check the state of something. The actual flow of&#xD;
code is more obvious (isn’t it?).&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Maybe the original method is fine and I’ve been reading too much on Command-Query&#xD;
Separation lately. Or maybe there’s an alternative. In which case, I’d love to hear&#xD;
it, even given the very limited context I’ve provided.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
And in order to solicit as many opinions as possible, and because I know how much&#xD;
we all love to prove each other wrong, I’ll make the claim that my alternative is&#xD;
THE DEFINITIVE way of doing this.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Kyle the Reversed&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://kyle.baley.org/aggbug.ashx?id=f64cbb3c-7794-4a74-bfdc-f59fe82c336a"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=3lZmnF9G40E:GdHgZnlooIc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=3lZmnF9G40E:GdHgZnlooIc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=3lZmnF9G40E:GdHgZnlooIc:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?i=3lZmnF9G40E:GdHgZnlooIc:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=3lZmnF9G40E:GdHgZnlooIc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheCodingHillbilly/~4/3lZmnF9G40E" height="1" width="1"/&gt;</description>
      <comments>http://kyle.baley.org/CommentView,guid,f64cbb3c-7794-4a74-bfdc-f59fe82c336a.aspx</comments>
      <category>Refactoring</category>
    <feedburner:origLink>http://kyle.baley.org/RefactoringGuardClausesOrLdquoHowToAskPolitelyrdquo.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://kyle.baley.org/Trackback.aspx?guid=178ae3ed-60ca-4727-b3d2-48b798abe743</trackback:ping>
      <pingback:server>http://kyle.baley.org/pingback.aspx</pingback:server>
      <pingback:target>http://kyle.baley.org/PermaLink,guid,178ae3ed-60ca-4727-b3d2-48b798abe743.aspx</pingback:target>
      <dc:creator>The Coding Hillbilly</dc:creator>
      <wfw:comment>http://kyle.baley.org/CommentView,guid,178ae3ed-60ca-4727-b3d2-48b798abe743.aspx</wfw:comment>
      <wfw:commentRss>http://kyle.baley.org/SyndicationService.asmx/GetEntryCommentsRss?guid=178ae3ed-60ca-4727-b3d2-48b798abe743</wfw:commentRss>
      <slash:comments>3</slash:comments>
      
      <title>Branching out, or &amp;ldquo;How to live life outside ASP.NET MVC&amp;rdquo;</title>
      <guid isPermaLink="false">http://kyle.baley.org/PermaLink,guid,178ae3ed-60ca-4727-b3d2-48b798abe743.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheCodingHillbilly/~3/C8TCraKjMro/BranchingOutOrLdquoHowToLiveLifeOutsideASPNETMVCrdquo.aspx</link>
      <pubDate>Fri, 29 May 2009 01:40:13 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I’m in the early stages of writing a web app with a friend who has been somewhat on&#xD;
the periphery of ASP.NET MVC. As in, when someone says “let’s build a web app”, he&#xD;
doesn’t automatically reach for the MVC project template as I typically do. Bear in&#xD;
mind, he’s also not a web forms fan either.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Instead, he has a very specific architecture in mind that has taken me some time to&#xD;
come around to. A simplified version of it is thus: there is one web application for&#xD;
the various HTML files (and yes, they will be HTML only) and another for the “services”.&#xD;
The services one will serve up primarily JSON to the client which will interact with&#xD;
it with a very healthy dose of JavaScript. This is one reason we’ve decided on &lt;a href="http://www.ohloh.net/p/openrasta"&gt;OpenRasta&lt;/a&gt; for&#xD;
the services layer.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I’ve deferred to my friend on some of this because I feel like I have too much emotional&#xD;
investment in MVC these days (as you can tell by my tendency to erroneously drop the&#xD;
ASP.NET part of the name). Suffice it to say he’s led development on some major league&#xD;
websites that have more traffic in an hour than I have cycles in my family tree. So&#xD;
I feel confident in his evaluation skillz. He has a more rounded view of the world,&#xD;
partially because of his experience with these websites and partially because he hasn’t&#xD;
been drinking the kool-aid as much as I have for some of this stuff.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
One of those areas where he isn’t tightly coupled is with JavaScript libraries. Me,&#xD;
I’m a jQuery guy. Not because I like it better than the other libraries but because&#xD;
it’s the only library I’ve ever used and it hasn’t caused me any pain. He has only&#xD;
a passing knowledge of a few of them and attacked the problem of which one to choose&#xD;
more objectively.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
To that end, we’ve settled on &lt;a href="http://mootools.net"&gt;MooTools&lt;/a&gt;, at least&#xD;
for the time being. The main technical reason for this is because jQuery is getting&#xD;
too popular and we don’t want to be perceived as jumping on the bandwagon. We feel&#xD;
that if it’s good enough for Microsoft to throw its support behind, then we need to&#xD;
look at something else.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I jest, of course. In fact, our research shows it to be faster than jQuery and I have&#xD;
it on pretty good authority it is well-suited if you plan to have a somewhat complicated&#xD;
object model on the client. During my spike, I did find it to be more verbose than&#xD;
jQuery but not prohibitively so.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Another JavaScript library we’re playing with is &lt;a href="http://embeddedjs.com/"&gt;Embedded&#xD;
JavaScript&lt;/a&gt;, which is a view engine for JavaScript. With it, you can define views&#xD;
like so:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre name="code"&gt;&amp;lt;h2&amp;gt;&amp;lt;%= petNameForRack %&amp;gt;&amp;lt;/h2&amp;gt;&#xD;
&amp;lt;ul&amp;gt;&#xD;
&amp;lt;% for( var i = 0; i &amp;lt; guns.length; i++ ) { %&amp;gt;&#xD;
    &amp;lt;li&amp;gt;&amp;lt;%= guns[i] %&amp;gt;&amp;lt;/li&amp;gt;&#xD;
&amp;lt;% } %&amp;gt;&#xD;
&amp;lt;/ul&amp;gt;&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
This would be stored in an external file and you render it with some JavaScript like&#xD;
so:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre name="code"&gt;function renderListOfLovers( )&#xD;
{&#xD;
    var jsonRequest = new Request.JSON( {&#xD;
        url: "http://localhost/Services.Web/Lovers",&#xD;
        method: "get",&#xD;
        onSuccess: function( gunRackList ) {&#xD;
            gunRackList.Racks.each( buildItem );&#xD;
        } ).send( );&#xD;
}&#xD;
&#xD;
function buildItem( item )&#xD;
{&#xD;
    target = $("destinationDiv"); &#xD;
    var div = new Element( "div" );&#xD;
    var view = "views/MyListOLovers.ejs";  // Contains the view shown above&#xD;
    new EJS( {url: view} ).update(div, item);&#xD;
    div.inject(target);&#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
That's mostly from memory so don’t be cuttin’ and pastin’ none. In the first function,&#xD;
we call out to our OpenRasta service which is configured to return a list of gun racks&#xD;
as JSON by default. When that call succeeds, it creates a new DIV, renders the view&#xD;
in it, then injects it into into a target container.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
All in all, it’s an interesting way of doing things. It’s nice that JSON has become&#xD;
kind of the de facto standard for passing stuff around with the various frameworks&#xD;
because it would be a pain to have to retrieve the list from OpenRasta in one format,&#xD;
convert it to another to work with MooTools, then another to work with EJS.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
All of this pretty much worked out of the box, too. The spike involved very little&#xD;
actual troubleshooting. It was mostly getting used to the syntax (e.g. I would have&#xD;
thought the MooTools inject function would act on the target rather than the item&#xD;
being injected).&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I also discovered you can throw an instance of a custom MooTools class into a view&#xD;
as well with no further changes required. Maybe that’s obvious if you are intimately&#xD;
aware of how JavaScript handles classes but my own experience has been limited to:&#xD;
new ActiveXObject(“MSXML2.XMLHttp”);&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
On the EJS side of things, it also comes with a bunch of view helpers which are analogous&#xD;
to the dumping ground that is HTML extension methods with ASP.NET MVC.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
One roadblock I’ve hit is that while you have the power of a full-fledged library&#xD;
at your disposal with MooTools, in the EJS views, you are limited to only what it&#xD;
supports between the angle brackets. But as &lt;a href="http://weblogs.asp.net/dotjosh/default.aspx"&gt;a&#xD;
wise man&lt;/a&gt; said: in the end, it’s just JavaScript so you can make it do what you&#xD;
want anyway.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
How this will end up playing out when things get hairy is still anyone’s guess. But&#xD;
the pain-free spike has been pretty encouraging so far.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Kyle the Scriptified&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://kyle.baley.org/aggbug.ashx?id=178ae3ed-60ca-4727-b3d2-48b798abe743"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=C8TCraKjMro:aZXPJvk0jnI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=C8TCraKjMro:aZXPJvk0jnI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=C8TCraKjMro:aZXPJvk0jnI:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?i=C8TCraKjMro:aZXPJvk0jnI:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=C8TCraKjMro:aZXPJvk0jnI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheCodingHillbilly/~4/C8TCraKjMro" height="1" width="1"/&gt;</description>
      <comments>http://kyle.baley.org/CommentView,guid,178ae3ed-60ca-4727-b3d2-48b798abe743.aspx</comments>
      <category>ASP.NET MVC</category>
      <category>Javascript</category>
      <category>Web development</category>
    <feedburner:origLink>http://kyle.baley.org/BranchingOutOrLdquoHowToLiveLifeOutsideASPNETMVCrdquo.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://kyle.baley.org/Trackback.aspx?guid=0d393473-11a6-48db-b545-391ffcd6d311</trackback:ping>
      <pingback:server>http://kyle.baley.org/pingback.aspx</pingback:server>
      <pingback:target>http://kyle.baley.org/PermaLink,guid,0d393473-11a6-48db-b545-391ffcd6d311.aspx</pingback:target>
      <dc:creator>The Coding Hillbilly</dc:creator>
      <wfw:comment>http://kyle.baley.org/CommentView,guid,0d393473-11a6-48db-b545-391ffcd6d311.aspx</wfw:comment>
      <wfw:commentRss>http://kyle.baley.org/SyndicationService.asmx/GetEntryCommentsRss?guid=0d393473-11a6-48db-b545-391ffcd6d311</wfw:commentRss>
      
      <title>Zip codes aren&amp;rsquo;t that important, or &amp;ldquo;How to stop going postal&amp;rdquo;</title>
      <guid isPermaLink="false">http://kyle.baley.org/PermaLink,guid,0d393473-11a6-48db-b545-391ffcd6d311.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheCodingHillbilly/~3/zXWNhd_E6Ec/ZipCodesArenrsquotThatImportantOrLdquoHowToStopGoingPostalrdquo.aspx</link>
      <pubDate>Thu, 28 May 2009 19:14:55 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
There is some discussion on a group about countries and states and cascading and such.&#xD;
Essentially centring around the ideas that: a) not every country has states/provinces/islands/territories,&#xD;
and b) some countries *are* states (e.g. Singapore, which also apparently does triple-duty&#xD;
as a city, who knew?).&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
As an addendum to that, I would also like to point out that not every country has&#xD;
zip/postal codes either. SO STOP MAKING THE &amp;amp;*%$ THINGS MANDATORY!&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
In short, if you’re going to list a country as an option, be mindful of its idiosyncrasies.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Kyle the Optional&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://kyle.baley.org/aggbug.ashx?id=0d393473-11a6-48db-b545-391ffcd6d311"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=zXWNhd_E6Ec:AUd53MKDwFg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=zXWNhd_E6Ec:AUd53MKDwFg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=zXWNhd_E6Ec:AUd53MKDwFg:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?i=zXWNhd_E6Ec:AUd53MKDwFg:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=zXWNhd_E6Ec:AUd53MKDwFg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheCodingHillbilly/~4/zXWNhd_E6Ec" height="1" width="1"/&gt;</description>
      <comments>http://kyle.baley.org/CommentView,guid,0d393473-11a6-48db-b545-391ffcd6d311.aspx</comments>
      <category>User Interface</category>
    <feedburner:origLink>http://kyle.baley.org/ZipCodesArenrsquotThatImportantOrLdquoHowToStopGoingPostalrdquo.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://kyle.baley.org/Trackback.aspx?guid=5ba13bd8-5651-4f6c-adc2-6cc09aa76776</trackback:ping>
      <pingback:server>http://kyle.baley.org/pingback.aspx</pingback:server>
      <pingback:target>http://kyle.baley.org/PermaLink,guid,5ba13bd8-5651-4f6c-adc2-6cc09aa76776.aspx</pingback:target>
      <dc:creator>The Coding Hillbilly</dc:creator>
      <wfw:comment>http://kyle.baley.org/CommentView,guid,5ba13bd8-5651-4f6c-adc2-6cc09aa76776.aspx</wfw:comment>
      <wfw:commentRss>http://kyle.baley.org/SyndicationService.asmx/GetEntryCommentsRss?guid=5ba13bd8-5651-4f6c-adc2-6cc09aa76776</wfw:commentRss>
      
      <title>Problem of having too many options</title>
      <guid isPermaLink="false">http://kyle.baley.org/PermaLink,guid,5ba13bd8-5651-4f6c-adc2-6cc09aa76776.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheCodingHillbilly/~3/U4N2PIWLlek/ProblemOfHavingTooManyOptions.aspx</link>
      <pubDate>Wed, 27 May 2009 19:58:21 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I don’t own a cell phone but I love me my iTouch (which, in fact, is the missus’ cast-off&#xD;
from when she got an iPhone). Given the amount of time I spend waiting for things&#xD;
to happen, being able to whip the thing out to play with at any ti---actually, I’m&#xD;
gonna stop this analogy and move on…&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
One of the apps I bought on it was Solebon, which is a list of approximately 6,899&#xD;
solitaire games by my last count. I had downloaded the free version which had about&#xD;
six games. I liked a couple and had a blast with it. So I figured that would scale&#xD;
if I bought the full version. But these days, I never play the thing.&lt;a href="http://kyle.baley.org/content/binary/WindowsLiveWriter/Problemofhavingtoomanyoptions_12DFA/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 5px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://kyle.baley.org/content/binary/WindowsLiveWriter/Problemofhavingtoomanyoptions_12DFA/image_thumb.png" width="244" height="203"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The reason for that is exactly the reason I bought it: more choices. I thought if&#xD;
I like two games out of six with the free version, then surely I’d like at least ten&#xD;
or so games in the paid version. But whenever I open it up for a “quick” game of something,&#xD;
I’m faced with a screen of thirty odd games to choose from, most of them with cryptic&#xD;
names like “Ambrose” or “Blind Alleys” or “Eight Out”.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
There are simply too many to keep track of for me to figure out which ones I might&#xD;
like on a regular basis. And the “random game” feature is only marginally better because&#xD;
I always need to re-read the rules to whatever game I’m playing. In the end, I usually&#xD;
just skip over Solebon and go straight for the stand-alone Cribbage app I also got.&#xD;
Sure it doesn’t show the time at the time and it doesn’t always count points properly.&#xD;
But I don’t have to put any thought into it before I start the game.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
This ties back to a project I’m working on, one in which the developers have free&#xD;
reign to decide on which features to include. And as a developer, my naturally tendency&#xD;
is “the more the better”. But as a &lt;em&gt;user&lt;/em&gt;, it’s “&lt;a href="http://www.amazon.com/Think-Common-Sense-Approach-Usability/dp/0789723107"&gt;don’t&#xD;
make me think&lt;/a&gt;”. Even during software installations, ninety percent of the time,&#xD;
I select Custom and proceed to accept all the defaults anyway.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Because of this, my teammate and I have been fairly ruthless in deciding on features.&#xD;
Unless it is something that 80% of users can absolutely not do without, it’s on our&#xD;
fictitious “future release” board.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
One of the things that has &lt;em&gt;seriously&lt;/em&gt; helped us in this regard is &lt;a href="http://www.balsamiq.com/"&gt;Balsamiq&lt;/a&gt;.&#xD;
Admittedly, I got a free license for it, but my partner didn’t and he has extolled&#xD;
its virtues on numerous occasions. I suspect we have saved ourselves many thousands&#xD;
of dollars but not working on features that may have seemed like no-brainers until&#xD;
we actually saw them in the context of a screen mock-up. Even something simple like&#xD;
an admin CRUD screen hasn’t gone unscathed. “Do we really need four columns? Will&#xD;
users actually care if they are able to upload a headshot?” BAM! Three days work,&#xD;
gone!&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Obviously, this has the advantage of making the product easier to develop (at least&#xD;
in the short-term). But there’s another benefit. No user likes to have &lt;a href="http://www.techcrunch.com/2009/05/14/twitters-spectacularly-awful-24-hours/"&gt;features&#xD;
taken away&lt;/a&gt;. Even if they are so obscure that only 3% of people use them, those&#xD;
3% can be pretty vocal when they want to be.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Kyle the Optional&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://kyle.baley.org/aggbug.ashx?id=5ba13bd8-5651-4f6c-adc2-6cc09aa76776"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=U4N2PIWLlek:qJonuUYVgq4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=U4N2PIWLlek:qJonuUYVgq4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=U4N2PIWLlek:qJonuUYVgq4:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?i=U4N2PIWLlek:qJonuUYVgq4:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=U4N2PIWLlek:qJonuUYVgq4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheCodingHillbilly/~4/U4N2PIWLlek" height="1" width="1"/&gt;</description>
      <comments>http://kyle.baley.org/CommentView,guid,5ba13bd8-5651-4f6c-adc2-6cc09aa76776.aspx</comments>
      <category>User Interface</category>
    <feedburner:origLink>http://kyle.baley.org/ProblemOfHavingTooManyOptions.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://kyle.baley.org/Trackback.aspx?guid=caed4b0b-a243-4005-82f6-4429ce547cc9</trackback:ping>
      <pingback:server>http://kyle.baley.org/pingback.aspx</pingback:server>
      <pingback:target>http://kyle.baley.org/PermaLink,guid,caed4b0b-a243-4005-82f6-4429ce547cc9.aspx</pingback:target>
      <dc:creator>The Coding Hillbilly</dc:creator>
      <wfw:comment>http://kyle.baley.org/CommentView,guid,caed4b0b-a243-4005-82f6-4429ce547cc9.aspx</wfw:comment>
      <wfw:commentRss>http://kyle.baley.org/SyndicationService.asmx/GetEntryCommentsRss?guid=caed4b0b-a243-4005-82f6-4429ce547cc9</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>And you opened your mouth&amp;hellip;why?, or &amp;ldquo;How to comment for the greater good&amp;rdquo;</title>
      <guid isPermaLink="false">http://kyle.baley.org/PermaLink,guid,caed4b0b-a243-4005-82f6-4429ce547cc9.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheCodingHillbilly/~3/3PbhwLjnz2w/AndYouOpenedYourMouthhellipwhyOrLdquoHowToCommentForTheGreaterGoodrdquo.aspx</link>
      <pubDate>Mon, 18 May 2009 16:17:29 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Last week, Derick Bailey announced the &lt;a href="http://www.lostechies.com/blogs/derickbailey/archive/2009/05/13/fluentnhibernate-contrib-fnh-contrib-is-alive.aspx"&gt;FluentNHibernate&#xD;
Contrib&lt;/a&gt; project. I have not looked at it but read the post with interest and tucked&#xD;
it away for future reference.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Then, against my better judgment, I looked through the comments. The first one didn’t&#xD;
“disappoint”:&#xD;
&lt;/p&gt;&#xD;
        &lt;blockquote&gt;&#xD;
          &lt;p&gt;&#xD;
And you're not using Linq To Nh ... why ?&#xD;
&lt;/p&gt;&#xD;
        &lt;/blockquote&gt;&#xD;
        &lt;p&gt;&#xD;
Admittedly, I’m a hopeless optimist. I like the way the world looks through my rose-tinted&#xD;
glasses mostly because it’s been nice to me when I look at it this way.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So I don’t understand the tendency some people have where they seem to relish in knocking&#xD;
someone down a peg or three. All Derick is doing is announcing a project that could&#xD;
potentially help developers. Sir Occo reads this and thinks, “this guy’s wasting his&#xD;
time. And I’m going to tell him about it in the universal language of sarcasm.”&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I have no idea if FNH.Contrib is similar to another project. I’m told on Twitter that&#xD;
it is different than Linq to NH. Which is where the danger lies. In all that “holier-than-thou”,&#xD;
there’s a chance that they *aren’t* all that similar. That there are fundamental differences.&#xD;
And more importantly, that Derick has indeed tried Linq to NH and has very good reasons&#xD;
for not using Linq to NH.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
But even if he hasn’t, even if the two projects are identical in scope and Derick&#xD;
had no idea of the existence of Linq to NH, what is he supposed to say now? “Thank&#xD;
you for exposing my ignorance, sirocco, and in such a productive fashion, too.” Of&#xD;
course not, the natural reaction is to dig in your heels and start looking for minute&#xD;
differences &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
To contrast, let’s review comment number three on the same post:&#xD;
&lt;/p&gt;&#xD;
        &lt;blockquote&gt;&#xD;
          &lt;p&gt;&#xD;
Check out this nhlambdaextensions.googlecode.com/.../NhLambdaExtensions.html&#xD;
&lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
Does something quite similar&#xD;
&lt;/p&gt;&#xD;
        &lt;/blockquote&gt;&#xD;
        &lt;p&gt;&#xD;
Better yet is Neal Blomfield’s comment later on:&#xD;
&lt;/p&gt;&#xD;
        &lt;blockquote&gt;&#xD;
          &lt;p&gt;&#xD;
Looks a lot like the NH lambda extensions stuff.  Might be worthwhile looking&#xD;
up code.google.com/.../nhlambdaextensions and checkign out broloco.blogspot.com/.../using-lambda-expressions-with.html&#xD;
to see if these guys have some useful things to contribute.&#xD;
&lt;/p&gt;&#xD;
        &lt;/blockquote&gt;&#xD;
        &lt;p&gt;&#xD;
Here, the content is essentially the same (this is similar to another project) but&#xD;
the intent is much different. The Harrisonmeister and Neal bring up alternate projects&#xD;
not to knock the wind out of Derick’s sails, but to see if the two projects can collaborate.&#xD;
Y’know, to make the development community better.&#xD;
&lt;/p&gt;&#xD;
        &lt;object width="425" height="344"&gt;&#xD;
          &lt;param name="movie" value="http://www.youtube.com/v/MjMYQyhjiYA&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;/param&gt;&#xD;
          &lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&#xD;
          &lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&#xD;
          &lt;embed src="http://www.youtube.com/v/MjMYQyhjiYA&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&#xD;
          &lt;/embed&gt;&#xD;
        &lt;/object&gt;&#xD;
        &lt;p&gt;&#xD;
Now, I’ve been known to enjoy the occasional jibe or two and there’s a slight chance&#xD;
some of them may have been in what may be construed by some as a somewhat ironic tone.&#xD;
In more immediate communication methods, like IM or phone or…what’s the other one&#xD;
called, again…oh, yeah!…face-to-face, there are times when I go into a mode as depicted&#xD;
by Dave Foley above. But I try to do so only with a known audience. People that will&#xD;
take it for what it is, good-natured ribbing. Where the :) is implied. But on a blog&#xD;
post for someone I’ve never met in any form, whenever I feel the urge to be snarky,&#xD;
there’s always a voice in the back of my head that tells me to assume the person knows&#xD;
what he or she is doing. So I prefer to choose my comments carefully.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
At least for the first one. After that, if you prove my assumption wrong, well, sorry,&#xD;
buddy, you’re fair game.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Kyle the Predatory&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://kyle.baley.org/aggbug.ashx?id=caed4b0b-a243-4005-82f6-4429ce547cc9"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=3PbhwLjnz2w:mCX937duMmM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=3PbhwLjnz2w:mCX937duMmM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=3PbhwLjnz2w:mCX937duMmM:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?i=3PbhwLjnz2w:mCX937duMmM:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=3PbhwLjnz2w:mCX937duMmM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheCodingHillbilly/~4/3PbhwLjnz2w" height="1" width="1"/&gt;</description>
      <comments>http://kyle.baley.org/CommentView,guid,caed4b0b-a243-4005-82f6-4429ce547cc9.aspx</comments>
      <category>Conscientious Coding</category>
    <feedburner:origLink>http://kyle.baley.org/AndYouOpenedYourMouthhellipwhyOrLdquoHowToCommentForTheGreaterGoodrdquo.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://kyle.baley.org/Trackback.aspx?guid=a5a5ee2c-c7e3-411e-b60e-94bf773be946</trackback:ping>
      <pingback:server>http://kyle.baley.org/pingback.aspx</pingback:server>
      <pingback:target>http://kyle.baley.org/PermaLink,guid,a5a5ee2c-c7e3-411e-b60e-94bf773be946.aspx</pingback:target>
      <dc:creator>The Coding Hillbilly</dc:creator>
      <wfw:comment>http://kyle.baley.org/CommentView,guid,a5a5ee2c-c7e3-411e-b60e-94bf773be946.aspx</wfw:comment>
      <wfw:commentRss>http://kyle.baley.org/SyndicationService.asmx/GetEntryCommentsRss?guid=a5a5ee2c-c7e3-411e-b60e-94bf773be946</wfw:commentRss>
      
      <title>Moving to a new country, or &amp;ldquo;How to design a lifestyle by fluke&amp;rdquo;</title>
      <guid isPermaLink="false">http://kyle.baley.org/PermaLink,guid,a5a5ee2c-c7e3-411e-b60e-94bf773be946.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheCodingHillbilly/~3/Hwop1dg7ahg/MovingToANewCountryOrLdquoHowToDesignALifestyleByFlukerdquo.aspx</link>
      <pubDate>Tue, 12 May 2009 01:47:01 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Got a question today from someone asking how I managed to achieve the lifestyle I&#xD;
did and asking for tips on having to do the same. In order to impart this wisdom,&#xD;
I am deeming it necessary to brag a little.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
As many of you probably know, I live in the Bahamas and work from home. I’ll throw&#xD;
tact out the window and add that my condo is about 100 feet from a private beach and&#xD;
also has a pool and tennis courts. At night, my wife and I sit on the balcony reading&#xD;
to the sound of the ocean. Thanks to a side burner, we barbecue almost everything&#xD;
year-round, even pancakes. When I can get away with it (which is more often you might&#xD;
think, you’d be surprised what you can get away with by asking), I like to work only&#xD;
3 days a week. Last weekend, my daughter and I jumped into the canal off the ocean&#xD;
with some neighbours’ kids for a while and when that got boring, we played baseball&#xD;
on the beach.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
It’s probably a coincidence that I’ve just started reading &lt;a href="http://www.fourhourworkweek.com/"&gt;The&#xD;
4-Hour Workweek&lt;/a&gt; because this kind of sounds like something from the opening chapter.&#xD;
But the difference is: Tim Ferriss put some thought in achieving his lifestyle. As&#xD;
much as I would like to translate my own experience into a multi-million dollar empire,&#xD;
I came by my good fortune mostly by accident.&#xD;
&lt;/p&gt;&#xD;
        &lt;h3&gt;How it happened&#xD;
&lt;/h3&gt;&#xD;
        &lt;p&gt;&#xD;
Before moving here, my family and I lived in Calgary and I worked as an employee for&#xD;
a consulting company. My wife works for an international consultant and he decided&#xD;
to move to the Bahamas for whatever reason. We basically came along because he asked&#xD;
us if we wanted to. The decision was harder than you might imagine primarily because&#xD;
our daughter was three at the time and moving her away from family to a country where&#xD;
we knew little about the education system was a big unknown. I was also worried about&#xD;
the work situation.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
But we did it and I, of course, had to quit my job. For the next two or three years,&#xD;
my career was very much in flux. I found contracts in the US but they required me&#xD;
to be onsite (i.e. away from my family). A couple of them paid room and board but&#xD;
for the ones that didn't, I had to rent a place on my own and live a college life,&#xD;
except that I couldn't date anyone. For the first two years alone, I was away from&#xD;
home for 13-14 months. I also tried a couple of permanent positions locally but that&#xD;
didn't take very well. I'll leave it at that and just say it'll be a long, long time&#xD;
before I accept a permanent position locally.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Really, it's only been in the last two or three years that I've been able to get some&#xD;
stability in my career to the point where I don't automatically panic when a contract&#xD;
ends. But having said that, it's a *LOT* of work trying to find a contract where they&#xD;
will let you work remotely. Chances are, I'll have to travel for work again in the&#xD;
future. In the meantime, the main reason I started blogging and speaking at user groups&#xD;
and attending conferences was self-serving. I need my name out there so people have&#xD;
at least some idea who they're talking to on the phone in the Bahamas. And even then,&#xD;
they're still leery. I feel like I have to be twice as productive just to prove myself.&#xD;
Which isn't too hard given that at most places, they're half as productive as they&#xD;
could be anyway.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So that was my master plan for living such a life: I said yes. And I don’t mind admitting&#xD;
that those first two or three years were tough and involved a lot of soul searching,&#xD;
to the point where we actually went house-hunting back in Calgary. Maybe it would&#xD;
have been different if we consciously decided to move here and follow our dream. But&#xD;
instead, the opportunity arose and we took it. So anytime something inconvenient happened,&#xD;
it was easy for us to say, “We didn’t have to deal with this back home.” And the fact&#xD;
that we still considered Calgary home at the time did not go unnoticed.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
But gradually, we worked out the kinks. We learned the ins and outs of our new home&#xD;
and, most importantly, took stock of what was important. Only after doing that did&#xD;
we really start to realize that we were wasting a whole lot of time and energy on&#xD;
the wrong things. Since then, we’ve re-prioritized to take advantage of what we gained&#xD;
from our move (more sporting climate, proximity to beaches and other islands, more&#xD;
relaxed lifestyle) rather than focusing on what we lost (regular access to Multi-Grain&#xD;
Cheerios).&#xD;
&lt;/p&gt;&#xD;
        &lt;h3&gt;Planning it out&#xD;
&lt;/h3&gt;&#xD;
        &lt;p&gt;&#xD;
But that doesn’t mean I don’t have anything useful to say on the subject. I can help&#xD;
to avoid the same pitfalls I ran into. While the first couple of years had their challenges,&#xD;
I suspect people might be underestimating how easy it is to accomplish it. You’d be&#xD;
surprised at what you can accomplish through trial by fire. And if you put more thought&#xD;
and planning into it than we did, it’ll go that much smoother. Besides, it’s not like&#xD;
moving to another country is an irreversible decision (unless you’re dream is to visit&#xD;
the front lines in Iraq).&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
One of the most important things you will need is a safety net. You don’t want to&#xD;
have to worry about money so as much as you can secure a regular source of it, do&#xD;
it. Make sure you have a good list of contacts for people who could potentially hire&#xD;
you or help you find a job. Like I said, that’s what I went into blogging and community&#xD;
work. And it should be noted that I do love doing it. If you don’t, find another way&#xD;
to get your name out there because you won’t help anyone by faking interest in community&#xD;
work.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Also, start planting the seeds of working remotely now. Work from home a day or two&#xD;
a week if you can and try to increase it. If you can keep your current job when you&#xD;
move, that's gold. We were kind of okay because my wife had a pretty good job but&#xD;
it was a bit of a struggle with me being away all the time while she had to learn&#xD;
the ropes of a new country. Even if you do find a job working remotely, expect to&#xD;
have to leave home for work on occasion. Hopefully, you won't have to but it helps&#xD;
to prepare just in case.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
When you do move, scope the place out first. Find expats who can give you the lay&#xD;
of the land for things like finding decent tradespeople. Splurge a little on the place&#xD;
where you’re living. It may be easy to say you’ll just start out in a small apartment&#xD;
next to the main road but you’ll be robbing yourself. What you want is some place&#xD;
where you can kick back at night with a malt-based beverage and say, “Now, THIS is&#xD;
more like it.”&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Finally, realize that while your career is important and it's easy to get caught up&#xD;
in it, don't forget the reasons why you move. Even now, I still suffer from “just&#xD;
one more test, honey!” syndrome. Yes, by all means, be dedicated and good at your&#xD;
job and work on OSS projects and that side project that will get you on the cover&#xD;
of Time. But make sure you treat them for what they are: hobbies. You didn’t move&#xD;
to make yourself rich, you moved so you wouldn’t &lt;em&gt;have&lt;/em&gt; to make yourself rich.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
In short, if you’re already living your dream, don’t waste your time and effort pursuing&#xD;
it.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Kyle the Coached&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://kyle.baley.org/aggbug.ashx?id=a5a5ee2c-c7e3-411e-b60e-94bf773be946"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=Hwop1dg7ahg:LhKKIcWZK0Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=Hwop1dg7ahg:LhKKIcWZK0Y:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=Hwop1dg7ahg:LhKKIcWZK0Y:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?i=Hwop1dg7ahg:LhKKIcWZK0Y:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheCodingHillbilly?a=Hwop1dg7ahg:LhKKIcWZK0Y:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheCodingHillbilly?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheCodingHillbilly/~4/Hwop1dg7ahg" height="1" width="1"/&gt;</description>
      <comments>http://kyle.baley.org/CommentView,guid,a5a5ee2c-c7e3-411e-b60e-94bf773be946.aspx</comments>
      <category>Bahamas</category>
      <category>Career</category>
      <category>Working Remotely</category>
    <feedburner:origLink>http://kyle.baley.org/MovingToANewCountryOrLdquoHowToDesignALifestyleByFlukerdquo.aspx</feedburner:origLink></item>
  </channel>
</rss>
