<?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>.Net Smoothie &#187; Quaility</title>
	<atom:link href="http://www.richardbushnell.net/category/quaility/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.richardbushnell.net</link>
	<description></description>
	<lastBuildDate>Wed, 30 Dec 2009 11:42:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>The LinqDataSource and the Hidden Viewstate</title>
		<link>http://www.richardbushnell.net/2008/02/21/the-linqdatasource-and-the-hidden-viewstate/</link>
		<comments>http://www.richardbushnell.net/2008/02/21/the-linqdatasource-and-the-hidden-viewstate/#comments</comments>
		<pubDate>Thu, 21 Feb 2008 08:00:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[ASP.Net]]></category>
		<category><![CDATA[C# 3.0]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Quaility]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[concurrency]]></category>
		<category><![CDATA[LINQ to SQL]]></category>
		<category><![CDATA[LinqDataSource]]></category>
		<category><![CDATA[ViewState]]></category>

		<guid isPermaLink="false">http://richardbushnell.net/index.php/2008/02/21/the-linqdatasource-and-the-hidden-viewstate/</guid>
		<description><![CDATA[Yesterday I thought I&#8217;d learn about the LinqDataSource in ASP.Net 3.5, and got an interesting surprise. The new LinqDataSource can also be used with a LINQ-to-SQL model to perform updates. You simply add the DataSource to your page, set the table name, and set EnableUpdate to true. Then, using a standard DataControl, you can make [...]]]></description>
			<content:encoded><![CDATA[
<!-- using Like-Button-Plugin-For-Wordpress [v4.2] | by http://www.gb-world.net -->
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.richardbushnell.net%2F2008%2F02%2F21%2Fthe-linqdatasource-and-the-hidden-viewstate%2F&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="false" style="border:none; overflow:; width:450px; height:30px"></iframe>
<!-- using Like-Button-Plugin-For-Wordpress [v4.2] | by http://www.gb-world.net -->
<br><p>Yesterday I thought I&#8217;d learn about the <strong>LinqDataSource</strong> in ASP.Net 3.5, and got an interesting surprise.</p>
<p>The new <strong>LinqDataSource</strong> can also be used with a LINQ-to-SQL model to perform updates. You simply add the <strong>DataSource</strong> to your page, set the table name, and set <strong>EnableUpdate</strong> to true. Then, using a standard <strong>DataControl</strong>, you can make updates to your data entities.</p>
<p>The question is, how does this work? It appears to be a bit magical. <span id="more-55"></span></p>
<h2>The Magic of LINQ</h2>
<p>In a <a href="http://richardbushnell.net/index.php/2008/02/18/how-to-update-data-with-linq-to-sql/">previous post</a>, I mentioned that LINQ-to-SQL updates can be done in two ways: either you make a call to retrieve a row, then update it, or you provide known values for all fields and try to update using optimistic concurrency.</p>
<p>If the <strong>LinqDataSource</strong> used the first technique, the performance might be bad. Plus, it would have to only update those fields that had been updated by the <strong>DataControl</strong>, and ignore the rest. That wouldn&#8217;t make sense, so I correctly supposed that was not what was happening.</p>
<p>It makes more sense that the <strong>LinqDataSource</strong> would use the values input by the user to make the changes. It could use optimistic concurrency to compare all the entered values.</p>
<p>The problem is, I don&#8217;t always display all fields from a particular row on the form, so how would the <strong>LinqDataSource</strong> know what the missing fields were. Remember, all the fields involved in the update are required for the optimistic concurrency to work. That is usually all the fields in a row, and they aren&#8217;t usually all displayed.</p>
<p>So, have a guess. Where does the <strong>LinqDataSource</strong> store it&#8217;s values?</p>
<p>Let&#8217;s think now. Where would be the <em>easiest </em>place to keep it? To keep it really simple, I&#8217;ll let you ignore <a href="http://richardbushnell.net/index.php/2007/12/23/qualities-of-a-dot-net-application-design/">all other aspects of building an application</a>, like security or performance.</p>
<p>Yep, you guessed it &#8211; <strong>ViewState</strong>.</p>
<p>The ViewState actually contains all values for all the fields in a LINQ-to-SQL entity by default. Those values are sent to the client, even if the user isn&#8217;t supposed to be able to see them.</p>
<p>Aaaarrgghhhh!</p>
<p>Now, let&#8217;s not get overexcited. The ViewState is encoded, so it&#8217;s not easy to just go and change it. But it&#8217;s not impossible. In general, I don&#8217;t think it&#8217;s such a great idea to have all data sent to a client by default. Someone is going to overlook something one day, and there&#8217;ll be a costly mistake.</p>
<p>And what if you display a large grid using the LinqDataSource. Well, you aren&#8217;t just getting the ViewState from the grid sent back and forth with your page, but the LinqDataSource is going to store <em>all your data</em> retrieved in the ViewState too.</p>
<p>Bummer!</p>
<p>Great control. Large overhead.</p>
<h2>Kicking out the ViewState</h2>
<p>The good news is that the ASP.Net team realized that this was a problem and did something about it.</p>
<p>If you look carefully, you will notice that the <strong>LinqDataSource</strong> has a property <strong>StoreOriginalValuesInViewState</strong>. By default (sigh) that property is set to true. If you set it to false, the control won&#8217;t work any more. Simple as that.</p>
<p>Here&#8217;s what the official documentation has to say about that:</p>
<blockquote><p>If you set the <strong>StoreOriginalValuesInViewState</strong> property to false, the original values are not persisted in view state for the data-bound control. In that case, LINQ to SQL cannot verify the integrity of the data. LINQ to SQL will throw an exception that indicates a data conflict even if the data in the data source has not actually changed.</p></blockquote>
<p>That&#8217;s in the remarks section of the <strong>LinqDataSource</strong>.<strong>StoreOriginalValuesInViewState</strong> property documentation.</p>
<p>Funnily enough, the same section states the problem with stuffing data into the ViewState:</p>
<blockquote><p>Storing the original values in view state can cause the page size to become unnecessarily large and can expose sensitive data to a malicious user.</p></blockquote>
<p>Now, I don&#8217;t know about you, but that looks like a pretty serious warning to me. Why isn&#8217;t it in a more obvious place, like as a comment that pops in up Intellisense whenever you use a LinqDataSource?</p>
<h2>Check the UpdateCheck</h2>
<p>So how do you handle it? How can you use the <strong>LinqDataSource</strong>?</p>
<p>The answer lies in the generation of the LINQ-to-SQL model which you generate. Each entity field has a <strong>Column </strong>attribute which allows you to specify if it is used for checking during an optimistic concurrency field comparison.</p>
<p>For example, you could create a Model with the following Property:</p>
<pre class="code">[<span style="color: #2b91af">Column</span>(Storage=<span style="color: #a31515">"_AddressID"</span>, UpdateCheck=<span style="color: #2b91af">UpdateCheck</span>.Never, ...
<span style="color: blue">public int </span>AddressID
...</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Notice the <strong>UpdateCheck.Never </strong>value. That means that the field will not be used in the optimistic concurrency check.</p>
<p>The documentation helps a little again:</p>
<blockquote><p>By default, when update and delete operations have been enabled, the <a href="ms-help://ms.vscc.v90/9b2f476d-7f28-2aa8-8143-3082edcf11d5.htm">LinqDataSource</a> control stores the original values for all the records in view state. The <a href="ms-help://ms.vscc.v90/9b2f476d-7f28-2aa8-8143-3082edcf11d5.htm">LinqDataSource</a> control stores values for all primary keys and all properties not marked with UpdateCheck.Never in the Column attribute. You set the UpdateCheck property of the Column attribute in the O/R Designer.</p></blockquote>
<p>Admittedly, I haven&#8217;t yet tried that, so I don&#8217;t really know how if you can change that setting for a field without changing generated code, which would be a big no-no. I&#8217;ll just have to get back to you on that.</p>
<h2>Stamp In, Please</h2>
<p>However, there is a shortcut trick.</p>
<p>Basically, if you add a field of type <strong>timestamp</strong> to your record, only that field will be used for the concurrency check, and only that field&#8217;s data will be stored in the ViewState.</p>
<blockquote><p>If the underlying data source contains a timestamp field that is automatically updated during an update, you can store only that value in view state. In that case, the timestamp property in the entity class is set to IsVersion=true and all the properties are set to UpdateCheck.Never. Because a timestamp field is automatically updated by the database every time that data in that record changes, LINQ to SQL determines from that value if data has changed. This helps reduce the size of view state, and no sensitive data is exposed. LINQ to SQL will check for data consistency by comparing the timestamp value in view state with the timestamp value in the database.</p></blockquote>
<p>The documentation is great, if you know where to find it. <img src='http://www.richardbushnell.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Conclusion</h2>
<p>So, the answer is, if you use the <strong>LinqDataSource</strong> to throw a quick application together, make sure you use a <strong>timestamp</strong> field in your table. Call it <strong>UpdatedOn</strong>, or something. It will make the use of the <strong>LinqDataSource</strong> a lot easier, if only because you&#8217;ll sleep better not worrying about it.</p>

<!-- using Like-Button-Plugin-For-Wordpress [v4.2] | by http://www.gb-world.net -->
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.richardbushnell.net%2F2008%2F02%2F21%2Fthe-linqdatasource-and-the-hidden-viewstate%2F&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="false" style="border:none; overflow:; width:450px; height:30px"></iframe>
<!-- using Like-Button-Plugin-For-Wordpress [v4.2] | by http://www.gb-world.net -->
]]></content:encoded>
			<wfw:commentRss>http://www.richardbushnell.net/2008/02/21/the-linqdatasource-and-the-hidden-viewstate/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Efficient Software Development with Visual Studio Team System 2008</title>
		<link>http://www.richardbushnell.net/2008/01/12/efficient-software-development-with-visual-studio-team-system-2008/</link>
		<comments>http://www.richardbushnell.net/2008/01/12/efficient-software-development-with-visual-studio-team-system-2008/#comments</comments>
		<pubDate>Sat, 12 Jan 2008 10:57:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Quaility]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Team System]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[.Net Visual Studio Team System 2008 development]]></category>

		<guid isPermaLink="false">http://richardbushnell.net/index.php/2008/01/12/efficient-software-development-with-visual-studio-team-system-2008/</guid>
		<description><![CDATA[I was recently asked to do some research and give a presentation about using Visual Studio Team System 2008. I thought I&#8217;d experiment with Slideshare.net and post it here. The presentation was for a large corporation, and will possibly not come across as being very useful for an online presentation. I have been working on [...]]]></description>
			<content:encoded><![CDATA[
<!-- using Like-Button-Plugin-For-Wordpress [v4.2] | by http://www.gb-world.net -->
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.richardbushnell.net%2F2008%2F01%2F12%2Fefficient-software-development-with-visual-studio-team-system-2008%2F&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="false" style="border:none; overflow:; width:450px; height:30px"></iframe>
<!-- using Like-Button-Plugin-For-Wordpress [v4.2] | by http://www.gb-world.net -->
<br><p>I was recently asked to do some research and give a presentation about using Visual Studio Team System 2008. I thought I&#8217;d experiment with Slideshare.net and post it here.</p>
<object width="400" height="328"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc="/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc="  type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="400" height="328"></embed></object>
<p>The presentation was for a large corporation, and will possibly not come across as being very useful for an online presentation. I have been working on it for a while though, and I think it&#8217;s worth publishing, if only as an introduction.</p>
<p>I&#8217;ve used competitive products to Team System for a long time, mainly open source:</p>
<ul>
<li>SubVersion for source version control
<li>CruiseControl.Net as a build server
<li>NAnt for build scripts
<li>MbUnit for testing
<li>NCover for seeing my testing code coverage
<li>VersionOne for project planning, task management, tracking and reporting
<li>BugTracker for bug tracking
<li>A Wiki for project documentation and guidelines </li>
</ul>
<p>I wasn&#8217;t all-too impressed with the standard of Visual Studio Team Suite 2005, but I am a little bit happier with the 2008 version. It took a while to get it installed so that I could test it, and there were lots of seemingly undocumented points which hindered my progress, but once I&#8217;d got it up-and-running, I didn&#8217;t find it that bad. (I did have to install it on&nbsp; virtual machine, and run it on my laptop.)</p>
<p>I think the best thing about Team System is that all the things I need to do are now integrated into one place. I didn&#8217;t have to go make changes to a dozen XML files in order to get a build server working. I didn&#8217;t have to install a Wiki for the project documentation. Using Team System would also avoid resistance to using the products, as I&#8217;ve faced before trying to get other team members to use such tools. Everything would just be there, out-of-the-box, and no one would argue about using them.</p>
<p>What I didn&#8217;t like about Team System are some of the subtle details which don&#8217;t work as they should do. I did a basic test of multiple check-outs, using the new features, but it didn&#8217;t work. The Unit Tests that I generated were confusing and were buggy.</p>
<p>The biggest problem though is the price. It&#8217;s darn expensive. I wouldn&#8217;t be able to afford Team System if I was just a small development shop. However, for a large corporation, it really could make sense.</p>
<p>I actually wonder if there&#8217;s room for a better competitor (Rational is possibly the only serious contender, and I find their software pretty naff). It actually wouldn&#8217;t to be too hard for some Python hackers somewhere. <img src='http://www.richardbushnell.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<!-- using Like-Button-Plugin-For-Wordpress [v4.2] | by http://www.gb-world.net -->
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.richardbushnell.net%2F2008%2F01%2F12%2Fefficient-software-development-with-visual-studio-team-system-2008%2F&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="false" style="border:none; overflow:; width:450px; height:30px"></iframe>
<!-- using Like-Button-Plugin-For-Wordpress [v4.2] | by http://www.gb-world.net -->
]]></content:encoded>
			<wfw:commentRss>http://www.richardbushnell.net/2008/01/12/efficient-software-development-with-visual-studio-team-system-2008/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Are you keeping up with software development?</title>
		<link>http://www.richardbushnell.net/2008/01/08/are-you-keeping-up-with-software-development/</link>
		<comments>http://www.richardbushnell.net/2008/01/08/are-you-keeping-up-with-software-development/#comments</comments>
		<pubDate>Tue, 08 Jan 2008 06:25:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Quaility]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[changes in software development]]></category>

		<guid isPermaLink="false">http://richardbushnell.net/index.php/2008/01/08/are-you-keeping-up-with-software-development/</guid>
		<description><![CDATA[DotNetRocks, the internet talkshow for .Net developers, has a great show about development changes over the past 20 years. Carl Franklin interviews Kathleen Dollard, who has put a list of changes together, and is publishing them online. If you want to know where you currently stand in your software development, you want to listen to [...]]]></description>
			<content:encoded><![CDATA[
<!-- using Like-Button-Plugin-For-Wordpress [v4.2] | by http://www.gb-world.net -->
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.richardbushnell.net%2F2008%2F01%2F08%2Fare-you-keeping-up-with-software-development%2F&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="false" style="border:none; overflow:; width:450px; height:30px"></iframe>
<!-- using Like-Button-Plugin-For-Wordpress [v4.2] | by http://www.gb-world.net -->
<br><p><a href="http://www.dotnetrocks.com/default.aspx" target="_blank">DotNetRocks</a>, the internet talkshow for .Net developers, has a great <a href="http://www.dotnetrocks.com/default.aspx?showNum=304" target="_blank">show about development changes</a> over the past 20 years. <a href="http://www.intellectualhedonism.com/2007/12/27/NETRocks302JeffProsiseGoesDeepOnSilverlight.aspx" target="_blank">Carl Franklin</a> interviews <a href="http://msmvps.com/blogs/kathleen/default.aspx" target="_blank">Kathleen Dollard</a>, who has put a <a href="http://msmvps.com/blogs/kathleen/archive/2007/11/14/looking-at-the-list-1-of-6-or-7.aspx" target="_blank">list of changes together</a>, and is publishing them online.</p>
<p>If you want to know where you currently stand in your software development, you want to listen to this show. You might even want to take notes.</p>
<p>If you are recruiting developers, you also should listen to this show. You could use very effectively it to find out what kind of people you are interviewing. </p>
<p>The first 10 of 60 items on Kathleen&#8217;s list of changes are:</p>
<ol>
<li>Parallel entities</li>
<li>N-Tier</li>
<li>Sheer magnitude</li>
<li>Application code generation</li>
<li>SOA (Service Oriented Architecture)</li>
<li>Semantics and canonical messages</li>
<li>Workflow</li>
<li>Rules engines</li>
<li>Aspect oriented programming</li>
<li>Impact of libraries</li>
</ol>
<p>Every software developer or architect should know at least a little about each item on this list. If you don&#8217;t, maybe you could use this to pull your career up a level.</p>

<!-- using Like-Button-Plugin-For-Wordpress [v4.2] | by http://www.gb-world.net -->
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.richardbushnell.net%2F2008%2F01%2F08%2Fare-you-keeping-up-with-software-development%2F&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="false" style="border:none; overflow:; width:450px; height:30px"></iframe>
<!-- using Like-Button-Plugin-For-Wordpress [v4.2] | by http://www.gb-world.net -->
]]></content:encoded>
			<wfw:commentRss>http://www.richardbushnell.net/2008/01/08/are-you-keeping-up-with-software-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qualities of a .Net Application Design</title>
		<link>http://www.richardbushnell.net/2007/12/23/qualities-of-a-dot-net-application-design/</link>
		<comments>http://www.richardbushnell.net/2007/12/23/qualities-of-a-dot-net-application-design/#comments</comments>
		<pubDate>Sun, 23 Dec 2007 11:00:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[ASP.Net]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Quaility]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[architecture software quality .net asp.net scalability]]></category>

		<guid isPermaLink="false">http://richardbushnell.net/?p=8</guid>
		<description><![CDATA[I&#8217;m often asked to produce design documents for new applications. I can&#8217;t do this without discussing the advantages and disadvantages to each part of the design. A great way to do this is to focus on the desired qualities of the system you&#8217;re trying to build. Define the qualities you are trying to achieve, and [...]]]></description>
			<content:encoded><![CDATA[
<!-- using Like-Button-Plugin-For-Wordpress [v4.2] | by http://www.gb-world.net -->
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.richardbushnell.net%2F2007%2F12%2F23%2Fqualities-of-a-dot-net-application-design%2F&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="false" style="border:none; overflow:; width:450px; height:30px"></iframe>
<!-- using Like-Button-Plugin-For-Wordpress [v4.2] | by http://www.gb-world.net -->
<br><p>I&#8217;m often asked to produce design documents for new applications. I can&#8217;t do this without discussing the advantages and disadvantages to each part of the design. A great way to do this is to focus on the desired qualities of the system you&#8217;re trying to build. Define the qualities you are trying to achieve, and design each part of the system to match those qualities as best as possible.</p>
<p>It helps to have a list of things to consider. Here&#8217;s a list of some of the qualities you need to address for a .typical Net application:</p>
<h2></h2>
<h2>Development-Time Qualities</h2>
<ul>
<li><strong>Modifiability</strong> &#8211; (Often called &#8220;<strong>flexibility</strong>&#8220;, and especially important for agile development.) How easily can the software be modified to additional requirements and changes? Can changes be localized to as little code as possible? Do public interfaces have to change? How are the parts of the application dependent on one another? Are the most-likely-to-change areas of the application depended upon to be stable? To what extent are concerns separated?
<li><strong>Reusability</strong> &#8211; Can units of the application be reused elsewhere? Does the code fit the &#8220;DRY&#8221; principle (Don&#8217;t Repeat Yourself)? Does the system make good use of existing standards? Reusing code from other frameworks and systems can help keep testing and maintenance down, but reduce modifiability.
<li><strong>Portability</strong> &#8211; Could the system be easily ported to other platforms? This is often not an issue for most enterprise applications, as business requirements typically change more frequently than the technical platforms, and the .Net framework takes care of most of the issues. For a web application, portability could also include browser compatibility. What happens if the users suddenly receive an upgrade to their browsers?
<li><strong>Testability</strong> &#8211; How easy is it to prove that the application functions correctly, and that the various parts of the application do what they are supposed to do in isolation of one another? Can the application be tested automatically? Can the application eventually be tested easily end-to-end as part of an integration test? Can the application be load-tested?
<li><strong>Buildability</strong> &#8211; Can the application be built on systems other than those in the development environment? How often can it be built? The more often it can be built, the better. What tools can be used to do the builds? Can they implement continuous integration by building at every check-in? Which third-party controls or components are used? What part do licenses for third-party products play in the ability to build centrally?
<li><strong>Maintainability</strong> &#8211; How easy is it to understand the software for people other than the original developers? How easy is it to correct defects? Is the system documented enough to make it understandable?
<li><strong>Debugability</strong> &#8211; How easy is it to find out where and why there is an error in the system? How easy is it to find what is going wrong in a live, productive system?
<li><strong>Extensibility</strong> &#8211; How easy is it to extend the functionality of the system beyond its original specification?</li>
</ul>
<h2>Runtime Qualities</h2>
<ul>
<li><strong>Functionality</strong> &#8211; How well does the software help the users to do their work? Are there missing features which make the software useless? Does the software provide end-to-end support for a particular process?
<li><strong>Usability</strong> &#8211; How easy is it for users to understand and learn to use the software?&nbsp; Is the interface intuitive? Is there a supportive help system? Does the user interface match the users&#8217; needs? Are basic usability standards and conventions adhered to?
<li><strong>Performance</strong> &#8211; Does the system perform fast enough? How does it perform when multiple users are active? Where are the bottlenecks and latency in the system?
<li><strong>Concurrency</strong> &#8211; Is it possible for more than one user to use the system at a time? What is the performance impact of multiple sessions? Is state shared across the application, making the system unreliable?
<li><strong>Security</strong> &#8211; Does the system prevent unauthorized access or misuse? What happens if access is wrongly denied to a user? How easy can security be administrated? Does the STRIDE threat model show up any weaknesses? What is the potential outcome of a successful attack?&nbsp;
<li><strong>Integrity</strong> &#8211; This can be related to security, but it also refers to the data integrity of the system. Is the data always kept in a consistent state, or is it sometimes possible to infer different states of the system because of inconsistencies in the system? Do transactions pass the ACID test?
<li><strong>Reliability</strong> &#8211; Can the users rely on the software? Will it always perform correctly? Is it still usable at peak usage periods?
<li><strong>Availability</strong> &#8211; How often and for how long is the system available for use? How do upgrades affect its availability? Is the system meant to be used across time-zones?
<li><strong>Scalability</strong> &#8211; How does the software cope with adding more users over time? Can the system cope with an increase in the volume of data? What happens if the users start to use the system more often? Must the software scale up or can it scale out?
<li><strong>Deployability</strong> &#8211; How easy is it to deploy the initial release of the software? How easy is it to release future releases? Does software need to be replaced, or just patched? How does the deployment affect scalability?
<li><strong>Ugradability</strong> &#8211; Can a new version be deployed without stopping the normal operation of the system? What must be changed or upgraded when a new version is released? What third-party software may be upgraded which would affect the software?
<li><strong>Correctness</strong> &#8211; Does the software do exactly what was specified?
<li><strong>Conceptual Integrity</strong> &#8211; How balanced, simple, elegant, and practical is the whole system? Is there a clear vision as to what the software should do? Is the design consistent?
<li><strong>User Responsiveness</strong> &#8211; Related to performance and usability; how does the user perceive the application to be responding? Does the system stop responding for long periods of time, especially when retrieving data? Does the latency of parts of the system lead to decreased usability? Does the software use multiple threads to improve responsiveness?
<li><strong>Interoperability</strong> &#8211; How easily can the system be used with other systems?
<li><strong>Robustness</strong> &#8211; How does the system react to abnormal conditions? Does it crash, or recover gracefully? Do error messages baffle users and decrease usability?</li>
</ul>
<h2>Priorities</h2>
<p>Software qualities must always be balanced against one another. There&#8217;s no point in having performance good enough for MySpace.com if it&#8217;s not needed, for example, especially if it makes maintenance harder. Each quality has a particular importance for the system being developed. </p>
<p>In general the highest priority qualities are:</p>
<ul>
<li>Maintainability
<li>Correctness
<li>Reliability</li>
</ul>
<p>Also important for .Net Object-Oriented design are:</p>
<ul>
<li>Reusability
<li>Extensibility</li>
</ul>
<p>Most of what I focus on in my day-to-day work is focused on good maintainability and modifiability. Changes come along all the time, and the people paying for the software want them done fast. The faster you can adapt to their needs, the more they trust you, and the better your business relationship.</p>

<!-- using Like-Button-Plugin-For-Wordpress [v4.2] | by http://www.gb-world.net -->
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.richardbushnell.net%2F2007%2F12%2F23%2Fqualities-of-a-dot-net-application-design%2F&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="false" style="border:none; overflow:; width:450px; height:30px"></iframe>
<!-- using Like-Button-Plugin-For-Wordpress [v4.2] | by http://www.gb-world.net -->
]]></content:encoded>
			<wfw:commentRss>http://www.richardbushnell.net/2007/12/23/qualities-of-a-dot-net-application-design/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

