<?xml version="1.0"?>
<rss version="2.0">
<channel>
  <title>Coding the Architecture - design tag</title>
  <link>http://www.codingthearchitecture.com/tags/design/</link>
  <description>Software architecture for developers</description>
  <language>en</language>
  <copyright>Coding the Architecture</copyright>
  <lastBuildDate>Wed, 16 May 2012 08:01:04 GMT</lastBuildDate>
  <generator>Pebble (http://pebble.sourceforge.net)</generator>
  <docs>http://backend.userland.com/rss</docs>
  
  
  <item>
    <title>Is VM size an architectural smell?</title>
    <link>http://www.codingthearchitecture.com/2012/05/16/is_vm_size_an_architectural_smell.html</link>
    
      
        <description>
          &lt;p&gt;
A couple of months ago I went to an excellent set of talks at &lt;a href=&#034;http://www.meetup.com/Londonjavacommunity/events/53477082/&#034;&gt;LJC night at QCon&lt;/a&gt;. This not only inspired my entry on &lt;a href=&#034;http://www.codingthearchitecture.com/2012/03/09/modelling_process_and_staleness.html&#034;&gt;staleness&lt;/a&gt; but also made me think about some more architectural smells.
&lt;/p&gt;&lt;p&gt;
Gil Tene from Azul spoke about the maximum size of VMs we all use. A quick show of hands indicated that the maximum size of VM heap memory most of us ran was 2-4GB. Gil argued, quite convincingly, that this was due to legacy issues with garbage collection but new techniques should make this limit redundant. 
&lt;/p&gt;&lt;p&gt;
I sort of agree... However, even if all the issues surrounding garbage collecting large VMs is solved, the 2-4GB limit is still a useful one.
&lt;/p&gt;&lt;p&gt;
In &lt;a href=&#034;http://www.codingthearchitecture.com/2011/10/02/is_caching_an_architectural_smell.html&#034;&gt;Architectural Smells&lt;/a&gt; I argued that there are architectural smells in the same way that there are code smells (aspects of a system that indicate but not guarantee a possible issue) and the example I gave was caching. I also think that VM size is an architectural smell.
&lt;/p&gt;&lt;p&gt;
When designing complex systems one of the most common design guidelines is to split differing responsibilities into specific services. Non-functional requirements may complicate this but most of us try to avoid having all functionality in a single service. Certain services are obviously distinct and can be isolated. However it&#039;s easy for functionality creep to result in a service gaining a lot of responsibilities and this often results in a larger run-time footprint.
&lt;/p&gt;&lt;p&gt;
During testing this shows itself as a service requiring a large VM - certainly in comparison to other services. I view this as an architectural smell and analyse the service to see if it should be split up. (Easier if you have some form of &lt;a href=&#034;http://leanpub.com/software-architecture-for-developers&#034;&gt;lightweight and iterative design process.&lt;/a&gt;)
&lt;/p&gt;&lt;p&gt;
This is very similar to the code smell of &lt;a href=&#034;http://en.wikipedia.org/wiki/Code_smell&#034;&gt;long method&lt;/a&gt;. It&#039;s rare that your code size or service size starts out by being too large but tends to happen over time. This is a good reason why an architect can&#039;t just &lt;a href=&#034;http://www.codingthearchitecture.com/2011/04/13/software_development_is_not_a_relay_sport.html&#034;&gt;throw it over the wall&lt;/a&gt; but needs to stay involved with the project. As developers add code to the system the design might need to change.
&lt;/p&gt;&lt;p&gt;
Whether you take an absolute size or relative size will depend on your system in question. Personally, I get concerned when a service is larger than 1GB unless its prime purpose is data storage and even then the data should probably be clustered across services rather than in a single block - but that&#039;s an argument for a different occasion.
&lt;/p&gt;

        </description>
      
      
    
    
    
    <category>What is the the role of a software architect?</category>
    
    <category>How do you deliver software architecture?</category>
    
    <comments>http://www.codingthearchitecture.com/2012/05/16/is_vm_size_an_architectural_smell.html#comments</comments>
    <guid isPermaLink="true">http://www.codingthearchitecture.com/2012/05/16/is_vm_size_an_architectural_smell.html</guid>
    <pubDate>Wed, 16 May 2012 08:01:04 GMT</pubDate>
  </item>
  
  <item>
    <title>Start with the big picture</title>
    <link>http://www.codingthearchitecture.com/2009/11/18/start_with_the_big_picture.html</link>
    
      
        <description>
          &lt;p&gt;
One of the hardest things about the software architecture role is being asked to come up with a software architecture when all you&#039;re given is a set of requirements and a blank piece of paper. It&#039;s certainly one of the most fun parts of the role, but it can be a daunting prospect trying to figure out where to start and what to do. Many software teams dive straight into the code and this can initially be very productive but many teams soon start to venture down the slippery slope of constant refactoring while they try to find a design that works. Often, a little forethought is all that&#039;s needed to get the architecture definition process heading in the right direction. So where do you start?
&lt;/p&gt;

&lt;div align=&#034;center&#034;&gt;
&lt;img src=&#034;http://www.codingthearchitecture.com/images/book/start-with-the-big-picture-4.png&#034; alt=&#034;All&#034; /&gt;
&lt;/div&gt;

&lt;p&gt;
&lt;a href=&#034;http://www.codingthearchitecture.com/pages/book/start-with-the-big-picture.html&#034;&gt;Read the full essay...&lt;/a&gt;
&lt;/p&gt;
        </description>
      
      
    
    
    
    <category>How do you define software architecture?</category>
    
    <comments>http://www.codingthearchitecture.com/2009/11/18/start_with_the_big_picture.html#comments</comments>
    <guid isPermaLink="true">http://www.codingthearchitecture.com/2009/11/18/start_with_the_big_picture.html</guid>
    <pubDate>Wed, 18 Nov 2009 08:05:57 GMT</pubDate>
  </item>
  
  <item>
    <title>Testing Times</title>
    <link>http://www.codingthearchitecture.com/2008/09/26/testing_times.html</link>
    
      
      
        <description>
          &lt;p&gt;
Having recently taken &lt;a href=&#034;http://www.sealisland.net/2008/09/pursuit-of-coverage.html&#034;&gt;another look&lt;/a&gt; at my project&#039;s unit testing strategy I thought I&#039;d share some of my thoughts on how I see unit testing as just another force on the system&#039;s design. As such it needs to be weighed in the balance with the other forces.
&lt;/p&gt;
&lt;p&gt;
Unfortunately it&#039;s a force that tends to get more influence than it perhaps deserves, not least because it&#039;s a force typically backed by the development team.
&lt;/p&gt;&lt;p&gt;&lt;a href=&#034;http://www.codingthearchitecture.com/2008/09/26/testing_times.html&#034;&gt;Read more...&lt;/a&gt;&lt;/p&gt;
        </description>
      
    
    
    
    <category>How do you deliver software architecture?</category>
    
    <comments>http://www.codingthearchitecture.com/2008/09/26/testing_times.html#comments</comments>
    <guid isPermaLink="true">http://www.codingthearchitecture.com/2008/09/26/testing_times.html</guid>
    <pubDate>Fri, 26 Sep 2008 13:09:00 GMT</pubDate>
  </item>
  
  <item>
    <title>Designing the tactical solution</title>
    <link>http://www.codingthearchitecture.com/2007/06/27/designing_the_tactical_solution.html</link>
    
      
        <description>
          &lt;p&gt;
In my previous post I asserted that there&#039;s really no such thing as a &lt;a href=&#034;http://www.codingthearchitecture.com/2007/06/21/the_tactical_solution.html&#034;&gt;tactical solution&lt;/a&gt;, but what should you do if you are asked to design one? Before I answer that, let&#039;s summarise what a tactical solution is all about.
&lt;/p&gt;

&lt;blockquote&gt;
... a tactical solution can be thought of as a stopgap. It&#039;s an interim solution. It&#039;s something potentially quick and dirty. It satisfies a very immediate need. Importantly, it has a limited lifespan.
&lt;/blockquote&gt;

&lt;p&gt;
Tactical solutions are all about fast delivery and limited lifespans. You need to take *both* of these into account if you are asked to design a tactical solution because they will undoubtedly influence your design decisions. Let&#039;s look at each in turn.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Fast delivery&lt;/b&gt;
&lt;br /&gt;
Compressed timescales will alter the way in which you tackle the design process, so here are my suggestions for dealing with this.
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don&#039;t agonise over design decisions. Do the simplest thing that could possibly work in the available time and then stop.&lt;/li&gt;
&lt;li&gt;Be explicit about what your solution will and *won&#039;t* do. If the timescales have made you choose a design with limited future extensibility and flexibility, make this explicit so that everybody (including the stakeholders) understands the trade-offs that have been made and the impact they have in the future.&lt;/li&gt;
&lt;li&gt;On a similar note, make sure any assumptions you&#039;re working with are known by everybody.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;b&gt;Limited lifespan&lt;/b&gt;
&lt;br /&gt;
A limited lifespan typically provides you with some boundaries for your key non-functional requirements and you can use this to your advantage.
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A tactical solution with a one year lifespan means your solution (in theory) only needs to scale to support data volumes for one year (plus a bit for safety). This makes some design decisions much easier, such as whether you need to design a solution that is horizontally scalable.&lt;/li&gt;
&lt;li&gt;Be explicit about what your solution will and *won&#039;t* support. If the limited lifespan has influenced your decision to build something that is simple rather than highly scalable, make this explicit so that everybody (including the stakeholders) understands the trade-offs that have been made and the impact they have in the future.&lt;/li&gt;
&lt;li&gt;Again, don&#039;t agonise over design decisions. Do the simplest thing that could possibly work for the anticipated lifespan and then stop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
As &lt;a href=&#034;http://www.codingthearchitecture.com/2007/06/21/the_tactical_solution.html#comment1182524039815&#034;&gt;Kevin commented&lt;/a&gt;, a better approach to building a tactical solution is to make it the first delivery of a larger and more strategic solution. Sometimes this isn&#039;t possible though and delivering a solution with a limited lifespan in compressed timescales means that you have to &lt;a href=&#034;http://www.codingthearchitecture.com/2007/06/07/options.html&#034;&gt;make some trade-offs&lt;/a&gt;. If you find yourself in this situation, don&#039;t agonise over design decisions and make sure you&#039;re explicit about what the solution will and *won&#039;t* do.
&lt;/p&gt;
        </description>
      
      
    
    
    
    <category>How do you define software architecture?</category>
    
    <comments>http://www.codingthearchitecture.com/2007/06/27/designing_the_tactical_solution.html#comments</comments>
    <guid isPermaLink="true">http://www.codingthearchitecture.com/2007/06/27/designing_the_tactical_solution.html</guid>
    <pubDate>Wed, 27 Jun 2007 20:16:00 GMT</pubDate>
  </item>
  
  <item>
    <title>Simplicity</title>
    <link>http://www.codingthearchitecture.com/2006/02/17/simplicity.html</link>
    
      
        <description>
          &lt;p&gt;
As an architect, you&#039;ll undoubtedly be called upon to make decisions about how a particular requirement should be fulfilled. Remember, you bring together the appropriate balance between functional and non-functional requirements to produce what the end-users need. However, some decisions are easy and others are hard. To take an example, imagine that you&#039;re building a new website to replace a couple of sites that exist already. Also, let&#039;s say that all users of the new website must re-register their accounts in order to consolidate their logins across the existing sites.
&lt;/p&gt;

&lt;p&gt;
Now, clearly there several ways to make this happen. The first of these is to provide a transparent re-registration process so that users can enter their existing username/password combination. Upon logging in with these credentials, an initial attempt is made to authenticate them against the new consolidated authentication realm and, when this subsequently fails, tries to authenticate them against the existing realms. Assuming that the user is authenticated against one of these existing realms, their credentials are then automatically migrated into the new realm.
&lt;/p&gt;

&lt;p&gt;
Ideally, this is great because users can just use the new website without any knowledge of the re-registration process because they use their existing username/password as normal. From a technical perspective, however, this raises some interesting issues, particularly if you want to take advantage of something like Java EE&#039;s container managed authentication or any other mechanism that expects you to perform authentication in a specific way. True, you could customize a security framework (such as &lt;a href=&#034;http://acegisecurity.org&#034;&gt;Acegi&lt;/a&gt;) to incorporate this credential migration behaviour, but would you really want to pollute a simple authentication process with it? Think about how difficult this would become to implement/test and what happens if a particular username is shared by different users across the different existing realms?
&lt;/p&gt;

&lt;p&gt;
There is, of course, a much simpler solution whereby the user is offered a facility to explicitly migrate their account via a &#034;click here if you&#039;ve not used the new site before&#034; link. Just think about it. No complex authentication/migration logic and the user knows exactly what&#039;s going on because you can explicitly ask them for a specific username/password combination.
&lt;/p&gt;

&lt;p&gt;
For me, the latter solution represents something that&#039;s much easier to design, build and test, which leads me to imply that it&#039;s going to be developed quicker. Also, it&#039;s potentially more secure and can easily be &#034;switched off&#034; when it&#039;s deemed that all users have (or should have) migrated their existing accounts.
&lt;/p&gt;

&lt;p&gt;
Simplicity is something that an architect should strive for, especially when the elements (such as time) are against you. Clever solutions are often complex, but simple ones can be clever. Always strive for simplicity.
&lt;/p&gt;
        </description>
      
      
    
    
    
    <category>How do you define software architecture?</category>
    
    <comments>http://www.codingthearchitecture.com/2006/02/17/simplicity.html#comments</comments>
    <guid isPermaLink="true">http://www.codingthearchitecture.com/2006/02/17/simplicity.html</guid>
    <pubDate>Fri, 17 Feb 2006 21:24:29 GMT</pubDate>
  </item>
  
  <item>
    <title>The Top Ten Ways to Botch an Enterprise Java Application</title>
    <link>http://www.codingthearchitecture.com/2006/01/25/the_top_ten_ways_to_botch_an_enterprise_java_application.html</link>
    
      
        <description>
          &lt;p&gt;
If you&#039;re planning on heading to &lt;a href=&#034;http://java.sun.com/javaone/sf/index.jsp&#034;&gt;JavaOne&lt;/a&gt; this year, Cameron Purdy will be presenting what sounds like a very interesting talk on the top ten ways to botch an enterprise Java application. From his &lt;a href=&#034;http://jroller.com/page/cpurdy?entry=javaone_2006&#034;&gt;blog&lt;/a&gt;...
&lt;/p&gt;

&lt;blockquote&gt;
Two of my presentations were accepted for JavaOne, including a new one that I&#039;ve been working on: The Top Ten Ways to Botch an Enterprise Java Application. I think the hard part will be limiting myself to only talking about ten of the things that I&#039;ve seen! ;-)
&lt;br /&gt;&lt;br /&gt;
I&#039;ve given some funny (and unfortunately real-world!) anecdotes as part of some of the presentations that I&#039;ve done on scalable performance and distributed caching, including the &#034;checking the HR database on each HTTP request to see if the current user got fired since his/her last HTTP request&#034; (one of my favorites). So what is your personal &#034;Top 10 List&#034; for ways to completely botch an application?
&lt;/blockquote&gt;

&lt;p&gt;
Reading through the comments, there are some funny stories and I only wish that I could say I&#039;ve not seen these myself. One of the best ways to learn about architecture, what works and what doesn&#039;t, is to listen to others talking about their experiences. If you&#039;re at JavaOne, don&#039;t miss this opportunity.
&lt;/p&gt;
        </description>
      
      
    
    
    
    <category>How do you define software architecture?</category>
    
    <comments>http://www.codingthearchitecture.com/2006/01/25/the_top_ten_ways_to_botch_an_enterprise_java_application.html#comments</comments>
    <guid isPermaLink="true">http://www.codingthearchitecture.com/2006/01/25/the_top_ten_ways_to_botch_an_enterprise_java_application.html</guid>
    <pubDate>Wed, 25 Jan 2006 13:28:33 GMT</pubDate>
  </item>
  
  <item>
    <title>High-Assurance Design</title>
    <link>http://www.codingthearchitecture.com/2006/01/18/high_assurance_design.html</link>
    
      
        <description>
          &lt;p&gt;
This week, Cliff Berg is doing a promotion of his latest book entitled &lt;a href=&#034;http://www.awprofessional.com/title/0321375777&#034;&gt;High-Assurance Design : Architecting Secure and Reliable Enterprise Applications&lt;/a&gt;. I&#039;m sure you&#039;ve encountered this yourself, but on many projects there&#039;s often a disconnect between the development team that build the software and the security experts that reside elsewhere in the organisation. I&#039;ve certainly seen this happen and due to the different skillsets involved, it&#039;s hard to get these two groups of people talking the same language. As a result, security is often inadequately implemented and reliability ... well that sometimes doesn&#039;t even feature.
&lt;/p&gt;

&lt;p&gt;
If this sounds familiar then Cliff&#039;s book might be for you. Stop by the &lt;a href=&#034;http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=forum&amp;f=9&#034;&gt;OO, Patterns, UML and Refactoring&lt;/a&gt; at the JavaRanch Saloon to see the discussion and have the chance to win a copy.
&lt;/p&gt;
        </description>
      
      
    
    
    
    <category>What is the the role of a software architect?</category>
    
    <comments>http://www.codingthearchitecture.com/2006/01/18/high_assurance_design.html#comments</comments>
    <guid isPermaLink="true">http://www.codingthearchitecture.com/2006/01/18/high_assurance_design.html</guid>
    <pubDate>Wed, 18 Jan 2006 20:11:09 GMT</pubDate>
  </item>
  
  </channel>
</rss>

