<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.crowehorwath.com/cs/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>Crowe Solutions Architecture Blog : performance</title><link>http://www.crowehorwath.com/cs/blogs/solutions/archive/tags/performance/default.aspx</link><description>Tags: performance</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP2 (Build: 20611.960)</generator><item><title>Document Non-functional Requirements</title><link>http://www.crowehorwath.com/cs/blogs/solutions/archive/2008/01/07/document-non-functional-requirements.aspx</link><pubDate>Mon, 07 Jan 2008 16:56:00 GMT</pubDate><guid isPermaLink="false">733c1265-83be-4492-a5ff-7e2be949a514:65</guid><dc:creator>Daan De Brouckere</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.crowehorwath.com/cs/blogs/solutions/rsscomments.aspx?PostID=65</wfw:commentRss><comments>http://www.crowehorwath.com/cs/blogs/solutions/archive/2008/01/07/document-non-functional-requirements.aspx#comments</comments><description>&lt;p&gt;When a new solution is being discussed, it’s easy to focus on all of the things it should do, what it should look like, and what technologies it should be based on. It’s very easy to get caught up in discussions with business resources about comprehensive feature sets and ways to present the information to customers. With a technical audience, it’s entertaining to squabble about the pros and cons of using one technology versus another to address the functional needs of a business problem.&lt;/p&gt;
&lt;p&gt;When do discussions about disaster recovery, performance and scalability come into play? When should they? Why can’t I just say that the system shouldn’t fail, it should be fast, and it should be able to scale? The short answer is that this could be quite cost-prohibitive. The longer answers are below.&lt;/p&gt;
&lt;p&gt;Let’s start with disaster recovery. I liken the conversation about disaster recovery to discussions about life insurance. To most people, it’s not fun to talk about what would happen if you die. Same goes for the brand new system you’re about to build. Disaster recovery is not a topic to be discussed AFTER the database gets corrupted or the application server CPU overheats. These are conversations that have to be had BEFORE the system is designed. Just as the functional requirements are documents, so should be these disaster recovery requirements. Based on different up-time needs and recovery efficiency, disaster recovery requirements could vary from making sure each server is backed up nightly to putting structure around a hot-backup on the other side of the country.&lt;/p&gt;
&lt;p&gt;When it comes to talking about performance, the conversation tends to be easier; however, the proper documentation of performance requirements can be tough. How do you account for variations in network traffic? What if another process is running on your application server? The recommendation I have here is that you start by determining what an adequate response time looks like for the key functions in your new system. This needs to be balanced with the cost for delivering that kind of performance. Execute your performance tests in an environment that closely mirrors production. When it comes to documenting actual performance requirements, these can vary from a generic average response time per function to specific metrics around the key transactions of the system based on expected usage patterns throughout the day or during a specific time period (think concert ticket sales).&lt;/p&gt;
&lt;p&gt;What about scalability? How do we expect the system to grow over the next several years? How many users do we expect initially? How many of them will be using the system concurrently? Even after having the answers to these questions (or best guesses), documenting requirements around scalability is difficult. I would recommend turning these into technical requirements around sustainable transaction throughput. Considering these requirements during the design phase allows you to build in the proper flexibility so the system can support the future anticipated growth.&lt;/p&gt;
&lt;p&gt;Beyond these three different types of non-functional requirements, there may be many more that should be considered based on the system’s particular needs. The trick is to recognize early on in the initiation phase all the different non-functional aspects that are critical to the success of the system, documenting them, validating them, and ensuring they are written in a objective way.&lt;/p&gt;&lt;img src="http://www.crowehorwath.com/cs/aggbug.aspx?PostID=65" width="1" height="1"&gt;</description><category domain="http://www.crowehorwath.com/cs/blogs/solutions/archive/tags/performance/default.aspx">performance</category><category domain="http://www.crowehorwath.com/cs/blogs/solutions/archive/tags/requirements/default.aspx">requirements</category><category domain="http://www.crowehorwath.com/cs/blogs/solutions/archive/tags/scalability/default.aspx">scalability</category><category domain="http://www.crowehorwath.com/cs/blogs/solutions/archive/tags/disaster+recovery/default.aspx">disaster recovery</category></item><item><title>Code Reviews and Maintainability</title><link>http://www.crowehorwath.com/cs/blogs/solutions/archive/2007/12/26/code-reviews-and-maintainability.aspx</link><pubDate>Wed, 26 Dec 2007 15:06:00 GMT</pubDate><guid isPermaLink="false">733c1265-83be-4492-a5ff-7e2be949a514:43</guid><dc:creator>Mark Strawmyer</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.crowehorwath.com/cs/blogs/solutions/rsscomments.aspx?PostID=43</wfw:commentRss><comments>http://www.crowehorwath.com/cs/blogs/solutions/archive/2007/12/26/code-reviews-and-maintainability.aspx#comments</comments><description>&lt;p&gt;Its continually amazing to me how discipline can go a long way to helping ensure a solution has long term maintainability.&amp;nbsp; Making sure you set&amp;nbsp;parameters and agreed upon standards at the start of a project and then having the mettle to ensure that regardless of how tirelessly you&amp;#39;re having to write code you take the time to stay within the parameters.&amp;nbsp; More often than not when I&amp;#39;m reviewing a solution I see a lack of standards or consistency and excuses such as &amp;quot;there isn&amp;#39;t time for it&amp;quot; is almost always the explanation offered or implied.&amp;nbsp; Or even more shockingly you find an experienced developer that is coding with discipline, but not caring that others aren&amp;#39;t and not sharing their best practices.&amp;nbsp; Open forum peer reviews and discussion of code is something I am a big proponent of in projects especially early on.&amp;nbsp; It helps ensure that folks are on the same page in terms of style, practices, and that the solution is getting off to the right start.&amp;nbsp; This is great for reviewing key and common elements of a solution even if it is only practiced early in the project and then abandoned as the project is more mature in the lifecycle.&amp;nbsp;&amp;nbsp;The downside though is that it isn&amp;#39;t realistic to expect that all code can be reviewed by such a process as there is often way too much code.&lt;/p&gt;
&lt;p&gt;Enter tools.&amp;nbsp; Even if there are no explicit standards being followed, there are code analysis and metric tools that can be a big help to making sure the overall solution is more maintainable and performant.&amp;nbsp; Code analysis will examine the code and look for situations where items may be less than optimal or could be done another way for better performance, maintainability, security, etc.&amp;nbsp; Common situations are things such as over use of string concatenation where specially designed and class library provided string building objects would be better or inconsistent use of naming conventions.&lt;/p&gt;
&lt;p&gt;Code metric tools will examine things such as the overall number of lines of code, depth of inheritence, and cyclomatic complexity which is the number of branches that can be taken within a specific block of code.&amp;nbsp; The higher the cyclomatic complexity the harder it will be to unit test the code as there are more conditions to test.&lt;/p&gt;
&lt;p&gt;There are a number of tools out&amp;nbsp;from vendors such as IBM (Rational), Compuware (DevPartner), and Microsoft (VSTS).&amp;nbsp; Microsoft recently released the Developer edition of its Visual Studio Team Suite that now includes code metrics and analysis.&amp;nbsp; I&amp;#39;ve been experimenting with it and using it to look at a bunch of different code and I&amp;#39;ve been pretty happy with it and its ease of use and understanding so far.&lt;/p&gt;
&lt;p&gt;I highly recommend that developers and development teams adopt a tool to help automate code reviews and perform code analysis and metrics if you&amp;#39;re not already.&amp;nbsp; Even the most disciplined developer will benefit from having an automated review of their code.&amp;nbsp; It only takes a couple of minutes based on the tool and size of the code base and the results can give you plenty to think about and decide to take action on or not.&amp;nbsp; Its a great way to learn additional best practices you may not have been aware of by examining the output of the automated review.&amp;nbsp; Each developer should be responsible for running such as tool against their code and remediating issues prior to having flagged an item as complete.&amp;nbsp; Again, it is a decision making process as you won&amp;#39;t want to blindly make all changes suggested, but such a process prior to turning in code&amp;nbsp;will go a long way to helping overall maintainability.&lt;/p&gt;&lt;img src="http://www.crowehorwath.com/cs/aggbug.aspx?PostID=43" width="1" height="1"&gt;</description><category domain="http://www.crowehorwath.com/cs/blogs/solutions/archive/tags/performance/default.aspx">performance</category><category domain="http://www.crowehorwath.com/cs/blogs/solutions/archive/tags/code+analysis/default.aspx">code analysis</category><category domain="http://www.crowehorwath.com/cs/blogs/solutions/archive/tags/code+metrics/default.aspx">code metrics</category><category domain="http://www.crowehorwath.com/cs/blogs/solutions/archive/tags/maintainability/default.aspx">maintainability</category><category domain="http://www.crowehorwath.com/cs/blogs/solutions/archive/tags/tuning/default.aspx">tuning</category><category domain="http://www.crowehorwath.com/cs/blogs/solutions/archive/tags/architecture/default.aspx">architecture</category></item></channel></rss>