<?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>Reducing the gap between developers and architects</description>
  <language>en</language>
  <copyright>Coding the Architecture</copyright>
  <lastBuildDate>Wed, 27 Aug 2008 13:12:54 GMT</lastBuildDate>
  <generator>Pebble (http://pebble.sourceforge.net)</generator>
  <docs>http://backend.userland.com/rss</docs>
  
  
  <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>
      
      
    
    
    
    <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>
      
      
    
    
    
    <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>
      
      
    
    
    
    <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>
  
  </channel>
</rss>
