<?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 1.4.5.0</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" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Dependency Injection For Dummies</title>
      <description>&lt;p style="border: 1px solid black; padding: 5px; background-color: #ededed"&gt;
The goal of this series is to introduce programming patterns and practices to developers who have little to no familiarity with them.  This series does not intend to dive into the intricacies of each pattern / practice, but to give a brief overview that will (hopefully) inspire developers to learn more about them.
&lt;/p&gt;
&lt;h2&gt;
What is it?
&lt;/h2&gt;
&lt;p&gt;
In a nutshell, dependency injection is a design pattern where external dependencies are &amp;quot;injected&amp;quot; into components rather than baked in. 
&lt;/p&gt;
&lt;p&gt;
If that made your eyes glaze over, think about it like this: imagine your friend asked you to drive him to the supermarket:
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;img style="border: 1px solid black" src="http://kevinwilliampang.com/image.axd?picture=2009%2f11%2f1.jpg" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
You would probably just hop in your car and take him:
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;img style="border: 1px solid black" src="http://kevinwilliampang.com/image.axd?picture=2009%2f11%2f2.jpg" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
Now, what if your friend asked you to drive him, and his 5 friends, to the supermarket, but your car only seats 4?
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;img style="border: 1px solid black" src="http://kevinwilliampang.com/image.axd?picture=2009%2f11%2f3.jpg" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
You would need a bigger car, right?  Well, the good news is that since most cars implement the same interface (steering wheel, accelerator, brakes, etc.), you&amp;#39;re not only capable of driving your own car but many other cars as well. So if you had access to say, your mom&amp;#39;s minivan, you could complete the trip:
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;img style="border: 1px solid black" src="http://kevinwilliampang.com/image.axd?picture=2009%2f11%2f4.jpg" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
At the root of it, that&amp;#39;s what dependency injection is all about.&amp;nbsp; Instead of you being stuck having to always use your car for your trips, you will be given the correct car to use based on the circumstances. 
&lt;/p&gt;
&lt;p&gt;
Bringing this back into software terminology, in the analogy above you (the driver) are a class and the car is your dependency.  You depend on the car to drive your friend(s) to the supermarket.&amp;nbsp;  It doesn&amp;#39;t matter which car you use, so long as it&amp;#39;s familiar to you.&amp;nbsp; Without dependency injection, the You class might look something like this:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://kevinwilliampang.com/image.axd?picture=2009%2f11%2f5.JPG" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
Notice how you&amp;#39;ll always be using that particular instance of Car to complete the trip.&amp;nbsp; With dependency injection however, the You class would look something like this:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://kevinwilliampang.com/image.axd?picture=2009%2f11%2f6.JPG" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
Notice how now you don&amp;#39;t know (or care) what car you&amp;#39;ll be getting to complete your trip.  The car is given to you by an outside entity via the constructor.
&lt;/p&gt;
&lt;h2&gt;
Ok great, so why should I care?
&lt;/h2&gt;
&lt;p&gt;
One reason is the one alluded to above.  Dependency injection helps you create &amp;quot;loosely coupled&amp;quot; classes. What this means is that your classes will have less knowledge about their dependencies. This is a good thing.  First, because it allows you to only expose functionality in your dependencies that your classes need (e.g. you don&amp;#39;t care what make or model or engine the car has, only that it drives and you&amp;#39;re capable of driving it).  Second, because it lets you quickly and easily substitute out your dependencies (e.g. replacing the car with a minivan), which makes your code more flexible and also lets you swap out implementation without having to modify or recompile your dependent class. 
&lt;/p&gt;
Another reason is for unit testing. Dependency injection allows for
something called &amp;quot;mocking&amp;quot;. What this means is that in your unit tests,
you don&amp;#39;t actually have to inject concrete dependencies. Instead, you
can inject &amp;quot;mock objects&amp;quot;, which are easy to create (via mocking
frameworks) and define behavior for. This lets you test the behavior of
your dependent class without having to worry about whether the
dependencies are working as expected (you can test the dependencies in
another unit test). This means your unit tests will be more in line
with what unit tests are supposed to be: tests on individual units of
an application (as opposed to tests on a unit and its dependencies and
its dependencies dependencies, etc.)
&lt;h2&gt;
Where can I learn more?
&lt;/h2&gt;
&lt;p&gt;
There&amp;#39;s been a lot written about dependency injection, but I think the &lt;a href="http://en.wikipedia.org/wiki/Dependency_injection"&gt;wiki article&lt;/a&gt; covers it pretty well. 
&lt;/p&gt;
&lt;p&gt;
Once you&amp;#39;ve got that down, the next thing you&amp;#39;ll probably be interested in is Inversion of Control Containers.  These containers make dependency injection a breeze by allowing you to configure default implementations to inject into your classes.  Martin Fowler&amp;#39;s &lt;a href="http://martinfowler.com/articles/injection.html"&gt;article on dependency injection&lt;/a&gt; covers this well.
&lt;/p&gt;
&lt;p&gt;
Note: Yes, I did draw all the pictures using Paint and a laptop trackpad.&amp;nbsp; No, I do not plan on selling my artwork anytime soon.
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SnNDfVWaEdVxezT--okfqsPrQKU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SnNDfVWaEdVxezT--okfqsPrQKU/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/SnNDfVWaEdVxezT--okfqsPrQKU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SnNDfVWaEdVxezT--okfqsPrQKU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://kevinwilliampang.com/post/Dependency-Injection-For-Dummies.aspx</link>
      <author>kpanghmc.nospam@nospam.gmail.com (Kevin Pang)</author>
      <comments>http://kevinwilliampang.com/post/Dependency-Injection-For-Dummies.aspx#comment</comments>
      <guid>http://kevinwilliampang.com/post.aspx?id=ab930457-c54f-4f84-8581-40e5c907f8bb</guid>
      <pubDate>Sat, 07 Nov 2009 11:52:00 -0800</pubDate>
      <dc:publisher>Kevin Pang</dc:publisher>
      <pingback:server>http://kevinwilliampang.com/pingback.axd</pingback:server>
      <pingback:target>http://kevinwilliampang.com/post.aspx?id=ab930457-c54f-4f84-8581-40e5c907f8bb</pingback:target>
      <slash:comments>14</slash:comments>
      <trackback:ping>http://kevinwilliampang.com/trackback.axd?id=ab930457-c54f-4f84-8581-40e5c907f8bb</trackback:ping>
      <wfw:comment>http://kevinwilliampang.com/post/Dependency-Injection-For-Dummies.aspx#comment</wfw:comment>
      <wfw:commentRss>http://kevinwilliampang.com/syndication.axd?post=ab930457-c54f-4f84-8581-40e5c907f8bb</wfw:commentRss>
    </item>
    <item>
      <title>There's No Such Thing As A Duct Tape Programmer</title>
      <description>About a month ago, Joel Spolsky had the software developer community up
in arms over his article, &amp;quot;&lt;a href="http://www.joelonsoftware.com/items/2009/09/23.html"&gt;The Duct Tape Programmer&lt;/a&gt;&amp;quot;.&amp;nbsp; Everyone with a
blog felt compelled to throw in their knee-jerk response, faithfully
declaring their allegiance to either Joel and the duct tape crowd or
the do-it-right crowd.&amp;nbsp; And as so frequently happens on the internet,
the whole argument degenerated into an enormous &lt;a href="http://en.wikipedia.org/wiki/Straw_man_argument"&gt;straw man fight&lt;/a&gt;.&amp;nbsp; Duct
tape programmers complained about how endlessly debating best practices
and writing unit tests doesn&amp;#39;t get anything done, while do-it-right
programmers argued that poor design leads to maintenance nightmares
down the line.&amp;nbsp; Both assertions are correct of course, but they miss
out on one key point: &lt;span style="font-weight: bold"&gt;there&amp;#39;s no such thing as a duct tape programmer.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
To expand on Joel&amp;#39;s analogy, you won&amp;#39;t find a carpenter who &lt;span style="font-style: italic"&gt;only&lt;/span&gt;
uses duct tape to fix things.&amp;nbsp; Similarly, you also won&amp;#39;t find a
carpenter who doesn&amp;#39;t know how to use duct tape or refuses to use it
under &lt;span style="font-style: italic"&gt;any&lt;/span&gt; circumstances.&amp;nbsp; &lt;span style="font-weight: bold"&gt;All carpenters have duct tape in their toolbox&lt;/span&gt;.&amp;nbsp;
What differentiates a good carpenter from a bad one isn&amp;#39;t whether they
use duct tape, it&amp;#39;s how well they use it and when they choose to use it.&lt;br /&gt;
&lt;br /&gt;
Bringing
this back into software terminology, there are situations where
delivering code quickly is more important than delivering it
correctly.&amp;nbsp; Yes, even if it means there are bugs.&amp;nbsp; Yes, even if it
means maintenance will be a nightmare.&amp;nbsp; For instance, when your team is
in a race against other competitors to be the first one out the door
(e.g. iPhone development, Facebook app development) or when deadlines
&lt;em&gt;absolutely, positively&lt;/em&gt; &lt;em&gt;must be met&lt;/em&gt; (e.g. your company will be sued if
it doesn&amp;#39;t meet some compliance issue by a certain date or you&amp;#39;ll lose
a potential client if a certain feature isn&amp;#39;t implemented by their
go-live date).&amp;nbsp; In situations like these, getting things done trumps
anything else and if it has to come at the cost of good coding
practices, then so be it.&lt;br /&gt;
&lt;br /&gt;
But -- and this is a big but -- , these situations are the exception, not the rule.&amp;nbsp; &lt;span style="font-weight: bold"&gt;The
difference between a good developer and a bad developer isn&amp;#39;t whether
they use duct tape, it&amp;#39;s how well they can recognize whether a
situation calls for it&lt;/span&gt;.&amp;nbsp; Bad developers use duct tape far too
often, either because they&amp;#39;re too lazy to implement something correctly
or because they simply don&amp;#39;t know of any other way to do it.&amp;nbsp; Good
developers keep their duct tape handy for when they need it, but are
usually smart enough to come up with better solutions instead.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HIaF_iHuY7_TLR6uzQhhlbqEK3Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HIaF_iHuY7_TLR6uzQhhlbqEK3Y/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/HIaF_iHuY7_TLR6uzQhhlbqEK3Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HIaF_iHuY7_TLR6uzQhhlbqEK3Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://kevinwilliampang.com/post/Theres-No-Such-Thing-As-A-Duct-Tape-Programmer.aspx</link>
      <author>kpanghmc.nospam@nospam.gmail.com (Kevin Pang)</author>
      <comments>http://kevinwilliampang.com/post/Theres-No-Such-Thing-As-A-Duct-Tape-Programmer.aspx#comment</comments>
      <guid>http://kevinwilliampang.com/post.aspx?id=b156129c-71df-4cd5-81fc-d25bf898e790</guid>
      <pubDate>Mon, 26 Oct 2009 17:47:00 -0800</pubDate>
      <dc:publisher>Kevin Pang</dc:publisher>
      <pingback:server>http://kevinwilliampang.com/pingback.axd</pingback:server>
      <pingback:target>http://kevinwilliampang.com/post.aspx?id=b156129c-71df-4cd5-81fc-d25bf898e790</pingback:target>
      <slash:comments>11</slash:comments>
      <trackback:ping>http://kevinwilliampang.com/trackback.axd?id=b156129c-71df-4cd5-81fc-d25bf898e790</trackback:ping>
      <wfw:comment>http://kevinwilliampang.com/post/Theres-No-Such-Thing-As-A-Duct-Tape-Programmer.aspx#comment</wfw:comment>
      <wfw:commentRss>http://kevinwilliampang.com/syndication.axd?post=b156129c-71df-4cd5-81fc-d25bf898e790</wfw:commentRss>
    </item>
    <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>kpanghmc.nospam@nospam.gmail.com (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 -0800</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>kpanghmc.nospam@nospam.gmail.com (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 -0800</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>kpanghmc.nospam@nospam.gmail.com (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 -0800</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>104</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>kpanghmc.nospam@nospam.gmail.com (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 -0800</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>kpanghmc.nospam@nospam.gmail.com (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 -0800</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>54</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>kpanghmc.nospam@nospam.gmail.com (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 -0800</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>kpanghmc.nospam@nospam.gmail.com (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 -0800</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>kpanghmc.nospam@nospam.gmail.com (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 -0800</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;p&gt;
[code:c#]
&lt;/p&gt;
string Foo(bool condition)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;if (condition)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;true&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;else&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;false&amp;quot;;&lt;br /&gt;
}
&lt;p&gt;
[/code]
&lt;/p&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;p&gt;
[code:c#]
&lt;/p&gt;
double Foo(double a, double b)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;return a / b;&lt;br /&gt;
}
&lt;p&gt;
[/code]
&lt;/p&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/uTnUf_wwAIRmyKgjyHZ6Nt7KSkw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uTnUf_wwAIRmyKgjyHZ6Nt7KSkw/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/uTnUf_wwAIRmyKgjyHZ6Nt7KSkw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uTnUf_wwAIRmyKgjyHZ6Nt7KSkw/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>kpanghmc.nospam@nospam.gmail.com (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 -0800</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>44</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>kpanghmc.nospam@nospam.gmail.com (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 -0800</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>kpanghmc.nospam@nospam.gmail.com (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 -0800</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>kpanghmc.nospam@nospam.gmail.com (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 -0800</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>kpanghmc.nospam@nospam.gmail.com (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 -0800</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>
  </channel>
</rss>
