<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://devlicio.us/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>ViNull, Off the Record : Featured</title><link>http://devlicio.us/blogs/vinull/archive/tags/Featured/default.aspx</link><description>Tags: Featured</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>IncaBlocks Released, Thanks AgileZen and Kanban!</title><link>http://devlicio.us/blogs/vinull/archive/2009/10/14/incablocks-released-thanks-agilezen-and-kanban.aspx</link><pubDate>Wed, 14 Oct 2009 15:21:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:52665</guid><dc:creator>Michael C. Neel</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/vinull/rsscomments.aspx?PostID=52665</wfw:commentRss><comments>http://devlicio.us/blogs/vinull/archive/2009/10/14/incablocks-released-thanks-agilezen-and-kanban.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://marketplace.xbox.com/en-US/games/media/66acd000-77fe-1000-9115-d8025855032f"&gt;&lt;img style="border-right-width:0px;margin:0px 10px 10px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Box_cover" alt="Box_cover" src="http://www.vinull.com/Assets/Images/windowslivewriterincablocksreleasedfuncworksfirstxnagame_13492box_cover_0380a2b540504cb3b3302bc8609fbada.jpg" width="204" align="left" border="0" height="244" /&gt;&lt;/a&gt;&lt;a href="http://feelthefunc.com"&gt;FuncWorks, LLC&lt;/a&gt;&amp;rsquo;s first XNA game, &lt;a href="http://marketplace.xbox.com/en-US/games/media/66acd000-77fe-1000-9115-d8025855032f"&gt;IncaBlocks&lt;/a&gt;, is now available on Xbox Live Indie Games (XBLIG)!&lt;/p&gt;
&lt;p&gt;This game represents the many hours and weekends &lt;a href="http://dylanwolf.com"&gt;Dylan&lt;/a&gt;, &lt;a href="http://finsandstems.com"&gt;Cicelie&lt;/a&gt; and myself worked the past several months.&amp;nbsp; Looking back at SVN, I started this as a side project to &lt;a href="http://www.youtube.com/watch?v=RhZ03RUj_NE"&gt;ROCS&lt;/a&gt; around July 30th.&amp;nbsp; Shortly thereafter we decided to put ROCS on hold and make IncaBlocks the first game we would release.&amp;nbsp; Keeping with our belief in over delivering, we priced IncaBlocks at 80 Points ($1.00). &lt;/p&gt;
&lt;p&gt;Game play is pretty simple &amp;ndash; stack blocks following some rules, and the one with the most blocks on top at the end wins.&amp;nbsp; I recorded a short video of a game to help everyone check it out (there is also a free trial version on Xbox):&lt;/p&gt;
&lt;p align="center"&gt;
&lt;object width="580" height="360"&gt;
&lt;param name="movie" value="http://www.youtube.com/v/Zg4OAck7rAA&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0&amp;amp;border=1" /&gt;
&lt;param name="allowFullScreen" value="true" /&gt;
&lt;param name="allowscriptaccess" value="always" /&gt;&lt;embed src="http://www.youtube.com/v/Zg4OAck7rAA&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0&amp;amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="580" height="360"&gt;&lt;/embed&gt;
&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;IncaBlocks was also the first project that we made heavy use of &lt;a href="http://en.wikipedia.org/wiki/Kanban"&gt;Kanban&lt;/a&gt; and &lt;a href="http://agilezen.com/"&gt;AgileZen&lt;/a&gt;.&amp;nbsp; Kanban is an idea I&amp;rsquo;ve loved in theory for a while, but hadn&amp;rsquo;t had the chance to use it on a real project (meaning a project with a deadline).&amp;nbsp; We used both the online board at AgileZen, and a real board in my office.&amp;nbsp; &lt;a href="http://kohari.org/"&gt;Nate&lt;/a&gt; and &lt;a href="http://nikibeth.com/"&gt;Nicole&lt;/a&gt; have done an awesome job with AgileZen, and in my not-so-humble opinion have a better project management system than &lt;a href="http://basecamphq.com/"&gt;Basecamp&lt;/a&gt;.&amp;nbsp; As with &lt;a href="http://ninject.org/"&gt;Ninject&lt;/a&gt;, Nate has a knack for stripping away the excess and leaving only the good parts.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;That said, you cannot beat the feeling of a physical Kanban board.&amp;nbsp; Moving a work item physically through the project flow gives one a great sense of accomplishment.&amp;nbsp; We stuck to two basic rules of the board: first, you can only have one task in progress at a time, and second, you must take a task, once started, all the way to done.&amp;nbsp; I think at least 3 times I &amp;ldquo;reset&amp;rdquo; the board and moved tasks around in the ready columns to change priority.&amp;nbsp; This allowed us to keep a high velocity while reacting to change (considering this was our first XNA game to be release, we had many changes as a result of just learning XNA and XBLIG worked).&amp;nbsp; While we pruned the done items from AgileZen, we left them all up on the wall:&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="http://www.vinull.com/Assets/Images/windowslivewriterincablocksreleasedfuncworksfirstxnagame_13492dscf6419.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Don&amp;#39;t you have a Fender Stat in your office too?" alt="Don&amp;#39;t you have a Fender Stat in your office too?" src="http://www.vinull.com/Assets/Images/windowslivewriterincablocksreleasedfuncworksfirstxnagame_13492dscf6419_thumb.jpg" width="644" border="0" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;We already have ideas for our next games, though I will have to take a break from game development while I work on an ebook for &lt;a href="http://www.wrox.com"&gt;Wrox&lt;/a&gt;.&amp;nbsp; The working title is &amp;ldquo;XNA 3D Primer&amp;rdquo;, and will be a crash course in 3D game programming.&amp;nbsp; I also plan to do some post mortem posts on IncaBlocks and the lessons we learned along the way.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=52665" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/vinull/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/agile/default.aspx">agile</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/xna/default.aspx">xna</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/kanban/default.aspx">kanban</category></item><item><title>Critical Thinking and Dissent is a Requirement</title><link>http://devlicio.us/blogs/vinull/archive/2009/10/08/critical-thinking-and-dissent-is-a-requirement.aspx</link><pubDate>Thu, 08 Oct 2009 16:00:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:52459</guid><dc:creator>Michael C. Neel</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/vinull/rsscomments.aspx?PostID=52459</wfw:commentRss><comments>http://devlicio.us/blogs/vinull/archive/2009/10/08/critical-thinking-and-dissent-is-a-requirement.aspx#comments</comments><description>&lt;p&gt;&lt;a title="Year Two, Day 88: Speak No Evil by Brymo" href="http://www.flickr.com/photos/brymo/2990021496/"&gt;&lt;img style="border-right-width:0px;margin:0px 10px 10px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" alt="image" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vinull/image_5F00_18F39EAF.png" width="244" align="left" border="0" height="164" /&gt;&lt;/a&gt; So the fires continue to burn, as Joel Spolsky&amp;rsquo;s internet access hasn&amp;rsquo;t been disconnected.&amp;nbsp; For someone who is supposed to be an idiot and irrelevant, a lot of people still read and link to him.&amp;nbsp; I guess one guy is corrupting all the new developers, who are assumed to be reading Joel&amp;rsquo;s every word but in reality these developers probably didn&amp;rsquo;t know he existed until all these people linked to him saying he was wrong.&lt;/p&gt;
&lt;p&gt;The lastest outrage seems to be this question on Stack Overflow: &lt;a href="http://stackoverflow.com/questions/871405/why-do-i-need-an-ioc-container-as-opposed-to-straightforward-di-code"&gt;Why do I need an IoC container as opposed to straightforward DI code?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now, before we get into the flames, let&amp;rsquo;s take a moment to actually look at the real question.&amp;nbsp; The use and benefits of &lt;a href="http://en.wikipedia.org/wiki/Dependency_injection"&gt;Dependency Injection&lt;/a&gt; are not in question &amp;ndash; not even by Joel.&amp;nbsp; The author has taken time to use the currently popular IoC and DI frameworks for his platform.&amp;nbsp; He is looking to understand the trade offs involved with using a framework and having to train his co-workers, and increasing the number of project dependencies.&amp;nbsp; Now, Joel&amp;rsquo;s response included:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The most valuable benefit of using an IoC container is that you can have a configuration switch in one place which lets you change between, say, test mode and production mode. For example, suppose you have two versions of your database access classes... one version which logged aggressively and did a lot of validation, which you used during development, and another version without logging or validation that was screamingly fast for production. It is nice to be able to switch between them in one place. On the other hand, this is a fairly trivial problem easily handled in a simpler way without the complexity of IoC containers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Of course, we will ignore this sane and rational portion and focus on the one line zingers like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I&amp;#39;m with you, Vadim. IoC containers take a simple, elegant, and useful concept, and make it something you have to study for two days with a 200-page manual.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I believe that if you use IoC containers, your code becomes, frankly, a lot harder to read. The number of places you have to look at to figure out what the code is trying to do goes up by at least one. And somewhere in heaven an angel cries out.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Never underestimate the power of developers to focus on a leaf in the middle of a forest.&amp;nbsp; In my view, this forest is using a framework versus using a pattern.&amp;nbsp; You could have DI by using &lt;a href="http://ninject.org/"&gt;Ninject&lt;/a&gt; (which I highly recommend to anyone looking for a DI framework), or you could roll your own DI (which I do quite commonly). &lt;/p&gt;
&lt;p&gt;To many, these are mutually exclusive options and that one choice is always better.&amp;nbsp; This violates a core tenet of Agile &amp;ndash; that we embrace change.&amp;nbsp; Each project should have a discussion if a framework is &lt;i&gt;right for that project&lt;/i&gt; and that the decision is &lt;i&gt;not permanent.&lt;/i&gt;&amp;nbsp; This extends beyond DI/IoC to every framework or line of code in the project &amp;ndash; is it better to use an existing solution or roll our own?&amp;nbsp; There is no universal right answer here except &amp;ldquo;&lt;a href="http://nplus1.org/articles/what-does-an-architect-do-it-depends/"&gt;It Depends&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Critical thinking and dissent on your team is a requirement for success.&amp;nbsp; If everyone accepts conventional wisdom (or worse, internet wisdom) without question, you might as hang up a sign that reads &amp;ldquo;because it&amp;rsquo;s always done that way.&amp;rdquo;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=52459" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/vinull/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/opinion/default.aspx">opinion</category></item><item><title>DevLink 2009 – Good News Everyone!</title><link>http://devlicio.us/blogs/vinull/archive/2009/08/17/devlink-2009-good-news-everyone.aspx</link><pubDate>Mon, 17 Aug 2009 18:17:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:50117</guid><dc:creator>Michael C. Neel</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/vinull/rsscomments.aspx?PostID=50117</wfw:commentRss><comments>http://devlicio.us/blogs/vinull/archive/2009/08/17/devlink-2009-good-news-everyone.aspx#comments</comments><description>&lt;p&gt;&lt;a title="DevLink Technical Conference" href="http://devlink.net"&gt;&lt;img style="border-right-width:0px;margin:0px 10px 10px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" alt="image" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vinull/image_5F00_7EF0AB6C.png" width="240" align="left" border="0" height="73" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;DevLink 2009 has come and gone. Thanks to the hard work of &lt;a href="http://twitter.com/johnkellar"&gt;John Kellar&lt;/a&gt; and crew it was once again awesome.&amp;nbsp; John and DevLink were the inspiration for &lt;a href="http://codestock.org"&gt;CodeStock&lt;/a&gt;, and this year managing a 3 Day event with 730+ attendees proved he&amp;rsquo;s still the master and I&amp;rsquo;m the padawan apprentice (whether I&amp;rsquo;m following the light or dark side is a up for debate).&lt;/p&gt;
&lt;p&gt;The conference overall ran smoothly.&amp;nbsp; I would have liked Open Spaces to run all three days instead of just two, but I&amp;rsquo;m an Open Spaces junkie.&amp;nbsp; On the second day the caterers, McAlister&amp;#39;s Deli, brought only 400 boxed lunches and had to go back to get the rest.&amp;nbsp; I still find this amusing and I&amp;rsquo;m smiling as I write this, being a conference organizer I know what it&amp;rsquo;s like to have a vendor drop the ball (at CodeStock, the printers forgot to put logos on the back and I found out the day before the conference).&amp;nbsp; To be clear, it&amp;rsquo;s amusing when it happens to someone else, not to you.&lt;/p&gt;
&lt;p&gt;I had the opportunity to record a great episode of &lt;a href="http://feelthefunc.com"&gt;Feel The Func&lt;/a&gt; with &lt;a href="http://twitter.com/jennifermarsman"&gt;Jennifer Marsman&lt;/a&gt; and &lt;a href="http://twitter.com/brianhprince"&gt;Brian H. Prince&lt;/a&gt;, discussing Azure, Give Camps, and women in technology.&amp;nbsp; Jennifer and Brian are two very passionate Microsoft evangelists, and I&amp;rsquo;m lucky to be located in their region.&amp;nbsp; For Azure, we focused more on the impact and befits of the technology, rather than the implementation to cover the &amp;ldquo;business side&amp;rdquo; of things &amp;ndash; though a podcast of 3 developers can&amp;rsquo;t help but get into some implementation.&lt;/p&gt;
&lt;p&gt;My talk, &lt;a href="http://code.google.com/p/vinull/source/browse/#svn/Presentations/Lucene"&gt;Lucene.Net: Search We Can Believe In&lt;/a&gt;, went much better than in Atlanta.&amp;nbsp; I completely rebuilt the session around the concepts and usage, and focused less on the code &amp;ndash; the opposite of the original talk which took a &amp;ldquo;code first&amp;rdquo; approach.&amp;nbsp; More proof that the talk fits the topic, not the other way around.&lt;/p&gt;
&lt;p&gt;There were several ideas and takeaways I have from the conference, which I keep in a list:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Speaking with &lt;a href="http://twitter.com/alanstevens"&gt;Alan Stevens&lt;/a&gt; and others, an idea emerged for a variation of a GiveCamp where developers gather for a weekend, break into teams, select an open source project and then work on as many bugs / feature list items as they can.&amp;nbsp; FYI, it&amp;rsquo;s quite common when talking with Alan that ideas emerge &amp;ndash; highly recommended. &lt;/li&gt;
&lt;li&gt;I got a number of ideas for handling SIGs (special interest groups) inside of an established user group community.&amp;nbsp; From separate meeting nights to splitting the main meeting night into two parts (main time and SIG breakout time).&amp;nbsp; What was common among all the community that have started SIGs was that both parts &amp;ndash; the main group and the SIG &amp;ndash; grew.&amp;nbsp; It&amp;rsquo;s not a zero sum game. &lt;/li&gt;
&lt;li&gt;I was recommend to check out &lt;a href="http://mybadges.com"&gt;mybadges.com&lt;/a&gt; by more than one person.&amp;nbsp; Anything that makes conference registration better is a win.&amp;nbsp; &lt;a href="http://twitter.com/joshholmes"&gt;Josh Holmes&lt;/a&gt; also described his favorite idea - a &amp;ldquo;tag cloud&amp;rdquo; name badge &amp;ndash; that we will look into for CodeStock 2010. &lt;/li&gt;
&lt;li&gt;I got a good, hands on demo of Live Mesh and it&amp;rsquo;s features by &lt;a href="http://twitter.com/jblankenburg"&gt;Jeff Blankenburg&lt;/a&gt;.&amp;nbsp; Some of the features of Live Mesh can solve some of the issues we have at FuncWorks sharing designer assets (developer use source controls, but designer tools rarely support any form of source control or content sharing). &lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/saraford"&gt;Sara Ford&lt;/a&gt;, Project Manager for &lt;a href="http://www.codeplex.com/"&gt;CodePlex&lt;/a&gt;, held an excellent open space on being an Agile project manager.&amp;nbsp; I was impressed to learn the CodePlex source code is managed on an internal CodePlex site &amp;ndash; the ultimate in dog fooding.&amp;nbsp; Some key takeaways for me was it&amp;rsquo;s easier to add tasks to an interation than remove, so start off lean and that capacity planning is not needed and generally causes more problems than it solves. &lt;/li&gt;
&lt;li&gt;In a lunch chat with &lt;a href="http://twitter.com/darrellhawley"&gt;Darrel Hawley&lt;/a&gt; I learned of the &lt;a href="http://www.learnoutloud.com/Podcast-Directory/Philosophy/History-of-Philosophy/The-Philosophy-Podcast/19669"&gt;The Philosophy Podcast&lt;/a&gt; which covers classic philosophic works and also the meanings and interpretations behind the works and authors.&amp;nbsp; Looking forward to adding this to the podcast rotation. &lt;/li&gt;
&lt;li&gt;In the same lunch, I got the idea that maybe there is a talk I can give based on the book &lt;a href="http://www.amazon.com/Code-Language-Computer-Hardware-Software/dp/0735611319/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1250531180&amp;amp;sr=8-1"&gt;Code: The Hidden Language of Computer Hardware and Software&lt;/a&gt;.&amp;nbsp; This came up because of a joke at a party involving little endian (yes, there were only geeks at the party, why do you ask?) and wondering how many developers would be interested in hearing about the history of code. &lt;/li&gt;
&lt;li&gt;Last, while I didn&amp;rsquo;t manage to record a second podcast with Brian H. Prince on XNA and Creators Club, I got a good deal of feedback on some of our (FuncWorks) current games in development that lead to a much better interface revamp in one game.&amp;nbsp; More on this as I blog more on my time in XNA and 3D. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Looking at the above, you see the great value I had in attending DevLink 2009.&amp;nbsp; The big shows might be great for seeing what a vendor has coming out next and some condensed training, but you can&amp;rsquo;t beat the value of the community conference!&lt;/p&gt;
&lt;p&gt;&lt;i&gt;(ed: The main lobby was named &amp;ldquo;The Farnsworth Lobby&amp;rdquo; which should explain the title).&lt;/i&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=50117" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/vinull/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/conference/default.aspx">conference</category></item><item><title>Game Development going Agile</title><link>http://devlicio.us/blogs/vinull/archive/2009/03/28/game-development-going-agile.aspx</link><pubDate>Sat, 28 Mar 2009 21:49:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:45210</guid><dc:creator>Michael C. Neel</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/vinull/rsscomments.aspx?PostID=45210</wfw:commentRss><comments>http://devlicio.us/blogs/vinull/archive/2009/03/28/game-development-going-agile.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://masseffect.bioware.com/teaser/index.html"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 10px 10px 0px;border-right-width:0px;" alt="image" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vinull/image_5F00_06A81C6E.png" align="left" border="0" height="196" width="244" /&gt;&lt;/a&gt; Game review site Giant Bomb has a &lt;a href="http://www.giantbomb.com/news/gdc-09-mass-effect-2s-evolving-design/1021/"&gt;great article about Mass Effect 2&amp;rsquo;s development process&lt;/a&gt;.&amp;nbsp; The article is written by one of the review staff, who doesn&amp;rsquo;t have development experience, but went to a GDC talk on Bioware&amp;rsquo;s development process to see if he could glean any information on one of the most anticipated titles in development.&amp;nbsp; I can&amp;rsquo;t blame him, I played Mass Effect at least 3 times from start to finish and unlocked every XBox 360 achievement in the game.&amp;nbsp; Still, as great as the game was, it still had some performance issues.&lt;/p&gt;
&lt;p&gt;For the first game, teams went off from the design meetings and implemented their parts separately (level design, art, story, game control, etc), then integrated the pieces into the whole.&amp;nbsp; That was the plan at least:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;That didn&amp;#39;t always happen. If the level was actually playable at the end of this process--and sometimes it wasn&amp;#39;t--it often ran into problems like a significant drop in performance (and the company wasn&amp;#39;t proud of the frame rate drops in the original game). The team tried to address these issues where they popped up, but since doing so required reworking &amp;quot;entire swaths of content,&amp;quot; time and resource constraints meant the designers often had to live with the deficiencies.&lt;/p&gt;
&lt;p&gt;In extreme cases, large pieces of content were removed completely. Caleston, a story-related &amp;quot;outland&amp;quot; planet with refineries and industrial cartels that was intended to be a part of the game&amp;#39;s core story arc, was deleted from the game outright. We will never get that planet back, people. Shed a tear.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sound familiar?&amp;nbsp; In the world of business application development this same problem exists.&amp;nbsp; Teams struggle with integration issues and spend large amounts of time rewriting existing code instead of adding new features.&amp;nbsp; In the worst cases, planned features are cut to meet budgets and deadlines. (To get a since of what it much have been like to cut Caleston consider the planet was &lt;a href="http://www.youtube.com/watch?v=rY2Vpcm8CYM"&gt;mentioned in a TV ad&lt;/a&gt; prior to game release.)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In Mass Effect 2, BioWare is using a linear, phased approach to level design that builds the levels step by step, starting with only the most important parts. This method has a couple of primary requirements: from the very outset, always keep your levels playable, and always keep them at target performance. The designers should only do the minimum of necessary work to answer the important questions about each level, most of which amount to &amp;quot;Can you still see how this will be fun when it&amp;#39;s finished?&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It sounds like Bioware has welcomed the &lt;a href="http://vinull.com/Post/2008/03/31/presentation-welcome-to-the-church-of-a.aspx"&gt;Church of Agile&lt;/a&gt;.&amp;nbsp; They have shortened iterations, and made sure each iteration results in a running (though not complete) application.&amp;nbsp; They established a definition of quality (the game must run at 30 frames per second), and measure the quality each iteration instead of a final round of performance tuning.&amp;nbsp; Finally, at the end of each iteration they have a point for feedback to enter into the development process, keeping themselves on target.&lt;/p&gt;
&lt;p&gt;Game development differs from business application development in many ways.&amp;nbsp;&amp;nbsp;&amp;nbsp; Performance truly is king and a game dev may write code considered bad form to a business dev.&amp;nbsp; Games have a fixed life cycle; once released there is no new development.&amp;nbsp; This is the opposite of the business apps that are constantly updated and once updates to the application stop it probably means people have stopped using the app.&amp;nbsp; While business apps only need to target a handful of (mostly similar) platforms, games target a wide range of highly specialized platforms.&lt;/p&gt;
&lt;p&gt;Differences aside however, it is comforting to see that the same Agile methodology, culture, and process can work for both. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=45210" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/vinull/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/process/default.aspx">process</category></item><item><title>CodeStock 2009 “Call for Speakers” is Open</title><link>http://devlicio.us/blogs/vinull/archive/2009/02/19/codestock-2009-call-for-speakers-is-open.aspx</link><pubDate>Thu, 19 Feb 2009 18:16:08 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:44389</guid><dc:creator>Michael C. Neel</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/vinull/rsscomments.aspx?PostID=44389</wfw:commentRss><comments>http://devlicio.us/blogs/vinull/archive/2009/02/19/codestock-2009-call-for-speakers-is-open.aspx#comments</comments><description>&lt;p&gt;&lt;a title="CodeStock 2009" href="http://codestock.org"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 10px 10px 0px;border-right-width:0px;" height="155" alt="image" src="http://devlicio.us/blogs/vinull/image_715F1D0C.png" width="260" align="left" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The CodeStock 2009 Call for Speakers is open, details at &lt;a title="CodeStock 2009" href="http://codestock.org"&gt;CodeStock.org&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;To make this year’s event bigger and better we’ve expanded the conference to a two-day event, June 26 and 27, 2009 in Knoxville, TN.&amp;#160; Day one will be comprised of extended deep dive and back-to-basics sessions followed by day two of regular sessions.&amp;#160; We will also expand the room for Open Spaces sessions, led by &lt;a href="http://netcave.org/"&gt;Alan Stevens&lt;/a&gt; (check out &lt;a title="Alan on .Net Rocks talking about Open Spaces" href="http://www.dotnetrocks.com/default.aspx?showNum=420"&gt;Alan on .Net Rocks talking about Open Spaces&lt;/a&gt; along side a traditional conference).&lt;/p&gt;  &lt;p&gt;This year we are also going to try out letting attendees select speakers, part of the “We Want You” theme.&amp;#160; When registrations opens in March 31st (or shortly after), those who register before May 15th will be able to cast votes for the session and speakers they would like to see.&amp;#160; The vote tallies will be used by the CodeStock Planning Committee in selecting speakers.&lt;/p&gt;  &lt;p&gt;If you are interested in speaking, please submit an application.&amp;#160; If you want to stay up to date on CodeStock info, follow us at &lt;a href="http://twitter.com/codestock"&gt;http://twitter.com/codestock&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=44389" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/vinull/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/conference/default.aspx">conference</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/speaking/default.aspx">speaking</category></item><item><title>ASP.NET SEO Interview on Polymorphic Podcast</title><link>http://devlicio.us/blogs/vinull/archive/2008/10/13/asp-net-seo-interview-on-polymorphic-podcast.aspx</link><pubDate>Tue, 14 Oct 2008 01:05:37 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:42663</guid><dc:creator>Michael C. Neel</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/vinull/rsscomments.aspx?PostID=42663</wfw:commentRss><comments>http://devlicio.us/blogs/vinull/archive/2008/10/13/asp-net-seo-interview-on-polymorphic-podcast.aspx#comments</comments><description>&lt;p&gt;&lt;a title="phone_book by How can I recycle this" href="http://flickr.com/photos/recyclethis/186838960/"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;margin:0px 10px 10px 0px;border-right-width:0px;" height="244" alt="image" src="http://devlicio.us/blogs/vinull/WindowsLiveWriter/ASP.NETSEOInterviewonPolymorphicPodcast_120EA/image_3.png" width="194" align="left" border="0" /&gt;&lt;/a&gt; &lt;a href="http://weblogs.asp.net/craigshoemaker"&gt;Craig Shoemaker&lt;/a&gt; just posted the latest episode of the Polymorphic Podcast: &lt;a href="http://polymorphicpodcast.com/shows/aspnetseo/"&gt;ASP.NET SEO - Interview with Michael Neel&lt;/a&gt;.&amp;#160; Yes, I&amp;#39;ve now appeared in a podcast that I didn&amp;#39;t have a hand in recording!&lt;/p&gt;  &lt;p&gt;Even if you don&amp;#39;t listen to the show (and you should, Craig does an awesome job) check out the show notes.&amp;#160; SEO - or Search Engine Optimization - is one of those areas developers tend to overlook or outright ignore.&amp;#160; I think this is partly because it&amp;#39;s not something we think about when knee deep in site code, but also because there is a stigma attached to SEO that it is dirty marketing stuff.&amp;#160; Truth is, a good design for SEO is also a good design for users and helps more people find what they need (I was glad to see &lt;a href="http://www.codinghorror.com/blog/archives/001174.html"&gt;StackOverflow realize the sitemap protocol&lt;/a&gt; is very helpful). &lt;/p&gt;  &lt;p&gt;One thing I mention at the end of the podcast (at least I think it&amp;#39;s the end - I haven&amp;#39;t listened to it yet!) was the new support from System.Web.Routing to handle some of the code I have written myself in mapping urls to content.&amp;#160; &lt;a href="http://morewally.com/cs/Default.aspx"&gt;Wally McClure&lt;/a&gt; has just recently posted an &lt;a href="http://aspnetpodcast.com/CS11/blogs/asp.net_podcast/archive/2008/10/07/asp-net-podcast-show-125-routing-with-webforms.aspx"&gt;ASP.NET Podcast on Routing with WebForms&lt;/a&gt; that explains the new API.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=42663" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/vinull/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/sitemap/default.aspx">sitemap</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/seo/default.aspx">seo</category></item><item><title>Finding the difference between two Arrays, or un-LINQ-ing your code</title><link>http://devlicio.us/blogs/vinull/archive/2008/10/03/finding-the-difference-between-two-arrays-or-un-linq-ing-your-code.aspx</link><pubDate>Fri, 03 Oct 2008 21:24:12 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:42569</guid><dc:creator>Michael C. Neel</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/vinull/rsscomments.aspx?PostID=42569</wfw:commentRss><comments>http://devlicio.us/blogs/vinull/archive/2008/10/03/finding-the-difference-between-two-arrays-or-un-linq-ing-your-code.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://flickr.com/photos/yukonblizzard/2747572293/"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;margin:0px 10px 10px 0px;border-right-width:0px;" height="163" alt="image" src="http://devlicio.us/blogs/vinull/WindowsLiveWriter/FindingthedifferencebetweentwoArraysorun_E93F/image_3.png" width="244" align="left" border="0" /&gt;&lt;/a&gt;LINQ is great, up to the point when it&amp;#39;s not.&amp;#160; Then it&amp;#39;s really not great at all.&amp;#160; When we trade simplicity of syntax for performance, we have to keep in mind there may come a point when we have to go back the code and factor out the shiny new toys.&lt;/p&gt;  &lt;p&gt;My system is complex, but this task is simple.&amp;#160; I have about 95,000 video files to keep track of in a database.&amp;#160; Try as we might, at some point someone is going to make changes, add or remove files, without going through our software, so a periodic file audit is required.&lt;/p&gt;  &lt;p&gt;I have two lists of file names, one is the list as it exists in the database, the other as it exists on disk.&amp;#160; This is greatly simplified, but the initial idea was something like this:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span&gt;List&lt;/span&gt;&amp;lt;&lt;span&gt;String&lt;/span&gt;&amp;gt; toAdd = (&lt;span&gt;from&lt;/span&gt; f &lt;span&gt;in&lt;/span&gt; existingFiles
                      &lt;span&gt;where&lt;/span&gt; !indexedFiles.Contains(f)
                      &lt;span&gt;select&lt;/span&gt; f).ToList();

&lt;span&gt;List&lt;/span&gt;&amp;lt;&lt;span&gt;String&lt;/span&gt;&amp;gt; toRemove = (&lt;span&gt;from&lt;/span&gt; f &lt;span&gt;in&lt;/span&gt; indexedFiles
                         &lt;span&gt;where&lt;/span&gt; !existingFiles.Contains(f)
                         &lt;span&gt;select&lt;/span&gt; f).ToList();&lt;/pre&gt;

&lt;p&gt;The power of LINQ, short and sweet.&amp;#160; Sadly, it appears to act like this under the hood:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span&gt;List&lt;/span&gt;&amp;lt;&lt;span&gt;String&lt;/span&gt;&amp;gt; toAdd = &lt;span&gt;new&lt;/span&gt; &lt;span&gt;List&lt;/span&gt;&amp;lt;&lt;span&gt;String&lt;/span&gt;&amp;gt;();
&lt;span&gt;foreach&lt;/span&gt; (&lt;span&gt;String&lt;/span&gt; f &lt;span&gt;in&lt;/span&gt; existingFiles)
    &lt;span&gt;if&lt;/span&gt; (!indexedFiles.Contains(f))
        toAdd.Add(f);

&lt;span&gt;List&lt;/span&gt;&amp;lt;&lt;span&gt;String&lt;/span&gt;&amp;gt; toRemove = &lt;span&gt;new&lt;/span&gt; &lt;span&gt;List&lt;/span&gt;&amp;lt;&lt;span&gt;String&lt;/span&gt;&amp;gt;();
&lt;span&gt;foreach&lt;/span&gt; (&lt;span&gt;String&lt;/span&gt; f &lt;span&gt;in&lt;/span&gt; indexedFiles)
    &lt;span&gt;if&lt;/span&gt; (!existingFiles.Contains(f))
        toRemove.Add(f);&lt;/pre&gt;

&lt;p&gt;These statements pegged the CPU for minutes at a time - can you see why?&amp;#160; How many times am I looping through each collection of strings?&amp;#160; Twice? Four times?&amp;#160; No, I&amp;#39;m afraid this is classic &amp;quot;Oh 2 Da N&amp;quot; performance here.&amp;#160; The problems lies in using the Contains() method - this method must search through the collection each time it&amp;#39;s called, which is often.&amp;#160; To solve this, we&amp;#39;ll have to kick it old school C-style:&lt;/p&gt;

&lt;pre class="code"&gt;indexedFiles.Sort();
existingFiles.Sort();

&lt;span&gt;for&lt;/span&gt; (&lt;span&gt;int&lt;/span&gt; iE = 0, iI = 0; iE &amp;lt; existingFiles.Count || iI &amp;lt; indexedFiles.Count; ) {
    &lt;span&gt;if&lt;/span&gt; (iE &amp;gt;= existingFiles.Count) {
        toRemove.Add(indexedFiles[iI]);
        iI++;
    }
    &lt;span&gt;else&lt;/span&gt; &lt;span&gt;if&lt;/span&gt; (iI &amp;gt;= indexedFiles.Count) {
        toAdd.Add(existingFiles[iE]);
        iE++;
    }
    &lt;span&gt;else&lt;/span&gt; {
        &lt;span&gt;Int32&lt;/span&gt; diff = existingFiles[iE].CompareTo(indexedFiles[iI]);
        &lt;span&gt;if&lt;/span&gt; (diff == 0) {
            iE++;
            iI++;
        }
        &lt;span&gt;else&lt;/span&gt; &lt;span&gt;if&lt;/span&gt; (diff &amp;gt; 0) {
            toRemove.Add(indexedFiles[iI]);
            iI++;
        }
        &lt;span&gt;else&lt;/span&gt; &lt;span&gt;if&lt;/span&gt; (diff &amp;lt; 0) {
            toAdd.Add(existingFiles[iE]);
            iE++;
        }
    }
}&lt;/pre&gt;

&lt;p&gt;A quick sort of the lists and we can make some time saving assumptions as well as walk through both lists at the same time (.Net had no trouble sorting lists of 95,000 strings in record breaking time).&amp;#160; We start off comparing the strings at index 0 of each list (the first &lt;em&gt;if&lt;/em&gt; and &lt;em&gt;else if&lt;/em&gt; will be false - I&amp;#39;ll come back to those shortly).&amp;#160; If they match, then the file both exists and is indexed - go to the next file in both lists.&amp;#160; If the existing string is greater than the index string, then we know the file no longer exists (remember, lists are sorted).&amp;#160; In this case only advance the index list to see if it &amp;quot;catches up&amp;quot; with the existing list.&amp;#160; If the existing string is less than the index string, the reverse is done.&amp;#160; If we run out of existing list before we finish the index list, those files no longer exist - which is what the first &lt;em&gt;if&lt;/em&gt; statement handles (the first &lt;em&gt;else if&lt;/em&gt; handles the other case for running out of index list first).&lt;/p&gt;

&lt;p&gt;If you have to work through this for loop on scratch paper, don&amp;#39;t feel bad - I did.&amp;#160; It&amp;#39;s been a very long time since I&amp;#39;ve had to get this &amp;quot;raw&amp;quot; with my code.&amp;#160; It was worth it as the performance went from several minutes at 100% CPU to so fast I couldn&amp;#39;t believe it had run.&lt;/p&gt;

&lt;p&gt;I googled a bit to see if there were other solutions out there, and more importantly some method in the .Net framework that would solve this issue and came up empty.&amp;#160; I&amp;#39;m not convinced there isn&amp;#39;t something in the bazillion methods living in the framework, so if you know of something, please let me know!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=42569" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/vinull/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/algorithm/default.aspx">algorithm</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/array/default.aspx">array</category></item><item><title>ORM talk at CodeStock Open Spaces</title><link>http://devlicio.us/blogs/vinull/archive/2008/08/14/orm-talk-at-codestock-open-spaces.aspx</link><pubDate>Fri, 15 Aug 2008 02:18:29 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:41846</guid><dc:creator>Michael C. Neel</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/vinull/rsscomments.aspx?PostID=41846</wfw:commentRss><comments>http://devlicio.us/blogs/vinull/archive/2008/08/14/orm-talk-at-codestock-open-spaces.aspx#comments</comments><description>&lt;p&gt;One thing I&amp;#39;m hearing from a lot of people who attended &lt;a href="http://codestock.org/"&gt;CodeStock&lt;/a&gt; last Saturday is how well the open spaces &amp;quot;track&amp;quot; was.&amp;#160; This is one area I can&amp;#39;t take any credit for, my only role in planning open spaces was requesting a room from the college; all credit for success goes to &lt;a href="http://netcave.org/"&gt;Alan Stevens&lt;/a&gt; the facilitator.&lt;/p&gt;  &lt;p&gt;An Open Spaces conference is explained as the &amp;quot;un-conference&amp;quot; - a very hippy, free flowing conference where the sessions self organize and the topics are chosen by the attendees.&amp;#160; This in contrast to a traditional conference of set speakers and topics.&amp;#160; Each have an advantage; an open space isn&amp;#39;t the best place to get a first look at a technology but once you&amp;#39;ve used a technology an open space is a great place to discuss with others how it should be used.&lt;/p&gt;  &lt;p&gt;Rather than choose one format, CodeStock featured both.&amp;#160; This worked out better than I could have imagined because it mixed two camps - the open space people hung out with the &amp;quot;straight laced&amp;quot; conference people.&amp;#160; This created a stage for some great conversations with all views represented and an exchange of ideas can commence.&amp;#160; &lt;a href="http://morewally.com/"&gt;Wally McClure&lt;/a&gt; was breaking in a new Flip, and managed to capture an ORM discussion for &lt;a href="http://aspnetpodcast.com/CS11/blogs/asp.net_podcast/archive/2008/08/15/asp-net-podcast-show-122-codestock-openspaces-discussion-regarding-orm.aspx"&gt;the latest ASP.NET Podcast&lt;/a&gt; - I would have &lt;a href="http://www.vinull.com/Post/2008/06/27/youll-have-my-sql-when-you-pry-my-keybo.aspx"&gt;loved&lt;/a&gt; to have been there, but I was &lt;a href="http://www.vinull.com/Post/2008/08/11/poststock.aspx"&gt;fighting gnats&lt;/a&gt; at the time.&lt;/p&gt;  &lt;p align="center"&gt;&lt;embed name="MediaPlayer" src="http://www.aspnetpodcast.com/VideoFiles/ASPNETPodcast20080813-CodeStockOpenSpacesORM.wmv" width="320" height="240" type="application/x-mplayer2" /&gt; &lt;/p&gt;  &lt;p align="center"&gt;More video formats available at &lt;a href="http://aspnetpodcast.com/CS11/blogs/asp.net_podcast/archive/2008/08/15/asp-net-podcast-show-122-codestock-openspaces-discussion-regarding-orm.aspx"&gt;ASP.NET Podcast&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=41846" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/vinull/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/session/default.aspx">session</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/conference/default.aspx">conference</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/orm/default.aspx">orm</category></item><item><title>Using LINQ to generate HTML</title><link>http://devlicio.us/blogs/vinull/archive/2008/08/03/using-linq-to-generate-html.aspx</link><pubDate>Sun, 03 Aug 2008 17:55:20 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:41644</guid><dc:creator>Michael C. Neel</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/vinull/rsscomments.aspx?PostID=41644</wfw:commentRss><comments>http://devlicio.us/blogs/vinull/archive/2008/08/03/using-linq-to-generate-html.aspx#comments</comments><description>&lt;p&gt;&lt;a title="Balancing on the Invisible by Drew Brayshaw" href="http://flickr.com/photos/druclimb/325661568/"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;margin:0px 10px 10px 0px;border-right-width:0px;" height="244" alt="image" src="http://devlicio.us/blogs/vinull/WindowsLiveWriter/UsingLINQtogenerateHTML_B00E/image_3.png" width="165" align="left" border="0" /&gt;&lt;/a&gt; I hate seeing code mixed with markup.&lt;/p&gt;  &lt;p&gt;Seeing a template page with &lt;code&gt;&amp;lt;% if(show) { %&amp;gt;&lt;/code&gt; makes me want to claw my eyes out.&amp;#160; Seeing &lt;code&gt;String htmlTitle = &amp;quot;&amp;lt;h1&amp;gt;&amp;quot; + title + &amp;quot;&amp;lt;/h1&amp;gt;&amp;quot;&lt;/code&gt; causes me to vomit up a little something in my throat.&lt;/p&gt;  &lt;p&gt;Mixing code with markup is not a magic chocolate and peanut butter combination - it&amp;#39;s a volatile cocktail of vinegar and baking soda waiting to explode your application to tiny Server 500 Error giblets.&lt;/p&gt;  &lt;p&gt;The time comes however when we find ourselves needing to generate some well formed HTML in code, and I found myself in just such a position last night adding the agenda to the &lt;a href="http://CodeStock.org"&gt;CodeStock&lt;/a&gt; website. (Less than one week away now!)&lt;/p&gt;  &lt;p&gt;Background: On the CodeStock site, the speakers and sessions list lives in an XML file.&amp;#160; The agenda page has a grid of session times and my task was to fill in each session &amp;quot;cell&amp;quot; with the session planned for that room and time.&amp;#160; I wanted to link to the full session and also list the speaker&amp;#39;s name in the cell.&amp;#160; In the XML I have created Key elements that are used as HTML anchors in a link to a session.&amp;#160; It&amp;#39;s all very low tech, simplistic goodness.&amp;#160; An example of the XML for a speaker:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Speaker&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Key&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Brownell&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Key&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Steve Brownell&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Website&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;http://enthusiasticprogramming.blogspot.com&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Website&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Photo&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;~/Speakers/SteveBrownell.png&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Photo&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Bio&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &lt;/span&gt;Steve is the manager for research and development at AllMeds in Oak Ridge, TN.  Steve
        has been programming one thing or another for over twenty years.  AllMeds makes and
        sells a commercial software product which is an electronic medical record system.  We&amp;#39;ve
        been .NET based since 2000.  AllMeds is a VB.NET shop at heart, but the AllMeds system spans
        many areas of Windows development.
    &lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Bio&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Session&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Key&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Hobbled&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Key&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Title&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &lt;/span&gt;The Hobbled:  There And Back Again, or Code Automation:  how I made it from the
            presentation layer to the database and back.
        &lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Title&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Abstract&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &lt;/span&gt;Stop writing code, and start writing code that writes code.  There&amp;#39;s never been more
            choices to help you automate the creation of the data object layers immediately above
            the database.  Writing class factories and data access classes is boring, time consuming
            and wastes valuable time with expensive developer resources.  This course will examine
            two current approaches:  using a template engine and programming with the CODEDOM.  We&amp;#39;ll
            also briefly discuss other ORM techniques like LINQ to SQL Classes.
        &lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Abstract&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Level&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;200&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Level&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Technology&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;VB.NET, C#, LINQ, SQL&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Technology&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Session&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Speaker&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;(Steve was our CodeStock Speaker Idol winner, and I enjoyed seeing System.Codedom in action; something I&amp;#39;ll be playing with and posting on in the future thanks to Steve!)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;LINQ to XML, and the new &amp;quot;X&amp;quot; classes that come with it make working with XML as easy as it should have always been.&amp;#160; Armed with LINQ, I decided that putting &amp;lt;%= SessionInfo(&amp;quot;Hobbled&amp;quot;) %&amp;gt; was something I could live with (had this been a larger site that needed to live longer than August 9th, I would have opted for a user control &amp;lt;CodeStock:SessionInfo Key=&amp;quot;Hobbled&amp;quot;/&amp;gt;).&amp;#160; My first LINQ expression looked something like the following:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;info = (&lt;span style="color:blue;"&gt;from &lt;/span&gt;s &lt;span style="color:blue;"&gt;in &lt;/span&gt;speakers.Descendants(&lt;span style="color:#a31515;"&gt;&amp;quot;Session&amp;quot;&lt;/span&gt;)
            &lt;span style="color:blue;"&gt;where &lt;/span&gt;s.Element(&lt;span style="color:#a31515;"&gt;&amp;quot;Key&amp;quot;&lt;/span&gt;).Value.Equals(SessionKey)
            &lt;span style="color:blue;"&gt;select new &lt;/span&gt;{
                key = s.Element(&lt;span style="color:#a31515;"&gt;&amp;quot;Key&amp;quot;&lt;/span&gt;).Value,
                title = s.Element(&lt;span style="color:#a31515;"&gt;&amp;quot;Title&amp;quot;&lt;/span&gt;).Value.Trim(),
                speaker = s.Parent.Element(&lt;span style="color:#a31515;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;).Value
            }).First();&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;This yields a very useful info object with just the information I need.&amp;#160; *If* I was in a hurry, and didn&amp;#39;t mind a little vomit, I would follow on with the following:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;String &lt;/span&gt;hmtl = &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;lt;a href=&amp;#39;{0:s}&amp;#39; title=&amp;#39;{1:s}&amp;#39;&amp;gt;{2:s}&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;{3:s}&amp;quot;&lt;/span&gt;,
    &lt;span style="color:blue;"&gt;new object&lt;/span&gt;[] { ExpandURL(&lt;span style="color:#a31515;"&gt;&amp;quot;~/Pages/Agenda.aspx&amp;quot;&lt;/span&gt;, info.key),
                   info.title,
                   info.title.Length &amp;gt; 30 ? info.title.Substring(0, 27) + &lt;span style="color:#a31515;"&gt;&amp;quot;...&amp;quot; &lt;/span&gt;: info.title,
                   info.speaker });&lt;/pre&gt;

&lt;p&gt;Why do I despise this so much?&amp;#160; It&amp;#39;s not easy to read, and it can become cumbersome to change.&amp;#160; ASP.NET has a collection of server controls just for generating HTML, intended for use in user controls but they are not limited to user controls alone.&amp;#160; To generate the html above would look something like this:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;HtmlAnchor &lt;/span&gt;aHref = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;HtmlAnchor&lt;/span&gt;() {
    HRef = ExpandURL(&lt;span style="color:#a31515;"&gt;&amp;quot;~/Pages/Agenda.aspx&amp;quot;&lt;/span&gt;, info.key),
    InnerText = info.title.Length &amp;gt; 30 ? info.title.Substring(0, 27) + &lt;span style="color:#a31515;"&gt;&amp;quot;...&amp;quot; &lt;/span&gt;: info.title,
    Title = Title
};
&lt;span style="color:#2b91af;"&gt;HtmlGenericControl &lt;/span&gt;div = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;HtmlGenericControl&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;div&amp;quot;&lt;/span&gt;) {
    InnerText = info.speaker
};

&lt;span style="color:#2b91af;"&gt;StringBuilder &lt;/span&gt;html = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;StringBuilder&lt;/span&gt;();
&lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;StringWriter &lt;/span&gt;sw = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;StringWriter&lt;/span&gt;(html)) {
    &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;HtmlTextWriter &lt;/span&gt;hw = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;HtmlTextWriter&lt;/span&gt;(sw)) {
        aHref.RenderControl(hw);
        div.RenderControl(hw);
        hw.Close();
    }
    sw.Close();
}&lt;/pre&gt;

&lt;p&gt;There are times when working with parts of the .Net framework I have wonder if some Java types didn&amp;#39;t design the class.&amp;#160; The mess here to render the HTML is one of those times.&amp;#160; The lack of a RenderControl that returns a String is the problem - thankfully we now have extension methods to fix the framework, but that&amp;#39;s another post.&amp;#160; No matter how much I hate markup in the code, I cannot endorse this version over the vomit inducing first solution.&lt;/p&gt;

&lt;p&gt;It occurs to me that HTML is (or was once) fundamentally XML, and I can return XML from my LINQ expression.&amp;#160; In fact, this is what LINQ is about - not just getting the data you want, but getting it in the format you need.&amp;#160; Here is the new LINQ query:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;XElement &lt;/span&gt;info = (&lt;span style="color:blue;"&gt;from &lt;/span&gt;s &lt;span style="color:blue;"&gt;in &lt;/span&gt;speakers.Descendants(&lt;span style="color:#a31515;"&gt;&amp;quot;Session&amp;quot;&lt;/span&gt;)
                 &lt;span style="color:blue;"&gt;where &lt;/span&gt;s.Element(&lt;span style="color:#a31515;"&gt;&amp;quot;Key&amp;quot;&lt;/span&gt;).Value.Equals(SessionKey)
                 &lt;span style="color:blue;"&gt;let &lt;/span&gt;key = s.Element(&lt;span style="color:#a31515;"&gt;&amp;quot;Key&amp;quot;&lt;/span&gt;).Value
                 &lt;span style="color:blue;"&gt;let &lt;/span&gt;title = s.Element(&lt;span style="color:#a31515;"&gt;&amp;quot;Title&amp;quot;&lt;/span&gt;).Value.Trim()
                 &lt;span style="color:blue;"&gt;let &lt;/span&gt;shortTitle = title.Length &amp;gt; 30 ? 
                    title.Substring(0, 27) + &lt;span style="color:#a31515;"&gt;&amp;quot;...&amp;quot; &lt;/span&gt;: title
                 &lt;span style="color:blue;"&gt;let &lt;/span&gt;session = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XElement&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;,
                              &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XAttribute&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;href&amp;quot;&lt;/span&gt;,
                                  ExpandURL(&lt;span style="color:#a31515;"&gt;&amp;quot;~/Pages/Agenda.aspx&amp;quot;&lt;/span&gt;, key)),
                              &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XAttribute&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;title&amp;quot;&lt;/span&gt;, title),
                              shortTitle)
                 &lt;span style="color:blue;"&gt;let &lt;/span&gt;speaker = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XElement&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;div&amp;quot;&lt;/span&gt;, s.Parent.Element(&lt;span style="color:#a31515;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;).Value)
                 &lt;span style="color:blue;"&gt;select new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XElement&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;span&amp;quot;&lt;/span&gt;, session, speaker)).First();&lt;/pre&gt;

&lt;p&gt;This may not seem to some as better.&amp;#160; I myself have trouble looking at most LINQ expressions, but as I&amp;#39;m learning to &lt;a href="http://www.thinqlinq.com/"&gt;Thinq Linq&lt;/a&gt; I&amp;#39;m seeing that writing the LINQ expression is where the power lies, not in the syntax.&amp;#160; The mental dialog goes something like this:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&amp;quot;Okay, from my list of speakers I want a session where the session&amp;#39;s key matches SessionKey.&amp;#160; Now, let me grab some fields I need, first the key, then the title which I need to trim off excess whitespace, then let&amp;#39;s make a short version of that title since Steve&amp;#39;s title is so long - love that title though.&amp;#160; I&amp;#39;ll need an link tag for the session; set the href and title attributes, and then add the speaker&amp;#39;s name in a div tag so I get a cheap line break.&amp;#160; I&amp;#39;m really in XML not HTML, so I&amp;#39;ll need a root node and a span tag will work without affecting layout, and I&amp;#39;ll add the link and div tags as children.&amp;quot;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Writing LINQ like this I feel much closer to the problem I&amp;#39;m trying to solve, and not bogged down by syntax.&amp;#160; There is still some moments I&amp;#39;m thrust back to code, such as the use of First() to select only one result.&amp;#160; I&amp;#39;d like to have a &amp;quot;select first&amp;quot; option in LINQ expressions instead of just the extension methods.&amp;#160; &lt;/p&gt;

&lt;p&gt;Is this something I&amp;#39;ll be using now every time I have this problem?&amp;#160; Not sure yet, but it&amp;#39;s another &amp;quot;tool in the box&amp;quot; I&amp;#39;ll keep around and use when it feels right.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=41644" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/vinull/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>The ASP.NET MVC Definition</title><link>http://devlicio.us/blogs/vinull/archive/2008/07/26/the-asp-net-mvc-definition.aspx</link><pubDate>Sat, 26 Jul 2008 16:35:38 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:41475</guid><dc:creator>Michael C. Neel</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/vinull/rsscomments.aspx?PostID=41475</wfw:commentRss><comments>http://devlicio.us/blogs/vinull/archive/2008/07/26/the-asp-net-mvc-definition.aspx#comments</comments><description>&lt;p&gt;&lt;a title="Luminous Idea by Tiago Daniel" href="http://flickr.com/photos/bazik/395792175/"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;margin:0px 10px 10px 0px;border-right-width:0px;" height="244" alt="image" src="http://devlicio.us/blogs/vinull/WindowsLiveWriter/TheASP.NETMVCDefinition_AAE1/image_3.png" width="189" align="left" border="0" /&gt;&lt;/a&gt; A few days ago I &lt;a href="http://www.vinull.com/Post/2008/07/25/the-mvc-minefield.aspx"&gt;posted a question to the community, looking for a definition of the ASP.NET MVC framework&lt;/a&gt; that didn&amp;#39;t depend upon faults in ASP.NET WebForms - after all, faults can be fixed.&amp;#160; I also do not like the implication that ASP.NET MVC is for those looking to use the MVC pattern, as I&amp;#39;ve been using that pattern for a decade and I use it in WebForms today.&amp;#160; Credit goes to &lt;a href="http://devlicio.us/blogs/vinull/archive/2008/07/25/the-mvc-minefield.aspx#41465"&gt;Lucas Goodwin&lt;/a&gt; for helping me with the following definition:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;ASP.NET MVC is the evolution of Classic ASP.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I&amp;#39;ve helped a number of developers move from Classic ASP to ASP.NET, and each one has said to me, &amp;quot;wow, this is nothing like ASP&amp;quot; once they groked it.&amp;#160; This is true, and mostly because WebForms introduced an event based paradigm to ASP.&amp;#160; Classic ASP had problems, but was the lack of events one of them?&lt;/p&gt;  &lt;p&gt;Classic ASP&amp;#39;s number one problem was lack of separation of concerns.&amp;#160; This is the same reason I don&amp;#39;t like PHP, my code is far to friendly with my HTML (&lt;em&gt;&lt;a href="http://www.youtube.com/watch?v=yJQFf0qj9Nk"&gt;gotta keep em&amp;#39; separated&lt;/a&gt;&lt;/em&gt;).&amp;#160; True you can discipline yourself to provide a separation, but it&amp;#39;s not something the framework designers gave much thought to.&lt;/p&gt;  &lt;p&gt;WebForms fixed the separation issue, but at the same time brought in the event model.&amp;#160; I liked this &amp;quot;magic controller&amp;quot; approach, because it saves me the time I used to spend wiring up controllers that just ended up back at the same template I started with.&amp;#160; (For the record, I was mostly working with python before moving to WebForms, first with a framework called Albatross and later SnakeSkin)&amp;#160; An event model is not required to have separation of concerns, and this forced an event model on to many Classic ASP developers.&amp;#160; So I will add a bit to the definition:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;ASP.NET MVC is the evolution of Classic ASP, adding an easier separation of concerns while not using an event based model like WebForms.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So do you agree or disagree?&amp;#160; I like this definition because it&amp;#39;s not claiming either approach is better, and I can look to the pros and cons of an event based model to guide me in selecting MVC or WebForms for a project.&amp;#160; It also is less likely to cause rioting in the streets at your next user group meeting when the topic comes up!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=41475" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/vinull/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/opinion/default.aspx">opinion</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/mvc/default.aspx">mvc</category></item><item><title>The MVC Minefield</title><link>http://devlicio.us/blogs/vinull/archive/2008/07/25/the-mvc-minefield.aspx</link><pubDate>Fri, 25 Jul 2008 04:22:24 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:41448</guid><dc:creator>Michael C. Neel</dc:creator><slash:comments>14</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/vinull/rsscomments.aspx?PostID=41448</wfw:commentRss><comments>http://devlicio.us/blogs/vinull/archive/2008/07/25/the-mvc-minefield.aspx#comments</comments><description>&lt;p&gt;There is a bit of turbulence in the ASP.NET airspace over MVC (yes, I&amp;#39;m making this post while on the fight back from the ASPInsiders Summit).&amp;#160; Even among the ASPInsiders, who are supposed to be at the cutting edge of ASP.NET, there is little agreement over what is MVC and what it&amp;#39;s for.&lt;/p&gt;  &lt;p&gt;MVC, or Model View Controller, is an age old pattern found in many places.&amp;#160; ASP.NET providers follow the pattern, as does Service Oriented Architecture.&amp;#160; The general idea to have some code called a Model that works with your data storage, other code called a View that displays the data, and last plumbing code that ties these two together, called the Controller.&amp;#160; I call it a pattern because implementations differ in the details - the View may render a button, but when the user clicks that button should the click action be handled by the View or Controller?&amp;#160; The Model and View should know nothing of each other, but is the Controller allowed to be tightly coupled to them both?&amp;#160; (If your first thought above was the Controller should handle the button action, think now what this means about being loosely coupled between the View and Controller). &lt;/p&gt;  &lt;p&gt;ASP.NET MVC is a framework in development that is intended to closely match the MVC pattern.&amp;#160; The minefield lies in answering the pragmatic question of what does ASP.NET MVC offer over WebForms, and when would you use MVC?&amp;#160; In taking with those excited by MVC the reasons range from supporting TDD, clean URLs and avoiding postbacks by sending actions to a controller, better control over HTML output (including getting rid of ViewState), and being closer to the http protocol.&lt;/p&gt;  &lt;p&gt;TDD, or Test Driven Development, will always come up in any ASP.NET MVC conversation, but TDD itself isn&amp;#39;t an explicit part of MVC.&amp;#160; The MVC pattern is very amendable to TDD however, and thus the association.&amp;#160; I generally support testable code even if there are no tests around the code.&amp;#160; Testable code is much easier to maintain, enhance, refractor, and replace.&amp;#160; I don&amp;#39;t find the process of test-first development helpful, but I do write tests in the same session as the code when I know I&amp;#39;m writing some critical piece of functionality that needs to survive multiple versions of the software.&amp;#160; As Hanselman noted, I&amp;#39;m like the &amp;quot;person who goes to church on Easter and Christmas&amp;quot; and I&amp;#39;m sometimes looked down upon by the congregation who attend weekly.&amp;#160; I&amp;#39;m okay with this, but I have some reservations with MVC as a framework for TDD.&lt;/p&gt;  &lt;p&gt;To say you cannot test WebForms is a strawman argument; there is no trouble in separating the Model and testing it thoroughly.&amp;#160; Depending on how you go about it, you can also separate the Controllers and test them - I generally have very simple Controllers that pass user input into the Model as is, so testing the Controller is not that important to me.&amp;#160; Testing the View in WebForms is very difficult - and this isn&amp;#39;t specific to WebForms.&amp;#160; My objection to claiming MVC has testable Views is the implied definition of testing.&amp;#160; Verifying the output HTML of a View is not helpful at all - it&amp;#39;s just string comparison.&amp;#160;&amp;#160; I want to write tests like Asset.JavascriptRunsOnSafariMac() and Assert.IE8RendersSameAsFireFox3().&amp;#160; If MVC could do that, then I would be switching to it today!&lt;/p&gt;  &lt;p&gt;WebForms provides a very robust SiteMapProvider interface that makes it easy to clean up urls of dynamic content.&amp;#160; Global.asax can be using to control routing of requests (in fact this is how MVC does it as well).&amp;#160; The biggest problem I&amp;#39;ve had here isn&amp;#39;t WebForms fault, but IIS6&amp;#39;s inability to allow ASP.NET to handle requests without an ASP.NET extension in them: this is solved in IIS7.&lt;/p&gt;  &lt;p&gt;You can get fine grain control of HTML in WebForms, ever with just the stock controls.&amp;#160; There is also an entire collection of HTML server controls to match HTML tags to make it easy to generate HTML from code (I hate seeing tags hardcoded in source file, feels dirty and hackish).&amp;#160; About the one thing that is hard to do in WebForms I deal with somewhat often is controlling the client side ID&amp;#39;s, which can become quite long and fugly looking.&amp;#160; For CSS you can just assign a class name instead of using ID references (and there aren&amp;#39;t many places I&amp;#39;m using CSS IDs except for layout divs that aren&amp;#39;t coming from ASP.NET controls anyway).&amp;#160; Javascript is trickier; you need to inject a reference of Control.ClientID on the server in the client script, and the need is much more common than with CSS.&amp;#160; If you have an external JavaScript file this can get worse, but I believe that an external JS method should take the ID of the control they work with as a parameter making it easier to read the external file without the need to reference the aspx code.&amp;#160; At the end of the day however, I&amp;#39;m not willing to throw the &amp;quot;baby out with the bath water&amp;quot; and will lean more on Microsoft to fix this issue in WebForms rather than jump to MVC.&lt;/p&gt;  &lt;p&gt;The last reason for MVC I mentioned, being closer to the http protocol and its stateless nature, I simply don&amp;#39;t grok.&amp;#160; Any application with a basic level of user interaction will need to mask the http protocol&amp;#39;s implementation details to provide a positive user experience.&amp;#160; Web programmers of all frameworks and languages have realized there are only a few methods to solve this problem; cookies, url parameters, and hidden fields.&amp;#160; Any state solution will involve one or all of these - even if state is stored on the server&amp;#39;s side.&amp;#160; WebForms supports all of these methods, and you can disable things like ViewState (hidden fields) if desired.&amp;#160; (I am aware there is also ControlState that will be still emitted if ViewState is disabled, but I&amp;#39;m willing to say that if these few bytes are an impact you are working on an edge case).&lt;/p&gt;  &lt;p&gt;I&amp;#39;m not here to bash ASP.NET MVC - to the contrary I&amp;#39;m here to help by outlining the faults in the current arguments for MVC.&amp;#160; If MVC is defined by the features in or not in WebForms, then it&amp;#39;s going to be hard for those deep into WebForms to see value in MVC.&amp;#160; It becomes a song of &amp;quot;anything you can do, I can do better (no you can&amp;#39;t, yes I can)&amp;quot; and will deadlock when neither side is listening to the other.&amp;#160; ASP.NET MVC need to be defined without claiming faults in WebForms, because that only says use MVC because WebForms is broken - leading one to say, &amp;quot;why not just fix WebForms?&amp;quot;&lt;/p&gt;  &lt;p&gt;I wish I could end here with a new explanation of ASP.MVC meeting the requirements I&amp;#39;ve just stated, but I&amp;#39;m afraid I can&amp;#39;t.&amp;#160; This is a fault with me, and not the MVC framework - I&amp;#39;m too close and deep into WebForms to see a need for MVC I can&amp;#39;t fill already.&amp;#160; It&amp;#39;s my hope and request that instead of seeking to pick apart this post, the supporters of MVC come out to define MVC without attaching that definition to the perceived faults (for that&amp;#39;s the minefield) of WebForms.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=41448" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/vinull/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/opinion/default.aspx">opinion</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/mvc/default.aspx">mvc</category></item><item><title>Review: The Annotated Turing by Charles Petzold</title><link>http://devlicio.us/blogs/vinull/archive/2008/07/21/review-the-annotated-turing-by-charles-petzold.aspx</link><pubDate>Mon, 21 Jul 2008 13:46:56 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:41369</guid><dc:creator>Michael C. Neel</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/vinull/rsscomments.aspx?PostID=41369</wfw:commentRss><comments>http://devlicio.us/blogs/vinull/archive/2008/07/21/review-the-annotated-turing-by-charles-petzold.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/0470229055?ie=UTF8&amp;amp;tag=thefistsofnia-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=0470229055"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;margin:0px 10px 10px 0px;border-right-width:0px;" height="164" alt="image" src="http://devlicio.us/blogs/vinull/WindowsLiveWriter/ReviewTheAnnotatedTuringbyCharlesPetzold_9E3E/image_3.png" width="111" align="left" border="0" /&gt;&lt;/a&gt; Let me start by saying while reading &lt;em&gt;&lt;a href="http://www.amazon.com/gp/product/0470229055?ie=UTF8&amp;amp;tag=thefistsofnia-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=0470229055"&gt;The Annotated Turing: A Guided Tour through Alan Turing&amp;#39;s Historic Paper on Computability and the Turing Machine&lt;/a&gt; &lt;/em&gt;I encountered two other reviews worth note.&amp;#160; The first review by &lt;a href="http://www.codinghorror.com/blog/archives/001143.html"&gt;Jeff Atwood&lt;/a&gt;&amp;#160; focused on Alan Turing&amp;#39;s personal life as a gay man in the first half of the 1900&amp;#39;s and is light on reviewing the actual text of &lt;em&gt;Turing&lt;/em&gt;.&amp;#160; The second review is by &lt;a href="http://deirdre-nyc.livejournal.com/31473.html"&gt;Deirdre Sinnott&lt;/a&gt; and does cover the text in depth, but one must carry a certain level skepticism (however undue) toward Deirdre given her &lt;a href="http://www.charlespetzold.com/blog/2007/10/091219.html"&gt;relationship&lt;/a&gt; to Petzold.&amp;#160; I must also alert the reader to my own bias, as I have &lt;a href="http://www.vinull.com/Post/2006/06/01/book-review-code.aspx"&gt;written well of Petzold in the past&lt;/a&gt; and was sent a (signed) copy of &lt;em&gt;Turing&lt;/em&gt;.&amp;#160; I did however purchase the book before I knew a copy was being sent to me.&lt;/p&gt;  &lt;p&gt;For the impatient, busy, or otherwise opposed to reading what has become a lengthy review, I will save you the investment of time by saying now I highly enjoyed this book and would strongly recommend it to any programmer, mathematician, or person with an interest for numbers.&amp;#160; I will qualify this recommendation with the disclaimer that if you do not have the time to devote to reading the remainder of this review, you may not have the time needed to read and understand the book&amp;#39;s content.&amp;#160; I found myself only able to read 10-20 pages a night of this scant 359 page book due to the amount of mental engagement demanded by the subject matter; which only worked to increase my enjoyment.&amp;#160; Before we get into the content of the book however, let us take a moment to understand the actors involved...&lt;/p&gt;  &lt;p&gt;Alan Turing is our hero in this tale, a brilliant young man who leads a troubled life and finds refuge in a love for numbers.&amp;#160;&amp;#160; Our narrator, Charles Petzold, shares a great many things in common with Turing, including this love of numbers and the mind to process these numbers in complex ways.&amp;#160; I have read many of Petzold&amp;#39;s books on Microsoft Windows programming and one constant is that his examples often use calculus or trigonometry equations in a way that the example itself teaches as much on mathematics as the &lt;a href="http://en.wikipedia.org/wiki/API"&gt;API&lt;/a&gt; the text covers.&amp;#160; Mathematics and computers, I&amp;#39;m learning, are tied much closer together than most would assume.&amp;#160; The last character is myself, the reader, who poses only a basic understanding of college level mathematics (enough to meet CS requirements) and who once wrote a two page mathematical paper that was, in the words of the professor, &amp;quot;an amazing level of insight and effort, but 100% flawed and incorrect&amp;quot;.&amp;#160; I mention this because while I was not able to understand every formula and proof covered in &lt;em&gt;Turning&lt;/em&gt;, this did not detract from my understanding of its significance to the material.&lt;/p&gt;  &lt;p&gt;The events in &lt;em&gt;Turing&lt;/em&gt; surround Turing&amp;#39;s paper &amp;quot;On Computable Numbers, with an Application to the Entscheidungsproblem.&amp;quot;&amp;#160; I will probably offend true mathematicians with the following explanation of the &lt;a href="http://en.wikipedia.org/wiki/Entscheidungsproblem"&gt;Entscheidungsproblem&lt;/a&gt; (and again later in this review), but simply put the Entscheidungsproblem asks for a set of steps one can use to determine if a given formula has a solution (but not what that solution might be).&amp;#160; Consider A&amp;#178; + B&amp;#178; = C&amp;#178;, which we know is true because we can plug in 3, 4, and 5 and see that it works. What about A&amp;#179; + B&amp;#179; = C&amp;#179;?&amp;#160; Before we start trying some random numbers it would be nice to know if there even is a solution - and this is what the Entscheidungsproblem is all about.&amp;#160; (My method would be to try some random numbers, I&amp;#39;m sure a mathematician&amp;#160; would start with a much more reasonable and fruitful approach.)&lt;/p&gt;  &lt;p&gt;Turing proved that no, there is not a universal method for determining if a given formula has a solution.&amp;#160; Turing was not the first to prove this: 6 weeks before Turing&amp;#39;s paper was published in 1936, Alonzo Church published a paper that also proved there was no method for the Entscheidungsproblem.&amp;#160; Turing&amp;#39;s solution was so novel and unique in it&amp;#39;s approach however, that it has the rare honor of also being published, and Turning added a proof to his paper that both methods are equivalent.&lt;/p&gt;  &lt;p&gt;Truth.&amp;#160; To normal folk truth has a somewhat soft definition, but to mathematicians truth has strong and rigid meaning.&amp;#160; You may know something to be true simply through common sense, but in the world of mathematics something must be proven in concrete formula before it can be accepted as true; until then it remains unproven and will not even be considered worthy of assumption of truth in all but the most extreme cases.&lt;/p&gt;  &lt;p&gt;To tackle the truth of the Entscheidungsproblem, Turning invented (on paper) a machine that could read a sequence of commands that expressed a method to calculate number and print it as the result.&amp;#160; This allowed Turing to work with numbers like &amp;#960; without needing to calculate the exact value (something no easier in 2008 than it was in 1936).&amp;#160; Further, Turing devised a method to give every possible sequence of commands a unique number, called a Description Number, or DN.&amp;#160; The DN for a machine that computed &amp;#960; might be DN 314,257.&amp;#160; Last, Turing invented a machine that could be given a DN and generate the sequence of commands that DN represented, then pass this sequence off to another machine to calculate the result.&amp;#160; Turing&amp;#39;s machines worked in binary, i.e. 0&amp;#39;s and 1&amp;#39;s only, so Turning then proved it was not possible given a DN to determine if the calculation machine would ever print a 0 as a result of calculation, thus proving there was no universal method to determine if a given formula had a solution.&lt;/p&gt;  &lt;p&gt;Just reciting the list of actors and events doesn&amp;#39;t convey the story, we must also discuss the meaning and impact.&amp;#160; Much of &lt;em&gt;The Annotated Turing&lt;/em&gt; is true to the title; Petzold presents the unmodified original Turing paper and provides annotations to help understand the material, while also citing related material and events.&amp;#160; In this capacity, Petzold is unsurpassed - the bibliography for &lt;em&gt;Turing &lt;/em&gt;cites over &lt;a href="http://www.theannotatedturing.com/bibliography.htm"&gt;90 books and papers&lt;/a&gt; (including a humble citation of &lt;a href="http://www.amazon.com/gp/product/073560505X?ie=UTF8&amp;amp;tag=thefistsofnia-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=073560505X"&gt;Petzold&amp;#39;s own Code&lt;/a&gt;) and one is given the impression Petzold read many more books not cited.&amp;#160; Petzold&amp;#39;s greatest contributing to Turing&amp;#39;s work comes at the end however, when he explores the impact Turing had on the fields of mathematics, computer science, and philosophy.&lt;/p&gt;  &lt;p&gt;Any developer reading above recognized that Turing machines are computers running programs.&amp;#160; What may not have been obvious is that Turing&amp;#39;s proof also means that no program can be written that will determine the output of another program.&amp;#160; That we cannot break this limitation, and our new platforms, languages, and computers will &amp;quot;at best [...] only do jobs faster.&amp;quot;&lt;/p&gt;  &lt;p&gt;The philosophic impact is far greater, for we humans qualify as Turing machines.&amp;#160; Other philosophers and mathematicians have come very close to a proof that the universe is fundamentally digital, can be expressed as 0&amp;#39;s and 1&amp;#39;s, and qualifies as a Turing machine.&amp;#160; If true, this abandons our romantic notions of free will, for as a Turing machine in a digital universe our actions are calculable.&amp;#160; Our perception of free will is merely the misunderstanding of the inability to predict the output of our own Turing machine, the mind.&lt;/p&gt;  &lt;p&gt;I do not assert I&amp;#39;ve laid out a solid argument in the above paragraph - for that you&amp;#39;ll need to read &lt;em&gt;Turing&lt;/em&gt; and possibly the references cited by Petzold.&amp;#160; Having just finished &lt;em&gt;Turing&lt;/em&gt; hours before writing this review, and being a person who has rejected the idea of fate, I&amp;#39;m still a little uneasy myself.&amp;#160; It&amp;#39;s as if Alan Turing sat next to me on the airplane and said, &amp;quot;Oh fate?&amp;#160; It exists, I have a mathematical proof here somewhere in my backpack I did last summer when I had some spare time.&amp;quot;&amp;#160; At least I don&amp;#39;t have to tell the major religions of the world I was wrong about them too...&lt;/p&gt;  &lt;p&gt;Last, I&amp;#39;d like to mention that in planning for &lt;a href="http://www.codestock.org"&gt;CodeSock&lt;/a&gt; this summer, we were able to get &lt;a href="http://www.wiley.com/WileyCDA/WileyTitle/productCd-0470229055.html"&gt;Wiley Publishing&lt;/a&gt; (publisher of &lt;em&gt;Turing)&lt;/em&gt; as a supporter.&amp;#160; I requested and was granted 5 copies of &lt;em&gt;The Annotated Turing&lt;/em&gt; to give away at the end of the conference.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=41369" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/vinull/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/books/default.aspx">books</category></item><item><title>Knoxville takes part in the Ann Arbor Give Camp</title><link>http://devlicio.us/blogs/vinull/archive/2008/07/15/knoxville-takes-part-in-the-ann-arbor-give-camp.aspx</link><pubDate>Tue, 15 Jul 2008 23:25:49 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:41313</guid><dc:creator>Michael C. Neel</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/vinull/rsscomments.aspx?PostID=41313</wfw:commentRss><comments>http://devlicio.us/blogs/vinull/archive/2008/07/15/knoxville-takes-part-in-the-ann-arbor-give-camp.aspx#comments</comments><description>&lt;p&gt;This past weekend Knoxville took part in the &lt;a href="http://www.annarborgivecamp.org/"&gt;Ann Arbor Give Camp&lt;/a&gt; thanks to &lt;a href="http://www.nathanblevins.com/www/Articles/Ann-Arbor-Give-Camp-Knoxville-Satellite-Wrap-Up.aspx"&gt;Nathan Blevins&lt;/a&gt;.&amp;#160; Nathan organized a team of developers (and one designer!) in Knoxville with Ben Farmer, Jenny Farmer, &lt;a href="http://www.dylanwolf.com/"&gt;Dylan Wolf&lt;/a&gt;, and Joe Simpson.&amp;#160; The team assisted in two projects for the give camp: &lt;a href="http://www.wonderpuzzle.org/"&gt;Wonder Puzzle&lt;/a&gt; and &lt;a href="http://www.aahom.org/"&gt;Ann Arbor Hands-On Museum&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.joshholmes.com/2008/07/14/AnnArborGiveCamp2008.aspx"&gt;Josh Holmes&lt;/a&gt; will post more details on Wonder Puzzle, but the idea for the site is simple: make it easier for parents of children with undiagnosed medical problems.&amp;#160; If a child has a diagnosed illness, there are support groups for that illness a parent can turn to, but the parents of an undiagnosed child can find themselves isolated.&amp;#160; To help Wonder Puzzle the Knoxville team updated their site&amp;#39;s design and moved the content management to &lt;a href="http://www.sitefinity.com/"&gt;Sitefinity&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Knoxville (through Dylan) was able to assist in the Ann Arbor Hands-On Museum project by providing some PHP support.&amp;#160; The museum&amp;#39;s goal is to inspire people to discover the wonders of science, math and technology.&amp;#160; I wish I had more info on what this project was, but I&amp;#39;m sure details will be posted on &lt;a href="http://michaeleatonconsulting.com/blog/archive/2008/07/14/ann-arbor-give-camp---wrap-up.aspx"&gt;Michael Eaton&amp;#39;s&lt;/a&gt; or &lt;a href="http://blogs.msdn.com/jennifer/archive/2008/07/15/ann-arbor-give-camp.aspx"&gt;Jennifer Marsman&amp;#39;s&lt;/a&gt; blog shortly.&lt;/p&gt;  &lt;p&gt;I confess I really hated missing out on the give camp (I was on the road driving back from my speaking tour).&amp;#160; Not because I&amp;#39;m an awesome, caring guy who loves to give back to the community, but because I could have hung out with my peers and wrote code all weekend; charity is a bonus.&amp;#160; I&amp;#39;m glad to see the give camp team isn&amp;#39;t stopping to rest and has formed a group to setup future give camps.&amp;#160; Nathan is part of this team, so I know I&amp;#39;ll be a part of the many give camps to come!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=41313" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/vinull/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/givecamp/default.aspx">givecamp</category></item><item><title>Where's Mike?</title><link>http://devlicio.us/blogs/vinull/archive/2008/07/02/where-s-mike.aspx</link><pubDate>Thu, 03 Jul 2008 01:18:32 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:41191</guid><dc:creator>Michael C. Neel</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/vinull/rsscomments.aspx?PostID=41191</wfw:commentRss><comments>http://devlicio.us/blogs/vinull/archive/2008/07/02/where-s-mike.aspx#comments</comments><description>&lt;p&gt;I recently posted that everyone should read &lt;a href="http://sethgodin.typepad.com/the_dip/"&gt;The Dip&lt;/a&gt; and I try to follow Seth&amp;#39;s advice pretty closely.&amp;#160; The current &amp;quot;dip&amp;quot; I&amp;#39;m slugging through is organizing &lt;a href="http://codestock.org"&gt;CodeStock&lt;/a&gt; - which means I have to &amp;quot;quit&amp;quot; or ignore many other things to focus on getting through this dip.&amp;#160; Less time spent playing with new .Net toys, which leads to less blogging and less speaking.&lt;/p&gt;  &lt;p&gt;One thing I&amp;#39;m slightly jealous about having to pass on is helping in the &lt;a href="http://annarborgivecamp.org/"&gt;Ann Arbor Give Camp&lt;/a&gt;.&amp;#160; &lt;a href="http://timrayburn.net/"&gt;Tim Rayburn&lt;/a&gt; first told me about give camp&amp;#39;s last year at the Memphis Day of .Net, and ever since then I&amp;#39;ve wanted to be part of one (or more).&amp;#160; I am however glad to see &lt;a href="http://www.nathanblevins.com/www/Articles/GiveCamp-KnoxvilleTennessee.aspx"&gt;Nathan Blevins jump in and assemble a remote team&lt;/a&gt; so that Knoxville developer&amp;#39;s can join in the Ann Arbor Give Camp, even if I can&amp;#39;t.&lt;/p&gt;  &lt;p&gt;Fortunately however, a system has been created to allow one a temporary break from slugging through a dip - the vacation.&amp;#160; While most would imagine a vacation involves a beach and doing nothing, if we define vacation as &amp;quot;taking a break from daily routine to spend time doing an enjoyed activity&amp;quot; we see that a speaking tour is a vacation!&lt;/p&gt;  &lt;p&gt;Next week I&amp;#39;ll be staying in the New Orleans&amp;#39; French Quarter and speaking at nearby .Net user groups.&amp;#160; Below is a list of dates and groups - if you&amp;#39;re going to be in the area be sure to join in my vacation!&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;GNONUG in New Orleans, LA Mon 7/7 (topic TBD)&lt;/li&gt;    &lt;li&gt;Perficient, Inc. in New Orleans, LA 7/8 @ 11:30 - Welcome to the Church of Agile &lt;/li&gt;    &lt;li&gt;&lt;a href="http://loweraldotnet.org/"&gt;LANUG&lt;/a&gt; in Mobile, AL Tues 7/8 - From Zero to XAML&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.acadianaug.org/"&gt;Acadiana .NET UG&lt;/a&gt; in Lafayette, LA on Wed 7/9 - SOA: Building the Arch&lt;/li&gt;    &lt;li&gt;&lt;a href="http://hubcitynug.org/"&gt;Hattiesburg&lt;/a&gt;, MS on Thurs 7/10 - &amp;quot;Geek Dinner&amp;quot; (this is still in the planning stages, but there will be something happening)&lt;/li&gt; &lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=41191" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/vinull/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/speaking/default.aspx">speaking</category></item><item><title>CodeStock After Party!</title><link>http://devlicio.us/blogs/vinull/archive/2008/07/01/codestock-after-party.aspx</link><pubDate>Tue, 01 Jul 2008 20:24:25 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:41168</guid><dc:creator>Michael C. Neel</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/vinull/rsscomments.aspx?PostID=41168</wfw:commentRss><comments>http://devlicio.us/blogs/vinull/archive/2008/07/01/codestock-after-party.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://codestock.org"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;margin:0px 10px 10px 0px;border-right-width:0px;" height="154" alt="image" src="http://devlicio.us/blogs/vinull/WindowsLiveWriter/CodeStockAfterParty_E6A3/image_3.png" width="144" align="left" border="0" /&gt;&lt;/a&gt; First, I want to give a shout out to Knoxville&amp;#39;s &amp;quot;front man&amp;quot; &lt;a href="http://morewally.com/cs/"&gt;Wally McCulre&lt;/a&gt; for including a spot on his &lt;a href="http://aspnetpodcast.com/CS11/blogs/asp.net_podcast/archive/2008/07/01/asp-net-podcast-show-119-using-the-history-back-functionality-with-the-asp-net-ajax-web-services-in-net-3-5-service-pack-1-beta-1.aspx"&gt;latest ASP.NET Podcast&lt;/a&gt; for Codestock! (full disclosure - and apologies - it&amp;#39;s me in the spot).&amp;#160; Big thanks to Wally!&lt;/p&gt;  &lt;p&gt;So what is the &lt;a href="http://codestock.org/Pages/AfterParty.aspx"&gt;CodeStock After Party&lt;/a&gt;?&amp;#160; It&amp;#39;s a time to hang out and socialize with your peers - speakers and attendees.&amp;#160; This is a major reason to attend a conference; meet your neighbors and realize you share the same goals and frustrations (no one ever told you being a developer was easy!).&lt;/p&gt;  &lt;p&gt;But wait, there&amp;#39;s more!&lt;/p&gt;  &lt;p&gt;From 6pm till 8pm well have hot dogs, drinks and live music by Knoxville&amp;#39;s own Hanover Fist - these guys know how to rock (and I have insider information that confirms some of them are also computer geeks)! The stage area is located right next to the conference, and there will be shade tents and tables setup for those not accustom to Southern Living.&lt;/p&gt;  &lt;p&gt;Space is limited so if you haven&amp;#39;t, register today at &lt;a href="http://CodeStock.org"&gt;CodeStock.org&lt;/a&gt; - get in your registration before July 15th to specify your t-shirt size and lunch preference in time for the conference.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=41168" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/vinull/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/vinull/archive/tags/conference/default.aspx">conference</category></item></channel></rss>