<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>mindstorm interactive</title>
	<atom:link href="http://www.mindstorminteractive.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mindstorminteractive.com/blog</link>
	<description></description>
	<lastBuildDate>Mon, 10 Oct 2011 19:53:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>The End of SQL?</title>
		<link>http://www.mindstorminteractive.com/blog/topics/the-end-of-sql/</link>
		<comments>http://www.mindstorminteractive.com/blog/topics/the-end-of-sql/#comments</comments>
		<pubDate>Thu, 29 Sep 2011 15:32:17 +0000</pubDate>
		<dc:creator>mindstorm</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[predictions]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.mindstorminteractive.com/blog/?p=569</guid>
		<description><![CDATA[Series: Predictions I&#8217;ve been working with Entity Framework for about 9 months now and I don&#8217;t think I can go back to a data access layer that relies on SQL strings and stored procedures. The benefits of using an ORM &#8230; <a href="http://www.mindstorminteractive.com/blog/topics/the-end-of-sql/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h2>Series: Predictions</h2>
<p>I&#8217;ve been working with Entity Framework for about 9 months now and I don&#8217;t think I can go back to a data access layer that relies on SQL strings and stored procedures. The benefits of using an ORM (<a title="ORM" href="http://en.wikipedia.org/wiki/Object-relational_mapping" target="_blank">Object Relational Mapper</a>) over using traditional SQL and generic data access objects are overwhelming.</p>
<ul>
<li>strongly typed data entities, no looping through arrays with hard-coded column names to retrieve data</li>
<li>compile errors on critical database changes</li>
<li>intellisense, code hints and compile warnings</li>
<li>less code to write in general, especially when casting and joining tables</li>
<li>more semantic code, easier to read and comprehend</li>
<li>automatic data class (model) updates from database</li>
</ul>
<p>I just gave a demo to my coworkers and there was a mixed reaction. Some DBA&#8217;s looked a bit nervous. &#8220;You can build apps without SQL? But SQL is what I write!  Will this make me irrelevant?&#8221; Fear not, gentle DBA. We still need reports, nightly scripts, backup procedures, data migration, triggers, optimization and many other things that require intimate knowledge of database architecture. But we don&#8217;t need 3 stored procedures to update every table.  I think this will actually free DBA&#8217;s from the more mundane tasks so they can focus on architecture and other concerns.</p>
<p>ORMs are not perfect and they come with their own unique challenges, but they are nonetheless a giant step forward.</p>
<h2>The Object Database</h2>
<p>Another not-so-new technology that&#8217;s been gaining traction is the Object Database. Many experts are saying, why bother mapping objects to relational data tables when you can just save the object directly into the database?  It makes sense and it is quite possible that object databases are easier to use than ORM&#8217;s with a relational database. They&#8217;re apparently quite efficient at serializing and querying data.</p>
<p>The main anchor keeping this technology from taking off is the need to support legacy systems, and DBA&#8217;s who are unfamiliar with or uncertain of object databases. With ORMs, a programmer can evolve their code independently of the database.  Entity Framework just released support for POCO classes, which is a fancy word for regular classes you write yourself. Writing the classes yourself allows some extra freedom, but loses some of the automation that makes the framework cool and easy. One reason this feature was included was to allow developers to ease the ORM into a system that already has classes built, then to slowly replace their old SQL with LINQ.</p>
<p>Either way, ORMs provide a visual editing tool to represent data relations, and a tool will always exist for this purpose.  With Entity Framework, you can actually generate the database from the models you design, so it&#8217;s quite likely that there will soon be a &#8220;switch&#8221; behind the scenes to simply generate an object database instead, and there will be little to no effort for the programmer.  Switching to ORM makes a system more prepared for an upgrade to an object database.  More and more reporting and analysis tools will likely begin to plug in to the ORM directly instead of the database to employ the same benefits.</p>
<h2>The Bottom Line</h2>
<p>The bottom line is the same. Object databases and ORMs require no SQL writing. I don&#8217;t think SQL will simply vanish or that the skill will lose value right away. But it could gradually go the same direction as <a title="Wikipedia Regular Expressions" href="http://en.wikipedia.org/wiki/Regular_expression" target="_blank">Regular Expressions</a>. The need to write SQL will become less frequent, and the tools to aid in the process will continue to improve.  Of course an understanding of the SQL language will aid any developer working with an ORM or any other visual tool in much the same way that an understanding of HTML markup aids the use of visual web page design software.</p>
<p>So, no, I don&#8217;t see SQL simply going away any time soon. It&#8217;s far too entrenched and it will be decades before all legacy systems begin to migrate away. But don&#8217;t be surprised if you begin to see job descriptions begin to pop-up requiring knowledge of Entity Framework, NHibernate or other ORM&#8217;s.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mindstorminteractive.com/blog/topics/the-end-of-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thumbtack?</title>
		<link>http://www.mindstorminteractive.com/blog/topics/thumbtack/</link>
		<comments>http://www.mindstorminteractive.com/blog/topics/thumbtack/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 15:12:29 +0000</pubDate>
		<dc:creator>mindstorm</dc:creator>
				<category><![CDATA[uncategorized]]></category>

		<guid isPermaLink="false">http://www.mindstorminteractive.com/blog/?p=648</guid>
		<description><![CDATA[Mindstorm just posted on thumbtack.com.  What is thumbtack.com?  From what we can tell it&#8217;s similar to CraigsList however it is a services only directory. From their site: Why can you go online right now and buy any product you want &#8230; <a href="http://www.mindstorminteractive.com/blog/topics/thumbtack/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Mindstorm just posted on <a href="http://www.thumbtack.com" target="_blank">thumbtack.com</a>.  What is thumbtack.com?  From what we can tell it&#8217;s similar to CraigsList however it is a services only directory.</p>
<p>From their site:</p>
<blockquote><p>Why can you go online right now and buy any product you want but you can&#8217;t do the same for tutors, handymen, dog walkers, or other local services? Thumbtack is changing that.</p>
<p>Thumbtack isn&#8217;t like typical local search directories that simply return business listings with ratings and reviews, leaving you no better off than the paper Yellow Pages.</p>
<p>Instead, Thumbtack gives you the ability to vet, contact and book service professionals the moment you find them.</p>
<p>At Thumbtack, we understand that hiring service professionals requires a high degree of trust. This is why we go out of our way to make sure that our community is held to the highest standards and that you have all the tools you need to feel comfortable hiring someone online.</p>
<p>Thumbtack helps you get the job done at the time and place you want, with someone you know you can trust.</p>
</blockquote>
<p>One thing we did like when researching thumbtack is that they preform <a href="http://support.thumbtack.com/home#help_background_checks" target="_blank">background checks</a> and have <a href="http://support.thumbtack.com/entries/281647-how-are-thumbtack-s-reviews-different-than-those-on-other-websites" target="_blank">user reviews</a>.  However like with any other free service a user should proceed with caution and common sense.</p>
<p>If you are interested in seeing our posting it can be found at:<br />
<a href="http://www.thumbtack.com/Web-Design-Presentation-Design-Branding-Print-New-Market-MD/service/254499">Web Design, Presentation Design, Branding &amp; Print</a></p>
<p>We have actually had a lot of success (and a lot of junk) with CraigsList so hopefully we will also be successful with thumbtack.   Only time will tell if anything is actually going to come of our free ad, if thumbtack does prove to be fruitful we&#8217;ll be sure to let you know.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mindstorminteractive.com/blog/topics/thumbtack/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.</title>
		<link>http://www.mindstorminteractive.com/blog/topics/the-objectcontext-dispose/</link>
		<comments>http://www.mindstorminteractive.com/blog/topics/the-objectcontext-dispose/#comments</comments>
		<pubDate>Thu, 14 Jul 2011 13:24:44 +0000</pubDate>
		<dc:creator>mindstorm</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.mindstorminteractive.com/blog/?p=604</guid>
		<description><![CDATA[If you are using Entity Framework, this is one of the most common and often misleading errors you will see.  There are several possible explanations for this error that may lie in the code or in the database.  Here are &#8230; <a href="http://www.mindstorminteractive.com/blog/topics/the-objectcontext-dispose/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>If you are using Entity Framework, this is one of the most common and often misleading errors you will see.  There are several possible explanations for this error that may lie in the code or in the database.  Here are a few reasons for this error and how to resolve them.</p>
<h2 style="text-align: center;">Code Issues</h2>
<h2>reason #1:</h2>
<p>You are attempting to access data and the database <strong>connection is closed</strong>.</p>
<p>ObjectContext is the base class you inherit from when you generate entities from entity framework.  It handles several tasks, most significantly opening and closing the database connection, writing and executing queries.</p>
<p>If you instantiate your ObjectContext in a using block, the connection is closed at the end of that block.</p>
<h2>solution:</h2>
<p>First off, be aware that retrieving data is a two step process of writing and executing SQL, even though it&#8217;s hidden away and often written in one line. Any code that attempts to access the database must be executed within the using block.</p>
<p>If retrieving an IEnumberable with a query, wrap in a .ToList() to force data loading.</p>
<p>For navigation properties of an entity, use Include(), or call entities.Load().   You must check the .IsLoaded property of any navigation property to see if it&#8217;s there. You can&#8217;t check if the property is null or it may attempt to access the database.</p>
<p>Also note that even within an entity context, you must call .Load() before calling .Clear() to delete navigation properties from the database.  Failing to do so won&#8217;t cause an exception but it will fail to delete the data.  Also be aware that calling .Load() on a detached entity will cause the next error&#8230;</p>
<p>&nbsp;</p>
<h2>reason #2:</h2>
<p>Your <strong>entity is not Attached</strong>.</p>
<p>This is just a variation of the previous issue.  If you already have an entity before instantiating your context, they are not associated just because you are in a using block. Therefore, if you attempt to access navigation properties of that entity, you will get this error because the system assumes the entity came from a context which is now closed.</p>
<h2>solution:</h2>
<p>Call <strong>ObjectContext.Attach(entity)</strong> before attempting to access the entity navigation properties. Note: calling Attach can cause other errors which I will address in a separate post.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2 style="text-align: center;">Database Issues</h2>
<h2>reason #3:</h2>
<p>Another reason is <strong>missing navigation entities (a.k.a orphan data)</strong>. This is the most likely cause if the bug only occurs when requesting specific data, or if you step through your code and the bug occurs within a loop, but not on the first iteration.</p>
<h2>solution:</h2>
<p>Navigation properties are based on foreign keys. If the foreign key points to a row that does not exist, you have an orphan child row. This can occur if the entity is deleted or updated but the foreign key is set to do nothing. Check your data and try setting the FK action to cascade or set to null.</p>
<p>If the navigation property is nullable, you much check if it is null before accessing any property. This sounds like common sense but it is very easy to forget.</p>
<p>Also, check the<strong> table mappings</strong> of your parent entity.  If your parent entity has any <strong>mapping conditions (ex. &#8216;When ActiveFlag = true )</strong>,  any rows that don&#8217;t match the condition will be excluded from the data sets gathered by entity framework. They will be treated as if they were deleted from the database. This will essentially make your child rows orphaned data, but without the safety net of the foreign key violation. Be very cautions with exclusionary table mappings on parent rows.</p>
<h2>reason #4</h2>
<p>edmx file is out of sync with the database.  This issue can occur any time you change a table or column name in the database and forget to update your model. It is even more likely when multiple developers are working off a shared database.</p>
<h2>solution:</h2>
<p>Open your edmx file.  Right-click anywhere in the white space and select &#8216;Update Model From Database&#8217;. Select &#8216;validate&#8217; from the same menu. This will find many issues but some will pass through compile and only get caught at run time. If you have made extensive changes to an entity, it&#8217;s often easier and safer to simply delete it from the edmx and add it again. This will reset the names of all your properties but it will ensure they match the database names, which is usually the best route for clarity.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mindstorminteractive.com/blog/topics/the-objectcontext-dispose/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Alison Carroll Coaching Launches!</title>
		<link>http://www.mindstorminteractive.com/blog/topics/alison-carroll-coaching-launches/</link>
		<comments>http://www.mindstorminteractive.com/blog/topics/alison-carroll-coaching-launches/#comments</comments>
		<pubDate>Mon, 04 Jul 2011 15:22:49 +0000</pubDate>
		<dc:creator>mindstorm</dc:creator>
				<category><![CDATA[press release]]></category>

		<guid isPermaLink="false">http://www.mindstorminteractive.com/blog/?p=618</guid>
		<description><![CDATA[Mindstorm is proud to announce the official launch of www.alisoncarrollcoaching.com. Alison Carroll provides life and business coaching services, and we are honored to have the privilege of designing her website and corporate logo.  This website is a product of months of close collaboration &#8230; <a href="http://www.mindstorminteractive.com/blog/topics/alison-carroll-coaching-launches/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Mindstorm is proud to announce the official launch of <a title="Alison Carroll Coaching" href="http://www.alisoncarrollcoaching.com" target="_blank">www.alisoncarrollcoaching.com</a>.</p>
<p>Alison Carroll provides life and business coaching services, and we are honored to have the privilege of designing her website and corporate logo.  This website is a product of months of close collaboration between our client, designers and developers and we are all very pleased with the end result.</p>
<p>The site features a blog and utilizes the <a href="http://www.wordpress.org" target="_blank">WordPress </a> content management system with an HTML5 / CSS3 template (so for anyone using an older browser, it&#8217;s time to upgrade).</p>
<p>We thank Alison for choosing Mindstorm and for being a great client to work with, and we wish her the best of luck as she embarks on this new business venture!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mindstorminteractive.com/blog/topics/alison-carroll-coaching-launches/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ConfirmIT v1.0 launches!</title>
		<link>http://www.mindstorminteractive.com/blog/topics/confirmit-v1-0-launches/</link>
		<comments>http://www.mindstorminteractive.com/blog/topics/confirmit-v1-0-launches/#comments</comments>
		<pubDate>Sun, 19 Jun 2011 16:36:31 +0000</pubDate>
		<dc:creator>mindstorm</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[press release]]></category>

		<guid isPermaLink="false">http://www.mindstorminteractive.com/blog/?p=614</guid>
		<description><![CDATA[After months of brainstorming, coding, testing and refactoring, we&#8217;re proud to announce the release of ConfirmIt, a jQuery plugin. This plugin allows you to add  confirmation prompts on buttons, links, forms and browser windows with the least amount of code &#8230; <a href="http://www.mindstorminteractive.com/blog/topics/confirmit-v1-0-launches/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>After months of brainstorming, coding, testing and refactoring, we&#8217;re proud to announce the release of ConfirmIt, a jQuery plugin. This plugin allows you to add  confirmation prompts on buttons, links, forms and browser windows with the least amount of code possible.</p>
<p>See the <a title="ConfirmIt Showcase" href="http://mindstorminteractive.com/projects/confirmit/" target="_blank">ConfirmIt Showcase</a> for examples of usage and a downloadable source files.</p>
<p>This project was coauthored by yours truly and John Pencola, author of <a title="Liquid Language" href="http://blog.johnpencola.com/" target="_blank">Liquid Language</a>. It&#8217;s our way of giving back to the open source community and also a chance to view coding from a different perspective. We tried to anticipate the various scenarios that programmers would use this plugin to make an API that is both simple and flexible.</p>
<p>We are very eager to get feedback on this plugin.  Please try it out and let us know what you think.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mindstorminteractive.com/blog/topics/confirmit-v1-0-launches/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Brain Food To Go</title>
		<link>http://www.mindstorminteractive.com/blog/topics/brain-food-to-go/</link>
		<comments>http://www.mindstorminteractive.com/blog/topics/brain-food-to-go/#comments</comments>
		<pubDate>Mon, 23 May 2011 12:18:03 +0000</pubDate>
		<dc:creator>mindstorm</dc:creator>
				<category><![CDATA[career]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.mindstorminteractive.com/blog/?p=591</guid>
		<description><![CDATA[Want to know how you can increase your intellect (and indirectly, your salary) during your commute? I have one word: Podcasts. Whatever profession you work in, there are experts out there dispensing free advice over the airwaves. Just by tuning &#8230; <a href="http://www.mindstorminteractive.com/blog/topics/brain-food-to-go/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Want to know how you can increase your intellect (and indirectly, your salary) during your commute? I have one word: Podcasts.</p>
<p>Whatever profession you work in, there are experts out there dispensing free advice over the airwaves. Just by tuning in whenever you have a drive or a spare moment, you can stay on top of current trends, learn about new products or techniques, become acquainted with new terminology and concepts, and generally enrich yourself.</p>
<h2>Talk the Talk</h2>
<p>I went on an interview about a year ago armed with my portfolio of over two dozen websites and applications, along with my extensive work history.  To my chagrin, the interview was not set up for me to present my work. Instead, I was barraged with questions for hours from three developers sitting across from me like the judges on the American Idol outtakes. Several questions went something like this:</p>
<p>&#8220;Do you have any experience working with X?&#8221;</p>
<p>&#8220;Um&#8230;I&#8217;m not sure. I&#8217;ve never heard of X.&#8221;</p>
<p>(interviewers glance somewhat skeptical at one another)</p>
<p>&#8220;Let me explain. X is the process where you &#8230;&#8221;</p>
<p>&#8220;Oh, ok. I have done that before, I just haven&#8217;t heard it called that.&#8221;</p>
<p>Doesn&#8217;t exactly get them on the edge of their seat at that point. Even though there&#8217;s often several ways to do something, people are often taken aback if you haven&#8217;t done it <em>their </em>way before, or even if you have but you called it something different.</p>
<p>The point is that podcasts introduce you to new acronyms, terms and phrases which will eventually become part of your language. In software development especially, understanding these terms allows you to explain concepts and converse with your peers more eloquently. The end result is that you sound like you know what you&#8217;re doing. You sound like you&#8217;ve done it before and you sound more confident. This is useful for interviews, meetings and discussions where you have to sell your ideas.</p>
<h2>Memory Hooks</h2>
<p>Another great benefit I&#8217;ve found is that when I have to learn a new tool or skill, all these hidden memories of a podcast will come flooding back.  Even if I didn&#8217;t fully understand what they were talking about, I picked up on bits and pieces. New concepts become much easier to grasp as you&#8217;re filling in the blanks instead of starting from scratch. Then, if I re-listen to a podcast after I have experience with the topic of discussion, I get much more out of it the second time.  Most products and techniques are a solution to a problem. If I&#8217;ve experienced that problem and had to fix it myself, I may will think &#8220;Wow, that would have saved me a lot of time. I&#8217;ll try that next time.&#8221;</p>
<p>Additionally, I will often hear an idea and begin to brainstorm my own ideas (I may have to pause and backup a show but that&#8217;s okay). Listening to a podcast in the morning wakes up your brain and gets you into &#8220;work mode&#8221; more than, say, Howard Stern. Unless perhaps you&#8217;re a professional womens&#8217; mud wrestling referee.</p>
<h2>Some Unpaid Advertising</h2>
<p>I use the <a href="http://www.beyondpod.mobi/android/index.htm" target="_blank">Beyond Pod</a> app on my droid, a $7 investment.  As a developer in the Microsoft space, my current favorite podcasts are <a href="http://dotnetrocks.com/" target="_blank">.NET Rocks</a>, <a href="http://hanselminutes.com/" target="_blank">Hanselminutes</a>, and <a href="http://herdingcode.com/" target="_blank">Herding Code</a>.  I tried Codecast and Alt.Net but did not find them as beneficial.</p>
<p>I sometimes get bored of code casts, so I branched out into some popular casts Stuff To Blow Your Mind and Stuff You Should Know, from <a href="http://howstuffworks.com" target="_blank">howstuffworks.com</a>. Even off topic casts can give you some more interesting conversations, which can allow you to connect with those outside of your area of expertise, like friends and family, your manager, and the owner of your company. Code abstraction patterns don&#8217;t make for a great ice breaker.</p>
<p>And of course there are still times when the droning voices aren&#8217;t enough to keep me alert in traffic and I just need to rock out. Then I switch to <a href="http://Pandora.com" target="_blank">Pandora</a>.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mindstorminteractive.com/blog/topics/brain-food-to-go/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TMV (Too Much Validation)</title>
		<link>http://www.mindstorminteractive.com/blog/topics/tm/</link>
		<comments>http://www.mindstorminteractive.com/blog/topics/tm/#comments</comments>
		<pubDate>Sat, 14 May 2011 20:19:51 +0000</pubDate>
		<dc:creator>mindstorm</dc:creator>
				<category><![CDATA[html]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.mindstorminteractive.com/blog/?p=576</guid>
		<description><![CDATA[I normally begin each post with an anecdote explaining my motivation behind writing. In this case I was asked to add code to a user profile page to validate a zip code. The request was that I not only check &#8230; <a href="http://www.mindstorminteractive.com/blog/topics/tm/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I normally begin each post with an anecdote explaining my motivation behind writing. In this case I was asked to add code to a user profile page to validate a zip code. The request was that I not only check the length but that I compare the zip code against a registry of all possible zip codes to see if that particular zip code exists. My response was simply &#8220;Why are we bothering?&#8221;  After all, I thought, what&#8217;s next? Submit their address to Google maps to make sure it exists?   Check their name against MVA or voting records to make sure <em>they </em>exist?</p>
<p>Validation is the act of verifying that data is constrained to certain rules.  The rule could simply be required input, a certain format such as date, or a complex system of logic that combines constraints on several input fields. When a user submits data, a certain amount of validation is helpful.  We&#8217;ve all been saved at least once by having to type in our passwords twice when they don&#8217;t match.</p>
<p>The question I pose is this: is there a such thing as too much validation? And if so, when does that occur?</p>
<p>To answer that question, we have to take a step back and look at what&#8217;s happening. Data submission of any kind is essentially a conversation between two parties: the submitter provides information and the receiver provides feedback.  This could be through a web form, a paper form, or an interview. An interview requires the most time and effort by the interviewing party but offers the highest degree of validation since they can converse freely.  Paper forms remove the interviewer and thus streamline the process, but provide no validation. Invalid data is submitted, caught while being processed, and the form must be fixed or returned for resubmission.  Valid data must still be processed and stored by an administrator of some sort.  This system has worked fine for centuries and still does, but now we have the web, which brings me full circle.</p>
<p>Web forms can provide instant feedback and force a user to fix errors through validation. This completely cuts out the interviewer and the administrator. It also saves time for the user during entry and shortens the processing time, which benefits everyone. The only cost to the enterprise is that they now need programmers, database administrators and the technical baggage to keep the system running. Still, this is generally a fraction of the cost for the provided return.</p>
<p><strong>Validation is useful for streamlining a conversation for both parties. But once validation starts to hinder the conversation, it&#8217;s usefulness declines.</strong></p>
<p>The most obvious occurrence is when validation throws false complaints. This can occur when the rules change but the code logic becomes out of date. Some examples might be the 9 digit zip code or new email formats (I once forgot to allow for European email formats).  These are the simple fixes. The gray area concerns the things I mentioned at the beginning.</p>
<p>The issue is relevant to me not only because I code lots of forms with massive amounts of validation checks, but also because I am currently co-authoring a jQuery plugin to precede user actions with a confirmation dialog to force the user to verify their intent before committing the action. Like validation, a confirmation prompt can protect users from making mistakes, but it could also become a nuisance if it is overused. Since this is a plugin, it will be up to the consumers to decide when and how often to implement it, but to make it as useful as possible, we want the default behavior to mimic the majority of use cases.</p>
<p>And determining  default behavior requires a bit of prediction at this phase. Hopefully, once we go live, we will get some useful feedback from the community and see how close our predictions are.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mindstorminteractive.com/blog/topics/tm/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Fun With Data Annotations</title>
		<link>http://www.mindstorminteractive.com/blog/topics/fun-with-data-annotations/</link>
		<comments>http://www.mindstorminteractive.com/blog/topics/fun-with-data-annotations/#comments</comments>
		<pubDate>Wed, 27 Apr 2011 22:44:59 +0000</pubDate>
		<dc:creator>mindstorm</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[mvc]]></category>

		<guid isPermaLink="false">http://www.mindstorminteractive.com/blog/?p=560</guid>
		<description><![CDATA[I&#8217;ve been using Data Annotations recently.  For those of you outside the .NET world, Data Annotations are Attributes that bind validation and display rules to your model properties. Some examples of basic validation annotations would be Required StringLength Range DataType RegularExpression &#8230; <a href="http://www.mindstorminteractive.com/blog/topics/fun-with-data-annotations/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been <a href="http://msdn.microsoft.com/en-us/library/dd901590(v=vs.95).aspx" target="_blank">using Data Annotations</a> recently.  For those of you outside the .NET world, Data Annotations are Attributes that bind validation and display rules to your model properties. Some examples of basic validation annotations would be</p>
<ul>
<li>Required</li>
<li>StringLength</li>
<li>Range</li>
<li>DataType</li>
<li>RegularExpression</li>
</ul>
<p>And the display attributes would be</p>
<ul>
<li>DisplayName</li>
<li>DisplayFormat</li>
<li>UIHint</li>
</ul>
<p>The awesome thing about MVC.NET is that simply by applying these attributes, you instantly get server-side validation. And with a few extra javascript includes, you get client-side validation with no custom javascript!</p>
<p>Each validation message has an optional error message that appears to the right of the invalid field along with an optional summary at the top of the page.</p>
<h2>Rethinking nTier Applications</h2>
<p>At first I winced at some of the display attributes because they are ultimately writing HTML from the data layer, which seems like a violation of tier separation since html is part of the display layer. But looking at the simplicity, reuse and consistency this system provides, it just makes sense.</p>
<p>Employing convention over configuration, the data layer can set many overridable features that would traditionally be considered business layer or display layer. Likewise, the business layer can override the data layer with more specific display names if the model is used by several business layer. The display layer could do the same. The nice thing is that 90% of the time, default values don&#8217;t need to be overridden.</p>
<p>Example:<br />
You have  a User entity with a Name property.<br />
Your data layer might provide a display name of &#8220;User Name&#8221;. This value appears in the label next to the input on the page.</p>
<p>Lets say you have business objects called Employee and Supervisor, which inherits from User.  Supervisor may wish to override this display name as &#8220;Supervisor Name&#8221; but Employee might just want to go with the default.  Additionally, you might have 50 pages which use various combinations of Employee and Supervisor that could override these display names as needed.</p>
<p>You might be asking, what&#8217;s the point? Why not always define label text in the html page where it belongs? I felt the same way, but html pages are generally not reusable, so you may end up repeating the word &#8220;Supervisor&#8221; 50 times, then your client could ask you to change it to &#8220;Manager&#8221; (this actually happened). You can do a global find-replace, or just have a few inconsistencies. But in the practical world, the data layer provides a central location for any information that gets repeated throughout your application, allowing more consistency in your Display layer.</p>
<h2>Potential IDE Improvements</h2>
<p>Because these features are finite and provide predefined options for most of what you need (like a regex for email), I could easily foresee the next iteration of Entity Framework providing a GUI interface to attach these attributes to entity properties in the ORM. In fact, much of this information, such as required, data type and string length, are included in the ORM, but they don&#8217;t percolate up to client-side validation. It may have been a design decision on their part or they may have just run out of time.   The point is, I don&#8217;t think basic validation is going to be something developers will have to spend much (if any) time coding in the near future.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mindstorminteractive.com/blog/topics/fun-with-data-annotations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Deafening Silence</title>
		<link>http://www.mindstorminteractive.com/blog/topics/deafening-silence/</link>
		<comments>http://www.mindstorminteractive.com/blog/topics/deafening-silence/#comments</comments>
		<pubDate>Fri, 15 Apr 2011 23:31:00 +0000</pubDate>
		<dc:creator>mindstorm</dc:creator>
				<category><![CDATA[clients]]></category>
		<category><![CDATA[msi]]></category>
		<category><![CDATA[The Ugly]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.mindstorminteractive.com/blog/?p=533</guid>
		<description><![CDATA[Series:  The Good, The Bad, The Ugly One thing I&#8217;ve learned over the years is that silence is not always golden.  I&#8217;m specifically referring to long periods of silence between a client and contractor in the middle of a project. &#8230; <a href="http://www.mindstorminteractive.com/blog/topics/deafening-silence/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h1>Series:  The Good, The Bad, The Ugly</h1>
<p>One thing I&#8217;ve learned over the years is that silence is not always golden.  I&#8217;m specifically referring to long periods of silence between a client and contractor in the middle of a project.  A former boss once told me he treats client interaction like a tennis game. Just always hit the ball back into their court, he said. Respond promptly to their requests and don&#8217;t keep them waiting, even if you can&#8217;t provide the solution right away. This is very good advice, people don&#8217;t want to wonder if they&#8217;ve been forgotten about. And on larger projects where both sides have project managers pushing timelines, meetings and schedules, this system works perfectly fine.</p>
<p>But what about when the line goes dead? What if you, the client, don&#8217;t have time to focus on the project you&#8217;ve hired us for? Maybe you&#8217;re too busy tending to your own clients&#8217; needs or other obligations, or maybe the project just isn&#8217;t a big priority. Whatever the case, it&#8217;s been my experience that long periods of silence can be extremely detrimental to a project, even if everything else seems fine. Or to use the tennis analogy, you might hit the ball back and not get a response because your client has found a new tennis partner.</p>
<h2>Your words, not mine.</h2>
<p>Another funny thing happens with memory of conversations over time. We apply our own filters and hear things differently. We sometimes turn implied assumptions into explicit promises, or we omit statements from memory.  A confirmation email is a good basic step to solidify a conversation, but they invariably still leave out details and you just feel icky having to dig through your old emails to set the record straight with a client once a misperception has had too long to incubate.</p>
<p>I once called a client to discuss a delicate matter that I didn&#8217;t think could be properly conveyed through an email. The call went well then there was an 8 or 9 month period where they didn&#8217;t contact us. We were midway through their site, waiting on content.   Then we got an email out of the blue that our client wanted to go with another firm. They had completely forgotten that we were waiting on them.  I called to repair the damage but it was too late. Time had skewed the memory of the original conversation.  &#8221;I remember you said word for word, &#8216;bla bla bla&#8217;  &#8221;, the client reamed. I had a completely different memory of the conversation and I could see that the client had completely altered the intent of my original call to fit what was in their mind.</p>
<h2>Whose turn is it?</h2>
<p><span style="color: #000000;">One problem with the &#8220;only respond to an email&#8221; approach is</span> that people forget you&#8217;re waiting on them. This often happens for us right after we send a website design to a client for approval. No matter how clear we try to make it that nothing more will happen until the design is signed off, it sometimes fails to register. We may get a non committed answer or no answer at all for months at a time. This happened with a previous client. After waiting several months and making several attempts to get sign off, we received an email asking if the site was finished.</p>
<p>What?  The whole site? Finished? We had received no design approval, no content, not even a site map. We restated that we had been waiting on sign off for months. The client stated that they had approved the design long ago and were very upset with the lack of progress. This time we had our paper trail of emails corroborating our story, but at that point it didn&#8217;t much matter. You say the design was approved? Fine. Send along the content and we&#8217;ll build your site.</p>
<h2>Going in a different direction.</h2>
<p>The worst case result of time is that the rest of the world has moved on while you were waiting.  I&#8217;ve experienced some of the greatest hits: Company shut down, changing business plan, funding dried up, a competitor beat us to the punch, etc.  See my post on<a title="The Perfection Trap" href="/blog/2011/03/29/the-perfection-trap/" target="_blank"> The Perfection Trap</a> for a list of reasons that these cases can happen.  The point is that when it takes several people working  together to get something done, you have to push full steam ahead while the project is on <em>their</em> front burner.</p>
<h2>Squeaky Wheel.</h2>
<p>Every project is important to us, but there&#8217;s simply no avoiding the fact that a responsive, involved client will get more attention than one who&#8217;s wandered off into the wilderness. Of course there is the other extreme<span style="color: #000000;">. I remember a particularly pushy client who called my Chief Technical Officer&#8217;s  (CTO&#8217;s) house at 4:00 am to report a bug he found on a prototype demo.  4:00 am.  Because it was that important. </span></p>
<p>Anyway, the point is that for a project to be successful, a client needs to be involved. Not as involved as the crazy guy in my last story, but you have to be involved.  You can&#8217;t pass off your idea and expect it to come to fruition on its own.  You have to cultivate the seed to grow into a crop. We are merely a tool to help facilitate the process.  A hoe will not grow a garden alone. You must use the hoe. Let us be your hoe.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mindstorminteractive.com/blog/topics/deafening-silence/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A Penny On The Sidewalk</title>
		<link>http://www.mindstorminteractive.com/blog/topics/a-penny-on-the-sidewalk/</link>
		<comments>http://www.mindstorminteractive.com/blog/topics/a-penny-on-the-sidewalk/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 16:15:06 +0000</pubDate>
		<dc:creator>mindstorm</dc:creator>
				<category><![CDATA[clients]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.mindstorminteractive.com/blog/?p=458</guid>
		<description><![CDATA[There&#8217;s a sociological test where a coin is placed on the sidewalk and a varied percentage of people will stop to pick up the coin. There are many factors, the greatest being the value of the coin. The average person &#8230; <a href="http://www.mindstorminteractive.com/blog/topics/a-penny-on-the-sidewalk/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s a sociological test where a coin is placed on the sidewalk and a varied percentage of people will stop to pick up the coin. There are many factors, the greatest being the value of the coin. The average person won&#8217;t take the time to bend down and pick up a penny, but most people will pick up a quarter. Nickels and dimes fall somewhere in between.</p>
<p>I&#8217;m not sure what the exact purpose of the study is, but I think it makes a great metaphor for a tool or application that isn&#8217;t quite worth the trouble to use.  Oftentimes it&#8217;s the very simplest differences that determine whether the cost of learning and using a tool is worth the value that the tool provides.</p>
<p>Example: Team Foundation Server takes a long time to load, loads into a small window inside visual studio, and requires lots of clicks to push things through (Assigned must be saved as Active, THEN as closed). The web version loads faster but I hate that I can&#8217;t simply check off a list of bugs and perform a bulk update. Creating a new bug requires me to fill out several fields, and it&#8217;s just not worth the trouble for most minor bugs, so I jot them down on a notepad in a meeting then type them into a word doc.</p>
<p>Fogbugz has a beautiful, intuitive interface, you could quickly add bugs and manage bugs with bulk actions.  I would write things down directly in fogbugz. Both work, but it&#8217;s a quarter on the sidewalk. Granted, I didn&#8217;t set it up, and the fact that TFS is built into Visual Studio gives it more credence, and it does have a lot of integrated features which give it more value.</p>
<p>Another example, I just recommended to my collegue and fellow blogger to change his homepage settings to show full articles instead of summaries. this was my case:  my wife reads lots of blogs. She uses an agregate service (google reader) and will only read blogs that show up in full because it&#8217;s faster to load and more convenient, especially on a smart phone. She won&#8217;t even bother subscribing to blogs with a summary setting. That tiny inconvenience of having to click into your site and back to the reader is that little difference between being a penny or a quarter on the sidewalk. That may be a rare and very subjective case.  I could go on about the best cases like credit card purchase streamlining solutions or the worst cases of sites that make you do back flips to perform the simplest task, but I think you get the idea.</p>
<p>So is your solution a penny or a quarter on the sidewalk? (If you won&#8217;t bother to pick up a quarter then you are a snob).  Some factors are personal preference, but they all amount to a few universal factors:</p>
<ol>
<li> <strong>Speed.</strong><br />
The king of kings. Take too long to load your pretty pictures and I&#8217;m out. Animation? It&#8217;d better be quick and fluid. Flash Intro? Skip. It was cool the first time&#8230;maybe. I have to create an account before getting basic info? I&#8217;m looking at YOU, experts &#8211; exchange . com, (purposely not a link). Don&#8217;t ask why stackoverflow is crushing you. Myspace vs. Facebook? Enough said. Keep your glitter, give me my news feed.</li>
<li><strong>Usability.</strong><br />
Yes, noble developer, you find your site easy to use and don&#8217;t know why everyone else has so much trouble. Well, they don&#8217;t live on the web 8 hours a day like you and haven&#8217;t been staring at this app for the last six months.  You have to watch people use your site, see how they don&#8217;t even notice your glossy icons and how they struggle to perform the simplest tasks, despite your tooltips, FAQ, user guide pdf and captivate animations. Hear how they curse at your creation, and wistfully compare your solution to their old, dependable paper system.<br />
Coupled with basic understanding is the general ease of use factor. Forcing users to click through extra pages to get details or update individual records when using AJAX to load extra data or including a bulk update feature would work; these are the subtle features that greatly affect user experience. In instances where users are making an online purchase, they can often make or break a sale.</li>
<li><strong>Reliability.</strong><br />
A.K.A. Quality of Service. &#8220;The network is down!&#8221; Cries Chicken little. This app has gotten really slow, it&#8217;s really frustrating! Oh, that&#8217;s because of that sleek javascript thing you wrote. It worked so well in your development environment with two test records. Bet you didn&#8217;t account for people pasting 10 page word docs into the &#8220;Remarks&#8221; field and uploading giant uncompressed powerpoint files.</li>
<li><strong>Design</strong>.<br />
This is often the first lamb to the slaughter when budgets or schedules get crunched and that is a great tragedy. A high quality interface design not only provides clarity and improves usability, but on an almost subconscious level, you just feel better when you&#8217;re interacting with a sleek, modern design . It gives an impression that the underlying technology is built with the same attention to detail. It is also important that design decisions are implemented site-wide to make a uniform user experience.</li>
</ol>
<p>There&#8217;s nothing revolutionary here; these are pretty much common sense. What I find amazing is how many developers I&#8217;ve met that simply don&#8217;t seem to care about user experience.  They simply go through their requirements checklist and feel like their work is done when <em>they</em> are capable of executing the required actions within their own application.  The apathy epidemic is most acute on internal applications, partly due to the fact that the audience is a captive audience. It&#8217;s their job to use the in-house app and there&#8217;s no alternative. Developers can&#8217;t take all the blame though. Business decisions often place user experience as a lower priority and don&#8217;t allocate the time or personnel required to truly make a project shine.  In many cases, developers aren&#8217;t even allowed to add or improve features that weren&#8217;t specifically requested or paid for by the client. But in those cases, it&#8217;s the client&#8217;s fault, and there is no more literal example of the phrase &#8220;You get what you pay for&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mindstorminteractive.com/blog/topics/a-penny-on-the-sidewalk/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

