<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="http://feeds.feedblitz.com/feedblitz_rss.xslt"?><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:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
<channel>
	<title>DaedTech</title>
	<atom:link href="http://www.daedtech.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.daedtech.com</link>
	<description>Professional Software Engineering</description>
	<lastBuildDate>Tue, 14 May 2013 14:44:16 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
<image>
	<url>http://users.feedblitz.com/2a3c03799e46183d4f26cfe1bf4a9ac1/facebook.jpg</url>
	<title>DaedTech</title>
	<link>http://www.daedtech.com</link>
</image>
<item>
<feedburner:origLink>http://www.daedtech.com/self-correcting-organizations-fall-of-the-expert-beginner?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=self-correcting-organizations-fall-of-the-expert-beginner</feedburner:origLink>
		<title>Self-Correcting Organizations: Fall of the Expert Beginner</title>
		<link>http://feeds.feedblitz.com/~/41134290/0/daedtech/www~SelfCorrecting-Organizations-Fall-of-the-Expert-Beginner</link>
		<comments>http://www.daedtech.com/self-correcting-organizations-fall-of-the-expert-beginner#comments</comments>
		<pubDate>Tue, 14 May 2013 06:06:54 +0000</pubDate>
		<dc:creator>Erik Dietrich</dc:creator>
				<category><![CDATA[The Life of a Programmer]]></category>
		<category><![CDATA[Expert Beginner]]></category>
		<category><![CDATA[Soft Skills]]></category>
		<guid isPermaLink="false">http://www.daedtech.com/?p=2908</guid>
		<description><![CDATA[<div id="fb-root"></div><script src="http://connect.facebook.net/en_US/all.js#appId=20320310172&amp;xfbml=1"></script><script language="JavaScript">
					FB.Event.subscribe('edge.create', function(response) {
						_gaq.push(['_trackEvent','SocialSharing','Facebook - like button',unescape(String(response).replace(/\+/g, " "))]);
					});
				</script><script type="text/javascript">
				  (function() {
				    var po = document.createElement("script"); po.type = "text/javascript"; po.async = true;
				    po.src = "https://apis.google.com/js/plusone.js";
				    var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(po, s);
				  })();
				</script>Today, I&#8217;m going to make what will be, for now, the last post in the Expert Beginner series. I edited the first post in the series to add a blurb about this, but I&#8217;ve actually been working on compiling these posts into an e-book that will sell for a few <a class="more-link" href="http://www.daedtech.com/self-correcting-organizations-fall-of-the-expert-beginner">Continue reading <span class="meta-nav">&#8594;</span></a>]]>
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Add to Any&quot; href=&quot;http://feeds.feedblitz.com/_/26/41134290/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/addtoany20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.feedblitz.com/_/24/41134290/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.feedblitz.com/_/19/41134290/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.feedblitz.com/_/20/41134290/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</description>
				<content:encoded><![CDATA[<p>Today, I&#8217;m going to make what will be, for now, the last post in the Expert Beginner series.  I edited the first post in the series to add a blurb about this, but I&#8217;ve actually been working on compiling these posts into an e-book that will sell for a few dollars.  More specifics on the availability and timeframe of that to follow.</p>
<p>Also, I&#8217;m going to be traveling for a couple of weeks with very limited access to internet, so I doubt that there will be any posts to this blog before Memorial Day (May 27th).  I plan to resume a normal posting cadence then.  Thanks for your patience.</p>
<h2>The Human Cost</h2>
<p>If you&#8217;ve followed this series of posts, it&#8217;s pretty likely that you empathize with observing and dealing with Expert Beginners.  That is, you&#8217;ve most likely encountered someone like this in your travels and been stymied, belittled, annoyed, exasperated, etc by this Expert Beginner.  So you&#8217;re probably rooting for the outcome in the title of the post.  This is the post in which the cosmic scales are re-balanced and the arrogant Expert Beginner finally gets his comeuppance: The Fall of the Expert Beginner.  But not so fast &#8212; there&#8217;s some ground to cover first, and if you&#8217;re looking for a nice resolution where the bad guy is brought to justice, you might be disappointed.</p>
<p>I mean, it&#8217;s nice to read the Daily WTF and see the occasional story about a bungling but nasty manager or architect being dressed down or laid off, but in your life, the players involved are actual people and everyone suffers real consequences.  If you hire on with an organization dominated by an Expert Beginner and then leave in frustration, you&#8217;re investing time that you&#8217;ll never get back and incurring the hassle of a job search sooner than expected.  You also probably came on board because you liked the company and its goals and mission, and you leave knowing that its interests are being sabotaged by incompetence and that your friends and everyone else still working there are not doing as well as they could be if the company were enjoying more success.  And even if the Expert Beginner does wind up being disgraced somehow, via demotion or termination, that&#8217;s a person who now must explain to a family that they&#8217;re going to have to batten down the hatches financially until he figures something out.</p>
<h2>Escaping Intact</h2>
<p>In the <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.daedtech.com/up-or-not-ambition-of-the-expert-beginner">last post in this series</a>, I left off with a teaser for this post where I said that Expert Beginners generally enjoy high odds for short term success, which drop to zero on a long enough timeline.  Here I&#8217;d like to talk about the means by which some Expert Beginners tend to escape that fate before describing it in detail.  </p>
<p>The secret to success in the Expert Beginner world is to understand that programming (or really any line-level expertise, since this could also apply to other engineering disciplines or probably other skilled professions) has to be a means to an end only.  It&#8217;s not a skill that you&#8217;re going to master, but one of which you&#8217;ll fake mastery for just long enough to profit (literally and figuratively) and bail out.  This requires some ability to tolerate cognitive dissonance and swallow pride, albeit in a way that allows for ample spinning of the truth.  And really, there&#8217;s only one category of Expert Beginner from the three that I defined in the previous post that can get out of the game as a success: the Company Man.</p>
<p>Let&#8217;s consider casino poker as a metaphor for explaining the fate of Expert Beginners.  Expert Beginners are essentially poker novices who sit down at a low stakes table, catch a run of incredible cards, and wind up with a big fat stack through the vagaries of chance.  From there, the paths diverge depending on the archetype.</p>
<p>Xenophobe stays at the low stakes table because on some level he knows that he&#8217;ll get slaughtered by good players at the high stakes tables.  He doesn&#8217;t tell himself this, naturally, but rather insists that he likes the down-to-earth vibe of the table and the people there or something.  But he doesn&#8217;t cash out because being good at poker is important to him.  So he rides his initial luck as far as it will go, but it runs out sooner or later and he slowly loses control of his modest fortune, one bad bet and wrong play at a time until he&#8217;s chip-less.  He eventually leaves with nothing in his pocket, unable to understand why repeating the exact behaviors that earned him success didn&#8217;t continue to work.</p>
<p>Master Beginner takes his initial luck and interprets it brazenly as utter poker mastery.  He sits at the tables that have the highest stakes and goes all in all the time, perhaps without even looking at his hand.  His beginners&#8217; luck allows him to parlay a larger stack into an intensely successful  (but brief) series of bluffs where the sharks and good players are completely caught off guard, which feeds back into the cycle and makes him feel invincible.  Once people figure out his game, they quickly and decisively dismantle him no matter at which table he&#8217;s seated, but his brief, intensely bright and meteoric rise is as memorable as the explosion and flameout.</p>
<p>It&#8217;s the Company Man approach that winds up with a chance for escape.  Company Man has neither Xenophobe&#8217;s neurotic need to believe himself a poker expert nor Master Beginner&#8217;s complete faith in his delusion, so he is the one that might actually cash out and go do something else with the money before it&#8217;s all gone.  There&#8217;s no guarantee, but at least he has a fighting chance.</p>
<h2>Tragicomic Explosion: Fall of the Master Beginner</h2>
<p>The Master Beginner&#8217;s fate is really the least interesting because it&#8217;s so entirely predictable.  In the poker analogy, he blows into the high stakes table like a hurricane, creating massive disruption before blowing out just as quickly.  In the real world, Master Beginners don&#8217;t last.  Their timeline is highly accelerated.  </p>
<p>A Master Beginner that is new to a company will come in and proclaim that everything is wrong and loudly bang his own drum as some kind of Messianic figure sent in to save the masses from themselves.  Everyone believes him at first &#8212; even Experts.  The reason is partially what I mentioned in the previous post: that people assume someone this brazen must be right.  But it&#8217;s also partially that people in the Competent to Expert range are aware that they&#8217;re not all-knowing and are inclined to accept initially at face value that someone knows things they don&#8217;t.</p>
<p>It isn&#8217;t long before the Competents, Proficients, and Experts figure out that Master Beginner is a bag of hot air.  The only remaining questions then are (1) how long until management starts listening and acts on the words of their good developers (2) how many hilarious things happen before it does.  </p>
<p>Some Master Beginners mount an impressive enough initial assault to be promoted quickly or named to a position of authority, but this just buys them a few more months or, in extreme cases, years, once the jig is up.  The Master Beginner rockets through the atmosphere like a meteorite: blazingly fast, with blinding light, and ending in a spectacular conflagration.  </p>
<p>Master Beginners are probably the least pitiable because they&#8217;re usually insufferable, personally, but also because they tend to land on their feet.  If one&#8217;s shtick is being able to pull off a ridiculous skill bluff for a little while, securing interviews and getting job offers tends not to be a problem.  Most people who know Master Beginners tend to shake their heads and say, &#8220;I can&#8217;t believe people keep hiring that guy!&#8221;  Master Beginner inevitably fails at his goal because his goal is to receive the recognition he deserves as a consummate expert and that never lasts for any length of time, wherever he goes.</p>
<h2>Slow, Agonizing Defeat: Fall of the Xenophobe</h2>
<p>Xenophobe&#8217;s arc is a longer-playing one, by far, than Master Beginner and there is actually some remote chance for limited success.  The goal of Xenophobe is to freeze the world in its current state, within the cocoon of his comfort zone.  He wants to keep the same members on the same team using the same technologies to do the same work, in perpetuity.  If you&#8217;re a bettor, you probably wouldn&#8217;t take those odds on a long timeline, but nevertheless that&#8217;s what he wants and aims for.</p>
<p>If he happens to work for some remote outfit, nestled snugly within some byzantine bureaucracy, he might be able to keep the dream alive as he runs out the clock toward retirement.  But situations where nothing about the work environment changes are rare, especially in software, and only becoming rarer.  There aren&#8217;t that many opportunities to lead a team that cranks out maintenance updates to some COBOL system and plans to keep doing so until 2034.  </p>
<p>The far more common case is that things do change.  People come and go.  New frameworks must be learned.  New ideas sneak in through various channels, and all of it chips away at the credibility of Xenophobe&#8217;s qualifications.  He can manage at first, but eventually management overhears whispers from other developers of ways of doing things that could save tons of time and money.  People from other departments hear about tech buzz words and Xenophobe doesn&#8217;t even know what they are.  Day after day, month after month, his credibility erodes until something happens.</p>
<p>That something can vary.  Perhaps it&#8217;s the appointment of a &#8220;co-architect&#8221; or a reorganization of the group.  Perhaps he&#8217;s shuffled onto a different project or asked to continue to maintain the old version while an up-and-comer is tasked with architecting the re-write.  It could be outside consultants brought in as &#8220;staff augs&#8221; or farming off of whole projects elsewhere.  </p>
<p>Interestingly, it&#8217;s rarely a termination.  Unlike Master Beginner, Xenophobe doesn&#8217;t squirt gasoline on bridges and gleefully ignite them.  He&#8217;s more pitiable and shrewd.  So what happens is that he&#8217;s effectively put out to pasture in all but name.  He might even get a better title or an office or something, but his responsibilities are divvied up and portioned out to others until he just collects a handsome wage to sit in his office and do very little.  </p>
<p>While Xenophobe&#8217;s capacity for self-delusion is high as is generally the case with Expert Beginners, his tolerance for cognitive dissonance is extremely low, which makes this &#8220;reorg&#8221; too much for him to take lying down.  He may rage-quit &#8212; a sad option since he&#8217;s probably going to need to take a massive pay-cut to get hired anywhere else.  He may simply rage, at which point his management is likely to show him a starker view of reality than he&#8217;s accustomed to seeing, which is a sad sight.  Or he may do neither of those things and bitterly accept the new situation.  </p>
<p>The fate of Xenophobe is actually intensely depressing.  If you&#8217;ve worked with him directly, you probably don&#8217;t find it such during the short term since he&#8217;s often pretty hard to work with, but he&#8217;s not a pathological grand-stander like Master Beginner.  He&#8217;s just a guy that lucked out, believed his own hype and got out of his depth.  In a way, he&#8217;s like a lottery winner that squanders his fortune and winds up broke.  Almost invariably, Xenophobes drift bitterly toward retirement, stripped of all real responsibility and collecting paychecks at the mercy of mid-level managers that continue to bolster (fake) the business case for keeping him on staff.  When he&#8217;s not so lucky, he winds up in the same boat as the rage-quitter &#8212; taking a huge pay and responsibility cut or crawling back to his former employer and then taking a huge pay and responsibility cut.</p>
<h2>A Glimmer of Hope: The Company Man</h2>
<p>Company Man lacks the neurotic pride of Xenophobe and the pathological cockiness of Master Beginner, and that has the potential to provide a way out.  But let&#8217;s consider what happens to Company Men who don&#8217;t escape first.  These are the one who find their way into project management or line management and squander the false capital of their &#8216;technical expertise.&#8217;</p>
<p>At the core of the Expert Beginner experience is a quest for status and recognition.  It&#8217;s not about money or really even organizational power (beyond the software group anyway).  Truly.  If it were, the Expert Beginner would never become Expert Beginner.  He&#8217;d recognize that the path to a corner office usually doesn&#8217;t wind its way through the land of &#8220;knowing the Java compiler inside and out.&#8221;  Someone interested primarily in earning or being a C-level executive would recognize that programming is something you do for a few years and put up with until you can make the jump to project management, then line management, then VP-hood, etc.  Expert Beginners relish being the best bowler in the alley, and are willing to chase better bowlers away with baseball bats to protect their status, if it comes down to it (or simply claim they won in spite of having a lower score, in the case of wildly delusional Master Beginner).</p>
<p>Company Men who don&#8217;t make it fail to recognize a life raft being floated to them.  Once put into a managerial position of authority, they rule like technical Expert Beginners (architects or tech leads or whatever they used to be).  To put it another way, they micromanage.  In their previous role, they likely had some actual programming to do or else their control wasn&#8217;t absolute, so others could defy them, pick up the slack, or do what needed to be done to keep the wheels on the machine as it flew down the tracks.  But a micro-managing Expert Beginner has nothing to do but meddle, bark orders, and chew people out for thinking for themselves.  The wheels start to come off pretty quickly under his (mis-) management.</p>
<p>This Company Man unwittingly sabotages himself by finally having and exerting total technical control.  Ironically, he sinks the ship by totally assuming the helm.  Work stops getting done, morale plummets, projects fail, and HR issues abound as employees choose between defying the Expert Beginner and getting things right and obeying and having the project fail.  Attrition mounts in these circumstances and the Dead Sea Effect cycle time is radically accelerated with developers jumping ship like rats.  Clearly, this is unsustainable, and the Company Man is demoted or let go.  This is a tough spot for Company Man because he&#8217;s bad at tech, but has a good track record for it on paper.  He could theoretically be less incompetent at managing, but he&#8217;s crashed and burned in his only stab at that role.  So he likely winds up hiring on as some senior developer elsewhere and trying to repeat the cycle.  He isn&#8217;t quite as nimble as Master Beginner, but he&#8217;s not utterly trapped like Xenophobe, either.  He&#8217;ll move on and probably have a chance to get management right the second time around and stop playing techie with a face-saving strategy.</p>
<p>And that brings us to the successful escapee of Expert Beginnerism: the (subconsciously) self-aware Company Man.  He&#8217;ll never admit it, even to himself, but the successful Expert Beginner can feel the wolves closing in as the world changes and his policies are increasingly not successful.  As he contemplates where to go from &#8220;Architect That Frequently Squabbles with Some of his Senior Developers,&#8221; this is the guy who hears a little, nagging voice in the back of his head that says &#8220;you know, times are changing here faster than you want to, so perhaps its time to hang up your obviously quite impressive spurs and &#8216;retire&#8217; to management.&#8221;  </p>
<p>When he makes the jump, he also makes a clean break with his former life.  He&#8217;s content to be known as the guy who used to be The Architect, but is now in management.  There will be some amount of shared, mutual fiction between him and his formerly restless techie underlings as they&#8217;re grateful for his departure and wish him the best, in earnest, so that he stops being Architect.  They&#8217;ll agree with him that he was truly an awesome architect whose incredible skill set is just needed elsewhere.  Everyone wins here, so why not?</p>
<p>And from here, there&#8217;s a new period of acquisition and the slate is wiped clean.  The former technical Expert Beginner reaps the benefits of being considered an &#8216;Expert&#8217; as he embarks on a new learning curve.  And while certain personality leanings make this possible, there&#8217;s no guarantee that he&#8217;ll become an Expert Beginner at management.  He might excel in it and be receptive to continued learning in a way that he wasn&#8217;t as an erstwhile techie.  He might also become an Expert Beginner in management, but the odds here aren&#8217;t nearly as bad since management is really a lot more subjective and competence versus incompetence harder to assess concretely.  By keeping his hands off of the ship&#8217;s helm, sails, and really anything of import, the former Expert Beginner can be a decent captain by relying heavily on his competent crew, even if he was a poor sailor.</p>
<h2>A Sad Tale</h2>
<p>Following the career arc of Expert Beginners is really quite sad.  In the early stages, one feels annoyed and a little indignant at advancement by luck instead of competence.  As things progress, real damage is caused by poor implementation and wrong-headed approaches, resulting for a lot of people in stress, frustration, failure, and at times even lost jobs and failed ventures.  And, in the end, the fate of the one that caused these things is probably poetically just, but hard to find happiness in.  A person ill-suited for a role assumed it, caused problems, and then suffered personal hardship.  It&#8217;s not a great story.  </p>
<p>This is my last Expert Beginner post on the blog until after the release of the E-book, when I will eventually publish the conclusion, entitled, &#8220;Wasted Talent: The Tragedy of the Expert Beginner.&#8221;  </p>
<p>But the one thing to take away from this post is a bit of ability to assess what effect Expert Beginners may have on your career.  You will usually see them crash and burn on a long enough timeline, if you can outlast them.  Occasionally they will be promoted out of your way.  Should you stick around and fight them or wait for their demise (or try to help them, if you&#8217;re altruistic and masochistic)?  That certainly has to be a decision for you to make, but it should help to know that even slow-acting or overly loyal organizations will self-correct eventually, provided they have a track record for success.  So consider the company, its Expert Beginner, the type of Expert Beginner, and the distance along in the process of their fall from power when you make your decision.</p>
<div class="trackable_sharing"><a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~twitter.com/share?url=http%3A%2F%2Fwww.daedtech.com%2Fself-correcting-organizations-fall-of-the-expert-beginner&text=Self-Correcting+Organizations%3A+Fall+of+the+Expert+Beginner" style="text-decoration: none; white-space: nowrap;" title="Twitter" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Twitter','http://www.daedtech.com/self-correcting-organizations-fall-of-the-expert-beginner']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//twitter.png" alt="Twitter" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.linkedin.com/shareArticle?mini=true&url=http%3A%2F%2Fwww.daedtech.com%2Fself-correcting-organizations-fall-of-the-expert-beginner&title=http%3A%2F%2Fwww.daedtech.com%2Fself-correcting-organizations-fall-of-the-expert-beginner&ro=false&summary=&source=" style="text-decoration: none; white-space: nowrap;" title="Linkedin" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Linkedin','http://www.daedtech.com/self-correcting-organizations-fall-of-the-expert-beginner']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//linkedin.png" alt="Linkedin" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~digg.com/submit?partner=addthis&url=http%3A%2F%2Fwww.daedtech.com%2Fself-correcting-organizations-fall-of-the-expert-beginner&title=Self-Correcting+Organizations%3A+Fall+of+the+Expert+Beginner&bodytext=" style="text-decoration: none; white-space: nowrap;" title="Digg" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Digg','http://www.daedtech.com/self-correcting-organizations-fall-of-the-expert-beginner']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=750,height=450'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//digg.png" alt="Digg" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.reddit.com/login?dest=%2Fsubmit%3Furl=http%3A%2F%2Fwww.daedtech.com%2Fself-correcting-organizations-fall-of-the-expert-beginner&title=http%3A%2F%2Fwww.daedtech.com%2Fself-correcting-organizations-fall-of-the-expert-beginner" style="text-decoration: none; white-space: nowrap;" title="Reddit" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Reddit','http://www.daedtech.com/self-correcting-organizations-fall-of-the-expert-beginner']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=700,height=500'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//reddit.png" alt="Reddit" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.daedtech.com%2Fself-correcting-organizations-fall-of-the-expert-beginner&title=http%3A%2F%2Fwww.daedtech.com%2Fself-correcting-organizations-fall-of-the-expert-beginner" style="text-decoration: none; white-space: nowrap;" title="Stumbleupon" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Stumbleupon','http://www.daedtech.com/self-correcting-organizations-fall-of-the-expert-beginner']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=750,height=450'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//stumbleupon.png" alt="Stumbleupon" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.tumblr.com/share/link?url=http%3A%2F%2Fwww.daedtech.com%2Fself-correcting-organizations-fall-of-the-expert-beginner&name=Self-Correcting+Organizations%3A+Fall+of+the+Expert+Beginner&description=" style="text-decoration: none; white-space: nowrap;" title="Tumblr" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Tumblr','http://www.daedtech.com/self-correcting-organizations-fall-of-the-expert-beginner']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=400'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//tumblr.png" alt="Tumblr" width="32" height="32"></a> <a href="mailto:?subject=Check out http%3A%2F%2Fwww.daedtech.com%2Fself-correcting-organizations-fall-of-the-expert-beginner" style="text-decoration: none; white-space: nowrap;" title="Email" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Email','http://www.daedtech.com/self-correcting-organizations-fall-of-the-expert-beginner']); "><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//email.png" alt="Email" width="32" height="32"></a> 
<br><div style="padding: 5px 0 0;"><fb:like href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~http%3A%2F%2Fwww.daedtech.com%2Fself-correcting-organizations-fall-of-the-expert-beginner" send="true" width="450" show_faces="true" font=""></fb:like></div>
<br><g:plusone annotation="inline"></g:plusone></div><Img align="left" border="0" height="1" width="1" style="border:0;float:left;margin:0;padding:0" hspace="0" src="http://feeds.feedblitz.com/~/i/41134290/0/daedtech/www">
]]>
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Add to Any&quot; href=&quot;http://feeds.feedblitz.com/_/26/41134290/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/addtoany20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.feedblitz.com/_/24/41134290/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.feedblitz.com/_/19/41134290/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.feedblitz.com/_/20/41134290/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</content:encoded>
			<wfw:commentRss>http://www.daedtech.com/self-correcting-organizations-fall-of-the-expert-beginner/feed</wfw:commentRss>
		<slash:comments>1</slash:comments></item>
<item>
<feedburner:origLink>http://www.daedtech.com/is-he-technical?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=is-he-technical</feedburner:origLink>
		<title>Is He Technical?</title>
		<link>http://feeds.feedblitz.com/~/40994236/0/daedtech/www~Is-He-Technical</link>
		<comments>http://www.daedtech.com/is-he-technical#comments</comments>
		<pubDate>Fri, 10 May 2013 06:09:41 +0000</pubDate>
		<dc:creator>Erik Dietrich</dc:creator>
				<category><![CDATA[The Life of a Programmer]]></category>
		<category><![CDATA[Leadership]]></category>
		<category><![CDATA[Soft Skills]]></category>
		<category><![CDATA[Software Management]]></category>
		<guid isPermaLink="false">http://www.daedtech.com/?p=2954</guid>
		<description><![CDATA[A short post today&#8211;I&#8217;m still sort of in frantic mode and switching gears in a variety of ways, but I didn&#8217;t want to go the whole week with just the one post. Some time back, I observed some people working on a project in which the team consisted of some <a class="more-link" href="http://www.daedtech.com/is-he-technical">Continue reading <span class="meta-nav">&#8594;</span></a>]]>
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Add to Any&quot; href=&quot;http://feeds.feedblitz.com/_/26/40994236/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/addtoany20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.feedblitz.com/_/24/40994236/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.feedblitz.com/_/19/40994236/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.feedblitz.com/_/20/40994236/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</description>
				<content:encoded><![CDATA[<p>A short post today&#8211;I&#8217;m still sort of in frantic mode and switching gears in a variety of ways, but I didn&#8217;t want to go the whole week with just the one post.</p>
<p>Some time back, I observed some people working on a project in which the team consisted of some developers of varying experience levels and skill sets.  There was also a project manager assigned to the project, but he definitely wanted to put the &#8220;manager&#8221; in &#8220;project manager.&#8221;  Rather than Gantt charts and status reports, he insisted on being part of every technical decision, however coarse or fine grained.  It was hard to tell, from my outsider perspective, whether his inputs (orders) made any sense or whether he was just wasting time and clouding the issue when he could have been focusing on logistics, communication, and removing obstacles from the path of the developers, as one might expect from a pure project manager.</p>
<p>It appeared to me that he wasn&#8217;t just failing to remove obstacles, but that he <em>was</em> an obstacle.  This was confirmed by a conversation that I later overheard among a few of the developers in the form of a simple but profound and damning question.  My understanding of this project manager&#8217;s background was that he was the sort of PM who had cut his teeth as a developer for a number of years and &#8216;graduated&#8217; to project management.  The unintentionally damning question from one of the developers was a simple, frustrated, &#8220;is he even technical?&#8221;  </p>
<p>That might not seem like it matters at first blush, but that&#8217;s the kind of thing where, if you let it wash over you, there&#8217;s something important and fundamentally bad happening.  The PM either has a technical background or not, and the badness is present either way.  If he does not have a technical background, the obvious question is &#8220;why is he attempting to stick his nose in development and design discussions?&#8221;  But if he is technical&#8230;ouch.</p>
<p>If he is technical, he&#8217;s communicating so poorly or getting concepts so wrong during the course of (micro) management that the developers are genuinely unclear on whether or not he has a programming background.  Unintentionally damning.  They&#8217;re not accusing him of anything or gossiping or anything along those lines&#8211;they&#8217;re so underwhelmed by his contributions that they think he doesn&#8217;t even possess table stakes, bare-minimum competence in the field.</p>
<p>The &#8220;duh&#8221; lesson here is not to blather on or bark orders when you don&#8217;t know what you&#8217;re talking about, but that&#8217;s really kind of an edge case.  I&#8217;d say the take-away for the readership here is to ask yourself, assuming you&#8217;re in a position of authority, whether anyone would quietly wonder if you&#8217;re technical.  Maybe it&#8217;s because you&#8217;ve been doing too much delegating or are busy with other things, but still, don&#8217;t let this be said about you.  I&#8217;ve <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.daedtech.com/leading-software-teams-of-humans">touched on this subject before</a> in the context of a team lead, but this is a broader concern.  As you go along working with others, take inventory from time to time, asking yourself whether anyone might be wondering skeptically how you came to be in a position of authority.  If you think they might be, don&#8217;t blow that off and think it&#8217;s not worth proving.  It is.  Responsibility without respect is empty, so remember to earn yourself some respect from time to time.</p>
<div class="trackable_sharing"><a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~twitter.com/share?url=http%3A%2F%2Fwww.daedtech.com%2Fis-he-technical&text=Is+He+Technical%3F" style="text-decoration: none; white-space: nowrap;" title="Twitter" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Twitter','http://www.daedtech.com/is-he-technical']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//twitter.png" alt="Twitter" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.linkedin.com/shareArticle?mini=true&url=http%3A%2F%2Fwww.daedtech.com%2Fis-he-technical&title=http%3A%2F%2Fwww.daedtech.com%2Fis-he-technical&ro=false&summary=&source=" style="text-decoration: none; white-space: nowrap;" title="Linkedin" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Linkedin','http://www.daedtech.com/is-he-technical']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//linkedin.png" alt="Linkedin" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~digg.com/submit?partner=addthis&url=http%3A%2F%2Fwww.daedtech.com%2Fis-he-technical&title=Is+He+Technical%3F&bodytext=" style="text-decoration: none; white-space: nowrap;" title="Digg" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Digg','http://www.daedtech.com/is-he-technical']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=750,height=450'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//digg.png" alt="Digg" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.reddit.com/login?dest=%2Fsubmit%3Furl=http%3A%2F%2Fwww.daedtech.com%2Fis-he-technical&title=http%3A%2F%2Fwww.daedtech.com%2Fis-he-technical" style="text-decoration: none; white-space: nowrap;" title="Reddit" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Reddit','http://www.daedtech.com/is-he-technical']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=700,height=500'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//reddit.png" alt="Reddit" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.daedtech.com%2Fis-he-technical&title=http%3A%2F%2Fwww.daedtech.com%2Fis-he-technical" style="text-decoration: none; white-space: nowrap;" title="Stumbleupon" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Stumbleupon','http://www.daedtech.com/is-he-technical']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=750,height=450'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//stumbleupon.png" alt="Stumbleupon" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.tumblr.com/share/link?url=http%3A%2F%2Fwww.daedtech.com%2Fis-he-technical&name=Is+He+Technical%3F&description=" style="text-decoration: none; white-space: nowrap;" title="Tumblr" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Tumblr','http://www.daedtech.com/is-he-technical']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=400'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//tumblr.png" alt="Tumblr" width="32" height="32"></a> <a href="mailto:?subject=Check out http%3A%2F%2Fwww.daedtech.com%2Fis-he-technical" style="text-decoration: none; white-space: nowrap;" title="Email" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Email','http://www.daedtech.com/is-he-technical']); "><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//email.png" alt="Email" width="32" height="32"></a> 
<br><div style="padding: 5px 0 0;"><fb:like href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~http%3A%2F%2Fwww.daedtech.com%2Fis-he-technical" send="true" width="450" show_faces="true" font=""></fb:like></div>
<br><g:plusone annotation="inline"></g:plusone></div><Img align="left" border="0" height="1" width="1" style="border:0;float:left;margin:0;padding:0" hspace="0" src="http://feeds.feedblitz.com/~/i/40994236/0/daedtech/www">
]]>
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Add to Any&quot; href=&quot;http://feeds.feedblitz.com/_/26/40994236/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/addtoany20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.feedblitz.com/_/24/40994236/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.feedblitz.com/_/19/40994236/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.feedblitz.com/_/20/40994236/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</content:encoded>
			<wfw:commentRss>http://www.daedtech.com/is-he-technical/feed</wfw:commentRss>
		<slash:comments>0</slash:comments></item>
<item>
<feedburner:origLink>http://www.daedtech.com/the-weird-winds-of-change?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=the-weird-winds-of-change</feedburner:origLink>
		<title>The Weird Winds of Change</title>
		<link>http://feeds.feedblitz.com/~/40842601/0/daedtech/www~The-Weird-Winds-of-Change</link>
		<comments>http://www.daedtech.com/the-weird-winds-of-change#comments</comments>
		<pubDate>Mon, 06 May 2013 05:10:53 +0000</pubDate>
		<dc:creator>Erik Dietrich</dc:creator>
				<category><![CDATA[Announcements]]></category>
		<guid isPermaLink="false">http://www.daedtech.com/?p=2942</guid>
		<description><![CDATA[This is sort of an announcement post and sort of a meandering jaunt into my own personal journey. Also thrown in will be bits of apology, opportunity, and regret. So, let&#8217;s get right down to brass tacks. A few weeks back, I gave notice at my job. I had come <a class="more-link" href="http://www.daedtech.com/the-weird-winds-of-change">Continue reading <span class="meta-nav">&#8594;</span></a>]]>
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Add to Any&quot; href=&quot;http://feeds.feedblitz.com/_/26/40842601/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/addtoany20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.feedblitz.com/_/24/40842601/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.feedblitz.com/_/19/40842601/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.feedblitz.com/_/20/40842601/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</description>
				<content:encoded><![CDATA[<p>This is sort of an announcement post and sort of a meandering jaunt into my own personal journey.  Also thrown in will be bits of apology, opportunity, and regret.  So, let&#8217;s get right down to brass tacks.</p>
<p>A few weeks back, I gave notice at my job.  I had come on board with a consulting firm to do heavy architectural work with object-oriented design, mainly in the .NET space, but fate had other ideas.  I did a good bit of .NET work at first, but the vagaries of the local market and demand for software work were such that the business was pivoting increasingly toward customizing third party software installations such as Sharepoint, Salesforce, Microsoft Dynamics, etc.  Doing simple, run-of-the-mill customization of these pieces of software is certainly good work for someone, but that someone isn&#8217;t me, so after biding my time and hoping for more compatible work, I decided to pull up anchor and chart my own course.</p>
<p>Actually, I more decided to shove off in a lifeboat without any oars, sails, or motor because I defied all career advice that I&#8217;ve ever received from saner people and just gave notice without lining up another job.  There was a method, of sorts, to this madness.  I&#8217;ve never really liked the way you get another job by slinking around behind your current employer&#8217;s back, and I was getting a lot of emails from recruiters, and well, just lots of things in general.  In fact, I had reached a bit of a crossroads.  I had various opportunities to generate passive income, a good number of requests to do freelance work in a variety of languages and frameworks under the DaedTech LLC umbrella, a lot of different interview opportunities. (I actually got an email about a job opportunity literally as I was typing this sentence.)  The one thing I lacked was time.  So I shoved off from the mothership, adrift in the night-sea, but with good intelligence that various islands were nearby with bananas and fresh water and friendly, helpful island monkeys and whatever else you see in fantasies where castaways build island paradises.</p>
<p>My intention was to do a bit of gonzo work-seeking.  I&#8217;d tie up some loose ends and serve out the remainder of my notice time, and then I&#8217;d sit back, take inventory, and start the process of deciding what to do next, blogging all the while about my adventures while listening to people heckle me justifiably for being reckless with my career.  I thought that would give me some time to deliberate between potentially working for a major tech player, relocating, casting my lot with a start-up, taking a stable local job, or just being the Founder and Principal of DaedTech LLC full time.  Maybe I&#8217;d turn it into some kind of book and try to trade on the fact that pretty much anyone can get lucky at being a writer these days.  </p>
<p>But fate, it would seem, had other plans.  Interestingly, on the day that I gave notice, <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~typecastexception.com/">John Atten</a> submitted the first <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.daedtech.com/how-developers-stop-learning-rise-of-the-expert-beginner">Expert Beginner post</a> to Reddit where it got enough love to rocket to the top for a day or so and drive a lot of traffic to the blog.  This resulted in a surprising and awesome variety of invitations that I alluded to above, and it also occupied a good bit of my time keeping up while I wrapped things up at work.  Add to this the fact that sending out a few actual resumes to some interesting companies and informing a few recruiters that I knew of my situation generated a good bit of interview activity right away, and I have been <em>insanely</em> busy for the last couple of weeks.  Busy in a good way, but busy.  Really, really busy.</p>
<p>I kept meaning to get around to announcing my job search with some grand blog post and to follow it up with tales of interviews, applications, and whatever else happens during a developer job search.  I figured that I&#8217;d use this as a staging point to kick off a heavily networking-based, developer-community-oriented search for my next venture, but I actually wound up taking a job before I had time for any of that (I had actually left the post about job descriptions in my drafts folder for a couple of months&#8211;that wasn&#8217;t inspired by my situation these past couple of weeks).  I got a great offer that was basically impossible to pass up, so I accepted and will be running a modestly-sized software development group starting on Monday, May 6th, doing double duty managing and serving as architect.  </p>
<p>With this change, I&#8217;m hoping that the dust will settle a bit and my life will resume some sort of relatively normal pace instead of the break-neck speed it&#8217;s been at of late.  Beside the change of jobs, here are some other new things in the pipeline that may be of interest to those reading:</p>
<ol>
<li>I am going to be authoring courses for <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~pluralsight.com/training">Pluralsight</a>&#8211;stay tuned for my first course to come out later this month.</li>
<li>I mentioned it as a quick edit to the first Expert Beginner post, but look for that posting series to be wrapped up and published as an E-Book.</li>
<li>Time to start reading others&#8217; blogs and listening to podcasts again.  I haven&#8217;t had time in the last several weeks, and I feel so out of touch that it&#8217;s a little icky.</li>
<li>Looking to be better about responding to everyone&#8217;s comments.  I really try to give thoughtful responses to everyone that takes the time to leave a comment, but I&#8217;ve definitely been a little lax about this lately, and I&#8217;m planning to be better about it.</li>
<li>For those of you who have emailed me or otherwise contacted me about freelance work or joint programming ventures, you won&#8217;t be competing with interviews and recruiters and such, so I&#8217;ll be better about responsiveness.</li>
<li>Normal posting cadence is Monday, Wednesday, Friday, though I&#8217;ve struggled at that pace recently.  Planning to get back on track.</li>
<li>Also, look for more programming-oriented posts as I&#8217;ll have my hands back in code with a lot more frequency</li>
<li>And, most likely, look for most of this in earnest after Memorial Day. After my first week of work, I&#8217;ll be out of the country for a couple of weeks.  When I come back, hopefully rested, I also plan to do some non-programming-related reading lest I become too one dimensional.</li>
</ol>
<p>Thanks for your patience with the jerky post cadence and more rant-oriented, less code-heavy content of late, and most of all, thanks for reading.</p>
<p>Cheers!</p>
<div class="trackable_sharing"><a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~twitter.com/share?url=http%3A%2F%2Fwww.daedtech.com%2Fthe-weird-winds-of-change&text=The+Weird+Winds+of+Change" style="text-decoration: none; white-space: nowrap;" title="Twitter" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Twitter','http://www.daedtech.com/the-weird-winds-of-change']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//twitter.png" alt="Twitter" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.linkedin.com/shareArticle?mini=true&url=http%3A%2F%2Fwww.daedtech.com%2Fthe-weird-winds-of-change&title=http%3A%2F%2Fwww.daedtech.com%2Fthe-weird-winds-of-change&ro=false&summary=&source=" style="text-decoration: none; white-space: nowrap;" title="Linkedin" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Linkedin','http://www.daedtech.com/the-weird-winds-of-change']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//linkedin.png" alt="Linkedin" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~digg.com/submit?partner=addthis&url=http%3A%2F%2Fwww.daedtech.com%2Fthe-weird-winds-of-change&title=The+Weird+Winds+of+Change&bodytext=" style="text-decoration: none; white-space: nowrap;" title="Digg" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Digg','http://www.daedtech.com/the-weird-winds-of-change']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=750,height=450'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//digg.png" alt="Digg" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.reddit.com/login?dest=%2Fsubmit%3Furl=http%3A%2F%2Fwww.daedtech.com%2Fthe-weird-winds-of-change&title=http%3A%2F%2Fwww.daedtech.com%2Fthe-weird-winds-of-change" style="text-decoration: none; white-space: nowrap;" title="Reddit" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Reddit','http://www.daedtech.com/the-weird-winds-of-change']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=700,height=500'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//reddit.png" alt="Reddit" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.daedtech.com%2Fthe-weird-winds-of-change&title=http%3A%2F%2Fwww.daedtech.com%2Fthe-weird-winds-of-change" style="text-decoration: none; white-space: nowrap;" title="Stumbleupon" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Stumbleupon','http://www.daedtech.com/the-weird-winds-of-change']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=750,height=450'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//stumbleupon.png" alt="Stumbleupon" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.tumblr.com/share/link?url=http%3A%2F%2Fwww.daedtech.com%2Fthe-weird-winds-of-change&name=The+Weird+Winds+of+Change&description=" style="text-decoration: none; white-space: nowrap;" title="Tumblr" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Tumblr','http://www.daedtech.com/the-weird-winds-of-change']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=400'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//tumblr.png" alt="Tumblr" width="32" height="32"></a> <a href="mailto:?subject=Check out http%3A%2F%2Fwww.daedtech.com%2Fthe-weird-winds-of-change" style="text-decoration: none; white-space: nowrap;" title="Email" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Email','http://www.daedtech.com/the-weird-winds-of-change']); "><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//email.png" alt="Email" width="32" height="32"></a> 
<br><div style="padding: 5px 0 0;"><fb:like href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~http%3A%2F%2Fwww.daedtech.com%2Fthe-weird-winds-of-change" send="true" width="450" show_faces="true" font=""></fb:like></div>
<br><g:plusone annotation="inline"></g:plusone></div><Img align="left" border="0" height="1" width="1" style="border:0;float:left;margin:0;padding:0" hspace="0" src="http://feeds.feedblitz.com/~/i/40842601/0/daedtech/www">
]]>
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Add to Any&quot; href=&quot;http://feeds.feedblitz.com/_/26/40842601/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/addtoany20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.feedblitz.com/_/24/40842601/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.feedblitz.com/_/19/40842601/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.feedblitz.com/_/20/40842601/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</content:encoded>
			<wfw:commentRss>http://www.daedtech.com/the-weird-winds-of-change/feed</wfw:commentRss>
		<slash:comments>5</slash:comments></item>
<item>
<feedburner:origLink>http://www.daedtech.com/what-your-job-descriptions-are-saying-to-developers-about-your-company?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=what-your-job-descriptions-are-saying-to-developers-about-your-company</feedburner:origLink>
		<title>What Your Job Descriptions Are Saying to Developers About Your Company</title>
		<link>http://feeds.feedblitz.com/~/40701092/0/daedtech/www~What-Your-Job-Descriptions-Are-Saying-to-Developers-About-Your-Company</link>
		<comments>http://www.daedtech.com/what-your-job-descriptions-are-saying-to-developers-about-your-company#comments</comments>
		<pubDate>Thu, 02 May 2013 08:02:40 +0000</pubDate>
		<dc:creator>Erik Dietrich</dc:creator>
				<category><![CDATA[The Life of a Programmer]]></category>
		<category><![CDATA[Software Management; Job Search]]></category>
		<guid isPermaLink="false">http://www.daedtech.com/?p=2669</guid>
		<description><![CDATA[Every week I get a fairly steady stream of emails from recruiters, announcing an opportunity for some software development related job: engineer, programmer, senior developer, architect, and so on and so forth. These emails come in all shapes and sizes and, probably owing to my eclectic, polyglot background, they cover <a class="more-link" href="http://www.daedtech.com/what-your-job-descriptions-are-saying-to-developers-about-your-company">Continue reading <span class="meta-nav">&#8594;</span></a>]]>
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Add to Any&quot; href=&quot;http://feeds.feedblitz.com/_/26/40701092/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/addtoany20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.feedblitz.com/_/24/40701092/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.feedblitz.com/_/19/40701092/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.feedblitz.com/_/20/40701092/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</description>
				<content:encoded><![CDATA[<p>Every week I get a fairly steady stream of emails from recruiters, announcing an opportunity for some software development related job: engineer, programmer, senior developer, architect, and so on and so forth.  These emails come in all shapes and sizes and, probably owing to my eclectic, polyglot background, they cover a range of different technologies and programming languages.  One relatively common characteristic is that below the actual text of the email is pasted a job description.  More often than not, I read this (or at least start to) out of general curiosity as to the state of the market.  Some of them are reasonable and straightforward, making me think that the company in question would be a good, or at least decent, place to work.  But others contain things that I&#8217;d call red flags.  </p>
<p>Extrapolating beyond what gets sent to me via secondhand emails and generalizing to job boards and sites and other places where companies solicit talent (I can&#8217;t speak directly to these since I haven&#8217;t looked at them in quite a while), I think companies would be well served to consider what their job descriptions say to developers about them.  It may not always be what&#8217;s intended.  Consider some of the following characteristics of a job description and what they imply about the job.</p>
<h2>Alphabet Soup of Technologies</h2>
<p>&#8220;We favor and value superficial exposure and grandstanding over depth of knowledge and thoughtfulness.&#8221;</p>
<p>If your job description lists ten, twenty, even thirty (they get pretty ridiculous) different acronyms covering a smattering of programming languages, markup types, development methodologies, design patterns, and things that may not even actually exist, you&#8217;re sending the message that you value prospects that engage in a kind of bedpost-notching gamificiation when it comes to programming.  If you stop and think about it, how would a developer acquire experience with all of those different technologies?  Would you prefer he cram them all into a single project?  Would you prefer that he pick or lobby for two to three new ones for each project he does and do a lot of projects?  Would you prefer he never work on the same thing twice?</p>
<p>If the answer to any of these questions is &#8220;yes,&#8221; then you&#8217;re actively putting on the front porch light for people more concerned with playing with new toys than getting work done (like <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.daedtech.com/the-code-warriors" title="The Code Warriors">Fashionista</a>).  If the answer is &#8220;oh, well that&#8217;s not what we&#8217;re saying&#8221; then you&#8217;re asking the impossible. And you&#8217;re apparently targeting the sort of people who consider &#8220;I think I read a blog post about that once&#8221; a qualification for adding it to their resume.  That leads to the hire of <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.daedtech.com/the-code-warriors" title="The Code Warriors">General Custer</a>.  So with this kind of ad, you&#8217;re targeting a group dynamic where people value breadth over depth of knowledge and are willing to exaggerate or even lie about either.</p>
<h2>Emphasis on Years Spent on Particular Technologies</h2>
<p>&#8220;We work harder, not smarter.&#8221;  </p>
<p>Do you need someone that&#8217;s been banging out Java code for at least seven years?  It has to be seven?  Not six?  If I&#8217;m at six and a half, should I follow the &#8220;always round up&#8221; method or the &#8220;round to even&#8221; method?  I need to know so that I&#8217;ll know whether or not I&#8217;m qualified to program for you.  I can round up?  Great!  Oh, wait.  It says need four years of XML (whatever that means) and I only have three.  I feel so inadequate.  Unless&#8230; can I count non-contiguous years?  I&#8217;m pretty sure that I &#8220;did XML&#8221; for a while about eight years back.  Yessiree&#8211;I came into the office, day after day, and did XML.  In fact, I think it was the same file, even.  I did nothing but create the same XML file by hand every day for months, so that&#8217;s got to count for a lot, right?</p>
<p><a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.daedtech.com/wp-content/uploads/2013/03/WorkHarder.jpg"><img src="http://www.daedtech.com/wp-content/uploads/2013/03/WorkHarder.jpg" alt="WorkHarder" class="alignnone size-full wp-image-2791" /></a></p>
<p>Here&#8217;s the thing.  You don&#8217;t actually want people who have &#8220;done Java&#8221; or &#8220;done XML&#8221; or &#8220;done whatever&#8221; for X years.  What you actually want is people who are <em>good</em> at Java, XML, or whatever, and you mistakenly think that a good measure (or at least indicator) of that is how many years they&#8217;ve spent doing it.  The problem is that this assumes that people acquire skill at the same rate, which is demonstrably false. It also assumes that they are spending all of that time improving, which, I would argue, becomes increasingly improbable with each additional year of experience.  Certainly there are people who simply like working with a technology and wouldn&#8217;t have it any other way, but if you find someone who has been banging out Java code day in and day out for a decade, it might occur to you to ask them things like, &#8220;why aren&#8217;t you a lead or manager or architect or something?&#8221;  The answer might be that they love having their hands on the keyboard, but it also might be (not said, of course) &#8220;I&#8217;m just not good enough at it to achieve anything besides not being fired.&#8221;</p>
<p>Are those the people that you want to hire?  Probably not, but are you that confident that you can cull them out in an interview when the stakes are pretty high?  As an awesome saying goes, you run the risk of hiring not a Java developer with ten years experience but a Java developer with the same one year of experience ten times.  If you want talent and achievement, what you should actually want is people who are good at programming and design in general.  It really doesn&#8217;t even matter what language(s) the developer knows if she&#8217;s good, and it certainly doesn&#8217;t matter how many years she&#8217;s been cranking out code in it.  But if you start focusing on years/tech metrics, you&#8217;re going to get candidates optimized for that&#8211;you&#8217;re going to have a department dominated by worker bees who&#8217;ve been churning out innovation-free code for decades.</p>
<h2>Applicants will Take a Forty-Five Question Test</h2>
<p>&#8220;However extensive your previous experience, you&#8217;ll always be junior to us.&#8221;</p>
<p>What you ask candidates to do resonates with them beyond the interview process and into their employment; it sets the tone for what their tenure will be like.  And what do you think it says to them when you give them something reminiscent of an SAT subject test?  It says, &#8220;alright young student, if you can pass this standardized aptitude test, you are deemed worthy of learning at the feet of our esteemed senior developers.&#8221;  Standardized tests and the hiring process are both necessarily reductionist activities, since they involve culling a very large percentage of potential applicants down to a much smaller percentage, but there the similarities end.  Standardized tests are administered by nameless teachers, graded by faceless graders, and judged by admissions officers the students will never know.  </p>
<p>Standardized job application quizzes are administered by internet or hiring authority, graded by the same, and judged by the same.  If the applicant doesn&#8217;t score an 80% or whatever is necessary to move on, then no big deal. But if they do wind up hiring on, it will be with people to whom they&#8217;ve submitted to a student-professor/grader/administrator/gatekeeper relationship. That person can always point out at any time during your tenure that you didn&#8217;t know when filling out your scantron that the C# compiler will not choke on &#8220;virtual public void MethodName.&#8221;  I recognize that this could be claimed to some degree with any method of candidate evaluation, but nothing says, &#8220;you&#8217;re no different than an entry level kid&#8221; like simulating the kinds of standardized testing that most people haven&#8217;t done in years or decades.  </p>
<p><a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.daedtech.com/wp-content/uploads/2013/03/NervousTestTaker.jpg"><img src="http://www.daedtech.com/wp-content/uploads/2013/03/NervousTestTaker-256x300.jpg" alt="NervousTestTaker" width="256" height="300" class="alignnone size-medium wp-image-2794" /></a></p>
<h2>%Phases%SDLC%</h2>
<p>&#8220;We&#8217;re embarrassingly waterfall and we don&#8217;t know how to fix it.&#8221;</p>
<p>Companies that are proud of waterfall development methodologies come right out and tout it as their way of doing things (or they call it something like &#8220;Rational Unified Process&#8221;).  That&#8217;s not going to be ideal for a lot of top talent, and it might even be a deal-breaker for some of them, but at least it seems self-aware.  If you swap this frank assessment for the rather meaningless term &#8220;SDLC&#8221; (short for &#8220;Software Development Lifecycle&#8221;), it says that you don&#8217;t actually want people to know your software development methodology is.  Be honest&#8211;if this is on your job description, and a candidate asks whether or not your process is agile as part of the &#8220;questions from the candidate&#8221; section, how are you going to respond?  My money is on hem, haw, and make a comment about how you&#8217;re &#8220;in the process of getting a little more agile but we kind of *ahem*, that is, ah, we&#8217;re kind of still somewhat, er mostly waterfall.&#8221;  Why do I say that?  Well your &#8220;SDLC&#8221; says, &#8220;kinda-sorta-maybe-something-other-than-waterfall,&#8221; but your &#8220;phases&#8221; says, &#8220;really, really waterfall.&#8221;  </p>
<p><a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.daedtech.com/wp-content/uploads/2013/03/HiddenWaterfall.jpg"><img src="http://www.daedtech.com/wp-content/uploads/2013/03/HiddenWaterfall-235x300.jpg" alt="HiddenWaterfall" width="235" height="300" class="alignnone size-medium wp-image-2792" /></a></p>
<p>The reason that I say this is more of a bad sign for candidates than &#8220;waterfall and proud&#8221; is that &#8220;waterfall and proud&#8221; indicates that there is purpose and belief in that process, making it somewhat more likely that things are stable and sane.  In smaller shops or places that do small fixed bid types of projects, for instance, you can probably have some success with a waterfall approach. Candidates recognize that (or else they&#8217;re simply unaware that there&#8217;s an alternative to the waterfall &#8220;procrastinate-rush&#8221; way of doing things).  But if you hide your waterfall behind vague acronyms, it tells candidates that you&#8217;re aware that your process is far from ideal but you haven&#8217;t done anything about it.  From this, candidates can only infer that you&#8217;re lazy/sloppy when it comes to process or else that you&#8217;re not competent when it comes to process.  Neither one exactly rolls out the welcome mat for top-notch talent.</p>
<p>If you want to describe your development methodology and it isn&#8217;t something simple like &#8220;Scrum&#8221; or &#8220;XP,&#8221; I&#8217;d suggest asking for experience with exactly what you want: probably design, implementation, and stabilizing/sustaining.  Whether your approach has &#8220;phases&#8221; or &#8220;sprints&#8221; or whatever, it&#8217;s going to have those activities, so you may as well list them by name.  Rightly or wrongly, SDLC has drifted from being a way to describe software in different states of development and has come instead to describe a process that&#8217;s hard to pin down and even harder to follow.  You don&#8217;t want to broadcast that, true or not.</p>
<h2>Be Prepared to Answer Some Real Brain Teasers!</h2>
<p>&#8220;We think we&#8217;re MENSA&#8221; or &#8220;We think we&#8217;re Google&#8221; (which thinks it&#8217;s MENSA)</p>
<p>Applicants get it.  You want to hire clever people.  You want to hire people that think outside the box.  <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~en.wikipedia.org/wiki/Thinking_outside_the_box">Literally</a>.  And not only that, but you want to demonstrate that you think outside the box by asking non-programming or heavily algorithm-related questions when gauging whether candidates think outside of the box.  It would be so in the box to ask programmers questions about programming or to have them program.  You&#8217;re looking for some kind of box-thinking-outside synergy where everyone has their secret puzzle decoder ring and the cliches flow like box wine.</p>
<p><a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.daedtech.com/wp-content/uploads/2013/03/MensaDude.jpg"><img src="http://www.daedtech.com/wp-content/uploads/2013/03/MensaDude.jpg" alt="MensaDude" class="alignnone size-full wp-image-2793" /></a></p>
<p>To you, it looks selective.  To most people, it just looks gratuitously self-congratulatory.  If you actually are a Google or another respected tech titan and you have the rep to back it up, applicants will prostrate themselves and tolerate this silliness for a chance to punch their ticket with your name on their resume.  But if you&#8217;re Acme Inc. and you specialize in making shoelaces, you&#8217;re threatening to drive away serious talent and be left with goofballs, word-game enthusiasts, and trivia experts more interested in standing behind metaphorical velvet ropes as VIPs than doing high quality work.  Unless your business model is <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.brainbashers.com/">this</a>, you&#8217;d be better served to hire people who can write code than people who know how to measure exactly four gallons using three and five gallon jugs.</p>
<h2>So Then What To Say?</h2>
<p>If it seems as though I&#8217;m impossible to please, I&#8217;m really not.  In fact, just having these things in your job description in no way means that what I&#8217;ve said is true about your company&#8211;it just means that this is the vibe you&#8217;re giving off.  But if you want to give off a better vibe, I&#8217;d suggest a simple description of what the job&#8217;s responsibilities are and what would be necessary in order to do that job successfully.  There&#8217;s no number of years or soup of technologies that do that&#8211;what does it is something like this: &#8220;we&#8217;re looking for Java web developers who are familiar with IoC containers and can meet deadlines with minimal supervision.&#8221;  No gimmicks, no window-dressing on potentially unfavorable realities, and no weird, degrading exams.  </p>
<p>So then how do you go about separating the wheat from the chaff during the interview process?  Without exception, the places I&#8217;ve found that seem best at doing this are the ones that dole out actual programming assignments.  It&#8217;s one of those things that is apparently so blindingly obvious that most don&#8217;t think of it; if you want to determine whether someone can complete programming assignments, give them one to complete.  If you try to interview developers the way you would project managers, middle management, salespeople, etc., it&#8217;s kind of crapshoot.  A developer that&#8217;s very good at memorizing trivia about the compiler or reciting the benefits of object-oriented programming may not actually be able to program.  A standard, two hour interview with the trivia lightning round, followed by classic tradeoff-type questions, will not uncover this nearly so well as asking the person to spend five to twenty hours coding up some sample assignment.</p>
<p>If that&#8217;s not practical for logistical reasons or because of hiring particulars at your institution, you might at least ask for code samples to evaluate.  Or perhaps you could spend a few hours pair programming with the candidate or doing a code review of open source code.  Whatever you do, though, the important thing to remember is that you want to send the message to developers that you&#8217;re looking for people who are competent and demonstrate as much when asked to do so.  By all means, evaluate and select based on other important criteria&#8211;personability, communication skills, organization, etc.  But what you&#8217;re looking for, at the core of it, are people who are going to be efficient and competent developers.  So when you roll out the welcome mat for them in the form of a job description, consider the first impression that you&#8217;re making.  Ask yourself if you think it&#8217;s one that will intrigue those efficient and competent developers.</p>
<div class="trackable_sharing"><a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~twitter.com/share?url=http%3A%2F%2Fwww.daedtech.com%2Fwhat-your-job-descriptions-are-saying-to-developers-about-your-company&text=What+Your+Job+Descriptions+Are+Saying+to+Developers+About+Your+Company" style="text-decoration: none; white-space: nowrap;" title="Twitter" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Twitter','http://www.daedtech.com/what-your-job-descriptions-are-saying-to-developers-about-your-company']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//twitter.png" alt="Twitter" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.linkedin.com/shareArticle?mini=true&url=http%3A%2F%2Fwww.daedtech.com%2Fwhat-your-job-descriptions-are-saying-to-developers-about-your-company&title=http%3A%2F%2Fwww.daedtech.com%2Fwhat-your-job-descriptions-are-saying-to-developers-about-your-company&ro=false&summary=&source=" style="text-decoration: none; white-space: nowrap;" title="Linkedin" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Linkedin','http://www.daedtech.com/what-your-job-descriptions-are-saying-to-developers-about-your-company']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//linkedin.png" alt="Linkedin" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~digg.com/submit?partner=addthis&url=http%3A%2F%2Fwww.daedtech.com%2Fwhat-your-job-descriptions-are-saying-to-developers-about-your-company&title=What+Your+Job+Descriptions+Are+Saying+to+Developers+About+Your+Company&bodytext=" style="text-decoration: none; white-space: nowrap;" title="Digg" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Digg','http://www.daedtech.com/what-your-job-descriptions-are-saying-to-developers-about-your-company']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=750,height=450'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//digg.png" alt="Digg" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.reddit.com/login?dest=%2Fsubmit%3Furl=http%3A%2F%2Fwww.daedtech.com%2Fwhat-your-job-descriptions-are-saying-to-developers-about-your-company&title=http%3A%2F%2Fwww.daedtech.com%2Fwhat-your-job-descriptions-are-saying-to-developers-about-your-company" style="text-decoration: none; white-space: nowrap;" title="Reddit" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Reddit','http://www.daedtech.com/what-your-job-descriptions-are-saying-to-developers-about-your-company']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=700,height=500'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//reddit.png" alt="Reddit" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.daedtech.com%2Fwhat-your-job-descriptions-are-saying-to-developers-about-your-company&title=http%3A%2F%2Fwww.daedtech.com%2Fwhat-your-job-descriptions-are-saying-to-developers-about-your-company" style="text-decoration: none; white-space: nowrap;" title="Stumbleupon" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Stumbleupon','http://www.daedtech.com/what-your-job-descriptions-are-saying-to-developers-about-your-company']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=750,height=450'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//stumbleupon.png" alt="Stumbleupon" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.tumblr.com/share/link?url=http%3A%2F%2Fwww.daedtech.com%2Fwhat-your-job-descriptions-are-saying-to-developers-about-your-company&name=What+Your+Job+Descriptions+Are+Saying+to+Developers+About+Your+Company&description=" style="text-decoration: none; white-space: nowrap;" title="Tumblr" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Tumblr','http://www.daedtech.com/what-your-job-descriptions-are-saying-to-developers-about-your-company']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=400'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//tumblr.png" alt="Tumblr" width="32" height="32"></a> <a href="mailto:?subject=Check out http%3A%2F%2Fwww.daedtech.com%2Fwhat-your-job-descriptions-are-saying-to-developers-about-your-company" style="text-decoration: none; white-space: nowrap;" title="Email" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Email','http://www.daedtech.com/what-your-job-descriptions-are-saying-to-developers-about-your-company']); "><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//email.png" alt="Email" width="32" height="32"></a> 
<br><div style="padding: 5px 0 0;"><fb:like href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~http%3A%2F%2Fwww.daedtech.com%2Fwhat-your-job-descriptions-are-saying-to-developers-about-your-company" send="true" width="450" show_faces="true" font=""></fb:like></div>
<br><g:plusone annotation="inline"></g:plusone></div><Img align="left" border="0" height="1" width="1" style="border:0;float:left;margin:0;padding:0" hspace="0" src="http://feeds.feedblitz.com/~/i/40701092/0/daedtech/www">
]]>
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Add to Any&quot; href=&quot;http://feeds.feedblitz.com/_/26/40701092/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/addtoany20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.feedblitz.com/_/24/40701092/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.feedblitz.com/_/19/40701092/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.feedblitz.com/_/20/40701092/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</content:encoded>
			<wfw:commentRss>http://www.daedtech.com/what-your-job-descriptions-are-saying-to-developers-about-your-company/feed</wfw:commentRss>
		<slash:comments>6</slash:comments></item>
<item>
<feedburner:origLink>http://www.daedtech.com/the-narrative-of-mediocrity?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=the-narrative-of-mediocrity</feedburner:origLink>
		<title>The Narrative of Mediocrity</title>
		<link>http://feeds.feedblitz.com/~/40582254/0/daedtech/www~The-Narrative-of-Mediocrity</link>
		<comments>http://www.daedtech.com/the-narrative-of-mediocrity#comments</comments>
		<pubDate>Mon, 29 Apr 2013 05:41:12 +0000</pubDate>
		<dc:creator>Erik Dietrich</dc:creator>
				<category><![CDATA[The Life of a Programmer]]></category>
		<category><![CDATA[Software Management]]></category>
		<guid isPermaLink="false">http://www.daedtech.com/?p=2784</guid>
		<description><![CDATA[I was defeated. Interested in getting off to a good start and impressing, I had overachieved in the course by working hard and studying diligently to make a good impression. And yet, when the first essay was returned to the class, mine had a big, fat B staring back at <a class="more-link" href="http://www.daedtech.com/the-narrative-of-mediocrity">Continue reading <span class="meta-nav">&#8594;</span></a>]]>
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Add to Any&quot; href=&quot;http://feeds.feedblitz.com/_/26/40582254/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/addtoany20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.feedblitz.com/_/24/40582254/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.feedblitz.com/_/19/40582254/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.feedblitz.com/_/20/40582254/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</description>
				<content:encoded><![CDATA[<p>I was defeated.  Interested in getting off to a good start and impressing, I had overachieved in the course by working hard and studying diligently to make a good impression.  And yet, when the first essay was returned to the class, mine had a big, fat B staring back at me, smug with the kind of curves that are refreshingly absent in a nice, crisp A.  I didn&#8217;t understand how this had happened, and the fact that none of the other students had received As either was cold comfort.  I&#8217;d sought to impress, but the teacher had put me in my place.</p>
<p>I got an A in that class.  I actually don&#8217;t remember which class it was any longer because it happened in a number of them.  It happened in high school, college, and graduate school.  I started off a B student on subjectively-graded assignments and &#8216;improved&#8217; steadily for the duration of the course until I wound up with an A.  Many of my peers followed the same trajectory.  It was a nice story of growth and learning.  It was the perfect narrative&#8230;for the teacher.  </p>
<p>What could be better than a fresh-faced crop of students, talented but raw, eager to learn, being humbled and improving under the teacher&#8217;s tutelage?  It&#8217;s the secondary education equivalent of a Norman Rockwell painting.  It gives the students humility, confidence, and a work ethic, and it makes the teacher look and feel great.  Everyone wins, so really, what&#8217;s the harm in the fiction?  So what if it&#8217;s a bit of a fabrication?  Who cares?</p>
<p>Well, I did.  I was a relentless perfectionist as a student and this sort of evaluation drove me nuts.  I sought out explanations for early B&#8217;s in classes where this happened and found no satisfaction in the explanations.  I raged against the system and eventually cynically undercut it, going out of my way to perform the same caliber of work in the before and after pictures, doggedly determined to prove conspiracy.  My hypothesis was confirmed by my experiments&#8211;my grades improved even as my work did not&#8211;and my triumphant proof of conspiracy was met with collective yawns and eye-rolls by anyone who actually paused long enough to listen to me.</p>
<p>I learned a lesson as a child and young adult about the way the academic world worked.  Upon graduation from college, I was primed to learn that the business world worked that way too.</p>
<h2>The Career Train</h2>
<p>There are a lot of weird symmetries, quirks, and even paradoxes in the field of macroeconomics.  It&#8217;s truly a strange beast.  Consider, for instance, the concept of inflation, wherein everyone gets more money and money becomes worth less, but not necessarily in completely equal proportions.  We&#8217;re used to thinking of money in a zero-sum kind of sense&#8211;if I give you ten dollars, then I am ten dollars poorer and you are ten dollars richer.  But through the intricacies of lending and meta-transactions surrounding money, we can conceive of a scheme where we start with ten dollars and each wind up with six dollars some time later.  And so it goes in life&#8211;as time goes by, we all have more money (at least in lending-based, market economics).  If things get out of whack and everyone doesn&#8217;t have more money as time goes by, you have stagnation (or deflation).  If things get out of whack the other way, you wind up with runaway inflation and market instability.  They system works (or at least works best) when everyone gets a little more at a measured, predictable, and homogeneous pace.</p>
<p>The same thing seems to happen throughout our careers.  We all start in the business world as complete initiates, worth only our entry level paychecks, and we all trudge along throughout our careers, gradually acquiring better salaries, titles, accessories, and office locations.  Like a nice but not-too-steep interest rate, people have an expectation of dependable, steady, slight gain throughout their career.  Two promotions in your twenties is pretty reasonable.  Managing a team by your mid thirties.  A nice office and a VP or director title in your later forties, and perhaps a C-level executive position of some kind when you&#8217;re in your fifties to sixties.  On average, anyway.  Some real go-getters might show their prodigious talents by moving that timeline up by five years or so, while some laggards might move it back by the same amount, topping out at some impressive but non-executive title.</p>
<p>Okay, so I know what you&#8217;re thinking.  You want to shout &#8220;Mark Zuckerberg!&#8221; at me.  Or something along those lines&#8211;some example of a disruptive entrepreneur that proves there is a different, less deterministic path.  Sure, there is.  People who opt out of the standard corporate narrative do so at large risk and large possible reward.  Doing so means that you might be Zuckerberg or that Instagram guy, but it means that you&#8217;re a lot more likely to be working in your garage on something that goes nowhere while your friends are putting in their time in their twenties, getting to the best cubicles, offices, and corner offices a few years before you do.  By not getting on the train when all your friends do, you&#8217;re going to arrive later and behind them&#8211;unless you luck out and are teleported there by the magic teleportation fairy of success.</p>
<p>So forget the Zuckerbergs and the people who opt out in the negative sense and never get back in.  Here in corporate land, the rest of us are on a train, and there&#8217;s not a lot of variance in arrival times on trains.  If you get right to the front of the train, you may get there a few minutes early, but that&#8217;s all the wiggle-room you get.  The upside to this mode of transportation is that trains are comfortable, dependable, and predictable.  A lot of people prefer to travel this way, and the broad sharing of cost and resources make it worth doing.  It&#8217;s a sustainable, measured pace.</p>
<h2>Everyone Meets Expectations</h2>
<p>They don&#8217;t stop two trains on the track so that people who are fast and serious about going fast can sprint to the next train.  It may be good for a few, but it would enrage the many and throw the system out of whack.  That applies to trains, and it applies to your performance reviews.  The train runs on time, and the only question is whether you&#8217;re in the front (exceeds expectations) or the back (meets some expectations).  If you&#8217;re perennially in front, you&#8217;ll get that C-Level corner office at fifty, but perennially in back, and you&#8217;ll just be the sales manager at fifty.  </p>
<p>Seem cynical?  If so, ask yourself this: why are there no office prodigies?  In school, there were those kids who skipped a grade or who took Algebra with the eighth graders while their fellow seventh graders were in Pre-Algebra.  There were people who took AP classes, aced their SATs, and who achieved great, improbable things.  What happens to those outliers in the corporate world, if they don&#8217;t drop out and go the Zuckerberg route?  Why is there no one talented enough to rocket through the corporate ranks the way there was in school?  Doesn&#8217;t that seem odd?  Doesn&#8217;t it seem like, by sheer odds, there should be someone who matches Zuckerberg as a twenty-something wunderkind CEO by coming up through the corporate world rather than budging back in from entrepreneur-land?  Maybe just one, like, ever?</p>
<p>I would think so.  I would think that corporate prodigies would exist, if I didn&#8217;t know better&#8211;if I didn&#8217;t know that the mechanism of corporate advancement was a train, a system designed to quite efficiently funnel everyone toward the middle.  You might exceed expectations or fail to meet them at any given performance review, but on a long enough timeline, you meet expectations because everyone meets expectations.  It&#8217;s the most efficient way to create a universal and comfortable narrative for everyone. That narrative is that all of everyone&#8217;s work and achievement through life has built toward something.  That the corner office is the product of forty years of loyalty, dedication, and cleverness.  After forty years of meeting expectations, you, too, can finally arrive.</p>
<p>This isn&#8217;t some kind of crazy conspiracy theory.  This is transparently enforced via HR matrices.  All across the nation and even the world, there are corporate policies in place saying that level six employees can&#8217;t receive two promotions before level seven employees receive one.  It wouldn&#8217;t be fair to pay Suzy more than Steve since Steve has three more years of industry experience.  Organizations, via a never-ending collection of superficially unrelated policies, rules, regulations, and laws, take a marathon and put it on a single-file people-mover.</p>
<p><a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.daedtech.com/wp-content/uploads/2013/04/scan0009.jpg"><img src="http://www.daedtech.com/wp-content/uploads/2013/04/scan0009.jpg" alt="scan0009" class="alignnone size-medium wp-image-2937" /></a></p>
<h2>Wither the Performance Review</h2>
<p>So if I had a parallel experience with a manufactured narrative in school and the corporate world, how to explain grade-skippers and AP-takers?  Simple.  In school, the narrative occurs for the benefit of the teacher on the micro (single quarter or semester) level.  In the work world, it occurs for everyone&#8217;s benefit for the rest of your working life.  </p>
<p>So why do organizations bother with the awkward performance review construct?  Well, in part because it&#8217;s necessary to make justifications about issues like pay, position, and promotions.  If people receive titular, &#8220;career-advancing&#8221; promotions every three to four years, a review is necessary in the first year to tell them that they need to &#8220;get better at business&#8221; or something.  Then in the second year, they can hear that they&#8217;re making &#8220;good strides at business,&#8221; followed in the third year by a hearty congratulations for &#8220;being great at business,&#8221; and, &#8220;really earning that promotion to worker IV.&#8221;  Like a scout earning a merit-badge, this manufactured narrative will be valued by the &#8216;earner&#8217; because it supplies purpose to the past three years, even if the person being reviewed didn&#8217;t &#8220;get better at business&#8221; (whatever that means).  But the other purpose is providing the narrative for the reviewers.  If the reviewers&#8217; reports started out &#8220;bad at business&#8221; and &#8216;improved&#8217; under his tutelage, his own review narrative goes a lot better, and so on, recursively, up the chain.  What a wonderful world where everyone is helping everyone get better at a very measured pace, steadily, over the course of everyone&#8217;s career.</p>
<p>But just as I railed against this concept in school, so do I now.  I&#8217;ve never received sub-standard reviews. In general annual review parlance, mine have typically been &#8220;exceeds expectations but&#8230;&#8221; where &#8220;but&#8221; is some reason that I&#8217;m &#8216;not quite ready&#8217; for a promotion or more responsibility just yet.  Inevitably, this magically fixes itself.</p>
<p>So what if we did as Michael O. Church suggests and simply <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~michaelochurch.wordpress.com/2013/04/23/seeking-co-founders-april-23-2013/">eliminate the performance reviews</a> along these lines?  Poof.  Gone.  I don&#8217;t know about you, but I might just find a &#8220;we&#8217;re not promoting you because that&#8217;s our policy&#8221; refreshingly honest as compared to a manufactured and non-actionably vague piece of &#8216;constructive&#8217; criticism. (This is not to be confused with a piece of feedback like &#8220;your code should be more modular,&#8221; or, &#8220;you should deliver features more quickly,&#8221; both of which are specific, actionable, and perfectly reasonable critiques.  But also don&#8217;t require some kind of silly annual ceremony where I find out if I&#8217;m voted onto Promotion Island or if I&#8217;ll have to play again next year.)  I certainly don&#8217;t have an MBA, and I&#8217;m not an expert in organizational structuring and management, but it just seems to me as though we can do better than a stifling policy of funneling everyone toward the middle and manufacturing nonexistent deficiencies so that we can respond by manufacturing empty victories.  I can only speak for myself, but you can keep the guaranteed trappings of ascending the corporate ladder if you just let me write my own story in which my reach exceeds my grasp.</p>
<div class="trackable_sharing"><a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~twitter.com/share?url=http%3A%2F%2Fwww.daedtech.com%2Fthe-narrative-of-mediocrity&text=The+Narrative+of+Mediocrity" style="text-decoration: none; white-space: nowrap;" title="Twitter" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Twitter','http://www.daedtech.com/the-narrative-of-mediocrity']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//twitter.png" alt="Twitter" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.linkedin.com/shareArticle?mini=true&url=http%3A%2F%2Fwww.daedtech.com%2Fthe-narrative-of-mediocrity&title=http%3A%2F%2Fwww.daedtech.com%2Fthe-narrative-of-mediocrity&ro=false&summary=&source=" style="text-decoration: none; white-space: nowrap;" title="Linkedin" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Linkedin','http://www.daedtech.com/the-narrative-of-mediocrity']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//linkedin.png" alt="Linkedin" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~digg.com/submit?partner=addthis&url=http%3A%2F%2Fwww.daedtech.com%2Fthe-narrative-of-mediocrity&title=The+Narrative+of+Mediocrity&bodytext=" style="text-decoration: none; white-space: nowrap;" title="Digg" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Digg','http://www.daedtech.com/the-narrative-of-mediocrity']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=750,height=450'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//digg.png" alt="Digg" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.reddit.com/login?dest=%2Fsubmit%3Furl=http%3A%2F%2Fwww.daedtech.com%2Fthe-narrative-of-mediocrity&title=http%3A%2F%2Fwww.daedtech.com%2Fthe-narrative-of-mediocrity" style="text-decoration: none; white-space: nowrap;" title="Reddit" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Reddit','http://www.daedtech.com/the-narrative-of-mediocrity']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=700,height=500'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//reddit.png" alt="Reddit" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.daedtech.com%2Fthe-narrative-of-mediocrity&title=http%3A%2F%2Fwww.daedtech.com%2Fthe-narrative-of-mediocrity" style="text-decoration: none; white-space: nowrap;" title="Stumbleupon" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Stumbleupon','http://www.daedtech.com/the-narrative-of-mediocrity']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=750,height=450'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//stumbleupon.png" alt="Stumbleupon" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.tumblr.com/share/link?url=http%3A%2F%2Fwww.daedtech.com%2Fthe-narrative-of-mediocrity&name=The+Narrative+of+Mediocrity&description=" style="text-decoration: none; white-space: nowrap;" title="Tumblr" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Tumblr','http://www.daedtech.com/the-narrative-of-mediocrity']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=400'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//tumblr.png" alt="Tumblr" width="32" height="32"></a> <a href="mailto:?subject=Check out http%3A%2F%2Fwww.daedtech.com%2Fthe-narrative-of-mediocrity" style="text-decoration: none; white-space: nowrap;" title="Email" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Email','http://www.daedtech.com/the-narrative-of-mediocrity']); "><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//email.png" alt="Email" width="32" height="32"></a> 
<br><div style="padding: 5px 0 0;"><fb:like href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~http%3A%2F%2Fwww.daedtech.com%2Fthe-narrative-of-mediocrity" send="true" width="450" show_faces="true" font=""></fb:like></div>
<br><g:plusone annotation="inline"></g:plusone></div><Img align="left" border="0" height="1" width="1" style="border:0;float:left;margin:0;padding:0" hspace="0" src="http://feeds.feedblitz.com/~/i/40582254/0/daedtech/www">
]]>
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Add to Any&quot; href=&quot;http://feeds.feedblitz.com/_/26/40582254/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/addtoany20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.feedblitz.com/_/24/40582254/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.feedblitz.com/_/19/40582254/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.feedblitz.com/_/20/40582254/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</content:encoded>
			<wfw:commentRss>http://www.daedtech.com/the-narrative-of-mediocrity/feed</wfw:commentRss>
		<slash:comments>7</slash:comments></item>
<item>
<feedburner:origLink>http://www.daedtech.com/guerilla-guide-to-developer-interviews?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=guerilla-guide-to-developer-interviews</feedburner:origLink>
		<title>Guerilla Guide to Developer Interviews</title>
		<link>http://feeds.feedblitz.com/~/40421476/0/daedtech/www~Guerilla-Guide-to-Developer-Interviews</link>
		<comments>http://www.daedtech.com/guerilla-guide-to-developer-interviews#comments</comments>
		<pubDate>Wed, 24 Apr 2013 04:38:52 +0000</pubDate>
		<dc:creator>Erik Dietrich</dc:creator>
				<category><![CDATA[The Life of a Programmer]]></category>
		<category><![CDATA[Job Search]]></category>
		<category><![CDATA[Soft Skills]]></category>
		<guid isPermaLink="false">http://www.daedtech.com/?p=2920</guid>
		<description><![CDATA[Over the course of my career I&#8217;ve done quite a number of technical interviews, and a pretty decent cross-section of them have ended in job offers or at least invitations to move on to the next step. That said, I am no expert and I am certainly no career coach, <a class="more-link" href="http://www.daedtech.com/guerilla-guide-to-developer-interviews">Continue reading <span class="meta-nav">&#8594;</span></a>]]>
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Add to Any&quot; href=&quot;http://feeds.feedblitz.com/_/26/40421476/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/addtoany20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.feedblitz.com/_/24/40421476/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.feedblitz.com/_/19/40421476/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.feedblitz.com/_/20/40421476/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</description>
				<content:encoded><![CDATA[<p>Over the course of my career I&#8217;ve done quite a number of technical interviews, and a pretty decent cross-section of them have ended in job offers or at least invitations to move on to the next step. That said, I am no expert and I am certainly no career coach, but I have developed some habits that seem pretty valuable for me in terms of approaching the interview process.  Another important caveat here is that these are not tips to snag yourself an offer, but tips to ensure that you wind up at a company that&#8217;s as good a fit as possible.  Sometimes that means declining an offer or even not getting one because you realize as you&#8217;re interviewing that it won&#8217;t be a good fit.  On any of these, your mileage may vary.</p>
<p>So in no particular order, here are some things that you might find helpful if you&#8217;re throwing yourself out there on the market.  </p>
<h2>Avoid the Firehose</h2>
<p>Programming jobs are becoming more and more plentiful, and, in response to that demand, and contrary to all conventional logic about markets, the <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~techland.time.com/2012/07/16/can-we-fix-computer-science-education-in-america/">supply of programmers is falling</a>.  If you work as a programmer, the several emails a week you get from recruiters stand in not-so-mute testimony to that fact.  If you decide that it&#8217;s time to start looking and throw your resume up on Dice, Monster, and CareerBuilder, your voicemail will fill up, your home answering machine will stop working, and your email provider will probably throttle you or start sending everything to SPAM.  You will be absolutely buried in attempts to contact you.  Some of them will be for intern software tester; some of them will be for inside sales rep; some of them will be for super business opportunities with Amway; some of them won&#8217;t even be in your native language.  </p>
<p><a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.daedtech.com/wp-content/uploads/2013/04/DrinkFirehose.jpg"><img src="http://www.daedtech.com/wp-content/uploads/2013/04/DrinkFirehose.jpg" alt="DrinkFirehose" class="alignnone size-medium wp-image-2925" /></a></p>
<p>Once you do filter out the ones (dozens) that are complete non-starters, you&#8217;ll be left with the companies that have those sites on some kind of RSS or other digital speed dial, meaning that they do a lot of hiring.  Now, there are some decent reasons that companies may do a lot of hiring, but there are a lot of not-so-decent reasons, such as high turnover, reckless growth, a breadth-over-depth approach to initial selection, etc.  To put it in more relatable terms, imagine if you posted a profile on some dating site and within seconds of you posting it, someone was <em>really</em> excited to meet you.  It may be Providence, but it also may be a bit worrisome.</p>
<p>The long and short of my advice here is that you shouldn&#8217;t post your resume immediately to sites like these.  Flex your networking muscle a bit, apply to some appealing local companies that you&#8217;d like to work at, contact a handful of recruiters that you trust, and see what percolates.  You can always hit the big boards later if no fish are biting or you start blowing through your savings, but if you&#8217;re in a position to be selective, I&#8217;d favor depth over breadth, so to speak.</p>
<h2>Don&#8217;t Be Fake</h2>
<p>When it comes time to the do the actual interview, don&#8217;t adopt some kind of persona that you think the interviewers want to see.  Be yourself.  You&#8217;re looking to see whether this is going to be a fit or not, and while it makes sense to put your best foot forward, don&#8217;t put someone else&#8217;s best foot forward.  If you&#8217;re a quiet, introverted thinker, don&#8217;t do your best <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.urbandictionary.com/define.php?term=brogrammer">brogrammer</a> imitation because there&#8217;s a ping pong table in the other room and the interviewers are all 20-something males.  You&#8217;re probably going to fail to fit in anyway, and even if you don&#8217;t, the cultural gulf is going to continue to exist once you start.</p>
<p>And above all, remember that &#8220;I don&#8217;t know&#8221; is the correct answer for questions to which you don&#8217;t know the answer.  Don&#8217;t lie or try to fake it.  The most likely outcome is that you look absurd and tank the interview when you could have saved yourself a bit of dignity with a simple, &#8220;I&#8217;m not familiar with that.&#8221;  But even if this ruse somehow works, what&#8217;s the long-play here?  Do you celebrate the snow-job you just pulled on the interviewer, even knowing that he must be an idiot (or an <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.daedtech.com/how-developers-stop-learning-rise-of-the-expert-beginner">Expert Beginner</a>) to have fallen for your shtick?  Working for an organization that asks idiots to conduct interviews probably won&#8217;t be fun.  Or perhaps the interviewer is perfectly competent and you just lucked out with a wild guess.  In that case, do you want to hire on at a job where they think you&#8217;re able to handle work that you can&#8217;t?  Think that&#8217;ll go well and you&#8217;ll make a good impression?</p>
<p>If you don&#8217;t know the answers to questions that they consider important, there&#8217;s a pretty decent chance you&#8217;d be setting yourself up for an unhappy stay even if you got the job.  Be honest, be forthright, and answer to the best of your ability.  If you feel confident enough to do so, you can always pivot slightly and, for instance, turn a question about the innards of a relational database to an answer about the importance of having a good DBA to help you while you&#8217;re doing your development work or something.  But whatever you do, don&#8217;t fake it, guess, and pray.  </p>
<h2>Have the Right Attitude</h2>
<p>One of the things I find personally unfortunate about the interview process is how it uniquely transports you back to waiting to hear whether or not you got into the college of your dreams.  Were your SAT scores high enough?  Did you play a varsity sport or join enough clubs?  Did you have enough people edit your essays?  Oh-gosh-oh-gee I hope they like me.  Or, really, <em>I hope I&#8217;m good enough</em>.</p>
<p>Let me end the suspense for you.  You are.  The interview process isn&#8217;t about whether you&#8217;re good enough, no matter how many multiple choice questions you&#8217;re told to fill out or how much trivia an interviewer sends your way in rapid fire bursts of &#8220;would this compile!?&#8221;  The interview process is ultimately about whether you and the company would be a good <em>mutual</em> fit.  It isn&#8217;t just a process to help them determine if you&#8217;d be able to handle the work that they do.  It&#8217;s also a chance for you to evaluate whether or not you&#8217;d like doing the work that they give you.  Both parts are equally important.</p>
<p>So don&#8217;t look at it as you trying to prove yourself somehow.  It&#8217;s more like going to a social event in an attempt to make friends than it is like hoping you&#8217;re &#8216;good&#8217; enough for your favorite college.  Do you want to hang out with the people you&#8217;re talking to for the next several years of your life?  Do you have similar ideas to them as to what good software development entails?  Do you think you&#8217;d enjoy the work?  Do you like, respect, and understand the technologies they use?  This attitude will give you more confidence (which will make you interview better), but it also sets the stage for the next point here.</p>
<h2>Don&#8217;t Waste Your Questions</h2>
<p>In nearly every interview that I&#8217;ve ever been a part of, there&#8217;s the time for the interviewer to assess your suitability as a candidate via asking you questions.  Then there&#8217;s the &#8220;what questions do you have for me&#8221; section.  Some people will say, &#8220;nothing &#8212; I&#8217;m good.&#8221;  Those people, as any career site or recruiter will tell you, probably won&#8217;t get an offer.  Others will take what I believe is fairly standard advice and use this time as an opportunity to showcase their good-question-asking ability or general sharpness.  Maybe you ask impressive sounding things like, &#8220;what&#8217;s your five year plan,&#8221; or, &#8220;I have a passionate commitment to quality as I&#8217;m sure you do, so how do you express that?&#8221; (the &#8220;sharp question&#8221; and &#8220;question brag,&#8221; respectively).  </p>
<p>I think it&#8217;s best to avoid either of those.  You can really only ask a handful of questions before things start getting awkward or the interviewer has to go, so you need to make them count.  And you&#8217;ll make them count most by asking things that you really want to know the answer to.  Are you an ardent believer in TDD or agile methodologies?  Ask about that!  Don&#8217;t avoid it because you want it to be true and you want them to make an offer <em>and</em> you don&#8217;t want to offend them.  Better to know now that you have fundamental disagreements with them than six months into the job when you&#8217;re miserable.</p>
<p>As an added bonus, your interviewer is likely to be a pretty successful, intelligent person.  She&#8217;s probably got a fairly decent BS detector and would rather you ask questions to which you genuinely want to know the answers.</p>
<h2>Forge your Questions in the Fires of Experience</h2>
<p>So you&#8217;re going to ask real questions, but which questions to ask&#8230; My previous suggestion of &#8220;ones you want the answer to&#8221; is important, but it&#8217;s not very specific.  The TDD/agile question previously mentioned is an example of one good kind of question to ask: a question which provokes an answer that interests you and gives you information about whether you&#8217;d like the job.  But I&#8217;d take it further than this.</p>
<p>Make yourself a list of things you liked and didn&#8217;t like at previous jobs, and then start writing down questions that will help you ferret out whether the things you liked or didn&#8217;t will be true at the company where you&#8217;re interviewing.  Did you like way your last company provided you with detailed code reviews because it helped you learn?  Ask what kinds of policies and programs they have in place to keep developers current and sharp.  Did you not like the mess of interconnected dependencies bogging down the architecture of the code at your last stop?  Ask them what they think of Singleton as a design pattern. (I kid, but only kind of.)</p>
<p>You can use this line of thinking to get answers to tough-to-ask questions as well.  For instance, you&#8217;re not going to saunter into an interview and say, &#8220;So, how long before I can push my hours to second shift and stroll in at 2 PM?&#8221;  But knowing things about a company like dress code, availability of flex hours, work-from-home policy, etc. is pretty valuable.  Strategize about a way to ask about these things without asking&#8211;even during casual conversation.  If you say something like &#8220;rush hour on route 123 out there seems pretty bad, how do people usually avoid it,&#8221; the next thing you hear will probably be about their flex hours policy, if the company has one.</p>
<h2>Negative Bad, Zero-Sum Fine</h2>
<p>Another piece of iconic advice that you hear is &#8220;don&#8217;t talk badly about your former/current employer.&#8221;  I think that&#8217;s great advice to be on the safe side.  I mean, if I&#8217;m interviewing you, I don&#8217;t want to hear how all of your former bosses have been idiots who don&#8217;t appreciate your special genius, nor do I want to hear juicy gossip about the people at your office.  Staying upbeat makes a good impression.</p>
<p>That said, there is a more nuanced route you can travel if you so choose, that I think makes you a pretty strong candidate.  If I&#8217;m interviewing you, I also know that your former positions aren&#8217;t all smiles and sunshine or you wouldn&#8217;t be sitting in front of me.  When talking about past experience, you can go negative, but first go positive to cancel it out.  </p>
<p><em>My current employer has some really great training programs, and I&#8217;ve enjoyed working with every project manager that I&#8217;ve been paired with.  That&#8217;s contributed to me enjoying the culture&#8211;and feeling a sense of camaraderie, too.  Of course, there were some things I might have done differently in our main code base, from an architectural perspective.  I&#8217;d have liked to see a more testable approach and an IoC container, perhaps, but I realize that some things take time to change, especially in a legacy code base.</em></p>
<p>Now you&#8217;ve communicated that you recognize that the architectural approach to your code base was sub-optimal, but that you maintain a positive attitude in spite of that.  Instead of the interviewer hearing, &#8220;man, those guys over there are procedural-code-writing cretins,&#8221; he hears, &#8220;some things were less than ideal, and I&#8217;d like them to improve, but I grow where I&#8217;m planted.&#8221;</p>
<h2>Gather your Thoughts</h2>
<p>After you&#8217;re done, stop and write down what you thought.  I mean it.  Walk out of the building, and in your car or on a nearby bench, plop down and write your impressions while they&#8217;re fresh in your mind.  What did you like, what worries you, what questions should you follow up with, what specifics can you cite?  Things will be fuzzy later, and this information is solid gold now.</p>
<p>Your brain is going to play weird tricks on you as time goes by and you&#8217;re considering an offer or the next round of interviews.  Something that struck you as a red flag might be smoothed over in your mind as you grow increasingly tired of your job hunt.  <em>I know they said that they&#8217;re as waterfall as Niagra and proud, but I think the tone of voice and non-verbal cues might have indicated a willingness to go agile.</em>  You&#8217;ll fool yourself.  You&#8217;ll talk yourself into things.  That is, unless you write them down and bring them up as concerns the next time you talk with the company or a representative thereof.</p>
<h2>Maintain Perspective</h2>
<p>Interviewing is an inherently reductionist activity, both for you and for the company.  Imagine if marriage worked like job interviews.  The proposition would be put to you and your potential mates this way:</p>
<blockquote><p>Alright, so you have have about two or three cracks at this whole marriage thing before you&#8217;re too old for it, so take your time and make a good decision and all that, but do it really fast.  You&#8217;re going to meet for lunch, a little Q&#038;A, and then you&#8217;ll have just enough time to send a thank-you note before you hear thumbs up or thumbs down from your date.  If it&#8217;s thumbs up, you have a few days to decide if the prenuptial agreement looks good, if you have similar opinions on when to have children and how many, yadda-yadda, and hurry up, and, &#8220;do you take this person to be your lawfully wedded, blah, blah, you may now kiss, etc., whatever, done.</p></blockquote>
<p>Think a few important details might get missed in that exchange?  Think you might be left after an inexplicable rejection, stammering, &#8220;b-b-but I know how to cook and I really have a lot to offer&#8230; why&#8230; I just don&#8217;t get it.&#8221;  It&#8217;s pretty likely.  There are going to be a lot of bad decisions and the divorce rate will be pretty high.</p>
<p>Back to the interview process, just remember to keep your chin up.  You might have interviewed for a job that had already been filled except for the detail of technically having to interview a second person.  Maybe the CEO&#8217;s son got the job instead of you.  Maybe you wore a gray suit and the man interviewing you hates the color gray with a burning passion.  Maybe you had a lapse when talking about your WPF skills and said WCF, and someone thinks that makes you a moron.  The list goes on, and it often makes no sense.  It makes no sense in the way that you&#8217;ll look at a company&#8217;s website and see a weirdly blinking graphic and think it looks unprofessional and decide not to apply there.  You make snap judgments, and so do they.  It&#8217;s the name of the game.  Don&#8217;t take it personally.</p>
<div class="trackable_sharing"><a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~twitter.com/share?url=http%3A%2F%2Fwww.daedtech.com%2Fguerilla-guide-to-developer-interviews&text=Guerilla+Guide+to+Developer+Interviews" style="text-decoration: none; white-space: nowrap;" title="Twitter" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Twitter','http://www.daedtech.com/guerilla-guide-to-developer-interviews']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//twitter.png" alt="Twitter" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.linkedin.com/shareArticle?mini=true&url=http%3A%2F%2Fwww.daedtech.com%2Fguerilla-guide-to-developer-interviews&title=http%3A%2F%2Fwww.daedtech.com%2Fguerilla-guide-to-developer-interviews&ro=false&summary=&source=" style="text-decoration: none; white-space: nowrap;" title="Linkedin" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Linkedin','http://www.daedtech.com/guerilla-guide-to-developer-interviews']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//linkedin.png" alt="Linkedin" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~digg.com/submit?partner=addthis&url=http%3A%2F%2Fwww.daedtech.com%2Fguerilla-guide-to-developer-interviews&title=Guerilla+Guide+to+Developer+Interviews&bodytext=" style="text-decoration: none; white-space: nowrap;" title="Digg" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Digg','http://www.daedtech.com/guerilla-guide-to-developer-interviews']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=750,height=450'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//digg.png" alt="Digg" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.reddit.com/login?dest=%2Fsubmit%3Furl=http%3A%2F%2Fwww.daedtech.com%2Fguerilla-guide-to-developer-interviews&title=http%3A%2F%2Fwww.daedtech.com%2Fguerilla-guide-to-developer-interviews" style="text-decoration: none; white-space: nowrap;" title="Reddit" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Reddit','http://www.daedtech.com/guerilla-guide-to-developer-interviews']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=700,height=500'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//reddit.png" alt="Reddit" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.daedtech.com%2Fguerilla-guide-to-developer-interviews&title=http%3A%2F%2Fwww.daedtech.com%2Fguerilla-guide-to-developer-interviews" style="text-decoration: none; white-space: nowrap;" title="Stumbleupon" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Stumbleupon','http://www.daedtech.com/guerilla-guide-to-developer-interviews']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=750,height=450'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//stumbleupon.png" alt="Stumbleupon" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.tumblr.com/share/link?url=http%3A%2F%2Fwww.daedtech.com%2Fguerilla-guide-to-developer-interviews&name=Guerilla+Guide+to+Developer+Interviews&description=" style="text-decoration: none; white-space: nowrap;" title="Tumblr" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Tumblr','http://www.daedtech.com/guerilla-guide-to-developer-interviews']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=400'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//tumblr.png" alt="Tumblr" width="32" height="32"></a> <a href="mailto:?subject=Check out http%3A%2F%2Fwww.daedtech.com%2Fguerilla-guide-to-developer-interviews" style="text-decoration: none; white-space: nowrap;" title="Email" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Email','http://www.daedtech.com/guerilla-guide-to-developer-interviews']); "><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//email.png" alt="Email" width="32" height="32"></a> 
<br><div style="padding: 5px 0 0;"><fb:like href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~http%3A%2F%2Fwww.daedtech.com%2Fguerilla-guide-to-developer-interviews" send="true" width="450" show_faces="true" font=""></fb:like></div>
<br><g:plusone annotation="inline"></g:plusone></div><Img align="left" border="0" height="1" width="1" style="border:0;float:left;margin:0;padding:0" hspace="0" src="http://feeds.feedblitz.com/~/i/40421476/0/daedtech/www">
]]>
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Add to Any&quot; href=&quot;http://feeds.feedblitz.com/_/26/40421476/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/addtoany20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.feedblitz.com/_/24/40421476/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.feedblitz.com/_/19/40421476/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.feedblitz.com/_/20/40421476/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</content:encoded>
			<wfw:commentRss>http://www.daedtech.com/guerilla-guide-to-developer-interviews/feed</wfw:commentRss>
		<slash:comments>0</slash:comments></item>
<item>
<feedburner:origLink>http://www.daedtech.com/how-to-keep-method-size-under-control?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=how-to-keep-method-size-under-control</feedburner:origLink>
		<title>How to Keep Method Size Under Control</title>
		<link>http://feeds.feedblitz.com/~/40355992/0/daedtech/www~How-to-Keep-Method-Size-Under-Control</link>
		<comments>http://www.daedtech.com/how-to-keep-method-size-under-control#comments</comments>
		<pubDate>Mon, 22 Apr 2013 04:21:59 +0000</pubDate>
		<dc:creator>Erik Dietrich</dc:creator>
				<category><![CDATA[Abstractions]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[OOP]]></category>
		<guid isPermaLink="false">http://www.daedtech.com/?p=2911</guid>
		<description><![CDATA[Do you ever open a source code file and see a method that starts at the top of your screen and kind of oozes its way to the bottom with no end in sight? When you find yourself in that situation, imagine that you&#8217;re reading a ticker tape and try <a class="more-link" href="http://www.daedtech.com/how-to-keep-method-size-under-control">Continue reading <span class="meta-nav">&#8594;</span></a>]]>
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Add to Any&quot; href=&quot;http://feeds.feedblitz.com/_/26/40355992/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/addtoany20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.feedblitz.com/_/24/40355992/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.feedblitz.com/_/19/40355992/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.feedblitz.com/_/20/40355992/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</description>
				<content:encoded><![CDATA[<p>Do you ever open a source code file and see a method that starts at the top of your screen and kind of oozes its way to the bottom with no end in sight?  When you find yourself in that situation, imagine that you&#8217;re reading a ticker tape and try to guess at where the method actually ends.  Is it a foot below the monitor?  Three feet?  Does it plummet through the floor and into the basement, perhaps down past the water table and into the Earth&#8217;s mantle?  </p>
<p><a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.daedtech.com/wp-content/uploads/2013/04/TickerMonitor.jpg"><img src="http://www.daedtech.com/wp-content/uploads/2013/04/TickerMonitor.jpg" alt="TickerMonitor" class="alignnone size-medium wp-image-2917" /></a></p>
<p>Visualized like this, I think everyone might agree that there&#8217;s some point at which the drop is too far, though there&#8217;s likely some disagreement on where exactly this is.  Personally, I used to subscribe to the &#8220;fits on a screen&#8221; heuristic and would only start looking to pull out methods if it got beyond that. But in more recent years, I think even smaller.  How small?  I dunno&#8211;five or six lines, max.  Small enough that you&#8217;ll only ever see one try-catch or control flow statement in there.  Yeah, seriously, that small.  If you&#8217;re thinking it sounds kind of crazy, I get that, but give it a try for a while.  I can almost guarantee that you&#8217;ll lose your patience for looking at methods that cause you to think, &#8220;wait, where was loopCounter declared again&#8211;before the second or third while loop?&#8221;  </p>
<p>If you accept the premise that this is a good way to do things or that it might at least be worth a try, the first thing you&#8217;ll probably wonder is how to go about doing this from a practical standpoint.  I&#8217;ve definitely encountered people and even whole groups who considered method sizes like this to be impractical.  The first thing you have to do is let go of the notion that classes are in some kind of limited supply and you have to be careful not to use too many.  Same with modules, if your project gets big enough.  The reason I say this is that having small methods means that you&#8217;re going to have a lot of them. This in turn means that they&#8217;re going to need to be spread to multiple classes, and those classes will occupy more namespaces and modules.  But that&#8217;s okay.  If you encounter a large application that&#8217;s well designed and factored, it&#8217;s that way because the application is actually a series of small, focused components working together.  Monolithic doesn&#8217;t scale well.</p>
<h2>Getting Down to Business</h2>
<p>If you&#8217;ve prepared yourself for the reality of needing more classes organized into more namespaces and modules, you&#8217;ve really overcome the biggest obstacle to being a small-method coder.  Now it&#8217;s just a question of mechanics and practice.  And this is actually important&#8211;it&#8217;s not sufficient to just say, &#8220;I&#8217;m going to write a lot of methods by stopping at the fifth line, no matter what.&#8221;  I guarantee you that this is going to create a lot of weird cross-coupling, unnecessary state, and ugly things like out parameters.  Nobody wants that.  So it&#8217;s time to look to the art of creating abstractions.</p>
<p>As a brief digression, I&#8217;ve recently picked up a copy of Uncle Bob Martin&#8217;s <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882"><em>Clean Code: A Handbook of Agile Software Craftsmanship</em></a> and been tearing my way through it pretty quickly.  I&#8217;d already seen most of the <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.cleancoders.com/">Clean Coder video series</a>, which covers some similar ground, but the book is both a good review and a source of new and different information.  To be blunt, if you&#8217;re ever going to invest thirty or forty bucks in getting better at your craft, this is the thing to buy.  It&#8217;s opinionated, sometimes controversial, incredibly specific, and absolute mandatory reading.  It will change your outlook on writing code and make you better at what you do, even if you don&#8217;t agree with every single point in it (though I don&#8217;t find much with which to take issue, personally).</p>
<p>The reason I mention this book and series is that there is an entire section in the book about functions/methods, and two of its fundamental points are that (1) functions should do one thing and one thing only, and (2) that functions should have one level of abstraction.  To keep those methods under control, this is a great place to start.  I&#8217;d like to dive a little deeper, however, because &#8220;do one thing&#8221; and &#8220;one level of abstraction per function&#8221; are general instructions. It may seem a bit like hand-waving without examples and more concrete heuristics.</p>
<h2>Extract Finer-Grained Details</h2>
<p>What Uncle Bob is saying about mixed abstractions can be demonstrated in this code snippet:</p>
<pre>
public void OpenTheDoor()
{
    GrabTheDoorKnob();
    TwistTheDoorKnob();
    TightenYourBiceps();
    BendYourElbow();
    KeepYourForearmStraight();
}
</pre>
<p>Do you see what the issue is?  We have a method here that describes (via sub-methods that are not pictured) how to open a door.  The first two calls talk in terms of actions between you and the door, but the next three calls suddenly dive into the specifics of how to pull the door open in terms of actions taken by your muscles, joints, tendons, etc.  These are two different layers of abstractions: one about a person interacting with his or her surroundings and the other detailing the mechanics of body movement.  To make it consistent, we could get more detailed in the first two actions in terms of extending arms and tightening fingers. But we&#8217;re trying to keep methods small and focused, so what we really want is to do this:</p>
<pre>
public void OpenTheDoor()
{
    GrabTheDoorKnob();
    TwistTheDoorKnob();
    PullOpenTheDoor();
}
private static void PullOpenTheDoor()
{
    TightenYourBiceps();
    BendYourElbow();
    KeepYourForeArmStraight();
}
</pre>
<h2>Create Coarser Grained Categories</h2>
<p>What about a different problem?  Let&#8217;s say that you have a method that&#8217;s long, but it isn&#8217;t because you are mixing abstraction levels:</p>
<pre>
public void CookQuesadilla()
{
    ChopOninons();
    ShredCheese();
    GetOutThePan();
    AddOilToPan();
    TurnOnTheStove();
    SprinkleOnionsAndCheeseOnTortilla();
    PutTortillaInPan();
    CookUntilFirm();
    FoldTortillaAndCookUntilBrown();
    FlipTortillaAndCookUntilBrown();
    RemoveCookedQuesadilla();
    RemovePanFromStove();
    ScrubPanWithBrush();
    ServeQuesadillas();
}
</pre>
<p>These items are all at the same level of abstraction, but there are an awful lot of them.  In the previous example, we were able to tighten up the method by making the abstraction levels consistent, but here we&#8217;re going to actually need to add a layer of abstraction.  This winds up looking a little better:</p>
<pre>
public void CookQuesadilla()
{
    PrepareIngredients();
    PrepareEquipment();
    PerformActualCooking();
    FinishUp();
}
private static void PrepareIngredients()
{
    ChopOninons();
    ShredCheese();
}
private static void PrepareEquipment()
{
    GetOutThePan();
    AddOilToPan();
    TurnOnTheStove();
}
private static void PerformActualCooking()
{
    SprinkleOnionsAndCheeseOnTortilla();
    PutTortillaInPan();
    CookUntilFirm();
    FoldTortillaAndCookUntilBrown();
    FlipTortillaAndCookUntilBrown();
    RemoveCookedQuesadilla();
}
private static void FinishUp()
{
    RemovePanFromStove();
    ScrubPanWithBrush();
    ServeQuesadillas();
}
</pre>
<p>In essence, we&#8217;ve created categories and put the actions from the long method into them.  What we&#8217;ve really done here is create (or add to) a tree-like structure of methods.  The public method is the root, and it had thirteen children.  We gave it instead four children, and each of those children has between two and five children of its own.  To tighten up methods, it&#8217;s perfectly viable to add &#8220;nodes&#8221; to the &#8220;tree&#8221; of your call stack.  While &#8220;do one thing&#8221; is still a little elusive, this seems to be carrying us in that direction.  There&#8217;s no individual method that you look at and think, &#8220;boy, that&#8217;s a lot of stuff going on.&#8221;  Certainly its a matter of some art and taste, but this is probably a good way to think of it&#8211;organize stuff into hierarchical method categories until you look at each method and think, &#8220;I could probably memorize what that does if I needed to.&#8221;</p>
<h2>Recognize that Control Flow Uses Up an Abstraction</h2>
<p>So far we&#8217;ve been conceptually figuring out how to organize families of methods into well-balanced tree structures, and that&#8217;s taken us through some pretty mundane code.  This code has involved none of the usual stuff that sends apps careening off the rails into bug land, such as conditionals, loops, assignment, etc.  Let&#8217;s correct that.  Looking at the code above, think of how you&#8217;d modify this to allow for the preparation of an arbitrary number of quesadillas.  Would it be this?</p>
<pre>
public void CookQuesadillas(int numberOfQuesadillas)
{
    PrepareIngredients();
    PrepareEquipment();
    for(int i = 0; i < numberOfQuesadillas; i++)
        PerformActualCooking();
    FinishUp();
}
</pre>
<p>Well, that makes sense, right?  Just like the last version, this is something you could read conversationally while in the kitchen just as easily as you do in the code.  Prep your ingredients, then prep your equipment, then for some integer index equal to zero and less than the number of quesadillas you want to cook, increment the integer by one. Each time you do that, cook the quesadilla.  Oh, wait.  I think we just went careening into the nerdiest kitchen narrative ever.  If Gordon Ramsey were in charge, he'd have strangled you with your apron for that.  Hmm... how 'bout this?</p>
<pre>
public void CookQuesadillas(int numberOfQuesadillas)
{
    PrepareIngredients();
    PrepareEquipment();
    PerformActualCooking(numberOfQuesadillas);
    FinishUp();
}
private static void PerformActualCooking(int numberOfQuesadillas)
{
    for (int index = 0; index < numberOfQuesadillas; index++)
    {
        SprinkleOnionsAndCheeseOnTortilla();
        PutTortillaInPan();
        CookUntilFirm();
        FoldTortillaAndCookUntilBrown();
        FlipTortillaAndCookUntilBrown();
        RemoveCookedQuesadilla();
    }
}
</pre>
<p>Well, I'd say that the CookQuesadillas method looks a lot better, but do we like "PerformActualCooking?"  The whole situation is an improvement, but I'm not a huge fan, personally.  I'm still mixing control flow with a series of domain concepts.  PerformActualCooking is still both a story about for-loops and about cooking.  Let's try something else:</p>
<pre>
public void CookQuesadillas(int numberOfQuesadillas)
{
    PrepareIngredients();
    PrepareEquipment();
    PerformActualCooking(numberOfQuesadillas);
    FinishUp();
}
private static void PerformActualCooking(int numberOfQuesadillas)
{
    for (int index = 0; index < numberOfQuesadillas; index++)
        CookAQuesadilla();
}
private static void CookAQuesadilla()
{
    SprinkleOnionsAndCheeseOnTortilla();
    PutTortillaInPan();
    CookUntilFirm();
    FoldTortillaAndCookUntilBrown();
    FlipTortillaAndCookUntilBrown();
    RemoveCookedQuesadilla();
}
</pre>
<p>We've added a node to the tree that some might say is one too many, but I disagree.  What I like is the fact that we have two methods that contain nothing but abstractions about the domain knowledge of cooking and we have a bridging method that brings in the detailed realities of the programming language.  We're isolating things like looping, counting, conditionals, etc. from the actual problem solving and story telling that we want to do here.  So when you have a method that does a few things and you think about adding some kind of control flow to it, remember that you're introducing a detail to the method that is at a lower level of abstraction and should probably have its own node in the tree.</p>
<h2>Adrift in a Sea of Tiny Methods</h2>
<p>If you're looking at this cooking example, it probably strikes you that there are no fewer than eighteen methods in this class, not counting any additional sub-methods or elided properties (which are really just methods in C# anyway).  That's a lot for a class, and you may think that I'm encouraging you to write classes with dozens of methods.  That isn't the case.  So far what we've done is started to create trees of many small methods with a public method and then a ton of private methods, which is a code smell called "<a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~deviq.com/iceberg-class">Iceberg Class</a>."  What's the cure for iceberg classes?  Extracting classes from them.  Maybe you turn the first two methods that prepare ingredients and equipment into a "Preparer" class with two public methods, "PrepareIngredients" and "PrepareEquipment."  Or maybe you extract a quesadilla cooking class.  </p>
<p>It's really going to vary based on your situation, but the point is that you take this opportunity pick nodes in your growing tree of methods and sub-methods and convert them into roots by turning them into classes.  And if doing this leads you to having what seems to be too many classes in your namespace?  Create more namespaces.  Too many of those in a module?  Create more modules.  Too many modules/projects in a solution?  More solutions.  </p>
<p>Here's the thing:  the complexity exists no matter how many or few methods/classes/namespaces/modules/solutions you have.  Slamming them all into monolithic constructs together doesn't eliminate or even hide that complexity, though many seem to take the ostrich approach and pretend that it does.  Your code isn't somehow 'simpler' because you have one solution with one project that has ten classes, each with 300 methods of 7,000 lines.  Sure, things look simple when you fire up the IDE, but they sure won't be simple when you try to debug.  In fact, they'll be much more complicated because your functionality will be hopelessly interwoven with weird temporal couplings, ad-hoc references, and hidden dependencies.  </p>
<p>If you create large trees of functionality, you have the luxury of making the structure of the tree the representative of the application's complexity, with each node an island of simplicity.  It is in these node-methods that the business logic takes place and that getting things right is most important.  And by managing your abstractions, you keep these nodes easy to reason about.  If you structure the tree correctly and follow good OOP design and practice, you'll find that even the structure of the tree is not especially complicated since each node provides a good representative abstraction for its sub-tree.  </p>
<p>Having small, readable, self-documenting methods is no pipe dream.  Really, with a bit of practice, it's not even very hard.  It just requires you to see code a little bit differently.  See it as a series of hierarchical stories and abstractions rather than as a bunch of loops, counters, pointers, and control flow statements, and the people that maintain what you write, including yourself, will thank you for it.</p>
<div class="trackable_sharing"><a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~twitter.com/share?url=http%3A%2F%2Fwww.daedtech.com%2Fhow-to-keep-method-size-under-control&text=How+to+Keep+Method+Size+Under+Control" style="text-decoration: none; white-space: nowrap;" title="Twitter" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Twitter','http://www.daedtech.com/how-to-keep-method-size-under-control']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//twitter.png" alt="Twitter" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.linkedin.com/shareArticle?mini=true&url=http%3A%2F%2Fwww.daedtech.com%2Fhow-to-keep-method-size-under-control&title=http%3A%2F%2Fwww.daedtech.com%2Fhow-to-keep-method-size-under-control&ro=false&summary=&source=" style="text-decoration: none; white-space: nowrap;" title="Linkedin" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Linkedin','http://www.daedtech.com/how-to-keep-method-size-under-control']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//linkedin.png" alt="Linkedin" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~digg.com/submit?partner=addthis&url=http%3A%2F%2Fwww.daedtech.com%2Fhow-to-keep-method-size-under-control&title=How+to+Keep+Method+Size+Under+Control&bodytext=" style="text-decoration: none; white-space: nowrap;" title="Digg" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Digg','http://www.daedtech.com/how-to-keep-method-size-under-control']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=750,height=450'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//digg.png" alt="Digg" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.reddit.com/login?dest=%2Fsubmit%3Furl=http%3A%2F%2Fwww.daedtech.com%2Fhow-to-keep-method-size-under-control&title=http%3A%2F%2Fwww.daedtech.com%2Fhow-to-keep-method-size-under-control" style="text-decoration: none; white-space: nowrap;" title="Reddit" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Reddit','http://www.daedtech.com/how-to-keep-method-size-under-control']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=700,height=500'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//reddit.png" alt="Reddit" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.daedtech.com%2Fhow-to-keep-method-size-under-control&title=http%3A%2F%2Fwww.daedtech.com%2Fhow-to-keep-method-size-under-control" style="text-decoration: none; white-space: nowrap;" title="Stumbleupon" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Stumbleupon','http://www.daedtech.com/how-to-keep-method-size-under-control']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=750,height=450'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//stumbleupon.png" alt="Stumbleupon" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.tumblr.com/share/link?url=http%3A%2F%2Fwww.daedtech.com%2Fhow-to-keep-method-size-under-control&name=How+to+Keep+Method+Size+Under+Control&description=" style="text-decoration: none; white-space: nowrap;" title="Tumblr" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Tumblr','http://www.daedtech.com/how-to-keep-method-size-under-control']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=400'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//tumblr.png" alt="Tumblr" width="32" height="32"></a> <a href="mailto:?subject=Check out http%3A%2F%2Fwww.daedtech.com%2Fhow-to-keep-method-size-under-control" style="text-decoration: none; white-space: nowrap;" title="Email" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Email','http://www.daedtech.com/how-to-keep-method-size-under-control']); "><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//email.png" alt="Email" width="32" height="32"></a> 
<br><div style="padding: 5px 0 0;"><fb:like href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~http%3A%2F%2Fwww.daedtech.com%2Fhow-to-keep-method-size-under-control" send="true" width="450" show_faces="true" font=""></fb:like></div>
<br><g:plusone annotation="inline"></g:plusone></div><Img align="left" border="0" height="1" width="1" style="border:0;float:left;margin:0;padding:0" hspace="0" src="http://feeds.feedblitz.com/~/i/40355992/0/daedtech/www">
]]>
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Add to Any&quot; href=&quot;http://feeds.feedblitz.com/_/26/40355992/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/addtoany20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.feedblitz.com/_/24/40355992/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.feedblitz.com/_/19/40355992/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.feedblitz.com/_/20/40355992/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</content:encoded>
			<wfw:commentRss>http://www.daedtech.com/how-to-keep-method-size-under-control/feed</wfw:commentRss>
		<slash:comments>11</slash:comments></item>
<item>
<feedburner:origLink>http://www.daedtech.com/language-basics-from-unit-tests?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=language-basics-from-unit-tests</feedburner:origLink>
		<title>Language Basics from Unit Tests</title>
		<link>http://feeds.feedblitz.com/~/40182158/0/daedtech/www~Language-Basics-from-Unit-Tests</link>
		<comments>http://www.daedtech.com/language-basics-from-unit-tests#comments</comments>
		<pubDate>Wed, 17 Apr 2013 05:18:55 +0000</pubDate>
		<dc:creator>Erik Dietrich</dc:creator>
				<category><![CDATA[Language Agnostic]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Unit Testing]]></category>
		<guid isPermaLink="false">http://www.daedtech.com/?p=2318</guid>
		<description><![CDATA[Let&#8217;s say that in a green field code base someone puts together a type that conceptually is a collection of non-integer values. For the sake of discussion, let&#8217;s call it a graph. A graph object might store a series of two-element tuples or perhaps a series of some value type <a class="more-link" href="http://www.daedtech.com/language-basics-from-unit-tests">Continue reading <span class="meta-nav">&#8594;</span></a>]]>
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Add to Any&quot; href=&quot;http://feeds.feedblitz.com/_/26/40182158/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/addtoany20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.feedblitz.com/_/24/40182158/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.feedblitz.com/_/19/40182158/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.feedblitz.com/_/20/40182158/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</description>
				<content:encoded><![CDATA[<p>Let&#8217;s say that in a green field code base someone puts together a type that conceptually is a collection of non-integer values.  For the sake of discussion, let&#8217;s call it a graph.  A graph object might store a series of two-element tuples or perhaps a series of some value type like &#8220;point.&#8221;  The graph might then perform operations on this data, such as IncreaseX() or IncreaseY() or Invert() or Divide()&#8211;operations that iterate through the points and do things to them.  The actual mechanics of this don&#8217;t matter a whole lot.  It&#8217;s the concept that&#8217;s important.</p>
<p>Now let&#8217;s say that in the graph the internal representation of the points is a floating point data type such as, well, float.  I&#8217;m going to save the nuance of floating point arithmetic for a future <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.daedtech.com/category/practical-math">practical math</a> post, but suffice it say that floats can exhibit some weird-seeming behavior when it comes to comparisons, truncation/rounding, certain kinds of casting and type representations, etc.  </p>
<pre>
[TestMethod, Owner("ebd"), TestCategory("Proven"), TestCategory("Unit")]
public void Mind_Equals_Blown()
{
    float x = 0.2f;
    float y = 0.1f;
    float z = x + y;
    Assert.IsTrue(z == x + y);  //What the - why does this fail?!?
}
</pre>
<p>And let&#8217;s also say that the person responsible for authoring this graph class hasn&#8217;t read a practical math post about floating point arithmetic and is completely oblivious to these potential pitfalls.</p>
<p>And, finally, let&#8217;s say that this graph class becomes a mainstay of the business logic in a particular application.  It&#8217;s modified, extended, and relied heavily upon without a whole lot of attention paid to its internal workings.  At least until stuff mysteriously doesn&#8217;t work.  But when that happens, the culprit isn&#8217;t immediately obvious, so strange work-arounds and cargo-cult, oddball solutions spring up when symptoms occur.  Extension methods are written, and sometimes entirely different modules are added to the code base because the existing one is &#8220;tricky&#8221; or &#8220;not to be trusted.&#8221;  </p>
<p>At the application level, this causes maintenance issues, a lot of heated and fruitless arguments, and voodoo approaches to code.  From a user interface perspective, this causes quirky behavior. Occasionally a linear graph is completely displaced out of the graph and rendered on some menu somewhere, or the screen goes blank for a few seconds and then the display is restored.  Defects and defect reports are created and developers dispatched to track down the issue, but after a few days of fruitless efforts, some project manager quietly sets the defect&#8217;s priority from &#8220;critical&#8221; to &#8220;cosmetic&#8221; and the software is shipped.  It&#8217;s embarrassing, but whatcha gonna do.  Ya know, computers have a mind of their own sometimes!</p>
<p><a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.daedtech.com/wp-content/uploads/2013/04/MessedUpGraph.jpg"><img src="http://www.daedtech.com/wp-content/uploads/2013/04/MessedUpGraph.jpg" alt="MessedUpGraph" class="alignnone size-full wp-image-2898" /></a></p>
<h2>Catching it Early</h2>
<p>What if, instead of doing things the old-fashioned but all-too-common way, the authors of this code had been writing unit tests and/or practicing TDD?  Well, there&#8217;s a very good chance that the issue stemming from the graph library is caught immediately as its API methods are being fleshed out from a functionality perspective.  There&#8217;s a good chance that someone is writing a test and gets to the point that we were at in the code sample above, where they are utterly dumbfounded as to why 1+1 does not equal 2 in float land.  </p>
<p>And then, good things happen.  The developer in question takes to google or stack overflow, or perhaps he talks to other, more experienced developers on his team.  He then gets an explanation, learns something about the language, and leaves the code in a correct state.  Contrast this with the non-tested approach of &#8220;code it up, build a bad house on the bad foundation, and then ship the result because it&#8217;s too late.&#8221;  </p>
<p>And what if the TDD/unit tests don&#8217;t expose this issue?  Well, what they&#8217;ll do in either case is decouple the code base.  So when the issue eventually does crop up via weird GUI behavior, it will be much easier to isolate.  When it&#8217;s isolated, it will be much easier for the unit-test-savvy developers to write a test that exposes the defect to learn the lesson and fix the issue.  It&#8217;s still a win.</p>
<p>The point about unit tests helping catch errors and leading to a more decoupled design is hardly controversial.  But the benefits go beyond that.  Unit tests provide a fast feedback loop for all points in the code base, which lends itself very well to poking and prodding things and experimenting.  And that, in turn, leads to better understanding of not only the code, but also the language.  If you can execute and get feedback on code extremely quickly, you&#8217;re much more likely to ask questions like, &#8220;I wonder what happens if I do x&#8230;&#8221; and then to do it and see.  And that sort of experimentation, much like immersion in natural language, leads much more quickly to fluency.</p>
<div class="trackable_sharing"><a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~twitter.com/share?url=http%3A%2F%2Fwww.daedtech.com%2Flanguage-basics-from-unit-tests&text=Language+Basics+from+Unit+Tests" style="text-decoration: none; white-space: nowrap;" title="Twitter" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Twitter','http://www.daedtech.com/language-basics-from-unit-tests']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//twitter.png" alt="Twitter" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.linkedin.com/shareArticle?mini=true&url=http%3A%2F%2Fwww.daedtech.com%2Flanguage-basics-from-unit-tests&title=http%3A%2F%2Fwww.daedtech.com%2Flanguage-basics-from-unit-tests&ro=false&summary=&source=" style="text-decoration: none; white-space: nowrap;" title="Linkedin" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Linkedin','http://www.daedtech.com/language-basics-from-unit-tests']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//linkedin.png" alt="Linkedin" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~digg.com/submit?partner=addthis&url=http%3A%2F%2Fwww.daedtech.com%2Flanguage-basics-from-unit-tests&title=Language+Basics+from+Unit+Tests&bodytext=" style="text-decoration: none; white-space: nowrap;" title="Digg" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Digg','http://www.daedtech.com/language-basics-from-unit-tests']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=750,height=450'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//digg.png" alt="Digg" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.reddit.com/login?dest=%2Fsubmit%3Furl=http%3A%2F%2Fwww.daedtech.com%2Flanguage-basics-from-unit-tests&title=http%3A%2F%2Fwww.daedtech.com%2Flanguage-basics-from-unit-tests" style="text-decoration: none; white-space: nowrap;" title="Reddit" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Reddit','http://www.daedtech.com/language-basics-from-unit-tests']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=700,height=500'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//reddit.png" alt="Reddit" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.daedtech.com%2Flanguage-basics-from-unit-tests&title=http%3A%2F%2Fwww.daedtech.com%2Flanguage-basics-from-unit-tests" style="text-decoration: none; white-space: nowrap;" title="Stumbleupon" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Stumbleupon','http://www.daedtech.com/language-basics-from-unit-tests']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=750,height=450'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//stumbleupon.png" alt="Stumbleupon" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.tumblr.com/share/link?url=http%3A%2F%2Fwww.daedtech.com%2Flanguage-basics-from-unit-tests&name=Language+Basics+from+Unit+Tests&description=" style="text-decoration: none; white-space: nowrap;" title="Tumblr" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Tumblr','http://www.daedtech.com/language-basics-from-unit-tests']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=400'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//tumblr.png" alt="Tumblr" width="32" height="32"></a> <a href="mailto:?subject=Check out http%3A%2F%2Fwww.daedtech.com%2Flanguage-basics-from-unit-tests" style="text-decoration: none; white-space: nowrap;" title="Email" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Email','http://www.daedtech.com/language-basics-from-unit-tests']); "><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//email.png" alt="Email" width="32" height="32"></a> 
<br><div style="padding: 5px 0 0;"><fb:like href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~http%3A%2F%2Fwww.daedtech.com%2Flanguage-basics-from-unit-tests" send="true" width="450" show_faces="true" font=""></fb:like></div>
<br><g:plusone annotation="inline"></g:plusone></div><Img align="left" border="0" height="1" width="1" style="border:0;float:left;margin:0;padding:0" hspace="0" src="http://feeds.feedblitz.com/~/i/40182158/0/daedtech/www">
]]>
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Add to Any&quot; href=&quot;http://feeds.feedblitz.com/_/26/40182158/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/addtoany20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.feedblitz.com/_/24/40182158/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.feedblitz.com/_/19/40182158/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.feedblitz.com/_/20/40182158/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</content:encoded>
			<wfw:commentRss>http://www.daedtech.com/language-basics-from-unit-tests/feed</wfw:commentRss>
		<slash:comments>0</slash:comments></item>
<item>
<feedburner:origLink>http://www.daedtech.com/what-drives-waterfall-projects?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=what-drives-waterfall-projects</feedburner:origLink>
		<title>What Drives Waterfall Projects?</title>
		<link>http://feeds.feedblitz.com/~/40101907/0/daedtech/www~What-Drives-Waterfall-Projects</link>
		<comments>http://www.daedtech.com/what-drives-waterfall-projects#comments</comments>
		<pubDate>Mon, 15 Apr 2013 06:01:44 +0000</pubDate>
		<dc:creator>Erik Dietrich</dc:creator>
				<category><![CDATA[Anti Patterns]]></category>
		<category><![CDATA[The Life of a Programmer]]></category>
		<category><![CDATA[Software Management]]></category>
		<category><![CDATA[Software Process]]></category>
		<guid isPermaLink="false">http://www.daedtech.com/?p=2884</guid>
		<description><![CDATA[To start off the week, I have a satirical post about projects developed using the waterfall &#8216;methodology.&#8217; (To understand the quotes, please see my post on why I don&#8217;t think waterfall is actually a methodology at all). I figured that since groups that use agile approaches and industry best practices <a class="more-link" href="http://www.daedtech.com/what-drives-waterfall-projects">Continue reading <span class="meta-nav">&#8594;</span></a>]]>
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Add to Any&quot; href=&quot;http://feeds.feedblitz.com/_/26/40101907/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/addtoany20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.feedblitz.com/_/24/40101907/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.feedblitz.com/_/19/40101907/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.feedblitz.com/_/20/40101907/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</description>
				<content:encoded><![CDATA[<p>To start off the week, I have a satirical post about projects developed using the waterfall &#8216;methodology.&#8217;  (To understand the quotes, please see my post on why <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.daedtech.com/there-is-no-such-thing-as-waterfall">I don&#8217;t think waterfall is actually a methodology at all</a>).  I figured that since groups that use agile approaches and industry best practices have a whole set of xDD acronyms, such as TDD, BDD, and DDD, waterfall deserved a few of its own.  So keep in mind that while this post is intended to be funny, I think there is a bit of relevant commentary to it.  </p>
<h2>Steinbeck-Driven Development (SDD)</h2>
<p>For those of you who&#8217;ve never had the pleasure to read John Steinbeck&#8217;s &#8220;Of Mice and Men,&#8221; any SDD practitioner will tell you that it&#8217;s a heartwarming tale of two friends who overcome all odds during the Great Depression, making it cross-country to California to start a rabbit petting zoo.  And it&#8217;s that outlook on life that they bring to the team when it comes to setting deadlines, tracking milestones, and general planning.</p>
<p><a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.daedtech.com/wp-content/uploads/2013/04/scan0003.jpg"><img src="http://www.daedtech.com/wp-content/uploads/2013/04/scan0003-197x300.jpg" alt="scan0003" width="197" height="300" class="alignright size-medium wp-image-2894" /></a></p>
<p>Relentlessly optimistic, the SDD project manager reacts to a missed milestone by reporting to his superiors that everything is a-OK because the team will just make it up by the time they hit the next one.  When the next milestone is missed by an even wider margin, same logic applies.  Like a shopping addict or degenerate gambler blithely saying, &#8220;you gotta spend money to make money,&#8221; this project manager will continue to assume on-time delivery right up until the final deadline passes with no end in site.  When that happens, it&#8217;s no big deal&#8211;they just need a week to tie up a few loose ends.  When that week is up, it&#8217;ll just be one more week to tie up a few loose ends.  When that week expires, they face reality.  No, just kidding.  It&#8217;ll just be one more week to tie up a few loose ends.  After enough time goes by, members of the team humor him with indulgent baby talk when he says this:  &#8220;sure it will, man, sure it will.  In a week, everything will be great, this will all be behind us, and we&#8217;ll celebrate with steaks and lobster at the finest restaurant in town.&#8221;  </p>
<p>Spoiler alert.  At the end of Steinbeck&#8217;s novel, the idyllic rabbit farm exists only in the mind of one of the friends, shortly before he&#8217;s shot in the back of the head by the other, in an act that is part merciful euthanasia and part self-preservation.  The corporate equivalent of this is what eventually happens to our project manager.  Every week he insists that everything will be fine and that they&#8217;re pretty close to the promised land until someone puts the project out of its misery.  </p>
<h2>Shooting-Star-Driven Development (SSDD)</h2>
<p>Steinbeck-Driven Development is not for everyone.  It requires a healthy ability to live in deluded fantasy land (or, in the case of the novel, to be a half-wit).  SSDD project managers are not the relentless optimists that their SDD counterparts are.  In fact, they&#8217;re often pretty maudlin, having arrived at a PM post on a project that everyone knows is headed for failure and basically running out the clock until company bankruptcy or retirement or termination or something.  These are the equivalents of gamblers that have exhausted their money and credit and are playing at the penny tables in the hopes that their last few bucks will take them on an unprecedented win streak.  Or, perhaps more aptly, they&#8217;re like a lonely old toy-maker, sitting in his woodshop, hoping for a toy to come to life and keep them company.</p>
<p>This PM and his project are doomed to failure, so he rarely bothers with status meetings, creates a bare minimum of power points, and rarely ever talks about milestones.  Even his Gantt charts have a maximum of three nested dependencies.  It&#8217;s clear to all that he&#8217;s phoning it in.  He knows it&#8217;s unlikely, but he pins his slim hope to a shooting star: maybe one of his developers will turn out to be the mythical 100x developer that single-handedly writes the customer information portal in the amount of time that someone, while struggling to keep a straight face, estimated it would take to do.  </p>
<p>As projects go along and fall further and further behind schedule and the odds of a shooting star developer become more and more remote, the SSDD project manager increasingly withdraws.  Eventually, he just kind of fades away.  If Geppetto were a real life guy, carving puppets and asking stars to make them real children, he&#8217;d likely have punched out in an 19th century sanitarium.  There are no happy endings on SSDD projects&#8211;just lifeless, wooden developers and missed deadlines.  </p>
<h2>Fear-Driven Development (FDD)</h2>
<p>There is no great mystery to FDD projects.  The fate of the business is in your hands, developers.  Sorry if that&#8217;s a lot of pressure, but really, it&#8217;s in your hands.  </p>
<p>The most important part of a FDD project is to make it clear that there will be consequences&#8211;dire consequences&#8211;to the business if the software isn&#8217;t delivered by such and such date.  And, of course, dire consequences for the business are pretty darned likely to affect the software group.  So, now that everyone knows what&#8217;s at stake, it&#8217;s time to go out and get that complex, multi-tiered, poorly-defined application built in the next month.  Or else.</p>
<p>Unlike most waterfall projects, FDD enters the death march phase pretty much right from the start of coding.  (Other waterfall projects typically only start the death march phase once the testing phase is cancelled and the inevitability of missing the deadline is clear.)  The developers immediately enter a primal state of working fourteen hours per day because their very livelihoods hang in the balance.  And, of course, fear definitely has the effect of getting them to work faster and harder than they otherwise would, but it also has the side effect of making the quality lower.  Depending on the nature of the FDD project and the tolerance level of the customers for shoddy or non-functional software, this may be acceptable.  But if it isn&#8217;t, time for more fear.  Consequences become more dire, days become longer, and weekends are dedicated to the cause.  </p>
<p>The weak have nervous breakdowns and quit, so only the strong survive to quit after the project ends.</p>
<h2>Passive-Aggressive-Driven Development (PADD)</h2>
<p>One of the most fun parts of waterfall development is the the estimation from ignorance that takes place during either the requirements or design days.  This is where someone looks at a series of Visio diagrams and says, &#8220;I think this project will take 17,388.12 man-hours in the low risk scenario and 18,221.48 in the high-risk scenario.&#8221;  The reason I describe this as fun is because it&#8217;s sort of like that game you play where everyone guesses the number of gumballs in a giant jar of gumballs and whoever is closest without going over wins a prize.  For anything that&#8217;s liable to take longer than a week, estimation in a waterfall context is a ludicrous activity that basically amounts to making things up and trying to keep a straight face as you convince yourself and others that you did something besides picking a random number.  </p>
<blockquote><p>Well, I broke this task up into 3,422 tasks and estimated each of those, so if they each take four hours, and everything goes smoothly when we try to put them all together with an estimate for integration of&#8230; ha!  Just kidding!  My guess is 10,528 hours&#8211;ten because I was thinking that it&#8217;d have to be five digits, the fve because it&#8217;s been that many days that we&#8217;ve been looking at these Gantt charts and sequence diagrams, and twenty-eight because that was my number in junior high football.  And you can&#8217;t bid one hour over me because I&#8217;m last to guess!</p></blockquote>
<p>But PADD PMs suck all of the fun out of this style of estimation by pressuring the hours guessers (software developers) into retracting and claiming less time.  But they don&#8217;t do it by showing anger&#8211;the aggression is indirect.  When the developer says that task 1,024, writing the batch file import routine, will take approximately five hours, the PADD PM says, &#8220;Oh, wow.  Must be pretty complicated.  Jeez, I just assumed that a senior level developer could bang that out in no more than two.  My bad.&#8221;  Shamed, the developer retracts: &#8220;No, no&#8211;you&#8217;re right.  I figured the EDI would be more complicated than it was, so I just realized that my estimate is actually two hours.&#8221;  </p>
<p>Repeated in aggregate, the PADD PM is some kind of spectacular black belt/level 20/guru/whatever metric is used to measure PM productivity, because he just reduced the time to market by 60% before a single line of code was ever written.  Amazing!  Of course, talk at the beginning of the project is cheap.  The real measure of waterfall project success is figuring out who to blame and getting others to absorb the cost when the project gets way behind schedule.  And this is where the PADD master really shines.  </p>
<p>To his bosses, he says, &#8220;man, I guess I just had too much faith in our guys&#8211;I mean, I know you hire the best.&#8221;  To the developers, he says, &#8220;boy, your estimates seemed pretty reasonable to me, so I would have assumed that everything would be going on time if you were just putting in the hours and elbow grease&#8230; weird.&#8221;  To the end-users/stakeholders, he says, &#8220;it&#8217;s strange, all of our other stakeholders who get us all of the requirements clearly and on time get their software on time&#8211;I wonder what happened here.&#8221;</p>
<p>There&#8217;s plenty of blame to go around, and PADD PMs make sure everyone partakes equally and is equally dissatisfied with the project.</p>
<div class="trackable_sharing"><a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~twitter.com/share?url=http%3A%2F%2Fwww.daedtech.com%2Fwhat-drives-waterfall-projects&text=What+Drives+Waterfall+Projects%3F" style="text-decoration: none; white-space: nowrap;" title="Twitter" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Twitter','http://www.daedtech.com/what-drives-waterfall-projects']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//twitter.png" alt="Twitter" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.linkedin.com/shareArticle?mini=true&url=http%3A%2F%2Fwww.daedtech.com%2Fwhat-drives-waterfall-projects&title=http%3A%2F%2Fwww.daedtech.com%2Fwhat-drives-waterfall-projects&ro=false&summary=&source=" style="text-decoration: none; white-space: nowrap;" title="Linkedin" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Linkedin','http://www.daedtech.com/what-drives-waterfall-projects']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//linkedin.png" alt="Linkedin" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~digg.com/submit?partner=addthis&url=http%3A%2F%2Fwww.daedtech.com%2Fwhat-drives-waterfall-projects&title=What+Drives+Waterfall+Projects%3F&bodytext=" style="text-decoration: none; white-space: nowrap;" title="Digg" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Digg','http://www.daedtech.com/what-drives-waterfall-projects']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=750,height=450'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//digg.png" alt="Digg" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.reddit.com/login?dest=%2Fsubmit%3Furl=http%3A%2F%2Fwww.daedtech.com%2Fwhat-drives-waterfall-projects&title=http%3A%2F%2Fwww.daedtech.com%2Fwhat-drives-waterfall-projects" style="text-decoration: none; white-space: nowrap;" title="Reddit" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Reddit','http://www.daedtech.com/what-drives-waterfall-projects']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=700,height=500'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//reddit.png" alt="Reddit" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.daedtech.com%2Fwhat-drives-waterfall-projects&title=http%3A%2F%2Fwww.daedtech.com%2Fwhat-drives-waterfall-projects" style="text-decoration: none; white-space: nowrap;" title="Stumbleupon" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Stumbleupon','http://www.daedtech.com/what-drives-waterfall-projects']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=750,height=450'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//stumbleupon.png" alt="Stumbleupon" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.tumblr.com/share/link?url=http%3A%2F%2Fwww.daedtech.com%2Fwhat-drives-waterfall-projects&name=What+Drives+Waterfall+Projects%3F&description=" style="text-decoration: none; white-space: nowrap;" title="Tumblr" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Tumblr','http://www.daedtech.com/what-drives-waterfall-projects']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=400'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//tumblr.png" alt="Tumblr" width="32" height="32"></a> <a href="mailto:?subject=Check out http%3A%2F%2Fwww.daedtech.com%2Fwhat-drives-waterfall-projects" style="text-decoration: none; white-space: nowrap;" title="Email" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Email','http://www.daedtech.com/what-drives-waterfall-projects']); "><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//email.png" alt="Email" width="32" height="32"></a> 
<br><div style="padding: 5px 0 0;"><fb:like href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~http%3A%2F%2Fwww.daedtech.com%2Fwhat-drives-waterfall-projects" send="true" width="450" show_faces="true" font=""></fb:like></div>
<br><g:plusone annotation="inline"></g:plusone></div><Img align="left" border="0" height="1" width="1" style="border:0;float:left;margin:0;padding:0" hspace="0" src="http://feeds.feedblitz.com/~/i/40101907/0/daedtech/www">
]]>
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Add to Any&quot; href=&quot;http://feeds.feedblitz.com/_/26/40101907/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/addtoany20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.feedblitz.com/_/24/40101907/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.feedblitz.com/_/19/40101907/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.feedblitz.com/_/20/40101907/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</content:encoded>
			<wfw:commentRss>http://www.daedtech.com/what-drives-waterfall-projects/feed</wfw:commentRss>
		<slash:comments>0</slash:comments></item>
<item>
<feedburner:origLink>http://www.daedtech.com/exception-handling-basics?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=exception-handling-basics</feedburner:origLink>
		<title>Exception Handling Basics</title>
		<link>http://feeds.feedblitz.com/~/39921720/0/daedtech/www~Exception-Handling-Basics</link>
		<comments>http://www.daedtech.com/exception-handling-basics#comments</comments>
		<pubDate>Wed, 10 Apr 2013 06:33:17 +0000</pubDate>
		<dc:creator>Erik Dietrich</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[exception]]></category>
		<guid isPermaLink="false">http://www.daedtech.com/?p=2878</guid>
		<description><![CDATA[The other day, I was reviewing some code, and I saw a series of methods conforming to the following (anti) &#8216;pattern&#8217; public class CustomerProcessor { public void ProcessCustomer(Customer customer) { try { if (customer.IsActive) ProcessActiveCustomer(customer); } catch (Exception ex) { throw ex; } } private void ProcessActiveCustomer(Customer customer) { try <a class="more-link" href="http://www.daedtech.com/exception-handling-basics">Continue reading <span class="meta-nav">&#8594;</span></a>]]>
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Add to Any&quot; href=&quot;http://feeds.feedblitz.com/_/26/39921720/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/addtoany20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.feedblitz.com/_/24/39921720/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.feedblitz.com/_/19/39921720/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.feedblitz.com/_/20/39921720/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</description>
				<content:encoded><![CDATA[<p>The other day, I was reviewing some code, and I saw a series of methods conforming to the following (anti) &#8216;pattern&#8217;</p>
<pre>
public class CustomerProcessor
{
    public void ProcessCustomer(Customer customer)
    {
        try
        {
            if (customer.IsActive)
                ProcessActiveCustomer(customer);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    private void ProcessActiveCustomer(Customer customer)
    {
        try
        {
            CheckCustomerName(customer);
            WriteCustomerToFile(customer);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    public void CheckCustomerName(Customer customer)
    {
        try
        {
            if (customer.Name == null)
                customer.Name = string.Empty;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    private void WriteCustomerToFile(Customer customer)
    {
        try
        {
            using (StreamWriter writer = new StreamWriter(@"C:\temp\customer.txt"))
            {
                writer.WriteLine(customer.Name);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}
</pre>
<p>Every method consisted of a try with the actual code of interest inside of it and then a caught general exception that was then thrown.  As I looked more through the code base, it became apparent to me that this was some kind of &#8216;standard&#8217; (and thus perhaps exhibit A of <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.daedtech.com/how-we-get-coding-standards-wrong">how we get standards wrong</a>).  Every method in the project did this.  </p>
<p>If you&#8217;re reading and you don&#8217;t know why this is facepalm, please read on.  If you&#8217;re well-versed in C# exceptions, this will probably be review for you.</p>
<h2>Preserve the Stack Trace</h2>
<p>First things (problems) first.  When you throw exceptions in C# by using the keyword &#8220;throw&#8221; with some exception type, you rip a hole in the fabric of your application&#8217;s space-time&#8211;essentially declaring that if no code that&#8217;s called knows how to handle the singularity you&#8217;re belching out, the application will crash.  I use hyperbolic metaphor to prove a point.  Throwing an exception is an action that jolts you out of the normal operation of your program by using a glorified &#8220;GOTO,&#8221; except that you don&#8217;t actually know where it&#8217;s going because that&#8217;s up to the code that called you.</p>
<p>When you do this, the .NET framework is helpful enough to package up a bunch of runtime information for troubleshooting purposes, including something called the &#8220;stack trace.&#8221;  If you&#8217;ve ever seen a .NET (or Java) site really bomb out, you&#8217;ve probably seen one of these&#8211;it&#8217;s a bunch of code with line numbers that basically tells you, &#8220;A called B, which called C, which called D &#8230; which called Y, which called Z, which threw up and crashed your program.&#8221;  When you throw an exception in C# the framework saves the stack trace that got you to the method in question.  This is true whether the exception happens in your code or deep, deep within some piece of code that you rely on.</p>
<p>So, in the code above, let&#8217;s consider what happens when the code is executed on a machine with no C:\temp folder.  The StreamWriter constructor is going to throw an exception indicating that the path in question is not found.  When it does, you will have a nice exception that tells you ProcessCustomer called ProcessActiveCustomer, which called WriteCustomerToFile, which called new StreamWriter(), which threw an exception because you gave it an invalid path.  Pretty neat, huh?  You just have to drill into the exception object in the debugger to see all of this (or have your application configured to display this information in a log file, on a web page, etc.).</p>
<p>But what happens next is kind of a bummer.  Instead of letting this exception percolate up somewhere, we trap it right there in the method in our catch block.  At that point, we throw an exception.  Now remember, when you throw an exception object, the stack trace is recorded at the point that you throw, and <em>any previous stack trace is blown away</em>.  Instead of it being obvious that the exception originated in the StreamWriter constructor, it appears to have originated in WriteCustomerToFile.  But wait, it gets worse.  From there, the exception is trapped in ProcessActiveCustomer and then again in ProcessCustomer.  Since every method in the code base has this boilerplate, every exception generated will percolate back up to main and appear to have been generated there.</p>
<p>To put this in perspective, you will never be able to see or record the stack trace for the point at which the exception was thrown.  Now, in development that&#8217;s not the end of the world since you can set the debugger to break where thrown instead of handled, but for production logging, this is awful.  You&#8217;ll never have the foggiest idea where anything is coming from.</p>
<p>How to fix this?  It&#8217;s as simple as getting rid of the &#8220;throw ex;&#8221; in favor of just &#8220;throw;&#8221;  This preserves the stack trace while passing the exception on to the next handler.  Another alternative, should you wish to add more information when you throw, would be to do &#8220;throw new Exception(ex)&#8221; where you pass the exception you&#8217;ve caught to a new one that you&#8217;re creating.  The caught exception will be preserved, intact, and can be accessed in debugging via the &#8220;InnerException&#8221; property of the one you&#8217;re now throwing.</p>
<pre>
public class CustomerProcessor
{
    public void ProcessCustomer(Customer customer)
    {
        try
        {
            if (customer.IsActive)
                ProcessActiveCustomer(customer);
        }
        catch (Exception ex)
        {
            throw;
        }
    }
    private void ProcessActiveCustomer(Customer customer)
    {
        try
        {
            CheckCustomerName(customer);
            WriteCustomerToFile(customer);
        }
        catch (Exception ex)
        {
            throw;
        }
    }
    public void CheckCustomerName(Customer customer)
    {
        try
        {
            if (customer.Name == null)
                customer.Name = string.Empty;
        }
        catch (Exception ex)
        {
            throw;
        }
    }
    private void WriteCustomerToFile(Customer customer)
    {
        try
        {
            using (StreamWriter writer = new StreamWriter(@"C:\temp\customer.txt"))
            {
                writer.WriteLine(customer.Name);
            }
        }
        catch (Exception ex)
        {
            throw;
        }
    }
}
</pre>
<p>(It would actually be better here to remove the Exception ex altogether in favor of just &#8220;catch {&#8221; but I&#8217;m leaving it in for illustration purposes)</p>
<h2>Minimize Exception-Aware Code</h2>
<p>Now that the stack trace is going to be preserved, the pattern here isn&#8217;t actively hurting anything in terms of program flow or output.  But that doesn&#8217;t mean we&#8217;re done cleaning up.  There&#8217;s still a lot of code here that doesn&#8217;t need to be.  </p>
<p>In this example, consider that there are only two methods that can generate exceptions:  ProcessCustomer (if passed a null reference) and WriteCustomerToFile (various things that can go wrong with file I/O).  And yet, we have exception handling in every method, even methods that are literally incapable of generating them on their own.  Exception throwing and handling is extremely disruptive and it makes your code very hard to reason about.  This is because exceptions, as mentioned earlier, are like GOTO statements that whip the context of your program from wherever the exception is generated to whatever place ultimately handles exceptions.  Oh, and the boilerplate for handling them makes methods hard to read.</p>
<p>The approach shown above is a kind of needlessly defensive approach that makes the code incredibly dense and confusing.  Rather than a strafing, shock-and-awe show of force for dealing with exceptions, the best approach is to reason carefully about where they might be generated and how one might handle them.  Consider the following rewrite:</p>
<pre>
public class CustomerProcessor
{
    public void ProcessCustomer(Customer customer)
    {
        if(customer == null)
            Console.WriteLine("You can't give me a null customer!");
        try
        {
            ProcessActiveCustomer(customer);
        }
        catch (SomethingWentWrongWritingCustomerFileException)
        {
            Console.WriteLine("There was a problem writing the customer to disk.");
        }
    }
    private void ProcessActiveCustomer(Customer customer)
    {
        CheckCustomerName(customer);
        WriteCustomerToFile(customer);
    }
    public void CheckCustomerName(Customer customer)
    {
        if (customer.Name == null)
            customer.Name = string.Empty;
    }
    private void WriteCustomerToFile(Customer customer)
    {
        try
        {
            using (var writer = new StreamWriter(@"C:\temp\customer.txt"))
            {
                writer.WriteLine(customer.Name);
            }
        }
        catch (Exception ex)
        {
            throw new SomethingWentWrongWritingCustomerFileException("Ruh-roh", ex);
        }
    }
}
</pre>
<p>Notice that we only think about exceptions at the &#8216;endpoints&#8217; of the little application.  At the entry point, we guard against a null argument instead of handling it with an exception.  As a rule of thumb, it&#8217;s better to handle validation via querying objects than by trying things and catching exceptions, both from a performance and from a readability standpoint.  The other point of external interaction where we think about exceptions is where we&#8217;re calling out to the filesystem.  For this example, I handle any exception generated by stuffing it into a custom exception type and throwing that back to my caller.  This is a practice that I&#8217;ve adopted so that I know at a glance when debugging if it&#8217;s an exception I&#8217;ve previously reasoned about and am trapping or if some new problem is leaking through that I didn&#8217;t anticipate.  YMMV on this approach, but the thing to take away is that I deal with exceptions as soon as they come to me from something beyond my control, and then not again until I&#8217;m somewhere in the program that I want to report things to the user.  (In an actual application, I would handle things more granularly than simply catching Exception, opting instead to go as fine-grained as I needed to in order to provide meaningful reporting on the problem)</p>
<p>Here it doesn&#8217;t seem to make a ton of difference, but in a large application it will&#8211;believe me.  You&#8217;ll be much happier if your exception handling logic is relegated to the places in the app where you provide feedback to the user and where you call external stuff.  In the guts of your program, this logic isn&#8217;t necessary if you simply take care to write code that doesn&#8217;t contain mistakes like null dereferences.  </p>
<p>What about things like out of memory exceptions?  Don&#8217;t you want to trap those when they happen?  Nope.  Those are catastrophic exceptions beyond your control, and all of the logging and granular worrying about exceptions in the world isn&#8217;t going to un-ring that bell.  When these happen, you don&#8217;t want your process to limp along unpredictably in some weird state&#8211;you <em>want</em> it to die.</p>
<h2>On the Lookout for Code Smells</h2>
<p>One other meta-consideration worth mentioning here is that if you find it painful to code because you&#8217;re putting the same few lines of code in every class or every method, stop and smell what your code is trying to tell you.  Having the same thing over and over is very much not DRY and not advised.  You can spray deodorant on it with something like a code snippet, but I&#8217;d liken this to addressing a body odor problem by spraying yourself with cologne and then putting on a full body sweatsuit&#8211;code snippets for redundant code make things worse while hiding the symptoms.</p>
<p>If you really feel that you must have exception handling in every method, there are IL Weaving tools such as <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.postsharp.net/aspects/examples/exception-handling">PostSharp</a> that free you from the boilerplate while letting you retain the functionality and granularity you want.  As a general rule of thumb, if you&#8217;re cranking out a lot of code and thinking, &#8220;there&#8217;s got to be a better way to do this,&#8221; stop and do some googling because there almost certainly is.</p>
<div class="trackable_sharing"><a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~twitter.com/share?url=http%3A%2F%2Fwww.daedtech.com%2Fexception-handling-basics&text=Exception+Handling+Basics" style="text-decoration: none; white-space: nowrap;" title="Twitter" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Twitter','http://www.daedtech.com/exception-handling-basics']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//twitter.png" alt="Twitter" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.linkedin.com/shareArticle?mini=true&url=http%3A%2F%2Fwww.daedtech.com%2Fexception-handling-basics&title=http%3A%2F%2Fwww.daedtech.com%2Fexception-handling-basics&ro=false&summary=&source=" style="text-decoration: none; white-space: nowrap;" title="Linkedin" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Linkedin','http://www.daedtech.com/exception-handling-basics']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//linkedin.png" alt="Linkedin" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~digg.com/submit?partner=addthis&url=http%3A%2F%2Fwww.daedtech.com%2Fexception-handling-basics&title=Exception+Handling+Basics&bodytext=" style="text-decoration: none; white-space: nowrap;" title="Digg" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Digg','http://www.daedtech.com/exception-handling-basics']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=750,height=450'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//digg.png" alt="Digg" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.reddit.com/login?dest=%2Fsubmit%3Furl=http%3A%2F%2Fwww.daedtech.com%2Fexception-handling-basics&title=http%3A%2F%2Fwww.daedtech.com%2Fexception-handling-basics" style="text-decoration: none; white-space: nowrap;" title="Reddit" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Reddit','http://www.daedtech.com/exception-handling-basics']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=700,height=500'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//reddit.png" alt="Reddit" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.daedtech.com%2Fexception-handling-basics&title=http%3A%2F%2Fwww.daedtech.com%2Fexception-handling-basics" style="text-decoration: none; white-space: nowrap;" title="Stumbleupon" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Stumbleupon','http://www.daedtech.com/exception-handling-basics']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=750,height=450'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//stumbleupon.png" alt="Stumbleupon" width="32" height="32"></a> <a href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~www.tumblr.com/share/link?url=http%3A%2F%2Fwww.daedtech.com%2Fexception-handling-basics&name=Exception+Handling+Basics&description=" style="text-decoration: none; white-space: nowrap;" title="Tumblr" target="_blank" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Tumblr','http://www.daedtech.com/exception-handling-basics']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=400'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//tumblr.png" alt="Tumblr" width="32" height="32"></a> <a href="mailto:?subject=Check out http%3A%2F%2Fwww.daedtech.com%2Fexception-handling-basics" style="text-decoration: none; white-space: nowrap;" title="Email" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Email','http://www.daedtech.com/exception-handling-basics']); "><img align="absmiddle" src="http://www.daedtech.com/wp-content/plugins/trackable-social-share-icons/buttons/1//email.png" alt="Email" width="32" height="32"></a> 
<br><div style="padding: 5px 0 0;"><fb:like href="http://feeds.feedblitz.com/~/t/0/0/daedtech/www/~http%3A%2F%2Fwww.daedtech.com%2Fexception-handling-basics" send="true" width="450" show_faces="true" font=""></fb:like></div>
<br><g:plusone annotation="inline"></g:plusone></div><Img align="left" border="0" height="1" width="1" style="border:0;float:left;margin:0;padding:0" hspace="0" src="http://feeds.feedblitz.com/~/i/39921720/0/daedtech/www">
]]>
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Add to Any&quot; href=&quot;http://feeds.feedblitz.com/_/26/39921720/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/addtoany20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.feedblitz.com/_/24/39921720/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.feedblitz.com/_/19/39921720/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.feedblitz.com/_/20/39921720/daedtech/www&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</content:encoded>
			<wfw:commentRss>http://www.daedtech.com/exception-handling-basics/feed</wfw:commentRss>
		<slash:comments>4</slash:comments></item>
</channel></rss>

