<?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:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Chad Myers' Blog</title><link>http://www.lostechies.com/blogs/chad_myers/default.aspx</link><description>Department of Problem Prevention</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 (Build: 30929.2835)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/ChadMyersBlog" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>“Productization”</title><link>http://feedproxy.google.com/~r/ChadMyersBlog/~3/o2gUY75L1rs/productization.aspx</link><pubDate>Fri, 30 Oct 2009 16:37:08 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:29653</guid><dc:creator>chadmyers</dc:creator><slash:comments>14</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/chad_myers/rsscomments.aspx?PostID=29653</wfw:commentRss><comments>http://www.lostechies.com/blogs/chad_myers/archive/2009/10/30/productization.aspx#comments</comments><description>&lt;p&gt;I need some ‘wisdom of the crowd’ here.&lt;/p&gt;  &lt;p&gt;I’m guessing just about ever single one of you (at least the software developer types) reading this have deployed software to a production environment at least once in your career. One of the products we’re working on is getting near to a major milestone and will start seeing wider deployments than the beta and preview deployments we’ve seen so far. I’m in charge of developing a list of different things we’ll need to do to the product to start wrapping it in a bow for wider distribution and deployment.&lt;/p&gt;  &lt;p&gt;What sorts of things, in your opinion and experience, should I be most concerned about?&amp;#160; Some of things I have on my list are:&amp;#160; Good logging and error reporting, well-defined and practiced strategy for handling updates and patches going forward (including incremental DB schema migration), etc.&lt;/p&gt;  &lt;p&gt;I’m also looking for any “Whatever you do, DO NOT do *this*” where *this* is some thing you tried and ended up being a terrible idea or blew up in your face.&lt;/p&gt;  &lt;p&gt;If you comment, please keep your advice short and to the point.&amp;#160; Though I would encourage you, if you have a funny and/or insightful story to share, to blog and link it back to this post for me and others to read!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;a href="http://www.dotnetkicks.com/kick/?title=%e2%80%9cProductization%e2%80%9d&amp;url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f10%2f30%2fproductization.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f10%2f30%2fproductization.aspx" border="0" alt="Kick It on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=29653" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=o2gUY75L1rs:eV_YJ7uEuVM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=o2gUY75L1rs:eV_YJ7uEuVM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=o2gUY75L1rs:eV_YJ7uEuVM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=o2gUY75L1rs:eV_YJ7uEuVM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=o2gUY75L1rs:eV_YJ7uEuVM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=o2gUY75L1rs:eV_YJ7uEuVM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=o2gUY75L1rs:eV_YJ7uEuVM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChadMyersBlog/~4/o2gUY75L1rs" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/Advice/default.aspx">Advice</category><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/Deployment/default.aspx">Deployment</category><feedburner:origLink>http://www.lostechies.com/blogs/chad_myers/archive/2009/10/30/productization.aspx</feedburner:origLink></item><item><title>Dovetail is Hiring a Junior-to-Mid-level .NET Developer</title><link>http://feedproxy.google.com/~r/ChadMyersBlog/~3/iEKKH1b0D90/dovetail-is-hiring-a-junior-to-mid-level-net-developer.aspx</link><pubDate>Fri, 18 Sep 2009 16:26:43 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:24963</guid><dc:creator>chadmyers</dc:creator><slash:comments>10</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/chad_myers/rsscomments.aspx?PostID=24963</wfw:commentRss><comments>http://www.lostechies.com/blogs/chad_myers/archive/2009/09/18/dovetail-is-hiring-a-junior-to-mid-level-net-developer.aspx#comments</comments><description>&lt;p&gt;Come work for one of the most progressive development shops in the US. This is an opportunity to work with some of the leaders in the .NET/C# space including Jeremy Miller and Joshua Flanagan – both senior developers, designers, architects, authors, and open source project leaders -- with tons of experience. We use cutting edge project practices and our testers and information developers are integrated with the development team.&lt;/p&gt;  &lt;p&gt;We’re building a new software product line using pioneering practices and technologies, such as:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Test-driven development &lt;/li&gt;    &lt;li&gt;Continuous integration &lt;/li&gt;    &lt;li&gt;Behavior-driven design &lt;/li&gt;    &lt;li&gt;Domain-driven design &lt;/li&gt;    &lt;li&gt;HTML, CSS, Javascript (jQuery) &lt;/li&gt;    &lt;li&gt;ASP .NET MVC &lt;/li&gt;    &lt;li&gt;C# 3.0, .NET 3.5, Visual Studio 2008 &lt;/li&gt;    &lt;li&gt;SQL 2008 &lt;/li&gt;    &lt;li&gt;NHibernate 2.x &lt;/li&gt;    &lt;li&gt;LINQ2NHibernate &lt;/li&gt;    &lt;li&gt;StructureMap &lt;/li&gt;    &lt;li&gt;Selenium Core and Selenium RC &lt;/li&gt;    &lt;li&gt;StoryTeller for automated acceptance testing &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Who we’re looking for&lt;/strong&gt; || Dovetail Software is staffing a team for an innovative software project. We’re looking for junior- to mid-level software developers with demonstrable C# (preferably .NET 2.0 or later) and HTML/CSS experience (not necessarily ASP.NET, just web development in general). Any experience with test-driven development or automated unit testing in general is a huge plus.&amp;#160; Also, participation in the community (attendance of events, avid blog reader + commenter, or maybe you even have a blog yourself) will put you firmly in the running for this position. We’re looking for people that believe learning and continuous improvement are primary responsibilities of a software developer. We’re hiring motivated people for a terrific opportunity with a team of recognized .NET and agile community leaders. If you’re not looking to rocket your knowledge and experience fast, please do not apply!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Our development methodology&lt;/strong&gt; || We are an Agile shop (Scrum/XP, Kanban for tracking). We work without iterations in a continuous stream of development with frequent releases -- not long crushing release cycles. We have a collaborative relationship with our customers. We write tests before we write functional code to clarify our design intentions. We keep the build clean. We work in an environment that maximizes communication to minimize the volume of spec documents. We build software that can effectively respond to change. We use open source tools where appropriate, and Microsoft tools where they make sense. We have executive support and visibility all the way up to the owner of the company.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;About Dovetail Software&lt;/strong&gt; || Serving companies since 1995, Dovetail Software develops CRM products for global 1000 enterprises. Our product, Dovetail CRM, is a comprehensive customer service and support, logistics management, customer self service, and knowledge management suite. Dovetail is a small company with big customers and great benefits for its employees. Our outstanding compensation package includes company-assisted health, dental, and life insurance, matching 401k, and more.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;About Texas&lt;/strong&gt; || Texas has outpaced every other state in the Union during the recent economic downturn. Texas added more jobs in 2008 than all the other 49 states &lt;em&gt;combined&lt;/em&gt;. Texas’ economy continues to grow and lead the country in technology jobs.&amp;#160; Seven of the top 25 fastest-growing cities in the U.S. are in Texas (according to the U.S. Census Bureau). The second-fastest growing city in the U.S. is Round Rock, a city in the same metro/commuter area of Austin.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;About Austin&lt;/strong&gt; || Placing second in the Large Cities Creativity Ranking, Austin is recognized as a city with a thriving music scene, ethnic and cultural diversity, endless outdoor recreations, and a great nightlife. It’s a nationally recognized center for technology innovation—home to 3,200 tech companies with 98,000 employees.&amp;#160; In 2008, Forbes Magazine rated Austin the #1 fastest-growing large metro area in the US. &lt;a href="http://www.lostechies.com/blogs/chad_myers/archive/2008/04/21/move-to-austin.aspx"&gt;Austin is a great place to live and work&lt;/a&gt;!&lt;/p&gt;  &lt;p&gt;Email us and tell us why you’d make a great addition to our team: &lt;a href="mailto:tech-jobs@dovetailsoftware.com"&gt;tech-jobs@dovetailsoftware.com&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;a href="http://www.dotnetkicks.com/kick/?title=Dovetail+is+Hiring+a+Junior-to-Mid-level+.NET+Developer&amp;url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f09%2f18%2fdovetail-is-hiring-a-junior-to-mid-level-net-developer.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f09%2f18%2fdovetail-is-hiring-a-junior-to-mid-level-net-developer.aspx" border="0" alt="Kick It on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=24963" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=iEKKH1b0D90:xmAm48y9rPE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=iEKKH1b0D90:xmAm48y9rPE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=iEKKH1b0D90:xmAm48y9rPE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=iEKKH1b0D90:xmAm48y9rPE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=iEKKH1b0D90:xmAm48y9rPE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=iEKKH1b0D90:xmAm48y9rPE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=iEKKH1b0D90:xmAm48y9rPE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChadMyersBlog/~4/iEKKH1b0D90" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/Austin/default.aspx">Austin</category><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/Dovetail/default.aspx">Dovetail</category><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/Hiring/default.aspx">Hiring</category><feedburner:origLink>http://www.lostechies.com/blogs/chad_myers/archive/2009/09/18/dovetail-is-hiring-a-junior-to-mid-level-net-developer.aspx</feedburner:origLink></item><item><title>Chad’s Comment-worthiness Ranking Scale</title><link>http://feedproxy.google.com/~r/ChadMyersBlog/~3/Uvx28MWx4a0/chad-s-comment-worthiness-ranking-scale.aspx</link><pubDate>Tue, 01 Sep 2009 02:15:22 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:24427</guid><dc:creator>chadmyers</dc:creator><slash:comments>18</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/chad_myers/rsscomments.aspx?PostID=24427</wfw:commentRss><comments>http://www.lostechies.com/blogs/chad_myers/archive/2009/08/31/chad-s-comment-worthiness-ranking-scale.aspx#comments</comments><description>&lt;p&gt;I try to be fair to commenters and give them a say, even if they’re belligerent and obnoxious as long as their making good points or otherwise contributing to the thread (even if they’re disagreeing with me).&lt;/p&gt;  &lt;p&gt;However, every now and then a comment comes along that just screams out DELETE ME. In the past, my criteria was somewhat arbitrary or loosely self-consistent.&amp;#160; &lt;/p&gt;  &lt;p&gt;What prompted me to write this was the supreme idiocy of the anonymous/pseudonymous&amp;#160; poster ‘Philip’ over on Jeremy’s lighthearted “&lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2009/08/31/i-thought-this-was-funny.aspx"&gt;I thought this was funny&lt;/a&gt;” post.&lt;/p&gt;  &lt;p&gt;This post is for other bloggers who struggle, like I do, in determining when to cut someone off.&lt;/p&gt;  &lt;p&gt;I’m going to start with the Celsius model of measuring comment-worthiness. That is, 0 is minimal acceptance of a comment. Anything below 0 is delete-worthy.&amp;#160; As things approach –500, that might constitute a permanent IP-ban site-wide.&amp;#160; As things approach –1000, it might be prudent to notify other sites to block this IP address and ones like it.&amp;#160; As things approach positive 500, they definitely call for a thoughtful reply, or even another post.&amp;#160; As things approach positive 1,000, it might be prudent to write a series of posts or to elicit the response from higher authorities and the larger community of bloggers.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;NOTE&lt;/u&gt;&lt;/strong&gt;: This list will probably be changing as the days and weeks go on. I may update it again in the future as people suggest things. If you have a noteworthy suggestion, leave a comment or send me an email and I’ll add it with credits to you (and a link if you give me a URL)&lt;/p&gt;  &lt;p&gt;So here’s the start of my grading scale:&lt;/p&gt;  &lt;h3&gt;Positive Effects&lt;/h3&gt;  &lt;p&gt;+100 Full, real life name used (not just last or first name)&lt;/p&gt;  &lt;p&gt;+100 Public contact information left (the commenter’s web site, maybe an obfuscated email address, etc&lt;/p&gt;  &lt;p&gt;+50 Private email left (for the blog author and site admins to be able to contact this person if necessary)&lt;/p&gt;  &lt;p&gt;+50 for being a registered user on the site, possibly with a real avatar (showing that this person is interested in being a real part of the community)&lt;/p&gt;  &lt;p&gt;+50 More than 50 meaningful words&lt;/p&gt;  &lt;p&gt;+25 for good humor that is relevant to the post or other commenters&lt;/p&gt;  &lt;p&gt;+25 for replying to another commenter in a polite way that contributes (answering a question, furthering the discussion, etc)&lt;/p&gt;  &lt;p&gt;+25 per legitimate point made&lt;/p&gt;  &lt;p&gt;+25 per significant, legitimate correction made to the original blog post (more than just spelling/grammar mistakes)&lt;/p&gt;  &lt;p&gt;+25 for having the gumption to comment in the first place&lt;/p&gt;  &lt;p&gt;+10 per legitimate minor correction made&lt;/p&gt;  &lt;p&gt;+5 per incorrect correction made, but made politely with good intent&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Negative Effects&lt;/h3&gt;  &lt;p&gt;-1000 (instant ban + warning to other sites) posting links to or direct embeds of pornography, shock links, images, or videos, etc especially extra vulgar ones&lt;/p&gt;  &lt;p&gt;-500 (instant ban) for extreme profanity (gratuitous use greater profanity, excessive vulgarity, racism, sexism, or other extremely offensive bile)&lt;/p&gt;  &lt;p&gt;-250 per use of greater profanity (the 7 deadly words, vulgar descriptions, or gratuitous use of the lesser profanities)&lt;/p&gt;  &lt;p&gt;-250 for personal attacks on the blog author or other legitimate commenters&lt;/p&gt;  &lt;p&gt;-150 for personal attacks on a bogus commenter (one who’s significantly in the negative range, but hasn’t yet been deleted)&lt;/p&gt;  &lt;p&gt;-100 for use of lesser profanity (not one of the ‘7 deadly words’ except for maybe ''b.s.’ or just the ‘s’ word used without extra flare)&lt;/p&gt;  &lt;p&gt;-50 No last name left&lt;/p&gt;  &lt;p&gt;-50 No first name left (or a bogus name)&lt;/p&gt;  &lt;p&gt;-25 general rudeness and uncharitably interacting with the blog author or other commenters&lt;/p&gt;  &lt;p&gt;-25 per incorrect correction, or a correct suggestion made rudely&lt;/p&gt;  &lt;p&gt;-10 per bogus or nit-picky correction made, made rudely, or with snark/sarcasm&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;a href="http://www.dotnetkicks.com/kick/?title=Chad%e2%80%99s+Comment-worthiness+Ranking+Scale&amp;url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f08%2f31%2fchad-s-comment-worthiness-ranking-scale.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f08%2f31%2fchad-s-comment-worthiness-ranking-scale.aspx" border="0" alt="Kick It on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=24427" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=Uvx28MWx4a0:4tzjJfW0qqU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=Uvx28MWx4a0:4tzjJfW0qqU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=Uvx28MWx4a0:4tzjJfW0qqU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=Uvx28MWx4a0:4tzjJfW0qqU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=Uvx28MWx4a0:4tzjJfW0qqU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=Uvx28MWx4a0:4tzjJfW0qqU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=Uvx28MWx4a0:4tzjJfW0qqU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChadMyersBlog/~4/Uvx28MWx4a0" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.lostechies.com/blogs/chad_myers/archive/2009/08/31/chad-s-comment-worthiness-ranking-scale.aspx</feedburner:origLink></item><item><title>Is Blogging Dead?</title><link>http://feedproxy.google.com/~r/ChadMyersBlog/~3/lo1ylz5MpCc/is-blogging-dead.aspx</link><pubDate>Tue, 01 Sep 2009 01:54:49 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:24424</guid><dc:creator>chadmyers</dc:creator><slash:comments>16</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/chad_myers/rsscomments.aspx?PostID=24424</wfw:commentRss><comments>http://www.lostechies.com/blogs/chad_myers/archive/2009/08/31/is-blogging-dead.aspx#comments</comments><description>&lt;p&gt;The other day I was at lunch with some folks (I won’t name drop except to give credit for the person who originally brought it up: &lt;a href="http://codebetter.com/blogs/jeremy.miller/"&gt;Jeremy&lt;/a&gt;), and he commented that, while is number of RSS subscriptions has actually increased, the volume of daily unread posts has dramatically decreased.&lt;/p&gt;  &lt;p&gt;I’ve heard others attribute this to twitter. Also, perhaps the &lt;strike&gt;dragging economy&lt;/strike&gt; rampaging economic recovery could be keeping people extra busy &lt;strike&gt;trying to make ends meet&lt;/strike&gt; dealing with the flood of new shovel-ready business.&lt;/p&gt;  &lt;p&gt;For me, it’s been a combination of both.&amp;#160; I sort of burnt out, got super busy dealing with family life, found twitter useful for &lt;strike&gt;waging all-out argument wars&lt;/strike&gt; blurting out a few things off the top of my head, ran out of topic ideas that fire me up enough to pump out blog posts I thought were worthy of sharing.&lt;/p&gt;  &lt;p&gt;Los Techies is still cranking out a huge volume of content including Sean Chambers’ epic 31-part ‘&lt;a href="http://www.lostechies.com/blogs/sean_chambers/archive/2009/07/31/31-days-of-refactoring.aspx"&gt;31 Days of Refactoring&lt;/a&gt;’ series.&amp;#160; So I’d say that Blogging is not quite dead, but it’s certainly not operating at the same volume and frequency as we say even just 2 years ago.&lt;/p&gt;  &lt;p&gt;Did Twitter kill blogging? What are your thoughts?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;a href="http://www.dotnetkicks.com/kick/?title=Is+Blogging+Dead%3f&amp;url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f08%2f31%2fis-blogging-dead.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f08%2f31%2fis-blogging-dead.aspx" border="0" alt="Kick It on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=24424" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=lo1ylz5MpCc:0mRXJbVGuu4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=lo1ylz5MpCc:0mRXJbVGuu4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=lo1ylz5MpCc:0mRXJbVGuu4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=lo1ylz5MpCc:0mRXJbVGuu4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=lo1ylz5MpCc:0mRXJbVGuu4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=lo1ylz5MpCc:0mRXJbVGuu4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=lo1ylz5MpCc:0mRXJbVGuu4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChadMyersBlog/~4/lo1ylz5MpCc" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/Misc/default.aspx">Misc</category><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/Twitter+die+die+die/default.aspx">Twitter die die die</category><feedburner:origLink>http://www.lostechies.com/blogs/chad_myers/archive/2009/08/31/is-blogging-dead.aspx</feedburner:origLink></item><item><title>The usual result of Poor Man’s Dependency Injection</title><link>http://feedproxy.google.com/~r/ChadMyersBlog/~3/1sESG5SMGBQ/the-usual-result-of-poor-man-s-dependency-injection.aspx</link><pubDate>Tue, 14 Jul 2009 18:41:28 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:22925</guid><dc:creator>chadmyers</dc:creator><slash:comments>15</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/chad_myers/rsscomments.aspx?PostID=22925</wfw:commentRss><comments>http://www.lostechies.com/blogs/chad_myers/archive/2009/07/14/the-usual-result-of-poor-man-s-dependency-injection.aspx#comments</comments><description>&lt;p&gt;Alternate Title: An IoC Container is a Rich Man’s Factory Pattern Implementation&lt;/p&gt;  &lt;p&gt;I ruffled some feathers with my last post on Poor Man’s Dependency Injection (PDMI), so please allow me to clarify further.&lt;/p&gt;  &lt;p&gt;The natural progression of using PMDI is this:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;You start out using PMDI, everything is fine. It goes really smooth and easy. “What’s the big deal?” you think.&lt;/li&gt;    &lt;li&gt;Later, you need to add some functionality. DI makes it easy, but then you have all these “new()” calls lying around.&amp;#160; Well, that “new FooRepository()” call that’s being made in 17 places in your code now suddenly changes to “new FooRepository(new ConfiguredSessionSource())”, for example.&amp;#160; 17 changes. Not terrible, but not good either.&lt;/li&gt;    &lt;li&gt;Later, ConfiguredSessionSource needs to take in some configuration. This is getting out of hand. Making all these changes gets difficult.&amp;#160; I know! I’ll write a small factory that will manage the creation of all these objects.&lt;/li&gt;    &lt;li&gt;Eventually even the factory gets too convoluted with all the different forms your dependency object graph can take. It’s out of hand now.&lt;/li&gt;    &lt;li&gt;You now have to make a choice:&amp;#160; Improve your factory implementation and eventually implement a half-baked IoC container, or just use an IoC Container.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Every time I’ve used PDMI (which was a significant number of attempts a few years ago), I ended up at this point.&amp;#160; I wrote a few half-baked IoC containers that ended up being more complex than the application itself.&amp;#160; The rest of the time, I ended up going the IoC route, even for small apps with less than, say, 10 classes.&lt;/p&gt;  &lt;p&gt;It’s my recommendation that you save yourself some headache and go right for the IoC container. Yes, I know it’s new and a little scary, but trust me, once you get the hang of it, you’ll never look back and laugh at all the fuss that’s being made over this.&amp;#160; It’s like wearing seat belts: Sure, it’s a hassle the first few times and the perceived benefit is little, but once you start doing it it’s not a big deal and the alternative is not pleasant to think about any more.&lt;/p&gt;  &lt;p&gt;One more thing:&amp;#160; How small is too small for IoC?&lt;/p&gt;  &lt;p&gt;If you have less than “a few” classes and have no expectation this project will grow further.&amp;#160; In my experience, every project usually grows and the ones that don’t are the very rare exception.&lt;/p&gt;  &lt;p&gt;Once you have more than “a few” classes, the complexity of maintaining the coupling and dependency graph starts growing rapidly and you’ll wish you had an IoC container later.&amp;#160; You’ll then spend more time retrofitting in a container than if you had just started out that way. So save yourself some effort and just do it.&lt;/p&gt;  &lt;p&gt;Also, since the effort, once familiar with a container, is so low that even if you don’t end up reaping the benefits, the sunk cost of using a container unnecessarily is negligible.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;a href="http://www.dotnetkicks.com/kick/?title=The+usual+result+of+Poor+Man%e2%80%99s+Dependency+Injection&amp;url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f07%2f14%2fthe-usual-result-of-poor-man-s-dependency-injection.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f07%2f14%2fthe-usual-result-of-poor-man-s-dependency-injection.aspx" border="0" alt="Kick It on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=22925" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=1sESG5SMGBQ:mzEsgvD_NsA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=1sESG5SMGBQ:mzEsgvD_NsA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=1sESG5SMGBQ:mzEsgvD_NsA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=1sESG5SMGBQ:mzEsgvD_NsA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=1sESG5SMGBQ:mzEsgvD_NsA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=1sESG5SMGBQ:mzEsgvD_NsA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=1sESG5SMGBQ:mzEsgvD_NsA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChadMyersBlog/~4/1sESG5SMGBQ" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/Advice/default.aspx">Advice</category><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/IoC/default.aspx">IoC</category><feedburner:origLink>http://www.lostechies.com/blogs/chad_myers/archive/2009/07/14/the-usual-result-of-poor-man-s-dependency-injection.aspx</feedburner:origLink></item><item><title>Just say no to 'Poor Man’s Dependency Injection’.</title><link>http://feedproxy.google.com/~r/ChadMyersBlog/~3/BrmvwmL1Ou4/just-say-no-to-poor-man-s-dependency-injection.aspx</link><pubDate>Tue, 14 Jul 2009 14:53:48 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:22908</guid><dc:creator>chadmyers</dc:creator><slash:comments>23</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/chad_myers/rsscomments.aspx?PostID=22908</wfw:commentRss><comments>http://www.lostechies.com/blogs/chad_myers/archive/2009/07/14/just-say-no-to-poor-man-s-dependency-injection.aspx#comments</comments><description>&lt;p&gt;For background, Jimmy Bogard &lt;a href="http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/07/03/how-not-to-do-dependency-injection-in-nerddinner.aspx"&gt;originally posted&lt;/a&gt; about the ‘poor man’s dependency injection’ style used in NerdDinner. Not to single out NerdDinner, because there are lots of apps out there doing this. NerdDinner just happened to be the most recent and visible so it serves as a good whipping boy.&lt;/p&gt;  &lt;p&gt;Tim Barcz respectfully countered with his post &amp;quot;&lt;a href="http://devlicio.us/blogs/tim_barcz/archive/2009/07/12/why-there-s-nothing-wrong-with-dependency-injection-in-nerddinner.aspx"&gt;Why There’s Nothing Wrong With Dependency Injection in NerdDinner&lt;/a&gt;.”&lt;/p&gt;  &lt;p&gt;I promised Tim a respectful rebuttal to explain why there *IS* indeed something wrong with ‘poor man’s DI.’&amp;#160; That will be forthcoming.&amp;#160; For now, though, it reminded me of &lt;a href="http://tech.groups.yahoo.com/group/altdotnet/message/10434"&gt;a post I did&lt;/a&gt; on the altdotnet yahoo mailing list awhile back.&lt;/p&gt;  &lt;p&gt;Here’s an excerpt from it for your convenience:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Been thinking a lot lately about how to teach about IoC and how to use containers such as StructureMap to someone who either is coming in cold to DI/IoC or has a vague awareness of what it is.      &lt;br /&gt;Personally, the stages I went through (and have seen few other people go through similarly) are:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;Replace all (most?) new()&amp;#39;s with ObjectFactory.GetInstance&amp;lt;T&amp;gt;.&amp;#160; You get some immediate benefit out of this and it opens up some new opportunities for your code, but doesn&amp;#39;t even scratch the surface &lt;/li&gt;      &lt;li&gt;Move to ctor injection with very explicitly defined instances/pluginfamilies/etc and not using auto-wiring.&amp;#160; Maybe you still even have an old-fashioned C&amp;#39;tor that still satisfies its own dependencies for those times when &amp;#39;you might not be using an IoC container&amp;#39; &lt;/li&gt;      &lt;li&gt;Embrace auto-wiring, remove non-IoC/DI c&amp;#39;tors and trust fully the container &lt;/li&gt;      &lt;li&gt;Start using more advanced techniques like lifecycle management, profiles, convention-based dependency satisfaction, etc &lt;/li&gt;      &lt;li&gt;Auto-registration, full trust of the IoC. Thoughts start to pop up like, &amp;#39;I wonder if I could get the Container to write my app for me??&amp;#39; &lt;/li&gt;   &lt;/ol&gt; &lt;/blockquote&gt;  &lt;p&gt;Since I wrote that post, I can now add the following point:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;6.&amp;#160; Conventional and custom registration. Rather than explicitly registering everything, and more than automatic registration of some things, you develop more complex and conventional ways of registering your objects/services/controllers/etc into the container.&amp;#160; You know you’re in this stage when you’re building your own DSL/FI on top of your container’s configuration model to fit your application’s needs better.&lt;/p&gt;  &lt;p&gt;Do you have a 7 or 8 you can add?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;a href="http://www.dotnetkicks.com/kick/?title=Just+say+no+to+%27Poor+Man%e2%80%99s+Dependency+Injection%e2%80%99.&amp;url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f07%2f14%2fjust-say-no-to-poor-man-s-dependency-injection.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f07%2f14%2fjust-say-no-to-poor-man-s-dependency-injection.aspx" border="0" alt="Kick It on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=22908" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=BrmvwmL1Ou4:8bO43ru-xN4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=BrmvwmL1Ou4:8bO43ru-xN4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=BrmvwmL1Ou4:8bO43ru-xN4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=BrmvwmL1Ou4:8bO43ru-xN4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=BrmvwmL1Ou4:8bO43ru-xN4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=BrmvwmL1Ou4:8bO43ru-xN4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=BrmvwmL1Ou4:8bO43ru-xN4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChadMyersBlog/~4/BrmvwmL1Ou4" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/StructureMap/default.aspx">StructureMap</category><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/IoC/default.aspx">IoC</category><feedburner:origLink>http://www.lostechies.com/blogs/chad_myers/archive/2009/07/14/just-say-no-to-poor-man-s-dependency-injection.aspx</feedburner:origLink></item><item><title>VAN is a friend of Pablo’s!</title><link>http://feedproxy.google.com/~r/ChadMyersBlog/~3/Ddm-R0DGMs0/van-is-a-friend-of-pablos.aspx</link><pubDate>Mon, 13 Jul 2009 16:12:56 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:22865</guid><dc:creator>chadmyers</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/chad_myers/rsscomments.aspx?PostID=22865</wfw:commentRss><comments>http://www.lostechies.com/blogs/chad_myers/archive/2009/07/13/van-is-a-friend-of-pablos.aspx#comments</comments><description>&lt;p&gt;In case you haven’t noticed, the VAN logo now appears in our “Friends of Pablo” section. VAN is really taking off!&lt;/p&gt;  &lt;p&gt;&lt;img style="display:inline;" align="right" src="http://www.virtualaltnet.com/Content/Images/VAN_LOGO.png" width="403" height="150" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;If you have checked out VAN (Virtual ALT.NET) before, I suggest you run, not walk, to check it out now.&lt;/p&gt;  &lt;p&gt;They’ve got a web site, a logo, and official INETA membership. The E-VAN (European VAN) is taking off as well.&amp;#160; &lt;/p&gt;  &lt;p&gt;There are lots of great people working very hard on making this happen, so you should definitely give it a look!&lt;/p&gt;  &lt;p&gt;The home page, which has everything you need to know is here:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://virtualaltnet.com/"&gt;http://virtualaltnet.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Also, they have a blog:&amp;#160; &lt;a href="http://virualaltnet.blogspot.com/"&gt;http://virualaltnet.blogspot.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The next speaker is &lt;a href="http://blog.jpboodhoo.com/"&gt;Jean-Paul Sylvain Boodhoo&lt;/a&gt; (on &lt;a href="http://virualaltnet.blogspot.com/2009/07/van-jean-paul-sylvain-boodhoo-in-town_12.html"&gt;Weds the 15th&lt;/a&gt;).&amp;#160; Be sure to check this out. JP always gives a good presentation.&amp;#160;&amp;#160; If you haven’t seen or heard him speak, you seriously owe it to yourself to try it this time. He’s inspirational, motivational, and just a great guy in general.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;a href="http://www.dotnetkicks.com/kick/?title=VAN+is+a+friend+of+Pablo%e2%80%99s!&amp;url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f07%2f13%2fvan-is-a-friend-of-pablos.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f07%2f13%2fvan-is-a-friend-of-pablos.aspx" border="0" alt="Kick It on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=22865" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=Ddm-R0DGMs0:GEFVpzhPi6k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=Ddm-R0DGMs0:GEFVpzhPi6k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=Ddm-R0DGMs0:GEFVpzhPi6k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=Ddm-R0DGMs0:GEFVpzhPi6k:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=Ddm-R0DGMs0:GEFVpzhPi6k:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=Ddm-R0DGMs0:GEFVpzhPi6k:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=Ddm-R0DGMs0:GEFVpzhPi6k:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChadMyersBlog/~4/Ddm-R0DGMs0" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/ALT.NET/default.aspx">ALT.NET</category><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/VAN/default.aspx">VAN</category><feedburner:origLink>http://www.lostechies.com/blogs/chad_myers/archive/2009/07/13/van-is-a-friend-of-pablos.aspx</feedburner:origLink></item><item><title>The Perfect Web Framework</title><link>http://feedproxy.google.com/~r/ChadMyersBlog/~3/kyIYC4VjY3A/the-perfect-web-framework.aspx</link><pubDate>Tue, 23 Jun 2009 05:32:26 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:22366</guid><dc:creator>chadmyers</dc:creator><slash:comments>11</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/chad_myers/rsscomments.aspx?PostID=22366</wfw:commentRss><comments>http://www.lostechies.com/blogs/chad_myers/archive/2009/06/23/the-perfect-web-framework.aspx#comments</comments><description>&lt;p&gt;I’ve been paid professionally to work with or have messed around with many web frameworks. To name most of them:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Perl/CGI&lt;/li&gt;    &lt;li&gt;RoR&lt;/li&gt;    &lt;li&gt;a tiny bit of Django&lt;/li&gt;    &lt;li&gt;ASP.NET WebForms&lt;/li&gt;    &lt;li&gt;ASP.NET MVC&lt;/li&gt;    &lt;li&gt;FubuMVC&lt;/li&gt;    &lt;li&gt;MonoRail&lt;/li&gt;    &lt;li&gt;a tiny bit of &lt;a href="http://trac.caffeine-it.com/openrasta"&gt;OpenRasta&lt;/a&gt; (sorry Sebastian, I keep failing to find time to dig into this more. I really mean to, I promise!)&lt;/li&gt;    &lt;li&gt;Apache Struts&lt;/li&gt;    &lt;li&gt;Java JSP&lt;/li&gt;    &lt;li&gt;Java Servlets&lt;/li&gt;    &lt;li&gt;Java Server Faces&lt;/li&gt;    &lt;li&gt;A bunch of other of the myriad of Java web frameworks&lt;/li&gt;    &lt;li&gt;PHP&lt;/li&gt;    &lt;li&gt;ASP&lt;/li&gt;    &lt;li&gt;A bunch more that I can’t remember or aren’t worth mentioning&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Each of them offers a little, but at the huge expense of getting in your way a lot of time.&lt;/p&gt;  &lt;p&gt;The more and more I use more of them, the more I come to the conclusion that the perfect web framework looks like this:&lt;/p&gt;  &lt;div class="csharpcode-wrapper"&gt;   &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Get(IDictionary&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; request)
{
  &lt;span class="rem"&gt;//TODO: Stuff here&lt;/span&gt;
}&lt;/pre&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;a href="http://www.dotnetkicks.com/kick/?title=The+Perfect+Web+Framework&amp;url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f06%2f23%2fthe-perfect-web-framework.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f06%2f23%2fthe-perfect-web-framework.aspx" border="0" alt="Kick It on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=22366" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=kyIYC4VjY3A:xKABeiKiXd8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=kyIYC4VjY3A:xKABeiKiXd8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=kyIYC4VjY3A:xKABeiKiXd8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=kyIYC4VjY3A:xKABeiKiXd8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=kyIYC4VjY3A:xKABeiKiXd8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=kyIYC4VjY3A:xKABeiKiXd8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=kyIYC4VjY3A:xKABeiKiXd8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChadMyersBlog/~4/kyIYC4VjY3A" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/Humor/default.aspx">Humor</category><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/MVC/default.aspx">MVC</category><feedburner:origLink>http://www.lostechies.com/blogs/chad_myers/archive/2009/06/23/the-perfect-web-framework.aspx</feedburner:origLink></item><item><title>How to Write Unmaintainable Code</title><link>http://feedproxy.google.com/~r/ChadMyersBlog/~3/OqeqCvjta04/how-to-write-unmaintainable-code.aspx</link><pubDate>Fri, 19 Jun 2009 22:05:46 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:22260</guid><dc:creator>chadmyers</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/chad_myers/rsscomments.aspx?PostID=22260</wfw:commentRss><comments>http://www.lostechies.com/blogs/chad_myers/archive/2009/06/19/how-to-write-unmaintainable-code.aspx#comments</comments><description>&lt;p&gt;A friend showed this one to me a long time ago, and I still chuckle every time I remember a snippet or two from it.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://mindprod.com/jgloss/unmain.html"&gt;How to Write Unmaintainable Code&lt;/a&gt; by Roedy Green&lt;/p&gt;  &lt;p&gt;Perhaps my most favorite section is the ‘Naming’ section:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://mindprod.com/jgloss/unmainnaming.html"&gt;http://mindprod.com/jgloss/unmainnaming.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;And within that, lies the pièce de résistance of that entire body of work (in my opinion):&lt;/p&gt;  &lt;p&gt;(NOTE: Make sure you check out the 5th bullet point, it’s a real gem)&lt;/p&gt;  &lt;blockquote&gt;   &lt;h4&gt;Hungarian Notation&lt;/h4&gt; Hungarian Notation is the tactical nuclear weapon of source code obfuscation techniques; use it! Due to the sheer volume of source code contaminated by this idiom nothing can kill a maintenance engineer faster than a well planned Hungarian Notation attack. The following tips will help you corrupt the original intent of Hungarian Notation:     &lt;ul&gt;     &lt;li&gt;Insist on using &amp;quot;c&amp;quot; for const in C++ and other languages that directly enforce the const-ness of a variable. &lt;/li&gt;      &lt;li&gt;Seek out and use Hungarian warts that have meaning in languages other than your current language. For example insist on the PowerBuilder &amp;quot;l_&amp;quot; and &amp;quot;a_ &amp;quot; {local and argument} scoping prefixes and always use the VB-esque style of having a Hungarian wart for every control type when coding to C++. Try to stay ignorant of the fact that megs of plainly visible MFC source code does not use Hungarian warts for control types. &lt;/li&gt;      &lt;li&gt;Always violate the Hungarian principle that the most commonly used variables should carry the least extra information around with them. Achieve this end through the techniques outlined above and by insisting that each class type have a custom wart prefix. Never allow anyone to remind you that &lt;b&gt;no&lt;/b&gt; wart tells you that something &lt;b&gt;is&lt;/b&gt; a class. The importance of this rule cannot be overstated: if you fail to adhere to its principles the source code may become flooded with shorter variable names that have a higher vowel/consonant ratio. In the worst case scenario this can lead to a full collapse of obfuscation and the spontaneous reappearance of English Notation in code! &lt;/li&gt;      &lt;li&gt;Flagrantly violate the Hungarian-esque concept that function parameters and other high visibility symbols must be given meaningful names, but that Hungarian type warts all by themselves make excellent temporary variable names. &lt;/li&gt;      &lt;li&gt;Insist on carrying outright orthogonal information in your Hungarian warts. Consider this real world example: &amp;quot;a_crszkvc30LastNameCol&amp;quot;. It took a team of maintenance engineers nearly 3 days to figure out that this whopper variable name described a const, reference, function argument that was holding information from a database column of type Varchar[30] named &amp;quot;LastName&amp;quot; which was part of the table’s primary key. When properly combined with the principle that &amp;quot;all variables should be public&amp;quot; this technique has the power to render thousands of lines of source code obsolete instantly! &lt;/li&gt;      &lt;li&gt;Use to your advantage the principle that the human brain can only hold 7 pieces of information concurrently. For example code written to the above standard has the following properties:        &lt;ul&gt;         &lt;li&gt;a single assignment statement carries 14 pieces of type and name information. &lt;/li&gt;          &lt;li&gt;a single function call that passes three parameters and assigns a result carries 29 pieces of type and name information. &lt;/li&gt;          &lt;li&gt;Seek to improve this excellent, but far too concise, standard. Impress management and coworkers by recommending a 5 letter day of the week prefix to help isolate code written on &amp;#39;Monam&amp;#39; and &amp;#39;FriPM&amp;#39;. &lt;/li&gt;          &lt;li&gt;It is easy to overwhelm the short term memory with even a moderately complex nesting structure, &lt;b&gt;especially&lt;/b&gt; when the maintenance programmer can’t see the start and end of each block on screen simultaneously. &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;   &lt;/ul&gt;&lt;/blockquote&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;a href="http://www.dotnetkicks.com/kick/?title=How+to+Write+Unmaintainable+Code&amp;url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f06%2f19%2fhow-to-write-unmaintainable-code.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f06%2f19%2fhow-to-write-unmaintainable-code.aspx" border="0" alt="Kick It on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=22260" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=OqeqCvjta04:95zKWYbCsgo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=OqeqCvjta04:95zKWYbCsgo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=OqeqCvjta04:95zKWYbCsgo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=OqeqCvjta04:95zKWYbCsgo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=OqeqCvjta04:95zKWYbCsgo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=OqeqCvjta04:95zKWYbCsgo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=OqeqCvjta04:95zKWYbCsgo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChadMyersBlog/~4/OqeqCvjta04" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/Humor/default.aspx">Humor</category><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/Unmaintainability/default.aspx">Unmaintainability</category><feedburner:origLink>http://www.lostechies.com/blogs/chad_myers/archive/2009/06/19/how-to-write-unmaintainable-code.aspx</feedburner:origLink></item><item><title>Going Controller-less in MVC: The Way Fowler Meant It To Be</title><link>http://feedproxy.google.com/~r/ChadMyersBlog/~3/0mMDoV94UL8/going-controller-less-in-mvc-the-way-fowler-meant-it.aspx</link><pubDate>Thu, 18 Jun 2009 07:06:09 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:22168</guid><dc:creator>chadmyers</dc:creator><slash:comments>35</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/chad_myers/rsscomments.aspx?PostID=22168</wfw:commentRss><comments>http://www.lostechies.com/blogs/chad_myers/archive/2009/06/18/going-controller-less-in-mvc-the-way-fowler-meant-it.aspx#comments</comments><description>&lt;p&gt;This is sort of a stream-of-consciousness post. Several folks have been asking me what I mean by ‘Controllerless actions’ and what I’m thinking about doing in FubuMVC.&amp;#160; The conversation has already started publically on twitter, so I thought I’d try to capture a brain-dump of my thoughts in a blog post so the conversation can continue.&amp;#160; This post likely won’t be up to my normally high (read: barely legible) standards. Please forgive.&lt;/p&gt;  &lt;p&gt;Before we go further, read this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.martinfowler.com/eaaCatalog/frontController.html"&gt;http://www.martinfowler.com/eaaCatalog/frontController.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;And then view this:&lt;/p&gt;  &lt;div class="csharpcode-wrapper"&gt;   &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ProductController : Controller
{
    &lt;span class="kwrd"&gt;private&lt;/span&gt; IProductRepository _repository;

    &lt;span class="kwrd"&gt;public&lt;/span&gt; ProductController()
    {
        &lt;span class="rem"&gt;/// That is the only point you need to replace&lt;/span&gt;
        &lt;span class="rem"&gt;/// if the data source changes.&lt;/span&gt;
         _repository = &lt;span class="kwrd"&gt;new&lt;/span&gt; EntityProductRepository();
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; ProductController(IProductRepository repository)
    {
        &lt;span class="kwrd"&gt;this&lt;/span&gt;._repository = repository;
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Index()
    {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; View(_repository.GetAll());
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Create()
    {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; View();
    }

    [AcceptVerbs(HttpVerbs.Post)]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Create([Bind(Exclude = &lt;span class="str"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;)] Product productToCreate)
    {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (_repository.Create(productToCreate))
            &lt;span class="kwrd"&gt;return&lt;/span&gt; RedirectToAction(“Index”);

        &lt;span class="kwrd"&gt;return&lt;/span&gt; View();
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Edit(&lt;span class="kwrd"&gt;int&lt;/span&gt; id)
    {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; View(_repository.Get(id));
    }

    [AcceptVerbs(HttpVerbs.Post)]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Edit(Product productToEdit)
    {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (_repository.Update(productToEdit))
            &lt;span class="kwrd"&gt;return&lt;/span&gt; RedirectToAction(“Index”);

        &lt;span class="kwrd"&gt;return&lt;/span&gt; View();
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Delete(&lt;span class="kwrd"&gt;int&lt;/span&gt; id)
    {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; View(_repository.Get(id));
    }

    [AcceptVerbs(HttpVerbs.Post)]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Delete(Product productToDelete)
    {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (_repository.Delete(productToDelete.ID))
            &lt;span class="kwrd"&gt;return&lt;/span&gt; RedirectToAction(“Index”);

        &lt;span class="kwrd"&gt;return&lt;/span&gt; View();
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;I’m pretty sure this ProductController is not exactly what Martin Fowler had in mind.&amp;#160; Yet, it’s probably an actually cleaner example of what most controllers that are currently being written “in the wild” for ASP.NET MVC and MonoRail (the two most popular MVC frameworks for .NET) look like.&lt;/p&gt;

&lt;p&gt;ProductController is a somewhat monolithic controller in that it has many actions.&amp;#160; It’s structured this way for several different reasons, a few of which I’ll list here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The limitations of the framework upon which it’s built.&amp;#160; ASP.NET MVC, MonoRail, FubuMVC, and others are structured around controllers and actions (yes, even the venerable, estimable Ruby on Rails [peace be upon it] has this mindset to one extent or another). &lt;/li&gt;

  &lt;li&gt;The limitations of our imaginations: That’s how we’ve always done MVC! &lt;/li&gt;

  &lt;li&gt;The habit of doing Model2 style MVC (from which the Heavy Controller/Action paradigm comes) &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reading Fowler’s ideas on Front Controller, and looking at these Model2-esque controllers and actions, I scratched my head and said, ‘Huh. That isn’t right!’&lt;/p&gt;

&lt;h2&gt;&lt;/h2&gt;

&lt;h2&gt;Model 2&lt;/h2&gt;

&lt;p&gt;Model2-style MVC is concerned primarily with whole request handling and/or whole page rendering.&amp;#160; This was OK in the days of non-AJAX whole page post-backs (uphill, both ways, in the snow, with bare feet).&amp;#160; But in the modern day of heavily templated, composite UIs (think ASP.NET WebForms MasterPages, Spark Layouts, Partials, etc), and with heavy AJAX use for browser-initiated partial updates, the whole-page rendering concept doesn’t really hold up.&lt;/p&gt;

&lt;p&gt;We usually end up contorting and bending the framework to do things that don’t really hold up that well under the Model2 way of thinking.&lt;/p&gt;

&lt;h2&gt;Front Controller&lt;/h2&gt;

&lt;p&gt;In the Front Controller pattern, the only “Controller” present is the dumb front controller that has two methods on it: Get() and Post() and you could probably just boil those down to HandleRequest().&amp;#160; If this sounds oddly reminiscent of IHttpHandler, you’re thinking correctly.&amp;#160; An IHttpHandler is, in one manner of speaking, a Front Controller.&amp;#160; Properly implemented, the Front Controller would load a series of commands for that particular URL/request context and then execute them either via round robin or via chain-of-responsibility (in serial).&lt;/p&gt;

&lt;p&gt;In ASP.NET MVC, MonoRail, FubuMVC, and several other MVC frameworks for .NET, the Controller Action is essentially one BIG command that handles almost all aspects of the request.&amp;#160; Action Filters and FubuMVC’s Behaviors serve as a way of achieving the more compositional benefits of Commands, but they both have some limitations.&lt;/p&gt;

&lt;p&gt;If you’ve been doing any serious MVC work with any of the popular frameworks recently, you will have certainly felt the pain of controller actions getting too large, or having too many concerns.&amp;#160; You may also have noticed that your views require data that’s otherwise totally unrelated to the current request (i.e. the user’s current login status for a request to retrieve a list of all products in the persistence store).&amp;#160; So you might use Action Filters or FubuMVC Behaviors to compose all the data the view will eventually need.&amp;#160; Action Filters, being attributes on the Action and thus explicitly declared, present a strong challenge to proper compositional assembly of the data needed by the view for that request. FubuMVC behaviors certainly handle this better, but the configuration can get a little messy and verbose wiring them up explicitly or even conventionally to your actions. So they are not without their drawbacks also.&lt;/p&gt;

&lt;p&gt;This all leads inexorably to the questions: Why even have a controller at all?&amp;#160; Aren’t actions really just things-to-do in their own right? And aren’t Actions only a part of the responsibility of fulfilling the request (the rest being satisfied by Action Filters/Behaviors)?&lt;/p&gt;

&lt;p&gt;What if we promoted that idea of action filters/behaviors, and the stuff-to-do-for-this-request to equal footing – each simply being a command that gets executed for a particular request?&lt;/p&gt;

&lt;p&gt;There’s one little tiny problem in that, when in your Master Page, for example, you may need one tiny nugget of information that’s completely unrelated to the current request, but otherwise needs to be satisfied.&amp;#160; Rendering the view, then, becomes yet another command that can actually trigger more commands to be executed.&lt;/p&gt;

&lt;h2&gt;Explicitly Configured combined with View-Driven Command Resolution and Execution&lt;/h2&gt;

&lt;p&gt;After several talks with folks like Mark Nijhof, Jeremy Miller, Jimmy Bogard, and others, it soon became clear that we needed to rethink how we were approaching our MVC-based designs and to try to get more in touch with our “Inner Fowler” so to speak (but not too much).&lt;/p&gt;

&lt;p&gt;I have observed that there are, in any MVC request, explicit things that need to happen (NHibernate Session-per-Request, load the current IPrincipal for ASP.NET Authorization, load the current user’s culture and timezone information, etc).&amp;#160; There are also things that MAY need to happen based on whether the View needs some particular type of information.&amp;#160; The view generally shouldn’t be making decisions other than to simply declare that it needs a partial rendered (or a MasterPage, etc).&amp;#160; Theoretically with WebForms or Spark views, we could, at config-time, figure out just exactly what information the view and its various partials are going to require. This way you could resolve everything at config-time and avoid any nasty runtime problems with missing information and such. I’m somewhat down on this theory and I’m anticipating this won’t work out like I hope and that there will always be runtime gotchas here.&lt;/p&gt;

&lt;p&gt;At any rate, if we have to live with runtime surprises while we flush out this idea, that’s OK for right now.&amp;#160; But I really feel that the general idea (that is, demand-based command execution) is going on the right track.&lt;/p&gt;

&lt;h2&gt;Explicitly Configured Command Resolution and Execution&lt;/h2&gt;

&lt;p&gt;This one is easy: Just configure it!&amp;#160; We’ll have a fluent API or some sort of conventional way (or both) of automatically determining which commands need to be executed for a given request/URL.&amp;#160; FubuMVC currently has this with behaviors so this is achievable today, but I think we can do better and I intend to.&lt;/p&gt;

&lt;h2&gt;View-Driven Command Resolution and Execution&lt;/h2&gt;

&lt;p&gt;This one is a little tricky since the View will be requesting this at render time, on-the-fly and may result in YSOD’s if something it depends upon isn’t available.&amp;#160; &lt;/p&gt;

&lt;p&gt;I’m thinking that the View would have access to the IoC Container (or Common Service Locator as the case may be) and will request something like IFubuCommand&amp;lt;TModel&amp;gt; where TModel is the particular type of model that partial requires. So you might see something like this:&lt;/p&gt;

&lt;p&gt;&amp;lt;%= this.RenderPartialFor&amp;lt;LoginStatusModel&amp;gt;().Using&amp;lt;LoginStatusPartial&amp;gt;() %&amp;gt;&lt;/p&gt;

&lt;p&gt;The RenderPartialForExpression would then access the IoC container and retrieve an implementation of IFubuCommand&amp;lt;LoginStatusModel&amp;gt; and then pass that to the LoginStatusPartial (which may turn around and request other IFubuCommand&amp;lt;XYZ&amp;gt;’s.&lt;/p&gt;

&lt;h2&gt;Command Registration&lt;/h2&gt;

&lt;p&gt;Commands would be registered at config-time via the normal IoC container configuration.&amp;#160; Using StructureMap, for example, you would simply scan all or certain assemblies for any class implementing ICommand&amp;lt;TModel&amp;gt; and load them automatically into the container as handlers.&lt;/p&gt;

&lt;h2&gt;Diagnostics&lt;/h2&gt;

&lt;p&gt;This is also somewhat complicated since the views may request different things at runtime (they may request an IFubuCommand&amp;lt;MODEL&amp;gt; where MODEL may not be known until runtime in which case things may go awry.&lt;/p&gt;

&lt;p&gt;You could probe the Container for all IFubuCommand&amp;lt;TModels&amp;gt;’s and then simply observe Views as they execute and deliver a report after-the-fact to show what was used, by whom, and how much.&amp;#160; While this won’t necessarily be exhaustive, it would likely help a developer who’s troubleshooting a particular issue (or perhaps a transient, occasional error).&lt;/p&gt;

&lt;h2&gt;URL Resolution&lt;/h2&gt;

&lt;p&gt;This is perhaps the biggest change. Since there are no controllers or actions, the URL becomes the only distinguishing characteristic between two “actions” (or chains of commands) to be performed server-side.&amp;#160; That means the URL (or URL stub like /blah/baz/{Id}) becomes a first-class citizen – probably even its own class/type.&amp;#160; &lt;/p&gt;

&lt;p&gt;One thought I’ve been kicking around about this is that you would have a class per URL Stub which has c’tor parameters or properties representing the various options of the URL.&amp;#160; For example, consider this “URL object” or “Action object”:&lt;/p&gt;

&lt;div class="csharpcode-wrapper"&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; EditProduct
{
  &lt;span class="rem"&gt;// /products/edit&lt;/span&gt;
  &lt;span class="kwrd"&gt;public&lt;/span&gt; EditProduct()
  {
  }
  
  &lt;span class="rem"&gt;// /products/edit/9&lt;/span&gt;
  &lt;span class="kwrd"&gt;public&lt;/span&gt; EditProduct(&lt;span class="kwrd"&gt;int&lt;/span&gt; id)
  {
    Id = id;
  }
  
  &lt;span class="kwrd"&gt;public&lt;/span&gt; Id{ get; set;}
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;And to render a hyperlink to this action, for example, you might: &amp;lt;%= this.LinkTo&amp;lt;EditProduct&amp;gt;(Model.ProductId) %&amp;gt;&lt;/p&gt;

&lt;p&gt;or even:&amp;#160; &amp;lt;%= new EditProduct(Model.ProductId) %&amp;gt;&lt;/p&gt;

&lt;p&gt;Which is a lot cleaner than: &amp;lt;%= this.HyperLinkTo&amp;lt;ProductController&amp;gt;((p,i)=&amp;gt;p.EditProduct(i)) %&amp;gt;&lt;/p&gt;

&lt;h2&gt;Wrapping Up&lt;/h2&gt;

&lt;p&gt;So this is my brain dump and currently the rough plan I’m using to spike out some of these things in FubuMVC.&amp;#160; Some of it is working out, other things I’m still skeptical.&lt;/p&gt;

&lt;p&gt;I’d love to hear what you’re thinking with your MVC-based designs.&amp;#160; How are YOU handling the composition problems?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;a href="http://www.dotnetkicks.com/kick/?title=Going+Controller-less+in+MVC%3a+The+Way+Fowler+Meant+It+To+Be&amp;url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f06%2f18%2fgoing-controller-less-in-mvc-the-way-fowler-meant-it.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f06%2f18%2fgoing-controller-less-in-mvc-the-way-fowler-meant-it.aspx" border="0" alt="Kick It on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=22168" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=0mMDoV94UL8:cCGKk5nQNJ0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=0mMDoV94UL8:cCGKk5nQNJ0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=0mMDoV94UL8:cCGKk5nQNJ0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=0mMDoV94UL8:cCGKk5nQNJ0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=0mMDoV94UL8:cCGKk5nQNJ0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=0mMDoV94UL8:cCGKk5nQNJ0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=0mMDoV94UL8:cCGKk5nQNJ0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChadMyersBlog/~4/0mMDoV94UL8" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/MVC/default.aspx">MVC</category><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/FubuMVC/default.aspx">FubuMVC</category><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/Controllerless/default.aspx">Controllerless</category><feedburner:origLink>http://www.lostechies.com/blogs/chad_myers/archive/2009/06/18/going-controller-less-in-mvc-the-way-fowler-meant-it.aspx</feedburner:origLink></item><item><title>On the performance of “Opinionated Builders”</title><link>http://feedproxy.google.com/~r/ChadMyersBlog/~3/ATMwPhAegjQ/on-the-performance-of-opinionated-builders.aspx</link><pubDate>Sun, 14 Jun 2009 05:35:36 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:22070</guid><dc:creator>chadmyers</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/chad_myers/rsscomments.aspx?PostID=22070</wfw:commentRss><comments>http://www.lostechies.com/blogs/chad_myers/archive/2009/06/14/on-the-performance-of-opinionated-builders.aspx#comments</comments><description>&lt;p&gt;I was reading &lt;a href="http://hex.lostechies.com"&gt;Eric Hexter’s&lt;/a&gt; post titled “&lt;a href="http://www.lostechies.com/blogs/hex/archive/2009/06/13/opinionated-input-builders-part-6-performance-of-the-builders.aspx"&gt;Opinionated Input Builders Part 6: Performance of the Builders&lt;/a&gt;” and I was going to leave a lengthy comment, but decided it would be better as its own blog post:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;I’m going to assume that the data is all correct (or representative of reality). As another reader pointed out, this [poor performance] could simply be because debug=true is set in the web.config or some other non-obvious, but simple explanation. For this exercise, let’s assume that this performance is the correct reality.&lt;/p&gt;    &lt;p&gt;Since [Eric’s] approach is very opinionated and conventional, I would expect it to result in very consistent and expected results (code written in the same way, files in the same place, etc).&lt;/p&gt;    &lt;p&gt;This consistency is key because you could write some sort of pre-compiler that could inline the partials or something before pushing to production.If there isn&amp;#39;t already a tool to do this, I would imagine it wouldn&amp;#39;t be that hard to write.&lt;/p&gt;    &lt;p&gt;&amp;quot;But now I have to write a tool to do what &lt;a href="http://ASP.NET"&gt;ASP.NET&lt;/a&gt; could do for me already!&amp;#160; This input builder stuff just ain&amp;#39;t worth it!&amp;quot; a skeptic might say.&lt;/p&gt;    &lt;p&gt;But consider this:&amp;#160; Doing it WITHOUT input builders may slow you down 20% vs. doing it WITH them (I’m just making numbers up here, but you get the point).&amp;#160; Over an 8 week project with 4 people (1280 man-hours), that&amp;#39;s a savings of 256 man-hours.&amp;#160; I&amp;#39;m pretty sure that you could easily write some sort of in-liner or pre-compiler in 256 man-hours (6.4 man-weeks) and you&amp;#39;d end up with either a net-zero or a net-gain on the project.&lt;/p&gt;    &lt;p&gt;I&amp;#39;m of the firm belief that you do what&amp;#39;s expedient for the project (YAGNI unless you&amp;#39;re absolutely certain you WILL NEED it), and deal with performance issues later in a systematic way.&amp;#160; Performance problems are always easier to deal with later and with more data from which to make a better decision and especially so if you&amp;#39;re consistent and conventional in your development (which Opinionated Input Builders certainly are).&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So for those who might immediately turn their noses up at Eric’s posts due to suspected performance issues, I suggest you at least give it a second look or give it a little time as an optimizer might show up later, negating most if not all performance issues.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;a href="http://www.dotnetkicks.com/kick/?title=On+the+performance+of+%e2%80%9cOpinionated+Builders%e2%80%9d&amp;url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f06%2f14%2fon-the-performance-of-opinionated-builders.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f06%2f14%2fon-the-performance-of-opinionated-builders.aspx" border="0" alt="Kick It on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=22070" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=ATMwPhAegjQ:qRg9Z2FixfE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=ATMwPhAegjQ:qRg9Z2FixfE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=ATMwPhAegjQ:qRg9Z2FixfE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=ATMwPhAegjQ:qRg9Z2FixfE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=ATMwPhAegjQ:qRg9Z2FixfE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=ATMwPhAegjQ:qRg9Z2FixfE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=ATMwPhAegjQ:qRg9Z2FixfE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChadMyersBlog/~4/ATMwPhAegjQ" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/Premature+optimization/default.aspx">Premature optimization</category><feedburner:origLink>http://www.lostechies.com/blogs/chad_myers/archive/2009/06/14/on-the-performance-of-opinionated-builders.aspx</feedburner:origLink></item><item><title>Some quick updates</title><link>http://feedproxy.google.com/~r/ChadMyersBlog/~3/f-dTArBPQ-I/some-quick-updates.aspx</link><pubDate>Wed, 10 Jun 2009 03:41:26 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:21690</guid><dc:creator>chadmyers</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/chad_myers/rsscomments.aspx?PostID=21690</wfw:commentRss><comments>http://www.lostechies.com/blogs/chad_myers/archive/2009/06/09/some-quick-updates.aspx#comments</comments><description>&lt;p&gt;I know I’ve been remiss in my blog posting duties. Please trust me when I say it’s for good reason and that you’d understand.&lt;/p&gt;  &lt;p&gt;I appreciate you sticking with me. In the meantime, here are a few tidbits that you might find worth noting:&lt;/p&gt;  &lt;h2&gt;Announcing: Zen&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://kohari.org"&gt;Nate Kohari&lt;/a&gt; (whom I’d like to call a friend, though I’m not sure he feels the same way, lol) has just announced the coming-out party of a skunk-works project he and &lt;a href="http://nikibeth.com/"&gt;his wife Nicole&lt;/a&gt;&amp;#160; have been cooking up for quite some time now. It’s a lightweight (but powerful) lean project management system using Kanban. Nate can describe it better, so I’ll let you hear it straight from him:&lt;/p&gt;  &lt;p&gt;Zen Home Page:&amp;#160; &lt;a href="http://agilezen.com"&gt;http://agilezen.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nate’s Blog post: &lt;a href="http://kohari.org/2009/06/09/zen-and-the-art-of-project-management/"&gt;http://kohari.org/2009/06/09/zen-and-the-art-of-project-management/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Side note: I’m taking votes for who has more attractive eyewear Nate or Nicole.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Steven Bohlen speaking for VAN on DDD&lt;/h2&gt;  &lt;p&gt;Zachariah Young wanted me to let ya’ll know that Steven Bohlen (of “&lt;a href="http://www.summerofnhibernate.com/"&gt;Summer of NHibernate&lt;/a&gt;” and “Streaking through campus naked” fame) will be presenting about Domain-driven Design at the next VAN (June 10).&lt;/p&gt;  &lt;p&gt;The details for attending are here (I suggest you check it out!):&lt;/p&gt;  &lt;p&gt;&lt;a title="http://zachariahyoung.com/zy/post/2009/06/08/Introduction-to-DDD-with-Steve-Bohlen-on-June-10.aspx" href="http://zachariahyoung.com/zy/post/2009/06/08/Introduction-to-DDD-with-Steve-Bohlen-on-June-10.aspx"&gt;http://zachariahyoung.com/zy/post/2009/06/08/Introduction-to-DDD-with-Steve-Bohlen-on-June-10.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Site note: His “streaking on campus” days are over, to be clear, there will be no streaking at the VAN)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;.NET Slackers Article on StructureMap 101&lt;/h2&gt;  &lt;p&gt;After many broken promises and terrible delays, I finally delivered my first article to the ever patient, polite, and positive Sonu Kapor (one of the organizers of &lt;a href="http://www.dotnetslackers.com"&gt;www.dotnetslackers.com&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;You can check it out here:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnetslackers.com/articles/designpatterns/IntroductionToStructureMap.aspx"&gt;http://dotnetslackers.com/articles/designpatterns/IntroductionToStructureMap.aspx&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;a href="http://www.dotnetkicks.com/kick/?title=Some+quick+updates&amp;url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f06%2f09%2fsome-quick-updates.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f06%2f09%2fsome-quick-updates.aspx" border="0" alt="Kick It on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=21690" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=f-dTArBPQ-I:simuFdubVEc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=f-dTArBPQ-I:simuFdubVEc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=f-dTArBPQ-I:simuFdubVEc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=f-dTArBPQ-I:simuFdubVEc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=f-dTArBPQ-I:simuFdubVEc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=f-dTArBPQ-I:simuFdubVEc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=f-dTArBPQ-I:simuFdubVEc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChadMyersBlog/~4/f-dTArBPQ-I" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/Misc/default.aspx">Misc</category><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/Agile/default.aspx">Agile</category><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/NHibernate/default.aspx">NHibernate</category><feedburner:origLink>http://www.lostechies.com/blogs/chad_myers/archive/2009/06/09/some-quick-updates.aspx</feedburner:origLink></item><item><title>Lifecycle of an open source project</title><link>http://feedproxy.google.com/~r/ChadMyersBlog/~3/-Ioeva9PBrA/lifecycle-of-an-open-source-project.aspx</link><pubDate>Thu, 28 May 2009 16:58:05 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:21293</guid><dc:creator>chadmyers</dc:creator><slash:comments>7</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/chad_myers/rsscomments.aspx?PostID=21293</wfw:commentRss><comments>http://www.lostechies.com/blogs/chad_myers/archive/2009/05/28/lifecycle-of-an-open-source-project.aspx#comments</comments><description>&lt;p&gt;I’ve had several people ask me about the state of various open source projects that I’m involved with or advocate.&amp;#160; They ask questions such as “Is it alpha or beta?”, “Should we start using it?”, and “Where can I get started learning more?”.&lt;/p&gt;  &lt;p&gt;I find these questions difficult to answer since they’re very relative and subjective depending on your environment, tolerance for change, tolerance for bugs, issues with “bleeding edge” technology, etc.&amp;#160; &lt;/p&gt;  &lt;p&gt;In an effort to try to come up with a more objective framework for answering these types of questions, I decided to take a stab at putting into words my experience with various frameworks and how they have progressed in their lifecycle.&lt;/p&gt;  &lt;h2&gt;Phase 1: Concept&lt;/h2&gt;  &lt;p&gt;Some ideas have been kicked around by a few people. Some spike code has been written. A project site is up (Google Code, CodePlex, etc) and there is maybe a working prototype to show off and talk about.&amp;#160; Definitely no documentation, wiki, or anything like that. There may be a blog post or two about the concepts.&lt;/p&gt;  &lt;h2&gt;Phase 2: Bootstrap&lt;/h2&gt;  &lt;p&gt;There are one or two serious authors/committers.&amp;#160; There might already be one or two actual users experimenting with the framework.&amp;#160; The build is continually in a “works on my machine!&amp;quot; state.&amp;#160; Some more blog posts have been done and maybe a wiki with a few articles, but otherwise no docs to speak of.&lt;/p&gt;  &lt;h2&gt;Phase 3: Early Development &lt;/h2&gt;  &lt;p&gt;A few more committers have signed on, but still there is only one or two primary contributors. A few more users have started playing with it now and are providing feedback.&amp;#160; A mailing list has certainly been set up by now, if not earlier. The build is more stable and works in many environments.&amp;#160; More blog posts and wiki articles have emerged, but still no serious documentation effort yet.&lt;/p&gt;  &lt;h2&gt;Phase 4: Early Adoption &lt;/h2&gt;  &lt;p&gt;More committers are signing on now and contributing more and more.&amp;#160; The project is at a state with many of the baseline features are done and the product is quite usable now.&amp;#160; There are a few dozen users experimenting with it and even building some interesting applications upon it.&amp;#160; Multiple people are blogging about it. The wiki is starting to materialize into categories and sub-topics.&amp;#160; Some sparse documentation has started to emerge in the form of some limited API docs and some FAQ’s and getting started guides.&lt;/p&gt;  &lt;h2&gt;Phase 5: Development &lt;/h2&gt;  &lt;p&gt;There are several devoted committers now, cranking out serious features and functionality.&amp;#160; There are dozens of users – approaching 100 or more.&amp;#160; There is an automated (nightly?) build. Binaries are available for download regularly.&amp;#160; Many people are blogging about it and buzz is growing.&amp;#160; The wiki is really taking shape and being fleshed out.&amp;#160; At this point documentation is “moderate” and is growing into more scenarios and topics. &lt;/p&gt;  &lt;h2&gt;Phase 6: Adoption&lt;/h2&gt;  &lt;p&gt;Many people are submitting patches and other forms of contributions. The inner circle of committers is growing.&amp;#160; There are more than 100 users, perhaps several hundred.&amp;#160; There are frequent “point” releases available for download. There’s now likely a basic installer which helps configure your environment for the framework.&amp;#160; Frequent, in-depth blog posts by noted authors.&amp;#160; The Wiki is now very rich and there are frequent contributions.&amp;#160; Documentation at this point is “adequate”.&amp;#160; You would likely start seeing “contrib” projects sprouting up here and there and coalescing .&lt;/p&gt;  &lt;h2&gt;Phase 7: Maturity&lt;/h2&gt;  &lt;p&gt;There are so many patches and contributors that a hierarchy has been set up to evaluate and approve changes.&amp;#160; Multiple releases creates management issues with patches and defects requiring more organization. There over a thousan users by now and like thousands.&amp;#160; There are releases and installers for various scenarios (maybe x86/x64, or a Mono compatible release, etc).&amp;#160; There is lots of documentation activity and many contrib projects have emerged.&lt;/p&gt;  &lt;h2&gt;Phase 8: Mainstream &lt;/h2&gt;  &lt;p&gt;By now, many of the original contributors have moved on or are less involved. A new generation of contributors have taken over and are taking the project into different directions and expanding it greatly.&amp;#160; There are hundreds of thousands of users. Perhaps there are even consulting companies forming business services around the project and offering commercial support.&amp;#160; There are now multiple “dot-oh” releases. There is no doubt this project is here to stay and provides real value to people.&amp;#160; The project has its own active web site with lots of content, guides, add-ons, forums, blogs, etc.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;a href="http://www.dotnetkicks.com/kick/?title=Lifecycle+of+an+open+source+project&amp;url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f05%2f28%2flifecycle-of-an-open-source-project.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f05%2f28%2flifecycle-of-an-open-source-project.aspx" border="0" alt="Kick It on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=21293" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=-Ioeva9PBrA:pZaraBWLHAU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=-Ioeva9PBrA:pZaraBWLHAU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=-Ioeva9PBrA:pZaraBWLHAU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=-Ioeva9PBrA:pZaraBWLHAU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=-Ioeva9PBrA:pZaraBWLHAU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=-Ioeva9PBrA:pZaraBWLHAU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=-Ioeva9PBrA:pZaraBWLHAU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChadMyersBlog/~4/-Ioeva9PBrA" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/Open+source/default.aspx">Open source</category><feedburner:origLink>http://www.lostechies.com/blogs/chad_myers/archive/2009/05/28/lifecycle-of-an-open-source-project.aspx</feedburner:origLink></item><item><title>Austin CodeCamp ‘09: Quite Possibly Better than Bacon</title><link>http://feedproxy.google.com/~r/ChadMyersBlog/~3/Kqes1iabV6Y/austin-codecamp-09-quite-possibly-better-than-bacon.aspx</link><pubDate>Sun, 17 May 2009 21:13:11 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:21046</guid><dc:creator>chadmyers</dc:creator><slash:comments>7</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/chad_myers/rsscomments.aspx?PostID=21046</wfw:commentRss><comments>http://www.lostechies.com/blogs/chad_myers/archive/2009/05/17/austin-codecamp-09-quite-possibly-better-than-bacon.aspx#comments</comments><description>&lt;h2&gt;You should go to Austin CodeCamp ‘09.&lt;/h2&gt;  &lt;p&gt;That’s a pretty sensationalistic title, I’ll give you that. I’m very serious though, &lt;a href="http://www.adnug.org/AustinCodeCamp09/"&gt;Austin CodeCamp ‘09&lt;/a&gt; may actually prove to be better than bacon and even -- yes, I’m going all the way here – cookie dough ice cream!&amp;#160; LosTechies’ very own &lt;a href="http://hex.lostechies.com/"&gt;Eric Hexter&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt; and &lt;a href="http://johnteague.lostechies.com/"&gt;John Teague&lt;/a&gt; have put in some late nights getting this shindig together (and possibly other people – leave a comment please if you were involved, don’t be shy!) and they’ve done a bang-up job.&lt;/p&gt;  &lt;h2&gt;LosTechies will be there in force&lt;/h2&gt;  &lt;p&gt;The Fraternity of the Donkey (or, in the future, the Universal Order of the Donkey should we ever manage to convince a blogger of the female variety to post here) had the idea that many of us would pitch in and do a bunch of CodeCamp sessions.&lt;/p&gt;  &lt;p&gt;Many of us love the Central Texas region (specifically Austin and San Antonio) and we love &lt;a href="http://www.adnug.org/"&gt;ADNUG&lt;/a&gt; and &lt;a href="http://www.adnug.org/AustinCodeCamp09/"&gt;Austin CodeCamp&lt;/a&gt;. We wish to see these things continue in the future, so we’re going to present as much as we can.&amp;#160; &lt;/p&gt;  &lt;p&gt;You can see here that there is quite &lt;a href="http://www.adnug.org/AustinCodeCamp09/Proposal/List"&gt;an illustrious list of available sessions&lt;/a&gt;.&amp;#160; Eric Hexter has posted &lt;a href="http://www.lostechies.com/blogs/hex/archive/2009/05/16/austin-code-camp-sessions-voting-results.aspx"&gt;the results of the voting&lt;/a&gt; and it looks like we’re going to have really good turnout.&lt;/p&gt;  &lt;p&gt;Check out what the Los Techies crew has in store for you at the end of May:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Sneak peek at C# 4.0 – &lt;a href="http://jimmybogard.lostechies.com/"&gt;Jimmy Bogard&lt;/a&gt; (1 hour)&lt;/li&gt;    &lt;li&gt;Git for people – &lt;a href="http://agilejoe.lostechies.com/"&gt;Joe Ocampo&lt;/a&gt; (1 hour)&lt;/li&gt;    &lt;li&gt;Project Automation – Learn about Build and Deployment Automation – &lt;a href="http://hex.lostechies.com/"&gt;Eric Hexter&lt;/a&gt; (2 hours)&lt;/li&gt;    &lt;li&gt;S.O.L.I.D. Software Development: Achieving Object Oriented Principles, One Step At A Time – &lt;a href="http://derickbailey.lostechies.com"&gt;Derick Bailey&lt;/a&gt; (2 hours)&lt;/li&gt;    &lt;li&gt;Designing Views in ASP.NET MVC – &lt;a href="http://jimmybogard.lostechies.com/"&gt;Jimmy Bogard&lt;/a&gt; (1 hour)&lt;/li&gt;    &lt;li&gt;Put your MVC Views in Hyperdrive with T4 Templates – &lt;a href="http://hex.lostechies.com/"&gt;Eric Hexter&lt;/a&gt; (1 hour)&lt;/li&gt;    &lt;li&gt;Search Enabling Applications with Lucene.NET&amp;#160; - &lt;a href="http://rhouston.lostechies.com"&gt;Ray Houston&lt;/a&gt; (2 hours)&lt;/li&gt;    &lt;li&gt;Test Driven JavaScript – &lt;a href="http://johnteague.lostechies.com/"&gt;John Teague&lt;/a&gt; (2 hours)&lt;/li&gt;    &lt;li&gt;Introduction to FubuMVC – &lt;a href="http://chadmyers.lostechies.com/"&gt;Chad Myers&lt;/a&gt; (2 hours)&lt;/li&gt;    &lt;li&gt;Introduction to Scrumban – &lt;a href="http://agilejoe.lostechies.com/"&gt;Joe Ocampo&lt;/a&gt; (2 hours)&lt;/li&gt;    &lt;li&gt;Enterprise Architecture Patterns: Presentation, Business Logic, and Persistence – &lt;a href="http://johnteague.lostechies.com/"&gt;John Teague&lt;/a&gt; and &lt;a href="http://chadmyers.lostechies.com/"&gt;Chad Myers&lt;/a&gt; (2 hours)&lt;/li&gt;    &lt;li&gt;Decoupling Workflow From Forms With An Application Controller And IoC Container – &lt;a href="http://derickbailey.lostechies.com"&gt;Derick Bailey&lt;/a&gt; (2 hours)&lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Twenty Hours!&lt;/h2&gt;  &lt;p&gt;I dunno about you, but all of these presentations look like awesome presentations in their own right, but coupled together, they present a mighty, unstoppable force of knowledge enhancement!&amp;#160; No? Too much?&amp;#160; Ok, how ‘bout this:&amp;#160; Unless my math is wrong, that’s &lt;strong&gt;&lt;em&gt;TWENTY (20, ONE SCORE)&lt;/em&gt;&lt;/strong&gt; information-packed hours presented by experienced, leaders in the industry.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;a href="http://www.dotnetkicks.com/kick/?title=Austin+CodeCamp+%e2%80%9809%3a+Quite+Possibly+Better+than+Bacon&amp;url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f05%2f17%2faustin-codecamp-09-quite-possibly-better-than-bacon.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f05%2f17%2faustin-codecamp-09-quite-possibly-better-than-bacon.aspx" border="0" alt="Kick It on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=21046" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=Kqes1iabV6Y:INGsdIGrFak:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=Kqes1iabV6Y:INGsdIGrFak:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=Kqes1iabV6Y:INGsdIGrFak:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=Kqes1iabV6Y:INGsdIGrFak:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=Kqes1iabV6Y:INGsdIGrFak:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=Kqes1iabV6Y:INGsdIGrFak:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=Kqes1iabV6Y:INGsdIGrFak:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChadMyersBlog/~4/Kqes1iabV6Y" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/CodeCamp/default.aspx">CodeCamp</category><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/LosTechies/default.aspx">LosTechies</category><feedburner:origLink>http://www.lostechies.com/blogs/chad_myers/archive/2009/05/17/austin-codecamp-09-quite-possibly-better-than-bacon.aspx</feedburner:origLink></item><item><title>I need some peer review on this</title><link>http://feedproxy.google.com/~r/ChadMyersBlog/~3/feM_h1G87tc/i-need-some-peer-review-on-this.aspx</link><pubDate>Tue, 05 May 2009 04:21:00 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:20799</guid><dc:creator>chadmyers</dc:creator><slash:comments>15</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/chad_myers/rsscomments.aspx?PostID=20799</wfw:commentRss><comments>http://www.lostechies.com/blogs/chad_myers/archive/2009/05/05/i-need-some-peer-review-on-this.aspx#comments</comments><description>&lt;p&gt;So I have a problem where I have an open type:&lt;/p&gt;
&lt;div class="csharpcode-wrapper"&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ThunderdomeActionInvoker&amp;lt;TController, TInput, TOutput&amp;gt; 
    : IControllerActionInvoker
    &lt;span class="kwrd"&gt;where&lt;/span&gt; TController : &lt;span class="kwrd"&gt;class&lt;/span&gt;
    &lt;span class="kwrd"&gt;where&lt;/span&gt; TInput : &lt;span class="kwrd"&gt;class&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt;()
    &lt;span class="kwrd"&gt;where&lt;/span&gt; TOutput : &lt;span class="kwrd"&gt;class&lt;/span&gt;
{
    &lt;span class="rem"&gt;/*...*/&lt;/span&gt;
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;And I need to make a generic one of these bad-boys and then &amp;ldquo;new&amp;rdquo; it up.&amp;nbsp; The only problem is, I don&amp;rsquo;t know whether my candidate/proposed type for TInput meets the &amp;ldquo;class&amp;rdquo; and/or &amp;ldquo;new()&amp;rdquo; constraints.&amp;nbsp; There doesn&amp;rsquo;t appear to be a Type.TryMakeGenericType() method and calling MakeGenericType() blindly will toss you up a nice fat ArgumentException to catch.&lt;/p&gt;
&lt;p&gt;I did some cursory searching, but my Google-fu has failed me this day.&amp;nbsp; Is there nothing to do this?&amp;nbsp; If not, then I scrapped something together and I wanted to see what you all thought of this just in case I&amp;rsquo;m really the first person to have needed this.&amp;nbsp; I haven&amp;rsquo;t fully unit tested this (this was a spike, so I didn&amp;rsquo;t test-drive this&amp;hellip; I know&amp;hellip; SHAME), so don&amp;rsquo;t just COPY AND PASTE this or bad things will happen including 7 years bad luck and maybe some rain coming in through your windows.&lt;/p&gt;
&lt;div class="csharpcode-wrapper"&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; MeetsSpecialGenericConstraints(Type genericArgType, Type proposedSpecificType)
{
    var gpa = genericArgType.GenericParameterAttributes;
    var constraints = gpa &amp;amp; GenericParameterAttributes.SpecialConstraintMask;

    &lt;span class="rem"&gt;// No constraints, away we go!&lt;/span&gt;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (constraints == GenericParameterAttributes.None)
        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;

    &lt;span class="rem"&gt;// &amp;quot;class&amp;quot; constraint and this is a value type&lt;/span&gt;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; ((constraints &amp;amp; GenericParameterAttributes.ReferenceTypeConstraint) != 0
        &amp;amp;&amp;amp; proposedSpecificType.IsValueType )
    {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;
    }
           
    &lt;span class="rem"&gt;// &amp;quot;struct&amp;quot; constraint and this is a value type&lt;/span&gt;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; ((constraints &amp;amp; GenericParameterAttributes.NotNullableValueTypeConstraint) != 0
        &amp;amp;&amp;amp; ! proposedSpecificType.IsValueType)
    {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;
    }

    &lt;span class="rem"&gt;// &amp;quot;new()&amp;quot; constraint and this type has no default constructor&lt;/span&gt;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; ((constraints &amp;amp; GenericParameterAttributes.DefaultConstructorConstraint) != 0
        &amp;amp;&amp;amp; proposedSpecificType.GetConstructor(Type.EmptyTypes) == &lt;span class="kwrd"&gt;null&lt;/span&gt; )
    {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;
    }

    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Thoughts?&amp;nbsp; Obvious bugs?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;a href="http://www.dotnetkicks.com/kick/?title=I+need+some+peer+review+on+this&amp;url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f05%2f05%2fi-need-some-peer-review-on-this.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.lostechies.com%2fblogs%2fchad_myers%2farchive%2f2009%2f05%2f05%2fi-need-some-peer-review-on-this.aspx" border="0" alt="Kick It on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=20799" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=feM_h1G87tc:0uw5DoZ434I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=feM_h1G87tc:0uw5DoZ434I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=feM_h1G87tc:0uw5DoZ434I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=feM_h1G87tc:0uw5DoZ434I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=feM_h1G87tc:0uw5DoZ434I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ChadMyersBlog?a=feM_h1G87tc:0uw5DoZ434I:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ChadMyersBlog?i=feM_h1G87tc:0uw5DoZ434I:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChadMyersBlog/~4/feM_h1G87tc" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.lostechies.com/blogs/chad_myers/archive/tags/GenericFun/default.aspx">GenericFun</category><feedburner:origLink>http://www.lostechies.com/blogs/chad_myers/archive/2009/05/05/i-need-some-peer-review-on-this.aspx</feedburner:origLink></item></channel></rss>
