<?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:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Rob Conery</title><link>http://blog.wekeroad.com</link><description>Stuffy Thing Box</description><lastBuildDate>Sat, 04 Jul 2009 00:40:31 +0000</lastBuildDate><generator>http://wordpress.org/?v=2.8</generator><language>en</language><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/wekeroad/EeKc" type="application/rss+xml" /><feedburner:emailServiceId>wekeroad/EeKc</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>SubSonic 3.0 is Released</title><link>http://feedproxy.google.com/~r/wekeroad/EeKc/~3/-WETg2iyKV4/</link><comments>http://blog.wekeroad.com/subsonic/subsonic-3-0-is-released/#comments</comments><pubDate>Sat, 04 Jul 2009 00:39:49 +0000</pubDate><dc:creator>Rob Conery</dc:creator><category><![CDATA[SubSonic]]></category><guid isPermaLink="false">http://blog.wekeroad.com/blog/subsonic-3-0-is-released/</guid><description><![CDATA[At some point you need to stop polishing and let it go already – so I did just that today: SubSonic 3.0 is released. This thing took me just about a year to finish up, and a lot of work has gone into it. 
So, what’s new? Well…

A nice Linq engine which parses IQueryable “stuff” [...]]]></description><content:encoded><![CDATA[<p>At some point you need to stop polishing and let it go already – so I did just that today: <a href="http://subsonicproject.com/">SubSonic 3.0 is released</a>. This thing took me just about a year to finish up, and a lot of work has gone into it. </p>
<p><strong>So, what’s new? Well…</strong></p>
<ul>
<li>A nice <a href="http://subsonicproject.com/docs/IQueryable">Linq engine</a> which parses IQueryable “stuff” into SQL (thanks to <a href="http://blogs.msdn.com/mattwar/">Matt Warren’s</a> excellent work with the <a href="http://codeplex.com/iqtoolkit">IQToolkit</a>, which we stole mercilessly). </li>
<li>A <a href="http://subsonicproject.com/docs/T4_Templates">templating system</a> which allows you to use <a href="http://subsonicproject.com/docs/Using_ActiveRecord">ActiveRecord</a>, <a href="http://subsonicproject.com/docs/Using_AdvancedTemplates">good old Linq in Linq to SQL style</a>, or <a href="http://subsonicproject.com/docs/Creating_Your_Own_DAL">whatever floats your boat</a>. </li>
<li>A <a href="http://subsonicproject.com/docs/Using_SimpleRepository">SimpleRepository</a> which is just about zero-drag and even builds your database for you </li>
<li>A brand-new <a href="http://subsonicproject.com">project site</a> that will hopefully answer the question “is SubSonic dead”? Or probably not </li>
<li>A <a href="http://subsonicproject.com/docs">new docs site</a> that has permanently crushed my ability to type. It’s a wiki so if you feel like being helpful and like SubSonic and want to help… nudge… nudge </li>
</ul>
<p><strong>Should You Care</strong>?     <br />That’s <a href="http://subsonicproject.com/docs/Comparisons">a tough question</a> – so it’s the first I’ll address. </p>
<ul>
<li>If you like Linq and you’re not working with SQL Server and EF is a bit much for you – yes. </li>
<li>If you like Linq and you are working with SQL Server… well nobody ever got fired for using Microsoft <img src='http://blog.wekeroad.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  so “maybe”. Linq to SQL is awesome and it’s not dead <img src='http://blog.wekeroad.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . </li>
<li>If you like a “low-friction” approach from a helper framework – then yes. You can’t get much lower-friction then SimpleRepository. </li>
<li>If you like SubSonic to begin with, then yes. There’s still the same grooviness here. </li>
</ul>
<p><strong>Should You Be Afraid</strong>?     <br />Hopefully not &#8211; I&#8217;ve really tried to test the tar out of this thing before letting it go (that&#8217;s why this took me so long). I&#8217;ve had a lot of help with this (many thanks to Eric, Paul, George Capnias, and Jim Zimmerman) and a lot folks reporting bugs (and a TON) of patches so hopefully it&#8217;s solid. That said &#8211; this is a major release and it&#8217;s also Open Source. You will need to be a bit flexible and hopefully you won&#8217;t mind helping us out. Which brings me to my final point&#8230; </p>
<p><strong>Our Repo Has Moved. Yes, Again      <br /></strong>All was going very well until 3 things happened: </p>
<ol>
<li>I needed to put the 3.0 repo together with the 2.0 repo. It’s not a branch – it’s its own repo for sure. 2.2 is not a “tag” so… what to do? The only thing to do is to have the trunk split into versions which is ALL kinds of messy. I needed another repo for my project, and Google doesn’t let you do that. </li>
<li>I needed a really cool, collaborative system for our template sharing, which also should have its own repo. </li>
<li>Google SVN began to crumble and crash on me, causing me to drop/reload every week or so. </li>
</ol>
<p>I’ve been using GitHub for a while and I absolutely LOVE it (more on that later) so with this release, <a href="http://github.com/subsonic"><strong>we’ve moved to GitHub</strong></a><strong>. </strong>I’ve kept the Google site open so we can work on existing issues, etc but I’ll be closing it in the coming month or so.</p>
<p><strong>The Goods</strong></p>
<ul>
<li>The <a href="http://subsonicproject.com">new project site is here</a> </li>
<li>The <a href="http://subsonicproject.com/docs/">new docs site is here</a> </li>
<li>The <a href="http://github.com/subsonic">new Source site is here.</a> </li>
</ul>
<p>I’m going to go have a beer or five and then go blow stuff up for the 4th like a good Amrrrcan.</p>
<p><a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/RCONERY/8A1271C118D1780CABE44A330676FDF78FB34845"><img src="http://theloungenet.com/feeds/img/DOTNETRSS/RCONERY/8A1271C118D1780CABE44A330676FDF78FB34845"></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=-WETg2iyKV4:RX44F8BkRNs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=-WETg2iyKV4:RX44F8BkRNs:Q8R26LmAkSY"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?i=-WETg2iyKV4:RX44F8BkRNs:Q8R26LmAkSY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=-WETg2iyKV4:RX44F8BkRNs:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=cGdyc7Q-1BI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/wekeroad/EeKc/~4/-WETg2iyKV4" height="1" width="1"/>]]></content:encoded><wfw:commentRss>http://blog.wekeroad.com/subsonic/subsonic-3-0-is-released/feed/</wfw:commentRss><slash:comments>12</slash:comments><feedburner:origLink>http://blog.wekeroad.com/subsonic/subsonic-3-0-is-released/</feedburner:origLink></item><item><title>You’re Not Your Data Access</title><link>http://feedproxy.google.com/~r/wekeroad/EeKc/~3/gH9WptfLMdg/</link><comments>http://blog.wekeroad.com/blog/youre-not-your-data-access/#comments</comments><pubDate>Fri, 12 Jun 2009 03:43:19 +0000</pubDate><dc:creator>Rob Conery</dc:creator><category><![CDATA[Blog]]></category><category><![CDATA[Blather]]></category><guid isPermaLink="false">http://blog.wekeroad.com/blog/youre-not-your-data-access/</guid><description><![CDATA[Seems I touched off a bit of a “swirl” with a comment I made on my last blog post:
I think, in general, the .NET crowd overthinks and over-engineers just about everything
I said as much in my MIX presentation, where I basically challenged ASP.NET developers to “embrace their inner scripter” and stop building rockets. I have [...]]]></description><content:encoded><![CDATA[<p>Seems I touched off a bit of a “swirl” with a comment I made on my last blog post:</p>
<blockquote><p>I think, in general, the .NET crowd overthinks and over-engineers just about everything</p></blockquote>
<p>I said as much in my MIX presentation, where I basically challenged ASP.NET developers to <a href="http://videos.visitmix.com/MIX09/T62F">“embrace their inner scripter” and stop building rockets</a>. I have a fairly strong opinion on this – and I’ll save that for another time – but I think it’s high time to remind folks that there’s a lot more to an application then how you get your app gets it’s freak on with your database.</p>
<p><strong>Good Morning!<br />
</strong>I remember watching Fight Club for the very first time back in the thick of the very first DotCom bubble. I was feeling pretty ill that day so I stayed home and watched the DVD, and was pulled in pretty dramatically. One line still resonates with me:</p>
<blockquote><p>You&#8217;re not your job. You&#8217;re not how much money you have in the bank. You&#8217;re not the car you drive. You&#8217;re not the contents of your wallet. You&#8217;re not your f******* khakis.</p></blockquote>
<p>I feel the same way about building software: <strong>You’re Not Your Data Access.</strong></p>
<p>When I watched that movie I had just bought a nice pair of $180 Kenneth Cole shoes to wear to a client’s VC meeting, to go with my groovy business-casual Cornflower Blue button down shirt. I clearly remember looking over at my closet – the feeling of fashion sobriety coming over me – wondering what I had turned into (if you knew me then you’d know I don’t like wearing that kind of stuff. I’m happy in a white t-shirt and shorts).</p>
<p>I had this same feeling when I popped my head out of the .NET community just 4 years ago (before I worked at Microsoft) to see what this “Rails thing” was all about. I remember the feeling well – and it was very, very sobering and inspiring at the same time. I remember creating an application in fairly short order with all the requisite pieces put where they needed to be put, with every tutorial urging me to “stop thinking – just build”.</p>
<p><strong>Camaro Programming<br />
</strong>The .NET platform is pretty dang powerful. It lets you build your own personal Tower of Babel if you so choose, and it can abstract away the very fabric of space-time if you let it. In short it’s a killer set of tools that any mechanically-inclined person would love to use. So naturally it can be very easily abused!</p>
<p>Consider my good friend Eric. I’ve written about Eric a few times before – but in summary he’s my token wrench-head friend that loves his engines and American cars. I lived with this guy for years and he rapidly filled up our garage with parts and *crap* from every car he’d ever owned. And he could dutifully tell you which part went to which car and what that part did – no matter if it was useless.</p>
<p>Eric built and maintained a hunk of junk 1968 Capri which we used to call “The Crappy”. This thing could drive – <em>and I mean really drive</em> – I think Eric pushed it to 180 mph once on a closed race course. It had <em>that sound</em> that all muscle cars make – the sound that makes your ribs shake and your inner 16 yr old say “coooooolll!”.</p>
<p>The problem was that no one ever wanted to drive in it. It smelled, it was ugly, and it absolutely sucked the gas down. Eric would steadfastly defend his Crappy because “it was the easiest car in the world to work on” and “could blow doors on any production car from any country”.</p>
<p>“Yah but when do you really need to go 180 miles an hour man?”</p>
<p>“When I race dammit”</p>
<p>I don’t need to draw the parallels here. I think you get it.</p>
<p><strong>Let it Go Already<br />
</strong>I want to be perfectly clear about what it is I’m saying here, and that is that it’s very, very easy for the geek inside us to whisper sweetly in our ears, saying “this Super Massive Paradigm Shifter will be the biggest application EVAR… don’t mess it up!”. I felt this very sensation when starting … well every app that I ever made.</p>
<p>I don’t like being wrong – no one does. So defensively I’ll be sure to include patterning where I can, making sure to separate out my projects whenever it … seems like I’ll crap for not separating out what I’m doing into another project.</p>
<p>I’ll use <a href="http://twitter.com/kevindente/statuses/2121170805">enums instead of boolean parameters</a>.</p>
<p>Oh wait, <a href="http://devpinoy.org/blogs/cruizer/archive/2007/09/12/enums-are-evil.aspx">no I won’t</a>.</p>
<p>I’ll be sure to <a href="http://blogs.msdn.com/scottdensmore/archive/2004/05/25/140827.aspx">avoid Singletons</a></p>
<p>I’ll absolutely <a href="http://weblogs.asp.net/fbouma/archive/2003/11/18/38178.aspx">never use Stored Procedures</a>, I mean seriously <a href="http://weblogs.asp.net/bsimser/archive/2004/09/05/225808.aspx">never</a>, <a href="http://codebetter.com/blogs/jeremy.miller/archive/2005/07/05/130093.aspx">ever</a>, <a href="http://c2.com/cgi/wiki?StoredProceduresAreEvil">ever</a> (unless <a href="http://weblogs.asp.net/rhoward/archive/2003/11/17/38095.aspx">Rob Howard tells me to</a>). Or maybe unless <a href="http://msdn.microsoft.com/en-us/library/ms978510.aspx">my boss tells me to</a>. I’ll <a href="http://www.codinghorror.com/blog/archives/000117.html">let Jeff decide</a>.</p>
<p>I’ll <a href="http://sqlblog.com/blogs/paul_nielsen/archive/2009/05/09/why-use-stored-procedures.aspx">always use Stored Procedures</a>.</p>
<p>I <a href="http://aspadvice.com/blogs/azamsharp/archive/2007/10/04/My-Thoughts-on-NHibernate.aspx">won’t use NHibernate</a></p>
<p>I won’t use <a href="http://www.tonymarston.net/php-mysql/object-relational-mappers-are-evil.html">any ORM for that matter</a>. Seriously &#8211; <a href="http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx">Never</a>.</p>
<p>Well <a href="http://blairbryant.wordpress.com/2007/04/11/orm-isnt-an-excuse-for-not-using-stored-procedures/">I might use both</a>…</p>
<p>I <a href="http://www.ejlife.net/blogs/john/2006/08/16/1155746828758.html">won’t use Code-coverage</a> to tell me anything.</p>
<p>I’ll be sure to <a href="http://codebetter.com/blogs/patricksmacchia/archive/2008/04/09/make-the-most-of-your-test-coverage-data.aspx">use Code-coverage</a> data to tell me everything.</p>
<p>I’ll make sure my <a href="http://codebetter.com/blogs/jeremy.miller/archive/2007/09/21/wrestling-with-pure-evil.aspx">method and variables are named properly on Fridays</a>.</p>
<p>Reflection? <a href="http://devlicio.us/blogs/derik_whittaker/archive/2008/07/29/is-it-evil-to-use-reflection-when-testing.aspx">Not a chance</a>. <a href="http://www.west-wind.com/weblog/posts/351.aspx">Unless Rick says it’s OK</a>.</p>
<p>I <a href="http://www.theserverside.com/news/thread.tss?thread_id=17635">won’t use Extreme Programming</a> (I’ll be sure to use Lean… whatever that is)</p>
<p>I’ll be sure <a href="http://ericlefevre.net/wordpress/2009/06/02/is-scrum-evil-beyond-our-session-at-xp-day-paris/">not to have scrums</a>.</p>
<p>I’ll also be sure <a href="http://www.stickyminds.com/sitewide.asp?Function=edetail&amp;ObjectType=ART&amp;ObjectId=14287">not to multi-task</a>.</p>
<p>I <a href="http://ayende.com/Blog/archive/2008/08/22/JFHCI-The-evil-that-is-configuration.aspx">won’t use configuration either</a> – hard-coding FTW!</p>
<p>I won’t use <a href="http://digg.com/programming/C_extension_methods_are_evil">static methods</a></p>
<p>I won’t use <a href="http://www.aaron-powell.com/blog/january-2009/are-extensions-really-evil.aspx">extension methods</a></p>
<p>I’ll <a href="http://www.codinghorror.com/blog/archives/000486.html">keep Native American stereotypes out of my code</a>.</p>
<p>I’ll make sure that all my methods are public and <a href="http://ayende.com/Blog/archive/2008/04/03/Internals-are-Evil.aspx">never sealed or internal</a></p>
<p>I’ll check twice before I use any of <a href="http://www.codethinked.com/post/2009/04/02/Ten-C-Keywords-That-You-Shouldne28099t-Be-Using.aspx">these evil keywords</a>.</p>
<p>I’ll also make double damn sure <a href="http://weblogs.asp.net/bsimser/archive/2007/10/30/regions-evil.aspx">not to use regions in my code</a> – ever.</p>
<p>I <a href="http://pbdj.sys-con.com/node/42545">won’t use VB</a> (who would?) and I’ll be sure to <a href="http://paskov.info/tags/c/">use C# with great c</a>are.</p>
<p>I <a href="http://codebetter.com/blogs/jeremy.miller/archive/2007/02/01/Composite-keys-are-evil.aspx">won’t use Composite Keys</a> in my database</p>
<p>And I’ll be very, very sure to <a href="http://friendfeed.com/bellware/846011d6/forces-of-good-and-evil-will-do-battle-in-norway">keep away from Norway</a>.</p>
<blockquote><p><em>You wake up at Seatac, SFO, LAX. You wake up at O&#8217;Hare, Dallas-Fort Worth, BWI. Pacific, mountain, central. Lose an hour, gain an hour. This is your life, and it&#8217;s ending one minute at a time. You wake up at Air Harbor International. If you wake up at a different time, in a different place, could you wake up as a different person</em></p></blockquote>
<p>Let.</p>
<p>It.</p>
<p>Go.</p>
<p><strong>Summary</strong><br />
Simplicity is beautiful. Simple doesn’t mean hard-coding, it doesn’t mean cutting corners or being sloppy – it means building what you’ve been asked to build, not a rocket to Saturn and most of the time it’s a skateboard to the corner store.</p>
<p>Not every application needs to be stitched together from Codebetter posts and Twitter rants. Focus on what’s important – the experience, not what’s under the hood. You’ll change that quite a few times no matter what you think <img src='http://blog.wekeroad.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/RCONERY/85B84BD1B6FE00C4F521C517C8549154A452C0F8"><img src="http://theloungenet.com/feeds/img/DOTNETRSS/RCONERY/85B84BD1B6FE00C4F521C517C8549154A452C0F8"></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=gH9WptfLMdg:JRB-LjDvtcM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=gH9WptfLMdg:JRB-LjDvtcM:Q8R26LmAkSY"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?i=gH9WptfLMdg:JRB-LjDvtcM:Q8R26LmAkSY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=gH9WptfLMdg:JRB-LjDvtcM:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=cGdyc7Q-1BI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/wekeroad/EeKc/~4/gH9WptfLMdg" height="1" width="1"/>]]></content:encoded><wfw:commentRss>http://blog.wekeroad.com/blog/youre-not-your-data-access/feed/</wfw:commentRss><slash:comments>47</slash:comments><feedburner:origLink>http://blog.wekeroad.com/blog/youre-not-your-data-access/</feedburner:origLink></item><item><title>SubSonic 3.0: ActiveRecord</title><link>http://feedproxy.google.com/~r/wekeroad/EeKc/~3/mCfCjrHc0HY/</link><comments>http://blog.wekeroad.com/subsonic/subsonic-30-activerecord/#comments</comments><pubDate>Thu, 11 Jun 2009 00:06:24 +0000</pubDate><dc:creator>Rob Conery</dc:creator><category><![CDATA[SubSonic]]></category><guid isPermaLink="false">http://blog.wekeroad.com/subsonic/subsonic-30-activerecord/</guid><description><![CDATA[Google’s project site is down for a while and I have some perf tests running in the background so I thought it might be time to crank out a few more “preview” posts of SubSonic 3.0. This one’s about ActiveRecord – one of my favorite patterns for its ease of use and versatility.
Elevator Summary  [...]]]></description><content:encoded><![CDATA[<p>Google’s project site is down for a while and I have some perf tests running in the background so I thought it might be time to crank out a few more “preview” posts of SubSonic 3.0. This one’s about ActiveRecord – one of my favorite patterns for its ease of use and versatility.</p>
<p><strong>Elevator Summary</strong>     <br />ActiveRecord is for people who want the biggest bang for their buck in terms of working with their data. It raises the database implementation right into the application as each object represents, literally, a row in the database.</p>
<p>Ruby on Rails uses the ActiveRecord pattern to great success – essentially telling people to “get over it”. Well, actually they say “F*** You” – but this is a family blog <img src='http://blog.wekeroad.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  and it would be nice to keep this above board. </p>
<p>ActiveRecord is extremely intuitive and simple to use, but it does have its drawbacks – one of which is testability. But, as you’ll see, SubSonic has some magic here for you. Currently ActiveRecord works with SQL Server, MySQL, and SQLite.</p>
<p><strong>Setting Up ActiveRecord</strong>     <br />As with all things SubSonic 3.0 – ActiveRecord is implemented using a set of <a href="http://blog.wekeroad.com/blog/make-visual-studio-generate-your-repository/">T4 Templates, which automatically generate the code</a> you need within Visual Studio:</p>
<p><a href="http://blog.wekeroad.com/wp-content/uploads/2009/06/ar1.png"><img title="ar1" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="134" alt="ar1" src="http://blog.wekeroad.com/wp-content/uploads/2009/06/ar1-thumb.png" width="266" border="0" /></a> </p>
<p>These templates are divided into 4 parts:</p>
<ul>
<li><strong>SQLServer.ttinclude</strong> talks to SQLServer to get information about your tables </li>
<li><strong>Settings.ttinclude</strong> sets your connection string, database name, namespace, and other goodies (like the names of your classes, etc) </li>
<li><strong>Context.tt</strong> is an IQueryable layer and is akin to the DataContext in Linq to Sql </li>
<li><strong>ActiveRecord.tt</strong> is the class generator </li>
</ul>
<p>You just set the connection string name in Settings.ttinclude, as well as the namespace, and you’re off to the races.</p>
<p><strong>Working With ActiveRecord</strong>     <br />This is designed to be brain-dead simple with no configuration or contexts to set, etc:</p>
<pre class="csharpcode">var product = Product.SingleOrDefault(x =&gt; x.ProductID == 1);</pre>
<p>
  <br />In the old days getting a record from ActiveRecord meant passing the key in through the constructor – but we’ve replaced that with a factory call so you can get a nice null back if the product doesn’t exist.</p>
<p>Each object is created with an IQueryable&lt;T&gt; reference to it’s foreign-key friends. These are two-way references, so you’ll get all objects that reference your main table.</p>
<p>You can grab a list like this:</p>
<pre class="csharpcode">var products = Product.Find(x =&gt; x.ProductID &lt;= 10);</pre>
<p>&#160;</p>
<p>If you want your list paged, you can do that too:</p>
<pre class="csharpcode">var products = Product.GetPaged(1,10);
Assert.Equal(10, products.Count);
Assert.Equal(100, products.TotalCount);</pre>
<p>
  <br />Finally – if you want to work with LINQ you can using the factory method “All()”:</p>
<pre class="csharpcode">var products = from p <span class="kwrd">in</span> Product.All()
          join od <span class="kwrd">in</span> OrderDetail.All() on p.ProductID equals od.ProductID
          select p;

Assert.Equal(500, products.Count());</pre>
<p>&#160;</p>
<p>The factory methods are pretty complete and are pretty much sugar for a very Linq-y type of interaction:</p>
<p><a href="http://blog.wekeroad.com/wp-content/uploads/2009/06/ar2.png"><img title="ar2" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="256" alt="ar2" src="http://blog.wekeroad.com/wp-content/uploads/2009/06/ar2-thumb.png" width="301" border="0" /></a></p>
<p>The methods at the bottom there &#8211; “Setup()” and “ResetTestRepo()” are the goodness which I’ll go into now.</p>
<p><strong>ActiveRecord <strike>Is</strike> Was Hard To Test</strong> </p>
<p></p>
<p>One of the things that people asked for when we rolled out SubSonic 2.0 was better testability. I remember asking Phil about this one day and said “isn’t about time we build this crap in?” and he agreed – but we couldn’t figure out the best way to do it. I thought I’d take a stab at it anyway – so here goes.</p>
<p>Let’s say you have a nice ASP.NET MVC application you’re working up, and you’re a being a Good Person and you’ve created a nice Test Project as well. Now you want to test your ProductController but you have plugged in SubSonic’s ActiveRecord and you don’t want to hit the database because it might make your test fail due to issues not under test (like bad data, for instance).</p>
<p>The good news is you can intercept the call to the database and effectively “Auto-Fake” the ActiveRecord repository, and how you do it is the funnest part. This is the App.Config in a sample Test Application:</p>
<pre class="csharpcode"><span class="kwrd">&lt;?</span><span class="html">xml</span> <span class="attr">version</span><span class="kwrd">=&quot;1.0&quot;</span> <span class="attr">encoding</span><span class="kwrd">=&quot;utf-8&quot;</span> ?<span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">configuration</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">connectionStrings</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">name</span><span class="kwrd">=&quot;Site&quot;</span> <span class="attr">connectionString</span><span class="kwrd">=&quot;Test&quot;</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">connectionStrings</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">configuration</span><span class="kwrd">&gt;</span></pre>
<p>If SubSonic sees that the the connectionString is “Test”, it will automatically work with an in-memory repository, not use a database. You can test this out by writing a test:</p>
<pre class="csharpcode">Product.Setup(100);
var products= Product.All().Count();
Assert.AreEqual(100,products);</pre>
<p>By using the “Setup()” method, you’re filling the TestRepository that SubSonic uses under the covers – which is basically an IList&lt;Product&gt;. You can tell it how many items you want created or you can pass in your own list.</p>
<p>CRUD operations work as well:</p>
<pre class="csharpcode">Product.Setup(10);
Assert.AreEqual(10, Product.All().Count());

var newProduct = <span class="kwrd">new</span> Product();
newProduct.ProductID = 1000;
newProduct.Save();
Assert.AreEqual(11, Product.All().Count());

Album.Delete(x=&gt;x.ProductID==1000);
Assert.AreEqual(10, Product.All().Count());</pre>
<p>&#160;</p>
<p>The interception will work 90% of the time for your application – however there are some circumstances where we can’t intercept the DB call – primarly because we don’t know, at the level, that you’re using ActiveRecord.</p>
<p>One of these places is our Linq implementation. It doesn’t know what’s calling it or why – so it won’t know it’s ActiveRecord and moreover won’t know if it’s under test – so we can’t intercept it. It should be a simple matter to test at the execution level of the connection string is “Test”, but the way we work with connections doesn’t allow for this – an Exception is thrown if a connection string can’t be parsed by the DbFactory.</p>
<p><strong>Summary</strong></p>
<p>One thing that I hope will become clear as we launch SubSonic 3.0 is that it’s really a core framework for you to build your DAL on using T4 templates. This is approach #2 to working with your data – tomorrow I’ll go into George Capnias’ excellent “Advanced Templates” which flex the Repository Pattern to present a very Linq to Sql-style experience.</p>
<p>I’ll also have a lot more to say about these on our forthcoming docs site (which I’m 70% of the way through).</p>
<p><a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/RCONERY/566309CE06203812EE66790E0196F148FB96B2C2"><img src="http://theloungenet.com/feeds/img/DOTNETRSS/RCONERY/566309CE06203812EE66790E0196F148FB96B2C2"></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=mCfCjrHc0HY:ZStnTNAMwr0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=mCfCjrHc0HY:ZStnTNAMwr0:Q8R26LmAkSY"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?i=mCfCjrHc0HY:ZStnTNAMwr0:Q8R26LmAkSY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=mCfCjrHc0HY:ZStnTNAMwr0:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=cGdyc7Q-1BI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/wekeroad/EeKc/~4/mCfCjrHc0HY" height="1" width="1"/>]]></content:encoded><wfw:commentRss>http://blog.wekeroad.com/subsonic/subsonic-30-activerecord/feed/</wfw:commentRss><slash:comments>14</slash:comments><feedburner:origLink>http://blog.wekeroad.com/subsonic/subsonic-30-activerecord/</feedburner:origLink></item><item><title>SubSonic 3.0: The SimpleRepository</title><link>http://feedproxy.google.com/~r/wekeroad/EeKc/~3/UGvv12MPvKQ/</link><comments>http://blog.wekeroad.com/subsonic/subsonic-30-the-simplerepository/#comments</comments><pubDate>Wed, 10 Jun 2009 21:33:54 +0000</pubDate><dc:creator>Rob Conery</dc:creator><category><![CDATA[SubSonic]]></category><guid isPermaLink="false">http://blog.wekeroad.com/subsonic/subsonic-30-the-simplerepository/</guid><description><![CDATA[I have a little downtime right now (which I’ll write about in a later post – and yes I still have my job) so I’m using it to put the wraps on SubSonic 3.0 (soon, soon). One feature I’m very, very happy about is the new SimpleRepository, which allows you to use POCOs the way [...]]]></description><content:encoded><![CDATA[<p>I have a little downtime right now (which I’ll write about in a later post – and yes I still have my job) so I’m using it to put the wraps on SubSonic 3.0 (soon, soon). One feature I’m very, very happy about is the new SimpleRepository, which allows you to use POCOs the way you want, using Migrations the SubSonic way: magically.</p>
<p>It’s Rev 1, Be Gentle! I’ve put peddle to metal with this feature, using it as the backbone of my entire test suite – I think it’s pretty close to being “good to go”. That said – this is Open Source, if you find a bug I’d love your help with a patch. This is not Big Software and we won’t think of every scenario – but hopefully most of them.</p>
<p><strong>Elevator Summary</strong>     <br />The SimpleRepository is for people who don’t want a bunch of “fluff and object noise” in their application and who want their objects “to just be persisted somewhere” without having to design a DB to create an object model. It’s all about POCOs first – sort of an Object Database feel where your object is “just saved”.</p>
<p>This Repository is bare-knuckles, get it going quick, ZERO CONFIGURATION “just gimme my damn data and get out of my way and no don’t ask me which DB I’m using” kinda deal. I should have called it “BareKnuckleRepository”… hmmm.</p>
<p>It works with SQL 2005, 2008, MySQL, and SQLite. Oracle drives me crazy and if someone’s inclined the fix to put it in takes all of 30 minutes. Same with PostGres. </p>
<p><strong>How It Works</strong>     <br />The first thing is to create a simple object – I’ll use the ubiquitous Product here:</p>
<pre class="csharpcode">    <span class="kwrd">public</span> <span class="kwrd">class</span> Product {
        <span class="kwrd">public</span> <span class="kwrd">int</span> ProductID { get; set; }
        <span class="kwrd">public</span> Guid Sku { get; set; }
        <span class="kwrd">public</span> <span class="kwrd">int</span> CategoryID { get; set; }
        <span class="kwrd">public</span> <span class="kwrd">string</span> ProductName { get; set; }
        <span class="kwrd">public</span> <span class="kwrd">decimal</span> UnitPrice { get; set; }
        <span class="kwrd">public</span> <span class="kwrd">bool</span> Discontinued { get; set; }
    }</pre>
<p>&#160;</p>
<p>Next, you need to tell SubSonic about your database. You do this by using our ProviderFactory and passing in a connection string, <strong>or not</strong>:</p>
<pre class="csharpcode">var provider=ProviderFactory.GetProvider(<span class="str">&quot;SubSonicTest&quot;</span>);</pre>
<p>&#160;</p>
<p><strong><font color="#800000">UPDATE</font></strong>: <em>I just checked in a change so you don’t need to declare the Provider – it will do it for you. You can just pass in the connection string name, or nothing at all and we’ll try and guess what it is.</em></p>
<p>You can pass in a connection string name, the full connection string, or nothing at all and we’ll do our best to pull it from your config. This is basically a glorified wrapper to your database.</p>
<p>Then you create a SimpleRepository, passing in the provider you just created:</p>
<pre class="csharpcode">var repo=<span class="kwrd">new</span> SimpleRepository(provider,<span class="kwrd">true</span>);</pre>
<p>The boolean argument there is the magic button – I’ll talk more about this in a second. This repository is very, very simple and has things like “Single, Find, Add, Update, Delete” etc. and can save bunches of items in a transaction.</p>
<p>For this example let’s use an empty DB I just created (the connection string above points to it):</p>
<p><img title="sstest" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="189" alt="sstest" src="http://blog.wekeroad.com/wp-content/uploads/2009/06/sstest.png" width="227" border="0" /> </p>
<p>Next, work up your Product object:</p>
<pre class="csharpcode">var newProduct=<span class="kwrd">new</span> Product();
newProduct.Sku=Guid.NewGuid();
newProduct.CategoryID=5;
newProduct.ProductName=<span class="str">&quot;Pretzel&quot;</span>;
newProduct.UnitPrice=100;
newProduct.Discontinued=<span class="kwrd">false</span>;</pre>
<p>And then save it using the Repo:</p>
<pre class="csharpcode">repo.Add&lt;Product&gt;(newProduct);</pre>
<p>This is where the magic happens <img src='http://blog.wekeroad.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . <strong>By setting “true” in the SimpleRepository constructor, you’re telling it to run Migrations for you – automatically</strong> – creating your table if it’s not there.</p>
<p>If you refresh your DB…</p>
<p><img title="sstest2" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="313" alt="sstest2" src="http://blog.wekeroad.com/wp-content/uploads/2009/06/sstest2.png" width="358" border="0" /> </p>
<p><strong>Yes – if you change your model then your DB will be synchronized</strong>. No, you will not lose data (unless you’re using SQLite , which doesn’t support ALTER of anything). You can change names, types, lengths, add/remove columns etc – all <strong>without dropping the table</strong>.</p>
<p>Notice that the Primary Key was created for you, and the columns defaulted to nice lengths etc. It also made sure the data was added…</p>
<p><img title="sstest3" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="365" alt="sstest3" src="http://blog.wekeroad.com/wp-content/uploads/2009/06/sstest3.png" width="650" border="0" /> </p>
<p><strong>And yes, the Add() method returns the newly inserted key – for all providers.</strong></p>
<p><strong>SimpleRepo Convention</strong> </p>
<p>It’s not easy to make decisions as to how to store certain columns – and I had to do something I normally don’t like, and that is create a set of very, very small Attributes to help out.</p>
<ul>
<li><strong>Primary Keys</strong>: If you call a column “ID” or “Key” or “[ClassName]ID” – no matter it’s type – that will be your Primary Key. If you have other things in mind you can use a primary key attribute (“SubSonicPrimaryKey”) and we’ll use that column. </li>
<li><strong>String length</strong>: there are two ways to tell SubSonic how to handle this – both using attributes. The first is “SubSonicStringLength(int length)” and the second is “SubSonicLongString” which sets to nvarchar(MAX) or LONGTEXT – depending on your provider. </li>
<li><strong>Nullability</strong>: The default is not null, but you can change this by making your propery a nullable type. </li>
<li><strong>Numeric Precision</strong>: the default is a Precision of 10 and a scale of 2 but you can change that with the “SubSonicNumericPrecision(int precision, int scale)” attribute. </li>
<li><strong>Ignoring a property</strong>: you can ignore generation of a property by using “SubSonicIgnore” attribute. </li>
</ul>
<p>This is my test class:</p>
<pre class="csharpcode">    <span class="kwrd">public</span> <span class="kwrd">class</span> SubSonicTest {

        <span class="kwrd">public</span> Guid Key { get; set; }
        <span class="kwrd">public</span> <span class="kwrd">int</span> Thinger { get; set; }
        <span class="kwrd">public</span> <span class="kwrd">string</span> Name { get; set; }
        [SubSonic.SubSonicStringLength(500)]
        <span class="kwrd">public</span> <span class="kwrd">string</span> UserName { get; set; }
        <span class="kwrd">public</span> DateTime CreatedOn { get; set; }
        <span class="kwrd">public</span> <span class="kwrd">decimal</span> Price { get; set; }
        <span class="kwrd">public</span> <span class="kwrd">double</span> Discount { get; set; }

        [SubSonic.SubSonicNumericPrecision(10,3)]
        <span class="kwrd">public</span> <span class="kwrd">float</span>? Lat { get; set; }
        [SubSonic.SubSonicNumericPrecision(10, 3)]
        <span class="kwrd">public</span> <span class="kwrd">float</span>? Long { get; set; }

        <span class="kwrd">public</span> <span class="kwrd">bool</span> SomeFlag { get; set; }
        <span class="kwrd">public</span> <span class="kwrd">bool</span>? SomeNullableFlag { get; set; }
        [SubSonic.SubSonicLongString]
        <span class="kwrd">public</span> <span class="kwrd">string</span> LongText { get; set; }
        [SubSonic.SubSonicStringLength(800)]
        <span class="kwrd">public</span> <span class="kwrd">string</span> MediumText { get; set; }
        [SubSonic.SubSonicIgnore]
        <span class="kwrd">public</span> <span class="kwrd">int</span> IgnoreMe { get; set; }
    }</pre>
<p>And if you <a href="http://code.google.com/p/subsonicthree/source/browse/#svn/trunk/SubSonic3.UnitTests/Migrations">have a look here</a> at our source testing, you can see how this class is used in my unit tests (not an easy thing to do!).</p>
<p>You can also have a look here to <a href="http://code.google.com/p/subsonicthree/source/browse/trunk/SubSonic3.UnitTests/Repositories/SimpleRepositoryTests.cs">see how the SimpleRepository works under test</a>.</p>
<p><strong>Summary Summary</strong> </p>
<p>I’m working on perf tweaks right now, and still adding things to the docs so it will be a bit yet until I release this. If you want to <a href="http://code.google.com/p/subsonicthree/source/checkout">have at our source – it’s here</a>.</p>
<p>I’m not going to release 3.0 until I feel that people can get up and going – and there is a TON of stuff going on with 3.0 that people should know about. I’ll have more on this in the coming weeks.</p>
<p><a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/RCONERY/4CA1771415DCBAFB71DB122D8BF875410B8FF052"><img src="http://theloungenet.com/feeds/img/DOTNETRSS/RCONERY/4CA1771415DCBAFB71DB122D8BF875410B8FF052"></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=UGvv12MPvKQ:Pu2FF5vtTK8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=UGvv12MPvKQ:Pu2FF5vtTK8:Q8R26LmAkSY"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?i=UGvv12MPvKQ:Pu2FF5vtTK8:Q8R26LmAkSY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=UGvv12MPvKQ:Pu2FF5vtTK8:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=cGdyc7Q-1BI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/wekeroad/EeKc/~4/UGvv12MPvKQ" height="1" width="1"/>]]></content:encoded><wfw:commentRss>http://blog.wekeroad.com/subsonic/subsonic-30-the-simplerepository/feed/</wfw:commentRss><slash:comments>106</slash:comments><feedburner:origLink>http://blog.wekeroad.com/subsonic/subsonic-30-the-simplerepository/</feedburner:origLink></item><item><title>Jumping The 20 Fence</title><link>http://feedproxy.google.com/~r/wekeroad/EeKc/~3/m_pzaYneCwc/</link><comments>http://blog.wekeroad.com/blog/jumping-the-20-fence/#comments</comments><pubDate>Fri, 22 May 2009 07:26:33 +0000</pubDate><dc:creator>Rob Conery</dc:creator><category><![CDATA[Blog]]></category><category><![CDATA[Blather]]></category><guid isPermaLink="false">http://blog.wekeroad.com/blog/jumping-the-20-fence/</guid><description><![CDATA[Before I worked at Microsoft I worked at/with/for various startups. Depending on who you talked to, I was involved in building rockets, the Next Big Thing, and a Super Whamadyne Paradigm-Shifter. Since I’m not a millionaire and you don’t see my face on Wired you can guess that those things didn’t quite pan out.
There are [...]]]></description><content:encoded><![CDATA[<p>Before I worked at Microsoft I worked at/with/for various startups. Depending on who you talked to, I was involved in building rockets, the Next Big Thing, and a Super Whamadyne Paradigm-Shifter. Since I’m not a millionaire and you don’t see my face on Wired you can guess that those things didn’t quite pan out.</p>
<p>There are a lot of reasons why projects don’t “pop” – but in some ways I think people can tell if they are “gazing wantonly in the pond’s reflection” by constantly asking a set of simple questions:</p>
<ul>
<ul>
<li><em>What are we doing?</em> </li>
<li><em>Why are we doing it?</em> </li>
<li><em>What do we hope to get out of it?</em> </li>
</ul>
</ul>
<p>A lot of people would say “sure – that’s what ya call a Mission Statement Rob!” and in some ways, I spose it is. But the next part is the hardest:</p>
<blockquote><p><strong>Does it motivate you?</strong></p>
</blockquote>
<p><strong>The Hard Truth</strong>     <br />In every human endeavor the 80/20 rule (aka <a href="http://en.wikipedia.org/wiki/Pareto_principle">Pareto principle</a>) cruelly applies – which is effort/payoff are inversely related. This principle is at the core of the just about any time/management book/philosophy – and these things usually boil down to constantly shifting your focus to “what’s important” (aka the 20%). </p>
<p>It seems the 80/20 thing is built in to the fabric of the universe, along with <a href="http://blog.wekeroad.com/blog/phi-ling-up-your-ui/">some other groovy numbers</a>. Most large software companies have come to realize this – <a href="http://www.crn.com/security/18821726;jsessionid=MWSGIQAD1ZI0SQSNDLRSKH0CJUNN2JVN">including Microsoft</a>:</p>
<blockquote><p><em>&quot;One really exciting thing we learned is how … a relatively small proportion [of bugs] causes most of the errors,&quot; Ballmer wrote in his three-page memo. &quot;About 20 percent of the bugs causes 80 percent of all errors, and&#8211;this is stunning to me&#8211;1 percent of bugs caused half of all errors.&quot;</em> </p>
</blockquote>
<p>If we apply logic here then the opposite of this statement must be true as well:</p>
<blockquote><p><strong>80 percent of the bug-free functionality is produced by 20% of the code.</strong></p>
</blockquote>
<p>If that’s true – we’re writing way too much crappy code. Let me reword that – 80% of the code we write does 20% of the work and contains the bulk of the bugs (my math skills got lost there). Which side of the 80/20 code pool are you swimming in?<a href="http://blog.wekeroad.com/wp-content/uploads/2009/05/8020rulecoopsmanhattanrealestate1.jpg"><img title="80-20-rule-coops-manhattan-real-estate[1]" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0px; margin-right: 0px; border-right-width: 0px" height="183" alt="80-20-rule-coops-manhattan-real-estate[1]" src="http://blog.wekeroad.com/wp-content/uploads/2009/05/8020rulecoopsmanhattanrealestate1-thumb.jpg" width="200" align="right" border="0" /></a></p>
<p><strong>Sherman, Set the Wayback Machine      <br /></strong>It’s 2000 and I’ve just ordered a tin of Pringles and The Fragile (Right and Left) from <a href="http://en.wikipedia.org/wiki/Kozmo.com">Kozmo</a>. It’s 11pm and I should be at home, but I’m hammering away on my client’s app, trying to get a demo ready for Yet Another VC Who Wants To See Stuff Spin. I’m cranky, tired, and my wife is getting tired of this constant circus of late nights.</p>
<p>The phone rings as the speakers are blaring in our Live/Work Loft/Office on 2nd and Brannan and I’m listening to Trent growl his way through “The Wretched” and I see the area code – it’s New York. My client. Crap.</p>
<p>After 10 minutes of telling him everything’s on pace, he recaps what he wants to see. Amazing – he added 4 new requirements! How very … like him.</p>
<p>I ask him the question:</p>
<p>“What are we doing again? I mean what’s your goal here anyway once all of these demos are done and you’re really rich.”</p>
<p>I hear gasps on the other end of the phone, some choice swear words that involve an ice-pick and my retina, and then *click*.</p>
<p>The phone rings 5 minutes later and it’s The Client. “Do you mind telling me just what the **** you’re asking me these questions for you ****in moron?”. I’m used to “the East Coast” thing by now and I reassure him I know his requirements – I understand the specs and priorities – we’ve been through it a ton. I know about the demo.</p>
<p>I want to know about the day after the demo.</p>
<p>His answer was simple: “We’ll be millionaires. Who gives a **** what else – we’ll be the next tech IPO and you can buy your wife a maserati so **** off and build my ******* app!” (the East Coast thing gets annoying at times – but you get used to it. Don’t get me wrong – I like the other side of the country and all, but they can get pretty spun up over there).</p>
<p>We got the funding – a lot of it. And the company still managed to fail – I think it’s when investors figured out my client was full of crap. I should have figured it out too – but back then everyone was involved in an IPO or buyout. It was a “Craigslist Party” of geeks and power money and you just didn’t ask questions. Or so I thought.</p>
<p><strong>What’s Your Answer?      <br /></strong>Twice I’ve worked on a winning application – and it feels great. And by “winning” I mean the client and their clients were stoked, and it literally made people cry. One of my very first applications – an info portal for Ameritech (now PacBell) was one such application. It was so very, very simple that it had to work – it was a classic ASP app (I wrote this in 1998) that used IndexServer to crawl over 12,200 documents scraped from their mainframe.</p>
<p>Their existing app was a terminal-based app and it was all paging and CTRL- shortcuts the user had to memorize. I made a web interface (we called it the “Yahoo UI”) that worked on fuzzy search and BAM – scraped 30 seconds off the average “satisfaction timer”. This meant the call center reps could answer people 30 seconds faster than before without the carpal-tunnel and by using the “new web thing”. I’m not kidding you – one of our User Acceptance participants (an actual rep) started to cry.</p>
<p>If you asked me or any member of that team what we were doing we would have said the following (with minor variations):</p>
<ul>
<ul>
<li>We’re building a web app to reduce the time to answer for call centers </li>
<li>We’re doing it because our existing app sucks and it’s too hard to learn. Turnover is killing us. </li>
<li>We hope to have happier call center folks and happier customers </li>
</ul>
</ul>
<p>These answers are all kinds of win because they’re grounded in something real: making a job easier/better/faster. They don’t involve greed and aren’t out to change the way the Earth spins – simple and direct and dare I say truthful.</p>
<p><strong>Smelly Answers</strong>     <br />I’ve asked these questions various times over the years and aside from my client from hell above, I’ve received some real winners:</p>
<ul>
<li>“We’re going to be the Premier [WHATEVER] and direct all buyers of [X] to use our service and we’ll make wads of cash” </li>
<li>“We’re going to Change the Game with this app, and in doing so make wads of cash” </li>
<li>“We’re going to dominate the [BLAH BLAH] space – we’ll actually become the internet. We’ll make wads of cash” </li>
<li>“Right now there’s a massive void out there and we’re going to fill it. We don’t know how we’re going to make money – but we’ll get there soon enough” </li>
<li>“I don’t know really – I’ve been told to build this thing so I called you. I need a beer.” </li>
</ul>
<p>People and technology are funny and scary at the same time. Sort of like clowns. When I tell people what I do they get a really weird look in their eye (you know the look I mean) and sometimes I don’t know if I’ll be “fixing their internet” or hearing their great new idea to make tons of money. I, evidently, am a bit like Willy Wonka:</p>
<blockquote><p>“<em>We are the music makers, and we are the dreamers of dreams”</em></p>
</blockquote>
<p>Mr. Wonka also offered a followup – which I hold to very tightly:</p>
<blockquote><p><em>“You should never doubt what no one is sure about”</em></p>
</blockquote>
<p>If we agree, by now, that this 80/20 thing has some merit, then it stands to reason that there’s an 80% chance you’re working on a project with a smelly set of directives. You ended up here by the various laws of the universe that sprinkle geeks across projects like salt and pepper – but you don’t have to be the 80% tripe!</p>
<p>You can change this: you can jump the 20% fence. You just have to help your team face the problem plaguing them – which is usually a weird direction that has to do with wads of cash, changing the game, or shifting some paradigm. </p>
<p>Get their heads back in the game and make sure you’re kicking ass for humanity – and you can figure this out pretty quickly by asking some simple questions and listening for:</p>
<ol>
<li>Delusions of grandeur </li>
<li>“Wads of cash” </li>
<li>“I don’t know yet” spoken 2 or more times </li>
<li>The solution isn’t a win/win (you, client, end-user) </li>
<li>Frustration at the question </li>
</ol>
<p>If you hear these answers or feel like you’re drifting – change things for the better by asking if you can open up conversations about the endgame – about the value for the end user. </p>
<p>If you don’t get concrete answers point to YouTube: a really dead-simple app that makes people really happy. Just like a puppy or a kitten – without the poop. Or Twitter – one of the silliest, most relevant applications ever made (that has yet to make a dime… but anyway).</p>
<p>You can change things – you really can. As long as your team is willing to listen and engage and if they’re not, well maybe it’s time to look for the golden 20% out there.</p>
<p><a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/RCONERY/F848D6C1A00939C3830894253A66B70EC12FAE48"><img src="http://theloungenet.com/feeds/img/DOTNETRSS/RCONERY/F848D6C1A00939C3830894253A66B70EC12FAE48"></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=m_pzaYneCwc:CAhp-1UBa3E:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=m_pzaYneCwc:CAhp-1UBa3E:Q8R26LmAkSY"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?i=m_pzaYneCwc:CAhp-1UBa3E:Q8R26LmAkSY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=m_pzaYneCwc:CAhp-1UBa3E:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=cGdyc7Q-1BI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/wekeroad/EeKc/~4/m_pzaYneCwc" height="1" width="1"/>]]></content:encoded><wfw:commentRss>http://blog.wekeroad.com/blog/jumping-the-20-fence/feed/</wfw:commentRss><slash:comments>450</slash:comments><feedburner:origLink>http://blog.wekeroad.com/blog/jumping-the-20-fence/</feedburner:origLink></item><item><title>Kona 3: Learning Behavior Driven Development (BDD)</title><link>http://feedproxy.google.com/~r/wekeroad/EeKc/~3/E3eOutqPtak/</link><comments>http://blog.wekeroad.com/mvc-storefront/kona-3/#comments</comments><pubDate>Fri, 15 May 2009 03:51:25 +0000</pubDate><dc:creator>Rob Conery</dc:creator><category><![CDATA[Kona]]></category><category><![CDATA[MVC Storefront]]></category><guid isPermaLink="false">http://blog.wekeroad.com/mvc-storefront/kona-3/</guid><description><![CDATA[Holy cow! Another *DD – man I really must have an IV with that Alt.NET Punch just coursing like a train in my veins! I ask for your patience with this one – cause I think BDD is a really good tool to know – whether you use it or not – knowing the workings [...]]]></description><content:encoded><![CDATA[<p>Holy cow! Another *DD – man I really must have an IV with that Alt.NET Punch just coursing like a train in my veins! I ask for your patience with this one – cause I think BDD is a really good tool to know – whether you use it or not – knowing the workings of it will allow you to have some intelligent conversation the next time you’re in Austin <img src='http://blog.wekeroad.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><strong>The Start of BDD</strong>     <br />It all started – or so I’ve read – <a href="http://dannorth.net/introducing-bdd">with a guy named Dan North</a>:</p>
<blockquote><p><em>I had a problem. While using and teaching agile practices like test-driven development (TDD) on projects in different environments, I kept coming across the same confusion and misunderstandings. Programmers wanted to know where to start, what to test and what not to test, how much to test in one go, what to call their tests, and how to understand why a test fails.</em></p>
<p><em>The deeper I got into TDD, the more I felt that my own journey had been less of a wax-on, wax-off process of gradual mastery than a series of blind alleys. I remember thinking “If only someone had told me that!” far more often than I thought “Wow, a door has opened.” I decided it must be possible to present TDD in a way that gets straight to the good stuff and avoids all the pitfalls.</em></p>
</blockquote>
<p>I felt this exact way when learning up on TDD: </p>
<ol>
<li>where do I start? <a href="http://blog.wekeroad.com/wp-content/uploads/2009/05/dogtrainingdogbehaviorcategory.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="dog-training-dog-behavior-category" border="0" alt="dog-training-dog-behavior-category" align="right" src="http://blog.wekeroad.com/wp-content/uploads/2009/05/dogtrainingdogbehaviorcategory-thumb.jpg" width="240" height="240" /></a></li>
<li>what do I do next? </li>
<li>how do I know when I get there? </li>
</ol>
<p>Things like that. I still don’t know those answers, but I feel like BDD has helped me see some very interesting ways to address these issues. Moreover, it will help me get along with my PM better – maybe <img src='http://blog.wekeroad.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><strong>The Usual Caveats</strong>&#160; <br />No – I’m not an expert. Please don’t take any of what you’re about to say as guidance. <strong>Do</strong> take it as&#160; queue to find out more. <strong>Do</strong> ask a lot of questions and <strong>Do</strong> challenge yourself to see what some people love to use.</p>
<p><a href="http://silverlight.services.live.com/58326/Kona%203%20Learning%20BDD/video.wmv">Download it here</a></p>
<p>Double-click for full screen</p>
<p> <iframe style="width: 650px; height: 500px" src="http://silverlight.services.live.com/invoke/58326/Kona%203%20Learning%20BDD/iframe.html" frameborder="0" scrolling="no"></iframe></p>
<p><a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/RCONERY/A5202D5675358C0A087CE56E819EA2CC90AF9ECF"><img src="http://theloungenet.com/feeds/img/DOTNETRSS/RCONERY/A5202D5675358C0A087CE56E819EA2CC90AF9ECF"></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=E3eOutqPtak:dqaGAFyUJeQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=E3eOutqPtak:dqaGAFyUJeQ:Q8R26LmAkSY"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?i=E3eOutqPtak:dqaGAFyUJeQ:Q8R26LmAkSY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=E3eOutqPtak:dqaGAFyUJeQ:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=cGdyc7Q-1BI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/wekeroad/EeKc/~4/E3eOutqPtak" height="1" width="1"/>]]></content:encoded><wfw:commentRss>http://blog.wekeroad.com/mvc-storefront/kona-3/feed/</wfw:commentRss><slash:comments>594</slash:comments><feedburner:origLink>http://blog.wekeroad.com/mvc-storefront/kona-3/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/wekeroad/EeKc/~5/74ZO7LI8BvA/video.wmv" length="76274475" type="audio/x-ms-wmv" /><feedburner:origEnclosureLink>http://silverlight.services.live.com/58326/Kona%203%20Learning%20BDD/video.wmv</feedburner:origEnclosureLink></item><item><title>A Long, Long Day</title><link>http://feedproxy.google.com/~r/wekeroad/EeKc/~3/vnqyiyvtah8/</link><comments>http://blog.wekeroad.com/blog/a-long-long-day/#comments</comments><pubDate>Tue, 05 May 2009 02:29:13 +0000</pubDate><dc:creator>Rob Conery</dc:creator><category><![CDATA[Blog]]></category><guid isPermaLink="false">http://blog.wekeroad.com/blog/a-long-long-day/</guid><description><![CDATA[00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 01011111 01011111 01011111 01011111 01011111 01011111 01011111 01011111 00001101 00001010 00101110 [...]]]></description><content:encoded><![CDATA[<p>00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 01011111 01011111 01011111 01011111 01011111 01011111 01011111 01011111 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00101110 00101101 00100111 00100111 00100111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00100111 01111110 00101110 00101100 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00101110 00101101 00100010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100010 00101101 00101110 00101100 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00101111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100010 00111010 00101100 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00111111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 01111101 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00111010 00100111 01011110 00100111 00101110 00101110 01111101 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00111010 00100010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00111111 00101110 00101110 00101110 00101110 00101110 01011111 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00111010 00100111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 01011111 01011111 00101110 00101000 00101110 00101110 00101110 00101110 00101110 00100010 01111110 00101101 00101100 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00111010 00100111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00101000 01011111 00101110 00101110 00101110 00101110 00100010 01111110 00101100 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100010 01111110 00101100 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00111010 00100111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 01011111 00101111 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 01111011 00101110 00101110 01011111 00100100 00111011 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00100010 00111101 00101100 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100010 00101101 00101100 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00101110 00101101 01111110 00101101 00101100 01111101 00101100 00101110 01111110 00100010 00111011 00101111 00101110 00101110 00101110 00101110 01111101 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101000 00101000 00101110 00101110 00101110 00101110 00101110 00101010 01111110 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100010 00111101 00101101 00101110 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00100010 00111011 00101100 00101100 00101110 00101111 00100111 00101110 00101110 00101110 00101110 00101111 00100010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00001101 00001010 00101110 00101110 00101110 00101100 00101100 00101100 01011111 01011111 01011111 00101110 00100111 01111110 00101100 00101110 00101110 00101110 00101110 00101110 00101110 00100010 01111110 00101110 00101100 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00101110 00101110 00101110 00101110 00101110 01111101 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101000 00101110 00101110 00101110 00101110 00100111 00111101 00101101 00101100 00101100 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101000 00101110 00101110 00101110 00101110 00101110 00101110 00111011 01011111 00101100 00101100 00101101 00100010 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00101110 00100111 01111110 00101100 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00101101 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100111 01111110 00101110 00101010 00101101 00101100 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 01111100 00101100 00101110 00101111 00101110 00101110 00101110 00101110 00101110 00101100 01011111 01011111 00001101 00001010 00101100 00101100 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 01111101 00101110 00111110 00101101 00101110 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 01111100 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00111101 01111110 00101101 00101100 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00100111 00111101 01111110 00101101 00101100 01011111 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00101100 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00111101 01111110 00101101 00101100 00101100 00101110 00101100 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00111010 00101100 00101100 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 01011111 01011111 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00111101 00101101 00101100 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00100101 00100111 00111110 00101101 00101101 00111101 00111101 00100111 00100111 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 01011111 00101100 00101101 00100101 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100</p>
<p><a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/RCONERY/C561FA48F2C7ECA3B57462EA213253B4D5720A03"><img src="http://theloungenet.com/feeds/img/DOTNETRSS/RCONERY/C561FA48F2C7ECA3B57462EA213253B4D5720A03"></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=vnqyiyvtah8:YjCuR_GJc9w:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=vnqyiyvtah8:YjCuR_GJc9w:Q8R26LmAkSY"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?i=vnqyiyvtah8:YjCuR_GJc9w:Q8R26LmAkSY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=vnqyiyvtah8:YjCuR_GJc9w:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=cGdyc7Q-1BI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/wekeroad/EeKc/~4/vnqyiyvtah8" height="1" width="1"/>]]></content:encoded><wfw:commentRss>http://blog.wekeroad.com/blog/a-long-long-day/feed/</wfw:commentRss><slash:comments>76</slash:comments><feedburner:origLink>http://blog.wekeroad.com/blog/a-long-long-day/</feedburner:origLink></item><item><title>What Should Microsoft Do For .NET Open Source?</title><link>http://feedproxy.google.com/~r/wekeroad/EeKc/~3/fX_YQPlAnQw/</link><comments>http://blog.wekeroad.com/blog/what-should-microsoft-do-for-net-open-source/#comments</comments><pubDate>Mon, 04 May 2009 08:03:32 +0000</pubDate><dc:creator>Rob Conery</dc:creator><category><![CDATA[ASP.NET MVC]]></category><category><![CDATA[Blog]]></category><category><![CDATA[Kona]]></category><category><![CDATA[musings]]></category><guid isPermaLink="false">http://blog.wekeroad.com/?p=1847</guid><description><![CDATA[I&#8217;ve been reading a lot of old blog posts tonite regarding Microsoft and Open Source &#8211; it really reminds me of the interesting stances the company has taken over the last 5 to 10 years (I&#8217;ve only been working with Microsoft for just about 2 years now). For instance &#8211; I read a post from [...]]]></description><content:encoded><![CDATA[<p>I&#8217;ve been reading a lot of old blog posts tonite regarding Microsoft and Open Source &#8211; it really reminds me of the interesting stances the company has taken over the last 5 to 10 years (I&#8217;ve only been working with Microsoft for just about 2 years now). For instance &#8211; I read <a href="http://scobleizer.com/2005/11/01/ross-doesnt-trust-microsofts-approach-to-web/">a post from Scoble</a> that goes over why &#8220;Web 2.0 entrepreneurs&#8221; don&#8217;t trust the M$ Stack &#8211; and I must say, it&#8217;s a pretty interesting read and the points that Scoble raises are still felt pretty strongly:</p>
<blockquote><p><em>As I’ve been going around the world I’ve been meeting with many people who’ve built their companies on non-Microsoft stuff. Some of whom have companies worth billions of dollars now. Some of whom you’ve never heard about unless you read TechCrunch. <strong>Here’s 12 reasons Web 2.0 entrepreneurs like Ross tell me that they aren’t using Microsoft’s stuff</strong>:</em></p>
<p><em>1) <strong>Startup costs.</strong> Linux is free. Ruby on Rails is free. MySQL is free.<br />
2) <strong>Performance per dollar.</strong> They perceive that a Linux server running Apache has more performance than IIS running .NET.<br />
3) <strong>Finding tech staff is easier.</strong> There are a whole new raft of young, highly skilled people willing to work long hours at startups who can build sites using Ruby on Rails.<br />
4) <strong>Perception of scalability.</strong> The geeks who run these new businesses perceive that they can scale up their data centers with Linux and not with Windows (the old “Google runs on Linux” argument).<br />
5) <strong>That Microsoft doesn’t care about small businesses. </strong>After all, Microsoft is an evil borg, but Ruby on Rails comes from a single guy: David Heinemeier Hansson. <a href="http://www.loudthinking.com/">He has a blog and answers questions fast</a>.<br />
6) <strong>That open source makes it easier to fix problems and/or build custom solutions.</strong> A variant of the old “Google or Amazon couldn’t be built on Windows” argument.<br />
7) <strong>On clients, they want to choose the highest-reach platforms.</strong> That doesn’t mean a Windows app. Or even an app that runs only in IE. It must run on every variant of Linux and Macintosh too.<br />
 <img src='http://blog.wekeroad.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> <strong>They don’t want to take shit from their friends (or, even, their Venture Capitalist).</strong> Most of this is just pure cost-control. I can hear the conversation now: “OK, you wanna go with Windows as your platform, but is the extra feature worth the licensing fees for Windows?”<br />
9) <strong>No lockin.</strong> These new businesses don’t want to be locked into a specific vendor’s problems, er products. Why? Because that way they can’t shop for the best price among tools (or move to something else if the architecture changes).<br />
10) <strong>More security.</strong> The new businesses perceive Linux, Apache, Firefox, and other open source stuff to have higher security than stuff built on Windows.<br />
11) <strong>More agility.</strong> I’ve had entrepreneurs tell me they need to be able to buy a server and have it totally up and running in less than 30 minutes and that they say that Linux is better at that.<br />
12) <strong>The working set is smaller.</strong> Because Linux can be stripped down, the entrepreneurs are telling me that they can make their server-side stuff run faster and with less memory usage.</em></p>
<p><em><br />
</em></p></blockquote>
<p>I&#8217;d love to know if these opinions have softened at all &#8211; or if they&#8217;ve been further reinforced &#8211; especially given the release of ASP.NET MVC (and it&#8217;s subsequent listing on Codeplex under Ms-PL). I&#8217;m going to guess that they&#8217;re roughly the same: people will believe what they&#8217;re going to believe and for some reason, when it comes to Microsoft, changing people&#8217;s minds is really hard.</p>
<p>One thing that&#8217;s particularly interesting to me is that Microsoft, at least some divisions, are actively changing their &#8220;thinking&#8221; if you will to a more open posture. The Ms-PL of ASP.NET MVC (mentioned above), some of the work that Developer Division is doing with the Mono team, and the source availability of the entire .NET stack (yes, I know it&#8217;s still not open) are evidence of a shift in thinking.</p>
<p>Great! But now what?</p>
<p>Clearly openness and transparency is super groovy &#8211; but then what? I&#8217;m a huge champion of the open and transparent thing and I&#8217;ve been able to do some great stuff in the open with the MVC Storefront and I&#8217;ve taken you along with me. I like to think that I was brought to Microsoft to help keep &#8220;<a href="http://blog.wekeroad.com/blog/rolling-a-bubble-ndash-asp-net-mvc-is-ms-pl/">rolling the bubble</a>&#8221; towards more openness &#8211; but I have no way of knowing where the rowers are a-rowing; so I just keep plugging along and thankfully they&#8217;re letting me <img src='http://blog.wekeroad.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>The Storefront has been a great learning tool, and a lot of people have thanked me for it (and you&#8217;re all very welcome! I learned a ton too). <strong>But now what</strong>?</p>
<p>It was always my intent to pop what I did up on Codeplex and share it with people with the idea that if it had legs &#8211; well hooray! So far I have every reason to think it will become quite the open, flexible, &#8220;new thinking&#8221; type of application that people can learn from, use, extend, and so on. It fires me up and makes me pretty happy because I really like Open Source and what it can do.</p>
<p><strong>But then again &#8211; I&#8217;m a Microsoft employee and this is a Microsoft project, after all</strong>. They&#8217;ve given me tremendous latitude to do with it what I will so people can learn core concepts surrounding ASP.NET MVC. That part is sort of done, and now we have Kona &#8211; an app that I&#8217;m hoping will be somewhat influential with respect to Open Source apps built on ASP.NET. Nice idea &#8211; but then there&#8217;s the fact that I work on the ASP.NET team.</p>
<p>What does it mean to you that I&#8217;m an MS Employee, on the ASP.NET team, building an OSI-licensed ecommerce app? Do you think Microsoft should do more things like this in a more formal way? Or should it stay out of the picture and let others run with this kind of thing?</p>
<p>There are so many questions that I have in my head &#8211; and I&#8217;m very, very interested to know what you think here: <strong>What do you think Microsoft should do with respect to Open Source and .NET?</strong></p>
<p><a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/RCONERY/DD69F9BFCB934C3E8D66B931EF12D8AE16D9AA70"><img src="http://theloungenet.com/feeds/img/DOTNETRSS/RCONERY/DD69F9BFCB934C3E8D66B931EF12D8AE16D9AA70"></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=fX_YQPlAnQw:3EiXRsnqDkg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=fX_YQPlAnQw:3EiXRsnqDkg:Q8R26LmAkSY"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?i=fX_YQPlAnQw:3EiXRsnqDkg:Q8R26LmAkSY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=fX_YQPlAnQw:3EiXRsnqDkg:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=cGdyc7Q-1BI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/wekeroad/EeKc/~4/fX_YQPlAnQw" height="1" width="1"/>]]></content:encoded><wfw:commentRss>http://blog.wekeroad.com/blog/what-should-microsoft-do-for-net-open-source/feed/</wfw:commentRss><slash:comments>134</slash:comments><feedburner:origLink>http://blog.wekeroad.com/blog/what-should-microsoft-do-for-net-open-source/</feedburner:origLink></item><item><title>…In Which We Discuss Writing a Book on MVC</title><link>http://feedproxy.google.com/~r/wekeroad/EeKc/~3/LjziFgi8ang/</link><comments>http://blog.wekeroad.com/blog/in-which-we-discuss-writing-a-book-on-mvc/#comments</comments><pubDate>Sat, 25 Apr 2009 01:19:44 +0000</pubDate><dc:creator>Rob Conery</dc:creator><category><![CDATA[ASP.NET MVC]]></category><category><![CDATA[Blog]]></category><guid isPermaLink="false">http://blog.wekeroad.com/blog/in-which-we-discuss-writing-a-book-on-mvc/</guid><description><![CDATA[“I can’t believe you’re using your blog to pimp you’re book! You’re such a … [not a nice word]”.
I couldn’t agree more, and overall the book is a mess and you shouldn’t buy it. If you do buy it, it will give you bad dreams (I know how to write dream trojans) and your brain [...]]]></description><content:encoded><![CDATA[<blockquote><p>“I can’t believe you’re using your blog to pimp you’re book! You’re such a … [not a nice word]”.</p></blockquote>
<p>I couldn’t agree more, and overall the book is a mess and you shouldn’t buy it. If you do buy it, it will give you bad dreams (I know how to write dream trojans) and your brain could boil, increasing the size of your forehead until it eclipses the sun. Or maybe you’ll like it – who the hell knows – I gave up trying to figure this whole thing out a while ago.</p>
<p><strong>Why This Book Sucks</strong><br />
I’ll be straight with you – we tried to avoid sounding like every other book out there – so it might not work for you. Every chapter I wrote I actually stressed over – trying to make sure that I told a story and made it entertaining. I know I know – swimming upstream… but a guy can dream.<a href="http://blog.wekeroad.com/wp-content/uploads/2009/04/1163561973175cc0.jpg"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0px; margin-right: 0px; border-right-width: 0px" title="1163561973175cc0" src="http://blog.wekeroad.com/wp-content/uploads/2009/04/1163561973175cc0-thumb.jpg" border="0" alt="1163561973175cc0" width="304" height="343" align="right" /></a></p>
<p>I hate boring books written by guys with huge foreheads and silly looks on their faces – and I have a lot of them (and now I am one of them!). One of the things I said to the editor when we first talked was “dude this book has to be fun and entertaining otherwise it’s a waste. Palermo’s already writing the boring one – we have to write <em>the good one</em>”.</p>
<p>OK I didn’t really say that last part – I’d probably get in trouble if Jeffrey thought I said that – so let’s keep that between us KTHX!</p>
<p>I wrote Chapter 9, the security chapter. Well to be precise – I rewrote it about 5 times. Each time I kept thinking “this is boring, who cares!” and that’s not a good thing – especially with regards to security. So I decided to tell stories along the way – stories about Kevin Mitnick, Kevin Poulsen, and The Ghettohackers pwning the competition at the annual DEF CON in Vegas. Stories about the Srizbi and Storm Worms (which I also wrote about on my blog) and basically tried to take a walk on the wrong side of the digital universe – taking you with me – showing you what kinds of bad guys are out there.</p>
<p><strong>Why This Book Really Sucks</strong><br />
Scott H, Phil and I collaborated on a few of the chapters as well – and we each pushed each other to “speak a bit more plainly”. It’s easy to lapse into author-speak, losing your voice. This was a pretty fun process, and I have to say Scott’s an exceptional writer as well as a speaker. He wrote many of the early chapters in the book, and sums up the WebForms vs. MVC thing pretty well.</p>
<p>He tells it straight, as do Phil and I – so if you like your books milky and Wonder-bread bland, well it’s probably not for you.</p>
<p><strong>What You Get With This Book (Which isn’t Much)</strong><br />
People have been asking “what’s in this book anyway – why should I care?”. So here you go – I’ll tell you specifically:</p>
<ul>
<li>0 to 60 with ScottGu and Nerddinner. Scott writes clean, amazing prose and cuts right to it, showing you how we started Nerddinner.com</li>
<li>Perspective – Scott H. covers what MVC is in terms of a pattern and discusses the platforms that use it on the web today. He then dives in to “what ASP.NET MVC means” and exhaustively shows, in just about every way, the conceptual difference between WebForms and MVC</li>
<li>Nuts and Bolts – Phil. The PM of the project himself covers Routes, Controllers, Views, and ActionFilters going into deep detail about each.</li>
<li>“Higher Concept” stuff – Phil and myself. Phil puts on the rubber gloves and covers every possible aspect of TDD – how to work it with MVC, his secrets, and some interesting strategies you can use. I dive into Testable Design Patterns – the “OK fine so how do I put this altogether” kind of thing where I cover patterns and things I’ve learned from the Storefront. I also do a lengthy chapter on AJAX and show you some interesting tricks.</li>
</ul>
<p><strong>When You’re Done Reading It…<br />
</strong>Burn it. The ideas contained in this book are dangerous and might make you do weird things – things that could make people stare at you and say “why is he doing weird things”. Our hope is that you can dive into any chapter, and we don’t spend too much time on the basics but instead treat you like adults and try to get right to the good stuff – having a good time on the way.</p>
<p>If you’re a sucker and have bought it already – well I hope it helps you somehow. If not, wel</p>
<p><a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/RCONERY/8251009A2E65142B182C36ECC7B5741A9FB5478D"><img src="http://theloungenet.com/feeds/img/DOTNETRSS/RCONERY/8251009A2E65142B182C36ECC7B5741A9FB5478D"></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=LjziFgi8ang:_NEKk-RTDYM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=LjziFgi8ang:_NEKk-RTDYM:Q8R26LmAkSY"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?i=LjziFgi8ang:_NEKk-RTDYM:Q8R26LmAkSY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=LjziFgi8ang:_NEKk-RTDYM:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=cGdyc7Q-1BI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/wekeroad/EeKc/~4/LjziFgi8ang" height="1" width="1"/>]]></content:encoded><wfw:commentRss>http://blog.wekeroad.com/blog/in-which-we-discuss-writing-a-book-on-mvc/feed/</wfw:commentRss><slash:comments>294</slash:comments><feedburner:origLink>http://blog.wekeroad.com/blog/in-which-we-discuss-writing-a-book-on-mvc/</feedburner:origLink></item><item><title>I Spose I’ll Just Say It: You Should Learn MVC</title><link>http://feedproxy.google.com/~r/wekeroad/EeKc/~3/WNNn9o5X1OE/</link><comments>http://blog.wekeroad.com/blog/i-spose-ill-just-say-it-you-should-learn-mvc/#comments</comments><pubDate>Wed, 22 Apr 2009 22:58:48 +0000</pubDate><dc:creator>Rob Conery</dc:creator><category><![CDATA[ASP.NET MVC]]></category><category><![CDATA[Blog]]></category><category><![CDATA[aspnetmvc]]></category><guid isPermaLink="false">http://blog.wekeroad.com/blog/i-spose-ill-just-say-it-you-should-learn-mvc/</guid><description><![CDATA[I’m never shy about my opinion – why start now? I’ve been reading a lot of posts flying about on whether you should learn MVC, Summing up the differences so you can decide when to use it, I even found a post that offers a scorecard approach! I remember reading the latter post thinking to [...]]]></description><content:encoded><![CDATA[<p>I’m never shy about my opinion – why start now? I’ve been reading a lot of posts flying about on <a href="http://www.kevinwilliampang.com/post/Should-You-Use-ASPNET-MVC.aspx" target="_blank">whether you should learn MVC</a>, <a href="http://beta.blogs.microsoft.co.il/blogs/gilf/archive/2009/01/16/deciding-when-to-use-asp-net-mvc-framework.aspx" target="_blank">Summing up the differences</a> so you can decide when to use it, I even found <a href="http://www.coderjournal.com/2008/12/introducing-aspnet-mvc-part-2-aspnet-mvc-vs-webforms/" target="_blank">a post that offers a scorecard approach</a>! I remember reading the latter post thinking to myself “how can you possibly put a number next to Testability? And why it is only 2 more points than “using a RAD designer”? Isn’t this missing the entire point? </p>
<p>I felt the need to speak up a bit so <a href="http://www.dotnetkicks.com/mvc/How_to_choose_between_ASP_NET_MVC_and_Web_Forms" target="_blank">I left a comment on DotNetKicks</a>:</p>
<blockquote><p><em>Please don&#8217;t use this &quot;scoring&quot; chart with respect to MVC and WebForms. Honestly &#8211; you can&#8217;t &quot;score&quot; something like &quot;should I care about Testability&quot; (which rates an <img src='http://blog.wekeroad.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> against &quot;do I need to use this Server Control&quot; (which scores a 10).&#160; There are so many problems with approaches like this &#8211; really the only answer is to *try it* and see if it works for you or your org.</em></p>
</blockquote>
<p>Today <a href="http://stackoverflow.com/questions/390693/does-anyone-beside-me-just-not-get-asp-net-mvc" target="_blank">I read a post on StackOverflow</a> which was pretty contentious wherein the author says:</p>
<blockquote><p><em>I&#8217;ve been fiddling with ASP.NET MVC since the CTP, and I like a lot of things they did, but there are things I just don&#8217;t get…</em></p>
<p><em>&lt;snipped ugly viewcode&gt;</em></p>
<p><em>Am I doing something wrong? Because I spent many dark days in classic ASP, and this tag soup reminds me strongly of it.</em></p>
<p><em>Everyone preaches how you can do cleaner HTML. Guess, what? 1% of all people look at the outputted HTML. To me, I don&#8217;t care if Webforms messes up my indentation in the rendered HTML, as long as I have code that is easy to maintain&#8230;This is not!</em></p>
</blockquote>
<p>I have definite opinions on this, and today you get to read them. Note that I pushed Scott Hanselman really hard <a href="http://www.amazon.com/Professional-ASP-NET-MVC-1-0-Conery/dp/0470384611" target="_blank">when we wrote our book</a> (which I think is shipping today!) to come out AND SAY SOMETHING (Chapter 3 – a discussion on MVC and WebForms – and he did an amazingly good job). It’s too easy to think “hey – I’m Microsoft – I need to stay balanced here so I don’t offend” and there’s merit to that. </p>
<p>I, on the other hand, think we should also be able to speak our minds. In that light, I present to you my latest effort at getting in trouble: why you need to read this post, get up, and learn what MVC is all about (if you don’t already know).</p>
<p><strong>The Great Lie      <br /></strong>WebForms is a lie. It’s abstraction wrapped in deception covered in lie sauce presented on a plate full of diversion and sleight of hand. Nothing you do with Webforms has anything to do with the web – you let it do the work for you. </p>
<p>This, friends, is a big deal (at least to me): You’re working in a lie. The web is *not* stateful and works with this stuff called HTML sent across wires using another thing called HTTP – you need to know this, love this, and feel it at the bone level. I understand this sentence right here is probably making some of you squirm –<em> please continue squirming (I’ll wait).</em> <a href="http://blog.wekeroad.com/wp-content/uploads/2009/04/world.jpg"><img title="world" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin: 5px; border-right-width: 0px" height="266" alt="world" src="http://blog.wekeroad.com/wp-content/uploads/2009/04/world-thumb.jpg" width="297" align="right" border="0" /></a> </p>
<p>If you’re still squirming, then perhaps web development isn’t for you (meant very respectfully and kindly – not being snarky). I say this because you shouldn’t work in a sausage factory if you’re allergic to pork, beef, and ground up animal parts. Nor should you put a wig on your cat and hope that it can sing like <a href="http://www.youtube.com/watch?v=RxPZh4AnWyk" target="_blank">Susan Boyle</a>. </p>
<p>These are self-deceptions put in place to make you feel better about something lacking, and it’s usually not healthy. If you’re thinking that you don’t need to know HTTP/HTML to work on the web… you’re doing it again! Please see 2 sentences ago. </p>
<p>If you’re still thinking it – your cat needs a new wig.</p>
<p><strong>MVC Is Elite-test?</strong>     <br />I’m sure that WebForms people are probably thinking I’m being a bit of a sh** right now – and I’d like to speak to that. The title of the post here is “You Should <strong>Learn</strong> MVC” – not that you have to use it (although I wish you would – it’s tons of fun!). That’s all I’m asking – for you to learn it; I’m not telling you that you’re a bad person if you don’t use it (only that you put wigs on your cat).</p>
<p><strong>MVC Is Full of Tag Soup?</strong>     <br /><a href="http://blog.wekeroad.com/blog/asp-net-mvc-avoiding-tag-soup/" target="_blank">Once again</a>, I’ll say this: Spaghetti is as Spaghetti does. I don’t like to see a bunch of if’s and fors on my View the same as any other geek. This, friends, is up to you! Not the platform! <strong>Please read this: markup is up to you</strong>, as with everything else in MVC. Yes it’s not drag and drop – but nothing ever is in life! It’s new, it’s different – it’s not 1999 if only because we have the power of C# now – not VBScript. </p>
<p>I’m not afraid of HTML – and you shouldn’t be either. Respect it when putting code to page and use DRY as your guide. We can make it through this, together. You can bring your cat, too.</p>
<p><strong>7 Reasons To Stop Calling Me A Jerk      <br /></strong>Hopefully you’re still here, and hopefully you’re thinking “enough of the blather already – gimme something to sink my teeth into”. So here goes:</p>
<p><strong>1 – Testability</strong>. No – not talking about the TDD variety, just testing in general. If you’re “not a testing person” that’s OK – the rest of the computer science world has embraced the idea that “testing what we build is a pretty good idea”. You don’t really want your clients to catch that silly “InvalidCastException” do ya? There’s LOTS of reasons to want to test – again not TDD – just good old Unit Testing! It’s easy peasy with MVC and this alone should pull you in to at least check it out – along with <a href="http://blog.wekeroad.com/kona/kona-2/" target="_blank">why testing can save you time and money</a>.</p>
<p><strong>2 – Control over HTML</strong>. I’m sure you’ve heard this before – mangled ID’s, non-validating HTML, etc. Why is this important? Because you might want to use client-side programming for something! I won’t bang this gong for too long – but it’s a lot more than “making ViewSource look pretty” – you’re communicating with super-finicky creatures (browsers) that love to argue – being able to smith the markup experience makes you a more valuable developer!</p>
<p><strong>3 – Extensibility</strong>. Literally every part of MVC Is pluggable – and in the last 3 apps I wrote (Storefront, Nerddinner, and SubSonic’s MVC Starter) I used my own ViewEngine to save some time and work. I’ve spun up my own ControllerFactory <a href="http://www.asp.net/learn/mvc-videos/video-366.aspx" target="_blank">so I can use IoC (which is awesome fun!)</a> Understanding this is the keys to the kingdom for any developer! Have you ever been freaked out because you needed to use Page_PreRender to get something to load into the ControlTree properly so it will show when you need it to? MVC does not lock you into anything – you’re free to do what you want to.</p>
<p><strong>4 – It Makes You Think</strong>… This is the one thing I never liked about WebForms – I never felt like I was thinking – just solving. May seem like splitting hairs, but not to me. I’d get a bit of inspiration and then try to figure out “hmmm – how can I make the form show it this way”. MVC is the opposite – the control is in your hands and you get to be free with it. You get to use your noggin! Wow!</p>
<p><strong>5 – …Differently</strong>: <strong>Javascript Doesn’t Suck</strong>. jQuery, Dojo, extJS – whatever. These frameworks make client development so easy it’s actually fun. Phil and I have recently geeked out extensively using jQuery (he more than me) and I distinctly had the feeling that I’ve been missing something. Something that other platforms have had for years – the ability to make a web experience fun and magical (for a user) through client programming. It makes you think completely differently once you “get it” – and soon your server code is being drastically reduced in favor of light, clean client code (thanks to these frameworks) that work up an awesome experience. Cats love jQuery too.</p>
<p>It may seem weird to say it, but developers like to learn a language every few years – make javascript the one you learn this year. You might think you know it, but you probably don’t know it as well as something like C#/VB. Try to – it will change your development entirely from scheming out an interaction to how much code you write.</p>
<p><strong>6 – Learning New Concepts</strong>. You’ve seen them everywhere, <a href="http://stephenwalther.com/blog/archive/2009/04/08/test-after-development-is-not-test-driven-development.aspx" target="_blank">and seen us fighting about them</a>. We probably shouldn’t argue so much <img src='http://blog.wekeroad.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  but in a way, this is part of the learning process! Either way – take it upon yourself to learn some things. WebForms is a comfy blanket that can lull you to sleep over time. This has happened to a lot of us (myself included). We’re only now catching up with frameworks that have been creating rocking, compelling sites over the last few years – jog your brain! Wake yourself up and get to know the details that make compelling sites groovy! Learn the things that can help you write more nimble code – if only so you can argue from a point of knowledge!</p>
<p><strong>7 – It’s Fun</strong>. This, to me, is the biggest reason. I find MVC fun because I can do what I want, when I want, how I want. I’m free to build an experience that I feel will sell my design, and I’m not hindered by a A Big Lie and a freaky cat with a wig on.</p>
<p><strong>Summary</strong>     <br />Bottom line: I’m having fun web programming again and I think that’s pretty motivating, at least for me and my cats. Yet Another Comparison, sure, but hopefully a bit more direct. You have absolutely no reason at all to not learn MVC – but I will concede there may be a reason or two for you to stick with WebForms.</p>
<p>I know many people might think I’m speaking for the rest of Microsoft – hardly. I’m biased and, more importantly, I actually still have my very own brain which forms its own thoughts! I love MVC and I think you will too – just please, please try it before you form an opinion.</p>
<p><a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/RCONERY/9B70F24E755BB6307FA479F3DA4ADE45A1F9F101"><img src="http://theloungenet.com/feeds/img/DOTNETRSS/RCONERY/9B70F24E755BB6307FA479F3DA4ADE45A1F9F101"></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=WNNn9o5X1OE:6jDATOItDLU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=WNNn9o5X1OE:6jDATOItDLU:Q8R26LmAkSY"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?i=WNNn9o5X1OE:6jDATOItDLU:Q8R26LmAkSY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=WNNn9o5X1OE:6jDATOItDLU:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=cGdyc7Q-1BI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/wekeroad/EeKc/~4/WNNn9o5X1OE" height="1" width="1"/>]]></content:encoded><wfw:commentRss>http://blog.wekeroad.com/blog/i-spose-ill-just-say-it-you-should-learn-mvc/feed/</wfw:commentRss><slash:comments>136</slash:comments><feedburner:origLink>http://blog.wekeroad.com/blog/i-spose-ill-just-say-it-you-should-learn-mvc/</feedburner:origLink></item></channel></rss>
