<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8424469681532772295</id><updated>2012-01-29T14:47:32.591-05:00</updated><category term='MSDN'/><category term='Microsoft'/><category term='office'/><category term='software'/><category term='ajax'/><category term='browser'/><category term='development'/><category term='services'/><category term='architecture'/><category term='SSIS'/><category term='software SharePoint'/><category term='exchange'/><category term='Google'/><title type='text'>Sometimes Words Mean Something</title><subtitle type='html'>Words by Curtis Koppang</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-3030320421540829267</id><published>2012-01-03T15:53:00.001-05:00</published><updated>2012-01-03T15:55:23.306-05:00</updated><title type='text'>Social Media</title><content type='html'>Today I found myself pontificating on Facebook, Google+, LinkedIn, Twitter and other more real time social media sites.&amp;nbsp; I think they differ from blogging which can be more informational or narrative.&amp;nbsp; Not that I am against any of them and find uses (even if just pure entertainment) for each.&amp;nbsp; On occasion.&amp;nbsp; As a content creator though, I suck.&amp;nbsp; I know that I have lots of content, just that I also have two big restrictions.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Time&lt;/li&gt;&lt;li&gt;Firewall&lt;/li&gt;&lt;/ol&gt;When it comes to time I am not saying that I don't have enough; just that these things just don't rate high enough for me to spend time doing them.&amp;nbsp; When I have a few minutes or when something is sticking with me such that I know that writing about it will help me move forward - well then I make time.&amp;nbsp; But I am not in content creation business.&amp;nbsp; Nor does my business directly benefit from any of these.&amp;nbsp; Which brings me to the second restriction - the firewall.&lt;br /&gt;&lt;br /&gt;The firewall is not the physical firewall here at work.&amp;nbsp; In fact I am currently at work and&amp;nbsp;have 10 mins before my next meeting and decided to spend it quickly writing this post.&amp;nbsp; No the firewall is the policy that we have here at work to not write anything about work.&amp;nbsp; I understand the policy and certainly abide by it.&amp;nbsp;&amp;nbsp; But it is restrictive.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;I wonder what a world without this restriction would be like?&amp;nbsp; Certainly those who believe in the virtues of social networking think that it would be better.&amp;nbsp; Me I am not so sure.&amp;nbsp; I see both sides.&amp;nbsp; I certainly see how me writing about the cool stuff we are doing would help the image of the company and possibly help attract talent.&amp;nbsp; On the other hand it does not take but one bad apple (or post) to be taken out of context and watch the fireworks.&amp;nbsp; Bad image.&amp;nbsp; Litigation.&amp;nbsp; All thing that I believe scare the company and cause it have a blackout policy.&lt;br /&gt;&lt;br /&gt;Not to mention that I work for an investment firm and there is the whole insider trading kinds of issues.&lt;br /&gt;&lt;br /&gt;Restrictions aside, time is really the bigger reason I don't do more.&amp;nbsp; Nuff said.&amp;nbsp; 3 mins left before my meeting; think of the possibilities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-3030320421540829267?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/3030320421540829267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=3030320421540829267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/3030320421540829267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/3030320421540829267'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2012/01/who-has-time-for.html' title='Social Media'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-8824251926969843389</id><published>2011-12-29T06:51:00.005-05:00</published><updated>2011-12-29T10:25:52.344-05:00</updated><title type='text'>Humility and Confidence</title><content type='html'>Humility and Confidence are two words that have been rolling around in my head lately.  In this post I am going to let these two play out here and see what I end up with;  I have no idea where this is going.&lt;br /&gt;&lt;br /&gt;This was inspired by my closing comment in my previous post - that I still have so much to learn.  This was not meant to be a statement of self judgment but one of humility; especially as it pertains to leadership.  The day that I believe that this statement is less true is the day that my ego is in control and I will be a less effective leader.  Not to be confused with confidence.  Confidence is knowing that things are going to be OK.   Unfortunately confidence is mistaken by many as something more than just know that things are going to work out and it is used to boost/elevate the Self.&lt;br /&gt;&lt;br /&gt;Confidence is experiential - Humility is constant.   Confidence that is not based on experience is not solid and will not be trusted.  The people around you will know this and their tentativeness will be palpable; that is if you are paying attention.  But someone in this state will not be paying close enough attention; rather this person will be expending a lot of energy trying to show or justify the position that they will miss signals.  The way to combat this is by being honest with people when you are not confident.  That is not to say that you freak out and run out the room screaming.  But rather you turn to people and say something to the extent – “I have never encountered something like this before – what would you do?”   In other words show some humility.&lt;br /&gt;&lt;br /&gt;This is where it gets tricky.  First off, being a good leader means that you are doing this quite a bit already.  You should be allowing people to contribute by being part of the decision making process and then empowering them to act.  Good leaders do not do everything themselves.  Every time I get to this point in my thinking of remember one of the tenants from “What Got You Here…” – Don’t add too much value.  Secondly, statements like this need to couched in some sort of decision making “process” (I am using the work process lightly).  Be very clear in your own thinking that statements like this can lead to a sense of anarchy or distributed decision making; this is not about abdicating or stealing the decision making process.  Someone still needs to own the decision or you can end up on an endless discussion or debate.  Also you need be very clear when the decision has been made; believe it or not this can be hard.  I can’t tell you how many times I have seen a decision made and people don’t realize it and bad things happen from there (maybe something to address a subsequent post).&lt;br /&gt;&lt;br /&gt;So back to our my statement and the key aspect of it that shows humility is the prefix – that you are being humble by acknowledging you don’t “know” the answer.  But you are not faking that you do.  Take the same statement without the prefix – “What would you do?”  Depending upon the person this statement can be taken a bunch of ways.  Every day I deal with people in different states and to a “paranoid” lonely statement could mean something different than it does to someone who is “competitive”.  I believe that peoples states mostly boil down to trust – trust in me and trust in themselves (how are they different &lt;wink&gt;).   When I exhibit humility it helps reinforce trust.  Is there a guarantee?  Nope.   Some people have some core trust issues and this is a drop in the ocean to helping that.  But hey, before there where oceans there had to be that first drop.&lt;br /&gt;&lt;br /&gt;Humility goes so much further than what I have mentioned here.  In fact I believe that humility instills confidence.  Have you ever been around a humble person and felt a difference?  Are you more relaxed?  I believe so.  I believe that I am more likely to value humility in a leader than just pure confidence.  I have worked with some way smarter people over the years and nothing was more of a turnoff than confidence with no humility.  When working with someone like this I did not feel that there was anything in it for me; they just “knew” what the right thing to do was and made the call.  Often times they were right or close; but how invested was I in that decision?  How likely would I be to work hard to see it through the challenges?  How much did I learn from the experience?&lt;br /&gt;&lt;br /&gt;See the difference? &lt;br /&gt;&lt;br /&gt;Lastly, humility has another aspect worth mentioning.  I find that there is another aspect of humility that characterizes good leaders – they give a lot of credit to those around them.  They take (or assign) responsibility and ownership for the decision but give clear credit to those who contributed to the decision.  This is easy to recognize and gets my attention very quickly; regardless of whether I am the person being acknowledged or now.&lt;br /&gt;&lt;br /&gt;So how good am I at this?  I can certainly do better.  I know that&lt;br /&gt;&lt;br /&gt;PS.  I feel like there are aspects to these two words that I want to address in the future that I in some way touched on above; but will wait for a future post to explore.&lt;/wink&gt;&lt;br /&gt;&lt;wink&gt;&lt;/wink&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Confidence is situational – Humility is not.&lt;/li&gt;&lt;li&gt;Confidence is shakable - Humility is solid.  &lt;/li&gt;&lt;li&gt;Something about Humility being timeless.&lt;/li&gt;&lt;li&gt;Attributes of healthy confidence vs less healthy? &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-8824251926969843389?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/8824251926969843389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=8824251926969843389' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/8824251926969843389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/8824251926969843389'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2011/12/humility-and-confidence.html' title='Humility and Confidence'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-5704906819900457595</id><published>2011-12-27T09:52:00.002-05:00</published><updated>2011-12-27T10:19:58.123-05:00</updated><title type='text'>What a year!</title><content type='html'>Was just reviewing my last post (which began similarly) and it ended with reference to changes in leadership in my department.  Those changes continued to snowball and culminated with me landing a new position on the leadership team.  The last year has consisted of me figuring out what this new job is and how I can do it.  I just finished my self appraisal so it can say that it has been a difficult year.  The transition has not been easy for me or my extended team.  We changed many things in the organization this year and it has had some significant impacts.  Every day I get up and keep my eye on the big vision of what we are trying to do and figure out how to make course corrections to get us there.  Unfortunately it feels like I am using a spoon to do it sometimes.  Yes, I am the one picking up the spoon thinking it will help and realizing that it is just the wrong "tool".  Rookie mistakes abound.  Last week I was reading an article from the Harvard Biz Review called "Why Should Anyone Be Led By You?" and it was pretty intimidating.  Geez, I have a lot to learn.&lt;br /&gt;&lt;br /&gt;For what it's worth here are some new books "on the shelf"...&lt;br /&gt;1. What Got You Here Won't Get You There&lt;br /&gt;2. The Leadership Moment&lt;br /&gt;3. Crucial Conversations&lt;br /&gt;4. True North&lt;br /&gt;5. The Zen of Listening&lt;br /&gt;6. Nice Teams Finish Last&lt;br /&gt;7. The World Is Flat&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-5704906819900457595?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/5704906819900457595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=5704906819900457595' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/5704906819900457595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/5704906819900457595'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2011/12/what-year.html' title='What a year!'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-8356713239396514508</id><published>2010-10-04T18:17:00.002-04:00</published><updated>2010-10-04T18:45:19.680-04:00</updated><title type='text'>Dry Spell</title><content type='html'>I took a long break from blogging.  Looking Back it has been 7 months!  I felt like I was on a role at the beginning of the year.  No resolution, just had the time to put down what I was thinking.&lt;br /&gt;&lt;br /&gt;I also can't help but notice it has been raining here in New England off and on for over a week.  I believe I heard some weather man announce that the drought is officially over.  So what better reason to end my blogging drought.  They lasted almost the same length of time.&lt;br /&gt;&lt;br /&gt;Then everything changed.  On the personal side I proposed to a great woman and her two girls.  Blink - instant family.  Trying to sell a house.  Get someone off to college.  Plan a wedding.  Buy a house.  Oh yeah, then the other half of my life changed - work.&lt;br /&gt;&lt;br /&gt;At work I suddenly found myself taking on the roles of at least three people.  I had my old responsibilities as the Lead Application Architect.  Then suddenly I owned every server in the organization.  More on that later.  Lastly we let the person go who as going to build out our SharePoint environment and move the organization to better collaboration (whatever that means).  Yes you guessed it...I inherited that as well.  At least SharePoint is not a far cry from the application space.  But I not only owned the implementation but also the infrastructure.  I don't know if anyone has peeked under the covers at SharePoint 2007, but it's huge. &lt;br /&gt;&lt;br /&gt;As near as I can tell this product is made up of at least 3 other products that were glued together to make a single product.  Which means they loosely fit together; they are unified but not really.  Wow, what a pain to keep this thing running.  I am sure that part of the complexity of our configuration is that they guy who put it together knew SharePoint really well and I don't.  So he build out something that will fully support the organization for many years and growth; but only if he was here to keep in running.  This is not a job for someone who does this part time!&lt;br /&gt;&lt;br /&gt;Today it was announced that the CTO/CIO of our organization "is leaving to pursue other interests".  This always sounds to me like it was clear that he was not longer welcome at the party. Whatever the reason, it won't mean more blogging.  Guess that means that the one or two of you that actually read this will have to continue to live with disappointment.&lt;br /&gt;&lt;br /&gt;;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-8356713239396514508?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/8356713239396514508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=8356713239396514508' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/8356713239396514508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/8356713239396514508'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2010/10/dry-spell.html' title='Dry Spell'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-1437050962458941121</id><published>2010-03-07T20:03:00.002-05:00</published><updated>2010-03-07T20:26:22.169-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><title type='text'>Step Away From the Keyboard</title><content type='html'>&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;o:officedocumentsettings&gt;   &lt;o:allowpng/&gt;  &lt;/o:OfficeDocumentSettings&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:trackmoves&gt;false&lt;/w:TrackMoves&gt;   &lt;w:trackformatting/&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:drawinggridhorizontalspacing&gt;18 pt&lt;/w:DrawingGridHorizontalSpacing&gt;   &lt;w:drawinggridverticalspacing&gt;18 pt&lt;/w:DrawingGridVerticalSpacing&gt;   &lt;w:displayhorizontaldrawinggridevery&gt;0&lt;/w:DisplayHorizontalDrawingGridEvery&gt;   &lt;w:displayverticaldrawinggridevery&gt;0&lt;/w:DisplayVerticalDrawingGridEvery&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:dontautofitconstrainedtables/&gt;    &lt;w:dontvertalignintxbx/&gt;   &lt;/w:Compatibility&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="276"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt; &lt;style&gt; &lt;!--  /* Font Definitions */ @font-face  {font-family:Cambria;  panose-1:2 4 5 3 5 4 6 3 2 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;}  /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-parent:"";  margin-top:0in;  margin-right:0in;  margin-bottom:10.0pt;  margin-left:0in;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:"Times New Roman";  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Cambria;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} @page Section1  {size:8.5in 11.0in;  margin:1.0in 1.25in 1.0in 1.25in;  mso-header-margin:.5in;  mso-footer-margin:.5in;  mso-paper-source:0;} div.Section1  {page:Section1;} --&gt; &lt;/style&gt; &lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */ table.MsoNormalTable  {mso-style-name:"Table Normal";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-parent:"";  mso-padding-alt:0in 5.4pt 0in 5.4pt;  mso-para-margin-top:0in;  mso-para-margin-right:0in;  mso-para-margin-bottom:10.0pt;  mso-para-margin-left:0in;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:"Times New Roman";  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"Times New Roman";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;!--StartFragment--&gt;  &lt;p class="MsoNormal"&gt;My career has been undergoing a sea change lately.&lt;span style=""&gt;  &lt;/span&gt;I am doing much less programming and more SharePoint.&lt;span style=""&gt;  &lt;/span&gt;Not just SharePoint as a technology but applications/solutions built on SharePoint.&lt;span style=""&gt;  &lt;/span&gt;Sure I may need a little code to pull something together, but not as much as I once was writing.&lt;span style=""&gt;  &lt;/span&gt;Not to mention that I am being asked to take on more management responsibilities.&lt;span style=""&gt;  &lt;/span&gt;On one hand this feels like a bit of a “promotion” on the other hand I feel myself slipping further away from the truly technical side of things.&lt;span style=""&gt;  &lt;/span&gt;Which is kinda scary.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Up until the last year or so; I have been pretty technical.&lt;span style=""&gt;  &lt;/span&gt;But now I find those MSDN magazines piling up on the nightstand.&lt;span style=""&gt;   &lt;/span&gt;I just read some of my favorite programmer blogs and just scan the code.&lt;span style=""&gt;  &lt;/span&gt;Sure I understand what and why these guys are doing, but I am not doing it myself.&lt;span style=""&gt;  &lt;/span&gt;I used to be coming up with patterns like this myself and now I just read about them.&lt;span style=""&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Being technical is a great security blanket; don’t like what your doing or where you are doing it?&lt;span style=""&gt;  &lt;/span&gt;Just leave and go someplace &lt;span style="font-style: italic;"&gt;better&lt;/span&gt;.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;It does not feel like that now; things are starting to pass me by.&lt;span style=""&gt;  &lt;/span&gt;Ouch.&lt;span style=""&gt;  &lt;/span&gt;It’s chilly without my binky.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Since I have a lot to learn in this new role, whatever you want to call it; I will probably have to be with my current position for some time while I figure out the patterns for doing &lt;i style=""&gt;this&lt;/i&gt; job.&lt;span style=""&gt;  &lt;/span&gt;Doh!&lt;span style=""&gt;  &lt;/span&gt;What do you mean I can’t leave?&lt;span style=""&gt;  &lt;/span&gt;I have to stay and learn this stuff no matter what? &lt;span style=""&gt; &lt;/span&gt;Doh! &lt;span style=""&gt; &lt;/span&gt;Doh!&lt;/p&gt;  &lt;!--EndFragment--&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-1437050962458941121?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/1437050962458941121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=1437050962458941121' title='38 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/1437050962458941121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/1437050962458941121'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2010/03/step-away-from-keyboard.html' title='Step Away From the Keyboard'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>38</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-4096164205704436970</id><published>2010-02-28T17:30:00.002-05:00</published><updated>2010-02-28T17:40:59.458-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Finally finished an entry from 2008...</title><content type='html'>&lt;a href="http://ckoppang.blogspot.com/2008/08/is-yukon-cornelius-architect.html"&gt;Is Yukon Cornelius an Architect?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-4096164205704436970?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/4096164205704436970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=4096164205704436970' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/4096164205704436970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/4096164205704436970'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2010/02/finally-finished-entry-from-2008.html' title='Finally finished an entry from 2008...'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-1500682259737577990</id><published>2010-02-11T14:13:00.003-05:00</published><updated>2010-02-11T14:18:40.434-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Is Google the New Microsoft?</title><content type='html'>&lt;span xmlns=""&gt; &lt;p&gt;&lt;span style="font-family:Georgia;font-size:12;"&gt;I just got an email from Google on a new "feature" that is integrated into the gmail client; called Buzz. At first glance this looks and feels a lot like Facebook. So it got me thinking… &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Georgia;font-size:12;"&gt;Is Google starting to feel like the next Microsoft? Is this path something Google is consciously trying to do or is it just a path that is inevitable?&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Georgia;font-size:12;"&gt;First, a full disclosure. [&lt;em&gt;I like both these company's technologies. I used to work for Microsoft and I still have a Microsoft technology bias (but I do own a MacBook). And my primary email account is my Google account and I own an Android phone. Phew, so now that I got that off my chest here is what I mean.&lt;/em&gt;]&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="font-family:Georgia;font-size:12;"&gt;There are at least four ways I have seen recently that made me want to write this blog entry...&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:Georgia;font-size:12;"&gt;Leapfrog Innovation&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Georgia;font-size:12;"&gt;Purchase Innovation.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Georgia;font-size:12;"&gt;ABG (anything but Google).&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Georgia;font-size:12;"&gt;All these lead to one thing...can you say Antitrust.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:Georgia;font-size:12;"&gt;Leapfrog Innovation. I consider taking a good idea and making better - innovation. I am all for companies that can make something better than their competition; whether they came up with original idea is just an excuse the losers use. Of course if you use your size and power as a way of strong arming your friends and enemies – that's a whole other story. Certainly Microsoft had some questionable practices back in the day. My whole take on that was stop the "packaging" and just make your software kick ass.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Georgia;font-size:12;"&gt;Purchase Innovation. This is a perfectly legitimate way of larger companies using their size and power (aka capital) to buy an innovator or a market leader. One of the companies I started had as a hidden part of the business plan to get bought out. I used to talk to a number of other people who were doing similar things who would admit the same goal to me. Google is just the new guy with all the money.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Georgia;font-size:12;"&gt;ABG. This reminds me of the Anything But Microsoft movement 10 years (maybe more now). I think this just comes down to people not liking really big companies; probably because they don't trust them as much or just don't identify with them. In both cases of these company's respective histories they have been underdogs and people heralded their greatness. Then at some inflection point all that changes. There is probably more written on this than I care to read.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Georgia;font-size:12;"&gt;Antitrust. Obama's antitrust czar and the EU are looking into this. Watch out. It was the combination of the Internet bubble and the antitrust rulings against Microsoft that caused the stock to tumble where it has been for the past 8 years (or so). As fortune would have it that is also right around the time that I looked like a financial genius and cashed in my options. The truth is that I had to cash them in and resemblance of genius was actually pure coincidence.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-1500682259737577990?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/1500682259737577990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=1500682259737577990' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/1500682259737577990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/1500682259737577990'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2010/02/is-google-new-microsoft.html' title='Is Google the New Microsoft?'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-7905575761934075860</id><published>2010-02-11T08:59:00.004-05:00</published><updated>2010-02-11T09:18:06.892-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='exchange'/><title type='text'>Exchange Can Learn Something From TiVo</title><content type='html'>I am trying to book a reoccurring meeting in Exchange. This meeting happens every two weeks and needs to be in a room with a screen/projector with enough room to hold 15+ people. There are very few rooms we have access to that fit this requirement (3). And to book a meeting so far out into the future, I am bound to bump up against some collisions.&lt;br /&gt;&lt;br /&gt;When I book the room for the next year and there is one day where there is a collision, Exchange fails the entire booking. So now what do I do? To make it worse there are 3 days that collide spread across the year. So now I have to book the room up to the first collision (because I don't want to do them one at a time) and then skip that day. Continue doing this around all the collisions and then go back and find a different room for the exceptions. Ugh. Lots of work.&lt;br /&gt;&lt;br /&gt;Now heaven forbid that I actually invited all the attendees while doing this. I used to and their heads would be spinning by the end of this since they would see all these changes and exceptions arriving. Oh and by the way, if you want to add someone new to this whole mess - it's nearly impossible.&lt;br /&gt;&lt;br /&gt;Enter TiVo. When I schedule a Season Pass (reoccurring recording) it tells me all the collisions and what it's going to do. But it will keep the Season Pass and just not record some showings. In fact it will go one step further to try and find a time when an episode that lost in the collision may be showing later in the week. But at least I only need to do something around the collisions/exceptions - much more friendly!&lt;br /&gt;&lt;br /&gt;I can only hope that this has already been "fixed" in a more recent version of Exchange; I would not know since we are at least one version behind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-7905575761934075860?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/7905575761934075860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=7905575761934075860' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/7905575761934075860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/7905575761934075860'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2010/02/exchange-can-learn-something-from-tivo.html' title='Exchange Can Learn Something From TiVo'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-7507436280103097589</id><published>2010-01-19T09:43:00.002-05:00</published><updated>2010-01-19T09:51:22.047-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='office'/><title type='text'>PowerPoint Linking to Excel Issue</title><content type='html'>&lt;span style="LINE-HEIGHT: 115%; FONT-FAMILY: 'Calibri', 'sans-serif'; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-bidi-: EN-USfont-family:'Times New Roman';font-size:11;"  &gt;When updating a link (right click Update Link) or editing a linked object (double click on the object) in PowerPoint the user receives a dialog box (shown below) stating “The linked file was unavailable and can’t be updated"&lt;/span&gt; .  Here is a document I wrote that describes how to fix this issue.  We encountered this issue in Excel 2007 sp2.&lt;br /&gt;&lt;span style="LINE-HEIGHT: 115%; FONT-FAMILY: 'Calibri', 'sans-serif'; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-bidi-: EN-USfont-family:'Times New Roman';font-size:11;"  &gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe style="PADDING-BOTTOM: 0px; BACKGROUND-COLOR: #fcfcfc; PADDING-LEFT: 0px; WIDTH: 98px; PADDING-RIGHT: 0px; HEIGHT: 115px; PADDING-TOP: 0px" title="Preview" marginheight="0" src="http://cid-efba567b5e7af54d.skydrive.live.com/embedicon.aspx/Public/PowerPoint%20Linking%20to%20Excel%20Issue.doc" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-7507436280103097589?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/7507436280103097589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=7507436280103097589' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/7507436280103097589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/7507436280103097589'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2010/01/powerpoint-linking-to-excel-issue.html' title='PowerPoint Linking to Excel Issue'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-3878640056932554685</id><published>2010-01-14T13:56:00.003-05:00</published><updated>2010-01-19T19:19:09.666-05:00</updated><title type='text'>New OLEDB Provider for Reading Excel 2007</title><content type='html'>I work for a financial company that uses alot of Excel. Many of the the business users here practically live in it. So we are constantly trying to figure out how to leverage Excel in our applications.&lt;br /&gt;&lt;br /&gt;Do we just export data to Excel? If so, then is it a snapshot/copy of the data or do we build a connection to the backend data? What about importing data? Where is the boundry between using VBA and VSTO? Then if we pile SharePoint and Excel Services on this heap it starts to get really interesting.&lt;br /&gt;&lt;br /&gt;One of our technical frustrations has been the OLEDB driver for reading Excel on the server was fairly lame. It made alot of assumptions about the data that made it nearly unusable except in the simpliest cases. Last week I found this updated Provider for Excel 2007 and I am looking forward to giving it a deeper look. What I can say is, that it did read in all my data rather easily. I just have not had time to play around the fringes much.&lt;br /&gt;&lt;br /&gt;Download details: 2007 Office System Driver: Data Connectivity Components&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=7554F536-8C28-4598-9B72-EF94E038C891&amp;amp;displaylang=en"&gt;href="http://www.microsoft.com/downloads/details.aspx?FamilyID=7554F536-8C28-4598-9B72-EF94E038C891&amp;amp;displaylang=en&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-3878640056932554685?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/3878640056932554685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=3878640056932554685' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/3878640056932554685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/3878640056932554685'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2010/01/new-oledb-provider-for-reading-excel.html' title='New OLEDB Provider for Reading Excel 2007'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-3360392601088080282</id><published>2010-01-06T07:22:00.001-05:00</published><updated>2010-01-06T07:22:26.424-05:00</updated><title type='text'>This made me laugh</title><content type='html'>&lt;span xmlns=''&gt;&lt;p&gt;A friend I have not heard from in a couple months sent me an email yesterday with this as the subject.  Yeah the subject!  After I stopped laughing, I opened the email.  Thought I would share this one…&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Ninjas are mammals. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Ninjas fight ALL the time. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;The purpose of the ninja is to flip out and kill people.&lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-3360392601088080282?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/3360392601088080282/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=3360392601088080282' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/3360392601088080282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/3360392601088080282'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2010/01/this-made-me-laugh.html' title='This made me laugh'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-4052064406731270829</id><published>2010-01-05T08:56:00.001-05:00</published><updated>2010-01-05T09:44:33.643-05:00</updated><title type='text'>UI Testing</title><content type='html'>I spent a bunch of time in the early Windows days trying to do UI testing the way this (&lt;a href="http://blog.objectmentor.com/articles/2010/01/04/ui-test-automation-tools-are-snake-oil"&gt;UI Test Automation Tools are Snake Oil&lt;/a&gt;) blog entry talks about. Like him (or his clients) we used some really expensive tools and ended up not doing a very good job. I really like the thinking Michael is doing here. This is definately where my head is at. The problem is that I am struggling with creating MVC-style applications.&lt;br /&gt;&lt;br /&gt;Where I work now we just don't build big applications. Instead we have lots of small applications that we deliver in weeks not months or years. I have not found this pattern of doing software very condusive for building applications with lots of design. Now hold on a minute - that does not mean we don't do design. We just don't do lots of design. When an application is very small how much design do you really need to do? Most of the applications tend to look like each other - read some data...munge it together...display it.  We don't do much data entry; which is an exception in the pattern of apps I have built over the years.&lt;br /&gt;&lt;br /&gt;That is not to say we don't have some big-ish applications.  We do.  Just that they are the exception.  Could they do with more engineering?  Absolutely!  But we just don't have the infrastructure (staff, mindshare, experience, etc) to do it that way.  Of course there are people doing a high level of engineering here.  It's just that it's not everyone - it's not our default.&lt;br /&gt;&lt;br /&gt;At first this was a hard pill to swallow (and it still makes me a little gassy at times).  But it's the nature/culture of the way we do things.  It's a model that works, but not in a scaleable way.  Sharing anything in this model is very hard - maybe I will blog later about how we do that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-4052064406731270829?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/4052064406731270829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=4052064406731270829' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/4052064406731270829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/4052064406731270829'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2010/01/ui-testing.html' title='UI Testing'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-3704017909774502477</id><published>2010-01-04T10:30:00.002-05:00</published><updated>2010-01-04T10:32:29.604-05:00</updated><title type='text'>Old Problem – New Context</title><content type='html'>&lt;span xmlns=""&gt; &lt;p&gt;&lt;span style="font-family:Georgia;font-size:12;"&gt;&lt;em&gt;[Here is an old post I found that I had never published. I think it's because I could not get the formatting of the code to look "right". This time I published from Word and the formatting was still not preserved - rats! Also, the article is not as complete as I would like it but I wanted to get the code into the blogosphere.]&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Georgia;font-size:12;"&gt;&lt;em&gt;[There are a few technical things wrong with this post. The first is that using Thread Local Storage is risk (at best) in an ASP.NET application. See &lt;a href="http://www.hanselman.com/blog/CommentView.aspx?guid=320"&gt;http://www.hanselman.com/blog/CommentView.aspx?guid=320&lt;/a&gt;. The second is that I would prefer to use a different pattern than the one below; something a little more elegant. Lastly, after using LINQ much more I don't know that this code is even a best practice; I need to noodle on this more.]&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Georgia;font-size:12;"&gt;I keep thinking that there are like a dozen or so abstract problems that I solve and everything else is just another derivation from those. This is one of those dozen problems – what is context and why do we need it so often?&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Georgia;font-size:12;"&gt;We have been using a lot of LINQ lately. While using LINQ to SQL I ran into a problem a few weeks ago and created a little hack to work around it. Well we are starting to roll LINQ out to the rest of the developers we need more than a hack for this issue. What is the issue, well it's the same we have had in the last 4 ADO stacks - how do I reuse a connection when I have a transaction open. The only time I have not had to work around this issue was in MTS/MTX and when we used the Microsoft Enterprise Library (EntLib)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Georgia;font-size:12;"&gt;The way MTX and EntLib get around this is that they are a "layer" in between me (you) and the underlying infrastructure. I remember Bernie's old saying - "Interesting things can happen when you can get in between things". Another way of saying that layers or interception are something that are a key part of any design.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Georgia;font-size:12;"&gt;&lt;br /&gt;So here is what I want the client/consuming code to look like.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;const&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; CN = &lt;span style="color:#a31515;"&gt;"Server=localhost;Database=AdventureWorks2008;Trusted_Connection=true"&lt;/span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; (var aTrx = &lt;span style="color:blue;"&gt;new&lt;/span&gt; TransactionScope())&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;var aCtx = &lt;span style="color:blue;"&gt;new&lt;/span&gt; AdventureWorksDataContext(CN);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;var x = from p &lt;span style="color:blue;"&gt;in&lt;/span&gt; aCtx.Persons&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;where p.FirstName.StartsWith(&lt;span style="color:#a31515;"&gt;"A"&lt;/span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;select p;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;var y = x.First();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;var aCtx2 = &lt;span style="color:blue;"&gt;new&lt;/span&gt; AdventureWorksDataContext(CN);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;var x2 = from p &lt;span style="color:blue;"&gt;in&lt;/span&gt; aCtx2.Persons&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;where p.FirstName.StartsWith(&lt;span style="color:#a31515;"&gt;"A"&lt;/span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;select p;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;var y2 = x2.First();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Georgia;font-size:12;"&gt;So I wrote a little class that caches the connections so that they can be reused across LINQ statements. If we don't do it this way then we are invoking the Distributed Transaction Coordinator (DTC). We only want to do this when the statements need to be in the same transaction.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;static&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#2b91af;"&gt;TransactionalDataContext&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;[ThreadStatic]&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;static&lt;/span&gt; Hashtable mConnections;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;static&lt;/span&gt; IDbConnection DataContext(&lt;span style="color:blue;"&gt;string&lt;/span&gt; pCnStr)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; aTrx = Transaction.Current;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (aTrx == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; CreateConnection(pCnStr);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (mConnections == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;mConnections = &lt;span style="color:blue;"&gt;new&lt;/span&gt; Hashtable();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (mConnections.ContainsKey(pCnStr))&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; (IDbConnection)mConnections[pCnStr];&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; aCn = CreateConnection(pCnStr);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;mConnections[pCnStr] = aCn;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;aTrx.TransactionCompleted += TransactionCompleted;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; aCn;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;static&lt;/span&gt; IDbConnection CreateConnection(&lt;span style="color:blue;"&gt;string&lt;/span&gt; pCnStr)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;// cn str is name value pairs with '=' and ';' separating each pair&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;// get each of the pairs&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; aCnStrPairs = pCnStr.Split(&lt;span style="color:blue;"&gt;new&lt;/span&gt;[] { &lt;span style="color:#a31515;"&gt;';'&lt;/span&gt; });&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;// find the pair with 'Provider'&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; aProvPairEnum = aCnStrPairs.Where(i =&amp;gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt;.Compare(i, &lt;span style="color:#a31515;"&gt;"Provider"&lt;/span&gt;, &lt;span style="color:blue;"&gt;true&lt;/span&gt;) == 0);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;IDbConnection aCn;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (aProvPairEnum.Count() == 0)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;// no provider specified so assume MS SQL Server&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;aCn = &lt;span style="color:blue;"&gt;new&lt;/span&gt; SqlConnection(pCnStr);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;else&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;// get the provider name&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; aProvPair = aProvPairEnum.First();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; aProvNvp = aProvPair.Split(&lt;span style="color:blue;"&gt;new&lt;/span&gt;[] { &lt;span style="color:#a31515;"&gt;'='&lt;/span&gt; });&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;// create a connection&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; aFactory = System.Data.Common.DbProviderFactories.GetFactory(aProvNvp[1]);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;aCn = aFactory.CreateConnection();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;aCn.ConnectionString = pCnStr;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;// we open the cn so that LINQ does not - this will also signal to LINQ not to close the cn&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;aCn.Open();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; aCn;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;// handler for when the trx is complete&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;static&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;void&lt;/span&gt; TransactionCompleted(&lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, TransactionEventArgs e)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;try&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;// dispose of each connection&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (DictionaryEntry aEntry &lt;span style="color:blue;"&gt;in&lt;/span&gt; mConnections)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;try&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;((IDbConnection)aEntry.Value).Dispose();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;catch&lt;/span&gt; { }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;finally&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;// reset the collection, in case doing another on this thread&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;mConnections.Clear;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Georgia;font-size:12;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-3704017909774502477?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/3704017909774502477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=3704017909774502477' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/3704017909774502477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/3704017909774502477'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2010/01/old-problem-new-context.html' title='Old Problem – New Context'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-7654744297518947210</id><published>2010-01-04T09:57:00.001-05:00</published><updated>2010-01-04T09:57:08.286-05:00</updated><title type='text'>Outlook Rules</title><content type='html'>&lt;span xmlns=''&gt;&lt;p&gt;&lt;span style='font-family:Segoe UI; font-size:10pt'&gt;After reading the title to this entry I had to laugh.  So am I stating an opinion on how I feel about Outlook (it rules!) or something else?  When it the electrons from my brain told my finger tips to type this title I was definitely thinking something else.  Hey man – words do mean something.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Segoe UI; font-size:10pt'&gt;So after reading Hanselman's blog entry (&lt;a href='http://www.hanselman.com/blog/TheThreeMostImportantOutlookRulesForProcessingMail.aspx'&gt;http://www.hanselman.com/blog/TheThreeMostImportantOutlookRulesForProcessingMail.aspx&lt;/a&gt;) over the Holiday about processing Outlook rules; I was inspired to revisit my own set of rules.  When I was working at Microsoft (as Scott now does) I was totally overwhelmed with the amount of internal information flowing around the company; and at the time most of it was through email distribution lists.  Between the stuff directed at me as part of my job (Microsoft Consulting) and the internal chatter; I was getting hundreds of emails a day.  Without a good set of rules it would have been impossible to get through everything in my inbox.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Segoe UI; font-size:10pt'&gt;That practice has stayed with me ever since and has served me well over the years.  Two things have happened recently that I wanted to write about with regard to Outlook.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Segoe UI; font-size:10pt'&gt;First I wanted to record this (&lt;a href='http://office.microsoft.com/en-us/outlook/HA103869131033.aspx?pid=CH102499821033'&gt;http://office.microsoft.com/en-us/outlook/HA103869131033.aspx?pid=CH102499821033&lt;/a&gt;) article called "Outlook Meeting Requests: Essential Do's and Don'ts".  As a long time Outlook user; I already do many of the things in this article.  But there were some other nuggets in there that I found useful; especially around using rules on meeting requests.  One thing I have been looking all over for and found on this page was how to turn off the acknowledgement to a meeting invite.  There are a few meetings that I invite 20+ people to and I don't need to know who has accepted and who has not.  I had a rule just to catch all of these responses and move them off to a folder. &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Segoe UI; font-size:10pt'&gt;Secondly, I wanted to mention that about 4 months ago I became a Crackberry user for my work email.  There were many things happening at work that I just needed to stay apprised of during the time I was not logged in.  Well this changed the way that I wrote many of my rules.  Suddenly I was not just filtering things so that my Inbox was less cluttered (and relatively prioritized).  Now I needed more because the Blackberry (Bb) is synchronizing with my Inbox and my hip was buzzing for every email. &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Segoe UI; font-size:10pt'&gt;&lt;em&gt;Side note – I cannot tell you how annoying it is that the Bb buzzes about 7 seconds before an email arrives in my Inbox.  As if the little bubble pop-up isn't enough of a distraction!!&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Segoe UI; font-size:10pt'&gt;So now I have two Inboxes.  I have a series of rules that move everything EXCEPT the "hey a server is down" type of emails to my secondary inbox.  The trick is to do this given the fact that the Bb service (on the Exchange server) sees only the emails that fall off of the server side rules waterfall.  So I have been using the "Move" and "Stop Processing More Rules" combination much more.  There are also some rules that are order dependent; which I am not happy with.  &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Segoe UI; font-size:10pt'&gt;But the whole thing works relatively well now.  It's funny how refactoring my rules for the Bb may have actually made them better.  Kind of like my code/designs; sometimes it's not until a new requirement comes along that I realize a better way.  As Hannibal Smith used to say (The A-Team) – "I love it when a plan comes together".&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Segoe UI; font-size:10pt'&gt;What I would really love is for the Blackberry guys to give me a way to interact with the Exchange service running on the server.  Let me write some rules separately, just for the device.  I would not be at all surprised if such a thing exists and we are just not "with it" enough to have deployed it.  It's probably for the same reason that we deploy WindowsXP with the old Start Menu configuration (no MRU etc).  Because someone felt that it would be just too hard and confusing to the users to change anything.  Now that we have rolled out Office 2007 I better not hear that excuse ever again!!&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-7654744297518947210?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/7654744297518947210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=7654744297518947210' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/7654744297518947210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/7654744297518947210'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2010/01/outlook-rules.html' title='Outlook Rules'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-940001210644996294</id><published>2009-12-03T08:01:00.004-05:00</published><updated>2009-12-03T08:49:16.408-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Brick Wall - Bang Head</title><content type='html'>I had 17 (the number is not important except that it is more than one) Excel files I needed to get into a database and since wee happen to use SQL Server - I thought of SSIS.  I was going to leave my trusty C# hammer in the tool bag for a more specialized tool.  I was confident that even though I had not used SSIS for much (mostly trivial imports from SSMS) that I could get something running pretty quickly.&lt;br /&gt;&lt;br /&gt;Well I could not have been more wrong.&lt;br /&gt;&lt;br /&gt;I spent the entire day working through a series of SSIS issues specific to the problem I was trying to solve .  The final issue was that a couple of the cells in Excel have more than 255 chars of data; what I nightmare trying to get the Excel driver to read more.  And now that it is - its in an NTEXT data type which is practically useless when I really want a String.  What a mess!  Not to mention that I enlisted (wasted?) some help from other people (at least 4) who are much more knowledgeable on this technology than I. &lt;br /&gt;&lt;br /&gt;The question I am asking myself is not whether to use a different tool (my trusty C# knife); but when I should have "cut bait and run"?&lt;br /&gt;&lt;br /&gt;Every time I ran into an issue yesterday it felt like I was getting closer and closer to being done.  Problem is that now feels like there was an infinate distance to travel; so closer being relative - i was never going to be done.   At what point do I  should I have realized this?  Is one day too long to have been doing this?  Is this just a case of arrogance and/or stuborness?&lt;br /&gt;&lt;br /&gt;Just one of those things that makes me say Hmmmm.&lt;br /&gt;&lt;br /&gt;It's hard to explain to people who don't do what I (we) do for a living this type of situation.  I wonder how much time is spent / wasted doing just this sort of thing; using the wrong tool for the job.  How many pople just keep banging a bent nail?  Sure it works, but it's so britile you can never change it.  I guess I could have just dropped a script component on the SSIS design surface and written the entire thing in C#.  Too bad the debugger does not work.  I am just too old to debug something using MessageBox.Show().  Geez!  I am so anal about debuggers that a friend and I (he did most of the heavy lifting) wrote our own debugger for a Basic compiler we were using back in the early 90's!&lt;br /&gt;&lt;br /&gt;I think I gave SSIS a fair chance.  Now it's time to get this thing done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-940001210644996294?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/940001210644996294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=940001210644996294' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/940001210644996294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/940001210644996294'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2009/12/brick-wall-bang-head.html' title='Brick Wall - Bang Head'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-8882429315862857565</id><published>2009-05-12T16:47:00.002-04:00</published><updated>2009-05-12T16:53:14.244-04:00</updated><title type='text'>IIS 401.5 Error</title><content type='html'>Had a really weird problem today where I was getting a IIS 401.5 error on a subweb today.  The problem shows up as a 401.2 error in the browser, but when you look at the IIS log it's reported as a 401.5.&lt;br /&gt;&lt;br /&gt;I was running through all my usual ways of debugging these types of issues and non of the usual things worked.  Asked a collegue for help because I must be missing something obvious.  Then I was verbally walking him through the configuration and I mentioned that the problem was only happening on this subweb.  Something clicked on both our faces - it's a subweb so there is more than one web.config in play here.  I checked the web.config file and found that it was busted (the root site did not work either - but no one cares).  I renamed the web.config file and bang, the site started working again.&lt;br /&gt;&lt;br /&gt;Blogging this on the off chance it helps someone and to get it to stick in my own memory for next time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-8882429315862857565?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/8882429315862857565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=8882429315862857565' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/8882429315862857565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/8882429315862857565'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2009/05/iis-4015-error.html' title='IIS 401.5 Error'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-5784121265353214547</id><published>2009-04-16T14:22:00.003-04:00</published><updated>2009-04-16T14:40:31.026-04:00</updated><title type='text'>C# - Keep me from hurting myself</title><content type='html'>I just fixed a funny bug where it was behaving very odd and it was because I had a return statement where I intended to have a continue. I musta looked at that line a dozen times and did not think anything of it. Just went back to the basics of debugging and ran through the code line by line, iteration by iteration. What an embarassing relief!&lt;br /&gt;&lt;br /&gt;[Upon further reflection]&lt;br /&gt;What if there was new language feature that made this less likely to happen. Does it help readability and/or intent? Take the following loop.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;foreach (var i in theCollection)&lt;br /&gt;{&lt;br /&gt;if (i.Visible == false)&lt;br /&gt;continue;&lt;br /&gt;&lt;br /&gt;// other code goes here&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;What if I could change the syntax to something like this...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;foreach (var i in theCollection)&lt;br /&gt;except i.Visible == false&lt;br /&gt;{&lt;br /&gt;// other code goes here&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Upon futher thought what if I just used LINQ instead?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;var iVisible = theCollection.FindAll( i =&gt; i.Visible)&lt;br /&gt;&lt;br /&gt;foreach( var i in iVisible)&lt;br /&gt;{&lt;br /&gt;// other code goes here&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Not to bad from a syntax point of view. I don't like that I am making a shallow copy of the original list for the purposes of only iterating through it. The language extension above works on the original list.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-5784121265353214547?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/5784121265353214547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=5784121265353214547' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/5784121265353214547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/5784121265353214547'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2009/04/return-continue.html' title='C# - Keep me from hurting myself'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-8859241667927907927</id><published>2009-04-06T14:34:00.004-04:00</published><updated>2009-04-06T14:50:14.947-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Pattern for Extension Methods?</title><content type='html'>The more extension methods I see and write the more I am starting to see a loose pattern forming. If I write an extension method for IQueryable&lt;t&gt; then why not write something similar for IEnumerable&lt;t&gt;. Sure the implementation is different, but from the outside they both feel similar. Take for instance Distinct; why only have that on IQueryable&lt;t&gt;? I ended up writing my own, which was not a big deal, but byt the time I finished all the tests and a quick peer review I had spent almost a 4 hours. Not to metion the email &amp;amp; SharePoint entry to everyone else in the org announcing a new release of the &lt;em&gt;our&lt;/em&gt; extensions dll. Not bad, but just distracting. Here is the code for anyone that is interested.  Sorry about the formatting, this editor is pretty lame for code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Takes a List of type &amp;lt;typeparamref name="T"/&amp;gt; and a function as the key selector&lt;br /&gt;/// and returns a unique list of &amp;lt;typeparamref name="T"/&amp;gt;.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;typeparam name="KEY"&amp;gt;A class instance that uniquely identifies the current item. Strings work well.&amp;lt;/typeparam&amp;gt;&lt;br /&gt;/// &amp;lt;typeparam name="T"&amp;gt;The type of items in the target and return lists.&amp;lt;/typeparam&amp;gt;&lt;br /&gt;/// &amp;lt;param name="pList"&amp;gt;The input list. Not changed by this method.&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;param name="pGetUniqueKeyFunc"&amp;gt;The function that returns a KEY that uniquely identifies the current item&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;returns&amp;gt;A list of &amp;lt;typeparamref name="T"/&amp;gt; where every item is unique by KEY&amp;lt;/returns&amp;gt;&lt;br /&gt;/// &amp;lt;example&amp;gt;&lt;br /&gt;/// &amp;lt;code&amp;gt;List&amp;amp;lt;MyClass&amp;amp;gt; aDistinctList = aTargetList.Distinct( i =&amp;gt; i.Id);&amp;lt;/code&amp;gt;&lt;br /&gt;/// &amp;lt;/example&amp;gt;&lt;br /&gt;/// &amp;lt;remarks&amp;gt;&lt;br /&gt;/// &amp;lt;para&amp;gt;&lt;br /&gt;/// Worth noting that there is a distinct method on the IQueryable&amp;amp;lt;T&amp;amp;gt;, but this does not work&lt;br /&gt;/// on List&amp;amp;lt;T&amp;amp;gt;. This is an entirely different implementation form that method.&lt;br /&gt;/// &amp;lt;/para&amp;gt;&lt;br /&gt;/// &amp;lt;para&amp;gt;&lt;br /&gt;/// The order of the original list is maintained, only duplicats are removed.&lt;br /&gt;/// &amp;lt;/para&amp;gt;&lt;br /&gt;/// &amp;lt;/remarks&amp;gt;&lt;br /&gt;public static List&amp;lt;T&amp;gt; Distinct&amp;lt;KEY, T&amp;gt;(this List&amp;lt;T&amp;gt; pList, Func&amp;lt;T, KEY&amp;gt; pGetUniqueKeyFunc)&lt;br /&gt;{&lt;br /&gt;if (pGetUniqueKeyFunc == null)&lt;br /&gt;throw new ArgumentNullException("pGetUniqueKeyFunc");&lt;br /&gt;&lt;br /&gt;if (pList == null  pList.Count == 0)&lt;br /&gt;return new List&amp;lt;T&amp;gt;(0);&lt;br /&gt;&lt;br /&gt;var aDistinctKeyHash = new Hashtable(); // the list of unique keys - used for lookup&lt;br /&gt;var aDistinctItemList = new List&amp;lt;T&amp;gt;();&lt;br /&gt;&lt;br /&gt;// go thru each item in the source list and get the key for that item from the delegate&lt;br /&gt;// if the key does not exist in the hashtable then add it to the hashtable and the item return list&lt;br /&gt;// rinse - repeat...&lt;br /&gt;foreach (var aItem in pList)&lt;br /&gt;{&lt;br /&gt;var aKey = pGetUniqueKeyFunc.Invoke(aItem);&lt;br /&gt;&lt;br /&gt;if (!aDistinctKeyHash.ContainsKey(aKey))&lt;br /&gt;{&lt;br /&gt;aDistinctKeyHash.Add(aKey, aItem);&lt;br /&gt;aDistinctItemList.Add(aItem);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return aDistinctItemList;&lt;br /&gt;}&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-8859241667927907927?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/8859241667927907927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=8859241667927907927' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/8859241667927907927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/8859241667927907927'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2009/04/pattern-for-extension-methods.html' title='Pattern for Extension Methods?'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-4856693301646931669</id><published>2009-04-06T11:53:00.003-04:00</published><updated>2009-04-06T12:11:09.740-04:00</updated><title type='text'>eReading</title><content type='html'>Yes I have a couple of free minutes today. Just clearing some stuff out of my Inbox that has accumulated over the last 5 weeks of pounding out a cool POC.&lt;br /&gt;&lt;br /&gt;A bunch of people here at work have bought a Kindle. A good friend, Bernie, uses his for both technical and personal reading. He was about to buy a v1 Kindle and opted to wait for v2. So far he is still on board. It gets me wondering if I would really use one or whether I just like the cool factor.&lt;br /&gt;&lt;br /&gt;Honestly, I am not feeling like I would use it very much and it would be relegated to the long list of toys I end up giving away.  Why? Because there are very few technical books I actually read cover to cover. I do much more browsing, skipping and flipping all of which just don't work in the e-mediums.  I still like the feel of books.  I like to highlight and write in the margins.  I like to flip through a book I have not picked up in a while and find something new or something I marked up previously.&lt;br /&gt;&lt;br /&gt;Take Safari. Every programmer here at work has a Safari membership. Nice. But I just don't use it that much for actually reading books. In fact when I talked to the Safari folks originally; their main use case is not for eReading but rather for finding answers to questions or topics.&lt;br /&gt;&lt;br /&gt;My other use case for Safari is what I used to used Borders and Barnes &amp;amp; Noble for - to check a book out before I buy it. This is sweet. First to Safari, then to a discount book seller or Amazon to buy it used (love this).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-4856693301646931669?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/4856693301646931669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=4856693301646931669' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/4856693301646931669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/4856693301646931669'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2009/04/ereading.html' title='eReading'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-7379827851531337817</id><published>2009-04-06T11:00:00.002-04:00</published><updated>2009-04-06T11:29:59.925-04:00</updated><title type='text'>What I am currently reading</title><content type='html'>...&lt;a href="http://www.amazon.com/Pragmatic-Thinking-Learning-Refactor-Programmers/dp/1934356050/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1239029515&amp;amp;sr=8-1"&gt;Pragmatic Thinking and Learning: Refactor Your Wetware&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I am only 50% through. No code samples or object diagrams in this book. It's more about how to approach what I do as opposed to specifically how to do it. I like have been thinking more about this myself and am finding this book very interesting.&lt;br /&gt;&lt;br /&gt;I liked the book by the same author (with others) called Pragmatic Programmer. Bernie turned me onto that book when it first came out and I recommend it highly. It's still as pertinent as the day it was written.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Pragmatic-Thinking-Learning-Refactor-Programmers/dp/1934356050/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1239029515&amp;amp;sr=8-1"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51xArZnegaL._SS500_.jpg" width="163" height="195" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-7379827851531337817?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/7379827851531337817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=7379827851531337817' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/7379827851531337817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/7379827851531337817'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2009/04/what-i-am-currently-reading.html' title='What I am currently reading'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-4548013481498238615</id><published>2009-04-06T10:52:00.002-04:00</published><updated>2009-04-06T11:00:38.342-04:00</updated><title type='text'>Twitter</title><content type='html'>I finally bit the bullet and signed up for Twitter.  I have no expectations of finding any value in this, but I wanted to at least say I gave it a try.  It's also one of the few networking sites that is not currently blocked by our corporate firewall (LinkedIn is the other one).  As a side note, eBay is not blocked either - sometimes I just don't understand the corporate mentality.  Like we are buying our office supplies on eBay.  Now that would be funny.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-4548013481498238615?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/4548013481498238615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=4548013481498238615' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/4548013481498238615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/4548013481498238615'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2009/04/twitter.html' title='Twitter'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-7690478482788887678</id><published>2009-04-06T09:35:00.003-04:00</published><updated>2009-04-06T11:46:05.696-04:00</updated><title type='text'>Blogging from the Enterprise</title><content type='html'>I have not blogged in some time and was lamenting the fact all weekend. It's not that I don't want to it's just that I don't know what to say - and I have plenty to say.&lt;br /&gt;&lt;br /&gt;When I created this blog (and it's previous incarnation) it was my intention to use it as a public forum for professional things only - little to no personal stuff. At that time I owned my own company and .NET was still in beta; so there was plenty to write about. I did not want to just link to what other people said unless I thought I could add value in some way; whether by commenting or contributing value.&lt;br /&gt;&lt;br /&gt;For the last 3 years I have worked for a Fortune 100 (probably lost a notch or two given our current valuation) company and it feels like there isn't much I can write about. So much of what I do can be considered "sensitive" or a "competitive advantage". We are in a highly competitive financal world that is currently under a great deal of pressure (I work for an Investment Mgmt company). Add to this the increase of patent applications and infringement cases and it creates a challenging situation.&lt;br /&gt;&lt;br /&gt;I am going to try harder to find the line and just be sure to err on being conservative about what I say.  Hopefully it still means something.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-7690478482788887678?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/7690478482788887678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=7690478482788887678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/7690478482788887678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/7690478482788887678'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2009/04/blogging-from-enterprise.html' title='Blogging from the Enterprise'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-6894979606687317398</id><published>2009-01-02T13:27:00.006-05:00</published><updated>2009-01-02T14:05:02.156-05:00</updated><title type='text'>Pondering M&amp;M's</title><content type='html'>I was poking around the 'Net and found several lesson plans posted by teachers/professors for other teachers/professors.  And a bunch of them involved using M&amp;amp;Ms as a way to demonstrate/illustrate the concepts being taught.  I read a couple of these and actually learned a couple of things.  One article in particular got me thinking about something I am observing here at work.  The article was on demonstrating the radioactive decay of an isotope.  And I am wondering if this is somehow related to the two colors (either red or green) in Holiday M&amp;amp;M's in the following observations...&lt;br /&gt;&lt;br /&gt;1) the ratio of red to green as they are pored out of the bag - there seem to be more green&lt;br /&gt;OR&lt;br /&gt;2) the ratio of red to green as they appear to be consumed - people appear to prefer green&lt;br /&gt;&lt;br /&gt;Yes, these are deep thoughts indeed.&lt;br /&gt;&lt;br /&gt;With regard to the ratio out of the bag there are a few possibilities that come to mind.  First is the conspiracy theory; where some bean counter (or m&amp;amp;m counter) figured out that red food dye is more expensive (0r some other reason red cost more) and to save money made less red M&amp;amp;Ms.  I like this solution better than they common ploy food manufactures use - where they keep the packaging the same size, put less in it, put some adverb on the packing to make you believe it's a better value and change you the same (or more)!&lt;br /&gt;&lt;br /&gt;The second possibility that &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;occurred&lt;/span&gt; to me is what if (as my observations above show) people just like green M&amp;amp;M's better so they make more of them.  Is it as simple that red M&amp;amp;M's just like black &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;licorice&lt;/span&gt; jelly beans - they have their fans - but they are a minority.  My mind starts wondering on &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;prejudices&lt;/span&gt; and &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;stereotypes&lt;/span&gt; from here; I think I will say more on this later...&lt;br /&gt;&lt;br /&gt;A third possibility is the chaos/random theory - that my measly sample of 5lbs of M&amp;amp;M's just not large enough to draw any conclusions.  This is just not as much fun as some of the other reasons.&lt;br /&gt;&lt;br /&gt;Every hear the one about why there are so many socks out there without a mate; it's because socks are actually the larvae form of coat hangers.  Which is why you always have so many of those.  Could something like that be true for M&amp;amp;M's that the all the red one's have "hatched" and become green ones.  I guess the opposite could also be true depending upon the larvae time length. &lt;br /&gt;&lt;br /&gt;Lastly, could this all be related to the fact that some time ago there was a red M&amp;amp;M scare back in the 1970's; where (if my recollection is correct) they were pulled from circulation.  So now they are back.  But have people really forgotten?   So are people consciously or subconsciously avoiding the red ones and the &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;manufacturer&lt;/span&gt; knows it - so they make fewer of them?&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Hmm&lt;/span&gt;.  Just needed to share some of the scary thoughts that roll around in my mind.  I think this is one of those times when sometimes words don't mean anything.&lt;br /&gt;&lt;br /&gt;Happy New Year!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-6894979606687317398?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/6894979606687317398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=6894979606687317398' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/6894979606687317398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/6894979606687317398'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2009/01/pondering-m.html' title='Pondering M&amp;M&apos;s'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-185017600612260119</id><published>2008-08-24T22:02:00.001-04:00</published><updated>2010-02-28T17:07:07.780-05:00</updated><title type='text'>Is Yukon Cornelius an Architect?</title><content type='html'>&lt;div&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;  &lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;o:officedocumentsettings&gt;   &lt;o:allowpng/&gt;  &lt;/o:OfficeDocumentSettings&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:trackmoves&gt;false&lt;/w:TrackMoves&gt;   &lt;w:trackformatting/&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:drawinggridhorizontalspacing&gt;18 pt&lt;/w:DrawingGridHorizontalSpacing&gt;   &lt;w:drawinggridverticalspacing&gt;18 pt&lt;/w:DrawingGridVerticalSpacing&gt;   &lt;w:displayhorizontaldrawinggridevery&gt;0&lt;/w:DisplayHorizontalDrawingGridEvery&gt;   &lt;w:displayverticaldrawinggridevery&gt;0&lt;/w:DisplayVerticalDrawingGridEvery&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:dontautofitconstrainedtables/&gt;    &lt;w:dontvertalignintxbx/&gt;   &lt;/w:Compatibility&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="276"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt; &lt;style&gt; &lt;!--  /* Font Definitions */ @font-face  {font-family:Cambria;  panose-1:2 4 5 3 5 4 6 3 2 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;}  /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-parent:"";  margin-top:0in;  margin-right:0in;  margin-bottom:10.0pt;  margin-left:0in;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:"Times New Roman";  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Cambria;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} @page Section1  {size:8.5in 11.0in;  margin:1.0in 1.25in 1.0in 1.25in;  mso-header-margin:.5in;  mso-footer-margin:.5in;  mso-paper-source:0;} div.Section1  {page:Section1;} --&gt; &lt;/style&gt; &lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */ table.MsoNormalTable  {mso-style-name:"Table Normal";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-parent:"";  mso-padding-alt:0in 5.4pt 0in 5.4pt;  mso-para-margin-top:0in;  mso-para-margin-right:0in;  mso-para-margin-bottom:10.0pt;  mso-para-margin-left:0in;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:"Times New Roman";  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"Times New Roman";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;!--StartFragment--&gt;  &lt;p class="MsoNormal"&gt;This blog entry has sat as an idea with no text for over a year now.&lt;span style=""&gt;  &lt;/span&gt;The reason why?&lt;span style=""&gt;  &lt;/span&gt;I have no idea what an Architect does; I thought I did, but it’s like grabbing a handful of smoke.&lt;span style=""&gt;  &lt;/span&gt;Reach, grab, and peek inside … nothing – just like Yukon Cornelius.&lt;span style=""&gt;  &lt;/span&gt;I have considered myself some sort of an architect (maybe not in title but in the role of) for a long time now.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Since I consider myself an Architect; I want to find ways to make myself a better one.&lt;span style=""&gt;  &lt;/span&gt;What better way than to read and talk to others about their ideas.&lt;span style=""&gt;  &lt;/span&gt;So I took to reading a bunch of books and articles on this topic.&lt;span style=""&gt;  &lt;/span&gt;And while they all make pretty good sense; it’s always sense in the pristine context of a book.&lt;span style=""&gt;  &lt;/span&gt;It’s easy to define something outside the context things like culture, bureaucracy and politics.&lt;span style=""&gt;  &lt;/span&gt;Sort of like writing code in PowerPoint; code always compiles/works in PowerPoint. &lt;span style=""&gt; &lt;/span&gt;When I talk to people they always seem to define what an Architect does as it pertains to themselves or their organization.&lt;span style=""&gt;  &lt;/span&gt;Turns out organizations are as varied as the description I am working towards.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;My current working description for an Architect is; someone that has &lt;i style=""&gt;enough experience&lt;/i&gt; to look at a complex problem and see abstractions.&lt;span style=""&gt;  &lt;/span&gt;Then uses those abstractions to get &lt;i style=""&gt;something&lt;/i&gt; done.&lt;span style=""&gt;  &lt;/span&gt;Note the lack of detail in what is &lt;i style=""&gt;enough experience&lt;/i&gt; and the &lt;i style=""&gt;something&lt;/i&gt; is.&lt;span style=""&gt;  &lt;/span&gt;How much is enough?&lt;span style=""&gt;  &lt;/span&gt;Far be it for me to put down a number.&lt;span style=""&gt;  &lt;/span&gt;And depending upon the &lt;i style=""&gt;something&lt;/i&gt; I may put some other qualifier in front of the work architect; such as “enterprise” or “solutions”.&lt;span style=""&gt;  &lt;/span&gt;But how many qualifiers do I have to come up with?&lt;span style=""&gt;  &lt;/span&gt;What if I downsize my &lt;i style=""&gt;something&lt;/i&gt; to a piece of code?&lt;span style=""&gt;  &lt;/span&gt;Since much of coding is about finding abstractions; does that make it an architectural exercise?&lt;span style=""&gt;  &lt;/span&gt;Nope that’s design.&lt;span style=""&gt;  &lt;/span&gt;Reach, grab, peek …&lt;/p&gt;  &lt;p class="MsoNormal"&gt;So have found the need for an additional definition that is used to help the first. An Architect is someone that gets stuff done at multiple levels in the organization; which means doing some sort of planning (budget, project, envisioning, etc) one minute, setting up a standard for building wizzy widgets the next and finishing off the day with a little code.&lt;span style=""&gt;  &lt;/span&gt;This definition helps to differentiate pure coding and design from the larger activity of architecture.&lt;span style=""&gt;  &lt;/span&gt;Architects are expected to some level of design and coding (again meant in a very broad way to include activities like scripting or installing) but they are often meant to do in a way that is not exclusively coding or design.&lt;span style=""&gt;  &lt;/span&gt;Reach, grab, peek … Better, but notice how long this entry is getting.&lt;span style=""&gt;  &lt;/span&gt;This is taking way to long!&lt;/p&gt;  &lt;p class="MsoNormal"&gt;When talking to people who have no idea what working in the computer field is like; I use an even simpler version of the second definition.&lt;span style=""&gt;  &lt;/span&gt;I shorten it to be – “I am a guy who gets stuff done” (sometimes substituting another four letter “s” word for stuff).&lt;span style=""&gt;  &lt;/span&gt;Hey if you can’t easily describe what you do to a total stranger in an elevator ride then you either need to rethink what you are doing or abstract it down to something easier for them to understand.&lt;span style=""&gt;  &lt;/span&gt;Unfortunately, this abstraction is so abstract that it encompasses everything.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;And nothing. &lt;span style=""&gt; &lt;/span&gt;Reach, grab, peek …&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Guess I need to rethink my career and start staying at Holiday Inn Express to become proficient at something else.&lt;/p&gt;  &lt;!--EndFragment--&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-185017600612260119?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/185017600612260119/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=185017600612260119' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/185017600612260119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/185017600612260119'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2008/08/is-yukon-cornelius-architect.html' title='Is Yukon Cornelius an Architect?'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-5800991815847601954</id><published>2008-05-01T20:44:00.002-04:00</published><updated>2008-05-01T20:50:18.794-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><title type='text'>MSDN Magazine Part 2</title><content type='html'>As I was scrolling down through my previous posts; I noticed the one I did about MSDN magazine.   The three most recent issues (which all arrived at once) did not have the outside folding cover.  I don't pretend that I had anything to do with it, but it does make me wonder if others complained.  We may never know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-5800991815847601954?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/5800991815847601954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=5800991815847601954' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/5800991815847601954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/5800991815847601954'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2008/05/msdn-magazine-part-2.html' title='MSDN Magazine Part 2'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-5468539298024811843</id><published>2008-05-01T12:36:00.004-04:00</published><updated>2008-05-01T14:50:57.312-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='browser'/><title type='text'>Back-ing into Enterprise Web Applications</title><content type='html'>&lt;p&gt;&lt;br /&gt;Sometimes I just don't know what to blog about. Is it just me? So when I don't have anything I feel is new or original, I guess I need to go back to something old. I know I have blogged about building applications in the browser before. Maybe not on this blog, but certainly on one of the many outlets I have had over the years. This topic has come up again as I consider the implications of technologies like &lt;a href="http://silverlight.net/"&gt;Silverlight 2.0&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/AJAX"&gt;AJAX &lt;/a&gt;on building enterprise applications.&lt;br /&gt;&lt;br /&gt;I really like the browser, but I am not sure it makes a great application platform. It makes me wonder why it seems like we need all these “other” technologies to make it a better platform. Take for instance the Back button. When browsing I am a big fan of the Back button (actually I am still a keyboard kind of guy and I use the backspace key - old habits die hard). Whether you like it or not, I think you will agree it is a standard that a lot of people now understand.&lt;br /&gt;&lt;br /&gt;So when I host an application in the browser, what does the Back button do? Or perhaps a better question is what does the user expect the Back button to do? Why would they think it would do anything different?&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"Hey, I'm in the browser. There's this big, prominent button with "Back" written on it". Why would I not want to press that?"&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;As it turns out using technologies like Silverlight 2.0 and AJAX seem to totally ignore this. They ignore it to the extent that you lose a lot of navigation context if you use it. For instance, say I am traversing down through a hierarchy. I get some number of levels deep and I want to&lt;br /&gt;back up to a previous level - hit the back button? Better not if that traversal was being done using AJAX!&lt;br /&gt;&lt;br /&gt;By the way this is not an entirely new problem; I first encountered this problem when an application I was reviewing for a client made such extensive use of session that the back button did not do what the users expected. So we spent a fair amount of time and energy coming up with ways to preserve the Back button functionality. First we found some hack that essentially&lt;br /&gt;disabled the back button (ironically, by navigating Forward). Secondly we built our screens such that they used the query string to pass some basic context from one screen to the next; so that when you navigated back the browser would pass all the context back (since all it typically saves is the URL). An additional benefit we got from using the query string was that nearly every page was bookmark-able. The only exception was when you were in edit-mode; we not try to “save” transitive or volatile states.&lt;/p&gt;&lt;table bgcolor="silver"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="WIDTH: 40px"&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;Couple of side notes...&lt;br /&gt;&lt;br /&gt;It seems that the Back button works much better in ASP.NET even though the context is not stored n the query string. I have not taken the time to figure out the exact details of how this is working; but I imagine it has something to do with the browser caching pages and VIEWSTATE. Noteto self - go figure this out someday.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Found &lt;a href="http://www.onjava.com/pub/a/onjava/2005/10/26/ajax-handling-bookmarks-and-back-button.html"&gt;this &lt;/a&gt;interesting article to a Java Framework to handle the Back / Bookmark problem introduced by AJAX. I have to imagine that some resourceful person has done something similar on &lt;a href="http://www.codeplex.com/"&gt;Codeplex &lt;/a&gt;(or alike).&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;There is a time reporting application (to remain anonymous) we use at my current job that makes fairly good use of AJAX. That is in the sense that it does improve the response time and interactivity of the application. The downside is that I continuously get burned by use the back button. Argg!!&lt;br /&gt;&lt;br /&gt;On the contrary, the &lt;a href="http://msdn2.microsoft.com/library"&gt;MSDN library &lt;/a&gt;site does a pretty good job of mixing the two paradigms such&lt;br /&gt;that when I hit back; the “right” thing happens. Sure, neither of these are enterprise applications (in fact comparing them to one another is hardly fair) but the problem remains.&lt;br /&gt;&lt;br /&gt;In my mind I am questioning why we are still using the browser for enterprise applications at all. I know why, but I don’t know why. I mean, the reason why it’s so attractive is that it helps in two major areas; distribution and disaster recovery. Distribution is the whole thing that got&lt;br /&gt;us here in the first place. The DR aspect is something I have been realizing more and more in this post Sept 11 world where DR is something I have to consider more and more. It’s just easy to deploy the web application to two physical sites (managed by some content manager); one the primary and the other the secondary. Give a large enough pipe you can load balance between&lt;br /&gt;the two and have a scalable/HA solution to boot.&lt;/p&gt;&lt;p&gt;By why do they have to run in the browser? Why, why why? Here is what I&lt;br /&gt;propose instead… &lt;/p&gt;&lt;ol&gt;&lt;li&gt;Build an application as a native Windows .NET application based on a 3-tier architecture. No HTML but some technology like WinForms or WPF.&lt;/li&gt;&lt;li&gt;For the middle tier I would like to use something the &lt;a href="http://msdn.microsoft.com/en-us/library/aa697427(VS.80).aspx"&gt;Entity Framework&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx"&gt;LINQ&lt;/a&gt;. I have a question as to whether I am going to have a marshalling/serialization issues with this technology.&lt;/li&gt;&lt;li&gt;The applications are deployed using something like &lt;a href="http://msdn.microsoft.com/en-us/library/t71a733d(VS.80).aspx"&gt;ClickOnce &lt;/a&gt;deployment.&lt;/li&gt;&lt;li&gt;In addition, I want to get rid of the requirement to have a specific .NET framework installed. I like the direction the &lt;a href="http://www.xenocode.com/"&gt;Xenocode &lt;/a&gt;people are taking. Basically linking the .NET Framework into your application thereby bringing all the code and the dependencies down as part of download / install.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Just thought I would put some thoughts out here and see what if anyone is&lt;br /&gt;actually listening. Hopefully you also were able to hand on until this point.&lt;br /&gt;Regardless it’s a place for me to vent; kind of like my diary.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-5468539298024811843?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/5468539298024811843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=5468539298024811843' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/5468539298024811843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/5468539298024811843'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2008/05/back-ing-into-enterprise-web.html' title='Back-ing into Enterprise Web Applications'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-2490666597101929565</id><published>2007-11-20T19:42:00.000-05:00</published><updated>2007-11-20T19:58:04.729-05:00</updated><title type='text'>To Blog or Not To Blog...</title><content type='html'>We have been having some internal discussion at the company I work for about blogging both internally and externally.&lt;br /&gt;&lt;br /&gt;Now I am not very prolific or anything so my blog is probably not a big deal.  In fact it seems like it is more of a novelty than anything else.  Every now and then someone will come up to me and tell me that they stumbled across my blog and found a couple of interesting (i.e. funny) things.  The issue "the company" has with blogging is twofold; first that I not reveal anything that would compromise the competitive secrets or that I not tarnish the image.  Both of which I understand I have honored.  I don't mention any specific vendors or names.  I mean really - what programmer in the Enterprise has not had a problem with the infrastructure folks.&lt;br /&gt;&lt;br /&gt;Internally, we want to start blogging as a way of documenting things in the same vein that MSFT seems to be going - that is that is more than just communicating what is going on at any given moment but also as a way of documenting things.  I find it interesting how many blogs MSFT people have posted and the amount of information on them.  In fact, many blogs seem to be a replacement for traditional documentation.  Which as long as I have a strong search engine - works fine for me.&lt;br /&gt;&lt;br /&gt;Which brings me to the one thing that is preventing me from rolling internal blogs out - how do I find anything.  We plan on using MOSS and Office 2007 as our blogging platform, which actually works pretty well.  The only concern is how strong the MOSS search engine is.  I guess the only way to tell is to try, but I am just dragging my heals.  I have so much other stuff on my plate that it's hard to get any momentum behind this. &lt;br /&gt;&lt;br /&gt;As I write this I feel the energy building, I just hate a whiner.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-2490666597101929565?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/2490666597101929565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=2490666597101929565' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/2490666597101929565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/2490666597101929565'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2007/11/to-blog-or-not-to-blog.html' title='To Blog or Not To Blog...'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-4658768562513900646</id><published>2007-09-24T08:06:00.000-04:00</published><updated>2007-09-24T09:00:52.694-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='services'/><title type='text'>Services (part 1 of many)</title><content type='html'>I not been blogging much lately because I have felt like what I have been working on is just not blog-worthy.  We "outsource" most of our infrastructure services to an internal division; which was recently turned over to a large outsourcing firm.  So I have been spending much of my time "training" the folks who I interact with on a near daily basis to do what I need them to do.  As it turned out this was not a trivial task.  And that's all I have to say about that. :-)&lt;br /&gt;&lt;br /&gt;I am beginning to look at building out some data services.  In the Investment Management business data is king; especially market data.  What I am learning (or should I say re-learning or feeling pain around) is that without the data in place the service is nearly useless.  So my project is really turning into data project where I am bringing in and reconciling market data vendor feeds.  Oh yeah and by the way I am exposing them as a service.&lt;br /&gt;&lt;br /&gt;Which has me questioning myself; why a service in the first place?  I just want to make sure I am actually providing real value and not just overhead.  I think the key reason for a service here is provide a single well define abstraction of the backend.  We have so much market data and so many sources of market data; that providing a flexible abstraction makes sense.  My expectation is that we will be consuming this data right from Excel (the universal financial application platform) as well as many of our custom applications.&lt;br /&gt;&lt;br /&gt;I remember presentations back in the mid-90’s when I was a Microsoft and we were listening to the early internal presentations on Microsoft Transaction Server (MTS) by Pat Helland and James Utzschneider.  They were talking about MTS interception and how you can accomplish cool things when you can get in the middle.  That is exactly what we are trying to do.  Once we get the abstraction of the data, we can begin to do some cool things.&lt;br /&gt;&lt;br /&gt;My biggest concern about building a service is performance.  In past lives when I have built services I would always warn people that if you need fast performance then web services you should think long and hard about not using web services.  Of course there are ways that you can “cache” data outside of the service, but now you start to run into the dirty cache problem.  I want to go back and read Pat Helland’s fiefdoms articles from a bunch of years ago to get my head back into this problem space.  I recall Roger Sessions also doing some similar work based on Pat’s original article.&lt;br /&gt;&lt;br /&gt;Next decision is what Framework bits to use; WebMethod (.NET 2.0) or WCF (.NET 3.0)?  I know .NET 2.0 pretty well; so I feel confident I can get something done fairly quickly on those bits.  But why do something on the “legacy” asmx platform?  Why not just bite the learning curve now?  I assume the interop between the two just works; so if I wanted to the service to be in WCF and the client to be either that would be OK. &lt;br /&gt;&lt;br /&gt;I was just noticed the bottom the page (I write this in Word first) coming up.  And I didn’t think I had anything to write about...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-4658768562513900646?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/4658768562513900646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=4658768562513900646' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/4658768562513900646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/4658768562513900646'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2007/09/services-part-1-of-many.html' title='Services (part 1 of many)'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-7262306715827457063</id><published>2007-07-12T08:35:00.000-04:00</published><updated>2007-07-12T08:48:19.590-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>When the Sh!t Hits the Fan</title><content type='html'>I am trying to get away for a two week vacation; which is in and of itself a challenge. You know the drill. In the weeks leading up to a longer vacation there is this tidal wave of work that needs to get done. Whether you are actually wrapping up work, handing it off or getting it to a state where it can wait until you get back. I am doing all three, as is usually the case. So by the time I leave on vacation I feel like I actually need one. Badly!&lt;br /&gt;&lt;br /&gt;This week has been one of those ones where I have been doing all of the above and on top of it our source control system got hosed. I had a friend tell me that Mercury is in retrograde and therefore she was not surprised that this happened when it did. Not sure I understand, but I am sure feeling the pain. I think Murphy and Mercury are definitely related. So Tuesday I made the call to switch from our current SCC system to a new one - Team Foundation Server.&lt;br /&gt;&lt;br /&gt;Only problem is that the new one has way more features than the old one. So not only do we have a technical switch over we need to do some quick and minimal process modeling to get the system up and running. We took the small company approach to this and just locked a small group of the more senior developers in a room and told them to bang this out together. Things are looking pretty good except that we are waiting for a license to unlock the crippled version of the software. So close.&lt;br /&gt;&lt;br /&gt;Ahh, I can almost feel the sand between my toes...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-7262306715827457063?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/7262306715827457063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=7262306715827457063' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/7262306715827457063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/7262306715827457063'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2007/07/when-sht-hits-fan.html' title='When the Sh!t Hits the Fan'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-8412527463698586224</id><published>2007-06-04T21:48:00.000-04:00</published><updated>2007-06-04T22:18:33.692-04:00</updated><title type='text'>TechEd: Something new, Something old</title><content type='html'>I am in Orlando, FL at TechEd.  I have not attended that many TechEd conferences in my career; I was mostly a PDC bigot.  I think this is my third or forth TechEd conference.   There is another guy from my division here who is all of about 25 years old and I can’t help but notice the difference in how we approach the conference.  The first thing of note is where each of us is at this moment – about 10pm on Monday night.&lt;br /&gt;&lt;br /&gt;I am in my hotel room typing this entry and getting ready for bed.  He is out partaking of the different events being sponsored by Microsoft and/or the different vendors here at the conference.  I think I heard that there are things going until 1am tonight.  There was a time when I would be out until the wee hours, stumble back into my hotel room for a couple hours of sleep and a shower and make the first session of the morning.  On more than one occasion I was still a little (OK allot) intoxicated in that first session  I have this image that my colleague is doing just that – but I don’t want to incriminate him &lt;wink&gt;.  &lt;br /&gt;&lt;br /&gt;Ahhh, youth.&lt;br /&gt;&lt;br /&gt;I tend to go to sessions that fall into one of two categories; either ones on topics that I know very little about or where I want network with the presenter and/or other attendees.  My expectation is that any detail I see here I will have forgotten by the time I leave.  So I am just trying to get the gist of something.  My colleague, on the other hand, seems to be focusing on WPF in hopes that he learns enough to start using it when he returns to the office.  Part of the rationale I think is that I have to bring big concepts together and understand paradigm changes; whereas he needs to just bang out code.&lt;br /&gt;&lt;br /&gt;Lastly, the food.  I just can’t eat that conference food anymore.  I am convinced that it’s the reason I ended up sleeping through a couple post lunch presentations.  I realize that may be hard to believe after reading that I was still blitzed at breakfast.  I have experimented enough with the permutations of this enough to know that the food was certainly the nail in the coffin. I think at 25 I could eat just about anything.  Now 15 years later, it’s another story altogether.  I think there should be a special dietary line for guys like me – I don’t know what to call it but I know what it would look like.  Hey I know what you’re thinking – not it’s not a can of Ensure.  It is much lighter; less pasta and meat more vegi’s and sustaining foods; you get the picture.&lt;br /&gt;&lt;br /&gt;Anyway, times have certainly changed – at least for me.  Maybe I can find the retirement room.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-8412527463698586224?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/8412527463698586224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=8412527463698586224' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/8412527463698586224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/8412527463698586224'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2007/06/teched-something-new-something-old.html' title='TechEd: Something new, Something old'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-5073661493030641600</id><published>2007-05-07T14:25:00.000-04:00</published><updated>2008-12-09T13:12:52.038-05:00</updated><title type='text'>Annoyed with MSDN Magazine</title><content type='html'>&lt;div&gt;My reading habits around MSDN magazine changed recently and now I am back to getting the print version of the magazine - I have a complaint about the cover. For the past couple of years I have been trying to exclusively read MSDN magazine online and so I let the print subscription expire. Well that was just not working for me since I rarely read an MSDN article in one sitting. So I turned my print subscription on and I have a small bone to pick. But first a little more back-story.&lt;br /&gt;&lt;br /&gt;As the number of products and technologies available to build applications has grown I have found that I can no longer be an expert in everything. Rather I have had to focus my depth on a few technologies and be at the 100/200 level on the remaining ones. You might be scratching your head going “then why is the depth of MSDN magazine a problem?” Simply because the intersection of what I am going deep on and articles in MSDN is smaller [which, by the way, is exactly what it feels like the editors are striving for and is a good thing]. So my typical MSDN experience is reading 1, maybe 2 articles in depth and skimming the rest.&lt;br /&gt;&lt;br /&gt;Well that is not &lt;em&gt;exactly&lt;/em&gt; my typical MSDN experience; which brings me to why I feel like venting a little today. In actuality, the first thing I do when I get any magazine is to rip out all the marking stuff. You know the stuff I am talking about all those things from vendors and subscription blow-ins. I hate them because I can't flip through the pages without stopping on one of these. They are like bookmarks someone else put in a book - they are never what I am looking for. Only after removing all these obstructions do I feel that I can actually absorb the content.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Tqc7NMrhT2U/RkBtWd1G9PI/AAAAAAAAAAc/TZaF_GA3fsA/s1600-h/MSDN.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5062166213896369394" style="FLOAT: right; MARGIN: 0px 0px 10px 10px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_Tqc7NMrhT2U/RkBtWd1G9PI/AAAAAAAAAAc/TZaF_GA3fsA/s320/MSDN.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Well, this is the second month I have noticed a new cover style for MSDN – the cover that folds back over the outside. It has been my experience that on most magazine covers when the fold-out that the fold out actually tucks into the magazine. Given my routine of cleaning up my magazines before I read them I would open the front cover, flip open the fold-out and see if it was anything interesting. Why a fold-out? Sometimes I have been rewarded with some nice panoramic nature scene and I don’t mind so much. But I digress…regardless my next step is to rip off the fold-out part.&lt;br /&gt;&lt;br /&gt;In comes MSDN with the fold-out cover that folds outward; back across the front of the magazine. So in this case if I rip off the fold-out part then I am removing the cover of the magazine. For MSDN, more than other magazines I get this is unacceptable since I use the cover to find articles I want. So I left the cover the way it was.&lt;br /&gt;&lt;br /&gt;Here is the problem; once I open the darn thing now the cover becomes an absolute annoyance. It keeps getting caught on things.  Torn. Battered and otherwise abused. Which leaves me no other solution then to rip off the fold-out (and be left with this faceless magazine) or to just toss the magazine [hey I used to be the kind of guy who would buy a new car when the windshield wipers needed to be changed].&lt;br /&gt;&lt;br /&gt;This leads me to one of two conclusions; either the folks at Microsoft have been spying on me in my favorite reading location (very gross). Or I am not the only one that has this cleanup ritual (almost as scary).&lt;br /&gt;&lt;br /&gt;Or it could be I just needed something to write about. I don't have much time before my next meeting so this is best I could do on short notice. Don't worry I am not loosing any sleep over this one.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-5073661493030641600?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/5073661493030641600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=5073661493030641600' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/5073661493030641600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/5073661493030641600'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2007/05/annoyed-with-msdn-magazine.html' title='Annoyed with MSDN Magazine'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Tqc7NMrhT2U/RkBtWd1G9PI/AAAAAAAAAAc/TZaF_GA3fsA/s72-c/MSDN.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-3071036504009490230</id><published>2007-04-30T09:08:00.000-04:00</published><updated>2007-10-31T07:04:47.067-04:00</updated><title type='text'>A Win is a Win</title><content type='html'>A win is a win is a close cousin to the win–win outcome. Recently at my place of work (which I cannot publicly identify here – suffice it to say its corporate America / Fortune 100) I had to compromise in order to achieve the high level goal and objectives; but not via the implementation originally planned. Just thought I would share this experience since it served as a profound reminder to me on the importance of meeting the goal/objective and not being too close to the implementation details. This is something I am personally struggling with lately as I find myself envisioning more and implementing less.&lt;br /&gt;&lt;br /&gt;In this particular case it was around a code generator we have written to generate all the store procedures and data access code for .NET applications. For a number of reasons we ended up with two implementations that from a high level did the same thing. Each had features the other did not have. Since I am on the Architectural team I was really driving my implementation since it address more of the shared scenarios needed by the developers. The problem was that who was going to maintain this implementation? I could not, I have other fish to fry and need this initiative to be owned more by those who will be using it. It became apparent to me that this was just not going to happen; the reasons range from the “not grown here” mentality of developers to the general lack of understanding of what the tool did.&lt;br /&gt;&lt;br /&gt;So in order to evolve the tool and to enable it to evolve; I had to make the hard decision to use the other code base. This was more of an ego thing than anything else. So once I was able to get over that the move was absolutely perfect. We are now going to have one of our top developers working on this key part of our development tools and I will be providing some high level guidance.&lt;br /&gt;&lt;br /&gt;The reason this is not a win-win; even though it may seem so up until this point…We spent a bunch of money working on both of these tools. Most of the work on each tool was done by consultants; one who is very expensive and the other who is moderately expensive.  Now I struggle with the age old problem of what happens when the consultant leaves or we decide we can't afford him anymore; which has already happened to one of the consultants.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-3071036504009490230?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/3071036504009490230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=3071036504009490230' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/3071036504009490230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/3071036504009490230'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2007/04/win-is-win.html' title='A Win is a Win'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-8088851407522075668</id><published>2007-03-30T15:04:00.000-04:00</published><updated>2008-12-09T13:12:52.336-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>What are you doing, right now?</title><content type='html'>&lt;div&gt;I am having one of those ornery moments and I am taking it out on Outlook. It locked my machine up hard today and I don’t know why; which really burns my toast.&lt;br /&gt;&lt;br /&gt;I was just scanning through the boatload of emails in Outlook 2007 and noticed an orange status bar continuously scanning on the To-Do Bar. Here is what starts running through my mind...&lt;br /&gt;&lt;br /&gt;"I appreciate you showing me that something is happening; but can you throw me a bone...What the &lt;bleep&gt; are you doing? Did you ever consider that maybe I want you to stop?"&lt;br /&gt;&lt;br /&gt;So I set out to try and figure out what Outlook was doing; the way a non-developer may...&lt;br /&gt;&lt;br /&gt;I tried hovering over the area – nothing.&lt;br /&gt;I tried clicking – nothing.&lt;br /&gt;I tried right clicking – nothing.&lt;br /&gt;I asked the help system – nothing (don’t get me started).&lt;br /&gt;I asked Google – nothing (could not form narrow enough query).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Tqc7NMrhT2U/Rg1ywJHUt0I/AAAAAAAAAAU/m-4XeIxjirM/s1600-h/Outlook.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5047816928758118210" style="FLOAT: right; MARGIN: 0px 0px 10px 10px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_Tqc7NMrhT2U/Rg1ywJHUt0I/AAAAAAAAAAU/m-4XeIxjirM/s320/Outlook.jpg" border="0" /&gt;&lt;/a&gt;So what else can I do but to just rant on my blog about it. Wouldn’t you know it; I soon as I went to grab a screen shot – it stopped. So I took the screen shot anyway and circled the place where this happening. On the off chance that someone actually reads this AND they know what the heck that bar means; please let me know.&lt;br /&gt;&lt;br /&gt;I think Microsoft has done a better job at reducing the number of pauses that happen in the software; where things just stop and have you wait for some “background” process to complete. It is my opinion (and we all know how many of these there are and what they’re worth) that it would be better to just tell the user what is going on; it’s the not knowing that makes it hard.&lt;br /&gt;&lt;br /&gt;For instance, when I delete a file in Windows why does it take so long? What would be nice is if Windows told me in the status box…&lt;br /&gt;&lt;br /&gt;"Please wait while I put this file in the recycle bin for you"&lt;br /&gt;"Oh, this is taking longer than I expected because someone else is hogging up the disk channel"&lt;br /&gt;&lt;br /&gt;[&lt;em&gt;Note:&lt;/em&gt; &lt;em&gt;Of course I hope that for the sake of my Mom that they would clean up the message a little; I can just imagine trying to explain that message to her (unlike Don Box's mom, my Mom does not know assembler).&lt;/em&gt;] Now that I know &lt;u&gt;why&lt;/u&gt; I have to wait maybe there is something I can do about it – “Oh yeah, I started that Disk Cleanup utility a couple of minutes ago, maybe I should pause it”. Users will start to draw correlations between things and just become smarter.&lt;br /&gt;&lt;br /&gt;Conceptually what I am describing sound nice; but as a software guy this pretty challenging. It seems like it requires design/architecture that supports the exchange of this type of information. Of course security would have to be honored. Not to mention that you may end up telling people more about the internals of what you are doing (or not doing) than you would like to. This would make a good thing to report on when capturing data around user experience, which Microsoft (and others) seem to be doing more of.&lt;br /&gt;&lt;br /&gt;Sometimes I wish I was working on something this cool.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-8088851407522075668?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/8088851407522075668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=8088851407522075668' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/8088851407522075668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/8088851407522075668'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2007/03/what-are-you-doing-right-now.html' title='What are you doing, right now?'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Tqc7NMrhT2U/Rg1ywJHUt0I/AAAAAAAAAAU/m-4XeIxjirM/s72-c/Outlook.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-8718983324136058925</id><published>2007-03-19T22:28:00.000-04:00</published><updated>2007-03-19T23:14:24.193-04:00</updated><title type='text'>Quotes</title><content type='html'>Just a thought it would be prudent to give credit for the name of my blog; this phrase was uttered by my good friend Bernie Odoy.&lt;br /&gt;&lt;br /&gt;We were feeling pretty punchy one day and were just amazed that how sometimes what we say does not seem to have any impact on those it was said to. Does this happen to anyone else or is it just us? So in a moment of extreme sarcasm Bernie uttered this quote – Sometimes words mean something. I realized its brilliance immediately and wrote it down on a post-it and stuck it to my monitor. That was two employers and 4 years ago.&lt;br /&gt;&lt;br /&gt;Here are some of my other favorite quotes on my board of fame. No one famous; just a bunch of people I have worked with over the years and maybe one or two of my own (I have no idea where this is going).&lt;br /&gt;&lt;br /&gt;“If you say something and no one hears you. Did you really say anything?” This too was uttered by Bernie. I am not sure that it was said on the same day as the previous quote, but certainly has the same sentiment.&lt;br /&gt;&lt;br /&gt;“It’s either Wrox or it’s Box”. This is a quote by yours truly. I used to teach a lot of classes and this one was uttered in response to a question an attendee asked me. They asked me what the difference is between the two books – a book published by Wrox (a technical publisher) or another book (I don’t remember the titles and that’s probably a good thing to protect the guilty). At the time I was not a big fan of books published by Wrox; nothing personal, but they just seemed to be a book factory and the quality suffered because of that. So I was comparing a book published by Wrox to a book written by someone else who was all about quality - Don Box. Don is this really cool down to earth dude who also happens to be really smart and articulate - leathal combination. Don had a way of presenting information with layers; so no matter your “level” you would walk away with something. That takes skill and time; two things that you don’t get when you are rushing a book to market. So I was trying to say that either you get something quick or you get quality. Hmmm, I seem to recall telling some project managers I have worked with in the past the same thing…&lt;br /&gt;&lt;br /&gt;“…It’s still a collection; it’s just that it’s a collection of one”. My good friend Greg Manto gets credit for this one. At the time we were working at Microsoft (as consultants) and Greg, Bernie and I were all on the same engagement together. We were building this object model for our client written entirely in VB4. Yikes! We were in a design meeting discussing how to implment this one class and Greg uttered this quote. He did not mean to imply that everything is a collection, but rather that just because you only have one does not mean that it is NOT a collection. He went on to say that if there is a good chance that there will be more than one in the future make it a collection today; so that the object model does not need to be changed to accomodate this in the future. You can use defaults and shortcut properties to make getting to the most common element in a collection easy. It is something that has stuck with me ever since and I get a chuckle every time pull it out of the archives.&lt;br /&gt;&lt;br /&gt;I realize these are never going to make to the quote hall of fame; but they were uttered by some code warriors in the heat of battle. In my book, that makes them pretty good.&lt;br /&gt;&lt;br /&gt;By the way, I still have the original post-it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-8718983324136058925?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/8718983324136058925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=8718983324136058925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/8718983324136058925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/8718983324136058925'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2007/03/quotes.html' title='Quotes'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8424469681532772295.post-6540494738563113195</id><published>2007-03-15T08:01:00.000-04:00</published><updated>2007-03-19T13:02:59.574-04:00</updated><title type='text'>Back in the saddle again</title><content type='html'>After a long hiatus from blogging I have decided to get back online. I feel like there is plenty to comment on regardless of whether anyone is listening or not.&lt;br /&gt;&lt;br /&gt;On a professional note; I just had to cancel a vacation in order to debug a performance problem at work. It is one of those particularly gnarley problems that does not occur regularly. It is always interesting to get back into the mindset of solving performance problems. They require an extreme amount of rigor and analysis. It's a different mindset than pure development.&lt;br /&gt;&lt;br /&gt;I find then when developing I will often change several things at once and then re-run my code testing each of my changes. Typically the changes I make are independent of one another; that is I don't try and fix the same thing more than one way. It reminds me of a couple of core tenets of debugging these types of problems…&lt;br /&gt;&lt;br /&gt;1. Jim McCarthy (formally of the VC++ team) has a principle from his book that states – get to known state and stay there. This is paramount to trying to solve these types of issues. You can’t introduce change into something that is not stable.&lt;br /&gt;&lt;br /&gt;2. Change one variable at a time. Measure. Correlate. Confirm. Consider changing another variable. We had someone change two things in the environment and the problem disappeared. It’s bad enough it happens sporadically, but now we cannot attribute the disappearance to any one thing.&lt;br /&gt;&lt;br /&gt;3. Get to a simple reproducible case as soon as possible. In our case it takes us three hours to recreate the problem – IF (big if) it’s going to happen again. That means we only get 2-3 attempts per working day. We are pretty close to getting that down to an 18 minute case; which means we spend much more time working (not waiting).&lt;br /&gt;&lt;br /&gt;Time to get back to running tests rather than writing about them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8424469681532772295-6540494738563113195?l=ckoppang.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ckoppang.blogspot.com/feeds/6540494738563113195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8424469681532772295&amp;postID=6540494738563113195' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/6540494738563113195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8424469681532772295/posts/default/6540494738563113195'/><link rel='alternate' type='text/html' href='http://ckoppang.blogspot.com/2007/03/back-in-saddle-again.html' title='Back in the saddle again'/><author><name>Curtis Koppang</name><uri>https://profiles.google.com/104777424438824078176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-N-FtaJw6sxc/AAAAAAAAAAI/AAAAAAAAAAA/cLkmDhn28Hs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
