<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/">

  <channel rdf:about="http://www.codingthearchitecture.com/">
    <title>Coding the Architecture</title>
    <link>http://www.codingthearchitecture.com/</link>
    <description>Software architecture for developers</description>
    <items>
      <rdf:Seq>
        
        <rdf:li resource="http://www.codingthearchitecture.com/2012/01/09/ikke_s_smidig_prosjektmetode_likevel.html" />
        
        <rdf:li resource="http://www.codingthearchitecture.com/2012/01/08/smidig_m_kombineres_med_arkitektur.html" />
        
        <rdf:li resource="http://www.codingthearchitecture.com/2012/01/05/contextualising_just_enough_up_front_design.html" />
        
        <rdf:li resource="http://www.codingthearchitecture.com/2011/11/25/features_vs_behaviour.html" />
        
        <rdf:li resource="http://www.codingthearchitecture.com/2011/11/22/re_clean_architecture.html" />
        
        <rdf:li resource="http://www.codingthearchitecture.com/2011/11/16/the_frustrated_architect_video_and_slides.html" />
        
        <rdf:li resource="http://www.codingthearchitecture.com/2011/11/06/the_delivery_mechanism_is_an_annoying_detail.html" />
        
        <rdf:li resource="http://www.codingthearchitecture.com/2011/10/06/goto_aarhus_2011_and_software_architect_2011.html" />
        
        <rdf:li resource="http://www.codingthearchitecture.com/2011/10/02/is_caching_an_architectural_smell.html" />
        
        <rdf:li resource="http://www.codingthearchitecture.com/2011/09/06/jitter.html" />
        
      </rdf:Seq>
    </items>
  </channel>

  
  <item rdf:about="http://www.codingthearchitecture.com/2012/01/09/ikke_s_smidig_prosjektmetode_likevel.html">
    <title>Ikke så smidig prosjektmetode, likevel?</title>
    <link>http://www.codingthearchitecture.com/2012/01/09/ikke_s_smidig_prosjektmetode_likevel.html</link>
    
      
        <description>
          &lt;p&gt;
While with &lt;a href=&#034;http://www.bouvet.no&#034; target=&#034;_blank&#034;&gt;Bouvet&lt;/a&gt;, in addition to the &lt;a href=&#034;http://www.codingthearchitecture.com/2012/01/08/smidig_m_kombineres_med_arkitektur.html&#034;&gt;digi.no interview&lt;/a&gt;, Simen Sommerfeldt and I were interviewed by Teknisk Ukeblad about how agile isn&#039;t a substitute for basic software engineering, architecture and craftsmanship.
&lt;/p&gt;

&lt;p align=&#034;center&#034;&gt;
&lt;a href=&#034;http://www.tu.no/it/article293780.ece&#034; target=&#034;_blank&#034;&gt;&lt;img src=&#034;http://www.codingthearchitecture.com/images/20111202-teknisk-ukeblad.jpg&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Read &lt;a href=&#034;http://www.tu.no/it/article293780.ece&#034; target=&#034;_blank&#034;&gt;Ikke så smidig prosjektmetode, likevel?&lt;/a&gt;...
&lt;/p&gt;
        </description>
      
      
    
  </item>
  
  <item rdf:about="http://www.codingthearchitecture.com/2012/01/08/smidig_m_kombineres_med_arkitektur.html">
    <title>Smidig må kombineres med arkitektur</title>
    <link>http://www.codingthearchitecture.com/2012/01/08/smidig_m_kombineres_med_arkitektur.html</link>
    
      
        <description>
          &lt;p&gt;
I spent a fantastic few days with &lt;a href=&#034;http://www.bouvet.no&#034; target=&#034;_blank&#034;&gt;Bouvet&lt;/a&gt; in Oslo towards the end of last year where talked about software architecture with some of the team, customers and press. For the Norwegian speakers that haven&#039;t seen it, Simen Sommerfeldt and I were interviewed by digi.no about software architecture, agile and &#034;&lt;a href=&#034;http://www.codingthearchitecture.com/2012/01/05/contextualising_just_enough_up_front_design.html&#034;&gt;just enough&lt;/a&gt;&#034;.
&lt;/p&gt;

&lt;p align=&#034;center&#034;&gt;
&lt;a href=&#034;http://www.digi.no/881998/smidig-maa-kombineres-med-arkitektur&#034; target=&#034;_blank&#034;&gt;&lt;img src=&#034;http://www.codingthearchitecture.com/images/20111109-digi.jpg&#034; alt=&#034;digi.no interview&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Read &lt;a href=&#034;http://www.digi.no/881998/smidig-maa-kombineres-med-arkitektur&#034; target=&#034;_blank&#034;&gt;Smidig må kombineres med arkitektur&lt;/a&gt;...
&lt;/p&gt;



        </description>
      
      
    
  </item>
  
  <item rdf:about="http://www.codingthearchitecture.com/2012/01/05/contextualising_just_enough_up_front_design.html">
    <title>Contextualising just enough up front design</title>
    <link>http://www.codingthearchitecture.com/2012/01/05/contextualising_just_enough_up_front_design.html</link>
    
      
      
        <description>
          &lt;p&gt;
In our move away from the waterfall way of building software, it&#039;s common for software teams to ask how much up front design they should be doing. &lt;a href=&#034;http://www.codingthearchitecture.com/pages/book/just-enough-architecture.html&#034; target=&#034;_blank&#034;&gt;Just enough&lt;/a&gt; is a good starting point but what exactly does that mean?
&lt;/p&gt;&lt;p&gt;&lt;a href=&#034;http://www.codingthearchitecture.com/2012/01/05/contextualising_just_enough_up_front_design.html&#034;&gt;Read more...&lt;/a&gt;&lt;/p&gt;
        </description>
      
    
  </item>
  
  <item rdf:about="http://www.codingthearchitecture.com/2011/11/25/features_vs_behaviour.html">
    <title>Features vs Behaviour</title>
    <link>http://www.codingthearchitecture.com/2011/11/25/features_vs_behaviour.html</link>
    
      
        <description>
          &lt;p&gt;
I&#039;ve recently had a bug I raised with a third party software supplier downgraded from high to low importance. No one likes having their bugs downgraded (it probably shows you what a nerd I am by taking this personally) but what surprised me was the reason. The bug was causing lots of misleading errors to be reported but the bug was deemed to not affect core &#039;functionality&#039; as the feature worked from an end user&#039;s perspective. However it has a negative effect on our ability to operate the software system.
&lt;p&gt;
This seems to be one of the big differences between software developers and software architects. Software developers/programmers think in terms of features and a feature tends to be defined in terms of cause and effect e.g. a user clicks on a button and the system responds. A defect or bug is simply when the system does not give the response as defined by the specification.
&lt;p&gt;
An architect should consider the holistic behaviour. Not only thinking about a resultant action but the complete behaviour and life-cycle of the action. From simple (and measurable) items like timings (latency, response etc) to more complex system behaviour such as auditing, logging, replication etc.
&lt;p&gt;
Most software development processes revolve around features. Therefore when a bug is raised it HAS to be registered against a feature. This is then passed to a developer who either rejects it as &#039;working&#039; or downgrades it as not being core or having a &#039;work around&#039;. However the work around might be unacceptable such as waiting longer, bad logging/auditing or a side effect on a completely different part of the system.
&lt;p&gt;
In my experience it is rare for a development process to consider system or architecture issues.
&lt;p&gt;
Does your software development process allow you to raise and track non-functional issues and how do you do this? Do tools (such a JIRA) help or hinder with this? These issues will cut across many features - should they be raised against a set of features or have a single bucket that they get put in? Most importantly, how can I get my bug upgraded when they have a feature based bug reporting process?!
&lt;p&gt;
As a side note it appears to me that Simon Brown&#039;s and Robert Martin&#039;s &lt;a href=&#034;http://www.infoq.com/news/2011/11/Debate-The-Annoying-Detail&#034;&gt;debate&lt;/a&gt; is partially about the differential between product features and system behaviour.
&lt;/p&gt;
        </description>
      
      
    
  </item>
  
  <item rdf:about="http://www.codingthearchitecture.com/2011/11/22/re_clean_architecture.html">
    <title>RE: Clean Architecture</title>
    <link>http://www.codingthearchitecture.com/2011/11/22/re_clean_architecture.html</link>
    
      
        <description>
          &lt;p&gt;
&lt;a href=&#034;http://blog.8thlight.com/uncle-bob/2011/11/22/Clean-Architecture.html&#034; target=&#034;_blank&#034;&gt;Clean Architecture&lt;/a&gt; is a follow-up post by Uncle Bob to much of the recent commentary on &lt;a href=&#034;http://www.cleancoders.com/codecast/clean-code-episode-7/show&#034; target=&#034;_blank&#034;&gt;Clean Code Episode VII - Architecture, Use Cases, and High Level Design&lt;/a&gt;, including my own post called &lt;a href=&#034;http://www.codingthearchitecture.com/2011/11/06/the_delivery_mechanism_is_an_annoying_detail.html&#034; target=&#034;_blank&#034;&gt;The delivery mechanism is an annoying detail&lt;/a&gt;. I&#039;ll keep this short because I only want to pick up on a couple of points. Uncle Bob says...
&lt;/p&gt;

&lt;blockquote&gt;
In the weeks since I started talking about the need to clean up our architecture, I’ve noticed a surprising resistance to the idea. Apparently the notion that it’s a good idea to hide the framework, UI, or database from the application code is not universally accepted.
&lt;/blockquote&gt;

&lt;p&gt;
I&#039;m 100% behind the idea of keeping architectures clean and (as far as possible) decoupling the application code from the technology choices. I even mention &#034;Boundary, Controller, Entity&#034; in my &lt;a href=&#034;/2011/11/16/the_frustrated_architect_video_and_slides.html&#034; target=&#034;_blank&#034;&gt;The Frustrated Architect talk (video available)&lt;/a&gt; as a good way to decouple. I mean, why would you want to start a web server or database just to run some unit tests? That&#039;s crazy.
&lt;/p&gt;

&lt;blockquote&gt;
One somewhat dissenting view, written by The Frustrated Architect in his coding {the} architecture blog is here. He shows a picture, which I’ll repeat:
&lt;br /&gt;
&lt;br /&gt;
... see picture below ...
&lt;br /&gt;
&lt;br /&gt;
The point he’s trying to make is that if the UI and Database are a much larger part of the system than the business rules, then the architecture of the system should be more oriented around those larger elements. Of course I disagree. No matter how large any one part of the system is, the other parts should be decoupled from it.
&lt;/blockquote&gt;

&lt;p&gt;
No, that&#039;s not the point I&#039;m trying to make. I&#039;m saying the delivery mechanism is NOT an annoying detail that can be deferred or ignored &#034;right off the end of the world&#034;. I&#039;m going to quote myself here from &lt;a href=&#034;http://www.codingthearchitecture.com/2011/11/06/the_delivery_mechanism_is_an_annoying_detail.html&#034; target=&#034;_blank&#034;&gt;The delivery mechanism is an annoying detail&lt;/a&gt;...
&lt;/p&gt;

&lt;blockquote&gt;
That&#039;s right, the annoying detail is actually a large chunk of the system and, for me, architecture is about more than just what&#039;s contained within &#034;the application&#034;. Structure is very important, but what about that tricky stuff like non-functional requirements, the actual delivery mechanism (technologies, frameworks, tools, APIs, etc), infrastructure services (e.g. logging, exception handling, configuration, etc), integration services (internal and external), satisfying any environmental constraints (e.g. operations and support), etc. For me, this is what &#034;architecture&#034; is all about and *that&#039;s* &#034;the whole enchilada&#034;.
&lt;/blockquote&gt;

&lt;p&gt;
I consider the role of the software architect to be about looking after the big picture and the type of decoupling that Uncle Bob talks about is exactly the sort of architectural principle that I would adopt on my projects. However, in this role as a software architect, I&#039;d be foolish to ignore the other major factors that may cause my project to fail. This includes, but is not limited to, all of the stuff that I quote above (tricky non-functional requirements, etc). A good software architecture is not just about clean code.
&lt;/p&gt;

&lt;p align=&#034;center&#034;&gt;
&lt;img src=&#034;http://www.codingthearchitecture.com/images/the-delivery-mechanism-is-an-annoying-detail-5.png&#034; alt=&#034;The delivery mechanism is an annoying detail&#034; /&gt;
&lt;/p&gt;

&lt;h3&gt;&lt;a name=&#034;summary&#034;&gt;The executive summary&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;
Again, to recap in case I&#039;m not being clear...
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Decoupling application code from technology is good and certainly something we should all strive for. The result is code that is easy to unit test, easy to substitute, easy to maintain, easy to change, etc.&lt;/li&gt;
&lt;li&gt;Software architecture is about the big picture and application code is only one part of that big picture.&lt;/li&gt;
&lt;li&gt;You run the risk of your software project failing if you continually defer significant decisions about the &#034;delivery mechanism&#034; and don&#039;t consider how to address your significant non-functional requirements and/or constraints.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
To summarise points 2 and 3 ... &lt;a href=&#034;http://www.codingthearchitecture.com/2011/11/06/the_delivery_mechanism_is_an_annoying_detail.html&#034; target=&#034;_blank&#034;&gt;the delivery mechanism is not an annoying detail&lt;/a&gt;. Now, please go back and read &lt;a href=&#034;http://blog.8thlight.com/uncle-bob/2011/11/22/Clean-Architecture.html&#034; target=&#034;_blank&#034;&gt;Clean Architecture&lt;/a&gt; from the &#034;Not Rocket Science&#034; section because there&#039;s some really good advice in there. :-)
&lt;/p&gt;
        </description>
      
      
    
  </item>
  
  <item rdf:about="http://www.codingthearchitecture.com/2011/11/16/the_frustrated_architect_video_and_slides.html">
    <title>The Frustrated Architect - video and slides</title>
    <link>http://www.codingthearchitecture.com/2011/11/16/the_frustrated_architect_video_and_slides.html</link>
    
      
        <description>
          &lt;p&gt;
A really short note to say that the video and slides from my &#034;The Frustrated Architect&#034; talk at Skills Matter yesterday evening are now all available online. Here are the links...
&lt;/p&gt;

&lt;p align=&#034;center&#034;&gt;
&lt;a href=&#034;http://codingthearchitecture.com/presentations/skillsmatter2011-the-frustrated-architect/&#034; target=&#034;_blank&#034;&gt;&lt;img src=&#034;http://static.codingthearchitecture.com/presentations/skillsmatter2011-the-frustrated-architect/thumbnails/slide.005.png&#034; alt=&#034;&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;
&lt;a href=&#034;http://codingthearchitecture.com/presentations/skillsmatter2011-the-frustrated-architect/&#034; target=&#034;_blank&#034;&gt;&lt;img src=&#034;http://static.codingthearchitecture.com/presentations/skillsmatter2011-the-frustrated-architect/thumbnails/slide.006.png&#034; alt=&#034;&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;
&lt;a href=&#034;http://codingthearchitecture.com/presentations/skillsmatter2011-the-frustrated-architect/&#034; target=&#034;_blank&#034;&gt;&lt;img src=&#034;http://static.codingthearchitecture.com/presentations/skillsmatter2011-the-frustrated-architect/thumbnails/slide.021.png&#034; alt=&#034;&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;
&lt;a href=&#034;http://codingthearchitecture.com/presentations/skillsmatter2011-the-frustrated-architect/&#034; target=&#034;_blank&#034;&gt;&lt;img src=&#034;http://static.codingthearchitecture.com/presentations/skillsmatter2011-the-frustrated-architect/thumbnails/slide.039.png&#034; alt=&#034;&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;
&lt;a href=&#034;http://codingthearchitecture.com/presentations/skillsmatter2011-the-frustrated-architect/&#034; target=&#034;_blank&#034;&gt;&lt;img src=&#034;http://static.codingthearchitecture.com/presentations/skillsmatter2011-the-frustrated-architect/thumbnails/slide.069.png&#034; alt=&#034;&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;a href=&#034;http://codingthearchitecture.com/presentations/skillsmatter2011-the-frustrated-architect/&#034; target=&#034;_blank&#034;&gt;Abstract and slides (online view and downloadable PDF)&lt;/a&gt;
&lt;/p&gt;

&lt;p align=&#034;center&#034;&gt;
&lt;a href=&#034;http://skillsmatter.com/podcast/java-jee/frustrated-architect&#034; target=&#034;_blank&#034;&gt;&lt;img src=&#034;http://www.codingthearchitecture.com/images/videos/skillsmatter2011-the-frustrated-architect.jpg&#034; alt=&#034;The Frustrated Architect&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;a href=&#034;http://skillsmatter.com/podcast/java-jee/frustrated-architect&#034; target=&#034;_blank&#034;&gt;Video&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
I really enjoyed presenting this session but the discussion afterwards in the pub was fantastic. Seems like others are running into similar problems on some of their projects, so maybe the advice I give in the talk will be of use to you too. :-)
&lt;/p&gt;
        </description>
      
      
    
  </item>
  
  <item rdf:about="http://www.codingthearchitecture.com/2011/11/06/the_delivery_mechanism_is_an_annoying_detail.html">
    <title>The delivery mechanism is an annoying detail</title>
    <link>http://www.codingthearchitecture.com/2011/11/06/the_delivery_mechanism_is_an_annoying_detail.html</link>
    
      
        <description>
          &lt;p&gt;
In my &lt;a href=&#034;http://www.codingthearchitecture.com/presentations/gotoaarhus2011-the-frustrated-architect/&#034; target=&#034;_blank&#034;&gt;The Frustrated Architect&lt;/a&gt; presentation at GOTO Aarhus in October&lt;sup&gt;*&lt;/sup&gt;, I talked about how there are a number of &#034;classic&#034; software design techniques from the pre-agile era that are being used less and less. For example, things like UML, class-responsibility-collaboration cards and component-based design. This is a shame because some of these techniques can complement an agile way of working and would perhaps prevent some wheels from being reinvented. If people don&#039;t know about these techniques though, how will they adopt them? I&#039;ll come back to this shortly but, first, I was intrigued by this tweet from Uncle Bob a few weeks back.
&lt;/p&gt;

&lt;p align=&#034;center&#034;&gt;
&lt;a href=&#034;http://twitter.com/#!/unclebobmartin/status/118365858581069824&#034; target=&#034;_blank&#034;&gt;&lt;img src=&#034;http://www.codingthearchitecture.com/images/the-delivery-mechanism-is-an-annoying-detail-1.png&#034; alt=&#034;The architecture of an accounting app should scream accounting not Spring &amp; Hibernate.&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
I don&#039;t necessarily disagree with this statement, although I like to see a software architecture grounded in reality, and that includes technology choices. Another tweet from Uncle Bob...
&lt;/p&gt;

&lt;p align=&#034;center&#034;&gt;
&lt;a href=&#034;http://twitter.com/#!/unclebobmartin/status/118403913937453056&#034; target=&#034;_blank&#034;&gt;&lt;img src=&#034;http://www.codingthearchitecture.com/images/the-delivery-mechanism-is-an-annoying-detail-2.png&#034; alt=&#034;A good architecture allows you to defer framework decisions. A good architecture allows frameworks to act as plugins to the app.&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Again ... maybe, maybe not. Surely if there are some key technology choices that need to be made, then they should be made, right? Finally, another tweet...
&lt;p&gt;

&lt;p align=&#034;center&#034;&gt;
&lt;a href=&#034;http://twitter.com/#!/unclebobmartin/status/118428475249008640&#034; target=&#034;_blank&#034;&gt;&lt;img src=&#034;http://www.codingthearchitecture.com/images/the-delivery-mechanism-is-an-annoying-detail-3.png&#034; alt=&#034;I am amazed by the fact that some people actually disagree that a good software architecture allows you to defer framework decisions.&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Hmmm, if I don&#039;t or can&#039;t defer decisions, does this mean that I have a bad architecture? Shouldn&#039;t deferral be a conscious decision rather than a rule? All of this and the discussion that followed on Twitter intrigued me enough to stump up the cash for &lt;a href=&#034;http://www.cleancoders.com/codecast/clean-code-episode-7/show&#034; target=&#034;_blank&#034;&gt;Clean Code Episode VII - Architecture, Use Cases, and High Level Design&lt;/a&gt; to see what Uncle Bob&#039;s perspective on architecture is.
&lt;/p&gt;
 
&lt;h3&gt;Clean Code Episode VII - Architecture, Use Cases, and High Level Design&lt;/h3&gt;
&lt;p&gt;
Now that I&#039;ve watched it, what do I think? Well I&#039;m really pleased to see coverage of a couple of things. The first is describing functionality through delivery mechanism independent use cases, where there is no discussion of web pages, screens, buttons, technology, etc. And the second is the follow-up technique where you decompose a use case down into a number of different classes, each of which has a distinct responsibility. These are entities (e.g. business objects), controllers (also known as interactors, which represent the actual flow of control described in the use cases) and boundaries (which represent an interaction with an actor through the &#034;delivery mechanism&#034;). What these techniques basically do is allow you to describe and implement a use case in a way that is completely independent from the way that the use case will be delivered. In effect, you can bolt-on a number of different delivery mechanisms (e.g. a web or console app) without changing the actual core of &#034;the application&#034;, which is ultimately the functionality that is being described by the use cases. As I said at the start of this post, these are the sort of techniques that many people don&#039;t know about, so I&#039;m really pleased to see them being communicated here.
&lt;/p&gt;
 
&lt;h3&gt;I&#039;m in agreement then?&lt;/h3&gt;
&lt;p&gt;
Coming back to Uncle Bob&#039;s tweets, I can now see his perspective. Adopting this approach does allow you to defer technology decisions and from the perspective of the use cases, this technology stuff is really just an &#034;annoying detail&#034;.
&lt;/p&gt;

&lt;p align=&#034;center&#034;&gt;
&lt;img src=&#034;http://www.codingthearchitecture.com/images/the-delivery-mechanism-is-an-annoying-detail-4.png&#034; alt=&#034;You can plug-in the delivery mechanism to the application&#034; border=&#034;0&#034; /&gt;
&lt;/p&gt;

&lt;p&gt;
I agree that the boundary-controller-entity technique is a great way to design software because the result is a really nice separation of concerns, which ultimately leads to something that can be easily unit tested and extended in the future. This is all about partitioning and isolation. OK, so I&#039;m agreeing with Uncle Bob then? Hmm, not quite.
&lt;/p&gt;

&lt;h3&gt;&#034;Architecture&#034;&lt;/h3&gt;
&lt;p&gt;
Throughout the video, Uncle Bob says the following (which I&#039;ve paraphrased).
&lt;/p&gt;

&lt;blockquote&gt;
The architecture of an accounting app should scream accounting. A web and console version of the same accounting app should have identical architectures. The web delivery mechanism is a detail.
&lt;/blockquote&gt;

&lt;p&gt;
This is repeated a number of times through the video and it&#039;s based upon all of the good stuff that I&#039;ve talked about above. However, I find myself in strong disagreement with the message as a whole. And here&#039;s why ... because the word &#034;architecture&#034; is being used. At face value this might sound pedantic but let&#039;s consider for a moment what Uncle Bob is actually talking about by redrawing the above diagram. Let&#039;s imagine that you&#039;re building an accounting app that you want to deliver over the web. Security is important so let&#039;s break it into multiple physical tiers. And we need to store all of the accounting data somewhere, so let&#039;s use a database. How does that annoying detail look now then...
&lt;/p&gt;

&lt;p align=&#034;center&#034;&gt;
&lt;img src=&#034;http://www.codingthearchitecture.com/images/the-delivery-mechanism-is-an-annoying-detail-5.png&#034; alt=&#034;Architecture is about the big picture&#034; border=&#034;0&#034; /&gt;
&lt;/p&gt;

&lt;p&gt;
That&#039;s right, the annoying detail is actually a large chunk of the system and, for me, architecture is about more than just what&#039;s contained within &#034;the application&#034;. Structure is very important, but what about that tricky stuff like non-functional requirements, the actual delivery mechanism (technologies, frameworks, tools, APIs, etc), infrastructure services (e.g. logging, exception handling, configuration, etc), integration services (internal and external), satisfying any environmental constraints (e.g. operations and support), etc. For me, this is what &#034;architecture&#034; is all about and *that&#039;s* &#034;the whole enchilada&#034;.
&lt;/p&gt;

&lt;p class=&#034;small&#034;&gt;
&lt;sup&gt;*&lt;/sup&gt;I&#039;ll be presenting &lt;a href=&#034;http://www.codingthearchitecture.com/presentations/gotoaarhus2011-the-frustrated-architect/&#034; target=&#034;_blank&#034;&gt;The Frustrated Architect&lt;/a&gt; at &lt;a href=&#034;http://skillsmatter.com/event/design-architecture/frustrated-architect&#034; target=&#034;_blank&#034;&gt;Skills Matter in London on the 15th of November and you can sign-up for free&lt;/a&gt;
&lt;/p&gt; 

&lt;h3&gt;Update&lt;/h3&gt;
&lt;p&gt;
If you don&#039;t have the video but want to get a feel for Uncle Bob&#039;s approach to architecture, take a look at the following links...
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#034;http://cleancoder.posterous.com/architecture-deference&#034; target=&#034;_blank&#034;&gt;Architecture Deference&lt;/a&gt; (&lt;2 minute video)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#034;http://blog.8thlight.com/uncle-bob/2011/09/30/Screaming-Architecture.html&#034; target=&#034;_blank&#034;&gt;Screaming Architecture&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
        </description>
      
      
    
  </item>
  
  <item rdf:about="http://www.codingthearchitecture.com/2011/10/06/goto_aarhus_2011_and_software_architect_2011.html">
    <title>GOTO Aarhus 2011 and Software Architect 2011</title>
    <link>http://www.codingthearchitecture.com/2011/10/06/goto_aarhus_2011_and_software_architect_2011.html</link>
    
      
        <description>
          &lt;p&gt;
Conference season is again upon us and I&#039;m speaking at two events over the next couple of weeks.
&lt;/p&gt;

&lt;h3&gt;GOTO Aarhus 2011&lt;/h3&gt;
&lt;p&gt;
&lt;a href=&#034;http://gotocon.com/aarhus-2011/speaker/Simon+Brown&#034; target=&#034;_blank&#034;&gt;&lt;img src=&#034;http://www.codingthearchitecture.com/images/goto-2011-logo.png&#034; alt=&#034;GOTO Aarhus 2011&#034; border=&#034;0&#034; align=&#034;right&#034;&gt;&lt;/a&gt;
I&#039;m presenting a session at the &lt;a href=&#034;http://gotocon.com/aarhus-2011/speaker/Simon+Brown&#034; target=&#034;_blank&#034;&gt;GOTO conference&lt;/a&gt; in Aarhus, Denmark called &lt;a href=&#034;http://gotocon.com/aarhus-2011/presentation/The%20Frustrated%20Architect&#034; target=&#034;_blank&#034;&gt;The Frustrated Architect&lt;/a&gt; that will look at the role of the software architect in today&#039;s world of modern software development. I&#039;ll be focussing on perceptions of the role, how agile has positively and negatively affected software architecture, some of my pet peeves with people that call themselves &#034;software architects&#034; as well as my own frustrations with the role. To end on a high note, we&#039;ll finish off by looking at how you can undertake the role in a lightweight and effective way. There&#039;s some other stuff in there too but you&#039;ll have to wait for that. ;-)
&lt;/p&gt;

&lt;h3&gt;Software Architect 2011&lt;/h3&gt;
&lt;p&gt;
&lt;a href=&#034;http://www.software-architect.co.uk&#034; target=&#034;_blank&#034;&gt;&lt;img src=&#034;http://www.codingthearchitecture.com/images/sa2011-logo.jpg&#034; alt=&#034;Software Architect 2011&#034; border=&#034;0&#034; align=&#034;right&#034;&gt;&lt;/a&gt;
The week after I&#039;ll be in London for the &lt;a href=&#034;http://www.software-architect.co.uk&#034; target=&#034;_blank&#034;&gt;Software Architect conference&lt;/a&gt; where I&#039;ll be presenting two one-day workshops (&#034;Software architecture in a day&#034; and &#034;Just enough up front design&#034;) and three 90 minute breakout sessions (&#034;Effective sketches&#034;, &#034;Software Project SOS&#034; and &#034;How much is just enough?&#034;). All of these follow the same theme in looking at how software architecture fits into the new shiny agile world that we now live in.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&#034;http://www.codingthearchitecture.com/2011/08/27/using_evernote_for_training_courses.html&#034; target=&#034;_blank&#034;&gt;Evernote slide packs&lt;/a&gt; will be available for all of these sessions and I&#039;ll post the URLs (here and on &lt;a href=&#034;http://twitter.com/simonbrown&#034; target=&#034;_blank&#034;&gt;Twitter&lt;/a&gt;) 1-2 days before each session. Should be an excellent couple of weeks.
&lt;/p&gt;
        </description>
      
      
    
  </item>
  
  <item rdf:about="http://www.codingthearchitecture.com/2011/10/02/is_caching_an_architectural_smell.html">
    <title>Is caching an &#039;Architectural Smell&#039;?</title>
    <link>http://www.codingthearchitecture.com/2011/10/02/is_caching_an_architectural_smell.html</link>
    
      
        <description>
          &lt;p&gt;Kent Beck introduced the concept of &#034;Code Smells&#034; while working on Martin Fowler&#039;s famous &lt;a href=&#034;http://martinfowler.com/bliki/CodeSmell.html&#034;&gt;Refactoring&lt;/a&gt; book and I think that most people would agree with many of the stinks he identified. Many of us probably also use tools such as checkstyle to automatically identify such things as excessively long methods, dead code etc. To those not familiar with the concept please have a quick read from the link above but the basic premise is that
&lt;/p&gt;

&lt;blockquote&gt; A code smell is a surface indication that usually corresponds to a deeper problem in the system.&lt;/blockquote&gt;

&lt;p&gt;
Though we have to remember that just because some code has a &#039;smell&#039; doesn&#039;t mean it&#039;s bad, just that it&#039;s worth investigation and justification.
&lt;/p&gt;
&lt;p&gt;
We can take the concept to the next layer of abstraction and identify a number of &#034;Architectural Smells&#034;. A recent &lt;a href=&#034;http://www.enigmastation.com/2011/09/20/caches-and-what-they-mean-for-the-cloud&#034;&gt;blog article&lt;/a&gt; touched upon one of mine - the (over) use of Caches.
&lt;/p&gt;
&lt;p&gt;
I&#039;ve had terrible trouble with caches in the past. They can introduce bugs which are difficult to reproduce as they rely upon operation timing to be visible. They are similar to bugs you find in concurrent systems, where the issue only occurs every few thousand operations and aren&#039;t present when you attach a debugger or logging. Like all performance tuning a cache should be introduced AFTER you have determined that there is an problem. However they can be added so easily that developers throw them in whenever they can. Of course if your cache hit is low then your performance can actually degrade after adding a cache.
&lt;/p&gt;
&lt;p&gt;
Maybe you agree or not with the above (and I know I&#039;ll be flamed for saying it) but why do I consider caches to be an Architectural Smell?
&lt;/p&gt;
&lt;p&gt;
In a perfect system the business logic will always have access to the data it needs. The access (local or remote) will fit comfortably into the non-functional requirements and the data it uses will be from the primary source/system of record and not be stale.
&lt;/p&gt;
&lt;p&gt;
Back in the real world the system is not used in the way it was originally designed for, by many more users than anticipated and they can&#039;t wait for anything.
&lt;/p&gt;
&lt;p&gt;
The temptation is to introduce a cache at each layer there is an issue. They can be very easy to introduce (Spring will allow you to do this with a couple of lines of configuration for your data access components) and the user&#039;s perception of response can increase dramatically. Is it a free lunch? If you look closely at the options available with caching systems you&#039;ll see all sorts that you might associate with databases - which is not surprising as they are really a mini database. Have you considered data staleness, dirty reads, dirty writes, update schedules? Will all clients of the data see the same data at the same time? Can updates be missed? Does it listen for updates or poll? Is data coalesced, grouped or skipped?  Depending on the use of the data you might answer these questions and decide that caching is an effective and accurate solution - great! If it&#039;s not then the cache will introduce the kind of bugs I described.
&lt;/p&gt;
&lt;p&gt;
Either way it is still an Architectural Smell. Perhaps the best solution is to re-examine how data is distributed and accessed throughout the system. For example:
&lt;/p&gt;
&lt;p&gt;
&lt;ul&gt;
&lt;li&gt; Maybe a monolithic database sitting at the center of the system isn&#039;t the best solution and perhaps you need multiple database with different responsibilities? (Issues with monolithic, remote databases are a common reason for needing caches).
&lt;/li&gt;
&lt;li&gt;Maybe an asynchronous messaging system with multiple messages being processed would work better than a single request/response system?
&lt;/li&gt;
&lt;li&gt;Perhaps data associated with a request should be sent through the system with the request itself (enriched request).
&lt;/li&gt; 
&lt;li&gt;Should some data (e.g. static) be explicitly kept locally rather than requested and cached? 
&lt;/li&gt;
&lt;li&gt;Should some data have its encoding changed? Moving from/to xml is very time consuming.
&lt;/li&gt;
&lt;li&gt;Can data be request in larger or smaller blocks to reduce overheads? Calling a database in a loop is a common problem. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;
I appreciate that this will involve a lot more work than a few lines of configuration but may help architectures to evolve logically rather than become a series of hacks and bolt ons. Introducing a cache is an architectural decision and not a coding one.
&lt;/p&gt;
&lt;p&gt;
What are your favourite Architectural Smells we should all look for? I&#039;ve already mentioned another of mine - &#034;XML everywhere&#034;.
&lt;/p&gt;


        </description>
      
      
    
  </item>
  
  <item rdf:about="http://www.codingthearchitecture.com/2011/09/06/jitter.html">
    <title>Jitter</title>
    <link>http://www.codingthearchitecture.com/2011/09/06/jitter.html</link>
    
      
        <description>
          &lt;p&gt;
On CTA we often talk about non-functional requirements and how this can drive the architecture of a system. Most of these cover issues of desired response time and capacity (latency, throughput, storage etc) but I believe that Jitter is a metric which is either forgotten or unknown to some software engineers – even though it&#039;s essential for hardware engineers.
&lt;/p&gt;
&lt;p&gt;
The most basic definition would be “variation in response”. In other words, the response, transmission or latency in a system will not be a constant. In many systems this variation goes unnoticed as it is small compared to the response itself. However I believe that as the systems we deal with become more performant and demanding, software engineers will need to understand, measure and tune this.
&lt;/p&gt;
&lt;p&gt;
A quick web-search of jitter shows the term being used to cover performance degradations due to activities such as garbage collection or unexpected user actions. This seems to greatly annoy telecommunications and hardware engineers who would argue that these are predictable, system and user events which could just be turned off – although ignoring your users and asking for a machine with infinite memory may get you fired. They would argue that true Jitter is an unpredictable variation in response whose occurrence frequency follows a normal distribution. Like most effects that are normally distributed it is caused by cumulative random events, most of which are due to the switching actions. Personally, I think you should measure whatever makes sense in your system.
&lt;/p&gt;
&lt;p&gt;
Jitter means that hard limits for latency can be statistically likely but not guaranteed. Specifications such as:
&lt;/p&gt;
&lt;blockquote&gt;
“The system should respond to action X within 200ms”.
&lt;/blockquote&gt;
&lt;p&gt;
Should be challenged and replaced with statements like:
&lt;/p&gt;
&lt;blockquote&gt;
“The systems should response to action X within 200ms for 95% of requests”
&lt;/blockquote&gt;
&lt;p&gt;
Of course we are making the implicit assumption that this is normally distributed and the system WILL, eventually, respond. You might want to explicitly state that all actions will be executed but stating a hard limit for all responses means that if you measure for long enough, you&#039;ll break your specification.
&lt;/p&gt;
&lt;p&gt;
Jitter can be quite obvious on messaging based systems that contain many hops. This will also tend to have a nice, Gaussian distribution due to the cumulative random delays.
&lt;/p&gt;
&lt;p&gt;
The best way to measure Jitter is to set up a standard test where you can sequentially fire a large number of requests into your system and measure the response time. However, rather than simply add these up and find an average we need to count how many responses are in a set of timing windows e.g. how many responses fall between 5ms-10ms, 10ms-15ms, 15ms-20ms etc. If we plot the number in each section we should see our expected Normal distribution.
&lt;/p&gt;

&lt;p&gt;
Reducing Jitter is subtly different from reducing latency itself. You are trying to reduce the variation in the response times or &#039;squeeze&#039; the response profile.
&lt;/p&gt;
&lt;p&gt;
Often when you reduce latency you will reduce the Jitter proportionally however this is not always the case. For example, network hops are a common cause of latency but each hop will increase the Jitter as well – you are accumulating more random delays with each hop. If you change the physical architecture of your system to have more but quicker hops you will almost certainly increase the jitter (remember this is the variation in response and not the actual response) even if the average latency is lower. It IS important to measure it and monitor as the system evolves.
&lt;/p&gt;
&lt;p&gt;
Simon is covering a number of related issues in his Skills Matter tutorial
&lt;a href=&#034;http://www.codingthearchitecture.com/2011/08/25/load_testing_for_developers.html&#034;&gt;Load Testing for Developers&lt;/a&gt;.

&lt;/p&gt;
        </description>
      
      
    
  </item>
  

</rdf:RDF>

