<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Pragmatic Dictator &#187; design</title>
	<atom:link href="http://www.dancres.org/blitzblog/tag/design/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dancres.org/blitzblog</link>
	<description></description>
	<lastBuildDate>Sat, 31 Dec 2011 19:08:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Warp</title>
		<link>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2011%2F03%2F12%2Fwarp%2F&#038;seed_title=Warp</link>
		<comments>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2011%2F03%2F12%2Fwarp%2F&#038;seed_title=Warp#comments</comments>
		<pubDate>Sat, 12 Mar 2011 09:37:06 +0000</pubDate>
		<dc:creator>Dan Creswell</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Systems]]></category>

		<guid isPermaLink="false">http://www.dancres.org/blitzblog/?p=373</guid>
		<description><![CDATA[A frequent problem I observe when reviewing system designs is they are built atop one or more libraries, frameworks or products that are poorly suited to the intended task. Fitting the design to these underpinnings warps it in undesirable ways incurring all sorts of costs: It takes an increasing number of staff just to deploy [...]]]></description>
			<content:encoded><![CDATA[<p>A frequent problem I observe when reviewing system designs is they are built atop one or more libraries, frameworks or products that are poorly suited to the intended task. Fitting the design to these underpinnings warps it in undesirable ways incurring all sorts of costs:</p>
<ul>
<li>It takes an increasing number of staff just to deploy and run the system.</li>
<li>Customers face an increasingly bad experience in terms of interaction, performance and stability.</li>
<li>One spends more time refactoring than developing new features &#8211; although in many cases developers will simply not bother with this effort which accelerates the drop in quality for customers.</li>
<li>The level of coupling increases impacting the integrity of the design and making future change more difficult.</li>
</ul>
<p>I call this the &#8220;design-by-product anti-pattern&#8221;. There are a couple of things that cause it to manifest:</p>
<ol>
<li>Absence of a real design prior to product/framework/library selection &#8211; most of those given the remit for design cannot construct proper abstractions that are adequately divorced from implementation. That is they do not understand the core entities and operations that exist within the domain they are building a system for. Thus when products/libraries/frameworks are selected there is limited structure  to assist in evaluating their appropriateness.</li>
<li>These products are used because they are on the list of &#8220;company approved technologies&#8221;. The justification for the existence of such a list is that it &#8220;reduces cost&#8221; which it might well do if all one accounts for is licenses and product support. Unfortunately, the cost equation is not nearly so simple (see above re: costs).</li>
<li>A related problem to &#8220;company approved technologies&#8221; is hot or favourite technologies preferred by the development team regardless of their appropriateness for use in any particular design situation.</li>
</ol>
<p>Any product/library/framework is created by an individual who has their own view of how their customers design their systems and builds APIs accordingly. In the worst cases these individuals design APIs in total isolation, focused on making them theoretically perfect (for some definition of perfect). If we as customers create designs that do not align well with the views of these individuals, the result will be costly as we force the two designs together. The cost is magnified for each additional conflicting product/library/framework design.</p>
<p><a href="http://www.dancres.org/blitzblog/2011/02/15/foundation/">Loose coupling as the result of proper definition of roles and responsibilities</a> is the only tool we have to allow for future design evolution. Poor selection of products/libraries/frameworks erodes this property and should be avoided otherwise <a href="http://en.wikipedia.org/wiki/Death_march_(software_development)">death-march</a> awaits.</p>
]]></content:encoded>
			<wfw:commentRss>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2011%2F03%2F12%2Fwarp%2F&#038;seed_title=Warp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Foundation</title>
		<link>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2011%2F02%2F15%2Ffoundation%2F&#038;seed_title=Foundation</link>
		<comments>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2011%2F02%2F15%2Ffoundation%2F&#038;seed_title=Foundation#comments</comments>
		<pubDate>Tue, 15 Feb 2011 12:26:41 +0000</pubDate>
		<dc:creator>Dan Creswell</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[design]]></category>

		<guid isPermaLink="false">http://www.dancres.org/blitzblog/?p=365</guid>
		<description><![CDATA[There are some design basics that development teams routinely fail to account for: Roles Responsibilities Coupling Role The basic justification for the existence of some api, interface or class. A summary of what it&#8217;s for. Just as importantly, the role defines what a particular entity is not for. Responsibility The things that some entity can [...]]]></description>
			<content:encoded><![CDATA[<p>There are some design basics that development teams routinely fail to account for:</p>
<ol>
<li>Roles</li>
<li>Responsibilities</li>
<li>Coupling</li>
</ol>
<h2>Role</h2>
<p>The basic justification for the existence of some api, interface or class. A summary of what it&#8217;s for. Just as importantly, the role defines what a particular entity is <em>not</em> for.</p>
<h2>Responsibility</h2>
<p>The things that some entity can do/knows in support of a role.</p>
<h2>Coupling</h2>
<p>An expression of the dependencies between roles. This property tells us a lot about the state of our design.</p>
<p>Two things that are heavily dependent upon each other might well be serving individual parts of a single role and thus should be consolidated. If everything ends up in a single role, it can suggest that the current approach to classifying behaviours is missing some factors.</p>
<p>Coupling can be temporal such that, for example, one entity cannot dispatch its responsibilities without the presence of another at the same time. This might indicate the need for some work on handling availability issues in a distributed system.</p>
<p>Limited coupling is a sign of cohesion, clarity in roles and responsibilities which can be indicative of a clean, maintainable design.</p>
<h2>Platform Neutral</h2>
<p>These basics apply regardless of the platform one chooses to develop upon. Roles, responsibilities and coupling apply just as well to service architectures, databases (tables and associated triggers and packages) and applications in Java, Scala, Clojure, C# or any other programming environment.</p>
<h2>Warning Signs</h2>
<p>It is very common for individual developers or development teams to allocate additional functions to existing elements of a design unthinkingly, thus eroding its quality. This manifests in many ways including:</p>
<ol>
<li>Some element of the system becomes the source of all information in respect of e.g. configuration or the entirety of customer data.</li>
<li>A single cache contains all data regardless of its nature (e.g. customer, account details, market price).</li>
<li>Some element of the system must always be running otherwise nothing else works.</li>
<li>Some element of the system has functions that span many different bits of data (e.g. customer, account, market price). </li>
</ol>
<h2>Rule of Thumb</h2>
<p>Any entity within a system should do only one thing and it should do it well (often credited as <a href="http://en.wikipedia.org/wiki/Unix_philosophy">Unix Philosophy</a>). This applies to everything from applications and products to services and individual classes.</p>
]]></content:encoded>
			<wfw:commentRss>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2011%2F02%2F15%2Ffoundation%2F&#038;seed_title=Foundation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unaware</title>
		<link>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2011%2F01%2F03%2Funaware%2F&#038;seed_title=Unaware</link>
		<comments>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2011%2F01%2F03%2Funaware%2F&#038;seed_title=Unaware#comments</comments>
		<pubDate>Mon, 03 Jan 2011 14:44:44 +0000</pubDate>
		<dc:creator>Dan Creswell</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.dancres.org/blitzblog/?p=358</guid>
		<description><![CDATA[Design is not rules, it&#8217;s not patterns, it&#8217;s not technological choices or indeed code. Design is tradeoffs, driven by data where possible and gut instinct. It&#8217;s about identifying the core challenges of a problem domain (which might ultimately be one or many systems) and addressing them through creation of appropriate abstractions. These abstractions embody: Functions [...]]]></description>
			<content:encoded><![CDATA[<p>Design is not rules, it&#8217;s not patterns, it&#8217;s not technological choices or indeed code. Design is tradeoffs, driven by data where possible and gut instinct. It&#8217;s about identifying the core challenges of a problem domain (which might ultimately be one or many systems) and addressing them through creation of appropriate abstractions. These abstractions embody:</p>
<ul>
<li>Functions to be performed</li>
<li>Data to be discovered, consumed and produced</li>
<li>Non-functionals (e.g. SLAs)</li>
</ul>
<p>The abstractions are then rendered into the real-world using appropriate hardware, technologies, patterns and languages. A good design:</p>
<ul>
<li>Exhibits few exception cases</li>
<li>Has logic and/or data located neatly and predictably</li>
<li>Applies a small set of core constructs repeatedly</li>
<li>Addresses operational needs</li>
<li>Considers cost versus value delivered</li>
<li>Is as simple as possible</li>
<li>Has the minimum of implementation assumption</li>
</ul>
<p>There are several key failing points in the design process:</p>
<ul>
<li>No adjustment in the face of implementation feedback &#8211; No design is complete or perfect. There will always be missed details leading to brittle code, complex corner cases or convoluted solutions. It is critical that we monitor our progress and adapt the design accordingly.</li>
<li>No up front design &#8211; Design is the skeleton upon which we hang technology choices and code structure. In it&#8217;s absence we rapidly descend into a world of difficult to navigate code and costly constraints set by uninformed product choices.</li>
<li>No care in following the design &#8211; A key element of design is to place the right things in the right places. Failing to do this at code time increases coupling, makes maintenance difficult and can impact both performance and scalability. Similar effects occur as the result of poor technology selection.</li>
</ul>
<p>Design and implementation go hand in hand yet many of us lack awareness of where the boundary between these two elements lies. We don&#8217;t understand how these elements interact with each other or appreciate the impact of decisions we make in respect of one element on the other.</p>
<p> </p>
]]></content:encoded>
			<wfw:commentRss>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2011%2F01%2F03%2Funaware%2F&#038;seed_title=Unaware/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Remoting</title>
		<link>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2010%2F11%2F09%2Fremoting%2F&#038;seed_title=Remoting</link>
		<comments>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2010%2F11%2F09%2Fremoting%2F&#038;seed_title=Remoting#comments</comments>
		<pubDate>Mon, 08 Nov 2010 22:04:59 +0000</pubDate>
		<dc:creator>Dan Creswell</dc:creator>
				<category><![CDATA[Distributed Systems]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[Engineering]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.dancres.org/blitzblog/?p=349</guid>
		<description><![CDATA[The difficulty of constructing remote services is often not in writing them but testing and debugging whilst ensuring that some of the nastier types of failure (e.g. packet loss or machine failure) are adequately handled. The norm for these kinds of testing scenarios is to have a full, mocked-up test environment with a bunch of [...]]]></description>
			<content:encoded><![CDATA[<p>The difficulty of constructing remote services is often not in writing them but testing and debugging whilst ensuring that some of the nastier types of failure (e.g. packet loss or machine failure) are adequately handled.</p>
<p>The norm for these kinds of testing scenarios is to have a full, mocked-up test environment with a bunch of servers. Such a setup needs sysadmin and repeated deployment steps which for most organisations are slow, ponderous things. Incremental test cycles in such an environment become costly which leads to onerous, last-minute testing and the late discovery of difficult to fix bugs that introduce endless release delays.</p>
<p>Over the years I&#8217;ve developed an approach for pushing all these testing scenarios back toward the unit level so they can be run regularly per build as they take mere minutes to complete. The core philosophy is to design the software in such a fashion that it runs on a single machine using all the network protocols it would use when deployed across many servers (ah, the power of localhost/127.0.0.1).</p>
<h2>Preliminaries</h2>
<p>Putting this philosophy into practice requires that we adopt certain design practices:</p>
<ol>
<li><strong>Clean separation between the transport/remote layers and the core service logic</strong>. This makes it easy to develop tests that verify the core logic without any remoteness concerns and a second set of tests that perform the more heavyweight remote tests. The benefit is that we can more easily isolate issues when they occur. For example, if the core logic tests pass but the remote tests fail we can be pretty confident the issue is in the remote layers.</li>
<li><strong>Clean separation of configuration source from core service and transport/remote layer</strong>. This ensures all our software requests configuration using a consistent API which could then be implemented via LDAP, flat-files, in-memory etc. Such a setup allows us to easily build up configuration inside of our tests and make it available to the services we&#8217;re building.</li>
<li><strong>Runtime discovery of endpoints</strong>. To allow us to dynamically allocate port/ip combinations and make them available to whichever services require them. One can achieve this via the abstracted configuration source but it&#8217;s often cleaner to have a dynamic lookup/discovery mechanism.</li>
<li><strong>Configurable log file locations</strong>. So that we can avoid path clashes between services.</li>
</ol>
<p>Once these things are in place, unit tests can construct transports, endpoints and configuration dynamically at run time in whatever combination is required for a test. It is thus possible to instantiate a collection of services inside of a single process and have them talk to each other as if they were all running remotely. This is somewhat at odds with other design practices where we typically look to remove remoteness when running services locally for purposes of performance.</p>
<h2>Failure Scenarios</h2>
<p>By virtue of the unit tests having control of all the services and their transports/endpoints it becomes possible to stop or disable services thus simulating machine failures but it&#8217;s also possible to extend the approach to cover problems such as packet loss, corruption or increased latency.</p>
<p>These more advanced scenarios are more readily handled with server construction toolkits such as <a href="http://jboss.org/netty">Netty</a> which allows tight control of packet processing and protocol. Using Netty, one can build up the protocol stack per service exactly as required and introduce <a href="http://docs.jboss.org/netty/3.2/api/org/jboss/netty/channel/ChannelPipeline.html">Decoder/Encoder pairs, Handlers</a> or wrappers around core service implementation that can randomly (and silently without severing the connection) lose messages or packets, break connections etc.</p>
<h2>Example</h2>
<p>I&#8217;ve been working on a <a href="http://en.wikipedia.org/wiki/Paxos_algorithm">Paxos</a> implementation which breaks down into:</p>
<ul>
<li>State machines &#8211; Leader, Acceptor and Learner and associated elements such as leader election and failure detection.</li>
<li>Persistent storage layer &#8211; as various state must be remembered across Paxos instances.</li>
<li>Remote communications layer &#8211; including cluster membership and remote communications.</li>
</ul>
<p>The state machines accept messages, make appropriate state transitions and produce messages. These are then passed around between participants via the remote communications layer. The persistent storage layer allows for specification of file locations at construction time which allows test code to allocate separate directories on a single-disk to hold respective state.</p>
<p>The remote layer is built such that none of the members need static/well-known ports to operate off. There is one exception which is a fixed multicast address that is used to do initial cluster discovery. It is implemented using Netty and consists of some codecs for the various messages and a handler that passes messages to and from the state machines.</p>
<p>There are several different implementations of the handler. There is the normal version that dispatches messages reliably and several others that randomly drop messages or lose them at critical moments in an instance of Paxos. The exact behaviour of these handlers is configured at runtime which allows unit tests to construct random or specific failure scenarios and ensure the state machines behave appropriately.</p>
<p>All these elements together allow unit tests to construct, in a single-process, fully remote services that communicate via TCP and UDP/Multicast as if they were running on a network and simulate failure scenarios. Alongside these tests are a collection to verify correct behaviour of the state machines and a set that validates their failure handling via timeouts, leader election behaviours etc. The entire suite including the failure scenarios runs in less than five minutes. That leaves one long-running test that exercises a collection of state machines concurrently for long periods, a necessary soak test run separately.</p>
<h2>Alternative Implementations</h2>
<p>A similar testing approach is possible with the likes of <a href="http://eclipse.org/jetty/">Jetty 7</a> as the lower IO layers are open enough to be customised to support these test scenarios. This can be a better option than Netty if services are Servlet based.</p>
<p>More challenging are the RPC-based services as these tend to run atop closed stacks that limit the amount of customisation possible and often have horrid configuration methods. However <a href="http://thrift.apache.org/">Thrift</a>, by virtue of it&#8217;s <a href="http://jnb.ociweb.com/jnb/jnbJun2009.html">Processor/Protocol abstraction</a> can be readily modified to support such testing.</p>
<p><em>Sidenotes:</em></p>
<p><em>
<ol>
<li>Applications that use databases for state storage can make this sort of testing tricky but it&#8217;s not impossible. One solution to the problem is to make use of virtual machines where one instantiates an image containing a pre-defined database and shuts it down afterwards alongside some scripts to prepare and tear down data within the database</li>
<li>I&#8217;ve recently applied this approach to several other systems including a trade management system written in Clojure, a trading platform written in Scala and a gossip-based directory service also written in Scala</li>
</ol>
<p> </em></p>
]]></content:encoded>
			<wfw:commentRss>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2010%2F11%2F09%2Fremoting%2F&#038;seed_title=Remoting/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Concurrency</title>
		<link>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2009%2F10%2F10%2Fconcurrency%2F&#038;seed_title=Concurrency</link>
		<comments>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2009%2F10%2F10%2Fconcurrency%2F&#038;seed_title=Concurrency#comments</comments>
		<pubDate>Sat, 10 Oct 2009 10:03:11 +0000</pubDate>
		<dc:creator>Dan Creswell</dc:creator>
				<category><![CDATA[Systems]]></category>
		<category><![CDATA[concurrency]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[fallacies]]></category>
		<category><![CDATA[network]]></category>

		<guid isPermaLink="false">http://www.dancres.org/blitzblog/?p=321</guid>
		<description><![CDATA[Building a concurrent system ultimately boils down to: Partitioning the data into chunks that can be separately acted upon Applying computations against those chunks to produce results The smaller or more fine-grained the chunks, the more concurrent activity will be possible. In theory the closer one can get to one chunk per core the better [...]]]></description>
			<content:encoded><![CDATA[<p>Building a concurrent system ultimately boils down to:</p>
<ol>
<li>Partitioning the data into chunks that can be separately acted upon</li>
<li>Applying computations against those chunks to produce results</li>
</ol>
<p>The smaller or more fine-grained the chunks, the more concurrent activity will be possible. In theory the closer one can get to one chunk per core the better but in reality it&#8217;s rare (a function of throughput and size of calculation) one needs to do computation across all chunks simultaneously such that a core can be assigned many chunks any one of which it will dispatch operations against at a moment in time.</p>
<p>There are many solutions for building concurrent systems but those that provide some abstraction which makes request routing easy to implement are likely to work best as it makes re-balancing of computation easier. One shouldn&#8217;t immediately assume that message passing is the answer as there are many ways to achieve routing (e.g. via DNS).</p>
<p>Any solution represents a transparency tradeoff. If for example routing is hidden inside of the solution, this can make it easy to get something up and running but we might find it difficult to transition from one box to a multi-box deployment. There are many tradeoffs to be made and for any case where control is given to the developer/architect it&#8217;s likely there will be libraries/frameworks to ease the initial implementation burden, programming languages alone will not be enough (<a href="http://www.scala-lang.org/">Scala</a> makes such a differentiation quite difficult given it&#8217;s language extension capabilities).</p>
<p>One aspect discussed less often is the difference between processing on a set of cores all in one box versus processing across a set of cores on many boxes. The latter brings the following challenges all related to the <a href="http://blogs.sun.com/jag/resource/Fallacies.html">fallacies</a> of distributed computing:</p>
<ol>
<li>Cores are more likely to become inaccessible</li>
<li>The latency of an operation can become substantially more variable</li>
<li>Any centralised functions (e.g. job scheduler or watchdogs) are more vulnerable to becoming isolated from the resources they manage such that processing ceases.</li>
</ol>
<p>The latency factor is particularly challenging as few concurrent approaches make it sufficiently explicit that developers/architects are encouraged to be appropriately mindful.</p>
<p>Thus far, as has been the case throughout our history, the solutions are polarising into those that work within the confines of a single box and those that work across multiple boxes with the emphasis on the former. I fully expect developers and architects to fall into the old trap of using a single-box solution to solve a multi-box problem with all the associated issues. Of the solutions that work across multiple boxes, very few account fully for the impact of the network.</p>
]]></content:encoded>
			<wfw:commentRss>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2009%2F10%2F10%2Fconcurrency%2F&#038;seed_title=Concurrency/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exposure</title>
		<link>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2008%2F06%2F18%2Fexposure%2F&#038;seed_title=Exposure</link>
		<comments>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2008%2F06%2F18%2Fexposure%2F&#038;seed_title=Exposure#comments</comments>
		<pubDate>Wed, 18 Jun 2008 19:12:56 +0000</pubDate>
		<dc:creator>Dan Creswell</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://www.dancres.org/blitzblog/2008/06/18/exposure/</guid>
		<description><![CDATA[The act of design includes: Consideration of many possible technology options Examination and identification of constraints Thought about the pros and cons of using various patterns and styles Comparing various splits of role and responsibility Looking at various tradeoffs of complexity versus function Formulation of opinion on possible future directions of system growth A large [...]]]></description>
			<content:encoded><![CDATA[<p>The act of design includes:</p>
<ul>
<li>Consideration of many possible technology options</li>
<li>Examination and identification of constraints</li>
<li>Thought about the pros and cons of using various patterns and styles</li>
<li>Comparing various splits of role and responsibility</li>
<li>Looking at various tradeoffs of complexity versus function</li>
<li>Formulation of opinion on possible future directions of system growth</li>
</ul>
<p>A large proportion of this information is lost when the design document is written, because the focus is typically on providing a (notionally) definitive view of how a system should be structured which might be in the form of a bunch of UML diagrams or merely a collection of Visio-type diagrams and explanation of what each of the boxes in the diagrams does. At the code-level there is almost no chance that any of this information will have been retained. Yet this information is of high value since it:</p>
<ul>
<li>is the explanation as to why a design is the way it is</li>
<li>provides reviewers with a clearer view of what was and was not considered</li>
<li>forms the basis for assessment of the maturity of a designer and can be used for coaching/mentoring</li>
<li>can provide insight for those with less experience</li>
<li>contains assumptions which if breached by changes in circumstance would dictate a re-design</li>
<li>dictates to a large extent how suitable for purpose a design might be</li>
</ul>
<p>Thus I believe It&#8217;s important to expose elements of the act of design via documentation alongside the design itself, conversations during the design work etc.</p>
]]></content:encoded>
			<wfw:commentRss>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2008%2F06%2F18%2Fexposure%2F&#038;seed_title=Exposure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On System Design</title>
		<link>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2008%2F05%2F05%2Fon-system-design%2F&#038;seed_title=On+System+Design</link>
		<comments>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2008%2F05%2F05%2Fon-system-design%2F&#038;seed_title=On+System+Design#comments</comments>
		<pubDate>Mon, 05 May 2008 09:08:18 +0000</pubDate>
		<dc:creator>Dan Creswell</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[design]]></category>

		<guid isPermaLink="false">http://www.dancres.org/blitzblog/2008/05/05/on-system-design/</guid>
		<description><![CDATA[Jim Waldo writes: My own conclusion is that system design is really a matter of technique, a way of thinking rather than a subject that can be taught in a particular course. It might be possible to build a program that teaches system design by putting students through a series of courses that hone their [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.eecs.harvard.edu/~waldo/" title="Jim Waldo">Jim Waldo</a> <a href="http://research.sun.com/techrep/Perspectives/PS-2006-6.pdf" title="On System Design">writes</a>:</p>
<blockquote>
<p>My own conclusion is that system design is really a matter of technique, a way of thinking rather than a subject that can be taught in a particular course. It might be possible to build a program that teaches system design by putting students through a series of courses that hone their system design skills as they move through the subject matter of the courses. Such a series of courses would, in effect, be a formalized version of the apprenticeship that is now the way people acquire their system design technique&#8230;..</p>
<p>&#8230;..Even worse than not being visible to the customer, work done on designing the system is not visible to the management of the company that is developing the system. Even though managers will pay lip service to the teaching of <a href="http://www.pearsonhighered.com/academic/product/0,,0201835959,00%2Ben-USS_01DBC.html" title="The Mythical Man Month">The Mythical Man Month</a>, there is still the worry that engineers who aren’t producing code are not doing anything useful. While there are few companies that explicitly measure productivity in lines-of-code per week, there is still pressure to produce something that can be seen. The notion that design can take weeks or months and that during that time little or no code will be written is hard to sell to managers. Harder still is selling the notion that any code that does get written will be thrown away, which often appears to be regression rather than progress.</p>
</blockquote>
<p>In such an environment lip service often extends to technical strategy as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2008%2F05%2F05%2Fon-system-design%2F&#038;seed_title=On+System+Design/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Development and Ops</title>
		<link>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2008%2F04%2F02%2Fdevelopment-and-ops%2F&#038;seed_title=Development+and+Ops</link>
		<comments>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2008%2F04%2F02%2Fdevelopment-and-ops%2F&#038;seed_title=Development+and+Ops#comments</comments>
		<pubDate>Wed, 02 Apr 2008 16:14:43 +0000</pubDate>
		<dc:creator>Dan Creswell</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://www.dancres.org/blitzblog/2008/04/02/development-and-ops/</guid>
		<description><![CDATA[From On Designing and Deploying Internet-Scale Services (James Hamilton &#8211; Windows Live Services Platform): We have long believed that 80% of operations issues originate in design and development, so this section on overall service design is the largest and most important. When systems fail, there is a natural tendency to look first to operations since [...]]]></description>
			<content:encoded><![CDATA[<p>From <a href="http://research.microsoft.com/~jamesrh/TalksAndPapers/JamesRH_Lisa.pdf">On Designing and Deploying Internet-Scale Services</a> (<a href="http://research.microsoft.com/~jamesrh/">James Hamilton</a> &#8211; Windows Live Services Platform):</p>
<blockquote>
<p>We have long believed that 80% of operations issues originate in design and development, so this section on overall service design is the largest and most important. When systems fail, there is a natural tendency to look first to operations since that is where the problem actually took place. Most operations issues, however, either have their genesis in design and development or are best solved there. Throughout the sections that follow, a consensus emerges that firm separation of development, test, and operations isn’t the most effective approach in the services world. The trend we’ve seen when looking across many services is that low-cost administration correlates highly with how closely the development, test, and operations teams work together.</p>
</blockquote>
<p>Yep, I&#8217;m a firm believer too&#8230;.</p>
]]></content:encoded>
			<wfw:commentRss>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2008%2F04%2F02%2Fdevelopment-and-ops%2F&#038;seed_title=Development+and+Ops/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

