<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:gd="http://schemas.google.com/g/2005" xmlns:georss="http://www.georss.org/georss" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:thr="http://purl.org/syndication/thread/1.0"><id>tag:blogger.com,1999:blog-5069259786554685989</id><updated>2024-10-04T21:57:41.238-04:00</updated><category term="MSBuild"/><category term="SQL"/><category term="Custom Task"/><category term="Linq"/><category term="SOPA"/><category term="Windows Mobile"/><category term=".Net"/><category term="ADO"/><category term="ADO.Net"/><category term="ADO.Net Data Services"/><category term="ALM"/><category term="Arnulfo"/><category term="Astoria"/><category term="CASE WHEN"/><category term="Cell Phone"/><category term="Click Once"/><category term="Common Table Expressions"/><category term="Config"/><category term="Fail"/><category term="HTC"/><category term="Mage"/><category term="Mobile"/><category term="NHibernate"/><category term="ORM"/><category term="PIPA"/><category term="Recommendation"/><category term="SQL 2005"/><category term="SQL 2008"/><category term="Sprint"/><category term="TD-ADD"/><category term="TDD"/><category term="TFS"/><category term="TaskParameter"/><category term="Touch Diamond"/><category term="Twitter"/><category term="User Experience"/><category term="VB.Net"/><category term="Web"/><category term="Windows WF"/><category term="Wing"/><category term="With"/><category term="XML"/><category term="anemic domain"/><category term="interview"/><category term="peschka"/><category term="stupid coder"/><category term="twikini"/><title type="text">Better Living Through Coding</title><subtitle type="html">Various development postings.</subtitle><link href="http://blog.paulmontgomery.name/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default?redirect=false" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/" rel="alternate" type="text/html"/><link href="http://pubsubhubbub.appspot.com/" rel="hub"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default?start-index=26&amp;max-results=25&amp;redirect=false" rel="next" type="application/atom+xml"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><generator uri="http://www.blogger.com" version="7.00">Blogger</generator><openSearch:totalResults>33</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><xhtml:meta content="noindex" name="robots" xmlns:xhtml="http://www.w3.org/1999/xhtml"/><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-2082621318936835475</id><published>2014-02-05T07:45:00.001-05:00</published><updated>2014-02-05T07:45:28.061-05:00</updated><title type="text">Listing Ship</title><content type="html">&lt;p&gt;In software development shops, and business in general, there tends to be many nautical terms used for how the business is doing. We're all aboard the HMS/USS SomeBusiness and its easy to make the correlation to a real ship. Larger business often use various "can't turn the ship" type excuses as to why they can't adopt newer technologies or agile methodologies.  Smaller companies talk about "righting" when they've hit a bump along the way and need to rebound (but that's a different analogy). But what about the listing ship? Sure, it's kind of stable. It isn't exactly sinking or capsized. It's definitely not turtling. But what's going on and how do we "right" or fix this?
&lt;/p&gt;
&lt;p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsvbu-N0RCxuYPETP3tgpCfXaki1bi0BjHa3XVXmyiU5erXtuZP5zNt75q8-wxmjTLC7wr5p9RWM90Sh7XK_ENY1QWGnAApMI59AQ4VgegUzbdyV4bbP6YBWZBwapLqePcvXg-J0hBf1Q/s1600/listing-ship.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsvbu-N0RCxuYPETP3tgpCfXaki1bi0BjHa3XVXmyiU5erXtuZP5zNt75q8-wxmjTLC7wr5p9RWM90Sh7XK_ENY1QWGnAApMI59AQ4VgegUzbdyV4bbP6YBWZBwapLqePcvXg-J0hBf1Q/s320/listing-ship.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;

Usually the listing is caused by a shifting of the load. In business this could be due to a team or series of teams that are being asked (or forced) to carry extra weight due to another teams short-comings, or lay-offs, or apathy. The team that is shouldering the load is now &lt;b&gt;much&lt;/b&gt; closer to the water line. This isn't exactly a comforting place to be as the spray continually splashes up into your face. The trend at this point is to look out to see if there are other options. A dinghy or lifeboat that is "righted" is better than being on the low side of a listing company. As more people leave that are supporting the low side, the list continues and makes the angle much closer to capsizing.
&lt;/p&gt;
&lt;p&gt;
So how do we stop the talent bleed and right this? A good first start is communication. You know there is a problem. The rest of the team/company knows there is a problem. Don't disregard the problem to the point where nothing can be placed on tables in the galley without them crashing to the floor. You have to be able to answer a few very key questions.
&lt;/p&gt;
&lt;p&gt;
Is the list is growing? Are key players leaving? Have teams stopped caring? Has work slowed or stopped?
&lt;/p&gt;
&lt;p&gt;
Only after the list has stopped worsening can you address righting the ship. There's no use in having additional hiring if there is a mass exodus. The new hires will not have time for proper training and knowledge transfer, burn out, and leave. You have to address why everyone, including the rats, have been scurrying to find a way out.
&lt;/p&gt;

&lt;p&gt;
Once you've established that you are stable but listed, then you can begin the arduous of actually righting. Do the teams on the low side need more support? Are they performing tasks that should be performed by teams on the high side? Will a re-organization help or do you need to just throw bodies as the problem (usually no)?
&lt;/p&gt;

&lt;p&gt;
This isn't my ship and I'm not Jack Sparrow pulling into Port Royal. I've been waving to tuna for quite some time. I've been aggressively pushing cargo back over to the port side that should never have been put on the starboard. I've been fighting and fighting to keep the team under my lead above water and getting no response or reprieve from the captain. I fix problems. I make new features. I can't do that if I'm constantly having to drop everything and grab a bucket to bail water. The list continues to worsen. In short, I need to find a dinghy, lifeboat, yacht, tanker, shrimp boat, you get the idea.
&lt;/p&gt;

&lt;p&gt;
Perhaps I need to just grab a wakeboard or some pool noodles and paddle toward shore on my own.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/2082621318936835475" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/2082621318936835475" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2014/02/listing-ship.html" rel="alternate" title="Listing Ship" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsvbu-N0RCxuYPETP3tgpCfXaki1bi0BjHa3XVXmyiU5erXtuZP5zNt75q8-wxmjTLC7wr5p9RWM90Sh7XK_ENY1QWGnAApMI59AQ4VgegUzbdyV4bbP6YBWZBwapLqePcvXg-J0hBf1Q/s72-c/listing-ship.jpg" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-2952097197417062187</id><published>2012-08-08T23:03:00.000-04:00</published><updated>2012-08-08T23:03:35.331-04:00</updated><title type="text">Sell Out With Me Tonight</title><content type="html">&lt;div style="clear:both;"&gt;&lt;div style="float: left;"&gt;&lt;p&gt;Yet another fantastic technology conference fills up in record or near record time. Today it was &lt;a href="http://www.buildwindows.com/"&gt;Build 2012&lt;/a&gt;, Microsoft's annual developer conference (it kind of took the place of PDC a couple years ago). I don't know how many tickets were made available but &lt;b&gt;you&lt;/b&gt; can't get one if you don't &lt;b&gt;already&lt;/b&gt; have one. They sold out in 80 minutes at $2095 USD each.&lt;/p&gt;&lt;figure&gt;&lt;br /&gt;
&lt;header&gt;Other notable conferences include:&lt;/header&gt;&lt;br /&gt;
&lt;dl&gt;&lt;dt&gt;&lt;a href="http://www.stirtrek.com/"&gt;Stir Trek&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;1000 tickets; 10 minutes&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.codemash.org/"&gt;Code Mash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;1200 tickets; 20 minutes&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://developer.apple.com/wwdc"&gt;Apple WWDC&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;roughly 5000 tickets; 12 hours&lt;/dd&gt;
&lt;dt&gt;&lt;a href="https://developers.google.com/events/io/"&gt;Google I/O&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;roughly 5000 tickets; 28 minutes&lt;/dd&gt; &lt;/dl&gt;&lt;/figure&gt;&lt;br /&gt;
&lt;h1&gt;So what does all this mean?&lt;/h1&gt;&lt;p&gt;Well, I'm not really sure. Either it's still really good to be in technology; it is really, &lt;i&gt;really&lt;/i&gt; good to be in event planning; we are reaching critical mass on folks wanting to learn more about tech; or all the above. Whatever the case, if you want to get any of the latest info first-hand, you better hope they stream it or you're going to be left in the dust.&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div style="float: right;"&gt;&lt;img border="0" height="315" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw3HCTrWtwG9qxSagbT509FyMSy2JPU-KwyvOyrrOvzLCPi5lgsIkyBl_uhjIzM2M6IA6_-bybewUtCdWq26AjyW78KJOJudf2cg1-nbE04cQhZKLb5aH6hX-HwS3T6BVuClzkeuzAvsQ/s320/realbigfish-sellout.png" width="320" /&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;The above image is property of &lt;a href="http://www.reel-big-fish.com"&gt;Reel Big Fish&lt;/a&gt;. Go to their website, buy their album, etc. Please, don't sue me.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/2952097197417062187" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/2952097197417062187" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2012/08/sell-out-with-me-tonight.html" rel="alternate" title="Sell Out With Me Tonight" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw3HCTrWtwG9qxSagbT509FyMSy2JPU-KwyvOyrrOvzLCPi5lgsIkyBl_uhjIzM2M6IA6_-bybewUtCdWq26AjyW78KJOJudf2cg1-nbE04cQhZKLb5aH6hX-HwS3T6BVuClzkeuzAvsQ/s72-c/realbigfish-sellout.png" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-3399040461304224203</id><published>2012-04-10T23:19:00.000-04:00</published><updated>2012-04-10T23:19:37.675-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Mobile"/><category scheme="http://www.blogger.com/atom/ns#" term="User Experience"/><category scheme="http://www.blogger.com/atom/ns#" term="Web"/><title type="text">It's only blasphemy if I'm wrong, right?</title><content type="html">Mobile. That's it. Just, mobile. We've all been kind of ignoring it.

&lt;br /&gt;
&lt;br /&gt;
This year is starting to look like the mobile space is reaching critical mass. And here's the blasphemy part:

&lt;b&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Bigger than Jesus.&lt;/b&gt;

&lt;br /&gt;
&lt;br /&gt;
Yeah, I said it.

&lt;br /&gt;
&lt;br /&gt;
According to our friends at Wikipedia, Christianity worldwide touts about 2.2 billion followers. About 242 million of these are in the United States. Now, I'm not going to make any kind of claims to the validity or how devoted to their beliefs a certain percentage are. We're going to take these numbers and say, they're about right or at least close enough.

&lt;br /&gt;
&lt;br /&gt;
Now we check the latest market shares in another theological debate. Mobile OSes and we see something interesting
&lt;a href="http://www.comscore.com/Press_Events/Press_Releases/2012/4/comScore_Reports_February_2012_U.S._Mobile_Subscriber_Market_Share"&gt;ComScore - February 2012 U.S. Mobile Subscriber Market Share&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
Android is leading the way, with iOS not far behind. RIM still falling and Microsoft struggling to get any traction. But, here's the bit that I found interesting.

&lt;br /&gt;
&lt;blockquote&gt;
For the three-month average period ending in February, 234 million Americans age 13 and older used mobile devices&lt;/blockquote&gt;
&lt;blockquote&gt;
More than 104 million people in the U.S. owned smartphones during the three months ending in February, up 14 percent versus November.&lt;/blockquote&gt;
So though they may not be at epic fan-boy level, some 234 million Americans prayed at the alter of consumer web-enabled electronics with over 100 million being, effectively, the mobile evangelicals. And these numbers are continuing to grow. The tide isn't slowing, more it is gaining momentum.
&lt;br /&gt;
&lt;br /&gt;
Mobile is quickly becoming the elephant in the room the way the internet was in the late 1990s to early 2000s. You can no longer avoid it as a "fad". If you aren't looking to spark interactions with your customers in the mobile space, you are losing out.  More importantly, if you break your users mobile experience, you may lose them for good.

&lt;br /&gt;
&lt;br /&gt;
Sure, we all get geeked out at the announcements of what carrier is getting 4G coverage in what towns or iPhone 5, or Jelly Bean, or maybe even Windows Phone 8 (just me?). But, its all moot unless we're actively looking to make mobile experience part of the overall web experience.&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/3399040461304224203" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/3399040461304224203" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2012/04/its-only-blasphemy-if-im-wrong-right.html" rel="alternate" title="It's only blasphemy if I'm wrong, right?" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-7392588728915460618</id><published>2012-01-18T11:24:00.000-05:00</published><updated>2012-01-18T11:24:42.958-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="PIPA"/><category scheme="http://www.blogger.com/atom/ns#" term="SOPA"/><title type="text">Fill the Internet</title><content type="html">Grant Fritchey wrote a great summary on SOPA and PIPA and what is boils down to. You can go read it &lt;a href="http://www.scarydba.com/2012/01/18/stop-pipa-sopa"&gt;here&lt;/a&gt;... I'll wait.&lt;br /&gt;
&lt;br /&gt;
So I'm not sure if my comment there has come through yet but here is the main point:&lt;br /&gt;
&lt;br /&gt;
Blacking out the pages does nothing unless you’re a Google/Reddit/Wikipedia level site. Instead, make more posts. Scream it on Twitter, Facebook, Blogs, etc. Take the time to call, email, whatever your elected officials and post to them through all the channels they are going to close. Don’t black it out. Fill it up!&lt;br /&gt;
&lt;br /&gt;
So there's your call to action. Don't black it out and hope they get the point. The media holders want you to stop posting. Your Congress is trying to take away your Internet (and, yes, it is yours).  They are trying to take away many of our livelihoods. Don't be passive. Don't stop sharing information. Don't sit back and take it.&lt;br /&gt;
&lt;br /&gt;
Take the fight to them. Call your Senators and Representatives. Fill their voicemail boxes. Email them and fill their servers. Blog. Post to Twitter, Facebook, Reddit, FARK, Wikipedia. Any place you can leave feedback for your elected officials to see that we will not tolerate censorship, fill it up.&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/7392588728915460618" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/7392588728915460618" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2012/01/fill-internet.html" rel="alternate" title="Fill the Internet" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-2902113488779541735</id><published>2011-12-15T22:03:00.000-05:00</published><updated>2011-12-15T22:03:10.104-05:00</updated><title type="text">I'll most likely kill you in the morning</title><content type="html">Well, now that's a good life lesson.&lt;br /&gt;
&lt;br /&gt;
I left a good company and team that was taking a turn that no good will come from. This post isn't about them though so let's not get hung up there.&lt;br /&gt;
&lt;br /&gt;
Anyway, I joined this small company at the end of October, I knew there was going to be legacy code base and some very old ways of doing things. But they were "doing agile" so that was a big plus. I was being brought on board though to make with the new hotness; begin migration to MVC; do a bit of jQuery; work out what middleware/backend/SOA stuff needs changed or created to enable the mobile platform initiatives... pretty hot shit, right?&lt;br /&gt;
&lt;br /&gt;
So I make it through the last week of October and am learning the architecture, "their way" of doing things and how much tech debt I have to work around. Now I'm looking forward to getting into an iteration/sprint to really show the value-add of bringing me on board to tackle a good bit of refactor and optimization while adding new features.&lt;br /&gt;
&lt;br /&gt;
But the iteration never comes... I ask about it and get "We're waiting on a contract from XYZ. We'll start the iteration (next week, Monday, tomorrow, soon)." Until then, I get to work on an InstallShield project (which I used to do as a primary task and HATE!!!). &lt;br /&gt;
&lt;br /&gt;
So a month goes by... still no iteration. No value add. No refactor. No job satisfaction. Worst of all, I realize I really have no team. Instead, there is a group of people that get paid by the same corporation and touch the same source code (sometimes) but don't communicate. I'm pretty much in a complete vacuum working in installation hell.&lt;br /&gt;
&lt;br /&gt;
All the while, I continue getting recruiter calls even though my resume has been taken off Monster. Then it happens. As I'm telling a recruiter that I &lt;b&gt;just&lt;/b&gt; started with the company and I am not one the market, he asks, "but are you happy there?" This question haunts me through Thanksgiving and through the end of November.&lt;br /&gt;
&lt;br /&gt;
Then we have the company meeting where the recurring theme was "we're going to build this company so that someone will buy it and we can retire". So I stop ignoring the calls. I meet a few teams (real teams, mind you). I talk with more folks that enjoy tech... And I get a couple job offers. I make my decision to accept one and will be starting Jan 3rd.&lt;br /&gt;
&lt;br /&gt;
Then, in an attempt to be respectful of the people I am about leave, I give them a full 2 week notice this morning. There's my next big mistake. Apparently, I shouldn't have more respect for others than they do for me. Lesson learned. My boss tells me that he doesn't think they'll have much use for me since they still aren't going to start an iteration and he might just have me GTFO today. But he's all vague about it until past my normal end of day.&lt;br /&gt;
&lt;br /&gt;
And there's an outstanding issue on the installer crap. I'm the only one that's worked in that kind of tech. Her's where it gets funny... "maybe we do need you to come back in tomorrow to see if you can get that fixed". &lt;br /&gt;
&lt;br /&gt;
Yeah, sure Dread Pirate Roberts... Good night, Paul. Good work. Sleep well. I'll most likely fire you in the morning. I don't think so. You've shown your hand on what you plan to do when I am done with a task beyond your skill set.&lt;br /&gt;
&lt;br /&gt;
So now I need to figure out what to do to bring in some income for the next two weeks. Going to call my upcoming employer in the morning and see if they can handle me starting earlier. If that doesn't pan, I'll see if I can score some quickie data/TFS/coding goo on 1099. Maybe try to crank out some ideas I've had for &lt;a href="http://www.jeffblankenburg.com/2011/10/31/31-days-of-mango/"&gt;Windows Phone apps&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Otherwise, I'm going to have to brush up my "Welcome to WalMart" or "Would you like fries with that"... God I wish I was kidding there.&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/2902113488779541735" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/2902113488779541735" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2011/12/ill-most-likely-kill-you-in-morning.html" rel="alternate" title="I'll most likely kill you in the morning" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-3943977016475039325</id><published>2011-11-29T13:37:00.001-05:00</published><updated>2011-11-29T13:37:44.166-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SOPA"/><title type="text">Open letter to Pat Tiberi, Sherrod Brown, and Rob Portman</title><content type="html">Below is the letter I have written to support the immediate killing of S.968, Protect IP, SOPA, whatever. Have you written your Senators/Representatives?&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;I am writing to you as a voter in your district. I urge you to oppose the House version of S. 968, the PROTECT IP Act. The PROTECT IP Act is dangerous, ineffective, and short-sighted. The House version -- just introduced by Rep. Goodlatte -- is far worse.&lt;br /&gt;
&lt;br /&gt;
This bill brings with it the very high possibility of permanently damaging the internet or setting it's progress back some 30+ years. The internet is my livelihood. Don't take away my ability to earn an income during an already unstable economic recovery.&lt;br /&gt;
&lt;br /&gt;
Imagine going back to a time without Facebook, Twitter, YouTube, Google, Microsoft, Apple, Netflix, Hulu, Amazon, and all web content. Imagine the ramifications to commerce, education, entertainment, and society as a whole. &lt;br /&gt;
&lt;br /&gt;
Yes the internet *can* be used to break IP laws much like handguns, automobiles, and pastries *can* be used in violent crimes. Society, in general, shouldn't be penalized and treated as scum due to the actions of the few.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/3943977016475039325" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/3943977016475039325" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2011/11/stop-sopa.html" rel="alternate" title="Open letter to Pat Tiberi, Sherrod Brown, and Rob Portman" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-7810041370570128632</id><published>2011-11-16T13:58:00.001-05:00</published><updated>2011-11-29T13:33:21.017-05:00</updated><title type="text">SOPA and you</title><content type="html">&lt;a href="http://americancensorship.org/"&gt;American Censorship&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/7810041370570128632" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/7810041370570128632" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2011/11/sopa-and-you.html" rel="alternate" title="SOPA and you" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-3458202695056822046</id><published>2011-01-28T15:18:00.004-05:00</published><updated>2011-01-28T15:35:14.487-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ALM"/><category scheme="http://www.blogger.com/atom/ns#" term="TFS"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows WF"/><title type="text">Gated builds living in Harmony.  How NO_CI kicked my ass.</title><content type="html">It should come as no surprise that I love me some TFS 2010. Microsoft's ALM package is so good. It takes the place of a slew other tools (SCM, build server, bug tracking, document repository, work assignments, and more). Really, TFS is like bacon wrapped bacon for your development team.&lt;br /&gt;
&lt;br /&gt;
We've implemented rolling deployments that stage for up to an hour before pushing out to our dev web servers. The templates have some pretty heavy WF hacks to version assemblies, cycle IIS app pools and websites, push the web code, and execute some console apps that are part of the compilation. They've been working great but they don't keep broken code from getting in to the source control repository.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg90giHvruXPiNx9CnoW2-JWcwAIC8D0tioNBe3AyanLrA6dchUAsT8_4lJZuclNj9KTnlMwQ6sfsKh8G1V5OnPQ8D_5uNsmzCVVQDFWXbkv-lVsoJGyOeOmheXyKcN8T6R2kmQbP2MDI/s1600/RollingSetup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="161" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg90giHvruXPiNx9CnoW2-JWcwAIC8D0tioNBe3AyanLrA6dchUAsT8_4lJZuclNj9KTnlMwQ6sfsKh8G1V5OnPQ8D_5uNsmzCVVQDFWXbkv-lVsoJGyOeOmheXyKcN8T6R2kmQbP2MDI/s320/RollingSetup.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
On a new branch of the code tree, I've mirrored the rolling builds from the trunk. I also added a Gated build to avoid bad code ever being checked in. Hit the Googles if you don't know what a gated build is as there is a wealth of info out there about setting up basic Gated builds.&lt;br /&gt;
&lt;br /&gt;
So why this post? Well there is a funny thing that happens after the Gated build intercepts the check-in and verifies the build. When everything builds correctly, it will commit the changes you requested and add to your comment ***NO_CI***&lt;br /&gt;
&lt;br /&gt;
No problem, right? It's just some extra text, right? Well... not really. You see, putting ***NO_CI*** anywhere in your check-in comment tells the build service (just an event subscriber) to not look at this changeset for any Continuous Integration bits. You may have guessed by now that Rolling builds are.... a form of Continuous Integration. At least, as far as the TFS build service is concerned.&lt;br /&gt;
&lt;br /&gt;
With the gated builds trucking away, I never get a Rolling build to be dropped into the queue.&lt;br /&gt;
&lt;br /&gt;
To the Googles... again. &lt;br /&gt;
&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/tfsbuild/thread/cff735c5-403a-48ed-bd5c-5cbb26a0c089"&gt;http://social.msdn.microsoft.com/Forums/en-US/tfsbuild/thread/cff735c5-403a-48ed-bd5c-5cbb26a0c089&lt;/a&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuBpP1zFH4TZP7-jU4w-VlW5dSIQ-OVDlcqYotj5t-Ng023Xoc_o9XMsYLFje0Q4GZCTGh1IYIJ-G-1mapu7KvRIkLhLyQ3UcZfe4mK1mnr-rpukYkofmu2Fq8bToAOT5vlewJfKJRP44/s1600/BuildTemplate.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="144" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuBpP1zFH4TZP7-jU4w-VlW5dSIQ-OVDlcqYotj5t-Ng023Xoc_o9XMsYLFje0Q4GZCTGh1IYIJ-G-1mapu7KvRIkLhLyQ3UcZfe4mK1mnr-rpukYkofmu2Fq8bToAOT5vlewJfKJRP44/s320/BuildTemplate.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Here is where the goodness is. Open up the template being used for your Gated build. Navigate to&lt;br /&gt;
&lt;br /&gt;
Process &amp;gt; Sequence &amp;gt; Run On Agent &amp;gt; Initialize Workspace &amp;gt; Get Workspace&lt;br /&gt;
This action has a property named NoCIOption that is set to True on the default template. What I'd suggest at this point is to create a new boolean argument and hook up the metadata so you can set it edits of the build.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjm1jLjAX8sPbOrGqcCLlY47QxwaFKwXSLx-Cr_a4L_8L2OG0SOSHclZDd1AlQWDLpyPbxWcTzNj73uNggzbDBFasbBcqChyphenhyphenqs8yEKl-4qc5kcwPXSktQHBylHx-XnulmzYfxpC-onJnXs/s1600/NO_CIArgument.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="73" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjm1jLjAX8sPbOrGqcCLlY47QxwaFKwXSLx-Cr_a4L_8L2OG0SOSHclZDd1AlQWDLpyPbxWcTzNj73uNggzbDBFasbBcqChyphenhyphenqs8yEKl-4qc5kcwPXSktQHBylHx-XnulmzYfxpC-onJnXs/s320/NO_CIArgument.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Now, when the Gated build completes, it performs the check-in on your behalf &lt;i&gt;without&lt;/i&gt; the ***NO_CI*** and then any&amp;nbsp; CI or Rolling builds function as desired.&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/3458202695056822046" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/3458202695056822046" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2011/01/noci.html" rel="alternate" title="Gated builds living in Harmony.  How NO_CI kicked my ass." type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg90giHvruXPiNx9CnoW2-JWcwAIC8D0tioNBe3AyanLrA6dchUAsT8_4lJZuclNj9KTnlMwQ6sfsKh8G1V5OnPQ8D_5uNsmzCVVQDFWXbkv-lVsoJGyOeOmheXyKcN8T6R2kmQbP2MDI/s72-c/RollingSetup.png" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-7864997000214535456</id><published>2010-10-28T11:08:00.000-04:00</published><updated>2010-10-28T11:08:16.003-04:00</updated><title type="text">GetAssemblies missing dll's</title><content type="html">I have a couple ASP.Net MVC web applications that allow additional functionality by dropping new class library dll's into the bin directory.&amp;nbsp; This causes new options, tools, products, workflows, etc to be enabled to the user with just a pushing out a new class library.&amp;nbsp; We've moved away from using an DI/IoC tool (StructureMap/Castle Windsor) because of seeing some memory leaks and having some maintenance issues of the xml files needed to use them.&lt;br /&gt;
&lt;br /&gt;
Instead I decided to go the route of using existing functionality built into the .Net framework.&amp;nbsp; There is this nifty little static method &lt;a href="http://msdn.microsoft.com/en-us/library/system.appdomain.getassemblies.aspx"&gt;AppDomain.CurrentDomain.GetAssemblies()&lt;/a&gt; which: &lt;br /&gt;
&lt;blockquote&gt;Gets the assemblies that have been loaded into the execution context of this application domain.&lt;/blockquote&gt;So, I figure this being ASP.Net, all the dll files in the bin directory would be loaded up, right?&amp;nbsp; I run the solution and a bunch Assemblies are returned (mscorlib, System.Web.Mvc, Stuff.I.want.dll, More.Stuff.I.Want.dll) page loads and I can see everything it there and happy. A bit more testing happens and then check-in so it gets put out on the web server.&lt;br /&gt;
I run through some testing there to make sure there is no real differences between IIS7 and Visual Studio development web server.&amp;nbsp; Everything looks great. I've removed some external dependencies, lowered the memory footprint, and eased readability. Fantastic! Time to turn it over to have others really kick the tires.&lt;br /&gt;
&lt;br /&gt;
A couple hours go by and then it happens. "Hey Paul! I'm not seeing any of these options I had the last time I opened the page." So I look, the dll's are there.&amp;nbsp; There were no other code changes to remove them. Let's run local.&amp;nbsp; Everything looks fine.&amp;nbsp; I check that results from this particular call are being cached. Everything seems fine.&amp;nbsp; I change some methods from static to instance, just in case, and deploy.&lt;br /&gt;
&lt;br /&gt;
Again, everything is going along just fine, until the next morning. "Paul. Seriously, are you messing with me? These options are gone again." Me: "%&amp;amp;$(*$%" Directory looks fine. Ok, going to move some stuff out of extension methods and directly into the main assembly for this backend assembly. Lather, rinse, repeat.&lt;br /&gt;
&lt;br /&gt;
Time passes... "Paul, WTF?" Me: "Are you friggin kidding me?" Nothing, &lt;b&gt;NOTHING&lt;/b&gt;, is static now in my code.&amp;nbsp; Nothing is in an extension method, I am very close to having all this functionality in one big DoThisCrap method.&lt;br /&gt;
&lt;br /&gt;
To the Googles!!!&lt;br /&gt;
&lt;br /&gt;
You remember that &lt;i&gt;"Gets the assemblies that have been &lt;b&gt;loaded&lt;/b&gt; into the execution context of this application domain."&lt;/i&gt; part earlier? Yeah me neither.&lt;br /&gt;
&lt;br /&gt;
So what was happening, as best as I can tell, was the fresh code right after a deployment (or &lt;b&gt;every&lt;/b&gt; time I opened in the VS dev server) ASP.Net loaded every dll in the bin as I hoped.&amp;nbsp; On subsequent page visits, ASP.Net &lt;i&gt;learned&lt;/i&gt; that some files were not needed on the last load and no code was directly instanciating them so they weren't loaded. This means they didn't show up.&lt;br /&gt;
&lt;br /&gt;
What to do? Well, we can get the current directory from AppDomain.CurrentDomain.BaseDirectory property.&amp;nbsp; From there it's a simple System.IO.Directory.GetFiles call to plow the directory with various search options.&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
this can be pointed to specific sub folder using string.format&lt;br /&gt;
*/&lt;br /&gt;
var path = AppDomain.CurrentDomain.BaseDirectory;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
you can add file name matching criteria here if the assemblies you are looking for match a naming convention&lt;br /&gt;
*/&lt;br /&gt;
var files = Directory.GetFiles(path, "*.dll", SearchOption.AllDirectories); &lt;br /&gt;
&lt;br /&gt;
and now we can perform logic on the files array.&lt;br /&gt;
&lt;br /&gt;
Since we are looking directly at a folder path, there is no issue of whether previous runs loaded the assemblies into the AppDomain.&amp;nbsp; However, there is the additional cost of going to disk to get results.&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/7864997000214535456" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/7864997000214535456" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2010/10/getassemblies-missing-dlls.html" rel="alternate" title="GetAssemblies missing dll's" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-8434984512379170407</id><published>2010-10-27T21:33:00.000-04:00</published><updated>2010-10-27T21:33:35.688-04:00</updated><title type="text">Congratulations! You just broke the team!</title><content type="html">Infighting. Every team has it to some point. The testing team complains that the developers screwed up the application. The developers blame the business analysts for incomplete/incoherent requirements. The BA’s blame the testing/dev groups for misinterpreting the requirements or interpreting them instead of asking for clarification. The project manager blames everyone for slipping deadlines.&lt;br /&gt;
&lt;br /&gt;
Some conflict is expected within any group. There are, however, lines that need to not be crossed. We are all part of this thing for a reason. Let’s give each other a bit of respect and we can get through our day-to-day much easier. Mutual respect is required for all silos/individuals on the team.&lt;br /&gt;
&lt;br /&gt;
Saying to external teams that you have no confidence in one of the internal teams to deliver on what they are paid to do is incomprehensible. Questioning a team members motives on how they spent a vacation day that was scheduled weeks in advance is ludicrous. Demanding that other teams work nights and weekends when you don’t do the same is selfish. Throwing a fit when an individual says “NO!” to working over a holiday weekend because you don’t celebrate the same holiday is appalling.&lt;br /&gt;
&lt;br /&gt;
Below is a brief list of what is being halted whenever I have to deal with this infighting:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;I investigate new methodologies and technologies&lt;/li&gt;
&lt;li&gt;I scrutinize every line of code&lt;/li&gt;
&lt;li&gt;I monitor data page utilization&lt;/li&gt;
&lt;li&gt;I remove redundancy&lt;/li&gt;
&lt;li&gt;I optimize methods and queries&lt;/li&gt;
&lt;li&gt;I normalize datasets&lt;/li&gt;
&lt;li&gt;I take long running processes down to a tenth their initial time&lt;/li&gt;
&lt;li&gt;I plan for scale&lt;/li&gt;
&lt;li&gt;I visualize data sets and workflows the way most people see pictures&lt;/li&gt;
&lt;li&gt;I read countless blogs, tweets, message boards&lt;/li&gt;
&lt;li&gt;I teach more junior developers how to use existing frameworks&lt;/li&gt;
&lt;li&gt;I collaborate with my peers&lt;/li&gt;
&lt;li&gt;I document the system&lt;/li&gt;
&lt;li&gt;I design new features&lt;/li&gt;
&lt;li&gt;I prioritize deliverables&lt;/li&gt;
&lt;li&gt;I fix bugs&lt;/li&gt;
&lt;li&gt;I update data&lt;/li&gt;
&lt;li&gt;I spec hardware&lt;/li&gt;
&lt;li&gt;I evaluate new software&lt;/li&gt;
&lt;li&gt;I verify we are licensed properly&lt;/li&gt;
&lt;li&gt;I write .Net&lt;/li&gt;
&lt;li&gt;I read Java&lt;/li&gt;
&lt;li&gt;I understand PHP, ForTran, COBOL and more&lt;/li&gt;
&lt;li&gt;I relate the data&lt;/li&gt;
&lt;li&gt;I connect the networks&lt;/li&gt;
&lt;li&gt;I make the impossible possible&lt;/li&gt;
&lt;li&gt;I tell you when the impossible really is impossible&lt;/li&gt;
&lt;li&gt;I can *DD the hell out this shit&lt;/li&gt;
&lt;li&gt;I can make fat objects light and anemic domains rich&lt;/li&gt;
&lt;li&gt;I’ve came in early, stayed late, worked weekends and holidays&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
I am Paul Montgomery. I am good at what I do. I do this shit for a living because I am good at it. I am a pretty damned big deal. I do all I can to surround myself with highly capable people. I will &lt;strong&gt;not&lt;/strong&gt; tolerate treating any member of my team without respect.&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/8434984512379170407" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/8434984512379170407" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2010/10/congratulations-you-just-broke-team.html" rel="alternate" title="Congratulations! You just broke the team!" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-7505259578592979485</id><published>2010-02-02T17:44:00.000-05:00</published><updated>2010-02-02T17:44:41.474-05:00</updated><title type="text">Name That Caption Contest</title><content type="html">Tom LaRock, yes THE Tom LaRock, is running a Name That Caption Contest over on DBASurvivor.com.  The winner gets a copy of his book by the same name (catchy, eh?).&lt;br /&gt;
&lt;br /&gt;
So I'll be posting my captions here starting with a rather obvious:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;I felt a great disturbance in the data center... as if millions of SPIDs suddenly cried out in terror and were suddenly silenced&lt;/li&gt;

&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/7505259578592979485" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/7505259578592979485" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2010/02/name-that-caption-contest.html" rel="alternate" title="Name That Caption Contest" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-1604787405107902996</id><published>2010-01-18T00:24:00.000-05:00</published><updated>2010-01-18T00:24:54.051-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="anemic domain"/><category scheme="http://www.blogger.com/atom/ns#" term="TD-ADD"/><category scheme="http://www.blogger.com/atom/ns#" term="TDD"/><title type="text">Spitting out the KoolAid</title><content type="html">&lt;blockquote&gt;85% code coverage&lt;/blockquote&gt;&lt;blockquote&gt;5000 unit test passing&lt;/blockquote&gt;&lt;blockquote&gt;Red. Green. Refactor.&lt;/blockquote&gt;&lt;br /&gt;
We've all heard the TDD folks spewing comments like this on blogs, twitter, or facebook. Quite frankly, I've had enough. I've been on agile teams (little 'a' agile as there is a difference) and yes it works &lt;b&gt;much&lt;/b&gt; better than the good 'ole waterfall methodology. However, TDD is &lt;b&gt;NOT&lt;/b&gt; a requirement of being an agile team. Actually, I've seen where having your tests up front and coding to the tests can make you less able to make changes to your project.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;If you're not driving your design from tests, what is driving your design?&lt;/h2&gt;How about the business requirements and chosen technologies? If you start limiting your design decisions by their testability, you can miss out on some great emerging technologies (try finding anything on unit testing app fabric (velocity/caching).&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Making TDD your meal ticket.&lt;/h2&gt;I'd say learn new features available in your current language, learn a new language, refresh basic OOP design principles, learn about database design (or UI, or web service, or security, blah, blah, blah). There is always something new to learn methodologies are included but you really shouldn't limit yourself.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Write less code.&lt;/h2&gt;I call bull$#!%. So the red/green/refactor can potentially limit you to only writing &lt;b&gt;exactly&lt;/b&gt; the methods you &lt;b&gt;need&lt;/b&gt; but there is the rub. You have to continually make sure you are not future coding or you lose the "write less" mentality. For starters the "less" code has the addition of the test code. Also, I see many technologies, tools, and patterns being bundled to the project by the TDD evangelists. Mocks, Dependency Injection, Object/Relational Mapping, Inversion of Control all tend to added "bonuses" to the end product. So you take your desired functionality and you wrap all these layers of fluff around them. Each tech and tool requires bending your project to the way the tool needs and typically add new files/projects to be added to the end solution (interfaces, repositories, factories, .hbm.xml, .castle, and on and on). Sounds to me like the promise of "less" leads to more.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Assuming everything else works, does this do its job?&lt;/h2&gt;Sounds great doesn't it? We break down our code into these tiny bits and we put a loader over here, a translator over there, we dumb down the classes to base object so we can reuse them in other projects (which NEVER happens). We put the domain classes in one project, put the interfaces in another, have another project for the business logic (because our objects don't know how to do anything with itself). And since we have mocking set up, we stub out the calls of all the inter-connections so we don't &lt;i&gt;actually&lt;/i&gt; have to see the parts work together. &lt;br /&gt;
&lt;br /&gt;
Who cares if Billy plays nice when he's at the park? He gets along so well with his imaginary friends.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;So I shouldn't test my code?&lt;/h2&gt;I'm not saying that. There are very good reasons to do testing. Items behind a service call is a good candidate for putting up some tests. By its nature, the service call is disconnected so slamming the call with numerous inputs is straight forward and easier than a testing UI. Additionally, items with a great deal of logic branching or computations do well. Also, anything that has surfaced as a bug more than once. More importantly, UI testing (automated or manually) covers more of what matters... what the user experiences. It doesn't matter if your Is_it_a_dog tests pass because it has 4 legs and barks. What happens when the user is looking for a cow? TDD evangelists whould say you would make tests for a cow as needed. What about a horse? A turtle? A lorikeet? We know that the test suite has now become the pig.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Seeing the forest through the trees.&lt;/h2&gt;So we have now bloated up our number of tests to cover all these scenarios while adding no real functionality. We've changed the tests and the real code to meet new business requirements or add functionality. And yet through it all, the TDD tribe will stick to the tests until one crucial point. When a development team is confronted with 200 development hours and only 150 available hours they will try to push the timeframe back or shrink the feature count. When neither of these are possible due to contractual or regulatory requirements, they say screw the testing and start slinging bits in every way possible. If TDD was so much of a time savings, why do you see teams abandon in what should be its golden hour?&lt;br /&gt;
&lt;br /&gt;
TDD isn't coding with seatbelts. You're tests don't keep you from making mistakes. You'll still misinterpret requirements (and have to change it in at least one additional place). You'll never get enough fringe cases to match your users day-to-day interaction. Testing the individual units makes no guarantee that the system, as a whole, works together as needed. So in many cases, TDD is purely a mastorbatory exercise.&lt;br /&gt;
&lt;br /&gt;
I am currently working to remove many of these practices &lt;b&gt;out&lt;/b&gt; of my current project because they have done nothing but degrade system performance and added confusion to the project. I'll take a rich domain objects with a real inhertence model that know how to load, save, and translate themselves. Then I know that I can do more with less code and I can make changes to the objects when the requirements change without jumping through some 30 different base, controlling, and god classes after re-working dozens, hundreds, or thousands of tests.&lt;br /&gt;
&lt;br /&gt;
If TDD is working for you, great. If not, don't feel bad. It's not the silver bullet that it has been touted as.&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/1604787405107902996" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/1604787405107902996" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2010/01/spitting-out-koolaid.html" rel="alternate" title="Spitting out the KoolAid" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-3714865137724109990</id><published>2009-11-05T09:18:00.001-05:00</published><updated>2009-11-05T09:22:07.910-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL 2008"/><title type="text">SQL Server 2008 R2 Running on “Big Iron”</title><content type="html">PASS Summit info on SQL 2008 running on my dream Server (192 cores).  Summed up by Glenn Berry.&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/3714865137724109990" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/3714865137724109990" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2009/11/sql-server-2008-r2-running-on-big-iron.html" rel="alternate" title="SQL Server 2008 R2 Running on “Big Iron”" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-5383843449181793234</id><published>2009-08-17T19:48:00.003-04:00</published><updated>2009-08-17T23:03:29.348-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Fail"/><category scheme="http://www.blogger.com/atom/ns#" term="Linq"/><category scheme="http://www.blogger.com/atom/ns#" term="stupid coder"/><category scheme="http://www.blogger.com/atom/ns#" term="VB.Net"/><category scheme="http://www.blogger.com/atom/ns#" term="With"/><title type="text">With FAIL</title><content type="html">If you've had the pleasure of working in VB.Net (kill self).  If your lazy like me. You've probably used a WITH statement to shorthand calls to properties and methods.&lt;br /&gt;&lt;br /&gt;For those who haven't, a WITH statement can be implemented as below:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;With myObject = New SomeObject()&lt;br /&gt;  .Property1 = "foo"&lt;br /&gt;  .Property2 = "bar"&lt;br /&gt;  .Execute()&lt;br /&gt;End With&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Simple enough, right.  Now enter Linq...&lt;br /&gt;&lt;br /&gt;Linq queries (Linq2SQL, Linq2nHibernate, Linq2XML) add a great deal of functions to items derived from IEnumereable (Querayable objects, Lists, etc). The main method I was using on my project was the .Where() extension method.&lt;br /&gt;&lt;br /&gt;I'll just mention that I prefer the Extension method/Lambda syntax in C# over that of vb. Primarily because I am lazy and "=&gt;" is two keystrokes versus "Function(x)".  Now here is where my laziness caught up with me.&lt;br /&gt;&lt;br /&gt;I was implementing a simple search function that would take in a search criteria class.  The class had a few properties and a list.  The properties mapped to various fields on a customer class the list maps to a view that I've associated as a child class to the customer class in my dbml.  All criteria are optional on the search to allow for insanely as hoc querying.&lt;br /&gt;&lt;br /&gt;So as I enter the .Search(criteria As SearchCriteria) method I tossed in a With statement (due to the laziness). Basically as follows:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Public Function Search(criteria As SearchCriteria) As List(Of Customer)&lt;br /&gt;With criteria&lt;br /&gt;Dim results = Repository(Of Customer).GetTable()&lt;br /&gt;If Not(String.IsNullOrEmpty(.Name)) Then&lt;br /&gt;  results = results.Where(Function(r) r.Name.Contains(.Name))&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;If (.CustomerId IsNot Nothing) Then&lt;br /&gt;  results = results.Where(Function(r) r.Id = .CustomerId)&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;...Continue a dozen more times ...&lt;br /&gt;&lt;br /&gt;End With&lt;br /&gt;Return results&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;So I step through debugging on this method and I see that the .Where's are filtering down the results as I'd expect.  However when I leave the sub, a NullReferenceException is thrown from the internals of Linq2SQL... FAIL.&lt;br /&gt;&lt;br /&gt;Thinking I may have screwed up something with the .Where's, even though a watch shows that it's good, I switch up how I do the where to&lt;br /&gt; results = From r In results Where r.Id = .CustomerId&lt;br /&gt;I step through, expand the watch, and it looks good.  Continue running to end of method... FAIL.  Again a NRE from the internals of Linq2SQL.&lt;br /&gt;&lt;br /&gt;After cursing at length, dumping all the objects out of my dbml and re-creating.  Still FAIL.  Then it dawns on me.  Linq2SQL queries, like all Linq queries don't execute when most people would expect.  This is a good thing.  You can append numerous Where statements, Orders, etc and the you don't have a call to the database until you actually go to retrieve a value (a ToList() or ToArray() will cause this as will binding the list to a webform object).  Of course when I expand the watch on results it executed the underlying queries.  So where did the phantom NRE come from?&lt;br /&gt;&lt;br /&gt;Apparently, using a With statement does some kind of voodoo with memory addressing.  So my .CustomerId is not the same as criteria.CustomerID.  When the results were returned, we were outside the With so the framework had no idea where these .Whatevers were coming from. *sigh* So much for being lazy.&lt;br /&gt;&lt;br /&gt;I remove the With statement and everything just works... Kill Self.  That is about a day of writing, cursing, rewriting, cursing, smoking, re-rewriting, cursing that I won't get back.  So that is my tale of shame, I am not proud.&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/5383843449181793234" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/5383843449181793234" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2009/08/with-fail.html" rel="alternate" title="With FAIL" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-2008525303694869175</id><published>2009-07-23T22:22:00.002-04:00</published><updated>2009-07-23T22:26:54.534-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="NHibernate"/><category scheme="http://www.blogger.com/atom/ns#" term="ORM"/><category scheme="http://www.blogger.com/atom/ns#" term="peschka"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><title type="text">From Tables to Objects</title><content type="html">Jeremiah Peschka had a great ORM presentation at CONDG tonight and has uploaded incase you missed anything.&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/2008525303694869175" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/2008525303694869175" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2009/07/from-tables-to-objects.html" rel="alternate" title="From Tables to Objects" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-2967367619747909576</id><published>2009-07-09T09:51:00.002-04:00</published><updated>2009-07-09T09:54:43.584-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="interview"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><title type="text">Brent Ozar - What I want vs what I can afford</title><content type="html">&lt;a href="http://www.twitter.com/BrentO"&gt;Brent Ozar&lt;/a&gt; follows up his top 10 questions for Senior DBAs with an explaination of why he isn't able to fill positions with &lt;a href="http://www.twitter.com/PaulRandal"&gt;Paul Randal&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/2967367619747909576" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/2967367619747909576" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2009/07/brent-ozar-what-i-want-vs-what-i-can.html" rel="alternate" title="Brent Ozar - What I want vs what I can afford" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-4075065981490853165</id><published>2009-07-09T09:49:00.001-04:00</published><updated>2009-07-09T09:50:39.146-04:00</updated><title type="text">Brent Ozar - 10 questions to ask senior DBAs</title><content type="html">&lt;a href="http://www.twitter.com/BrentO"&gt;Brent Ozar&lt;/a&gt; goes through his top 10 questions for Senior DBAs.&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/4075065981490853165" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/4075065981490853165" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2009/07/brent-ozar-10-questions-to-ask-senior.html" rel="alternate" title="Brent Ozar - 10 questions to ask senior DBAs" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-1275928716604608024</id><published>2009-07-07T18:45:00.003-04:00</published><updated>2009-07-07T19:15:10.434-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="twikini"/><category scheme="http://www.blogger.com/atom/ns#" term="Twitter"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows Mobile"/><title type="text">Twikini for Windows Mobile</title><content type="html">Trinket Software has released version 1.1 of Twikini.  I've run a few of the beta versions of Twikini with only one issue (requiring hard reset) that was resolved in the next version.&lt;br /&gt;&lt;br /&gt;Twikini is a pretty outstanding bit of software for your Windows Mobile device.  It has a much sexier UI than my other favorite client, TinyTwitter.  It also runs noticeably faster. The UI is more intuitive than Pocketwit.&lt;br /&gt;&lt;br /&gt;For most of my Tweeting needs, Twikini more than fits.  I still use TinyTwitter for viewing individual timelines but since Twitter has been ignoring the #fixreplies, I see my usage of TinyTwitter falling and Twikini filling that void.&lt;br /&gt;&lt;br /&gt;So take a look at that sweet UI and head over to &lt;a href="http://www.trinketsoftware.com/Twikini"&gt;http://www.trinketsoftware.com/Twikini&lt;/a&gt; and get a demo version to kick the tires.&lt;br /&gt;&lt;a href="http://www.trinketsoftware.com/Twikini"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 322px; height: 322px;" src="http://www.trinketsoftware.com/Images/Twikini_Theme_HTCBlack.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/1275928716604608024" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/1275928716604608024" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2009/07/tikini-for-windows-mobile.html" rel="alternate" title="Twikini for Windows Mobile" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-5101394724202006754</id><published>2009-01-13T09:09:00.004-05:00</published><updated>2009-01-13T11:12:58.488-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arnulfo"/><category scheme="http://www.blogger.com/atom/ns#" term="Recommendation"/><category scheme="http://www.blogger.com/atom/ns#" term="Wing"/><title type="text">Open letter of recommendation: Arnulfo Wing</title><content type="html">A good friend and a wonderful colleague of mine, Arnulfo Wing.  Has found himself in the position of looking for new opportunities.  I have worked with Arnulfo for about a year through Quick Solutions and for many months on my current project.  Arnulfo has many characteristics that made him a valuable addition to the project.  He was &lt;b&gt;the&lt;/b&gt; BizTalk resource for a fairly complex rules implementation.  The project of moving the rules out of BizTalk and into something the client felt more comfortable managing was no easy task.  It took about 7 months and had up to 4 developers working on the C#-based solution.&lt;br /&gt;&lt;br /&gt;Through our many conversations, Arnulfo showed his depth of knowledge of the system. Both within BizTalk and the application that BizTalk supported.  He also showed a great desire to help others understand what many look to as a "black box".  He was instrumental in extracting the rules, orchestrations, literally every piece of information pertinent to the project out of the BizTalk instances so that development wouldn't have to start on the new rules engine with a blank slate.&lt;br /&gt;&lt;br /&gt;Arnulfo also showed genuine interest in what was happening in other parts of the solution.  Though BizTalk was his primary responsibility, he was available to assist in troubleshooting, design questions, and ensuring delivery.&lt;br /&gt;&lt;br /&gt;Arnulfo has a thirst for knowledge of new technologies and methodologies.  I've seen him at many area user groups.  Talked to him about local conferences.  He is more than "Just BizTalk".  Given his ability to grok very complex systems, his excellent people skills, his depth and breath of knowledge, and his client-facing demeanor, I can see Arnulfo being able to fill many positions. These include Developer, Team Lead, and Architect.&lt;br /&gt;&lt;br /&gt;Arnulfo's blog is available at &lt;a href="http://arnulfowing.blogspot.com/"&gt;http://arnulfowing.blogspot.com/&lt;/a&gt;.  There you can see some of the experience he has accumulated from Hyper V corrupt drives to setting TFS to run on multiple servers... and of course, there's BizTalk.&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/5101394724202006754" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/5101394724202006754" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2009/01/open-letter-of-recommendation-arnulfo.html" rel="alternate" title="Open letter of recommendation: Arnulfo Wing" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-8816295183523551569</id><published>2008-10-23T21:22:00.002-04:00</published><updated>2008-10-23T22:37:14.934-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cell Phone"/><category scheme="http://www.blogger.com/atom/ns#" term="HTC"/><category scheme="http://www.blogger.com/atom/ns#" term="Sprint"/><category scheme="http://www.blogger.com/atom/ns#" term="Touch Diamond"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows Mobile"/><title type="text">Sprint WinMo Roundup</title><content type="html">Over the last couple months I’ve been trying to find a new phone to replace my old and busted Sanyo VI2300 (read no-cam, flip-out brick). The rest of this blog is to help others who are looking to get into some new hotness that is available. Since I am a .Net develop and the time I have spent with any Apple product has been annoying at best, I was looking to upgrade to a Windows Mobile device.&lt;br /&gt;&lt;br /&gt;The first go round I picked up a Samsung ACE (SPH-i325). This was a nice, sleek phone running Windows Mobile 6. Thinner than a pack of playing cards and had an easy-to-use thumbboard.  The response on this phone was fast. It had a microSD slot for additional storage. The phone also sported two features that I instantly fell in love with Automatic Speech Recognition and Automatic Profiling. The phone also supported international calling via GSM networks using either the provided or a pre-paid SIM card (something I didn’t use). A pretty good phone for about $100. But the phone did have shortcomings. After playing around with Live Search and Google Maps, the lack of an integrated GPS radio really stood out as a deal breaker, especially after finding no upgrade path to Windows Mobile 6.1.&lt;br /&gt;&lt;br /&gt;Round two went to an HTC Mogul (PPC6800). This phone was a brick. But it had a HUGE touch screen and a slide out QWERTY keyboard.  It also had the much desired GPS and upgrade possibility to Windows Mobile 6.1.  The phone also had a microSD slot. But it was lacking my new loves ASR and Automatic Profiling.  Additionally, the ROM seemed a little sluggish.  There are plenty of 3rd party ROMS and tools to get an ALMOST automatically switch to vibrate mode during meetings. For nearly $300, I’d want to be ecstatic about my phone. Not permanently searching to find ways to add the functionality that the ACE had.&lt;br /&gt;&lt;br /&gt;At this point, you might ask “What’s the big deal with ASR and Auto Profiling?” ASR should be on EVERY phone, PERIOD.  ASR is more than the voice recognition on many phones where you have to record a dumb tag (Call Joe Smith Mobile, for example).  You then assign the tag to the action you want the voice tag to perform.  ASR is so much better.  ASR has some built-in actions (Call, Open, Play, etc).  So you can put in a new contact (Joe Smith) and then instantly have the ability to speak “Call Joe Smith Mobile” and it just works. No pre-recording; you just speak. Additionally, the Ringer Profiles with Automatic Profiling should be on ANY phone that has calendaring applications.  Automatic Profiling puts your phone into vibrate during scheduled meetings.  This is especially important if your team has a rule of “your phone rings during meetings; you buy donuts”. &lt;br /&gt;&lt;br /&gt;Finally, we come to my current hotness. The HTC Touch Diamond (MP6950) is a true iPhone killer.  It’s a thin phone with a big, beautiful touch screen. It has a built-in GPS radio. Comes with Windows Mobile 6.1 pre-loaded and has both ASR and Automatic Profiling. Also the TouchFlo3Dtm UI is frickin sweet. The different touch keyboards available make input easy with stylus or by touch via Compact QWERTY. Additionally, there are accelerometers to determine if the phone is in portrait or landscape orientation. The phone comes with 4GB of internal storage.  It is the greatest combination of features I’ve seen in a phone and it is the best phone Sprint has available. So much awesome is packed into this tiny form factor I don’t think I put it down for the first week.&lt;br /&gt;&lt;br /&gt;I know that HTC is about to release the Touch Pro with all the goodness of the Touch Diamond with a slide out keyboard headphone jack (the diamond has a dongle for this) and a microSDHC slot for something like 32GB of additional storage.  I think I’m good with the Diamond and have had enough of the headaches associated with returning phones for exchange. I don’t think the HTC models can be beat.  The Touch Pro is great for those that like the slide out keyboard. The Touch HD is to have a camera to beat anything on the market.  But if you can’t wait, you can’t go wrong with the Diamond.&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/8816295183523551569" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/8816295183523551569" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2008/10/sprint-winmo-roundup.html" rel="alternate" title="Sprint WinMo Roundup" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-878847496519340441</id><published>2008-07-16T14:58:00.000-04:00</published><updated>2008-07-16T14:59:48.981-04:00</updated><title type="text">Got TFS Hate?</title><content type="html">Jeff Hunsaker is looking for TFS haters and asking how to make your pain go away.&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/878847496519340441" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/878847496519340441" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2008/07/got-tfs-hate.html" rel="alternate" title="Got TFS Hate?" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-3042305296013325397</id><published>2008-07-07T20:48:00.004-04:00</published><updated>2008-07-08T09:17:38.548-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CASE WHEN"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><title type="text">When good coders write bad code.</title><content type="html">I want to air some dirty laundry.  Why is it that nobody seems to ask questions?  Is it that we are too full of ourselves?  Or that the industry rewards answers but not questions?  Is it that someone who asks questions is seen as a n00b?  Why do we have this stigma of "I have a dumb question" when we are new on a project?&lt;br /&gt;&lt;br /&gt;I ran into a side-effect of this mentality on my latest project.  Recently, I was working on optimizing some SQL queries that were running slow.  In the middle of plowing through some of the newly added functions I came across one that really seemed to stick out.&lt;br /&gt;&lt;br /&gt;In a nutshell, the function was to take a case identifier and return a "hierarchical" start date so that if ActualEndDate exists, return ActualBeginDate.  If ApprovedEndDate exists, return ApprovedBeginDate.  If CertifiedEndDate exists, return CertifiedBeginDate.  If RequestedEndDate exists, return RequestedBeginDate.  If all these conditions are false, return NULL.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is some sample data:&lt;br /&gt;&lt;table border="2" cellpadding="0" cellspacing="0"&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr style="border-width: thick; background-color: rgb(153, 153, 153); font-weight: bold;"&gt;&lt;td&gt;CaseID&lt;/td&gt;&lt;td&gt;RequestedBegin&lt;/td&gt;&lt;td&gt;RequestedEnd&lt;/td&gt;&lt;td&gt;CertifiedBegin&lt;/td&gt;&lt;td&gt;CertifiedEnd&lt;/td&gt;&lt;td&gt;ApprovedBegin&lt;/td&gt;&lt;td&gt;ApprovedEnd&lt;/td&gt;&lt;td&gt;ActualBegin&lt;/td&gt;&lt;td&gt;ActualEnd&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr style="border-width: thin;"&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;7/1/2008&lt;/td&gt;&lt;td&gt;7/31/2008&lt;/td&gt;&lt;td&gt;7/1/2008&lt;/td&gt;&lt;td&gt;7/14/2008&lt;/td&gt;&lt;td&gt;7/1/2008&lt;/td&gt;&lt;td&gt;7/7/2008&lt;/td&gt;&lt;td&gt;7/3/2008&lt;/td&gt;&lt;td&gt;7/7/2008&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr style="border-width: thin;"&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;8/1/2008&lt;/td&gt;&lt;td&gt;8/30/2008&lt;/td&gt;&lt;td&gt;8/3/2008&lt;/td&gt;&lt;td&gt;8/30/2008&lt;/td&gt;&lt;td&gt;8/4/2008&lt;/td&gt;&lt;td&gt;8/30/2008&lt;/td&gt;&lt;td&gt;8/10/2008&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr style="border-width: thin;"&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;9/1/2008&lt;/td&gt;&lt;td&gt;9/30/2008&lt;/td&gt;&lt;td&gt;9/2/2008&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;9/3/2008&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;9/4/2008&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;And here are the calculated Hierarchical dates&lt;br /&gt;&lt;table border="2" cellpadding="0" cellspacing="0"&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr style="border-width: thick; background-color: rgb(153, 153, 153); font-weight: bold;"&gt;&lt;td&gt;CaseId&lt;/td&gt;&lt;td&gt;HierarchicalDate&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr style="border-width: thin;"&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;7/3/2008&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr style="border-width: thin;"&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;8/4/2008&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr style="border-width: thin;"&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;9/1/2008&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;So looking at the function that is used to return the scalar value, I see this:&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0??;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;??\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;??\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;??\red192\green192\blue192;}??\fs20 \cf2 CREATE FUNCTION \cf0 [dbo].[getHierarchicalDate] \par ??(\par ??\tab @CaseID \cf2 bigint\par ??\cf0 )\par ??\cf2 RETURNS datetime\par ??AS\par ??BEGIN\par ??\par ??declare\tab \cf0 @HierarchialDate \cf2 datetime\par ??declare \cf0 @ActualEnd \cf2 datetime\par ??declare \cf0 @ApprovedEnd \cf2 datetime\par ??declare \cf0 @CertifiedEnd \cf2 datetime\par ??declare \cf0 @RequestedEnd \cf2 datetime\par ??\par ??set \cf0 @ActualEnd = \par ??\tab (\cf2 select \cf0 ActualEnd \cf2 from \cf0 cases \cf2 where \cf0 caseid = @caseID)\par ??\cf2 set \cf0 @ApprovedEnd = \par ??\tab (\cf2 select \cf0 ApprovedEnd \cf2 from \cf0 cases \cf2 where \cf0 caseid = @caseID)\par ??\cf2 set \cf0 @CertifiedEnd = \par ??\tab (\cf2 select \cf0 CertifiedEnd \cf2 from \cf0 cases \cf2 where \cf0 caseid = @caseID)\par ??\cf2 set \cf0 @RequestedEnd = \par ??\tab (\cf2 select \cf0 RequestedEnd \cf2 from \cf0 cases \cf2 where \cf0 caseid = @caseID)\par ??\cf2 if \cf0 @RequestedEnd \cf2 is not null \cf0  \par ??\tab \cf2 if \cf0 @CertifiedEnd \cf2 is not null \par ??\cf0 \tab \tab \cf2 if \cf0 @ApprovedEnd \cf2 is not null \par ??\cf0 \tab \tab \tab \cf2 if \cf0 @ActualEnd \cf2 is not null \par ??\cf0 \tab \tab \tab \tab \cf2 set \cf0 @HierarchialDate = \par ??\tab \tab \tab \tab \tab (\cf2 select \cf0 ActualBegin \cf2 from \cf0 cases \par ??\tab \tab \tab \tab \tab \tab \cf2 where \cf0 caseid = @caseID)\par ??\tab \tab \tab \cf2 else\par ??\cf0 \tab \tab \tab \tab \cf2 set \cf0 @HierarchialDate = \par ??\tab \tab \tab \tab \tab (\cf2 select \cf0 ApprovedBegin \cf2 from \cf0 cases \par ??\tab \tab \tab \tab \tab \tab \cf2 where \cf0 caseid = @caseID)\par ??\tab \tab \cf2 else \par ??\cf0 \tab \tab \tab \cf2 set \cf0 @HierarchialDate = \par ??\tab \tab \tab \tab (\cf2 select \cf0 CertifiedBegin \cf2 from \cf0 cases \par ??\tab \tab \tab \tab \tab \cf2 where \cf0 caseid = @caseID)\par ??\tab \cf2 else\par ??\cf0 \tab \tab \cf2 set \cf0 @HierarchialDate = \par ??\tab \tab \tab (\cf2 select \cf0 RequestedBegin \cf2 from \cf0 cases \par ??\tab \tab \tab \tab \cf2 where \cf0 caseid = @caseID)\par ??\par ??\cf2 RETURN \cf0 @HierarchialDate\par ??\par ??\cf2 END}&lt;br /&gt;--&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;CREATE FUNCTION &lt;/span&gt;[dbo].[getHierarchicalDate] &lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;(&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @CaseID &lt;span style="color: blue;"&gt;bigint&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&lt;/span&gt;&amp;nbsp;)&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;RETURNS datetime&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;AS&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;BEGIN&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;declare&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;@HierarchialDate &lt;span style="color: blue;"&gt;datetime&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;16&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;declare &lt;/span&gt;@ActualEnd &lt;span style="color: blue;"&gt;datetime&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;17&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;declare &lt;/span&gt;@ApprovedEnd &lt;span style="color: blue;"&gt;datetime&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;18&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;declare &lt;/span&gt;@CertifiedEnd &lt;span style="color: blue;"&gt;datetime&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;19&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;declare &lt;/span&gt;@RequestedEnd &lt;span style="color: blue;"&gt;datetime&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;20&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;21&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;set &lt;/span&gt;@ActualEnd = &lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;22&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;span style="color: blue;"&gt;select &lt;/span&gt;ActualEnd &lt;span style="color: blue;"&gt;from &lt;/span&gt;cases &lt;span style="color: blue;"&gt;where &lt;/span&gt;caseid = @caseID)&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;23&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;set &lt;/span&gt;@ApprovedEnd = &lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;24&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;span style="color: blue;"&gt;select &lt;/span&gt;ApprovedEnd &lt;span style="color: blue;"&gt;from &lt;/span&gt;cases &lt;span style="color: blue;"&gt;where &lt;/span&gt;caseid = @caseID)&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;25&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;set &lt;/span&gt;@CertifiedEnd = &lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;26&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;span style="color: blue;"&gt;select &lt;/span&gt;CertifiedEnd &lt;span style="color: blue;"&gt;from &lt;/span&gt;cases &lt;span style="color: blue;"&gt;where &lt;/span&gt;caseid = @caseID)&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;27&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;set &lt;/span&gt;@RequestedEnd = &lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;28&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;span style="color: blue;"&gt;select &lt;/span&gt;RequestedEnd &lt;span style="color: blue;"&gt;from &lt;/span&gt;cases &lt;span style="color: blue;"&gt;where &lt;/span&gt;caseid = @caseID)&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;29&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;if &lt;/span&gt;@RequestedEnd &lt;span style="color: blue;"&gt;is not null &lt;/span&gt; &lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;30&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if &lt;/span&gt;@CertifiedEnd &lt;span style="color: blue;"&gt;is not null &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;31&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if &lt;/span&gt;@ApprovedEnd &lt;span style="color: blue;"&gt;is not null &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;32&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if &lt;/span&gt;@ActualEnd &lt;span style="color: blue;"&gt;is not null &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;33&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set &lt;/span&gt;@HierarchialDate = &lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;34&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;span style="color: blue;"&gt;select &lt;/span&gt;ActualBegin &lt;span style="color: blue;"&gt;from &lt;/span&gt;cases &lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;35&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;where &lt;/span&gt;caseid = @caseID)&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;36&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;37&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set &lt;/span&gt;@HierarchialDate = &lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;38&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;span style="color: blue;"&gt;select &lt;/span&gt;ApprovedBegin &lt;span style="color: blue;"&gt;from &lt;/span&gt;cases &lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;39&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;where &lt;/span&gt;caseid = @caseID)&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;40&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;41&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set &lt;/span&gt;@HierarchialDate = &lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;42&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;span style="color: blue;"&gt;select &lt;/span&gt;CertifiedBegin &lt;span style="color: blue;"&gt;from &lt;/span&gt;cases &lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;43&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;where &lt;/span&gt;caseid = @caseID)&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;44&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;45&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set &lt;/span&gt;@HierarchialDate = &lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;46&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;span style="color: blue;"&gt;select &lt;/span&gt;RequestedBegin &lt;span style="color: blue;"&gt;from &lt;/span&gt;cases &lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;47&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;where &lt;/span&gt;caseid = @caseID)&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;48&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;49&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;RETURN &lt;/span&gt;@HierarchialDate&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;50&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;51&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;END&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Yup, 8 SELECT statements.  And this was written by a developer who has been in architect roles.  Someone respected.  Someone who should know better.  So with a little adjustment, the function become this:&lt;br /&gt;&lt;!--&lt;br /&gt;{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0??;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;??\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;??\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;??\red192\green192\blue192;}??\fs20 \cf2 CREATE FUNCTION \cf0 [dbo].[getHierarchicalDate] \par ??(\par ??\tab @CaseID \cf2 bigint\par ??\cf0 )\par ??\cf2 RETURNS datetime\par ??AS\par ??BEGIN\par ??\par ??declare\tab \cf0 @HierarchialDate \cf2 datetime\par ??\par ??select \cf0 @HierarchialDate = \cf2 CASE\par ??\cf0       \cf2 WHEN \cf0 ActualEnd \cf2 IS NOT NULL and \cf0 ActualBegin \cf2 is not null \par ??\cf0 \tab \tab \cf2 THEN \cf0 ActualBegin\par ??      \cf2 WHEN \cf0 ApprovedEnd \cf2 IS NOT NULL and \cf0 ApprovedBegin \cf2 is not null \par ??\cf0 \tab \tab \cf2 THEN \cf0 ApprovedBegin\par ??      \cf2 WHEN \cf0 CertifiedEnd \cf2 IS NOT NULL and \cf0 CertifiedBegin \cf2 is not null \par ??\cf0 \tab \tab \cf2 THEN \cf0 CertifiedBegin\par ??      \cf2 WHEN \cf0 RequestedEnd \cf2 IS NOT NULL and \cf0 RequestedBegin \cf2 is not null \par ??\cf0 \tab \tab \cf2 THEN \cf0 RequestedBegin\par ??      \cf2 ELSE NULL END\par ??from\tab \cf0 [Cases] \cf2 where \cf0 caseid = @CaseID\par ??\par ??\cf2 RETURN \cf0 @HierarchialDate\par ??\par ??\cf2 END\par ??}&lt;br /&gt;--&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;CREATE FUNCTION &lt;/span&gt;[dbo].[getHierarchicalDate] &lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;(&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @CaseID &lt;span style="color: blue;"&gt;bigint&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&lt;/span&gt;&amp;nbsp;)&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;RETURNS datetime&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;AS&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;BEGIN&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;declare&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;@HierarchialDate &lt;span style="color: blue;"&gt;datetime&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;16&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;17&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;select &lt;/span&gt;@HierarchialDate = &lt;span style="color: blue;"&gt;CASE&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;18&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;WHEN &lt;/span&gt;ActualEnd &lt;span style="color: blue;"&gt;IS NOT NULL and &lt;/span&gt;ActualBegin &lt;span style="color: blue;"&gt;is not null &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;19&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;THEN &lt;/span&gt;ActualBegin&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;20&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;WHEN &lt;/span&gt;ApprovedEnd &lt;span style="color: blue;"&gt;IS NOT NULL and &lt;/span&gt;ApprovedBegin &lt;span style="color: blue;"&gt;is not null &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;21&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;THEN &lt;/span&gt;ApprovedBegin&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;22&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;WHEN &lt;/span&gt;CertifiedEnd &lt;span style="color: blue;"&gt;IS NOT NULL and &lt;/span&gt;CertifiedBegin &lt;span style="color: blue;"&gt;is not null &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;23&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;THEN &lt;/span&gt;CertifiedBegin&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;24&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;WHEN &lt;/span&gt;RequestedEnd &lt;span style="color: blue;"&gt;IS NOT NULL and &lt;/span&gt;RequestedBegin &lt;span style="color: blue;"&gt;is not null &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;25&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;THEN &lt;/span&gt;RequestedBegin&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;26&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;ELSE NULL END&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;27&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;from&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[Cases] &lt;span style="color: blue;"&gt;where &lt;/span&gt;caseid = @CaseID&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;28&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;29&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;RETURN &lt;/span&gt;@HierarchialDate&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;30&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;31&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;END&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;So we're down to one SELECT statement.  One table scan.  All because nobody took a step back to ask "is there a better way".  This is something that seems to prevalent in our industry.  Nobody wants to admit they are over their head, that they don't know everything, that someone else might have a better solution. I don't have the answers, so I'd love to hear any feedback.&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://blog.paulmontgomery.name/feeds/3042305296013325397/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://www.blogger.com/comment/fullpage/post/5069259786554685989/3042305296013325397" rel="replies" title="1 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/3042305296013325397" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/3042305296013325397" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2008/07/when-good-coders-write-bad-code.html" rel="alternate" title="When good coders write bad code." type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-396692327797190043</id><published>2008-06-17T22:47:00.002-04:00</published><updated>2008-06-17T22:50:59.414-04:00</updated><title type="text">Software Development Meme</title><content type="html">Ok,ok,ok... &lt;a href="http://blog.stevehorn.cc/2008/06/software-development-meme.html"&gt;Foreman Bob/Steve Horn&lt;/a&gt; called me out on not have posted a meme on my personal coding history. &amp;lt;meme&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How old were you when you first started programming?&lt;/b&gt;&lt;br /&gt;I'm not sure if it was 3rd or 4th grade that I started coding in BASIC on an Apple IIe for about 3 months.  Much of it was minor tweaks to "busy-work" type applications.&lt;br /&gt;&lt;br /&gt;I pretty much gave up on coding for quite a while.  Games were much more interesting (NES was recently released and I &lt;3 8-bit graphics).  During my sophmore year in high school (1995), I caught wind of this "series of tubes" and picked up HTML for a class project.  Designing the school's webpage... and using the much loved nested tables and shim images.  &lt;br /&gt;&lt;br /&gt;I continued web development through college  even though I changed majors out of the CS department becuase it was all console UNIX C/C++.  The IT degree, yes that's &lt;a href="http://www.ohio.edu/industrialtech/index.cfm"&gt;INDUSTRIAL Technology&lt;/a&gt; had the VBA and ASP courses.  As an added bonus, I got to cut and melt things.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What was your first language?&lt;/b&gt;&lt;br /&gt;I really don't want to say BASIC as it was mostly copy from book and tweak parameters.  So, I'll go with the safe bet and say HTML.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What languages have you used since youstarted programming?&lt;/b&gt;&lt;br /&gt;BASIC, HTML, JavaScript, PASCAL, C, C++, VB/VBA/VBScript, PL/SQL, T-SQL, WiseScript, InstallScript, VB.Net, C#, WinBatch, AJAX.  Also, a bit of G-Code and whatever Rockwell Automation PLC's use.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What was your first professional programming gig?&lt;/b&gt;&lt;br /&gt;That would be working at Ohio University to earn beer money.  I had moved up from help desk to NT administration.  This required writing batch files, VBScripts to automate system setup and configuration.  Somehow, it also involved creating the department websites.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;If you knew then what you know now, would you have started programming?&lt;/b&gt;&lt;br /&gt;Actually, I would have started programming earlier.  I would have hopped into programming without the time suck of Infrastructure Operations until I "paid my dues".&lt;br /&gt;&lt;br /&gt;&lt;b&gt;If there is one thing you learned along the way that you would tell new developers, what would it be?&lt;/b&gt;&lt;br /&gt;Be a jack of all trades and a master of (at least) one.  You'll need to have a little bit of knowledge in many subjects to be adaptable but find a niche and be the subject matter expert in that area.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What's the most fun you've ever had ... programming?&lt;/b&gt;&lt;br /&gt;Somehow, its the projects that are the most annoying at the time that are the most fun in retrospect.  But I'd probably have to go with tweaking out TFS with ASMX subscriptions to trigger automated builds, customizations, and deployments.  Spinning up a managed instance of MSBuild engine when everyone else is running powershell makes me giddy.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Next up&lt;/b&gt;&lt;br /&gt;&lt;a href="http://gregbahrey.blogspot.com/"&gt;Greg Bahrey&lt;/a&gt;&lt;br /&gt;&lt;a href="http://arnulfowing.blogspot.com/"&gt;Arnulfo Wing&lt;/a&gt;&lt;br /&gt;&lt;a href="http://danshultz.blogspot.com/"&gt;Dan Shultz&lt;/a&gt;&lt;br /&gt;&lt;a href="http://govorin.blogspot.com/"&gt;Alexey Govorine&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/meme&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://blog.paulmontgomery.name/feeds/396692327797190043/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://www.blogger.com/comment/fullpage/post/5069259786554685989/396692327797190043" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/396692327797190043" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/396692327797190043" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2008/06/software-development-meme.html" rel="alternate" title="Software Development Meme" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-3558462807587939020</id><published>2008-06-10T13:13:00.001-04:00</published><updated>2008-06-10T13:13:46.339-04:00</updated><title type="text">Rick Kierner renames SharePoint inside a Virtual Machine</title><content type="html">&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://blog.paulmontgomery.name/feeds/3558462807587939020/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://www.blogger.com/comment/fullpage/post/5069259786554685989/3558462807587939020" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/3558462807587939020" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/3558462807587939020" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2008/06/rick-kierner-renames-sharepoint-inside.html" rel="alternate" title="Rick Kierner renames SharePoint inside a Virtual Machine" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5069259786554685989.post-1332320509244952935</id><published>2008-06-10T13:11:00.000-04:00</published><updated>2008-06-10T13:12:42.212-04:00</updated><title type="text">Chad Myers Rules of Consulting</title><content type="html">Great info on having the right mindset for consulting.&lt;div class="blogger-post-footer"&gt;&lt;script expr:src='"http://feeds.feedburner.com/~s/BetterLivingThroughCoding?i=" + data:post.url' type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;</content><link href="http://blog.paulmontgomery.name/feeds/1332320509244952935/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://www.blogger.com/comment/fullpage/post/5069259786554685989/1332320509244952935" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/1332320509244952935" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5069259786554685989/posts/default/1332320509244952935" rel="self" type="application/atom+xml"/><link href="http://blog.paulmontgomery.name/2008/06/chad-myers-rules-of-consulting.html" rel="alternate" title="Chad Myers Rules of Consulting" type="text/html"/><author><name>paul</name><uri>http://www.blogger.com/profile/13327826205835943203</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry></feed>