<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" version="2.0">
  <channel>
    <title>Kevin Pang</title>
    <description>ASP.NET, ALT.NET, software development, and software design</description>
    <link>http://kevinwilliampang.com/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.Net Syndication Generator 1.0.0.0 (http://dotnetblogengine.net/)</generator>
    <language>en-GB</language>
    <blogChannel:blogRoll>http://kevinwilliampang.com/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://feeds.feedburner.com/KevinPangDevBlog</blogChannel:blink>
    <dc:creator>Kevin Pang</dc:creator>
    <dc:title>Kevin Pang</dc:title>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/KevinPangDevBlog" type="application/rss+xml" /><item>
      <title>Twitter's "Small Settings Update" Is Anything But</title>
      <description>&lt;p&gt;
Twitter&amp;#39;s latest blog post titled &lt;a href="http://blog.twitter.com/2009/05/small-settings-update.html"&gt;Small Settings Update&lt;/a&gt;&amp;nbsp;states the following:
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	We&amp;#39;ve updated the Notices section of Settings to better reflect how folks are using Twitter regarding replies. Based on usage patterns and feedback, we&amp;#39;ve learned most people want to see when someone they follow replies to another person they follow&amp;mdash;it&amp;#39;s a good way to stay in the loop. &lt;span class="Apple-style-span" style="font-weight: bold"&gt;However, receiving one-sided fragments via replies sent to folks you don&amp;#39;t follow in your timeline is undesirable. Today&amp;#39;s update removes this undesirable and confusing option.&lt;/span&gt;											
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
In other words, before this change you simply saw all tweets posted by the people you followed. &amp;nbsp;Twitter has decided that that was too complicated. &amp;nbsp;So instead, now you will only see tweets posted by people you follow if they are not replies to people you don&amp;#39;t follow...unless the tweet doesn&amp;#39;t begin with &amp;quot;@userwhoyoudontfollow&amp;quot;, in which case you will still see the tweet since it&amp;#39;s not really a &amp;quot;reply&amp;quot;, but a &amp;quot;mention&amp;quot;. &amp;nbsp;There, much better! &amp;nbsp;Thanks for clearing that up Twitter!
&lt;/p&gt;
&lt;p&gt;
I honestly don&amp;#39;t understand the motivation behind this change. &amp;nbsp;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;From my perspective, the less tweets I see, the less valuable Twitter is to me as a conversation and communication service&lt;/span&gt;. &amp;nbsp;I&amp;#39;m not sure what problem they were trying to address here, but judging from the initial response on Twitter there&amp;#39;s obviously a disconnect between how Twitter thinks its users use it and how they actually use it.
&lt;/p&gt;
&lt;p&gt;
Luckily there is a workaround. &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Later in the Twitter blog post, they reveal that &amp;quot;discovery&amp;quot; is still possible:
&lt;/p&gt;
&lt;blockquote&gt;
	Spotting new folks in tweets is an interesting way to check out new profiles and find new people to follow. Despite this update, you&amp;#39;ll still see mentions or references linking to people you don&amp;#39;t follow. For example, you&amp;#39;ll continue to see, &amp;quot;Ev&amp;nbsp;meeting with @biz&amp;nbsp;about work stuff&amp;quot; even if you don&amp;#39;t follow @biz. We&amp;#39;ll be introducing better ways to discover and follow interesting accounts as we release more features in this space.
&lt;/blockquote&gt;
&lt;p&gt;
&lt;span class="Apple-style-span" style="font-weight: bold"&gt;In other words, while replies to people you don&amp;#39;t follow are now hidden from you, tweets that only &amp;quot;mention&amp;quot; people you don&amp;#39;t follow are still visible&lt;/span&gt;.
&lt;/p&gt;
&lt;p&gt;
Let&amp;#39;s say I am following user A but not user B. &amp;nbsp;Twitter&amp;#39;s latest change makes it so that I won&amp;#39;t see user A&amp;#39;s tweet &amp;quot;@userB Let&amp;#39;s go to the park!&amp;quot;. &amp;nbsp;However, if user A only &amp;quot;mentions&amp;quot; user B in their tweet: &amp;quot;I&amp;#39;m going to the park with @userB&amp;quot;, then I can still see it. &amp;nbsp;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;span class="Apple-style-span" style="font-weight: bold"&gt;So, if you want to make sure your replies are visible to all of your followers, just make sure your replies are actually &amp;quot;mentions&amp;quot; by prefixing them with a character&lt;/span&gt;. Expanding on the user A / user B example above, if user A changed their tweet to read &amp;quot;! @userB Let&amp;#39;s go to the park!&amp;quot;, I&amp;#39;d be able to see it again since it didn&amp;#39;t start with &amp;quot;@userB&amp;quot;. &amp;nbsp;It&amp;#39;s a silly hack, but then again it&amp;#39;s a silly feature too so I don&amp;#39;t feel too bad using it.
&lt;/p&gt;
&lt;p&gt;
I&amp;#39;m hoping that this was just a temporary brain fart on Twitter&amp;#39;s part and that it will soon be fixed or that there is some hidden benefit to this feature that I&amp;#39;m missing. &amp;nbsp;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;What do you think about Twitter&amp;#39;s &amp;quot;Small Settings Update&amp;quot;?&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Edit 5/13/2009:
&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Due to user feedback, Twitter has &lt;a href="http://blog.twitter.com/2009/05/we-learned-lot.html"&gt;decided to change how replies work again&lt;/a&gt;.&amp;nbsp; Now, you should be able to see @user replies again, regardless of where the @user is placed...unless the reply was generated by clicking on the &amp;quot;reply&amp;quot; link, in which case it&amp;#39;s still invisible.&amp;nbsp; It&amp;#39;s really amazing how many different, but equally infuriating, ways Twitter can come up with to solve this problem.&amp;nbsp; They have also went against their original claim that this was changed for simplicity sake and now admit that the change was done because of architectural limitations. 
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6UUpDTaCezJ4MBaZFCiF7Zl7dyQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6UUpDTaCezJ4MBaZFCiF7Zl7dyQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6UUpDTaCezJ4MBaZFCiF7Zl7dyQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6UUpDTaCezJ4MBaZFCiF7Zl7dyQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://kevinwilliampang.com/post/Twitters-Small-Settings-Update.aspx</link>
      <author>Kevin Pang</author>
      <comments>http://kevinwilliampang.com/post/Twitters-Small-Settings-Update.aspx#comment</comments>
      <guid>http://kevinwilliampang.com/post.aspx?id=1111215f-5c53-4627-825e-bbfed746aaca</guid>
      <pubDate>Tue, 12 May 2009 21:05:00 -0700</pubDate>
      <dc:publisher>Kevin Pang</dc:publisher>
      <pingback:server>http://kevinwilliampang.com/pingback.axd</pingback:server>
      <pingback:target>http://kevinwilliampang.com/post.aspx?id=1111215f-5c53-4627-825e-bbfed746aaca</pingback:target>
      <slash:comments>13</slash:comments>
      <trackback:ping>http://kevinwilliampang.com/trackback.axd?id=1111215f-5c53-4627-825e-bbfed746aaca</trackback:ping>
      <wfw:comment>http://kevinwilliampang.com/post/Twitters-Small-Settings-Update.aspx#comment</wfw:comment>
      <wfw:commentRss>http://kevinwilliampang.com/syndication.axd?post=1111215f-5c53-4627-825e-bbfed746aaca</wfw:commentRss>
    </item>
    <item>
      <title>Should You Use ASP.NET MVC?</title>
      <description>&lt;p&gt;
There are a lot of ASP.NET web forms developers out there who admit that they simply don&amp;#39;t &amp;quot;&lt;a href="http://stackoverflow.com/questions/390693/does-anyone-beside-me-just-not-get-asp-net-mvc"&gt;get it&lt;/a&gt;&amp;quot; when it comes to all the hubbub surrounding ASP.NET MVC.&amp;nbsp; In some ways, I can sympathize with them.&amp;nbsp; The vocal minority that raves about ASP.NET MVC gush about it with such zeal that they make it sound like you&amp;#39;d have to be a fool not to switch over.&amp;nbsp; In actuality, the decision isn&amp;#39;t nearly as black and white.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
ASP.NET web forms aren&amp;#39;t going anywhere.&amp;nbsp; &lt;strong&gt;As much as I love ASP.NET MVC, it is not the end-all-be-all one-size-fits-all solution to web development&lt;/strong&gt;.&amp;nbsp; Both of these approaches have their rightful place in a web developer&amp;#39;s toolbox and it&amp;#39;s important to recognize their strengths and weaknesses.&amp;nbsp; In general, the ASP.NET MVC framework tends to sacrafice ease-of-use (e.g. viewstate, validation, etc.) in order give developers tighter control over the reins.&amp;nbsp; This can be a great thing, but only if you take advantage of it.&amp;nbsp; Otherwise it can just as easily be a hindrance. 
&lt;/p&gt;
&lt;p&gt;
With that in mind, I have developed a quick metric to determine if ASP.NET MVC is right for you.&amp;nbsp; The way I see it, there are three primary reasons a developer should choose the ASP.NET MVC framework over ASP.NET web forms.&amp;nbsp; If none of these reasons are compelling to you, then you should stick with ASP.NET web forms: 
&lt;/p&gt;
&lt;h2&gt;To Unit Test&lt;/h2&gt;
&lt;p&gt;
This, in my opinion, is the most compelling reason to use ASP.NET MVC.&amp;nbsp; &lt;strong&gt;When it comes to unit testing, ASP.NET MVC simply blows ASP.NET web forms out of the water&lt;/strong&gt;.&amp;nbsp; It&amp;#39;s not even close.&amp;nbsp; Whereas ASP.NET web forms requires you to jump through all sorts of hoops to test around the page event lifecycle, the ASP.NET MVC framework practically begs to be tested.&amp;nbsp; There are interfaces &lt;em&gt;everywhere &lt;/em&gt;screaming &amp;quot;&lt;strong&gt;mock me!&lt;/strong&gt;&amp;quot;.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
There&amp;#39;s a reason why the biggest ASP.NET MVC supporters also tend to be TDD proponents; it&amp;#39;s because ASP.NET MVC actually allows for TDD.&amp;nbsp; Personally, I think this is where all the zeal comes from.&amp;nbsp; Simply put: it&amp;#39;s really, really hard to do TDD with ASP.NET web forms and really, really easy to do it in ASP.NET MVC. 
&lt;/p&gt;
&lt;h2&gt;To Gain Control and Extensibility&lt;br /&gt;
&lt;/h2&gt;
&lt;p&gt;
As pointed out in the comments, ASP.NET MVC gives you more control and extensibility options than ASP.NET web forms.&amp;nbsp; You get complete control over the page request lifecycle and the ability to substitute out several key pieces of the framework (e.g. view engine, routing, etc.), none of which is possible with ASP.NET web forms.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
In addition to this, you also gain full control over the rendered HTML.&amp;nbsp; In general, the rendered HTML from ASP.NET web forms applications is atrocious.&amp;nbsp; The web controls it utilizes generate garbage ids and hidden fields galore that not only hamper the performance of a site, but also make CSS styling and Javascript development a pain.&amp;nbsp; ASP.NET MVC forces you to be more in tune with your HTML.&amp;nbsp; There aren&amp;#39;t any repeaters or datagrids that magically generate markup for you.&amp;nbsp; There aren&amp;#39;t any hidden fields to persist state for you.&amp;nbsp; It&amp;#39;s just you, the HTML, and a few extension methods (which you don&amp;#39;t even have to use). 
&lt;/p&gt;
&lt;h2&gt;To Learn Something New &lt;/h2&gt;
&lt;p&gt;
In other words, &amp;quot;because you feel like it&amp;quot;.&amp;nbsp; This was actually why I started using ASP.NET MVC.&amp;nbsp; It never hurts to look at how you&amp;#39;re approaching development from another angle.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
I should also point out that learning ASP.NET MVC is incredibly engaging process since the ASP.NET MVC framework team has been so interactive in the process.&amp;nbsp; I think a large part of the appeal of ASP.NET MVC is that the community&amp;#39;s input is not only being taken into consideration, it is actively being sought after.&amp;nbsp; The framework has sparked so many discussions and debates over best practices that simply following along introduces you to concepts you might previously have been unaware of.&amp;nbsp; I would actually recommend learning the ASP.NET MVC framework for this reason alone.&amp;nbsp; The threads on TDD, BDD, ORM, AJAX, etc. you stumble across during the learning process are worth it. 
&lt;/p&gt;
&lt;p&gt;
So there you have it.&amp;nbsp; Aside from those three, I can&amp;#39;t think of any other reasons why a developer would learn ASP.NET MVC.&amp;nbsp; Maybe this is why the adoption rate isn&amp;#39;t nearly as high as we think it should be.&amp;nbsp; The incentive for using the framework essentially boils down to unit testing, control/extensibility, and boredom/curiosity.&amp;nbsp; Good reasons, to be sure, but hardly game breakers for the vast majority of developers out there. 
&lt;/p&gt;
&lt;p&gt;
What do you think?&amp;nbsp; I&amp;#39;m interested in seeing if anyone can come up with another reason(s) that I may have missed here.&amp;nbsp; &lt;strong&gt;Why do you use ASP.NET MVC&lt;/strong&gt;?
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kC4UEIAKd-pWFSQWEPYNxqryulk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kC4UEIAKd-pWFSQWEPYNxqryulk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kC4UEIAKd-pWFSQWEPYNxqryulk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kC4UEIAKd-pWFSQWEPYNxqryulk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://kevinwilliampang.com/post/Should-You-Use-ASPNET-MVC.aspx</link>
      <author>Kevin Pang</author>
      <comments>http://kevinwilliampang.com/post/Should-You-Use-ASPNET-MVC.aspx#comment</comments>
      <guid>http://kevinwilliampang.com/post.aspx?id=91f6b44f-57d0-4204-8277-bd16556fd9da</guid>
      <pubDate>Tue, 21 Apr 2009 15:50:00 -0700</pubDate>
      <dc:publisher>Kevin Pang</dc:publisher>
      <pingback:server>http://kevinwilliampang.com/pingback.axd</pingback:server>
      <pingback:target>http://kevinwilliampang.com/post.aspx?id=91f6b44f-57d0-4204-8277-bd16556fd9da</pingback:target>
      <slash:comments>26</slash:comments>
      <trackback:ping>http://kevinwilliampang.com/trackback.axd?id=91f6b44f-57d0-4204-8277-bd16556fd9da</trackback:ping>
      <wfw:comment>http://kevinwilliampang.com/post/Should-You-Use-ASPNET-MVC.aspx#comment</wfw:comment>
      <wfw:commentRss>http://kevinwilliampang.com/syndication.axd?post=91f6b44f-57d0-4204-8277-bd16556fd9da</wfw:commentRss>
    </item>
    <item>
      <title>Content-Stealing Jerks</title>
      <description>&lt;p&gt;
&lt;strong&gt;Edit 3/29/2009 7:23 PM: &lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;It appears that Delimitdesign has finally caught wind of this thread and has altered their post to look less like a blatant rip off of mine.&amp;nbsp; They also&amp;nbsp;modified the post date from 3/28/2009 to 5/28/2008.&amp;nbsp; Right.&amp;nbsp; Too bad Google cache&amp;nbsp;clearly shows their original post in its full copy &amp;amp; paste glory with the actual date they had posted it on: &lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://kevinwilliampang.com/image.axd?picture=Proof2.jpg" alt="" width="620" height="352" /&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;You can view the full screenshot &lt;a href="http://kevinwilliampang.com/image.axd?picture=GoogleCache3.jpg"&gt;here&lt;/a&gt;. &amp;nbsp;I took it just in case the Google cache page updated.&lt;/strong&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Original post:&lt;/strong&gt;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
I&amp;#39;ve grown somewhat accustomed to seeing my articles regurgitated on some random blogger&amp;#39;s site and passed off as their own. &amp;nbsp;Usually I just send the content-stealing jerk (CSJ for future reference) an e-mail asking that they provide some sort of link back to my original article and leave it at that. &amp;nbsp;Sometimes they comply, oftentimes they don&amp;#39;t. &amp;nbsp;In the end, life goes on. &amp;nbsp;After all, it&amp;#39;s not like I&amp;#39;m going to press charges over it. &amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
It&amp;#39;s a problem that&amp;#39;s existed ever since the advent of blogging. &amp;nbsp;In general, I think bloggers have pretty much become desensitized to it. &amp;nbsp;Every few months you&amp;#39;ll hear someone cry foul, but that&amp;#39;s about all we can do. &amp;nbsp;Personally, I&amp;#39;m not a big fan of smear campaigns, especially since they tend to give the CSJs more traffic than they would have gotten otherwise. &amp;nbsp;However, it seems that the CSJs are finally evolving from no-name bloggers with 5 readers to large, professional-looking CMS-type deals. 
&lt;/p&gt;
&lt;p&gt;
Thanks to some heads-up readers e-mails today, I found out that a site called Delimitdesign was featuring an article on their home page that was copied word-for-word from my blog.&amp;nbsp; 
&lt;/p&gt;
&lt;table border="0"&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;td style="padding-right: 10px; vertical-align: top"&gt;&lt;img style="width: 300px" src="http://kevinwilliampang.com/image.axd?picture=MyPost.JPG" alt="" width="300" height="324" /&gt;&lt;/td&gt;																		
			&lt;td&gt;&lt;img style="width: 300px" src="http://kevinwilliampang.com/image.axd?picture=TheirPost.JPG" alt="" width="300" height="369" /&gt;&lt;/td&gt;												
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="text-align: center"&gt;&lt;em&gt;&lt;a href="http://kevinwilliampang.com/post/Top-10-Things-That-Annoy-Programmers.aspx"&gt;My post&lt;/a&gt;&lt;/em&gt;&lt;/td&gt;																		
			&lt;td style="text-align: center"&gt;&lt;em&gt;Delimitdesign&amp;#39;s carbon copy&lt;/em&gt;&lt;/td&gt;												
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
&lt;p&gt;
I promptly sent them an e-mail which thus far has gone unanswered. &amp;nbsp;I also left a couple replies to the post which were not approved (surprise, surprise). &amp;nbsp;I even &lt;a href="http://twitter.com/KevinPang/status/1410805594"&gt;@replied&lt;/a&gt; to them on Twitter without any luck. &amp;nbsp;What&amp;#39;s worse, &lt;strong&gt;it appears that I&amp;#39;m not the only one they&amp;#39;ve ripped off&lt;/strong&gt;. &amp;nbsp;Out of curiosity, I took a look at another one of their articles featured on their home page: 
&lt;/p&gt;
&lt;p&gt;
&lt;a rel="nofollow" href="http://delimitdesign.com/inspirational/101-ways-to-know-your-software-project-management-is-doomed/"&gt;http://delimitdesign.com/inspirational/101-ways-to-know-your-software-project-management-is-doomed/&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
A quick Google search revealed that it was a carbon copy of an article written by someone else: 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.codesqueeze.com/101-ways-to-know-your-software-project-is-doomed/"&gt;http://www.codesqueeze.com/101-ways-to-know-your-software-project-is-doomed/&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
After some more digging around, it became quite clear that &lt;strong&gt;several of their posts were turning up a separate, but identical, blog post written by someone else&lt;/strong&gt;. &amp;nbsp;In other words, the site appears to be digging up old, popular posts and regurgitating them as their own. 
&lt;/p&gt;
&lt;p&gt;
This is nothing new of course. &amp;nbsp;I think most bloggers have put up with it so long simply because thus far the CSJs have been relatively harmless. &amp;nbsp;&lt;strong&gt;But what do we do when the CSJs become more established&lt;/strong&gt;? 
&lt;/p&gt;
&lt;p&gt;
Honestly, I&amp;#39;m not entirely sure how to react. &amp;nbsp;My only recourses, thus far, have been to politely ask them to stop and to notify the public of their behavior. &amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
It&amp;#39;s not just the blogging CSJs we have to worry about either. &amp;nbsp;As Jeff Atwood noticed today, someone seems to have ripped off the entire &lt;a href="http://stackoverflow.com"&gt;StackOverflow&lt;/a&gt; site: 
&lt;/p&gt;
&lt;table border="0"&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;td style="padding-right: 10px; vertical-align: top"&gt;&lt;img style="width: 300px" src="http://kevinwilliampang.com/image.axd?picture=StackOverflow.JPG" alt="" width="300" height="188" /&gt;&lt;/td&gt;																		
			&lt;td&gt;&lt;img style="width: 300px" src="http://kevinwilliampang.com/image.axd?picture=CNProg.JPG" alt="" width="300" height="188" /&gt;&lt;/td&gt;												
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="text-align: center"&gt;&lt;em&gt;&lt;a href="http://stackoverflow.com"&gt;StackOverflow&lt;/a&gt;&lt;/em&gt;&lt;/td&gt;																		
			&lt;td style="text-align: center"&gt;&lt;em&gt;CNProg&amp;#39;s carbon copy&lt;/em&gt;&lt;/td&gt;												
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
&lt;p&gt;
What do we do in this case? &amp;nbsp;It&amp;#39;s not like Jeff has a copyright on his CSS, javascript, or design (&lt;span class="Apple-style-span" style="font-style: italic"&gt;&lt;strong&gt;edit&lt;/strong&gt;: as pointed out by several commenters both here and on Reddit, he very well may, but whether or not he can enforce it is still questionable and dependent on where the infringers live and possibly how much is copied&lt;/span&gt;). &amp;nbsp;It seems his only retort -- as well as mine -- is to cry foul and throw a little mud (exactly what I&amp;#39;m doing here). &amp;nbsp;I think Jeff, and anyone else who has had their content ripped off, would agree that mud slinging isn&amp;#39;t all that satisfying.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
The only solution that I have devised to curtail this is to take away the CSJs incentive for ripping off other people&amp;#39;s content (e.g. their visitors and thus, their advertising revenue). &amp;nbsp;&lt;strong&gt;I propose a new site: ContentStealingJerks.com, which would let people flag articles they recognize as blatant ripoffs of someone else&amp;#39;s original content&lt;/strong&gt;. &amp;nbsp;It could come with a firefox plugin that would redirect users to the original article when they visit a flagged page. &amp;nbsp;What do you think? &amp;nbsp;Good idea? &amp;nbsp;Bad idea? &amp;nbsp;Or already implemented and I just haven&amp;#39;t realized it? 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Edit 3/29/2009 3:58 AM&lt;/strong&gt;: 
&lt;/p&gt;
&lt;p&gt;
Thanks to the comments readers have left here and on &lt;a href="http://www.reddit.com/r/programming/comments/88bkk/content_stealing_jerks/"&gt;Reddit&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="http://news.ycombinator.com/item?id=537187"&gt;Hacker News&lt;/a&gt;, I&amp;#39;ve learned that there are indeed things I can do. &amp;nbsp;I have now reported Delimitdesign through Google Adsense&amp;#39;s complaint feature (which should eliminate any monetary gains they&amp;#39;ve gained from their content ripping) as well as through Google Webmaster Tools (which should remove them from Google&amp;#39;s search index). &amp;nbsp;Tomorrow, I plan on filing a DMCA complaint as well. 
&lt;/p&gt;
&lt;p&gt;
I also discovered that Delimitdesign didn&amp;#39;t bother to swap out the images when they copy/pasted my article, meaning their article is using images hosted on my server. &amp;nbsp;So I took the liberty of swapping them out. &amp;nbsp;Here&amp;#39;s the final result: 
&lt;/p&gt;
&lt;p&gt;
&lt;img style="width: 600px" src="http://kevinwilliampang.com/image.axd?picture=Revenge.JPG" alt="" width="600" height="528" /&gt;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Yes, I know. &amp;nbsp;I missed a golden opportunity to use goatse or tubgirl or something along those lines. &amp;nbsp;Don&amp;#39;t think I wasn&amp;#39;t tempted. &amp;nbsp;In the end though, I&amp;#39;d rather just get the message out rather than gross out their (presumably) innocent visitors. 
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WxzTg9IWzEoyuTm9BGc4x3wMg2o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WxzTg9IWzEoyuTm9BGc4x3wMg2o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/WxzTg9IWzEoyuTm9BGc4x3wMg2o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WxzTg9IWzEoyuTm9BGc4x3wMg2o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://kevinwilliampang.com/post/Content-Stealing-Jerks.aspx</link>
      <author>Kevin Pang</author>
      <comments>http://kevinwilliampang.com/post/Content-Stealing-Jerks.aspx#comment</comments>
      <guid>http://kevinwilliampang.com/post.aspx?id=ace6f796-fac6-44f3-a9f6-f73621622f50</guid>
      <pubDate>Sat, 28 Mar 2009 22:06:00 -0700</pubDate>
      <dc:publisher>Kevin Pang</dc:publisher>
      <pingback:server>http://kevinwilliampang.com/pingback.axd</pingback:server>
      <pingback:target>http://kevinwilliampang.com/post.aspx?id=ace6f796-fac6-44f3-a9f6-f73621622f50</pingback:target>
      <slash:comments>103</slash:comments>
      <trackback:ping>http://kevinwilliampang.com/trackback.axd?id=ace6f796-fac6-44f3-a9f6-f73621622f50</trackback:ping>
      <wfw:comment>http://kevinwilliampang.com/post/Content-Stealing-Jerks.aspx#comment</wfw:comment>
      <wfw:commentRss>http://kevinwilliampang.com/syndication.axd?post=ace6f796-fac6-44f3-a9f6-f73621622f50</wfw:commentRss>
    </item>
    <item>
      <title>What ASP.NET MVC Can Learn From Ruby on Rails</title>
      <description>&lt;p&gt;Simon Torkumine, a Ruby on Rails developer, recently blogged about how the &lt;a href="http://www.tokumine.com/2009/03/21/net-mvc-vs-ruby-on-rails/"&gt;ASP.NET MVC framework compares to Ruby on Rails&lt;/a&gt;. While there are some parts of his post that I don&amp;#39;t necessarily agree with (e.g. the anemic community, C# being too verbose), one point he brought up rang true to me:&lt;/p&gt;&lt;blockquote&gt;	.NET MVC is actually .NET VC. It is an attempt to replicate the Actionpack components of Rails. There is nothing included aside from a folder labeled &amp;ldquo;Models&amp;rdquo; to help you with your persistence later and domain modeling. As others have mentioned, there are other ORM tools out there, but bear in mind these are targeted at traditional ASP.NET development and are not integrated into the framework as in other MVC&amp;rsquo;s. This means that you&amp;rsquo;ll be writing your own validation and form handling code for starters.&lt;/blockquote&gt;&lt;p&gt;I couldn&amp;#39;t agree more.  &lt;strong&gt;The biggest pain point in my development experience with the ASP.NET MVC framework has been its incredibly lax approach to the &amp;quot;M&amp;quot; in &amp;quot;MVC&amp;quot;&lt;/strong&gt;.  Whereas the views and controllers are pretty much hashed out, developers are essentially thrown into the deep end when it comes to the model.  That means that persistence and validation is completely up to us, which is great for experienced developers who have very opinionated views on what best to insert here but extremely terrifying when for developers approaching the framework for the very first time.&lt;/p&gt;&lt;p&gt;This may be a matter of opinion here, but for me web application frameworks are expected to come with all the necessities to get a basic site up and running.  This is not so when it comes to the ASP.NET MVC framework.  At first it appeared that Linq 2 Sql would be the clear-cut answer to the persistence question.  After all, Linq 2 Sql was developed by Microsoft and was used in almost every single Microsoft blogger&amp;#39;s posts on ASP.NET MVC.  But then something happened.  Microsoft announced that it would &lt;a href="http://blogs.msdn.com/adonet/archive/2008/10/29/update-on-linq-to-sql-and-linq-to-entities-roadmap.aspx"&gt;no longer be supporting Linq 2 Sql&lt;/a&gt; and ever since then the community has been a flock without a sheppard.  &lt;/p&gt;&lt;p&gt;Microsoft&amp;#39;s suggested replacement, the Entity Framework, is so actively despised by the community that there was a &lt;a href="http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/"&gt;petition against it&lt;/a&gt;.  To date, I have yet to see a single example of integrating the Entity Framework into an ASP.NET MVC application. NHibernate has a decent following, but it&amp;#39;s not exactly user friendly or easy to set up.  Subsonic, the obvious alternative to Linq 2 Sql doesn&amp;#39;t appear to have garnered too much support.&lt;/p&gt;&lt;p&gt;Validation has also gone by the wayside because of this as it is tends to be tied in with the persistence layer. Scott Guthrie&amp;#39;s &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx"&gt;initial post on validation in the ASP.NET MVC framework&lt;/a&gt; revolved around handling Linq 2 Sql&amp;#39;s &amp;quot;OnValidate&amp;quot; event when saving off entities to the database.  Now that Linq 2 Sql is essentially out of the picture, we&amp;#39;re left with either writing our own or going with one of the many newly created OSS solutions like &lt;a href="http://xval.codeplex.com/"&gt;xVal&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;There is a significant difference between being allowed to go outside the box and being forced to&lt;/strong&gt;.  The &amp;quot;rails way or the highway&amp;quot; approach that Ruby on Rails takes is great for beginners, but not so great when you want to go outside of the box. ASP.NET MVC&amp;#39;s complete lack of guidance when it comes to models has the opposite problem in that beginners don&amp;#39;t know what to do, but are free to explore whatever options they want. This may prove to be a big problem for the adoption rate of ASP.NET MVC now that it&amp;#39;s advancing past the point of early adopters who are willing to put up with the growing pains.  &lt;/p&gt;&lt;p&gt;To be clear here: I know that there are several valid solutions for how to handle validation and persistence in ASP.NET MVC, and it&amp;#39;s great that each of them is available to us. The problem is that you have to actively hunt these solutions down instead of having one of them baked into the framework. It&amp;#39;s great that ASP.NET MVC is so extensible that you can essentially plug in whatever you want, but at some point some basic guidance is called for.&amp;nbsp;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;A blank slate is intimidating and not very user friendly&lt;/span&gt;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;In the end, it seems like there should be a middle ground between the Ruby on Rails approach and the ASP.NET MVC approach&lt;/span&gt;. Perhaps the project template could ask the user if they wanted to link this application up to an existing database or create a new one? &amp;nbsp;If they did, it could generate the model (even if it were empty) using Linq 2 Sql and throw in Scott Guthrie&amp;#39;s validation code in there as well? &amp;nbsp;That would provide users with a starting point at least that could be easily ignored or stripped out if so desired.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What are your thoughts?&lt;/strong&gt; I want as much as anyone else to see ASP.NET MVC become successful -- and in my opinion it could be -- and it would be a shame to see if struggle in the wild because it didn&amp;#39;t take a few extra steps to cater to the beginner audience.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/nnxlbkPWTRaNygrKgYu6YWA1osA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nnxlbkPWTRaNygrKgYu6YWA1osA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/nnxlbkPWTRaNygrKgYu6YWA1osA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nnxlbkPWTRaNygrKgYu6YWA1osA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://kevinwilliampang.com/post/What-ASPNET-MVC-Can-Learn-From-Ruby-on-Rails.aspx</link>
      <author>Kevin Pang</author>
      <comments>http://kevinwilliampang.com/post/What-ASPNET-MVC-Can-Learn-From-Ruby-on-Rails.aspx#comment</comments>
      <guid>http://kevinwilliampang.com/post.aspx?id=7eeed705-53ce-4b36-a290-fdd5256a6f5d</guid>
      <pubDate>Sat, 21 Mar 2009 14:52:00 -0700</pubDate>
      <dc:publisher>Kevin Pang</dc:publisher>
      <pingback:server>http://kevinwilliampang.com/pingback.axd</pingback:server>
      <pingback:target>http://kevinwilliampang.com/post.aspx?id=7eeed705-53ce-4b36-a290-fdd5256a6f5d</pingback:target>
      <slash:comments>28</slash:comments>
      <trackback:ping>http://kevinwilliampang.com/trackback.axd?id=7eeed705-53ce-4b36-a290-fdd5256a6f5d</trackback:ping>
      <wfw:comment>http://kevinwilliampang.com/post/What-ASPNET-MVC-Can-Learn-From-Ruby-on-Rails.aspx#comment</wfw:comment>
      <wfw:commentRss>http://kevinwilliampang.com/syndication.axd?post=7eeed705-53ce-4b36-a290-fdd5256a6f5d</wfw:commentRss>
    </item>
    <item>
      <title>A Programmer's Plea to Laptop Makers</title>
      <description>&lt;p&gt;
My laptop died recently and because of this I&amp;#39;ve been doing some preliminary research to find myself a replacement. &amp;nbsp;It&amp;#39;s been awhile since I&amp;#39;ve had to purchase a laptop, so I was a bit surprised when I couldn&amp;#39;t immediately find one that I was satisfied with. &amp;nbsp;For some reason I thought that finding a suitable laptop for development that met my short list of criteria wouldn&amp;#39;t be very difficult. &amp;nbsp;But the more research I did the more apparent it became that &amp;quot;software developer&amp;quot; wasn&amp;#39;t a target demographic laptop manufacturers were trying to capture. &amp;nbsp;With that being said, here&amp;#39;s my short plea to laptop makers:
&lt;/p&gt;
&lt;h2&gt;Don&amp;#39;t Mess With the Home/End/Page Up/Page Down/Insert/Delete Keys&lt;/h2&gt;
&lt;p&gt;
&lt;img src="http://kevinwilliampang.com/image.axd?picture=Keyboard.jpg" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
Seriously. &amp;nbsp;&lt;strong&gt;We&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;need those&lt;/strong&gt;. &amp;nbsp;There&amp;#39;s a reason why the QWERTY keyboard layout has remained stagnant throughout the years. &amp;nbsp;It&amp;#39;s because people are used to it and they would riot in the streets if it suddenly changed.&amp;nbsp; Why then, are the home/end/page up/page down/insert/delete keys somehow considered free game to be mangled beyond recognition? I realize that there are space constraints with laptop keyboards, but it&amp;#39;s not as though preserving their layout hasn&amp;#39;t been done before. In fact, I seem to recall &lt;em&gt;more&lt;/em&gt; laptops with the standard 2x3 layout in the past than I see now.
&lt;/p&gt;
&lt;p&gt;
Honorable mention: As someone mentioned in the comments, another common keyboard change is switching the function and ctrl keys. &amp;nbsp;Most programmers -- and computer users in general -- use copy (ctrl-c + ctrl-v) and paste (ctrl-x + ctrl-v) so much that it&amp;#39;s become a muscle reflex. &amp;nbsp;Swapping these two keys takes a *lot* of adjusting to get used to.
&lt;/p&gt;
&lt;h2&gt;Test the Heat Under Heavy Load&lt;/h2&gt;
&lt;p&gt;
&lt;img src="http://kevinwilliampang.com/image.axd?picture=Macbook.jpg" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
Ok, so here&amp;#39;s the thing:&amp;nbsp;&lt;strong&gt;every single laptop I have ever owned turns into a scalding hot piece of plastic punishment after running Visual Studio for 1-2 hours&lt;/strong&gt;.&amp;nbsp; I realize there are physical constraints that make cooling a laptop a significant challenge -- and I know that I may also be in the minority here -- but I&amp;#39;d be willing to put up with a bulkier (read: larger *gasp*) laptop if it meant that I could get proper cooling in return.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
For the most part I think laptop &amp;quot;portability&amp;quot; is vastly overrated.&amp;nbsp; The difference between carrying a 4 pound laptop and an 8 pound laptop isn&amp;#39;t that big unless you&amp;#39;re &lt;a href="http://en.wikipedia.org/wiki/Steve_Urkel"&gt;Steve Urkel&lt;/a&gt;&amp;nbsp;(ok, so this may be a concern for the programmer demographic). I&amp;#39;m not playing shotput with my laptop. &amp;nbsp;I&amp;#39;m not doing curls with my laptop. I&amp;#39;m putting it on my lap, which can handle a little extra weight being put on it.&amp;nbsp; What it can&amp;#39;t handle however is being scalded by a poorly ventilated brick of heat.
&lt;/p&gt;
&lt;h2&gt;A 5400 RPM Hard Drive Is NOT Fast Enough&lt;/h2&gt;
&lt;p&gt;
Scott Guthrie has a great&amp;nbsp;&lt;a href="http://weblogs.asp.net/scottgu/archive/2007/11/01/tip-trick-hard-drive-speed-and-visual-studio-performance.aspx"&gt;blog post&lt;/a&gt; -- written&amp;nbsp;&lt;strong&gt;one and a half years ago&lt;/strong&gt; -- about how a 5400 RPM hard drive is often a bottleneck when developing on a laptop. &amp;nbsp;Nowadays it&amp;#39;s easy to find standard cookie-cutter laptop configurations with 4 GB of RAM and 2+ GHZ dual core processors that are secretly tied down by a 5400 RPM hard drive. &amp;nbsp;Granted, this is less of a problem if you&amp;#39;re willing to pay up the wazoo to upgrade to a solid state drive (and the advantages of these are even debatable in a development environment). &amp;nbsp;For the rest of us, we&amp;#39;re lucky to have an option to upgrade to a 7200 RPM hard drive, let alone a 10,000 RPM one.
&lt;/p&gt;
&lt;h2&gt;Glossy Screens Can&amp;#39;t Be Read In Daylight&lt;/h2&gt;
&lt;p&gt;
As great as a glossy screen can be for watching DVDs in the black of night, I can&amp;#39;t read a single thing on them in the daylight. &amp;nbsp;Granted, this really isn&amp;#39;t much of a problem since programmers are deathly allergic to natural light. &amp;nbsp;But on the off chance that I want to get some work done at a park or at the beach, there&amp;#39;s absolutely no way of doing this with a glossy screen.
&lt;/p&gt;
&lt;h2&gt;Not All of Us Want a Widescreen&lt;/h2&gt;
&lt;p&gt;
As mentioned in the comments, a widescreen isn&amp;#39;t always best for programming. &amp;nbsp;Vertical space is far more precious to a developer than horizontal space. &amp;nbsp;Most code is in the first 80 characters, so having the abililty to see 300 characters across usually just leads to a bunch of excessive whitespace. &amp;nbsp;Yes, if you&amp;#39;re running multiple apps side-by-side, the widescreen monitor becomes very handy. &amp;nbsp;But for the typical Visual Studio developer, this usually isn&amp;#39;t the case.
&lt;/p&gt;
&lt;p&gt;
Well, that&amp;#39;s my list. &amp;nbsp;I still haven&amp;#39;t pulled the trigger on a purchase yet, but the comments have given me a lot to think about and research. &amp;nbsp;I don&amp;#39;t claim to be a hardware expert so if I have grossly mistated anything here, let me know. &amp;nbsp;Have any other suggestions for this list? &amp;nbsp;Leave them in the comments below.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_VecIhUAumfkJAMw7sAUQzJOnvM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_VecIhUAumfkJAMw7sAUQzJOnvM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_VecIhUAumfkJAMw7sAUQzJOnvM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_VecIhUAumfkJAMw7sAUQzJOnvM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://kevinwilliampang.com/post/A-Programmers-Plea-to-Laptop-Makers.aspx</link>
      <author>Kevin Pang</author>
      <comments>http://kevinwilliampang.com/post/A-Programmers-Plea-to-Laptop-Makers.aspx#comment</comments>
      <guid>http://kevinwilliampang.com/post.aspx?id=98e2623c-b5dd-4324-abf0-7ece959f8e73</guid>
      <pubDate>Thu, 12 Mar 2009 06:51:00 -0700</pubDate>
      <dc:publisher>Kevin Pang</dc:publisher>
      <pingback:server>http://kevinwilliampang.com/pingback.axd</pingback:server>
      <pingback:target>http://kevinwilliampang.com/post.aspx?id=98e2623c-b5dd-4324-abf0-7ece959f8e73</pingback:target>
      <slash:comments>53</slash:comments>
      <trackback:ping>http://kevinwilliampang.com/trackback.axd?id=98e2623c-b5dd-4324-abf0-7ece959f8e73</trackback:ping>
      <wfw:comment>http://kevinwilliampang.com/post/A-Programmers-Plea-to-Laptop-Makers.aspx#comment</wfw:comment>
      <wfw:commentRss>http://kevinwilliampang.com/syndication.axd?post=98e2623c-b5dd-4324-abf0-7ece959f8e73</wfw:commentRss>
    </item>
    <item>
      <title>Jeff Atwood Finally Jumps the Shark</title>
      <description>&lt;p&gt;
Well, we all knew it had to happen eventually.&amp;nbsp; After years of great blog posts and insightful commentary on the programming world, &lt;strong&gt;Jeff Atwood has finally jumped the shark in his &lt;a href="http://www.codinghorror.com/blog/archives/001225.html"&gt;latest post&lt;/a&gt; which essentially says &amp;quot;programming is hard, let&amp;#39;s go shopping!&amp;quot;&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
Now I&amp;#39;m not entirely sure why Jeff and Joel have decided to &lt;a href="http://www.joelonsoftware.com/items/2009/01/31.html"&gt;wage war against SOLID&lt;/a&gt;.&amp;nbsp; At first I thought it was just a bit of verbal diarrhea and I sympathized.&amp;nbsp; I am very aware of how easy it is to say something stupid when you&amp;#39;re just casually bantering with a friend or colleague.&amp;nbsp; However, from the tone of his post and the subsequent comments it received, it seems that lines are being drawn and the battle is on.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Honestly, I don&amp;#39;t really understand what all the commotion is about.&amp;nbsp; &lt;a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod"&gt;SOLID&lt;/a&gt; isn&amp;#39;t all that controversial in my opinion. &lt;strong&gt;Jeff&amp;#39;s main problem seems to be that by introducing so many best principles and practices, we run the risk of overwhelming programmers with too much guidance:
&lt;/strong&gt;
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	The bigger and more grandiose the set of rules you come up with, the
	more severe the danger. A few broad guidelines on a paint can begets
	thirty rules for painting, which begets a hundred detailed principles
	of painting.. 
	&lt;/p&gt;
	&lt;p&gt;
	Pretty soon you&amp;#39;ll find yourself believing that every possible situation in software development can be prescribed, &lt;em&gt;if only you could come up with a sufficiently detailed set of rules!&lt;/em&gt;
	And, of course, a critical mass of programmers patient enough to read
	Volumes I - XV of said rules. You&amp;#39;ll also want to set up a few
	messageboards for these programmers to argue endlessly amongst
	themselves about the meaning and interpretation of the rules.
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
He has a point, of course.&amp;nbsp; If we reached the point where programmers relied so heavily on rules that it hindered their ability to code, then yes, we would have a serious problem on our hands.&amp;nbsp; &lt;strong&gt;The problem is that this scenario is so laughably far from the reality of what average programmers are like that I wonder if Jeff and Joel are secretly just messing with us to see how much commotion they can stir up&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;div style="text-align: center"&gt;
&lt;img src="http://kevinwilliampang.com/image.axd?picture=Puppets.JPG" alt="" /&gt;
&lt;/div&gt;
&lt;div style="text-align: center"&gt;
&amp;nbsp;
&lt;/div&gt;
&lt;div style="text-align: center"&gt;
&lt;em&gt;Dance puppets, dance!&lt;/em&gt; &lt;br /&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
The reality of the situation is this: &lt;strong&gt;the average programmer has probably never even heard of &lt;a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod"&gt;SOLID&lt;/a&gt; and couldn&amp;#39;t care less about it even after it was explained to them&lt;/strong&gt;.&amp;nbsp; The idea that we are soon going to be swamped in bureaucratic rules that force us to think too much about the software we write is ludicrous when sites like &lt;a href="http://thedailywtf.com/"&gt;TheDailyWTF&lt;/a&gt; still exist.&amp;nbsp; If anything, &lt;strong&gt;we should be in support of anything that will force programmers to think more about the code they write, not less&lt;/strong&gt;. 
&lt;/p&gt;
&lt;p&gt;
In the end though, Jeff has a hundred thousand RSS followers and I have orders of magnitude less.&amp;nbsp; His post appeals to the lowest common denominator.&amp;nbsp; It reinforces the belief that quality of code doesn&amp;#39;t matter and it will garner massive support while mine will be lucky to get 20 people to even read through the first paragraph.&amp;nbsp; That alone should be a testament to how skewed the software industry is in terms of those who care about quality code vs those who don&amp;#39;t.&amp;nbsp; Given that, are we absolutely sure we want to go down this path? 
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HPmiWDGzhBMB5F8Fvggnypw-r0w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HPmiWDGzhBMB5F8Fvggnypw-r0w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HPmiWDGzhBMB5F8Fvggnypw-r0w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HPmiWDGzhBMB5F8Fvggnypw-r0w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://kevinwilliampang.com/post/Jeff-Atwood-Finally-Jumps-the-Shark.aspx</link>
      <author>Kevin Pang</author>
      <comments>http://kevinwilliampang.com/post/Jeff-Atwood-Finally-Jumps-the-Shark.aspx#comment</comments>
      <guid>http://kevinwilliampang.com/post.aspx?id=27955675-aa7d-4ec7-ab3a-76f290579938</guid>
      <pubDate>Wed, 11 Feb 2009 14:18:00 -0700</pubDate>
      <dc:publisher>Kevin Pang</dc:publisher>
      <pingback:server>http://kevinwilliampang.com/pingback.axd</pingback:server>
      <pingback:target>http://kevinwilliampang.com/post.aspx?id=27955675-aa7d-4ec7-ab3a-76f290579938</pingback:target>
      <slash:comments>29</slash:comments>
      <trackback:ping>http://kevinwilliampang.com/trackback.axd?id=27955675-aa7d-4ec7-ab3a-76f290579938</trackback:ping>
      <wfw:comment>http://kevinwilliampang.com/post/Jeff-Atwood-Finally-Jumps-the-Shark.aspx#comment</wfw:comment>
      <wfw:commentRss>http://kevinwilliampang.com/syndication.axd?post=27955675-aa7d-4ec7-ab3a-76f290579938</wfw:commentRss>
    </item>
    <item>
      <title>We're Pregnant!</title>
      <description>&lt;p&gt;
In general I try to keep this blog as programming-centric as possible. &amp;nbsp;However, I will make an exception for this:
&lt;/p&gt;
&lt;img src="http://kevinwilliampang.com/image.axd?picture=BabyUltrasound.jpg" alt="" width="500" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;We&amp;#39;re Pregnant!&lt;/h2&gt;
&lt;p&gt;
7 weeks along so far for those interested. &amp;nbsp;All signs are normal right now *knock on wood*. &amp;nbsp;With any luck, we&amp;#39;ll be welcoming our new child into the world sometime around 7/28/2009! :-)&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/s1_zE3vygwseStYNDOVrMaMHoC4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/s1_zE3vygwseStYNDOVrMaMHoC4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/s1_zE3vygwseStYNDOVrMaMHoC4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/s1_zE3vygwseStYNDOVrMaMHoC4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://kevinwilliampang.com/post/Were-Pregnant!.aspx</link>
      <author>Kevin Pang</author>
      <comments>http://kevinwilliampang.com/post/Were-Pregnant!.aspx#comment</comments>
      <guid>http://kevinwilliampang.com/post.aspx?id=82dcf52b-c60d-4a8b-be29-4a915ae18299</guid>
      <pubDate>Mon, 08 Dec 2008 20:02:00 -0700</pubDate>
      <dc:publisher>Kevin Pang</dc:publisher>
      <pingback:server>http://kevinwilliampang.com/pingback.axd</pingback:server>
      <pingback:target>http://kevinwilliampang.com/post.aspx?id=82dcf52b-c60d-4a8b-be29-4a915ae18299</pingback:target>
      <slash:comments>12</slash:comments>
      <trackback:ping>http://kevinwilliampang.com/trackback.axd?id=82dcf52b-c60d-4a8b-be29-4a915ae18299</trackback:ping>
      <wfw:comment>http://kevinwilliampang.com/post/Were-Pregnant!.aspx#comment</wfw:comment>
      <wfw:commentRss>http://kevinwilliampang.com/syndication.axd?post=82dcf52b-c60d-4a8b-be29-4a915ae18299</wfw:commentRss>
    </item>
    <item>
      <title>Do We Need Another Open ID Provider?</title>
      <description>&lt;p&gt;
As many of you have undoubtedly have heard by now, Microsoft officially announced during &lt;a href="http://www.microsoftpdc.com/"&gt;PDC 2008&lt;/a&gt; that &lt;a href="http://dev.live.com/blogs/devlive/archive/2008/10/27/421.aspx"&gt;Windows Live ID will become an Open ID provider&lt;/a&gt;.&amp;nbsp; From the Live Services blog:
&lt;/p&gt;
&lt;blockquote&gt;
	&amp;quot;You will soon be able to use your Windows Live ID account to sign in to any OpenID Web site!&amp;quot;
&lt;/blockquote&gt;
&lt;p&gt;
&lt;strong&gt;That&amp;#39;s right!&amp;nbsp; Soon you will be able to use your Windows Live ID account to log in to the 5 sites on the internet that suport Open ID! &lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
All sarcasm aside, it does &lt;strong&gt;not&lt;/strong&gt; appear that Microsoft will be joining those 5 sites and accepting Open ID logins.&amp;nbsp; Color me unimpressed.&lt;span class="Apple-style-span" style="color: #3a515e; font-family: 'Segoe UI'; line-height: 15px"&gt;&lt;span class="Apple-style-span" style="color: #000000; font-family: Verdana; line-height: normal"&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
The success of Open ID has always, and continues to, hinge on there being websites that accept Open IDs. &amp;nbsp;It&amp;#39;s great and all that Microsoft has decided to join the Open ID party, but what they&amp;#39;re doing doesn&amp;#39;t really increase its utility.&amp;nbsp; The whole point of Open ID is to make it so that users do not have to memorize a bunch of usernames and passwords to log into their accounts.&amp;nbsp; Microsoft&amp;#39;s latest move does little to further that cause since I still have to remember the same number of usernames and passwords as I did before.
&lt;/p&gt;
&lt;p&gt;
At this point, the only sites that I use that accept Open ID are &lt;a href="http://stackoverflow.com/"&gt;StackOverflow&lt;/a&gt; and ... I can&amp;#39;t even think of another one.&amp;nbsp; When you consider how many big names have now thrown their weight behind the Open ID movement -- Yahoo, AOL, and now Microsoft -- it should be shocking that when you mention Open ID to the average internet user all you get is a blank stare. &amp;nbsp;That tells me that there is something systematically wrong with the way it is being promoted.
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Update 10/29/2009 3:05 PM&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
It appears that Google has joined the list of Open ID providers who don&amp;#39;t accept Open ID as well.&amp;nbsp; Only they went one step further -- in the wrong direction -- by &lt;em&gt;forking&lt;/em&gt; Open ID and implementing it in a way that &lt;a href="http://neosmart.net/blog/2008/google-doesnt-use-openid/"&gt;isn&amp;#39;t compatible&lt;/a&gt; with any other Open ID providers.&amp;nbsp; Are you kidding me?
&lt;/p&gt;
&lt;p&gt;
I think this Slashdot comment summarizes it quite well:
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	OpenID&amp;#39;s vision statement:	
	&lt;/p&gt;
	&lt;blockquote&gt;
		OpenID eliminates the need for multiple usernames across different websites, simplifying your online experience.	
	&lt;/blockquote&gt;
	&lt;br /&gt;
	&lt;p&gt;
	Everyone else&amp;#39;s vision statement:	
	&lt;/p&gt;
	&lt;blockquote&gt;
		Fuck OpenID, I&amp;#39;m in control now.	
	&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8EKexvs9Ox8Ur3U2Pj0BVHa0n0U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8EKexvs9Ox8Ur3U2Pj0BVHa0n0U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8EKexvs9Ox8Ur3U2Pj0BVHa0n0U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8EKexvs9Ox8Ur3U2Pj0BVHa0n0U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://kevinwilliampang.com/post/Do-We-Really-Need-Another-Open-ID-Provider.aspx</link>
      <author>Kevin Pang</author>
      <comments>http://kevinwilliampang.com/post/Do-We-Really-Need-Another-Open-ID-Provider.aspx#comment</comments>
      <guid>http://kevinwilliampang.com/post.aspx?id=5ab24bd3-cdaa-410a-a60d-7fddc0f0e711</guid>
      <pubDate>Wed, 29 Oct 2008 08:43:00 -0700</pubDate>
      <dc:publisher>Kevin Pang</dc:publisher>
      <pingback:server>http://kevinwilliampang.com/pingback.axd</pingback:server>
      <pingback:target>http://kevinwilliampang.com/post.aspx?id=5ab24bd3-cdaa-410a-a60d-7fddc0f0e711</pingback:target>
      <slash:comments>10</slash:comments>
      <trackback:ping>http://kevinwilliampang.com/trackback.axd?id=5ab24bd3-cdaa-410a-a60d-7fddc0f0e711</trackback:ping>
      <wfw:comment>http://kevinwilliampang.com/post/Do-We-Really-Need-Another-Open-ID-Provider.aspx#comment</wfw:comment>
      <wfw:commentRss>http://kevinwilliampang.com/syndication.axd?post=5ab24bd3-cdaa-410a-a60d-7fddc0f0e711</wfw:commentRss>
    </item>
    <item>
      <title>Is Code Coverage Really All That Useful?</title>
      <description>&lt;p&gt;
Test driven development proponents often tend to push &lt;a href="http://en.wikipedia.org/wiki/Code_coverage"&gt;code coverage&lt;/a&gt; as a useful metric for gauging how well tested an application is. &amp;nbsp;100% code coverage has long been the ultimate goal of testing fanatics. &amp;nbsp;But is code coverage really all that useful? &amp;nbsp;If I told you that my application has 100% code coverage, should that mean anything to you?
&lt;/p&gt;
&lt;h2&gt;What does code coverage tell us?&lt;br /&gt;
&lt;/h2&gt;
&lt;p&gt;
Code coverage tells us which lines in our application are executed by our unit tests. &amp;nbsp;For example, the code below has 50% code coverage if the unit tests only call Foo with condition = true:
&lt;/p&gt;
&lt;div class="code"&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; Foo(&lt;span class="kwrd"&gt;bool&lt;/span&gt; condition)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="kwrd"&gt;if&lt;/span&gt; (condition)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="kwrd"&gt;return&lt;/span&gt; &amp;quot;&lt;span class="kwrd"&gt;true&lt;/span&gt;&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="kwrd"&gt;return&lt;/span&gt; &amp;quot;&lt;span class="kwrd"&gt;false&lt;/span&gt;&amp;quot;;&lt;br /&gt;
}
&lt;/div&gt;&lt;br /&gt;
&lt;h2&gt;What does code coverage not tell us?&lt;br /&gt;
&lt;/h2&gt;
&lt;p&gt;
Code coverage does &lt;strong&gt;not&lt;/strong&gt; tell us what code is working and what code is not.&amp;nbsp; Again, code coverage only tells us what was executed by our unit tests, &lt;strong&gt;not&lt;/strong&gt; what executed correctly. &amp;nbsp;This is an important distinction to make. &amp;nbsp;Just because a line of code is executed by a unit test, does not necessarily mean that that line of code is working as intended. &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
For example, the following code could have 100% code coverage and pass all unit tests if it is never called with b = 0. &amp;nbsp;However, once this code is introduced into the wild it could very well crash with a div by zero exception:
&lt;/p&gt;
&lt;div class="code"&gt;&lt;span class="kwrd"&gt;double&lt;/span&gt; Foo(&lt;span class="kwrd"&gt;double&lt;/span&gt; a, &lt;span class="kwrd"&gt;double&lt;/span&gt; b)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="kwrd"&gt;return&lt;/span&gt; a / b;&lt;br /&gt;
}
&lt;/div&gt;&lt;br /&gt;
&lt;h2&gt;So what is code coverage good for then?&lt;/h2&gt;
&lt;p align="center"&gt;
&lt;img src="http://kevinwilliampang.com/image.axd?picture=Overpass.jpg" alt="" /&gt; 
&lt;/p&gt;
&lt;p&gt;
To borrow an analogy from &lt;a href="http://hanselminutes.com/default.aspx?showID=121"&gt;Scott Hanselman&amp;#39;s interview with Quetzal Bradley&lt;/a&gt;, imagine you are a civil engineer responsible for testing a newly constructed series of roads. &amp;nbsp;To test the roads, your first thought might be to drive over them in your car, making sure that there are no potholes, missing bridges, etc.&amp;nbsp; After driving over all of the roads a few times, you might conclude that they have been tested and are ready for public use.&amp;nbsp; But once you open the roads to the public, you discover that the bridge overhangs are too low for big rigs, the turns are too sharp for sports cars, and that certain areas of the roads flood when it rains.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
In the above scenario, you had the equivalent of 100% code coverage since you had driven over all the roads, but you only superficially tested their behavior.&amp;nbsp; Specifically, you didn&amp;#39;t test the roads in different vehicles and under different weather conditions.&amp;nbsp; So although you went through each possible execution path, you failed to accomodate for different states while doing so.
&lt;/p&gt;
&lt;p&gt;
In light of this, the only solid conclusion you can draw from code coverage seems to be what lines of your code have definitely &lt;strong&gt;not&lt;/strong&gt; been tested.&amp;nbsp; The lines that have been tested are still up for grabs it seems unless you are willing to go through each and every possible state the application can be in when executing them.&amp;nbsp; This makes code coverage far less useful as a metric as it only tells you what still needs testing but offers you no help in determining when you are done testing.
&lt;/p&gt;
&lt;h2&gt;What *is* a good metric then?&lt;/h2&gt;
&lt;p&gt;
Unfortunately, there doesn&amp;#39;t seem to be a good metric for determining whether a line of code has been thoroughly tested or when a developer is done testing.&amp;nbsp; Perhaps this is a good thing as it keeps us from falling into a false sense of complacency.&amp;nbsp; It simply isn&amp;#39;t feasible in even a moderately complex application to test each and every line of code under every possible circumstance.&amp;nbsp; The best case scenario seems to be to test the most common scenarios and reasonable edge cases, then add additional tests as functionality inevitably breaks on those scenarios that you didn&amp;#39;t account for.&amp;nbsp; It&amp;#39;s an admitedly clumsy system, but it&amp;#39;s a realistic one compared to depending on 100% code coverage to weed out all possible bugs.&amp;nbsp; That&amp;#39;s not to say that there isn&amp;#39;t use in achieving 100% code coverage.&amp;nbsp; Executing the code in one particular state still has value, just not as much as developers seem to give it. 
&lt;/p&gt;
&lt;p&gt;
As always, I&amp;#39;m very interested to hear your thoughts and observations on this.&amp;nbsp; Please leave them in the comments below. 
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CaNVVv2QUGQkRaXrbDthQFinsNg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CaNVVv2QUGQkRaXrbDthQFinsNg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CaNVVv2QUGQkRaXrbDthQFinsNg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CaNVVv2QUGQkRaXrbDthQFinsNg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://kevinwilliampang.com/post/Is-Code-Coverage-Really-All-That-Useful.aspx</link>
      <author>Kevin Pang</author>
      <comments>http://kevinwilliampang.com/post/Is-Code-Coverage-Really-All-That-Useful.aspx#comment</comments>
      <guid>http://kevinwilliampang.com/post.aspx?id=96072a77-6756-4827-8d12-c42f6c1bf01f</guid>
      <pubDate>Tue, 28 Oct 2008 09:08:00 -0700</pubDate>
      <dc:publisher>Kevin Pang</dc:publisher>
      <pingback:server>http://kevinwilliampang.com/pingback.axd</pingback:server>
      <pingback:target>http://kevinwilliampang.com/post.aspx?id=96072a77-6756-4827-8d12-c42f6c1bf01f</pingback:target>
      <slash:comments>43</slash:comments>
      <trackback:ping>http://kevinwilliampang.com/trackback.axd?id=96072a77-6756-4827-8d12-c42f6c1bf01f</trackback:ping>
      <wfw:comment>http://kevinwilliampang.com/post/Is-Code-Coverage-Really-All-That-Useful.aspx#comment</wfw:comment>
      <wfw:commentRss>http://kevinwilliampang.com/syndication.axd?post=96072a77-6756-4827-8d12-c42f6c1bf01f</wfw:commentRss>
    </item>
    <item>
      <title>10 Programming Proverbs Every Developer Should Know</title>
      <description>&lt;p&gt;
Proverbs are used to express universal truths or life lessons in a short and memorable fashion.&amp;nbsp; I find that they are a great way to keep things in perspective, both in life and in work.&amp;nbsp; Because of this, I have assembled 10 programming proverbs that every developer needs in their arsenal.
&lt;/p&gt;
&lt;h2&gt;
1. There is no smoke without fire
&lt;/h2&gt;
&lt;p align="center"&gt;
&lt;img src="http://kevinwilliampang.com/image.axd?picture=Smoke.jpg" alt="" /&gt;
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;em&gt;Relax.  It&amp;#39;s probably just another fire drill&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Poorly designed code tends to manifest itself through some common tell-tale signs.&amp;nbsp; Some examples of these are:
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Giant classes and/or functions&lt;/li&gt;											
	&lt;li&gt;Large blocks of commented out code&lt;/li&gt;											
	&lt;li&gt;Duplicated logic&lt;/li&gt;											
	&lt;li&gt;Deeply nested if/else blocks&lt;/li&gt;			
&lt;/ul&gt;
&lt;p&gt;
Developers often refer to these as &lt;a href="http://en.wikipedia.org/wiki/Code_smell"&gt;code smells&lt;/a&gt;, but personally, I&amp;nbsp;think the term &amp;quot;code smoke&amp;quot; or &amp;quot;code fumes&amp;quot; is more appropriate as it implies a higher sense of urgency. &amp;nbsp;If you don&amp;#39;t address the underlying problem it will come back to burn you later on. 
&lt;/p&gt;
&lt;h2&gt;2. An ounce of prevention is worth a pound of cure&lt;/h2&gt;
&lt;p align="center"&gt;
&lt;img src="http://kevinwilliampang.com/image.axd?picture=Nurse.jpg" alt="" /&gt;
&lt;/p&gt;
&lt;div align="center"&gt;
&lt;/div&gt;
&lt;p align="center"&gt;
&lt;em&gt;Ok, I&amp;#39;m convinced&lt;/em&gt; 
&lt;/p&gt;
&lt;p&gt;
Toyota&amp;#39;s assembly line of the 1980s was famously efficient due to its revolutionary approach towards defect prevention.&amp;nbsp; Each member of the assembly line was given the ability to halt production when they noticed a problem in their sector.&amp;nbsp; The idea was that it was better to halt production and fix the problem as early on as possible than to continue producing faulty units that would be tougher and more costly to fix/replace/recall later on.
&lt;/p&gt;
&lt;p&gt;
Developers often make the faulty assumption that productivity = cranking out code quickly.&amp;nbsp; Many programmers dive straight into coding without a second thought towards design.&amp;nbsp; Unfortunately, this &lt;a href="http://en.wikipedia.org/wiki/Leeroy_Jenkins"&gt;Leeroy Jenkins&lt;/a&gt; approach towards software development tends to lead to sloppy, fragile code that will need to be constantly monitored and patched -- perhaps even replaced altogether down the line.&amp;nbsp; Ultimately, productivity must be measured not only in how much time is spent writing it, but also by how much time is spent debugging it.&amp;nbsp; A short term gain may prove to be a long term loss if one isn&amp;#39;t careful.
&lt;/p&gt;
&lt;h2&gt;3. Don&amp;#39;t put all your eggs in one basket&lt;/h2&gt;
&lt;p&gt;
A software team&amp;#39;s &lt;a href="http://en.wikipedia.org/wiki/Bus_factor"&gt;bus factor&lt;/a&gt; is defined as &amp;quot;the total number of key developers who would if incapacitated, as by getting hit by a bus, send the project into such disarray that it would not be able to proceed&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
In other words, what happens if you suddenly lost a key member of your team?&amp;nbsp; Would business continue as usual or would it grind to a halt?
&lt;/p&gt;
&lt;p&gt;
Unfortunately, most software teams fall into the latter category.&amp;nbsp; These are the teams that turn their programmers into &amp;quot;domain experts&amp;quot; who only deal with requests that fall into their area of expertise..&amp;nbsp; At first, this appears to be a fairly reasonable approach.&amp;nbsp; It works for the automaking assembly lines, why not for software development teams?&amp;nbsp; After all, it&amp;#39;s unreasonable to expect each member of the team to be intimately familiar with each and every nuance in the application, right?&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
The problem is that developers cannot be easily substituted and replaced.&amp;nbsp; And while the pidgeon-hole approach works fairly well when everybody is available and accounted for, it quickly falls apart when &amp;quot;domain experts&amp;quot; suddenly become unavailable due to turnover, sickness, or even freak bus accidents. It is imperative that software teams have some sort of redundancy built in. &amp;nbsp;Code reviews, pair programming, and communal code go a long way to foster an environment where each developer is at least superficially familiar with parts of the system outside their comfort zone.
&lt;/p&gt;
&lt;h2&gt;4. As you sow, so shall you reap&lt;/h2&gt;
&lt;p align="center"&gt;
&lt;img src="http://kevinwilliampang.com/image.axd?picture=SowReap.jpg" alt="" /&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://en.wikipedia.org/wiki/Pragmatic_Programmer"&gt;The Pragmatic Programmer&lt;/a&gt;&amp;nbsp;has this to say about the&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Fixing_Broken_Windows"&gt;Broken Window theory&lt;/a&gt;:
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	Don&amp;#39;t leave &amp;quot;broken windows&amp;quot; (bad designs, wrong decisions, or poor code) unrepaired. Fix each one as soon as it is discovered. If there is insufficient time to fix it properly, then board it up. Perhaps you can comment out the offending code, or display a &amp;quot;Not Implemented&amp;quot; message, or substitute dummy data instead. Take some action to prevent further damage and to show that you&amp;#39;re on top of the situation.				
	&lt;/p&gt;
	&lt;p&gt;
	We&amp;#39;ve seen clean, functional systems deteriorate pretty quickly once windows start breaking. There are other factors that can contribute to software rot, and we&amp;#39;ll touch on some of them elsewhere, but neglect accelerates the rot faster than any other factor.				
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
In short, good code begets good code and bad code begets bad code.&amp;nbsp; Do not underestimate the power of inertia. &amp;nbsp;No one wants to be the one who has to clean up sloppy code, but neither does anyone want to be the one that makes a mess out of beautiful code. &amp;nbsp;Write it right and your code will have a far better chance at standing the test of time.
&lt;/p&gt;
&lt;h2&gt;5. Great haste makes great waste&lt;/h2&gt;
&lt;p&gt;
Managers, clients, and programmers are getting more impatient by the day.&amp;nbsp; Everything needs to be done and it needs to be done &lt;strong&gt;now&lt;/strong&gt;.&amp;nbsp; Because of this, the temptation to throw together hacks and quick-fixes becomes very tough to resist.
&lt;/p&gt;
&lt;p&gt;
No time to properly unit test a new feature? &amp;nbsp;&lt;span class="Apple-style-span" style="font-style: italic"&gt;Oh well, it works for the one test run you put it through. &amp;nbsp;You can always come back to it later!&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Mysterious object referencing error when you try to access property Y?&amp;nbsp; &lt;span class="Apple-style-span" style="font-style: italic"&gt;Whatever, just throw a try/catch block around the code. &amp;nbsp;We&amp;#39;ve got bigger fish to fry!&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Sound familiar? &amp;nbsp;It&amp;#39;s because we&amp;#39;ve all done it at some point in time. &amp;nbsp;And in certain instances, it is justifiable. &amp;nbsp;After all, we have deadlines to meet and clients/managers to satisfy. &amp;nbsp;But do it too often and you&amp;#39;ll soon find yourself with a very unstable code base full of hotfixes, duplicated logic, untested solutions, and porous error handling. &amp;nbsp;In the end, you have to strike a balance between getting things done and getting things done &lt;span class="Apple-style-span" style="font-style: italic"&gt;right&lt;/span&gt;.
&lt;/p&gt;
&lt;h2&gt;6. Look before you leap&lt;/h2&gt;
&lt;p align="center"&gt;
&lt;img src="http://kevinwilliampang.com/image.axd?picture=Agile.gif" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
The term &amp;quot;&lt;a href="http://en.wikipedia.org/wiki/Agile_development"&gt;Agile Development&lt;/a&gt;&amp;quot; is used and abused frequently these days, often as a way for programmers to justify ignoring the dreaded planning/designing phase of software development. &amp;nbsp;We are creators, and as such we derive pleasure from seeing actual progress made towards a finished product.&amp;nbsp; Surprisingly, &lt;a href="http://en.wikipedia.org/wiki/UML_Diagram#Diagrams"&gt;UML diagrams&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Use_case"&gt;use case analysis&lt;/a&gt; just don&amp;#39;t seem to satisfy that desire. &amp;nbsp;So, we developers often start off coding without any idea of what we are doing or where we are going. &amp;nbsp;It&amp;#39;s like heading out for dinner when you haven&amp;#39;t yet decided where you want to go.&amp;nbsp; You&amp;#39;re hungry so you don&amp;#39;t want to waste time finding a restaurant and booking a table.&amp;nbsp; Instead, you just hop in your car and figure you&amp;#39;ll think of something along the way.&amp;nbsp; Only, it ends up taking you longer because you have to make a bunch of U-turns and stops at restaurants that end up having too long of a wait.&amp;nbsp; True, you&amp;#39;ll probably find your way to food eventually, but you probably didn&amp;#39;t end up with the meal you wanted and it probably took a lot more time and hassle than it would have had you just called and booked a reservation at a restaurant you wanted to go to.
&lt;/p&gt;
&lt;h2&gt;7. When the only tool you have is a hammer, everything looks like a nail&lt;/h2&gt;
&lt;p align="center"&gt;
&lt;img src="http://kevinwilliampang.com/image.axd?picture=SquarePegRoundHole.jpg" alt="" /&gt;
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;em&gt;See?&amp;nbsp; I *told* you Active Record would work for this project!&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Programmers have a tendency to get tunnel vision when it comes to their tools. &amp;nbsp;Once something &amp;quot;just works&amp;quot; for us on one project, we tend to insist on using it for every project therafter.&amp;nbsp; It can be a pain to learn something new and, at times, highly unsettling.&amp;nbsp; The entire time we&amp;#39;re thinking &amp;quot;it would have been easier had I just done it the old way!&amp;quot;.&amp;nbsp; Enough of these moments and we will simply go with what we know, even if it isn&amp;#39;t a perfect fit for the task.  
&lt;/p&gt;
&lt;p&gt;
It&amp;#39;s easy to stick with what you know, but in the long run it&amp;#39;s much easier to pick the right tools for the job.&amp;nbsp; Otherwise you will be fitting square pegs into round holes for the rest of your career.
&lt;/p&gt;
&lt;h2&gt;8. Silence is construed as approval&lt;/h2&gt;
&lt;p align="center"&gt;
&amp;nbsp;&lt;img src="http://kevinwilliampang.com/image.axd?picture=Schultz.jpg" alt="" /&gt;
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;em&gt;I see nothing! Nuh-thing!&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
This ties in with the theory on broken windows and programming inertia, only on a larger scale. &amp;nbsp;
The programming community is just that, a community.&amp;nbsp; Each programmer is a reflection on the craft.&amp;nbsp; The more bad code that is released into the wild, the more it becomes the status quo.&amp;nbsp; If you don&amp;#39;t make an effort to write good, clean, &lt;a href="http://codebetter.com/blogs/david_laribee/archive/2008/09/09/why-solid-gimme-an-s.aspx"&gt;SOLID&lt;/a&gt; code, you will find yourself having to work with it on a day-to-day basis.
&lt;/p&gt;
&lt;p&gt;
Likewise, if you see poorly designed code written by someone else, you should make the effort to bring it up with the creator. I should note, however, that tact ought to be employed in such a situation. In general, programmers are willing to admit that they do not know everything there is to know about software development and will appreciate the gesture.&amp;nbsp; We all benefit when we help each other out.&amp;nbsp; Turning a blind eye to problems only perpetuates them. 
&lt;/p&gt;
&lt;h2&gt;9. A bird in the hand is worth two in the bush &lt;/h2&gt;
&lt;p&gt;
There is a time and place to discuss system architecture and refactoring opportunities, and a time to just get things done.&amp;nbsp; It is important to weigh the pros and cons of revamping something that already works just to make it cleaner.&amp;nbsp; It&amp;#39;s an admirable goal, of course, but there will always be code that you want to restructure.&amp;nbsp; The programming world simply changes too frequently for code to &lt;em&gt;not&lt;/em&gt; get outdated.&amp;nbsp; But at some point you have to provide value to your customers.&amp;nbsp; The simple fact remains: you can&amp;#39;t do two things at once.&amp;nbsp; The more time you spend refactoring old code, the less time you spend creating new code.&amp;nbsp; Striking a balance is critical to enhancing as well as maintaining your application in a timely manner. &amp;nbsp; 
&lt;/p&gt;
&lt;h2&gt;10. With great power comes great responsibility&lt;/h2&gt;
&lt;p align="center"&gt;
&lt;img src="http://kevinwilliampang.com/image.axd?picture=Spiderman.jpg" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
Software has undoubtedly become an integral and vital part of our lives.&amp;nbsp; Because of this, practicing good software development is more crucial than ever.&amp;nbsp; It&amp;#39;s one thing to have a bug in a game of Pong, it&amp;#39;s another to have one in the guidance system of a space shuttle or air traffic control system.&amp;nbsp; &lt;a href="http://slashdot.org/"&gt;Slashdot&lt;/a&gt; recently posted an &lt;a href="http://tech.slashdot.org/article.pl?sid=08/09/10/203233&amp;amp;from=rss"&gt;article&lt;/a&gt; describing how a minor glitch in &lt;a href="http://www.google.com/news"&gt;Google News&lt;/a&gt; singlehandedly evaporated $1.14 billion in shareholder wealth.&amp;nbsp; Events such as these demonstrate how much power we wield.&amp;nbsp; It&amp;#39;s a little frightening to think that the code you write today, whether you intend it to or not, may one day be recycled and depended upon for mission-critical applications.&amp;nbsp; Write accordingly.
&lt;/p&gt;
&lt;p&gt;
Do you have any proverbs you feel should be added to this list?&amp;nbsp; Feel free to let me know in the comments! 
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/btRolrYj6PXRJpQaN6j11Bdrzsw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/btRolrYj6PXRJpQaN6j11Bdrzsw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/btRolrYj6PXRJpQaN6j11Bdrzsw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/btRolrYj6PXRJpQaN6j11Bdrzsw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://kevinwilliampang.com/post/Programming-Proverbs.aspx</link>
      <author>Kevin Pang</author>
      <comments>http://kevinwilliampang.com/post/Programming-Proverbs.aspx#comment</comments>
      <guid>http://kevinwilliampang.com/post.aspx?id=83c9479b-5e06-40d6-89d8-6527c8f55647</guid>
      <pubDate>Tue, 07 Oct 2008 09:17:00 -0700</pubDate>
      <dc:publisher>Kevin Pang</dc:publisher>
      <pingback:server>http://kevinwilliampang.com/pingback.axd</pingback:server>
      <pingback:target>http://kevinwilliampang.com/post.aspx?id=83c9479b-5e06-40d6-89d8-6527c8f55647</pingback:target>
      <slash:comments>41</slash:comments>
      <trackback:ping>http://kevinwilliampang.com/trackback.axd?id=83c9479b-5e06-40d6-89d8-6527c8f55647</trackback:ping>
      <wfw:comment>http://kevinwilliampang.com/post/Programming-Proverbs.aspx#comment</wfw:comment>
      <wfw:commentRss>http://kevinwilliampang.com/syndication.axd?post=83c9479b-5e06-40d6-89d8-6527c8f55647</wfw:commentRss>
    </item>
    <item>
      <title>Mapping Enums to Strings and Strings to Enums in .NET</title>
      <description>&lt;p&gt;I recently stumbled across a &lt;a href="http://www.moggoly.me.uk/blog/post/Enum-description-values.aspx"&gt;blog post&lt;/a&gt; demonstrating how to convert enums to strings using the Description attribute.&amp;nbsp; I thought it might be useful to expand on that example by providing a function that reverses the process (e.g. takes in the resulting string and converts it back to the enum).&amp;nbsp; This would allow you to do things like store off the description into a database and load it back into an enum or populate a dropdown list with the descriptions and save the user&amp;#39;s selection back into your domain as an enum.&lt;/p&gt;&lt;p&gt;Rather than diving straight into code, let&amp;#39;s just take a quick look at what the finished product lets you do.&amp;nbsp; Say you have the following enumeration:&lt;/p&gt;&lt;p&gt;&lt;img src="http://kevinwilliampang.com/image.axd?picture=Enums.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;The code from the original blog post will allow you to retrieve any of the Description attributes by calling the ToDescription extension method:&lt;/p&gt;&lt;p&gt;&lt;img src="http://kevinwilliampang.com/image.axd?picture=ToDescriptionExample.png" alt="" /&gt; &lt;/p&gt;&lt;p&gt;And with the code I wrote, you will be able to perform the opposite conversion by calling the ToEnum extension method: &lt;/p&gt;&lt;p&gt;&lt;img src="http://kevinwilliampang.com/image.axd?picture=ToEnumExample.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;Ok, now let&amp;#39;s look at how it all works: &lt;/p&gt;&lt;p&gt;Here is the slightly modified version of the extension method from the original blog post.&amp;nbsp; It&amp;#39;s pretty straightforward.&amp;nbsp; It&amp;#39;s an extension method on the Enum class that uses reflection to grab the Description attribute and output it.&amp;nbsp; If no Description attribute is found, it returns the result of the ToString() function:&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://kevinwilliampang.com/image.axd?picture=ToDescription2.png" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;And here is my extension method that reverses the process.&amp;nbsp; This extension method on the string class iterates over all enum values for the given enumeration, trying to find the one that has a Description attribute that matches the string that called it.&amp;nbsp; If the extension method can&amp;#39;t find this enum, it returns the default enum passed in the parameters. &lt;/p&gt;&lt;img src="http://kevinwilliampang.com/image.axd?picture=ToEnumExample3.png" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;I&amp;#39;m sure there are probably cleaner ways of doing this, but for mypurposes this works great and is easy to implement and manage.&amp;nbsp; I&amp;#39;d be interested in hearing how others are handling this scenario in their own apps and whether this implementation would be useful at all.&amp;nbsp; Let me know in the comments!&lt;br /&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZY9Jp2SnzQupvEHOwRP2GEa3AfU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZY9Jp2SnzQupvEHOwRP2GEa3AfU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZY9Jp2SnzQupvEHOwRP2GEa3AfU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZY9Jp2SnzQupvEHOwRP2GEa3AfU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://kevinwilliampang.com/post/Mapping-Enums-To-Strings-and-Strings-to-Enums-in-NET.aspx</link>
      <author>Kevin Pang</author>
      <comments>http://kevinwilliampang.com/post/Mapping-Enums-To-Strings-and-Strings-to-Enums-in-NET.aspx#comment</comments>
      <guid>http://kevinwilliampang.com/post.aspx?id=13854d6e-f9a8-470a-94c2-7f624ae03a64</guid>
      <pubDate>Sat, 20 Sep 2008 04:51:00 -0700</pubDate>
      <dc:publisher>Kevin Pang</dc:publisher>
      <pingback:server>http://kevinwilliampang.com/pingback.axd</pingback:server>
      <pingback:target>http://kevinwilliampang.com/post.aspx?id=13854d6e-f9a8-470a-94c2-7f624ae03a64</pingback:target>
      <slash:comments>8</slash:comments>
      <trackback:ping>http://kevinwilliampang.com/trackback.axd?id=13854d6e-f9a8-470a-94c2-7f624ae03a64</trackback:ping>
      <wfw:comment>http://kevinwilliampang.com/post/Mapping-Enums-To-Strings-and-Strings-to-Enums-in-NET.aspx#comment</wfw:comment>
      <wfw:commentRss>http://kevinwilliampang.com/syndication.axd?post=13854d6e-f9a8-470a-94c2-7f624ae03a64</wfw:commentRss>
    </item>
    <item>
      <title>Debugging and the Five Stages of Grief</title>
      <description>&lt;p&gt;
My latest article, &lt;a href="http://itmanagement.earthweb.com/entdev/article.php/3771466/Debugging+and+The+Five+Stages+of+Grief.htm"&gt;Debugging and the Five Stages of Grief&lt;/a&gt;, has been published on &lt;a href="http://itmanagement.earthweb.com/"&gt;Datamation&lt;/a&gt;!  Here&amp;#39;s a short excerpt from the intro:
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	As a programmer, you learn to accept bugs as a part of life. No matter
	how hard you try, there is no simple way to avoid them. What separates
	good programmers from bad programmers is not only their ability to
	avoid bugs, but also their ability to deal with them when they arise. 
	&lt;/p&gt;
	&lt;p&gt;
	When programmers are confronted with bugs in their applications, they
	typically progress through what psychologists call the five stages of
	grief. These stages are a series of emotional states people experience
	when dealing with tragedy or loss in their lives. 
	&lt;/p&gt;
	&lt;p&gt;
	It may seem a bit odd that something as common and benign as a bug
	could trigger this type of emotional reaction, but, in a way, it makes
	sense. Our applications are like our babies. We create them. We raise
	them. We watch them grow, all in the hopes that, someday, they will be
	able to set out on their own (and make some money to support us in our
	old age). 
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Click &lt;a href="http://itmanagement.earthweb.com/entdev/article.php/3771466/Debugging+and+The+Five+Stages+of+Grief.htm"&gt;here&lt;/a&gt; to read the rest of the article, and don&amp;#39;t forget to leave your comments!
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LqHCXI5jLCDBwxClXPNXFNcfut0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LqHCXI5jLCDBwxClXPNXFNcfut0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LqHCXI5jLCDBwxClXPNXFNcfut0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LqHCXI5jLCDBwxClXPNXFNcfut0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://kevinwilliampang.com/post/Debugging-and-the-Five-Stages-of-Grief.aspx</link>
      <author>Kevin Pang</author>
      <comments>http://kevinwilliampang.com/post/Debugging-and-the-Five-Stages-of-Grief.aspx#comment</comments>
      <guid>http://kevinwilliampang.com/post.aspx?id=213606e0-9a9d-40f1-b420-66ea042bbb65</guid>
      <pubDate>Mon, 15 Sep 2008 08:29:00 -0700</pubDate>
      <dc:publisher>Kevin Pang</dc:publisher>
      <pingback:server>http://kevinwilliampang.com/pingback.axd</pingback:server>
      <pingback:target>http://kevinwilliampang.com/post.aspx?id=213606e0-9a9d-40f1-b420-66ea042bbb65</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://kevinwilliampang.com/trackback.axd?id=213606e0-9a9d-40f1-b420-66ea042bbb65</trackback:ping>
      <wfw:comment>http://kevinwilliampang.com/post/Debugging-and-the-Five-Stages-of-Grief.aspx#comment</wfw:comment>
      <wfw:commentRss>http://kevinwilliampang.com/syndication.axd?post=213606e0-9a9d-40f1-b420-66ea042bbb65</wfw:commentRss>
    </item>
    <item>
      <title>Top 200 Tech Blogs</title>
      <description>&lt;p&gt;
&lt;a href="http://itmanagement.earthweb.com/"&gt;Datamation&lt;/a&gt; just posted their list of the &lt;a href="http://itmanagement.earthweb.com/cnews/article.php/12035_3770056_1#"&gt;Top 200 Tech Blogs&lt;/a&gt; and my blog came in at &lt;a href="http://itmanagement.earthweb.com/cnews/article.php/12035_3770056_8"&gt;#165&lt;/a&gt;!&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
I&amp;#39;m honored.&amp;nbsp; There are a lot of great sites in that list (#147 Joel on Software, #149 Coding Horror) and it&amp;#39;s humbling to be included, especially given the short amount of time that I&amp;#39;ve been blogging.
&lt;/p&gt;
&lt;p&gt;
On a side note, I&amp;#39;m currently wrapping up my next article and it should be posted shortly.&amp;nbsp; Stay tuned!&amp;nbsp; :-)
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BHTq8Kf2xp87pt_qU5C0_Ef4mUQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BHTq8Kf2xp87pt_qU5C0_Ef4mUQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BHTq8Kf2xp87pt_qU5C0_Ef4mUQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BHTq8Kf2xp87pt_qU5C0_Ef4mUQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://kevinwilliampang.com/post/Top-200-Tech-Blogs.aspx</link>
      <author>Kevin Pang</author>
      <comments>http://kevinwilliampang.com/post/Top-200-Tech-Blogs.aspx#comment</comments>
      <guid>http://kevinwilliampang.com/post.aspx?id=6dce7d00-4822-471a-9f22-837b9a9592e4</guid>
      <pubDate>Tue, 09 Sep 2008 11:19:00 -0700</pubDate>
      <dc:publisher>Kevin Pang</dc:publisher>
      <pingback:server>http://kevinwilliampang.com/pingback.axd</pingback:server>
      <pingback:target>http://kevinwilliampang.com/post.aspx?id=6dce7d00-4822-471a-9f22-837b9a9592e4</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://kevinwilliampang.com/trackback.axd?id=6dce7d00-4822-471a-9f22-837b9a9592e4</trackback:ping>
      <wfw:comment>http://kevinwilliampang.com/post/Top-200-Tech-Blogs.aspx#comment</wfw:comment>
      <wfw:commentRss>http://kevinwilliampang.com/syndication.axd?post=6dce7d00-4822-471a-9f22-837b9a9592e4</wfw:commentRss>
    </item>
    <item>
      <title>Top 10 Things That Annoy Programmers</title>
      <description>&lt;p&gt;Programmers all have their pet peeves.&amp;nbsp; Whether it&amp;#39;s &lt;a href="http://en.wikipedia.org/wiki/Scope_creep"&gt;scope creep&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Hungarian_notation"&gt;Hungarian notation&lt;/a&gt;, or smelly coworkers, we&amp;#39;ve come to accept that there are certain nuisances that come with our line of work.&amp;nbsp; The following is a list of the top 10 things that annoy programmers, compiled from the results of &lt;a href="http://beta.stackoverflow.com/questions/27347/what-annoys-you-as-a-programmer"&gt;my recent question on StackOverflow&lt;/a&gt; along with some of my own experiences:&lt;/p&gt;&lt;h2&gt;10.&amp;nbsp; Comments that explain the &amp;quot;how&amp;quot; but not the &amp;quot;why&amp;quot;&amp;nbsp; &lt;/h2&gt;&lt;p&gt;Introductory-level programming courses teach students to comment early and comment often.&amp;nbsp; The idea is that it&amp;#39;s better to have too many comments than to have too few.&amp;nbsp; Unfortunately, many programmers seem to take this as a personal challenge to comment &lt;em&gt;every single line of code&lt;/em&gt;.&amp;nbsp; This is why you will often see something like this code snippit taken from Jeff Atwood&amp;#39;s post on &lt;a href="http://www.codinghorror.com/blog/archives/001150.html"&gt;Coding Without Comments&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;&lt;div class="code"&gt;
[code:c#]&lt;/p&gt;&lt;p&gt;r = n / 2; // Set r to n divided by 2&lt;br /&gt;&lt;br /&gt;// Loop &lt;span class="kwrd"&gt;while&lt;/span&gt; r - (n/r) &lt;span class="kwrd"&gt;is&lt;/span&gt; greater than t&lt;br /&gt;&lt;span class="kwrd"&gt;while&lt;/span&gt; ( abs( r - (n/r) ) &amp;gt; t ) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; r = 0.5 * ( r + (n/r) ); // Set r to half of r + (n/r)&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;[/code]&lt;/div&gt;&lt;/p&gt;&lt;p&gt;Do you have any idea what this code does?&amp;nbsp; Me neither.&amp;nbsp; The problem is that while there are plenty of comments describing &lt;em&gt;what &lt;/em&gt;the code is doing, there are none describing &lt;em&gt;why &lt;/em&gt;it&amp;#39;s doing it.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Now, consider the same code with a different commenting methodology:&lt;/p&gt;&lt;p&gt;&lt;div class="code"&gt;
[code:c#]&lt;/p&gt;&lt;p&gt;// square root of n with Newton-Raphson approximation&lt;br /&gt;r = n / 2;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;while&lt;/span&gt; ( abs( r - (n/r) ) &amp;gt; t ) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; r = 0.5 * ( r + (n/r) );&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;[/code]&lt;/div&gt;&lt;/p&gt;&lt;p&gt;Much better!&amp;nbsp; We still might not understand exactly what&amp;#39;s going on here, but at least we have a starting point.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Comments are supposed to help the reader understand the code, not the syntax.&amp;nbsp; It&amp;#39;s a fair assumption that the reader has a basic understanding of how a for loop works; there&amp;#39;s no need to add comments such as &amp;quot;// iterate over a list of customers&amp;quot;.&amp;nbsp; What the reader is not going to be familiar with is why your code works and why you chose to write it the way you did. &lt;/p&gt;&lt;h2&gt;9.&amp;nbsp; Interruptions&lt;/h2&gt;&lt;p&gt;Very few programmers can go from 0 to code at the drop of a hat.&amp;nbsp; In general, &lt;strong&gt;we tend to be more akin to locomotives than ferraris&lt;/strong&gt;; it may take us awhile to get started, but once we hit our stride we can get an impressive amount of work done.&amp;nbsp; Unfortunately, it&amp;#39;s very hard to get into a programming zone when your train of thought is constantly being derailed by clients, managers, and fellow programmers.&amp;nbsp; &lt;/p&gt;&lt;p&gt;There is simply too much information we need to keep in mind while we&amp;#39;re working on a task to be able to drop the task, handle another issue, then pick up the task without missing a beat.&amp;nbsp; Interruptions kill our train of thought and getting it back is often a time-consuming, frustrating, and worst of all, error-prone process.&amp;nbsp;&lt;/p&gt;&lt;h2&gt;8.&amp;nbsp; Scope creep&lt;/h2&gt;&lt;p&gt;From &lt;a href="http://en.wikipedia.org/wiki/Scope_creep"&gt;Wikipedia&lt;/a&gt;:&lt;/p&gt;&lt;blockquote&gt;	Scope creep (also called focus creep, requirement creep, feature creep, and sometimes kitchen sink syndrome) in project management refers to uncontrolled changes in a project&amp;#39;s scope. This phenomenon can occur when the scope of a project is not properly defined, documented, or controlled. It is generally considered a negative occurrence that is to be avoided.&lt;/blockquote&gt;&lt;p&gt;Scope creep turns relatively simple requests into horribly complex and time consuming monsters.&amp;nbsp; It only takes a few innocent keystrokes by the requirements guy for scope creep to happen:&lt;/p&gt;&lt;ul&gt;	&lt;li&gt;Version 1: Show a map of the location&lt;/li&gt;		&lt;li&gt;Version 2: Show a &lt;strong&gt;3D&lt;/strong&gt; map of the location&lt;/li&gt;		&lt;li&gt;Version 3: Show a &lt;strong&gt;3D&lt;/strong&gt; map of the location &lt;strong&gt;that the user can fly through&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Argh!&amp;nbsp; What used to be a 30 minute task just turned into a massively complex system that could take hundreds of man hours.&amp;nbsp; Even worse, most of the time scope creep happens &lt;em&gt;during&lt;/em&gt; development, which requires rewriting, refactoring, and sometimes throwing out code that was developed just days prior. &lt;/p&gt;&lt;h2&gt;7.&amp;nbsp; Management that doesn&amp;#39;t understand programming&lt;/h2&gt;&lt;div style="float: right; margin-left: 20px"&gt;&lt;img src="http://kevinwilliampang.com/image.axd?picture=Compiling3.png" alt="Compiling" /&gt; &lt;p&gt;&lt;em&gt;Ok, so maybe there are &lt;a href="http://xkcd.com/303/"&gt;some perks&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;&lt;p style="height: 220px"&gt;Management is not an easy job.&amp;nbsp; People &lt;strong&gt;suck&lt;/strong&gt;; we&amp;#39;re fickle and fragile and we&amp;#39;re all out for #1.&amp;nbsp; Keeping a large group of us content and cohesive is a mountain of a task.&amp;nbsp; However, that doesn&amp;#39;t mean that managers should be able to get away without having some basic understanding of what their subordinates are doing.&amp;nbsp; When management cannot grasp the basic concepts of our jobs, we end up with scope creep, unrealistic deadlines, and general frustration on both sides of the table.&amp;nbsp; This is a pretty common complaint amongst programmers and the source of a lot of angst (as well as one hilarious &lt;a href="http://www.dilbert.com/"&gt;cartoon&lt;/a&gt;).&lt;/p&gt;&lt;h2&gt;6.&amp;nbsp; Documenting our applications&lt;/h2&gt;&lt;p&gt;Let me preface this by saying that yes, I know that there are a lot of documentation-generating applications out there, but in my experience those are usually only good for generating API documentation for other programmers to read.&amp;nbsp; If you are working with an application that normal everyday people are using, you&amp;#39;re going to have to write some documentation that the average layman can understand (e.g. how your application works, troubleshooting guides, etc.).&lt;/p&gt;&lt;p&gt;It&amp;#39;s not hard to see that this is something programmers dread doing.&amp;nbsp; Take a quick look at all the open-source projects out there.&amp;nbsp; What&amp;#39;s the one thing that all of them are constantly asking for help with?&amp;nbsp; Documentation.&amp;nbsp; &lt;/p&gt;&lt;p&gt;I think I can safely speak on behalf of all programmers everywhere when I say, &amp;quot;&lt;a href="http://en.wikipedia.org/wiki/Trash_of_the_Titans"&gt;can&amp;#39;t someone else do it?&lt;/a&gt;&amp;quot;.&amp;nbsp;&lt;/p&gt;&lt;h2&gt;5.&amp;nbsp; Applications without documentation&lt;/h2&gt;&lt;p&gt;I never said that we weren&amp;#39;t hypocrites.&amp;nbsp; :-)&amp;nbsp; Programmers are constantly asked to incorporate 3rd party libraries and applications into their work.&amp;nbsp; In order to do that, &lt;strong&gt;we need documentation&lt;/strong&gt;.&amp;nbsp; Unfortunately, as mentioned in item 6, programmers hate writing documentation.&amp;nbsp; No, the irony is not lost on us.&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;There is nothing more frustrating than trying to utilize a 3rd party library while having absolutely no fricken idea what half the functions in the API do&lt;/strong&gt;.&amp;nbsp; What&amp;#39;s the difference between poorlyNamedFunctionA() and poorlyButSimilarlyNamedFunctionB()?&amp;nbsp; Do I need to perform a null check before accessing PropertyX?&amp;nbsp; I guess I&amp;#39;ll just have to find out through trial and error!&amp;nbsp; Ugh. &lt;/p&gt;&lt;h2&gt;4.&amp;nbsp; Hardware&lt;/h2&gt;&lt;p&gt;Any programmer who has ever been called upon to debug a strange crash on the database server or why the RAID drives aren&amp;#39;t working properly knows that hardware problems are a pain.&amp;nbsp; There seems to be a common misconception that since programmers work with computers, we must know how to fix them.&amp;nbsp; Granted, this may be true for some programmers, but I reckon the vast majority of us don&amp;#39;t know or really care about what&amp;#39;s going on after the code gets translated into assembly.&amp;nbsp; We just want the stuff to work like it&amp;#39;s supposed to so we can focus on higher level tasks.&amp;nbsp;&lt;/p&gt;&lt;h2&gt;3.&amp;nbsp; Vagueness&lt;/h2&gt;&lt;p&gt;&amp;quot;The website is broken&amp;quot;.&amp;nbsp; &amp;quot;Feature X isn&amp;#39;t working properly&amp;quot;.&amp;nbsp; &lt;strong&gt;Vague requests are a pain to deal with&lt;/strong&gt;.&amp;nbsp; It&amp;#39;s always surprising to me how exasperated non-programmers tend to get when they are asked to reproduce a problem for a programmer.&amp;nbsp; They don&amp;#39;t seem to understand that &amp;quot;it&amp;#39;s broken, fix it!&amp;quot; is &lt;strong&gt;not&lt;/strong&gt; enough information for us to work off of. &amp;nbsp;&lt;/p&gt;&lt;p&gt;Software is (for the most part) deterministic. We like it that way.&amp;nbsp; Humor us by letting us figure out which step of the process is broken instead of asking us to simply &amp;quot;fix it&amp;quot;.&amp;nbsp;&lt;/p&gt;&lt;h2&gt;2.&amp;nbsp; Other programmers&lt;/h2&gt;&lt;p&gt;Programmers don&amp;#39;t always get along with other programmers.&amp;nbsp; Shocking, but true.&amp;nbsp; This could easily be its own top 10 list, so I&amp;#39;m just going to list some of the common traits programmers have that annoy their fellow programmers and save going into detail for a separate post:&lt;/p&gt;&lt;ul&gt;	&lt;li&gt;Being grumpy to the point of being hostile.  &lt;/li&gt;		&lt;li&gt;Failing to understand that there is a time to debate system architecture and a time to get things done.&lt;/li&gt;		&lt;li&gt;Inability to communicate effectively and confusing terminology.  &lt;/li&gt;		&lt;li&gt;Failure to pull ones own weight.	&lt;/li&gt;		&lt;li&gt;Being apathetic towards the code base and project&lt;/li&gt;&lt;/ul&gt;And last, but not least, the number 1 thing that annoys programmers...&lt;br /&gt;&lt;h2&gt;1.&amp;nbsp; Their own code, 6 months later&lt;/h2&gt;&lt;div style="float: right; margin-left: 20px"&gt;&lt;img src="http://kevinwilliampang.com/image.axd?picture=Sand-Mandala2.JPG" alt="" /&gt;&lt;p&gt;&lt;em&gt;Don&amp;#39;t sneeze, I think I see a bug.&lt;/em&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Ever look back at some of your old code and grimace in pain?&amp;nbsp; How stupid you were!&amp;nbsp; How could you, who know so much &lt;em&gt;now&lt;/em&gt;, have written &lt;em&gt;that&lt;/em&gt;?&amp;nbsp; Burn it!&amp;nbsp; Burn it with fire!&lt;/p&gt;&lt;p&gt;Well, good news.&amp;nbsp; You&amp;#39;re not alone.&lt;/p&gt;&lt;p&gt;The truth is, the programming world is one that is constantly changing.&amp;nbsp; What we regard as a best practice today can be obsolete tomorrow.&amp;nbsp; It&amp;#39;s simply not possible to write perfect code because the standards upon which our code is judged is evolving every day.&amp;nbsp; It&amp;#39;s tough to cope with the fact that your work, as beautiful as it may be &lt;em&gt;now&lt;/em&gt;, is probably going to be ridiculed later.&amp;nbsp; It&amp;#39;s frustrating because no matter how much research we do into the latest and greatest tools, designs, frameworks, and best practices, there&amp;#39;s always the sense that what we&amp;#39;re truly after is slightly out of reach.&amp;nbsp; For me, this is the most annoying thing about being a programmer.&amp;nbsp; The fragility of what we do is necessary to facilitate improvement, but I can&amp;#39;t help feeling like I&amp;#39;m one of those &lt;a href="http://en.wikipedia.org/wiki/Sand_mandala"&gt;sand-painting monks&lt;/a&gt;.  &lt;/p&gt;&lt;p&gt;Well, there you have it.&amp;nbsp; The top 10 things that annoy programmers.&amp;nbsp; Again, if you feel that I missed anything please be sure to let me know in the comments!&lt;em&gt; &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cBKXvZlqAFybPdTJdfULn1i6n0M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cBKXvZlqAFybPdTJdfULn1i6n0M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cBKXvZlqAFybPdTJdfULn1i6n0M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cBKXvZlqAFybPdTJdfULn1i6n0M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://kevinwilliampang.com/post/Top-10-Things-That-Annoy-Programmers.aspx</link>
      <author>Kevin Pang</author>
      <comments>http://kevinwilliampang.com/post/Top-10-Things-That-Annoy-Programmers.aspx#comment</comments>
      <guid>http://kevinwilliampang.com/post.aspx?id=be934d6d-bb3a-42fc-9fba-1bfcae36a694</guid>
      <pubDate>Thu, 28 Aug 2008 10:21:00 -0700</pubDate>
      <dc:publisher>Kevin Pang</dc:publisher>
      <pingback:server>http://kevinwilliampang.com/pingback.axd</pingback:server>
      <pingback:target>http://kevinwilliampang.com/post.aspx?id=be934d6d-bb3a-42fc-9fba-1bfcae36a694</pingback:target>
      <slash:comments>152</slash:comments>
      <trackback:ping>http://kevinwilliampang.com/trackback.axd?id=be934d6d-bb3a-42fc-9fba-1bfcae36a694</trackback:ping>
      <wfw:comment>http://kevinwilliampang.com/post/Top-10-Things-That-Annoy-Programmers.aspx#comment</wfw:comment>
      <wfw:commentRss>http://kevinwilliampang.com/syndication.axd?post=be934d6d-bb3a-42fc-9fba-1bfcae36a694</wfw:commentRss>
    </item>
    <item>
      <title>Visual Studio Tip: Split Views</title>
      <description>&lt;p&gt;
There are a couple of ways to get a split view in Visual Studio.&amp;nbsp; Both are incredible time savers that I use daily.&amp;nbsp; The first is one that most developers will be aware of, but the second seems to be one that many do not seem to know about.
&lt;/p&gt;
&lt;h2&gt;Viewing Two Files in a Split View &lt;/h2&gt;
&lt;p&gt;
Let&amp;#39;s say you have two classes you want to compare side by side:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://kevinwilliampang.com/image.axd?picture=VisualStudioSplit1.png" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
Move your mouse over the Class1 tab and click and drag to anywhere on the window.&amp;nbsp; When you let go, Visual Studio will prompt you on whether you wish to open a new horizontal tab group or a new vertical tab group: 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://kevinwilliampang.com/image.axd?picture=VisualStudioSplit2.png" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
As you might expect, a new horizontal tab group will split your screen horizontally, and a new vertical tab group will split your screen vertically.&amp;nbsp; For most developers, I would say a horizontal split makes more sense so you don&amp;#39;t have to scroll to see the end of your lines: 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://kevinwilliampang.com/image.axd?picture=VisualStudioSplit3.png" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
This is a very convenient way to compare and edit files side by side.&amp;nbsp; I have seen several developers take advantage of this feature and it&amp;#39;s a great alternative to switching back and forth via the tabs or keyboard shortcuts. 
&lt;/p&gt;
&lt;h2&gt;Viewing the Same File in a Split View &lt;br /&gt;
&lt;/h2&gt;
&lt;p&gt;
What I haven&amp;#39;t seen many developers take advantage of however, is a technique I use nearly as often: splitting the same file in Visual Studio.&amp;nbsp; Let&amp;#39;s say you have a single file that is relatively long: 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://kevinwilliampang.com/image.axd?picture=VisualStudioSplit4.png" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
If you want to compare code from one section of this file to another, normally you would have to set bookmarks or just manually scroll back and forth to see both sections of the code.&amp;nbsp; However, if you hover your mouse over the region right above the scroll bar, you will notice your mouse icon changes from the pointer to the vertical resize tool:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://kevinwilliampang.com/image.axd?picture=VisualStudioSplit5.png" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
Now if you click and drag down, you&amp;#39;ll get a split view of your current file!
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://kevinwilliampang.com/image.axd?picture=VisualStudioSplit6.png" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
Both sections of the split view are editable and will update each other in real time.&amp;nbsp; When you&amp;#39;re done, simply drag the divider all the way to the top and you&amp;#39;re back to the normal view!&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
This feature comes in very handy when you have long functions or classes and want to compare sections of the code (e.g. reviewing object instantiation before using the object, looking over similar business logic that you want to mimic, etc.).&amp;nbsp; This feature is available in Visual Studio 2005 and 2008 (and possibly earlier versions, if anyone can confirm please let me know). 
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uL3XAIJMS35FqJtCCNUQ6Eceq3Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uL3XAIJMS35FqJtCCNUQ6Eceq3Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uL3XAIJMS35FqJtCCNUQ6Eceq3Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uL3XAIJMS35FqJtCCNUQ6Eceq3Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://kevinwilliampang.com/post/Visual-Studio-Split-Views.aspx</link>
      <author>Kevin Pang</author>
      <comments>http://kevinwilliampang.com/post/Visual-Studio-Split-Views.aspx#comment</comments>
      <guid>http://kevinwilliampang.com/post.aspx?id=0b80e452-96f4-4094-9c2d-fbf575300499</guid>
      <pubDate>Tue, 19 Aug 2008 08:43:00 -0700</pubDate>
      <dc:publisher>Kevin Pang</dc:publisher>
      <pingback:server>http://kevinwilliampang.com/pingback.axd</pingback:server>
      <pingback:target>http://kevinwilliampang.com/post.aspx?id=0b80e452-96f4-4094-9c2d-fbf575300499</pingback:target>
      <slash:comments>21</slash:comments>
      <trackback:ping>http://kevinwilliampang.com/trackback.axd?id=0b80e452-96f4-4094-9c2d-fbf575300499</trackback:ping>
      <wfw:comment>http://kevinwilliampang.com/post/Visual-Studio-Split-Views.aspx#comment</wfw:comment>
      <wfw:commentRss>http://kevinwilliampang.com/syndication.axd?post=0b80e452-96f4-4094-9c2d-fbf575300499</wfw:commentRss>
    </item>
  </channel>
</rss>
