<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://interactiveasp.net/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>Nate's Stuff : Architecture</title><link>http://interactiveasp.net/blogs/natesstuff/archive/tags/Architecture/default.aspx</link><description>Tags: Architecture</description><dc:language>en</dc:language><generator>CommunityServer 2008 (Build: 30417.1769)</generator><item><title>Visual NDepend Blows My Socks Off!</title><link>http://interactiveasp.net/blogs/natesstuff/archive/2009/02/26/visual-ndepend-blows-my-socks-off.aspx</link><pubDate>Fri, 27 Feb 2009 00:10:23 GMT</pubDate><guid isPermaLink="false">b80005ef-4071-4968-b08e-765d7d71b33e:515</guid><dc:creator>Nathan Zaugg</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://interactiveasp.net/blogs/natesstuff/rsscomments.aspx?PostID=515</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://interactiveasp.net/blogs/natesstuff/commentapi.aspx?PostID=515</wfw:comment><comments>http://interactiveasp.net/blogs/natesstuff/archive/2009/02/26/visual-ndepend-blows-my-socks-off.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/Splash_5F00_2B39B8DE.png" target="_blank"&gt;&lt;img title="Splash" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 10px 5px 0px; border-right-width: 0px" height="94" alt="Splash" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/Splash_5F00_thumb_5F00_0A25FA9D.png" width="229" align="left" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I’m not easily impressed by even the best of software.&amp;#160; There is usually some little thing that ruins my user experience.&amp;#160; I tell you this so you know that what I say next is something special.&amp;#160; Visual NDepend is AWESOME!&amp;#160; Everything meet or far exceeded my expectations!&amp;#160; If you are not yet running this software, you should be!&amp;#160; This is not one of those ‘nice to have’ pieces of software like you might thing.&amp;#160; This is a must have!&amp;#160; If Microsoft was smart they would do everything they could to package this in with Visual Studio 2010.&amp;#160; &lt;/p&gt;  &lt;p&gt;What does it do? It’s hard to answer that question in a paragraph or two.&amp;#160; The basic answer is that it gives you a set of different representations of your software in such a way that you can understand the architecture and complexity.&amp;#160; This can be a huge help before undertaking large refactor efforts.&amp;#160; It also gives you an idea or the quality of the code based off of some metrics.&amp;#160; This quality score can be a really good indicator of wither your code is going to be maintainable and if it’s not it can help you get it there.&amp;#160; Before I go through the quick walkthrough of the software it’s self I’ll just say this – If you’re not paying attention to code metrics and the maintainability of the code from the earliest stages of development your likely not going to develop code that is easy to maintain.&amp;#160; And as you probably know, software maintenance is usually more than 3/4ths the cost of the software lifecycle.&amp;#160; Therefore, if you can get a build process established early and use a tool like NDepend to keep a close watch on some important metrics I can guarantee you will be creating much higher quality software than you would have otherwise.&lt;/p&gt;  &lt;h2&gt;Installation Experience&lt;/h2&gt;  &lt;p&gt;This is the best kind of install – you simply unzip the files.&amp;#160; I bet you didn’t think I would do a whole section on install when there is nothing to the install.&amp;#160; I suppose if it were any other product there would be a lot under this section.&amp;#160; &lt;/p&gt;  &lt;h2&gt;Analyze a Project&lt;/h2&gt;  &lt;p&gt;The user interface is very intuitive.&amp;#160; I installed integration with Visual Studio 2008 and .NET Reflector with minimal effort and started to analyze my assembly.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/Analyzing_5F00_3087DDE8.png" target="_blank"&gt;&lt;img title="Analyzing" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="115" alt="Analyzing" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/Analyzing_5F00_thumb_5F00_73EFDF4A.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/MainScreen_5F00_334D92DB.png" target="_blank"&gt;&lt;img title="Main Screen" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="442" alt="Main Screen" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/MainScreen_5F00_thumb_5F00_0E4FD262.png" width="504" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;It took a while to analyze but this particular assembly is quite large!&amp;#160; It also pulls in any referenced assemblies so the graph can be complete.&amp;#160; It allows you to specify multiple assemblies just in case you have sets of assemblies in the same project that have no direct relationship.&amp;#160; In this case I had a WCF service that would need to be added separately as it’s technically not a direct dependency.&amp;#160; Once the analysis is complete it’s INFORMATION OVERLOAD!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/Analysis_5F00_4DAD85F2.png" target="_blank"&gt;&lt;img title="Analysis" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="440" alt="Analysis" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/Analysis_5F00_thumb_5F00_7819B70F.png" width="504" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;Results&lt;/h2&gt;  &lt;p&gt;There are six or seven main results to view.&amp;#160; The most obvious is the bubble chart at the top.&amp;#160; This gives you a visual representation of different aspects of the code.&amp;#160; For example it’s currently set to Method level and the metric shown is number of lines of code.&amp;#160; the larger the bubble, the larger the method is in relation to the others.&amp;#160; I can select from Method, Field, Type, Namespace or Assembly.&amp;#160; In addition there are 11 different metrics that you can plot in the bubble chart.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/BubbleChart_5F00_73370353.png" target="_blank"&gt;&lt;img title="Bubble Chart" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="298" alt="Bubble Chart" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/BubbleChart_5F00_thumb_5F00_51D75DB7.png" width="504" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The next thing you notice is the dependency graph.&amp;#160; Unfortunately this project doesn’t have a dependency graph like in my other &lt;a title="Avoiding Circular Dependencies" href="http://interactiveasp.net/blogs/natesstuff/archive/2008/06/09/avoiding-circular-dependencies.aspx" target="_blank"&gt;blog post&lt;/a&gt;.&amp;#160; Visual Studio makes it really tough to make circular dependencies but it is possible to create them if not all of your projects are loaded into the same solution.&amp;#160; And as I said in the other post, circular dependencies are very bad!&amp;#160; It’s also good to know what references what.&amp;#160; You might be surprised to see what kind of references get worked in over time.&amp;#160; On a recent project the data layer code kept working it’s way up to the UI even though it didn’t belong there.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/DependencyGraph_5F00_711A048A.png" target="_blank"&gt;&lt;img title="Dependency Graph" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="613" alt="Dependency Graph" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/DependencyGraph_5F00_thumb_5F00_1B8635A8.png" width="504" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The next section is the code metric-centric part. This is my most favorite portion of the results generated and can be a real good indicator of how maintainable a codebase is.&amp;#160; Of course it’s impossible to avoid all complexities in software so you probably can’t have a perfect score with every project but you can use this information to figure out what kinds of habits you have that contribute to un-maintainable code. As you can see from the image below when you select a metric it is highlighted in the bubble chart.&amp;#160; In fact, all of these reports are “active” so anything that is relevant to another will be indicated.&amp;#160; By the way, this application has amazing performance.&amp;#160; I’m pretty sure it’s using WPF under the hood.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/CodeMetrics_5F00_08D13BF1.png" target="_blank"&gt;&lt;img title="Code Metrics" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="308" alt="Code Metrics" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/CodeMetrics_5F00_thumb_5F00_59331D64.png" width="504" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/MethodsTooBig_5F00_383FAABD.png" target="_blank"&gt;&lt;img title="Methods Too Big" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="298" alt="Methods Too Big" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/MethodsTooBig_5F00_thumb_5F00_57161E9B.png" width="504" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Another really cool feature is the Dependency Matrix.&amp;#160; This takes some practice to use but it helps identify which pieces of which assemblies access pieces of other assemblies.&amp;#160; Again, great for refactoring efforts and a good indication of how an application is put together.&amp;#160; You may have to stair at the image below for a while to figure out what it’s trying to tell you but after a while it makes perfect sense.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/DependencyMatrix_5F00_6F3988F6.png" target="_blank"&gt;&lt;img title="Dependency Matrix" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="192" alt="Dependency Matrix" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/DependencyMatrix_5F00_thumb_5F00_0352A580.png" width="504" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Last, but certainly not least is the comprehensive report compiled into HTML.&amp;#160; This is the kind of thing that I’d love to see emailed to me each day, so I hope it’s easy to put this into a build process.&amp;#160; The report is awesome!&amp;#160; My favorite part of the software and I really like this software.&amp;#160; Below is the screen shot of the table of contents that is generated at the top.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/AnalysisReport_5F00_6D88BD22.png" target="_blank"&gt;&lt;img title="Analysis Report" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="404" alt="Analysis Report" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/AnalysisReport_5F00_thumb_5F00_1A9DA9F1.png" width="504" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The only feature I didn’t get a chance to try is code coverage results.&amp;#160; I would have loved to see that in action!&amp;#160; Too bad I don’t have a project with very good code coverage results and I’d be embarrassed to find out anything in detail about my code coverage.&amp;#160; Of course &lt;a href="http://interactiveasp.net/blogs/natesstuff/archive/2008/04/23/unit-testing-philosophy-code-coverage-is-meaningless.aspx" target="_blank"&gt;code coverage isn’t everything&lt;/a&gt; but it is a useful tool when taken into context and can be made more useful with nDepend.&lt;/p&gt;  &lt;p&gt;Overall, I would give this software very high marks!&amp;#160; I can’t wait to make this part of my build process!&amp;#160; It is worth the time and money!&lt;/p&gt;  &lt;h5&gt;Links:&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://www.ndepend.com/" href="http://www.ndepend.com/"&gt;http://www.ndepend.com/&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a title="http://interactiveasp.net/blogs/natesstuff/archive/2008/04/23/unit-testing-philosophy-code-coverage-is-meaningless.aspx" href="http://interactiveasp.net/blogs/natesstuff/archive/2008/04/23/unit-testing-philosophy-code-coverage-is-meaningless.aspx"&gt;http://interactiveasp.net/blogs/natesstuff/archive/2008/04/23/unit-testing-philosophy-code-coverage-is-meaningless.aspx&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a title="http://interactiveasp.net/blogs/natesstuff/archive/2008/06/09/avoiding-circular-dependencies.aspx" href="http://interactiveasp.net/blogs/natesstuff/archive/2008/06/09/avoiding-circular-dependencies.aspx"&gt;http://interactiveasp.net/blogs/natesstuff/archive/2008/06/09/avoiding-circular-dependencies.aspx&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://interactiveasp.net/aggbug.aspx?PostID=515" width="1" height="1"&gt;</description><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Tools/default.aspx">Tools</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Testing/default.aspx">Testing</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/.NET/default.aspx">.NET</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Product+Reviews/default.aspx">Product Reviews</category></item><item><title>The Service Oriented Architecture (SOA) Philosophy</title><link>http://interactiveasp.net/blogs/natesstuff/archive/2008/11/05/the-service-oriented-architecture-soa-philosophy.aspx</link><pubDate>Wed, 05 Nov 2008 22:53:00 GMT</pubDate><guid isPermaLink="false">b80005ef-4071-4968-b08e-765d7d71b33e:134</guid><dc:creator>Nathan Zaugg</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://interactiveasp.net/blogs/natesstuff/rsscomments.aspx?PostID=134</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://interactiveasp.net/blogs/natesstuff/commentapi.aspx?PostID=134</wfw:comment><comments>http://interactiveasp.net/blogs/natesstuff/archive/2008/11/05/the-service-oriented-architecture-soa-philosophy.aspx#comments</comments><description>&lt;p&gt;&lt;img border="0" align="left" width="127" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/SOA_5F00_3.png" alt="SOA" height="90" style="border-right:0px;border-top:0px;margin:0px 10px 5px 0px;border-left:0px;border-bottom:0px;" /&gt; Service Oriented Architecture is a software design concept that packages small pieces of modular functionality into &amp;quot;services&amp;quot; through the software lifecycle.&amp;nbsp; SOA separates functionality into a set of self-contained, modular units that can be combine by a simple application to accomplish a task.&amp;nbsp; This blog post will focus on a few specifics of SOA but will mostly discuss the benefits of using SOA in the Enterprise.&lt;/p&gt;
&lt;h3&gt;Background&lt;/h3&gt;
&lt;p&gt;One of the main pieces of philosophy that SOA embraces is the KISS (Keep It Simple &amp;amp; Stupid) principle.&amp;nbsp; The fact is that big complex projects fail while small, simple projects succeed.&amp;nbsp; As a developer I see this every day.&amp;nbsp; For example, a few months ago me and my friend Phil wrote&amp;nbsp;a web&amp;nbsp;site.&amp;nbsp; In the early days and weeks (after getting some of the basic requirements ironed out) functionality was really easy to add.&amp;nbsp; Everything existed in a very simple state because it was a simple design with simple requirements.&amp;nbsp; We finish the original set of requirements pretty early in the project when they decided that we wanted to do some enhancements.&amp;nbsp; These enhancements greatly complicated the application.&amp;nbsp; Now, adding even a small amount of functionality takes substantially longer.&amp;nbsp; Over the weekend I wanted to add the ability to add category in as part of the search.&amp;nbsp; In the early days of the project it was actually work to leave it out (I had to disable the box when they changed the type of search).&amp;nbsp; It was pretty easy to add it into the stored proc but then the coding changes!&amp;nbsp; I had to add it to my data layer, data model, view, and controller.&amp;nbsp; Of course, these changes broke some other functionality that was added after this feature was originally included.&amp;nbsp; Because Unit Testing wasn&amp;#39;t going to be part of the timeline we have to test a large portion of the site to be comfortable that this change didn&amp;#39;t break anything else.&amp;nbsp; The two universal facts are that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The larger and more complex an application becomes the longer it takes to add features. &lt;/li&gt;
&lt;li&gt;Changing code is more expensive that writing new code. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In &lt;a href="http://www.idesign.net/"&gt;Juval Lowey&lt;/a&gt; book called &lt;a href="http://www.amazon.com/Programming-NET-Components-Juval-Lowy/dp/0596102070/ref=pd_bbs_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1213032049&amp;amp;sr=8-1"&gt;Programming .NET Components&lt;/a&gt; he highlights that component-oriented programming can simplify and add flexibility to complex applications.&amp;nbsp; He also makes a good case for simple software and all of these concepts port directly into the SOA paradigm.&amp;nbsp; &lt;/p&gt;
&lt;h3&gt;What is a service?&lt;/h3&gt;
&lt;p&gt;When many people hear the term &amp;quot;service&amp;quot; they almost always either think of Web Service or Windows Service.&amp;nbsp; The truth is that a service can be almost anything that provides implementation to a consumer.&amp;nbsp; In this context a service can be a library that can be invoked (much like Win32 API), or it could be a piece of hardware that performs complex calculations (like a Graphics Card/GPU).&amp;nbsp; Believe it or not the World-Wide Web is just a bunch of different services.&amp;nbsp; Web services have been particularly popular as they meet the criteria for usability.&amp;nbsp; 1) Universally accessible, 2) Simple and Stateless.&amp;nbsp; In addition web services are easy to deploy, change, and have an already extensive existing infrastructure.&amp;nbsp; Web Services are also very scalable and are easy to make redundant which provides high availability.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/Application-Architecture_5F00_4.png"&gt;&lt;img border="0" width="504" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/Application-Architecture_5F00_thumb_5F00_1.png" alt="Application Architecture" height="273" style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;h6&gt;Figure 1: Enterprise SOA Diagram&lt;/h6&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Why SOA?&lt;/h3&gt;
&lt;p&gt;Besides the benefits from rapid software development there are many other benefits of SOA.&amp;nbsp; For those looking to make a business case of ROI consider that SOA helps to make your company easily and quickly change business processes to align with market conditions.&amp;nbsp; This is because the software is now modular and flexible and especially if you use some type of workflow for your complex business tasks these rules can be easily updated and changed.&amp;nbsp; Also, new functionality is quickly developed, integrated, and deployed.&amp;nbsp; Consider the difficulty involved in making a change in the order in which orders are filled.&amp;nbsp; With a Fat-Client approach you may have several different apps that depend on the order being predictable. &lt;/p&gt;
&lt;h4&gt;Testability&lt;/h4&gt;
&lt;p&gt;Testability is arguably one of the best benefits gained by the SOA approach.&amp;nbsp; Because we have a simple granular piece of functionality it makes testing of this functionality easy.&amp;nbsp; It is also easy to test as these smaller functions are designed to be exposed.&amp;nbsp; It can be difficult to test code that wasn&amp;#39;t intended to be consumed.&amp;nbsp; In terms of change management, if we keep our business running in services then our unit tests can help guarantee confidence in a new release of an application that uses several different services.&lt;/p&gt;
&lt;p&gt;Because the database is only touched by one layer of our enterprise application infrastructure and due to the fact that most services will exclusively deal with a small subset of tables -- changes to the database become greatly simplified in a true SOA environment.&amp;nbsp; This adds simplicity and allows the company to change more quickly to adapting demands on their business.&amp;nbsp; In addition different systems can be allowed to run on different databases which makes migration from one database to another significantly simpler.&lt;/p&gt;
&lt;h4&gt;Security&lt;/h4&gt;
&lt;p&gt;Security is a great reason to move toward SOA.&amp;nbsp; The biggest gain is that the Database servers can be safely tucked in a Back End Zone (BEZ) because our applications no longer need to connect directly to them.&amp;nbsp; This is also extremely helpful if you have each user connect to the database using Integrated Authentication or an account unique to each.&amp;nbsp; This will cause hundreds and thousands of connections on the database and reduce performance substantially!&amp;nbsp; Moving the database into a zone where it can only be accessed from the application servers limits the surface area for attack and greatly limits potential venerability.&amp;nbsp; For financial systems it is part of the infamous Sarbanes-Oxley (SOX) audit to prohibit access directly to the database (in addition to change logging requirements).&amp;nbsp; While this is not the only way to come into compliance with a SOX audit it is arguably one of the better ways.&amp;nbsp; &lt;/p&gt;
&lt;h4&gt;Simplicity&lt;/h4&gt;
&lt;p&gt;Again, the best benefit of SOA is the simplicity each service can have which results in less bugs, more developer productivity, modular reusable code, and flexibility.&amp;nbsp; Services should be broken up into a lot of different chunks to make them easier to manage and they should typically include only one concern (a single aspect of the business).&amp;nbsp; Other services can consume existing services to expose more complex business sceneries.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&amp;quot;It breaks down the complexity of software systems by isolating services.&amp;nbsp; This simplifies configuration management for each piece, and whole applications can be made compliant with new ordinances and business requirements without updating any of them.&amp;quot; -- Phil Gilmore&lt;/p&gt;
&lt;p&gt;Another benefit SOA gives us is that every call needs to have an interface that is carefully and purposefully designed.&amp;nbsp; Using Interfaces is a great way to promote loose-cohesion and makes changing different parts of the code much easier to accomplish.&amp;nbsp; So long as any changes you make can still be supported by the interface already defined most changes are inconsequential.&amp;nbsp; If you must make a change to the interface of a service you will typically be doing this to add new features and usually the existing interface can be left alone and a new version of the interface can be supported for that service.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&amp;quot;SOA has a downside in version control.&amp;nbsp; Services must usually be able to run side-by-side versions to support applications whose requirements don&amp;#39;t change synchronously.&amp;quot; -- Phil Gilmore&lt;/p&gt;
&lt;h4&gt;Performance&lt;/h4&gt;
&lt;p&gt;Performance is an important consideration when talking about services (especially web services) and potential impact to application performance.&amp;nbsp; Network round-trips are expensive -- even in a LAN environment.&amp;nbsp; Also the serialization and de-serialization of objects adds extra time for each call -- time that is not necessary when using a framework-style call.&amp;nbsp; While all of this is true, consider that any data retrieval is expensive.&amp;nbsp; If your application connects to a central database you still incur the overhead of connection to the database over the network, your data is still serialized as it goes over the wire and you will usually still hydrate objects with this data once you get it back.&amp;nbsp; At that point the only layer that a web service has that is extra is that of IIS.&amp;nbsp; When you factor in the connection pooling that can be accomplished on a service with the cost of having many (and perhaps even thousands) of concurrent connections to the database when thick clients connect directly it&amp;#39;s easy to see that your probably not going to see any significant performance loss by moving to this type of architecture.&amp;nbsp; It may take some getting used to when creating calls with a ton of parameters but it will perform well.&lt;/p&gt;
&lt;p&gt;Another thing to consider when looking at performance aspects of SOA is that a web service written with WCF is &lt;em&gt;&lt;strong&gt;fast&lt;/strong&gt;&lt;/em&gt;!&amp;nbsp; How fast? I haven&amp;#39;t benchmarked web services in .NET for quite a while (since Framework 1.1), but I know there were significant performance gains for the 2.0 Framework and even more gains for 3.0 &amp;amp; 3.5 Frameworks.&amp;nbsp; Additionally, the newer frameworks have much lighter formatters and endpoints than we did back then.&amp;nbsp; Keeping this in mind, back when I benchmarked a simple web service that would reverse a string that was sent to it as input that service was ran at a rate of 2,200 calls per second sustained!&amp;nbsp; This is a testament both to IIS as a middleware server and .NET Web services for sheer speed!&amp;nbsp; Our other web service was coded in Delphi 7 as an ISAPI DLL and struggled to sustain 10 calls per second.&amp;nbsp; The Delphi service also intermittently failed whereas the .NET web service did not.&amp;nbsp; In short, the web is a great way to expose a service and there is little need to look for anything &amp;quot;faster&amp;quot; or &amp;quot;more robust&amp;quot;.&amp;nbsp; &lt;/p&gt;
&lt;h4&gt;Configuration Management / Distribution &lt;/h4&gt;
&lt;p&gt;When looking to other positive aspects of SOA, without a doubt one of the best arguments is distribution.&amp;nbsp; The race to &amp;quot;web enable&amp;quot; everything possible is a landmark of the difficulties of distribution.&amp;nbsp; These so-called thin clients relegate any deployment and configuration to the server that runs the service.&amp;nbsp; This concept of &amp;quot;configure once&amp;quot; is embraced by SOA.&amp;nbsp; If you plan on deploying a smart client (a cross between a thick client and a thin client) significantly reduces the amount of configuration required for users to execute your software.&amp;nbsp; They don&amp;#39;t have to worry about database providers, connection strings, loggers, DSN&amp;#39;s, or anything else your app might use.&amp;nbsp; SOA can even be used for web sites (thin clients) that require these services.&amp;nbsp; SOA is a principal without a fixed style of client so it will work as well with a web app as it will with a windows app.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&amp;quot;This saves configuration management by avoiding redeployment of existing applications, it saves software engineering by not modifying the applications, it tends to save time in testing if testing can be isolated to that service rather than testing all applications that consume it.&amp;quot; -- Phil Gilmore&lt;/p&gt;
&lt;h3&gt;Summary&lt;/h3&gt;
&lt;p&gt;Service Oriented Architecture is a best-practice for today&amp;#39;s Enterprise.&amp;nbsp; It&amp;#39;s use can substantially reduce the manpower required to maintain applications and has major improvements to maintenance, scalability, change management, code reuse, and distribution of applications. SOA will make your life easier and make your employer happy and isn&amp;#39;t that the most important argument of all? &lt;/p&gt;
&lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;" id="scid:31C7882A-CF45-4fcc-A614-7A5A52E598FF:6e3b8f7d-7238-46c9-9188-debb90f48d69" class="wlWriterSmartContent"&gt;
&lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;" id="scid:31C7882A-CF45-4fcc-A614-7A5A52E598FF:6e3b8f7d-7238-46c9-9188-debb90f48d69" class="wlWriterSmartContent"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://interactiveasp.net/aggbug.aspx?PostID=134" width="1" height="1"&gt;</description><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Testing/default.aspx">Testing</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/WCF/default.aspx">WCF</category></item><item><title>Google releases web browser "chrome"</title><link>http://interactiveasp.net/blogs/natesstuff/archive/2008/09/02/google-releases-web-browser-quot-chrome-quot.aspx</link><pubDate>Tue, 02 Sep 2008 23:30:00 GMT</pubDate><guid isPermaLink="false">b80005ef-4071-4968-b08e-765d7d71b33e:67</guid><dc:creator>Nathan Zaugg</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://interactiveasp.net/blogs/natesstuff/rsscomments.aspx?PostID=67</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://interactiveasp.net/blogs/natesstuff/commentapi.aspx?PostID=67</wfw:comment><comments>http://interactiveasp.net/blogs/natesstuff/archive/2008/09/02/google-releases-web-browser-quot-chrome-quot.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/chrome_2D00_205_5F00_noshadow_5F00_2.png"&gt;&lt;img border="0" align="left" width="125" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/chrome_2D00_205_5F00_noshadow_5F00_thumb.png" alt="chrome-205_noshadow" height="125" style="border-right:0px;border-top:0px;margin:0px 10px 5px 0px;border-left:0px;border-bottom:0px;" /&gt;&lt;/a&gt; Google has done it again!&amp;nbsp; In a completely unexpected (at least by myself) move they have released a browser into mainstream.&amp;nbsp; Frankly, I am quite surprised!&amp;nbsp; Google was such a fan of Firefox that I never thought I would see them in competition.&amp;nbsp; It also surprises me because building web browsers has is not part of Google&amp;#39;s core business.&amp;nbsp; This is also an obvious swipe at Microsoft which doesn&amp;#39;t excite me.&amp;nbsp; A friend of mine upon hearing the news said &amp;quot;I don&amp;#39;t like the idea of any major web presence building a major web browser and driving a supposedly &amp;quot;open source&amp;quot; technology to do what suits them best.&amp;quot;&lt;/p&gt;
&lt;h1&gt;Install&lt;/h1&gt;
&lt;p&gt;I have no idea how large the install really is.&amp;nbsp; The download is a tool that downloads the rest of the browser.&amp;nbsp; It downloaded for a few min&amp;#39;s and began the install.&amp;nbsp; My estimation was it was probably about 10-30MB though I really don&amp;#39;t know. The installation was very uneventful.&lt;/p&gt;
&lt;h1&gt;What Google did right&lt;/h1&gt;
&lt;p&gt;There are a few things I really like.&amp;nbsp; Here they are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The interface is nice, sleek, and small.&amp;nbsp; I hate browsers (Firefox, you know who you are) that take up TONS of vertical space on my screen!&amp;nbsp; The space is wasted with things I don&amp;#39;t even need or want!&amp;nbsp; Google&amp;#39;s chrome did a nice job here!&lt;/li&gt;
&lt;li&gt;I like the idea of a multi-threaded browser (even if it is a multi-process browser).&lt;/li&gt;
&lt;li&gt;JavaScript is now a 1st class language in chrome.&amp;nbsp; V8, the JavaScript execution engine It is runs JavaScript much the same way as managed code being JIT&amp;#39;ed directly to the CPU. As a result, it is LIGHTNING FAST!&lt;/li&gt;
&lt;li&gt;I really like the &amp;#39;URL Bar&amp;#39;.&amp;nbsp; It has a suggest/append that actually gets what I want!&amp;nbsp; I also like the landing page.&lt;/li&gt;
&lt;li&gt;I like what they did to get the &amp;quot;sandbox&amp;quot; mode.&amp;nbsp; I especially like the way it&amp;#39;s transparent to the user what is crashing your browser (usually a plug-in).&lt;/li&gt;
&lt;li&gt;I like the incognito feature which allows zero trace browsing.&amp;nbsp; I don&amp;#39;t know why we don&amp;#39;t do this all of the time!&amp;nbsp; &lt;/li&gt;
&lt;li&gt;The browsing experience is very fast.&amp;nbsp; The browser UI is also fast.&lt;/li&gt;
&lt;li&gt;I like the tab reordering.&amp;nbsp; It&amp;#39;s very smooth!&lt;/li&gt;
&lt;li&gt;I think the &amp;quot;move tab to another Google browser window&amp;quot; is cool but ultimately not very useful.&lt;/li&gt;
&lt;li&gt;I like the &amp;quot;task manager&amp;quot; &lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;What Google didn&amp;#39;t do right&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;The multi-process approach is a turn off.&amp;nbsp; This means that they have to have a JavaScript rendering engine in memory for each process, it means that things like settings, etc exist in each process.&amp;nbsp; Most of all processes are EXPENSIVE!&amp;nbsp; Very much overkill!&amp;nbsp; Yes, I know that this is how IE does it, and I&amp;#39;ve never liked it!&lt;/li&gt;
&lt;li&gt;The browser is too simple and has very little customization out of the box.&lt;/li&gt;
&lt;li&gt;It uses a &lt;strong&gt;*lot*&lt;/strong&gt; of system resources! Especially Memory!&lt;/li&gt;
&lt;li&gt;I do not like that it uses a lot of the same code as Safari!&amp;nbsp; SAFARI NEEDS TO DIE!&amp;nbsp; IT SUCKS!!!&amp;nbsp; HOW MANY YEARS DO WE HAVE TO WAIT FOR HTTP1.1 PROGRESSIVE DOWNLOADING?&amp;nbsp; This is a big deal in my opinion.&lt;/li&gt;
&lt;li&gt;It has a book marking system that claims to be different but sure looks exactly like IE7 bookmarks to me!&lt;/li&gt;
&lt;li&gt;It was using a lot of my CPU!&amp;nbsp; Something like 60% of my CPU was going toward chrome!&amp;nbsp; I may have had a malfunctioning plug-in but even when I closed the tabs that looked like the culprit it was still using 11-17% of my CPU!&lt;/li&gt;
&lt;li&gt;It didn&amp;#39;t seem to start up any faster than IE8 or FF3.&lt;/li&gt;
&lt;li&gt;Google didn&amp;#39;t release anything until now.&amp;nbsp; So far as I know there wasn&amp;#39;t even a beta version for users to try.&amp;nbsp; I looked for some plug-ins but couldn&amp;#39;t find any.&amp;nbsp; A little heads up to the development community could have had many plug-ins available by the time the browser launched.&lt;/li&gt;
&lt;li&gt;I know this is a small thing, but I hate when the browser &amp;quot;styles&amp;quot; text boxes for me!&amp;nbsp; What if I wanted to implement my own highlighting?&amp;nbsp; What if I didn&amp;#39;t want it to highlight?&lt;/li&gt;
&lt;li&gt;It would lie to me about processor usage!&amp;nbsp; I had a process that was using 45% of my CPU and that none of the processes claimed to take that much CPU.&amp;nbsp; This was a Gmail tab, ironically!&lt;/li&gt;
&lt;li&gt;Silverlight didn&amp;#39;t work.&amp;nbsp; It tired, but never really loaded.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&amp;#39;ve never been comfortable with Google&amp;#39;s privacy policy.&amp;nbsp; The fact that it reads my G-Mail and suggests products much like the topics inside rubs me the wrong way.&amp;nbsp; The fact that they would like to track everything you do including every web page you visit SCARES ME!&lt;/p&gt;
&lt;p&gt;Anyway, here are some JavaScript comparisons.&amp;nbsp; I only have IE8 (which isn&amp;#39;t going to be ready for such tests) so those tests aren&amp;#39;t very relevant.&lt;/p&gt;
&lt;h3&gt;Google vs IE 8 (in IE 7 Emulation Mode)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;pre&gt;TEST                   COMPARISON            FROM                 TO             DETAILS&lt;br /&gt;&lt;br /&gt;=============================================================================&lt;br /&gt;&lt;br /&gt;** TOTAL **:           4.93x as fast     18324.4ms +/- 1.9%   3716.2ms +/- 3.5%     significant&lt;br /&gt;&lt;br /&gt;=============================================================================&lt;br /&gt;&lt;br /&gt;  3d:                  6.99x as fast      1816.8ms +/- 4.1%    260.0ms +/- 11.7%     significant&lt;br /&gt;    cube:              10.5x as fast       645.2ms +/- 5.8%     61.6ms +/- 8.8%     significant&lt;br /&gt;    morph:             3.96x as fast       481.8ms +/- 11.0%    121.6ms +/- 21.7%     significant&lt;br /&gt;    raytrace:          8.98x as fast       689.8ms +/- 3.4%     76.8ms +/- 18.2%     significant&lt;br /&gt;&lt;br /&gt;  access:              19.5x as fast      3398.4ms +/- 1.3%    174.6ms +/- 11.1%     significant&lt;br /&gt;    binary-trees:      47.3x as fast       482.4ms +/- 5.7%     10.2ms +/- 5.5%     significant&lt;br /&gt;    fannkuch:          18.2x as fast      1199.0ms +/- 1.4%     65.8ms +/- 29.0%     significant&lt;br /&gt;    nbody:             21.6x as fast      1322.4ms +/- 1.5%     61.2ms +/- 14.0%     significant&lt;br /&gt;    nsieve:            10.6x as fast       394.6ms +/- 8.9%     37.4ms +/- 17.0%     significant&lt;br /&gt;&lt;br /&gt;  bitops:              18.4x as fast      2197.0ms +/- 3.1%    119.2ms +/- 11.7%     significant&lt;br /&gt;    3bit-bits-in-byte: 38.1x as fast       327.6ms +/- 7.1%      8.6ms +/- 7.9%     significant&lt;br /&gt;    bits-in-byte:      24.5x as fast       485.2ms +/- 3.2%     19.8ms +/- 19.6%     significant&lt;br /&gt;    bitwise-and:       25.4x as fast       858.2ms +/- 2.8%     33.8ms +/- 9.5%     significant&lt;br /&gt;    nsieve-bits:       9.23x as fast       526.0ms +/- 7.3%     57.0ms +/- 19.9%     significant&lt;br /&gt;&lt;br /&gt;  controlflow:         77.7x as fast       435.0ms +/- 1.8%      5.6ms +/- 12.2%     significant&lt;br /&gt;    recursive:         77.7x as fast       435.0ms +/- 1.8%      5.6ms +/- 12.2%     significant&lt;br /&gt;&lt;br /&gt;  crypto:              10.8x as fast      1176.4ms +/- 3.6%    108.6ms +/- 12.5%     significant&lt;br /&gt;    aes:               12.2x as fast       518.8ms +/- 9.1%     42.6ms +/- 11.4%     significant&lt;br /&gt;    md5:               8.04x as fast       318.4ms +/- 6.2%     39.6ms +/- 33.3%     significant&lt;br /&gt;    sha1:              12.8x as fast       339.2ms +/- 7.3%     26.4ms +/- 9.8%     significant&lt;br /&gt;&lt;br /&gt;  date:                1.87x as fast      1739.4ms +/- 5.1%    928.4ms +/- 6.6%     significant&lt;br /&gt;    format-tofte:      1.57x as fast       733.8ms +/- 6.9%    468.6ms +/- 6.0%     significant&lt;br /&gt;    format-xparb:      2.19x as fast      1005.6ms +/- 8.6%    459.8ms +/- 9.9%     significant&lt;br /&gt;&lt;br /&gt;  math:                6.73x as fast      1607.6ms +/- 4.9%    239.0ms +/- 15.2%     significant&lt;br /&gt;    cordic:            4.79x as fast       676.4ms +/- 5.9%    141.2ms +/- 27.4%     significant&lt;br /&gt;    partial-sums:      5.98x as fast       443.4ms +/- 4.3%     74.2ms +/- 18.6%     significant&lt;br /&gt;    spectral-norm:     20.7x as fast       487.8ms +/- 12.2%     23.6ms +/- 19.9%     significant&lt;br /&gt;&lt;br /&gt;  regexp:              *1.07x as slow*     719.6ms +/- 3.6%    767.2ms +/- 3.3%     significant&lt;br /&gt;    dna:               *1.07x as slow*     719.6ms +/- 3.6%    767.2ms +/- 3.3%     significant&lt;br /&gt;&lt;br /&gt;  string:              4.70x as fast      5234.2ms +/- 2.4%   1113.6ms +/- 5.4%     significant&lt;br /&gt;    base64:            15.8x as fast      2212.6ms +/- 4.4%    139.6ms +/- 20.7%     significant&lt;br /&gt;    fasta:             9.57x as fast      1117.2ms +/- 2.8%    116.8ms +/- 7.5%     significant&lt;br /&gt;    tagcloud:          1.86x as fast       597.0ms +/- 3.4%    321.4ms +/- 8.5%     significant&lt;br /&gt;    unpack-code:       1.82x as fast       710.8ms +/- 3.8%    391.2ms +/- 3.3%     significant&lt;br /&gt;    validate-input:    4.13x as fast       596.6ms +/- 1.8%    144.6ms +/- 10.4%     significant&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Google vs Firefox 3&lt;/h3&gt;
&lt;blockquote&gt;
&lt;pre&gt;TEST                   COMPARISON            FROM                 TO             DETAILS&lt;br /&gt;&lt;br /&gt;=============================================================================&lt;br /&gt;&lt;br /&gt;** TOTAL **:           1.65x as fast     6138.2ms +/- 27.7%   3716.2ms +/- 3.5%     significant&lt;br /&gt;&lt;br /&gt;=============================================================================&lt;br /&gt;&lt;br /&gt;  3d:                  3.31x as fast      860.8ms +/- 66.9%    260.0ms +/- 11.7%     significant&lt;br /&gt;    cube:              -                  422.8ms +/- 114.5%     61.6ms +/- 8.8% &lt;br /&gt;    morph:             1.68x as fast      204.6ms +/- 1.6%    121.6ms +/- 21.7%     significant&lt;br /&gt;    raytrace:          3.04x as fast      233.4ms +/- 40.0%     76.8ms +/- 18.2%     significant&lt;br /&gt;&lt;br /&gt;  access:              6.01x as fast     1049.8ms +/- 31.9%    174.6ms +/- 11.1%     significant&lt;br /&gt;    binary-trees:      -                  185.2ms +/- 168.8%     10.2ms +/- 5.5% &lt;br /&gt;    fannkuch:          7.25x as fast      477.2ms +/- 8.9%     65.8ms +/- 29.0%     significant&lt;br /&gt;    nbody:             3.98x as fast      243.4ms +/- 11.2%     61.2ms +/- 14.0%     significant&lt;br /&gt;    nsieve:            3.85x as fast      144.0ms +/- 10.4%     37.4ms +/- 17.0%     significant&lt;br /&gt;&lt;br /&gt;  bitops:              5.52x as fast      657.8ms +/- 2.2%    119.2ms +/- 11.7%     significant&lt;br /&gt;    3bit-bits-in-byte: 13.2x as fast      113.4ms +/- 7.2%      8.6ms +/- 7.9%     significant&lt;br /&gt;    bits-in-byte:      8.76x as fast      173.4ms +/- 6.4%     19.8ms +/- 19.6%     significant&lt;br /&gt;    bitwise-and:       4.44x as fast      150.0ms +/- 12.0%     33.8ms +/- 9.5%     significant&lt;br /&gt;    nsieve-bits:       3.88x as fast      221.0ms +/- 2.5%     57.0ms +/- 19.9%     significant&lt;br /&gt;&lt;br /&gt;  controlflow:         12.8x as fast       71.8ms +/- 5.1%      5.6ms +/- 12.2%     significant&lt;br /&gt;    recursive:         12.8x as fast       71.8ms +/- 5.1%      5.6ms +/- 12.2%     significant&lt;br /&gt;&lt;br /&gt;  crypto:              3.29x as fast      357.0ms +/- 6.3%    108.6ms +/- 12.5%     significant&lt;br /&gt;    aes:               3.37x as fast      143.6ms +/- 11.4%     42.6ms +/- 11.4%     significant&lt;br /&gt;    md5:               2.73x as fast      108.2ms +/- 9.9%     39.6ms +/- 33.3%     significant&lt;br /&gt;    sha1:              3.98x as fast      105.2ms +/- 3.1%     26.4ms +/- 9.8%     significant&lt;br /&gt;&lt;br /&gt;  date:                *1.73x as slow*    537.8ms +/- 43.8%    928.4ms +/- 6.6%     significant&lt;br /&gt;    format-tofte:      ??                 359.8ms +/- 56.1%    468.6ms +/- 6.0%     not conclusive: might be *1.30x as slow*&lt;br /&gt;    format-xparb:      *2.58x as slow*    178.0ms +/- 19.3%    459.8ms +/- 9.9%     significant&lt;br /&gt;&lt;br /&gt;  math:                2.59x as fast      619.0ms +/- 12.5%    239.0ms +/- 15.2%     significant&lt;br /&gt;    cordic:            1.93x as fast      272.6ms +/- 6.1%    141.2ms +/- 27.4%     significant&lt;br /&gt;    partial-sums:      3.14x as fast      233.0ms +/- 35.7%     74.2ms +/- 18.6%     significant&lt;br /&gt;    spectral-norm:     4.81x as fast      113.4ms +/- 9.1%     23.6ms +/- 19.9%     significant&lt;br /&gt;&lt;br /&gt;  regexp:              *1.68x as slow*    457.0ms +/- 7.7%    767.2ms +/- 3.3%     significant&lt;br /&gt;    dna:               *1.68x as slow*    457.0ms +/- 7.7%    767.2ms +/- 3.3%     significant&lt;br /&gt;&lt;br /&gt;  string:              -                 1527.2ms +/- 37.5%   1113.6ms +/- 5.4% &lt;br /&gt;    base64:            -                  145.0ms +/- 12.2%    139.6ms +/- 20.7% &lt;br /&gt;    fasta:             3.01x as fast      351.2ms +/- 49.9%    116.8ms +/- 7.5%     significant&lt;br /&gt;    tagcloud:          ??                 311.8ms +/- 71.6%    321.4ms +/- 8.5%     not conclusive: might be *1.03x as slow*&lt;br /&gt;    unpack-code:       1.28x as fast      501.0ms +/- 14.4%    391.2ms +/- 3.3%     significant&lt;br /&gt;    validate-input:    -                  218.2ms +/- 54.4%    144.6ms +/- 10.4% &lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Google vs IE 8&lt;/h3&gt;
&lt;blockquote&gt;
&lt;pre&gt;TEST                   COMPARISON            FROM                 TO             DETAILS&lt;br /&gt;&lt;br /&gt;=============================================================================&lt;br /&gt;&lt;br /&gt;** TOTAL **:           4.70x as fast     17474.2ms +/- 1.6%   3716.2ms +/- 3.5%     significant&lt;br /&gt;&lt;br /&gt;=============================================================================&lt;br /&gt;&lt;br /&gt;  3d:                  6.87x as fast      1786.8ms +/- 1.8%    260.0ms +/- 11.7%     significant&lt;br /&gt;    cube:              10.1x as fast       620.0ms +/- 5.4%     61.6ms +/- 8.8%     significant&lt;br /&gt;    morph:             3.86x as fast       469.6ms +/- 6.5%    121.6ms +/- 21.7%     significant&lt;br /&gt;    raytrace:          9.08x as fast       697.2ms +/- 4.1%     76.8ms +/- 18.2%     significant&lt;br /&gt;&lt;br /&gt;  access:              16.3x as fast      2847.8ms +/- 1.7%    174.6ms +/- 11.1%     significant&lt;br /&gt;    binary-trees:      49.4x as fast       504.2ms +/- 8.6%     10.2ms +/- 5.5%     significant&lt;br /&gt;    fannkuch:          18.5x as fast      1219.8ms +/- 6.5%     65.8ms +/- 29.0%     significant&lt;br /&gt;    nbody:             11.6x as fast       712.0ms +/- 6.8%     61.2ms +/- 14.0%     significant&lt;br /&gt;    nsieve:            11.0x as fast       411.8ms +/- 14.2%     37.4ms +/- 17.0%     significant&lt;br /&gt;&lt;br /&gt;  bitops:              19.0x as fast      2268.8ms +/- 6.8%    119.2ms +/- 11.7%     significant&lt;br /&gt;    3bit-bits-in-byte: 37.9x as fast       325.6ms +/- 11.3%      8.6ms +/- 7.9%     significant&lt;br /&gt;    bits-in-byte:      24.9x as fast       493.4ms +/- 8.0%     19.8ms +/- 19.6%     significant&lt;br /&gt;    bitwise-and:       27.0x as fast       913.8ms +/- 13.5%     33.8ms +/- 9.5%     significant&lt;br /&gt;    nsieve-bits:       9.40x as fast       536.0ms +/- 4.3%     57.0ms +/- 19.9%     significant&lt;br /&gt;&lt;br /&gt;  controlflow:         78.6x as fast       440.4ms +/- 7.2%      5.6ms +/- 12.2%     significant&lt;br /&gt;    recursive:         78.6x as fast       440.4ms +/- 7.2%      5.6ms +/- 12.2%     significant&lt;br /&gt;&lt;br /&gt;  crypto:              10.8x as fast      1168.0ms +/- 5.7%    108.6ms +/- 12.5%     significant&lt;br /&gt;    aes:               12.4x as fast       528.4ms +/- 6.3%     42.6ms +/- 11.4%     significant&lt;br /&gt;    md5:               7.96x as fast       315.4ms +/- 8.8%     39.6ms +/- 33.3%     significant&lt;br /&gt;    sha1:              12.3x as fast       324.2ms +/- 4.8%     26.4ms +/- 9.8%     significant&lt;br /&gt;&lt;br /&gt;  date:                1.75x as fast      1620.4ms +/- 1.9%    928.4ms +/- 6.6%     significant&lt;br /&gt;    format-tofte:      1.53x as fast       716.2ms +/- 3.1%    468.6ms +/- 6.0%     significant&lt;br /&gt;    format-xparb:      1.97x as fast       904.2ms +/- 3.8%    459.8ms +/- 9.9%     significant&lt;br /&gt;&lt;br /&gt;  math:                6.38x as fast      1524.8ms +/- 2.9%    239.0ms +/- 15.2%     significant&lt;br /&gt;    cordic:            4.68x as fast       661.0ms +/- 2.9%    141.2ms +/- 27.4%     significant&lt;br /&gt;    partial-sums:      5.74x as fast       426.0ms +/- 5.7%     74.2ms +/- 18.6%     significant&lt;br /&gt;    spectral-norm:     18.6x as fast       437.8ms +/- 2.8%     23.6ms +/- 19.9%     significant&lt;br /&gt;&lt;br /&gt;  regexp:              *1.06x as slow*     724.8ms +/- 3.0%    767.2ms +/- 3.3%     significant&lt;br /&gt;    dna:               *1.06x as slow*     724.8ms +/- 3.0%    767.2ms +/- 3.3%     significant&lt;br /&gt;&lt;br /&gt;  string:              4.57x as fast      5092.4ms +/- 2.0%   1113.6ms +/- 5.4%     significant&lt;br /&gt;    base64:            16.0x as fast      2232.8ms +/- 4.5%    139.6ms +/- 20.7%     significant&lt;br /&gt;    fasta:             8.52x as fast       994.8ms +/- 3.1%    116.8ms +/- 7.5%     significant&lt;br /&gt;    tagcloud:          1.80x as fast       579.0ms +/- 4.3%    321.4ms +/- 8.5%     significant&lt;br /&gt;    unpack-code:       1.78x as fast       698.2ms +/- 3.5%    391.2ms +/- 3.3%     significant&lt;br /&gt;    validate-input:    4.06x as fast       587.6ms +/- 6.2%    144.6ms +/- 10.4%     significant&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can see that JavaScript performance is the major advantage to Chrome.&amp;nbsp; They claimed in their comic intro that using multiple processes would result in less memory usage, but I didn&amp;#39;t think so -- that woulden&amp;#39;t make any sense.&amp;nbsp; The&amp;nbsp;figure&amp;nbsp;next is a&amp;nbsp;table from Google&amp;#39;s own memory tool.&amp;nbsp; I opened all of the same websites on Chrome and Firefox to see what the memory footprint really looked like.&amp;nbsp; Keep in mind that Chrome base install is a very basic browser!&amp;nbsp; My Firefox has a TON of useless plug-ins and themes installed and it still beat Chrome quite handily!&lt;/p&gt;
&lt;h3&gt;Memory (Google vs Firefox 3*)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;pre&gt; &lt;/pre&gt;
&lt;span style="orphans:2;word-spacing:0px;font:16px &amp;#39;times new roman&amp;#39;;text-transform:none;color:#000000;widows:2;text-indent:0px;white-space:normal;letter-spacing:normal;border-collapse:separate;-webkit-border-horizontal-spacing:0px;-webkit-border-vertical-spacing:0px;-webkit-text-decorations-in-effect:none;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0;" class="Apple-style-span"&gt;
&lt;div style="padding-right:0.75em;min-width:45em;padding-left:0.75em;font-size:84%;padding-bottom:0.75em;margin:0px;padding-top:0.75em;font-family:arial, helvetica, sans-serif;"&gt;
&lt;div style="border-right:#3a75bd 1px solid;padding-right:1em;overflow-y:hidden;padding-left:0px;border-top:#3a75bd 1px solid;overflow-x:hidden;margin-bottom:0.75em;padding-bottom:0.75em;position:relative;border-left:#3a75bd 1px solid;color:white;padding-top:0.6em;border-bottom:#3a75bd 1px solid;background-color:#5296de;-webkit-background-clip:initial;-webkit-background-origin:initial;-webkit-background-size:100% 100%;-webkit-border-top-right-radius:6px 6px;-webkit-border-top-left-radius:6px 6px;-webkit-border-bottom-left-radius:6px 6px;-webkit-border-bottom-right-radius:6px 6px;text-shadow:black 0px 0px 2px;" id="header"&gt;
&lt;h1 style="padding-right:0px;padding-left:37px;font-weight:bold;font-size:110%;background-position:12px 60%;padding-bottom:0px;margin:0px;color:white;padding-top:0px;background-repeat:no-repeat;letter-spacing:-1px;display:inline;-webkit-background-clip:initial;-webkit-background-origin:initial;"&gt;About memory&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;/h1&gt;
&lt;p style="padding-right:0px;padding-left:0.4em;font-size:84%;padding-bottom:0px;margin:0px;color:white;padding-top:0px;font-style:italic;display:inline;"&gt;Measuring memory usage in a multi-process browser&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin-left:0px;" id="content"&gt;
&lt;h2 style="border-top-width:0px;padding-right:1em;padding-left:38px;font-weight:normal;font-size:110%;padding-bottom:0.5em;margin:0px 0px 0px -38px;color:#3a75bd;padding-top:0px;letter-spacing:-1px;"&gt;Summary&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;
&lt;div style="background-position:50% 100%;margin:-1px 0px;width:14px;background-repeat:no-repeat;display:inline-block;height:14px;-webkit-background-clip:initial;-webkit-background-origin:initial;opacity:0.33;" class="help"&gt;&lt;/div&gt;
&lt;/h2&gt;
&lt;table style="table-layout:fixed;font-size:84%;width:100%;line-height:200%;border-collapse:collapse;" id="browserComparison" class="list "&gt;


&lt;tr class="firstRow doNotFilter"&gt;
&lt;th style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;font-weight:bold;padding-bottom:0px;vertical-align:top;color:black;line-height:100%;padding-top:0px;white-space:nowrap;text-align:left;"&gt;&lt;/th&gt;&lt;th style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;font-weight:bold;padding-bottom:0px;vertical-align:top;color:black;line-height:100%;padding-top:0px;white-space:nowrap;text-align:left;"&gt;Memory&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;
&lt;div style="background-position:50% 100%;margin:-1px 0px;width:14px;background-repeat:no-repeat;display:inline-block;height:14px;-webkit-background-clip:initial;-webkit-background-origin:initial;opacity:0.33;" class="help"&gt;&lt;/div&gt;
&lt;/th&gt;&lt;th style="padding-right:1em;padding-left:0.5em;font-weight:bold;padding-bottom:0px;vertical-align:top;color:black;line-height:100%;padding-top:0px;white-space:nowrap;text-align:left;"&gt;Virtual memory&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;
&lt;div style="background-position:50% 100%;margin:-1px 0px;width:14px;background-repeat:no-repeat;display:inline-block;height:14px;-webkit-background-clip:initial;-webkit-background-origin:initial;opacity:0.33;" class="help"&gt;&lt;/div&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;tr class="secondRow doNotFilter"&gt;
&lt;th style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:25px;font-weight:bold;background-position:5px 50%;padding-bottom:0px;vertical-align:top;width:100%;color:black;padding-top:0px;border-bottom:#b5c6de 1px solid;background-repeat:no-repeat;white-space:nowrap;text-align:left;" class="name"&gt;Browser&lt;/th&gt;&lt;th style="padding-right:0.5em;padding-left:25px;font-weight:bold;background-position:5px 50%;padding-bottom:0px;vertical-align:top;width:100%;color:black;padding-top:0px;border-bottom:#b5c6de 1px solid;background-repeat:no-repeat;white-space:nowrap;text-align:left;" class="name"&gt;Private&lt;/th&gt;&lt;th style="padding-right:0.5em;padding-left:0.5em;font-weight:bold;padding-bottom:0px;vertical-align:top;width:7em;color:black;padding-top:0px;border-bottom:#b5c6de 1px solid;white-space:nowrap;text-align:right;" class="number"&gt;Shared&lt;/th&gt;&lt;th style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;font-weight:bold;padding-bottom:0px;vertical-align:top;width:7em;color:black;padding-top:0px;border-bottom:#b5c6de 1px solid;white-space:nowrap;text-align:right;" class="number"&gt;Total&lt;/th&gt;&lt;th style="padding-right:0.5em;padding-left:0.5em;font-weight:bold;padding-bottom:0px;vertical-align:top;width:7em;color:black;padding-top:0px;border-bottom:#b5c6de 1px solid;white-space:nowrap;text-align:right;" class="number"&gt;Private&lt;/th&gt;&lt;th style="padding-right:1em;padding-left:0.5em;font-weight:bold;padding-bottom:0px;vertical-align:top;width:7em;color:black;padding-top:0px;border-bottom:#b5c6de 1px solid;white-space:nowrap;text-align:right;" class="number"&gt;Mapped&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:25px;background-position:5px 50%;padding-bottom:0px;vertical-align:top;width:100%;line-height:1.4em;padding-top:0.35em;background-repeat:no-repeat;background-color:#eff3ff;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="name"&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;&lt;strong&gt;Chrome&lt;/strong&gt;&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;0.2.149.27&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;154,844&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;5,816&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;160,660&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;287,304&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:1em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;107,336&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:25px;background-position:5px 50%;padding-bottom:0px;vertical-align:top;width:100%;line-height:1.4em;padding-top:0.35em;background-repeat:no-repeat;" class="name"&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;&lt;strong&gt;Firefox&lt;/strong&gt;&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;3.0.1&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;132,572&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;11,552&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;144,124&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;129,752&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:1em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;11,844&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;h2 style="padding-right:1em;padding-left:38px;font-weight:normal;font-size:110%;border-top:#3a75bd 1px solid;padding-bottom:0.5em;margin:0px 0px 0px -38px;color:#3a75bd;padding-top:0.5em;letter-spacing:-1px;"&gt;Processes&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;
&lt;div style="background-position:50% 100%;margin:-1px 0px;width:14px;background-repeat:no-repeat;display:inline-block;height:14px;-webkit-background-clip:initial;-webkit-background-origin:initial;opacity:0.33;" class="help"&gt;&lt;/div&gt;
&lt;/h2&gt;
&lt;table style="table-layout:fixed;font-size:84%;width:100%;line-height:200%;border-collapse:collapse;" id="memoryDetails" class="list "&gt;


&lt;tr class="firstRow doNotFilter"&gt;
&lt;th style="padding-right:0.5em;padding-left:0.5em;font-weight:bold;padding-bottom:0px;vertical-align:top;color:black;line-height:100%;padding-top:0px;white-space:nowrap;text-align:left;"&gt;&lt;/th&gt;&lt;th style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;font-weight:bold;padding-bottom:0px;vertical-align:top;color:black;line-height:100%;padding-top:0px;white-space:nowrap;text-align:left;"&gt;&lt;/th&gt;&lt;th style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;font-weight:bold;padding-bottom:0px;vertical-align:top;color:black;line-height:100%;padding-top:0px;white-space:nowrap;text-align:left;"&gt;Memory&lt;/th&gt;&lt;th style="padding-right:1em;padding-left:0.5em;font-weight:bold;padding-bottom:0px;vertical-align:top;color:black;line-height:100%;padding-top:0px;white-space:nowrap;text-align:left;"&gt;Virtual memory&lt;/th&gt;
&lt;/tr&gt;
&lt;tr class="secondRow doNotFilter"&gt;
&lt;th style="padding-right:0.5em;padding-left:0.5em;font-weight:bold;padding-bottom:0px;vertical-align:top;width:4em;color:black;padding-top:0px;border-bottom:#b5c6de 1px solid;white-space:nowrap;text-align:right;" class="pid"&gt;PID&lt;/th&gt;&lt;th style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;font-weight:bold;padding-bottom:0px;vertical-align:top;width:100%;color:black;padding-top:0px;border-bottom:#b5c6de 1px solid;white-space:nowrap;text-align:left;" class="name"&gt;Name&lt;/th&gt;&lt;th style="padding-right:0.5em;padding-left:0.5em;font-weight:bold;padding-bottom:0px;vertical-align:top;width:7em;color:black;padding-top:0px;border-bottom:#b5c6de 1px solid;white-space:nowrap;text-align:right;" class="number"&gt;Private&lt;/th&gt;&lt;th style="padding-right:0.5em;padding-left:0.5em;font-weight:bold;padding-bottom:0px;vertical-align:top;width:7em;color:black;padding-top:0px;border-bottom:#b5c6de 1px solid;white-space:nowrap;text-align:right;" class="number"&gt;Shared&lt;/th&gt;&lt;th style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;font-weight:bold;padding-bottom:0px;vertical-align:top;width:7em;color:black;padding-top:0px;border-bottom:#b5c6de 1px solid;white-space:nowrap;text-align:right;" class="number"&gt;Total&lt;/th&gt;&lt;th style="padding-right:0.5em;padding-left:0.5em;font-weight:bold;padding-bottom:0px;vertical-align:top;width:7em;color:black;padding-top:0px;border-bottom:#b5c6de 1px solid;white-space:nowrap;text-align:right;" class="number"&gt;Private&lt;/th&gt;&lt;th style="padding-right:1em;padding-left:0.5em;font-weight:bold;padding-bottom:0px;vertical-align:top;width:7em;color:black;padding-top:0px;border-bottom:#b5c6de 1px solid;white-space:nowrap;text-align:right;" class="number"&gt;Mapped&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:4em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="pid"&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;padding-top:0px;" class="th"&gt;7172&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:100%;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="name"&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;Browser&lt;/div&gt;
&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;37564&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;21116&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;58680&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;43728&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:1em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;26796&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:4em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="pid"&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;padding-top:0px;" class="th"&gt;832&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:100%;line-height:1.4em;padding-top:0.35em;" class="name"&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;Tab 2&lt;/div&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;&lt;span&gt;iGoogle&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;&lt;span&gt;Gmail - Inbox (9) - nzaugg@gmail.com&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;27616&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;2660&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;30276&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;44416&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:1em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;9816&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:4em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="pid"&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;padding-top:0px;" class="th"&gt;4456&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:100%;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="name"&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;Tab 3&lt;/div&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;&lt;span&gt;CUEgle 3&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;8472&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;2304&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;10776&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;32484&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:1em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;9816&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:4em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="pid"&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;padding-top:0px;" class="th"&gt;3724&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:100%;line-height:1.4em;padding-top:0.35em;" class="name"&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;Plug-in&lt;/div&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;&lt;span&gt;Shockwave Flash&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;56276&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;10032&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;66308&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;94536&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:1em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;11828&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:4em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="pid"&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;padding-top:0px;" class="th"&gt;7972&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:100%;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="name"&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;Tab 9&lt;/div&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;&lt;span&gt;MSN Video&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;10872&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;3376&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;14248&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;25140&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:1em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;9816&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:4em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="pid"&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;padding-top:0px;" class="th"&gt;4348&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:100%;line-height:1.4em;padding-top:0.35em;" class="name"&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;Tab 10&lt;/div&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;&lt;span&gt;Untitled&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;7736&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;7380&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;15116&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;10396&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:1em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;9816&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:4em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="pid"&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;padding-top:0px;" class="th"&gt;5552&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:100%;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="name"&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;Tab 14&lt;/div&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;&lt;span&gt;Understanding User-Agent Strings&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;2668&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;1736&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;4404&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;12256&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:1em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;9816&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:4em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="pid"&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;padding-top:0px;" class="th"&gt;2420&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:100%;line-height:1.4em;padding-top:0.35em;" class="name"&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;Tab 17&lt;/div&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;&lt;span&gt;Windows Live Hotmail&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;2304&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;1624&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;3928&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;12540&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:1em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;9816&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:4em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="pid"&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;padding-top:0px;" class="th"&gt;4204&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:100%;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="name"&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;Tab 20&lt;/div&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;&lt;span&gt;SunSpider JavaScript Benchmark Results&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;1336&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;2120&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;3456&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;11808&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:1em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;9816&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:4em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="pid"&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;padding-top:0px;" class="th"&gt;5776&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:100%;line-height:1.4em;padding-top:0.35em;" class="name"&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;Tab 25 (diagnostics)&lt;/div&gt;
&lt;div style="overflow-y:hidden;overflow-x:hidden;white-space:nowrap;height:1.6em;text-overflow:ellipsis;"&gt;&lt;span&gt;About Memory&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;8908&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;3428&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;12336&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;9644&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:1em;padding-left:0.5em;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;text-align:right;" class="number"&gt;&lt;span style="padding-left:0.35em;" class="th"&gt;9816&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="font-weight:bold;" class="total doNotFilter"&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;border-top:#b5c6de 1px solid;padding-bottom:0px;vertical-align:top;width:4em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="pid"&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;border-top:#b5c6de 1px solid;padding-bottom:0px;vertical-align:top;width:100%;color:#315d94;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="name"&gt;&amp;Sigma;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;border-top:#b5c6de 1px solid;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" id="tot_ws_priv" class="th"&gt;163752&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;border-top:#b5c6de 1px solid;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;/td&gt;
&lt;td style="border-right:#b5c6de 1px solid;padding-right:0.5em;padding-left:0.5em;border-top:#b5c6de 1px solid;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" id="tot_ws_tot" class="th"&gt;219528&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:0.5em;padding-left:0.5em;border-top:#b5c6de 1px solid;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;&lt;span style="padding-left:0.35em;" id="tot_comm_priv" class="th"&gt;296948&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;td style="padding-right:1em;padding-left:0.5em;border-top:#b5c6de 1px solid;padding-bottom:0px;vertical-align:top;width:7em;line-height:1.4em;padding-top:0.35em;background-color:#eff3ff;text-align:right;-webkit-background-clip:initial;-webkit-background-origin:initial;" class="number"&gt;
&lt;div style="background-position:50% 100%;margin:-1px 0px;width:14px;background-repeat:no-repeat;display:inline-block;height:14px;-webkit-background-clip:initial;-webkit-background-origin:initial;opacity:0.33;" class="help"&gt;&lt;/div&gt;
&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="padding-left:0.35em;" id="tot_comm_map" class="th"&gt;117152&lt;/span&gt;&lt;span style="padding-left:0.1em;font-weight:normal;opacity:0.4;" class="k"&gt;k&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="orphans:2;word-spacing:0px;font:16px &amp;#39;times new roman&amp;#39;;text-transform:none;color:#000000;widows:2;text-indent:0px;white-space:normal;letter-spacing:normal;border-collapse:separate;-webkit-border-horizontal-spacing:0px;-webkit-border-vertical-spacing:0px;-webkit-text-decorations-in-effect:none;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0;" class="Apple-style-span"&gt;&lt;/span&gt;
&lt;p&gt;I haven&amp;#39;t decided wither I will use this browser on a daily basis. Probably not -- no compelling reason to switch, but I can see that some will really like this browser. Perhaps once I get used to the idea of Google making a browser and have IE tick me off once more I&amp;#39;d be in a different place, but for now I kind of don&amp;#39;t want a Google Browser.&lt;/p&gt;
&lt;h5&gt;Links&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Chrome Download: &lt;a href="http://www.google.com/chrome/" title="http://www.google.com/chrome/"&gt;http://www.google.com/chrome/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Chrome Comic Intro: &lt;a href="http://www.google.com/googlebooks/chrome/" title="http://www.google.com/googlebooks/chrome/"&gt;http://www.google.com/googlebooks/chrome/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Chrome Features: (didn&amp;#39;t work for me) &lt;a href="http://www.google.com/chrome/intl/en/features.html" title="http://www.google.com/chrome/intl/en/features.html"&gt;http://www.google.com/chrome/intl/en/features.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;JavaScript Tests: &lt;a href="http://17.254.17.57/perf/sunspider-0.9/sunspider-driver.html" title="http://17.254.17.57/perf/sunspider-0.9/sunspider-driver.html"&gt;http://17.254.17.57/perf/sunspider-0.9/sunspider-driver.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://interactiveasp.net/aggbug.aspx?PostID=67" width="1" height="1"&gt;</description><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Technology+News/default.aspx">Technology News</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Google/default.aspx">Google</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Open+Source/default.aspx">Open Source</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Product+Reviews/default.aspx">Product Reviews</category></item><item><title>Database Naming Conventions</title><link>http://interactiveasp.net/blogs/natesstuff/archive/2008/07/02/database-naming-conventions.aspx</link><pubDate>Wed, 02 Jul 2008 20:50:00 GMT</pubDate><guid isPermaLink="false">b80005ef-4071-4968-b08e-765d7d71b33e:45</guid><dc:creator>Nathan Zaugg</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://interactiveasp.net/blogs/natesstuff/rsscomments.aspx?PostID=45</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://interactiveasp.net/blogs/natesstuff/commentapi.aspx?PostID=45</wfw:comment><comments>http://interactiveasp.net/blogs/natesstuff/archive/2008/07/02/database-naming-conventions.aspx#comments</comments><description>&lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; margin: 0px 10px 5px 0px; border-left: 0px; border-bottom: 0px" alt="DatabaseServer" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/DatabaseServer_5F00_3.png" width="103" align="left" border="0" height="119" /&gt; Naming conventions are like arm pits.&amp;nbsp; Everyone has them and they all stink!&amp;nbsp; Well, at least that's the perspective of pretty much every developer an DBA alike.&amp;nbsp; I will present my own personal philosophy for naming conventions on databases and hopefully spawn some discussion in the process.&lt;/p&gt;
&lt;h2&gt;Basic Principles&lt;/h2&gt;
&lt;h3&gt;Consistency&lt;/h3&gt;
&lt;p&gt;As annoying as certain standards are (such as putting tbl_ before everything) it is more annoying and more difficult when there are no conventions or mixed conventions.&amp;nbsp; Being able to reliably predict the schema once the basic relational structure is understood is key to productivity.&amp;nbsp; Therefore, even if you get stuck with standards you disagree with, so long as they are consistent they will be much better than the alternative.&amp;nbsp; Unless you get to make the decision, my guess is that there are going to be some conventions that you do not agree with. &lt;/p&gt;
&lt;h3&gt;Abbreviations&lt;/h3&gt;
&lt;p&gt;It is a good idea to abbreviate, when appropriate, in the naming of objects in your database.&amp;nbsp; It may be a good idea to have a list of abbreviations that you plan to use in the database as part of your data dictionary.&amp;nbsp; However, if there is not a good, clear abbreviation for an object, don't make one up.&amp;nbsp; &lt;i&gt;When in doubt, spell it out!&lt;/i&gt;&amp;nbsp; Especially with SQL Server where you don't have the pesky 30 char limit for tables and columns like Oracle.&lt;/p&gt;
&lt;h3&gt;Identities&lt;/h3&gt;
&lt;p&gt;Every table should have an Identity as it's primary key!&amp;nbsp; Sometime, in a future blog post I will explain why this is so critical, but suffice it to say that any table that does not have a primary key is considered by SQL Server a "heap".&amp;nbsp; If you are using something other than an Identity column for the primary key you better have a really compelling reason because it will cause major performance problems.&amp;nbsp; &lt;b&gt;&lt;i&gt;THERE IS NO SUCH THING AS A NATURAL KEY AND THEY SHOULD NEVER BE USED IN PLACE OF AN IDENTITY!&lt;/i&gt;&lt;/b&gt; So always use a surrogate key approach, even with join tables.&lt;/p&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; margin: 5px 0px 5px 10px; border-left: 0px; border-bottom: 0px" alt="Key" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/Key_5F00_3.png" width="81" align="right" border="0" height="81" /&gt; I believe that with a good data layer like &lt;a href="http://interactiveasp.net/blogs/natesstuff/archive/2007/12/19/visual-studio-2008-rtm-changes-to-linq-to-sql.aspx" target="_blank"&gt;Linq to SQL&lt;/a&gt; there is no need for relegating all database access through stored procedures.&amp;nbsp; While it does remove some of the service area for venerability and bugs robust solutions like Linq to SQL are very limited by this approach.&amp;nbsp; You should grant specific access to tables and procs by user.&amp;nbsp; A good approach can be found on another one of my &lt;a href="http://interactiveasp.net/blogs/natesstuff/archive/2008/06/26/connection-pooling-vs-audit-logging.aspx" target="_blank"&gt;blog posts&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Object Naming&lt;/h2&gt;
&lt;h3&gt;Table Names&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;If you are running a database that preserves case (like SQL Server) tables should have no prefixes and should not contain underscores "_" unless it is a join table.&amp;nbsp; Table names should also be Pascal Cased.&amp;nbsp; If you are running a database that makes all tables upper case (like Oracle) then you have little choice but to use underscores everywhere.&lt;/li&gt;
&lt;li&gt;Avoid pluralizing table names (User vs Users).&amp;nbsp; This is a good idea for two reasons, first it can be confusing when doing the keys.&amp;nbsp; Do we use UserID or UsersID?&amp;nbsp; Second not all tables pluralize well (Addresses) so avoiding any plural names will keep it consistent.&amp;nbsp; It you are using Linq to SQL the designer will pluralize for you automatically.&lt;/li&gt;
&lt;li&gt;Join tables should the two or three tables that they are joining together as part of the name seperated by underscores.&amp;nbsp; (ex: User_Address, User_Order). Although they are many-to-many relationship see if you can find a principle table.&amp;nbsp; Users have orders, orders do not have users, therefore the User table comes first in the name.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Column Names&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Name the Primary Key Identity column the table name with ID.&amp;nbsp; (ex: UserID) With the possible exception of join tables, in which case just name the Identity ID.&lt;/li&gt;
&lt;li&gt;Use Pascal casing (ex: EachWordsStartsCapolatized)&lt;/li&gt;
&lt;li&gt;Do not use the table name as part of the column name.&amp;nbsp; If this is a shipping table don't name your columns ShippingAddress, just name it Address.&lt;/li&gt;
&lt;li&gt;Do not prefix column names with the type (ex: strUserName).&amp;nbsp; It makes the database much more difficult to work with.&lt;/li&gt;
&lt;li&gt;Use the correct data types.&amp;nbsp; Always use nvarchar types (unicode) rather than varchar types.&amp;nbsp; This avoids substantial complexity if you are ever requried to store non latin-based data!&amp;nbsp; Trust me, you do not want to have to deal with code pages in the database!&amp;nbsp; Also, use Date fields for dates, bit fields for boolean, etc.&lt;/li&gt;
&lt;li&gt;Don't make every column nullable!&amp;nbsp; Think through what data is absolutely required.&amp;nbsp; If you want to hold "partally complete records" then I would suggest a different table or different "staging" database.&amp;nbsp; &lt;/li&gt;
&lt;li&gt;Don't make a bit field nullable unless you have a great reason!&lt;/li&gt;
&lt;li&gt;Try to include a TimeStamp column if you think you may have to worry about concurrency.&lt;/li&gt;
&lt;li&gt;Don't prefix with anything.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Constraint &amp;amp; Index Names&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Name your constraints and indexes.&amp;nbsp; With the exception of foreign key constraints they are not automatically assigned meaningful names.&lt;/li&gt;
&lt;li&gt;Don't use prefixes and make light use of underscores.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Stored Procedure Names&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Don't prefix your stored procedures!&amp;nbsp; People used to prefix them with "sp" because existing procs in the database use this convention.&amp;nbsp; It has been presumed that sp stands for system procedure and it wouldn't make any sense to use that.&amp;nbsp; Seriously, prefixes are not very helpful in the database!&lt;/li&gt;
&lt;li&gt;The first part of the name of a proc should be the table name it works upon (ex: User_Insert).&amp;nbsp; If the proc works on multiple tables try to give it the name of the portion of the database this proc deals with.&amp;nbsp; For example, if it's a proc that the invoicing system uses it would be acceptable to name it &lt;i&gt;Invoicing_Update&lt;/i&gt;, for example.&lt;/li&gt;
&lt;li&gt;Don't generate procs for simple Insert, Update, Delete, and Select unless you have a policy in place for accessing data exclusively from procs.&lt;/li&gt;
&lt;li&gt;Don't create any stored procedure you don't need or plan to immediately use.&amp;nbsp; At some point you will change the schema and you won't update procs your not using.&amp;nbsp; Someone may eventually want to use that proc later only to find it broken.&lt;/li&gt;
&lt;li&gt;The verb in the naming convention does not have to be relegated to "Insert, Update, Delete, Select".&amp;nbsp; It should say what it does.&amp;nbsp; Just be careful that if there is another procedure that does this same thing to another table that the verbs are named the same.&lt;/li&gt;
&lt;li&gt;You can add additional information to the proc name to help distinguish it from others.&amp;nbsp; (ex: User_Select_ByDate, User_Select_ByState)&lt;/li&gt;
&lt;li&gt;Don't use a prefix for arguments (ex: @ArgUserID). In my experience they don't help at all and are quite annoying!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Tips &amp;amp; Tricks&lt;/h3&gt;
&lt;p&gt;SQL Server 2008 has a policy manager that can help create and enforce policies like naming conventions!&amp;nbsp; Regardless of using SQL 2008 be sure to keep a Data Dictionary of your database! The database is the heart and soul of your business processes and should be well documented!&amp;nbsp; There is nothing worse than an unclean database!&lt;/p&gt;
&lt;p&gt;Nathan Zaugg&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://interactiveasp.net/aggbug.aspx?PostID=45" width="1" height="1"&gt;</description><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/SQL+Server+2005/default.aspx">SQL Server 2005</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Tips+_2600_amp_3B00_+Tricks/default.aspx">Tips &amp;amp; Tricks</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/SQL+Server+2008/default.aspx">SQL Server 2008</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Standards+_2F00_+Conventions/default.aspx">Standards / Conventions</category></item><item><title>Avoiding Circular Dependencies</title><link>http://interactiveasp.net/blogs/natesstuff/archive/2008/06/09/avoiding-circular-dependencies.aspx</link><pubDate>Mon, 09 Jun 2008 21:45:06 GMT</pubDate><guid isPermaLink="false">b80005ef-4071-4968-b08e-765d7d71b33e:30</guid><dc:creator>Nathan Zaugg</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://interactiveasp.net/blogs/natesstuff/rsscomments.aspx?PostID=30</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://interactiveasp.net/blogs/natesstuff/commentapi.aspx?PostID=30</wfw:comment><comments>http://interactiveasp.net/blogs/natesstuff/archive/2008/06/09/avoiding-circular-dependencies.aspx#comments</comments><description>&lt;p&gt;The term &amp;quot;circular dependency&amp;quot; may be foreign to some programmers (especially if you do Java as it is a pretty common practice).&amp;nbsp; However, anyone who has done some scripting for a referential database knows that you have to run scripts in a certain order.&amp;nbsp; Running scripts out of order causes errors when you run.&amp;nbsp; The interesting trick is that if you run that same incorrectly-ordered DDL script again and again you will eventually get it to run without errors.&amp;nbsp; If you were unaware of the order being incorrect and thought to yourself in that moment &amp;quot;Stupid database!&amp;quot; then this blog post is for you!&lt;/p&gt; &lt;h3&gt;What is a circular dependency? &lt;/h3&gt; &lt;p&gt;It is simply two libraries that use each other (either directly or indirectly) as shown below:&lt;/p&gt; &lt;p&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="107" alt="circular depencency" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/circular-depencency_5F00_3.jpg" width="240" border="0" /&gt;&amp;nbsp; &lt;/p&gt; &lt;h6&gt;Figure 1: Circular Dependency&lt;/h6&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/image3.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="202" alt="image" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/image3_5F00_thumb.png" width="244" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt; &lt;h6&gt;Figure 2: Complex Circular Dependency&lt;/h6&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;The complexity of a circular dependency may vary.&amp;nbsp; If you are using Visual Studio and have all of your projects loaded into a single solution AND you add Project References (Right click on project -&amp;gt; Add Reference -&amp;gt; Projects Tab -&amp;gt; {Project Name}) then the IDE will not allow you to create Circular Dependencies.&amp;nbsp; In fact, this is a good practice as Visual Studio will ensure the correct build order.&amp;nbsp; &lt;/p&gt; &lt;h3&gt;Why are circular dependencies bad?&lt;/h3&gt; &lt;p&gt;Just like our Database example above, a circular dependency makes it so you can not guarantee that your application has the latest code.&amp;nbsp; That is a big deal!&amp;nbsp; Here is why:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;I make changes to Application 1 (in Figure 2)  &lt;li&gt;I build my project, The changes I made in Application 1 may or may not have gotten into Application 2 (depending on build order).&amp;nbsp; It may have taken a copy of the compiled code that was left over from the last time I built.  &lt;li&gt;Application 2 depends on this new functionality to provide services to Application 3; This functionality will not work correctly with this build.  &lt;li&gt;Application 3 may or may not depend on these same services to provide &lt;strong&gt;back&lt;/strong&gt; to Application 1&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;As you can see in this scenario, there is no such thing as a &amp;quot;correct&amp;quot; build order when there are these circular dependencies.&amp;nbsp; The only way you can arrive at the correct version of the code is to build it as many times as there are nodes in our circle.&amp;nbsp; That would mean for Figure 1 that we would need to build twice and three times for Figure 3.&amp;nbsp; Some of these dependencies can get really ugly!&amp;nbsp; Here is some actual code running in an actual company that I did analysis on some time ago using a tool called &lt;a href="http://www.structure101.com/"&gt;Structure 101&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/image9.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="150" alt="image" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/image9_5F00_thumb.png" width="143" border="0" /&gt;&lt;/a&gt; &lt;a href="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/image12.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="199" alt="image" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/image12_5F00_thumb.png" width="218" border="0" /&gt;&lt;/a&gt; &lt;a href="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/image15.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="196" alt="image" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/image15_5F00_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;a href="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/image18.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="244" alt="image" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/image18_5F00_thumb.png" width="202" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;How do I fix circular dependencies?&lt;/h3&gt; &lt;p&gt;There are some steps to take to solve even the most complex tangles!&amp;nbsp; They all involve refactoring your code though.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Refactor common code into a &amp;quot;base&amp;quot; dependency; I usually call this &amp;quot;&lt;em&gt;Common&lt;/em&gt;&amp;quot; (figure 3).&amp;nbsp; &lt;strong&gt;&lt;em&gt;BEST SOLUTION&lt;/em&gt;&lt;/strong&gt;  &lt;li&gt;Remove code that is unused.&amp;nbsp; In the tangles shown above many of them are using deprecated/unused code.  &lt;li&gt;Duplicate the sections of code used.&amp;nbsp; This should be seen as a &lt;strong&gt;&lt;em&gt;last resort&lt;/em&gt;&lt;/strong&gt; but given the choice between code duplication and circular dependencies, I take code duplication ever time!&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/image21.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="173" alt="image" src="http://interactiveasp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/natesstuff/image21_5F00_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;/p&gt; &lt;h6&gt;Figure 3: Refactor a Common&lt;/h6&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Summary&lt;/h3&gt; &lt;p&gt;There are two kinds of design concepts for nTier (and other types of architectures as well) called &lt;em&gt;Logical Layout Design&lt;/em&gt; and &lt;em&gt;Physical Layout Design&lt;/em&gt;.&amp;nbsp; The Logical Layout is simply that your software occupies the same project/package but leverage different classes.&amp;nbsp; In contrast Physical Layout Design forces each tier to be separated into different Projects/Packages.&amp;nbsp; So long as we are careful to manage the dependencies between these packages from the start this is the preferable way to code.&amp;nbsp; While the logical layout does not suffer from the dependency problem eventually you may wish to break these classes apart and find that there are a lot of inner-dependency that should not exist simply because they occupied the same project.&amp;nbsp; &lt;strong&gt;Remember to keep it clean!&lt;/strong&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://interactiveasp.net/aggbug.aspx?PostID=30" width="1" height="1"&gt;</description><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Tools/default.aspx">Tools</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/C_2300_+3.0/default.aspx">C# 3.0</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Debugging/default.aspx">Debugging</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Testing/default.aspx">Testing</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Tips+_2600_amp_3B00_+Tricks/default.aspx">Tips &amp;amp; Tricks</category></item><item><title>Unit Testing Philosophy -- Code Coverage is meaningless....</title><link>http://interactiveasp.net/blogs/natesstuff/archive/2008/04/23/unit-testing-philosophy-code-coverage-is-meaningless.aspx</link><pubDate>Wed, 23 Apr 2008 22:38:17 GMT</pubDate><guid isPermaLink="false">b80005ef-4071-4968-b08e-765d7d71b33e:21</guid><dc:creator>Nathan Zaugg</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://interactiveasp.net/blogs/natesstuff/rsscomments.aspx?PostID=21</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://interactiveasp.net/blogs/natesstuff/commentapi.aspx?PostID=21</wfw:comment><comments>http://interactiveasp.net/blogs/natesstuff/archive/2008/04/23/unit-testing-philosophy-code-coverage-is-meaningless.aspx#comments</comments><description>&lt;p&gt;While I am a big fan of unit testing I often try to point out that Code Coverage tells us little more than “are there unit tests” not “are we unit testing”. The former indicates that the code is indeed being &lt;i&gt;executed&lt;/i&gt;. The latter indicates that the code is being &lt;i&gt;exercised&lt;/i&gt;. &lt;p&gt;Scott Hanselman describes this in a podcast available here:&lt;br /&gt;&lt;a href="http://www.hanselman.com/blog/HanselminutesPodcast103QuetzalBradleyOnTestingAfterUnitTestsAndTheMythOfCodeCoverage.aspx"&gt;http://www.hanselman.com/blog/HanselminutesPodcast103QuetzalBradleyOnTestingAfterUnitTestsAndTheMythOfCodeCoverage.aspx&lt;/a&gt; &lt;p&gt;I personally think testing really needs to be evolved to the level our architecture and code. Testing frameworks are clumsy and it is very difficult to all of our code. Most people are quick to point out that unit testing UI is difficult and usually yields the least amount of benefit. Depending on the architecture and implementation of that specific application, that may well be true. &lt;p&gt;Two other major hurtles that are well known. First, when we unit test we want as “authentic” of a test as we can get. This includes the data. How much time and effort do we spend getting authentic data to our unit tests or providing an abstracted data layer for our code to operate on? This is a big problem not just because of the hours it takes to provide such data abstraction implementations but because the time it takes to run Unit Tests is greatly increased. I argue this because I believe that when unit testing takes 30 min’s to complete, developers are not going to run them before checking in, and that I believe is an issue.  &lt;p&gt;The other major unit testing hurdle is the concept of the “Oracle” as described by Scott. This term simply refers to the ability of a piece of code to assert that a test has indeed run in such a way that an end user is going to get what they expect. Some of these sceneries can be very complex and it is impossible to test for all permutations of a given rule. &lt;p&gt;What do I think is needed in Unit Testing? &lt;ol&gt; &lt;li&gt;The disparity between code and “UI” needs to be removed! It needs to be no harder to test a piece of UI then a API Class Library.&lt;/li&gt; &lt;li&gt;Unit testing “language” needs to be more declarative and functional. I need to be able to test a wide variety of test scenarios quickly and easily. Functional languages are good at this. I do not suggest that we adopt Python for unit testing but maybe a testing language developed for this purpose. &lt;/li&gt; &lt;li&gt;There needs to be a healthy attitude toward testing in the industry. I watch every day at any place I go where people “fix” the code in production. If they had better testing before the code went to production they could have easily caught these errors! A production line is down for an entire day, but if you ask -- no one can afford &lt;/li&gt; &lt;li&gt;There needs to be more automation in Unit Testing. For example, can’t the computer automatically generate tests for the edge cases? Coulden’t it generate input that would “execute” every branch of code possible? It may be of marginal usefulness but it would be free.&lt;/li&gt; &lt;li&gt;Unit testing needs to run faster! I have long mentioned the need to use multiple threads to execute tests – I even modified a release of nUnit to run on the ThreadPoool, but these need to be adopted and standardized&lt;/li&gt; &lt;li&gt;There needs to be a better way to test with real data. &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Of course, the best sets of testing will not eliminate &lt;em&gt;all&lt;/em&gt; bugs.&amp;nbsp; In fact, you must adopt your own testing philosophy when in charge of a development effort.&amp;nbsp; The question you have to ask yourself is two-fold. First, How important is it that my code has very few bugs.&amp;nbsp; Would a bug in your software, if unchecked, cost your company a lot of money?&amp;nbsp; Could a potential bug cost the company thousands, millions, billions, or even someone&amp;#39;s life?&amp;nbsp; If so, then your testing should reflect that.&amp;nbsp; It&amp;#39;s good risk management to spend 2x or more the cost of software development to avoid this type of costly loss.&amp;nbsp; On the other hand, if software has little consequence other than user annoyance when a bug is present then perhaps less of the development dollars need go toward testing.&amp;nbsp; In some sceneries it is completely fathomable that none of the software budget is spent on automated testing.&amp;nbsp; &lt;/p&gt; &lt;p&gt;The other question you will need to answer is will adding automated testing to my project yield a return on investment?&amp;nbsp; Before you make a snap judgement on this second point I may add that systems that have good testing in place (automated testing in particular) have a much cheaper lifecycle than applications that do not have this type of safe-guard.&amp;nbsp; Automated testing is a lot like life insurance in this way.&amp;nbsp; Having critical pieces of your code unit tested will save your bacon almost guaranteed!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://interactiveasp.net/aggbug.aspx?PostID=21" width="1" height="1"&gt;</description><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Debugging/default.aspx">Debugging</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Testing/default.aspx">Testing</category><category domain="http://interactiveasp.net/blogs/natesstuff/archive/tags/Architecture/default.aspx">Architecture</category></item></channel></rss>