<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://devlicio.us/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Jak Charlton - Insane World : Rants</title><link>http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx</link><description>Tags: Rants</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Avoiding Prescriptive Requirements</title><link>http://devlicio.us/blogs/casey/archive/2012/02/09/avoiding-prescriptive-requirements.aspx</link><pubDate>Thu, 09 Feb 2012 03:50:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:69485</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=69485</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=69485</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2012/02/09/avoiding-prescriptive-requirements.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Core Requirements&lt;/h3&gt;
&lt;p class="MsoNormal"&gt;&lt;strong&gt;Requirements &lt;/strong&gt;should be given as
the &lt;strong&gt;Core Requirement&lt;/strong&gt;, and avoid the common pitfall of providing &lt;strong&gt;Prescriptive
Requirements&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;As an example, a core requirement in an insurance system may be:&lt;/p&gt;
&lt;p style="padding-left:30px;" class="MsoNormal"&gt;&lt;strong&gt;&lt;span&gt;As a user of the Broker system, I want to create a Settlement Batch of Eligible Documents across Insurance Policies&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span&gt;This is eminently testable, is
clear and unambiguous, and has real business value, and it meets the general &lt;strong&gt;INVEST&lt;/strong&gt;
principle of good user stories (which is also a good maxim for any form of
requirements):&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraph"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It is &lt;strong&gt;Independent&lt;/strong&gt;
of other stories&lt;/li&gt;
&lt;li&gt;It is easily &lt;strong&gt;Negotiated&lt;/strong&gt;
as to priority and value&lt;/li&gt;
&lt;li&gt;It has real business
&lt;strong&gt;Value&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;It is small enough
to easily &lt;strong&gt;Estimate&lt;/strong&gt; with some degree of certainty&lt;/li&gt;
&lt;li&gt;It is of an
appropriate &lt;strong&gt;Size&lt;/strong&gt; for easy estimation, planning and prioritisation&lt;/li&gt;
&lt;li&gt;It is able to be &lt;strong&gt;Tested&lt;/strong&gt;
both manually and in an automated fashion with clear and unambiguous pass or
fail criteria, you can either do it or not&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;The stated requirement is not
prescriptive, it does not specify how the user triggers this action, what data
they need to provide, how they select the documents, nor does it specify what a &amp;quot;user of the Broker System&amp;quot; is within this context, nor what a Settlement Batch is, nor what an Eligible Document is. This
means the requirement can be documented very early on, with little analysis
work needed, allowing very quick comparison with other requirements, and very
quick verification from the business as to the validity of the story.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span&gt;Later this placeholder can be
expanded in discussions between the technical teams and the business to include
the actual definitions and scenarios that define its acceptance criteria:&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraph"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The user must
have the &amp;ldquo;Batch Creation&amp;rdquo; permission&lt;/li&gt;
&lt;li&gt;Eligible Documents are those which are awaiting Settlement&lt;/li&gt;
&lt;li&gt;A Settlement Batch is a group of Documents that will be dealt with together by the Claims Settlement system, so as to save managing on an individual policy level&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span&gt;This would lead to a requirement
with maybe a dozen test scenarios giving all the variations of user and
statuses that would allow or not allow the story to pass the test. All of these
stories and scenarios are now easily tested with automated and repeatable
testing.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span&gt;At this point it would probably
be obvious where within the UI this functionality should surface, and the
design of the UI interaction can be worked out. This UI work is actually a very
specific development skill within its own right - there is significant complexity in
designing UI interactions that mirror both the technical system and the user&amp;rsquo;s
mental model.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span&gt;Through all of these steps, the
original core requirement has not been changed, though its implementation and
business logic may have evolved, changed and adapted to line up with other
functionality.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span&gt;Good requirements are merely a
placeholder for a later conversation. Their level of completeness or accuracy
only dictates your certainty in implementing them accurately and efficiently,
but does not preclude moving forwards, and does not hold development up waiting
on &amp;ldquo;complete requirements&amp;rdquo;.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span&gt;As granularity increases, so
does complexity required to understand, verify and implement, but oddly so does
instability. By starting with core stories, you maintain a fairly stable set of
requirements, and only deal with complexity when you need to, and suffer the
instability only on individual scenarios.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;Which brings us neatly to
development&lt;/span&gt;&lt;/h3&gt;
&lt;p class="MsoNormal"&gt;&lt;span&gt;It is fairly well established
now that development must be iterative within short cycles to increase its
chance of being successful. Early feedback and revision saves massive amounts
of time and effort correcting incorrect assumptions and poor translation.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span&gt;The sooner a story enters
development, the sooner a basic version of it can be demonstrated to business
users, to verify against their assumptions, the faster it can be revised and
the more accurately it will reflect the actual requirements. In addition it
will expose underlying technical constraints and limitations earlier on.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=69485" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category><category domain="http://devlicio.us/blogs/casey/archive/tags/development/default.aspx">development</category><category domain="http://devlicio.us/blogs/casey/archive/tags/requirements/default.aspx">requirements</category></item><item><title>What is Domain Driven Design?</title><link>http://devlicio.us/blogs/casey/archive/2011/05/16/what-is-domain-driven-design.aspx</link><pubDate>Mon, 16 May 2011 02:15:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:67301</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=67301</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=67301</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2011/05/16/what-is-domain-driven-design.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;&amp;quot;... the key to expert performance in many fields
is domain knowledge rather than intelligence.&amp;quot; &lt;br /&gt;
&lt;/span&gt;&lt;span&gt;&lt;i&gt;Don Reinertsen&lt;/i&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Domain Driven Design
is a software development methodology, intended to achieve a software system
closely modelled on and aligned with real business processes.&lt;/p&gt;
&lt;p&gt;Traditionally
development tends to be a technically led process, where requirements are
passed from the business to the development teams, and then the development
teams go off and produce their best guesstimate at what the requirements said.&lt;/p&gt;
&lt;p&gt;In a waterfall
approach this leads to large requirements documents that are diligently
collated, analysed, reviewed and approved. These documents are then given to
development teams to turn into working software.&lt;/p&gt;
&lt;p&gt;Agile approaches can
also accept the requirements documents that waterfall tends to produce, but for
them to actually progress forwards they must be broken to small tasks and
stories which can then be queued ready for development.&lt;/p&gt;
&lt;p&gt;Domain Driven Design
to a large degree steps back from these two distinct ends of the spectrum, and
looks at how the requirements are gathered in the first place - if you like, it
bridges the gap between doing everything up front and everything at the last
minute.&lt;/p&gt;
&lt;p&gt;DDD understands that
requirements are never &amp;#39;done&amp;#39;, but exist as a living document. More
importantly, the living document in question is actually the software itself -
all other documents are an artefact and reflection of the code.&lt;/p&gt;
&lt;p&gt;As the software
system develops and grows, deeper understanding of the problem grows too - DDD
is all about the discovery of the solution through deeper understanding of the
problem.&lt;/p&gt;
&lt;p&gt;Where DDD really
differs though is that it sees the software system as a reflection of the
business process, an enabler rather than the driver. DDD is deeply concerned
about the business processes, business terminology and practices. Technical
concerns are largely secondary and a means to an end.&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://thinkddd.com/blog/2009/02/09/the-ubiquitous-language/"&gt;Ubiquitous Language&lt;/a&gt; is at the centre of DDD - this is a shared and growing language. A
negotiated language derived from the business terminology and enriched by the development teams. If a business person doesn&amp;#39;t understand a term in the UL,
then the chances are the UL needs an evolution. If a technical person doesn&amp;#39;t
understand a term in the UL then the chances are they need a conversation with
a Domain Expert.&lt;/p&gt;
&lt;p&gt;The Domain Experts
are the second essential component of DDD - people who deeply understand the
business domain, and the business itself. These people are integral to the
development process. They may not be required &amp;quot;full time&amp;quot; like the
traditional Product Owners of some Agile methodologies, but they must be
accessible continually, and be prepared to invest time in the process. Domain
Experts are not to be considered outsiders, but as the core of the DDD process
- they are as much a part of the development team as any developer or tester.&lt;/p&gt;
&lt;p&gt;DDD doesn&amp;#39;t begin
and end - it is a constant process of re-evaluation, refactoring, remodelling
and redesign - every conversation should bring you to a closer understanding of
the problem. At no point is DDD &amp;#39;done&amp;#39; - it is always there; the Ubiquitous Language
grows and develops, the Domain Models change as understanding changes, code is
restructured and refactored to better represent that understanding.&lt;/p&gt;
&lt;p&gt;Artefacts will come
and go, but only one really matters - the code base. It is the only expression
of the solution that is free of abstraction. While documents may try to explain
or describe the system, only the code does so without losing information. This
means that in DDD the code must remain of high quality, be clear and
expressive, be free of technical abbreviations or jargon, and as far as
possible should make at least some sense to a Domain Expert when explained to
them.&lt;/p&gt;
&lt;p&gt;Clever code doesn&amp;#39;t
work in DDD, nor do magical processes or &amp;quot;you don&amp;#39;t need to know&amp;quot;
components. Domain Experts shouldn&amp;#39;t need to become developers to understand
what the key parts of the software system is doing for them.&lt;span&gt;&amp;nbsp; &lt;/span&gt;They also shouldn&amp;#39;t need to think in terms of
databases or batch jobs or other technical concerns.&lt;/p&gt;
&lt;p&gt;DDD is the ultimate
expression of Agile - it is about dealing with a constantly shifting and
evolving set of requirements - because as anyone who has ever been involved
with a software project knows - it is very rare for a requirement to remain
intact from the beginning to the end of a project, and almost impossible for it
to do so as the business grows and changes.&lt;/p&gt;
&lt;p&gt;Through constant
conversations, DDD will guide you to an ever more accurate software
representation of your business process.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=67301" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://devlicio.us/blogs/casey/archive/tags/DDD/default.aspx">DDD</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Domain+Driven+Design/default.aspx">Domain Driven Design</category></item><item><title>Trust, Honesty, Openness, Cooperation and Friction-free Tooling</title><link>http://devlicio.us/blogs/casey/archive/2011/05/03/trust-honesty-openness-cooperation-and-friction-free-tooling.aspx</link><pubDate>Tue, 03 May 2011 22:59:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:67188</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=67188</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=67188</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2011/05/03/trust-honesty-openness-cooperation-and-friction-free-tooling.aspx#comments</comments><description>&lt;p&gt;There is an inherent danger in using electronic tools to manage a process like software development, and one that almost always comes true - the tool defines your process, it doesn&amp;#39;t enable it.&lt;/p&gt;
&lt;p&gt;When people encounter limitations in the software tool, they begin to accept that these are limitations of the process and these become ingrained in your methodology. If the tool doesn&amp;#39;t support the &amp;quot;thing you want to do&amp;quot; then it is far easier to change the &amp;quot;thing&amp;quot; rather than rewrite or change the software.&lt;/p&gt;
&lt;p&gt;Were any of the electronic tools to have got the process &amp;quot;right&amp;quot; this might not be such a bad thing, but it would be reasonable to assume that in a field as adaptive and evolutionary as software development there is no such thing as the &amp;quot;right&amp;quot; process for an individual team, let alone for such a widely disparate ecosystem as development.&lt;/p&gt;
&lt;p&gt;And this conflict between our tools and our actual practices and processes is what we refer to as &amp;quot;friction&amp;quot;, and as physics defines it;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Friction is the &amp;quot;evil&amp;quot; of all motion. No matter which direction something moves in, friction pulls it the other way. Move something left, friction pulls right. Move something up, friction pulls down. It appears as if nature has given us friction to stop us from moving anything.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;We aim for &amp;quot;friction-free&amp;quot; tools to allow us to better get on with moving things, specifically developing software, which is a constantly moving and adaptive process.&lt;/p&gt;
&lt;p&gt;Some tools aim to allow endless configuration or programmability, in their objective of being a universal solution. These tools tend to actually make the problem worse, by either leaving you bogged down in configuration or customisation, or leaving the tool so generic that it solves no problem at all.&lt;/p&gt;
&lt;p&gt;Of course, some tools are better than others. Lightweight tools are obviously going to create less friction as they have less moving parts, and less touch points with your actual process.&amp;nbsp;&amp;nbsp;But these are the ones that some see as &amp;quot;lacking features&amp;quot;, or as being &amp;quot;too simplistic&amp;quot; - but it is these things specifically that enable the process of development to continue.&lt;/p&gt;
&lt;p&gt;And ultimately, these tools expose a greater problem - there is usually a disjoint between project management and the development teams here. A lack of trust and visibility leads managers to seek to control or monitor the process more tightly, and these tools promise to allow that to happen. Surely if we can tie everything into a database or a spreadsheet or something similar, we can then see exactly what is happening, who is doing what, when things will be done, and how long they will take?&lt;/p&gt;
&lt;p&gt;But it is not the tool that enables this to happen - it is serving here merely to try and enforce control upon people - which as any good manager knows, enforcement is a far blunter instrument than cooperation.&lt;/p&gt;
&lt;p&gt;What enables proper management of the software development process is trust, honesty, openness and cooperation. Tools should reflect and enable those objectives, rather than try to enforce them. And most importantly, they should stay out of the way of the development teams to allow them to get on with their real job - developing software.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=67188" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Practices+and+Principles/default.aspx">Practices and Principles</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category></item><item><title>CQRS - The Cult of Shiny Things</title><link>http://devlicio.us/blogs/casey/archive/2010/10/29/cqrs-the-cult-of-shiny-things.aspx</link><pubDate>Fri, 29 Oct 2010 00:12:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:63137</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=63137</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=63137</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2010/10/29/cqrs-the-cult-of-shiny-things.aspx#comments</comments><description>&lt;p&gt;CQRS has become another casualty of the buzzword culture and the cult of &amp;#39;shiny things&amp;#39;&lt;/p&gt;
&lt;p&gt;What started as a collection of some reasonably good principles has now turned into an almost religious mantra for some, with more and more outrageous claims, and almost no basis in fact or experience.&lt;/p&gt;
&lt;h3&gt;Scalability&lt;/h3&gt;
&lt;p&gt;Claims like &amp;quot;almost infinitely scalable systems&amp;quot; associated to CQRS are ludicrous, especially as none of the currently &amp;quot;near infinitely scalable systems&amp;quot; use CQRS or have probably even heard of it. The largest systems on the planet have no need of CQRS, they use many tricks and techniques that have been associated with CQRS - but they don&amp;#39;t use it, nor are they ever likely to use it, because when you have really large systems, things like CQRS become totally irrelevant.&lt;/p&gt;
&lt;p&gt;The scaling benefits of CQRS come from understanding eventual consistency and messaging - concepts that were around long before CQRS, and that will be around long after it too.&lt;/p&gt;
&lt;h3&gt;Task Based UIs&lt;/h3&gt;
&lt;p&gt;Well, yes CQRS may require a task based UI, but task based UIs were again around long before CQRS, and will again outlast it. This is just a different way of thinking about how people interact with computers - this is a UX issue, not a technical one.&lt;/p&gt;
&lt;p&gt;In fact, if anything, CQRS can be a major cause of issues here - when you really have a CRUD style system, CQRS is going to cause you all sorts of issues you will need to resolve. And much as I dislike CRUD based UIs, the reality is we have abused users to work this way in many cases - so sometimes that is just how we have to make our next UI work.&lt;/p&gt;
&lt;h3&gt;Side Effect Free&lt;/h3&gt;
&lt;p&gt;Another aspect of CQS (and by extrapolation CQRS) is that functions employing CQS are side effect free - you don&amp;#39;t accidentally introduce subtle bugs by writing and reading in one operation.&lt;/p&gt;
&lt;p&gt;And while this is nice in theory, the scale of system where this preventative measure would have benefit is the one where this problem is just as easily solved by many other simpler means, like just writing smart code. Larger systems have so many points in them where read and write are already being mixed, CQRS here just lends an illusion of safety.&lt;/p&gt;
&lt;h3&gt;Denormalised Read Models&lt;/h3&gt;
&lt;p&gt;A valuable benefit of CQRS is the concept that the views have specific read models that are denormalised from the (presumably) complex domain model.&lt;/p&gt;
&lt;p&gt;This has a number of benefits, though these are largely boiled down to improved efficiency of querying (and action that tends to happen frequently). These models can also be extrapolated out to provide reporting and MI models too.&lt;/p&gt;
&lt;p&gt;But again, we have been doing this for many years already, and usually to account for overloaded database servers that we don&amp;#39;t wish to query against, particularly with MI.&lt;/p&gt;
&lt;p&gt;And querying these days, even with horribly complex joins on highly complex models is becoming faster and faster. Push querying to a slave server, and you gain all the benefits of a rich model, and fast queries. And for even more speed you can look to NoSQL solutions - which are effectively based on the principle that you denormalised your data anyway.&lt;/p&gt;
&lt;h3&gt;Performance Considerations&lt;/h3&gt;
&lt;p&gt;Part of the theoretical benefit of CQRS is that your queries will be faster as your denormalised datastores are updated at write time, so you don&amp;#39;t have to do horrible joins on queries (which in theory on most systems happen far more frequently than writes)&lt;/p&gt;
&lt;p&gt;These days, the performance of relational databases and especially NoSQL databases is advancing rapidly. The new breed of databases takes things like sharding and replication very seriously, and as first class features, not afterthoughts like the databases of old did.&lt;/p&gt;
&lt;p&gt;Replication in MySQL takes roughly 0.0002 of a second (see&amp;nbsp;&lt;a href="http://nr-content.s3.amazonaws.com/railslab/videos/17-ScalingRails-Scaling-Your-Database-Part-1.mp4"&gt;http://nr-content.s3.amazonaws.com/railslab/videos/17-ScalingRails-Scaling-Your-Database-Part-1.mp4&lt;/a&gt;&amp;nbsp;at 6 minutes in) - compare that with how long a message based approach like CQRS will take to push that to your secondary datastores and you are talking orders of magnitude faster for the dumb replication approach. Apparently it operates at this speed for up to 10 slave databases before degrading.&lt;/p&gt;
&lt;p&gt;Now, think about this bit, the 37 Signal systems (a huge system) operates on a single MySQL instance running with 105Gb of memory caching. And 37 Signal could be considered the archetype of an Active Record approach, after all it is the reason Ruby on Rails exists. Are you writing a system that big?&lt;/p&gt;
&lt;p&gt;Maybe you are so let&amp;#39;s examine a larger system - Wordnik stores over 12 billion documents, 3Tb of data per node, 500k requests per hour and 4 times that at peak load, and yet their fetch time is around 60ms. (&lt;a href="http://blog.wordnik.com/12-months-with-mongodb"&gt;http://blog.wordnik.com/12-months-with-mongodb&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s not even begin to discuss Twitter, Ebay, Facebook or other similar &amp;quot;mega systems&amp;quot; - they still respond in milliseconds with tens or hundreds of millions of users - think that&amp;#39;s down to CQRS?&lt;/p&gt;
&lt;h3&gt;Dealing with Complexity&lt;/h3&gt;
&lt;p&gt;Yep - CQRS deals with complexity to one degree - it forces you to explicitly think about what each call is doing - &amp;quot;Is this writing data or reading data?&amp;quot; - and that thought process is a good thing.&lt;/p&gt;
&lt;p&gt;But it introduces another layer of complexity that is more subtle and harder to deal with - the replication to secondary datastores is complex in itself - it effectively needs to do that horrible join you are trying to avoid in your queries so that it can update your denormalised tables. That in itself isn&amp;#39;t simple.&lt;/p&gt;
&lt;p&gt;But it also needs to be able to maintain those secondary datastores if, for example they are corrupted and need recreating or if they miss some messages. In normal replication this is trivial, drop the slave, add a new slave - wait a short while - someone already wrote all that for you on a database system - you are going to need to write it all yourself with CQRS.&lt;/p&gt;
&lt;h3&gt;So Why Have I Implemented CQRS Before?&lt;/h3&gt;
&lt;p&gt;Well, at the time I first implemented CQRS I had two reasons for doing so - and oddly neither had to do with any of the aforementioned technical aspects. In fact, one was a technical problem and one was a people problem.&lt;/p&gt;
&lt;p&gt;Firstly this was nearly two years back, and the system that we were writing a layer over was a very old and crumbling legacy database system. It had no real normalised schema, and was open to abuse from just about every development team in the organisation without warning to others - it was also horribly prone to outages.&lt;/p&gt;
&lt;p&gt;One project had just &amp;quot;failed&amp;quot; (though I&amp;#39;m sure some would say it was just a lesser success), primarily due to trying to put a domain model on top of the legacy database.&lt;/p&gt;
&lt;p&gt;So, the problem we had was to create a disconnected system that could operate independently of the legacy system, but also use the legacy system as it&amp;#39;s true authority for the information it used. Because of the horrible complexity in the legacy system, using CQRS allowed us to write what were frankly quite horrible SQL statements for reading data from legacy, while using a pseudo-document database for the daily operations. We then used horrible SQL statements to replicate this data back into legacy.&lt;/p&gt;
&lt;p&gt;Of course, what we were really writing was a standard message based architecture, but the term CQRS encompassed that quite nicely.&lt;/p&gt;
&lt;p&gt;We could have approached this without the CQRS badge - but it served as a useful political tool - a number of the existing team had heard of it and were quite enthusiastic, and management would be confounded enough by it to not get in the way too much. It also broke the mental model the development teams had with &amp;quot;put an ORM over the database&amp;quot;.&lt;/p&gt;
&lt;p&gt;So the secondary benefit of CQRS here was a people problem - it was a new buzzword - it got new enthusiasm from a team that was demotivated from the previous project - and more than anything - that motivation was going to be the key to the success or failure of the new project.&lt;/p&gt;
&lt;h3&gt;So Why Have I Presented On It Before?&lt;/h3&gt;
&lt;p&gt;Well two reasons really, the first being that I have always tried to dispel the mythology around CQRS and to explain the real benefits of a flexible and scalable architecture - it just so happens that people want the buzzword explaining - you have to admit it&amp;#39;s a pretty vague and fuzzy term with a myriad of definitions and explanations.&lt;/p&gt;
&lt;p&gt;The secondary reason being, as my last presentation at DDD Sydney explained - my objective was to make you think. There&amp;#39;s a lot of good things hiding under the CQRS banner, and I really would like people to think about better ways of writing software.&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;In the few years since CQRS was &amp;quot;invented&amp;quot; it has got a bit of a cult buzzword status. It is talked about as though it fixes a multitude of problems.&lt;/p&gt;
&lt;p&gt;But in that time, NoSQL has really taken off. RBDMS&amp;#39; have got far more powerful. And memory and processing power has increased significantly. Database caching is exceptionally impressive. REST gives us proxy caching for near enough free. Memcached and Velocity make light of massive data loads. We even have the nefarious &amp;quot;cloud&amp;quot; now, where processing power and memory is cheaper than the effort involved in maintain complex architectures.&lt;/p&gt;
&lt;p&gt;Scaling systems is now a pretty commonplace business problem for most of the startups taking off&amp;nbsp;&amp;nbsp;-and they don&amp;#39;t need CQRS - there is a very good chance you don&amp;#39;t either. We are past that point in time where we had to prematurely optimise things like database queries.&lt;/p&gt;
&lt;p&gt;If it&amp;#39;s about thinking differently, then I can tell you all you need to know about CQRS in a simple paragraph:&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;i&gt;Learn to think of systems as being inconsistent at all times, no matter what illusion they present of &amp;#39;real time&amp;#39;. Learn to embrace messaging, REST, caching, replication, sharding, and a hundred other techniques to solve these problems.&amp;nbsp;&amp;nbsp;Embrace user centric task based UIs, embrace strong UX, embrace strong domain driven design, embrace business led functionality and delivering systems that match real requirements. Embrace thinking differently.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;CQRS is no silver bullet, in fact it has almost now become a solution to a problem that doesn&amp;#39;t exist any more. If you can give me a problem that CQRS claims to solve, I&amp;#39;m fairly sure I can solve it more easily than I could have done 2 years ago when I started using CQRS. I&amp;#39;m sure I&amp;#39;ll still use a lot of the things that CQRS encapsulates, because they are after all very good principles - I&amp;#39;m just pretty much over playing buzzword bingo!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=63137" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category><category domain="http://devlicio.us/blogs/casey/archive/tags/DDD/default.aspx">DDD</category><category domain="http://devlicio.us/blogs/casey/archive/tags/cqrs/default.aspx">cqrs</category></item><item><title>Ruby Is Scary</title><link>http://devlicio.us/blogs/casey/archive/2010/07/31/ruby-is-scary.aspx</link><pubDate>Sat, 31 Jul 2010 01:55:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:61330</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>38</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=61330</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=61330</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2010/07/31/ruby-is-scary.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Why is Ruby on Rails all the rage at the moment, and why do a lot of .NET people seem so defensive?&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Undoubtedly, there is a buzz in development right now, things are changing rapidly, possibly more rapidly than they have for a good number of years. New languages are sprouting up all over it seems, with PHP and Python gaining massive popularity, F#, Erlang and Haskell suddenly being talked about as mainstream, Javascript evolving beyond that thing that makes &amp;quot;onClick&amp;quot; work in your browser, and Ruby (and especially Rails) becoming &amp;quot;flavour of the month&amp;quot; for web development. Ruby is even starting to invade the .NET mainstream space with evolutions like Rake, Cuke4Nuke and Nu muddying the divide that there once was. We even have IronRuby to make Ruby run on .NET&lt;/p&gt;
&lt;p&gt;And yet, many .NET people seem defensive, as though their safe world was being invaded by a parasite.&lt;/p&gt;
&lt;p&gt;I find this quite odd. As a developer who has been around for far too long, I have seen more than my fair share of languages and platforms come and go, none of them was perfect, and I would venture to say none of the ones we have now are either.&lt;/p&gt;
&lt;p&gt;It would appear that a large proportion of the uncertainty is in the C# development &amp;#39;community&amp;#39;, though that may be as I don&amp;#39;t really frequent circles that use VB.NET (and I&amp;#39;m fairly sure they are still busy being defensive about C# and probably haven&amp;#39;t noticed that&amp;#39;s *so* last year :) Somehow the introduction of new ideas is rocking the C# type safe world.&lt;/p&gt;
&lt;p&gt;Some people seem to be concerned about Ruby itself, some seem to have concerns about the lack of a statically typed safety net, and some seem to think that &amp;quot;the Enterprise&amp;quot; needs something more professional than toys like Ruby and Rails.&lt;/p&gt;
&lt;h3&gt;To The Static Typing Stalwarts&lt;/h3&gt;
&lt;p&gt;Yes, it&amp;#39;s nice to have that compile time checking that static typing gives you, it gives us all a warm sense of fuzziness knowing that the compiler told us that this code would run just fine when we dropped it onto our web server.&lt;/p&gt;
&lt;p&gt;Yes, we appreciate the great benefits that this has for things like Intellisense and for easily discoverable APIs, and even for automated documentation.&lt;/p&gt;
&lt;p&gt;And yet, none of these things seem to bother the Ruby (and PHP/Python/Javascript) crowd too much. Why is that?&lt;/p&gt;
&lt;p&gt;I would suggest that the static typing benefits a language like C# brings are illusory to a large degree.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The compiler isn&amp;#39;t telling us that this code will run correctly at all, it&amp;#39;s actually just telling us that the CLR won&amp;#39;t throw our code out before the application even starts up - but correctness is so much more important than that. The safety net static typing provides us with is just one part of the equation, and possibly the least important part - we really should be enforcing correctness upon our code.&lt;/p&gt;
&lt;p&gt;Correctness is verified by good automated testing, and static typed languages start to come back and bite us here - we trade that compile time security blanket for a much harder experience testing our code. Sure, tools like NUnit, xUnit, Rhino Mocks, Moq, SpecFlow, StorEvil et al ease away our pain, but still our application code is littered with constructs that are pretty much there to support SOLID (or SOLID is required due to the constraints of type safe OO languages), and they become most obvious when we start testing in languages like C# (I am *so* over Interfaces, IoC, Covariance, Contravariance and Generics !&lt;/p&gt;
&lt;p&gt;The testing experience in Ruby is a world apart from in C# and .NET, it is just easy and simple ... so simple in fact that it is almost harder to not write automated tests in Ruby - and that&amp;#39;s how it should be. In C# testing is often convoluted, complex, fragile and just plain hard work - I can&amp;#39;t think of the last time a C# developer described automated testing as fun ... and yet, in Ruby, it just seems like FUN!&lt;/p&gt;
&lt;p&gt;And yes, Ruby without automated testing leaves you open to all kinds of runtime errors that C# just wouldn&amp;#39;t - so in Ruby, you just make sure you test, and not only test your code will run, but also test it will run *correctly* - there is no safety net, but the trade off is you are ensuring correctness of code, not just compilation of it.&lt;/p&gt;
&lt;p&gt;Intellisense, sure it&amp;#39;s nice, but as RubyMine and even Visual Studio (under Javascript) demonstrate, you can do some form of Intellisense in dynamic languages, you just can&amp;#39;t always be certain what may or may not be available - but this is getting better. And honestly, is discovering which method you are meant to call though typing &amp;quot;.&amp;quot; all that great an idea anyway? Shouldn&amp;#39;t you as a competent developer know *in advance* what you wanted to call, rather than guessing it as you type?&lt;/p&gt;
&lt;h3&gt;To The Enterprise&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;Sure, Ruby doesn&amp;#39;t have the track record that C# has, nor does it have the exposure, or market reach, or backing of a company like Microsoft.&lt;/p&gt;
&lt;p&gt;But, is that what is really important?&lt;/p&gt;
&lt;p&gt;I would bet that a large part of the appeal for statically typed languages &amp;nbsp;in the &amp;quot;Enterprise&amp;quot; is actually a need to deal with a much lower skilled developer base overall. Compile time safety means that your developers don&amp;#39;t have to be top notch, the compiler can make up for their weaknesses (and in the case of C# and .NET, Visual Studio &amp;#39;drag and drop&amp;#39; tooling is trying to make up for a lot of the rest)&lt;/p&gt;
&lt;p&gt;Enterprises tend to see dollars and cents, not people and value. So anything that lets them hire cheaper developers to churn out more product must be good.&lt;/p&gt;
&lt;p&gt;Again, I would argue this is a false economy. Sure that team of 30 developers may give you a warmer fuzzier feeling inside than a team of 4. And sure, the quantity of code those 30 can type out will probably be much more.&lt;/p&gt;
&lt;p&gt;But this misses some real issues around productivity and value - a &amp;#39;good&amp;#39; developer is 10x as productive as an &amp;#39;average&amp;#39; developer, and more importantly, the &amp;#39;average&amp;#39; developer will never be able to create the same quality level as the &amp;#39;good&amp;#39; developer, even given a near infinite amount of time. No matter how much time a hobbyist painter spends with oil and canvas, he will never create a Leonardo. And as a Jackson Pollock will amply demonstrate, sometimes less is more.&lt;/p&gt;
&lt;p&gt;So are you measuring bodies or productivity? Surely it is the end result that matters, not the comfort factor of people looking busy.&lt;/p&gt;
&lt;p&gt;And, when you get a good developer, and let them have the freedom of a dynamic language, they can spend less time fighting compile time safety and language constructs that exist almost solely for that type safety, and more time concentrating on business logic and the end product.&lt;/p&gt;
&lt;p&gt;In fact, the best argument for why Ruby is not suited to the Enterprise is ... the Enterprise probably already has a large investment in one platform and one core language (or maybe two), and the cost of retraining all those developers, support staff, renegotiating supplier contracts, etc etc is just disproportionately expensive. Lethargy is rife in the Enterprise, and monoliths take a long time to move - sure it&amp;#39;s easier for startups to hop on new technologies and run with them, and often it&amp;#39;s why they quickly challenge the status quo. This isn&amp;#39;t really a technical issue, this is a political and management one.&lt;/p&gt;
&lt;p&gt;Maybe Ruby and Rails will gain traction here, maybe not. Things like functional programming are certainly starting to grow roots in financial services, and things like Javascript are prevalent in web apps in the Enterprise so maybe dynamic programming in things like Ruby isn&amp;#39;t so far off. It just takes one small faction to show how well they solved a particular problem with a new language or platform to plant that thought.&lt;/p&gt;
&lt;h3&gt;So Should We All Switch To Ruby Now?&lt;/h3&gt;
&lt;p&gt;Of course not, and maybe this is what the defensive people in .NET miss. The Ruby people aren&amp;#39;t saying &amp;quot;you guys have it all wrong, convert now&amp;quot;, they are just saying &amp;quot;hey, I found a really cool way of solving this problem&amp;quot;.&lt;/p&gt;
&lt;p&gt;Ruby is about choice, it&amp;#39;s another tool in your arsenal. As are Javascript, PHP, Python, Erlang, F#, Java, Groovy, C++ and a host of others.&lt;/p&gt;
&lt;p&gt;There is no &amp;quot;one right path&amp;quot;, so let&amp;#39;s all stop pretending there is.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;We don&amp;#39;t need to be defensive about any one language or platform, unless we are so unsure of our abilities as developers that we cannot learn and adapt - and if that is the case, maybe a new career is a better idea?&lt;/p&gt;
&lt;p&gt;As my recent presentation at DDDSydney said ... My Objective Today was to make you think ... &amp;quot;Maybe There Is A Better Way&amp;quot; - because it would just be depressing to think we are already doing things the best possible way.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=61330" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category><category domain="http://devlicio.us/blogs/casey/archive/tags/.NET/default.aspx">.NET</category><category domain="http://devlicio.us/blogs/casey/archive/tags/ruby/default.aspx">ruby</category></item><item><title>My Objective Today is to Make You Think</title><link>http://devlicio.us/blogs/casey/archive/2010/07/19/my-objective-today-is-to-make-you-think.aspx</link><pubDate>Mon, 19 Jul 2010 00:08:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:61124</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=61124</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=61124</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2010/07/19/my-objective-today-is-to-make-you-think.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;Maybe There is a Better Way&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I recently presented at DeveloperDeveloperDeveloper in Sydney, and although my talk was Stuff About CQRS, I opened with the slide&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My Object Today Is to Make You Think ... &amp;#39;Maybe There is a Better Way&amp;#39;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(&lt;a href="http://thinkddd.com/blog/2010/07/17/dddsydney-presentation-stuff-about-cqrs/"&gt;slides here&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The real focus of this was around how normal people think, and how unlike normal people we developers really are. My role in development is all about enabling better communication, because fundamentally I believe the real value a developer brings to a project is not technical, but is in the way they interact with the team, and more importantly with the normal people they are actually creating software for.&lt;/p&gt;
&lt;p&gt;Obviously some of this has roots in DDD, the Ubiquitous Language is obviously an attempt to traverse this chasm that seems to exist between us.&lt;/p&gt;
&lt;p&gt;Then I touched on user interfaces, and how they are so rarely designed the way people think - normal people think about their objectives and goals, not in terms of data like we developers do. Inductive UIs are focused on tasks, unlike the traditional data driven UIs that we tend to throw at users - users and people don&amp;#39;t think in grids and columns and rows, they think &amp;quot;I want to change my address&amp;quot;, not &amp;quot;open my customer record, edit the three fields under address and save to the database&amp;quot; - only a sadist or a developer would think that way.&lt;/p&gt;
&lt;p&gt;And finally I touched on things like NoSQL databases, which neatly solve a communication problem - they stop us thinking about How to store information and let us focus on What we are storing and Why.&lt;/p&gt;
&lt;p&gt;And lastly I tried to show the link between CQRS and these business problems - how it made you focus on the language, on tasks and objectives and how it let you detach the How from the What and Why.&lt;/p&gt;
&lt;p&gt;But most importantly, what I was trying to do in that presentation was to throw some non-mainstream ideas out into the audience, to spark discussion and debate, and to get people to think - Maybe There is a Better Way &amp;nbsp;&lt;/p&gt;
&lt;p&gt;If only a few of those in the audience went away and Googled some of the ideas I was talking about, it will be another step towards moving development away from it&amp;#39;s heavy focus on technology and technological solutions - and towards a people and business driven focus, where technology is an artifact, not the deciding factor.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=61124" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://devlicio.us/blogs/casey/archive/tags/DDD/default.aspx">DDD</category><category domain="http://devlicio.us/blogs/casey/archive/tags/cqrs/default.aspx">cqrs</category></item><item><title>Agile is Performance, Feedback, Revision</title><link>http://devlicio.us/blogs/casey/archive/2010/04/15/agile-is-performance-feedback-revision.aspx</link><pubDate>Thu, 15 Apr 2010 02:45:08 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:57265</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=57265</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=57265</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2010/04/15/agile-is-performance-feedback-revision.aspx#comments</comments><description>&lt;p&gt;I came across a great video link yesterday, entitled “&lt;a href="http://blog.newhumanist.org.uk/2010/03/see-baba-brinkmans-rap-guide-to.html" target="_blank"&gt;Performance, Feedback, Revision&lt;/a&gt;”. It’s a Canadian rapper named Baba Brinkman covering the theory of evolution and the work of Charles Darwin, and he equates evolution with how he writes his lyrics, Performance, Feedback, Revision.&lt;/p&gt;  &lt;p&gt;As I listened to it, it struck me that this is Agile … we develop, we run retrospectives, and we revise what we have.&lt;/p&gt;  &lt;p&gt;Evolution may be more like waterfall, and take millions of years to evolve something as fundamentally pointless as the &lt;a href="http://www.talkorigins.org/faqs/vestiges/appendix.html" target="_blank"&gt;appendix&lt;/a&gt;, and in Agile we may look to have Performance, Feedback and Revision inside a week or two.&lt;/p&gt;  &lt;p&gt;I can’t quite believe I just showed this video to a client to explain Agile, but it seemed to get the idea across pretty well. I’m considering using it more often, but I promise to draw the line at learning to rap.&lt;/p&gt;  &lt;p&gt;But from now on, in big letters across the top of my white boards will go the words:&lt;/p&gt;  &lt;h3 align="center"&gt;Performance, Feedback, Revision&lt;/h3&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=57265" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>Good Developers Write Good Code, Instinctively</title><link>http://devlicio.us/blogs/casey/archive/2009/10/06/good-developers-write-good-code-instinctively.aspx</link><pubDate>Tue, 06 Oct 2009 08:09:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:52215</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=52215</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=52215</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2009/10/06/good-developers-write-good-code-instinctively.aspx#comments</comments><description>&lt;p&gt;So &lt;a href="http://devlicio.us/blogs/casey/archive/2009/10/05/developer-myopia.aspx"&gt;my last post&lt;/a&gt; ruffled some feathers, but Steve hit the nail right on the head in his commments, and it was sort of the subtext of what I was saying:&lt;/p&gt;
&lt;p&gt;All this kerfuffle about &amp;quot;software craftsmen&amp;quot; and &amp;quot;code quality&amp;quot; and &amp;quot;best practice&amp;quot; misses the ultimate fundamental truth : &lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;em&gt;Good Developers Write Good Code, Instinctively&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Let start with a funny statistic ... it certainly applies to drivers, I&amp;#39;m sure it applies to developers too (and almost any group of people) ...&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;em&gt;80% of developers think they are above average!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Our logical brains can&amp;#39;t help but admit that at least 30% of developers are therefore deluded. Our mathematical brains can&amp;#39;t help but admit that 50% of developers must be totally average or below average. And yet, most of us think we are above average developers. I would boldly go further, and put myself in the top 20% of developers - I like to think I at least have a damn good idea who the 20% above me are and why they are better.&lt;/p&gt;
&lt;p&gt;If you are a &amp;quot;good developer&amp;quot; you will write &amp;quot;good&amp;quot; code. It will probably use a dozen standard patterns, maybe without you even knowing what they are called, it will have low coupling, high cohesion, be easy to test, easy to extend, hard to modify, avoid duplication and abstract code behind well thought out interfaces. And yet despite all that - you may well have never heard of software patterns, OCP, ISP, DIP, unit Testing, DRY, YAGNI, etc etc etc&lt;/p&gt;
&lt;h3&gt;Before The Renaissance&lt;/h3&gt;
&lt;p&gt;There was a time, which sadly I am old enough to remember, when we didn&amp;#39;t have all these fancy names, and yet we pretty much did what all the enlightend are doing today. &lt;/p&gt;
&lt;p&gt;We may not have had &amp;quot;unit testing&amp;quot;, but we had &amp;quot;test harnesses&amp;quot;, and we may not have had automated tests running after every build, but we had QA people using our test harnesses to verify our code. &lt;/p&gt;
&lt;p&gt;We may not have had software patterns, but we all used factories, observers and singletons.&lt;/p&gt;
&lt;p&gt;We may not have has SOLID, but we wrote good decoupled code, well abstracted, easy to test and easy to maintain.&lt;/p&gt;
&lt;h3&gt;None of These Things Are New&lt;/h3&gt;
&lt;p&gt;While many like to go on almost holy crusades about these wonderful new inventions, some of us know that these are just evolutions of things good developers have been doing since programming began. Sure they are now formalised, they have great names, they have been refined to be more automated and more efficient - but at the end of the day - good developers already did this stuff.&lt;/p&gt;
&lt;p&gt;What concerns me more is how &amp;quot;new&amp;quot; these things seem to some of the holy crusaders. I remember code I wrote in 6502 assembler that had these principles applied (you try writing games in 3.5kb of RAM if you don&amp;#39;t apply DRY), I remember code I wrote in COBOL on a PDP/11 that had &amp;quot;factories&amp;quot;. &lt;/p&gt;
&lt;p&gt;I remember working on a RAD team in an investment bank, long before RAD had meaning. We delivered software fast, direct to the customers, with rapid feedback and weekly releases. We sat with the traders, we were &amp;quot;Agile&amp;quot; and &amp;quot;Lean&amp;quot; long before anyone thought of proper words.&lt;/p&gt;
&lt;p&gt;These great software practices were not invented, they were formalisations of things we were already doing.&lt;/p&gt;
&lt;h3&gt;All Of These Things Are Good&lt;/h3&gt;
&lt;p&gt;Before anyone decides to rip my head off and banish me to the pits of hell, let me state - all of these practices are good. More over, these practices are (probably) the pinnacle of our current understanding of development practices garnered over the last 30 or 40 years - and we should strive to write code with these things in mind. In 5 years I have no doubt all these things will have evolved, and there will be new best practices. Half of these things only apply to Java and C# anyway - in the world of F#, Erlang, Ruby and Python there are new principles and best practices.&lt;/p&gt;
&lt;p&gt;Formalisation of all these practices, principles and methodologies is good - it helps promote understanding and gives us a way of communicating.&lt;/p&gt;
&lt;p&gt;The thing is, the real &amp;quot;above average&amp;quot; developers were probably already doing this - and all that code they wrote for the past 30 years is probably still running your bank accounts, processing your taxes and helping keep your aircraft in the sky, precisely because they already did.&lt;/p&gt;
&lt;h3&gt;Below Average Developers Will Always Write Below Average Code&lt;/h3&gt;
&lt;p&gt;No way to avoid this I&amp;#39;m afraid - we can talk about the need to raise the bar, to raise the average, to help those below average developers write better code - but fundamentally, below average developers will always write below average code. The above average developers need to recognise this, and understand that they will always feel they are being held back by the lower 50%, and they are always fixing the code of the lower 50%, and they are always doing more than their share.&lt;/p&gt;
&lt;p&gt;And one last question... are you sure YOU are above average? I&amp;#39;m not sure myself, in fact my most common comment in interviews is that I am not the best C# developer in the world by a long way, I am rarely the best C# developer in my team for that matter. Am I in the top 20%? Probably by my own standards and measures - that doesn&amp;#39;t mean I am by everyone else&amp;#39;s measures.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=52215" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Practices+and+Principles/default.aspx">Practices and Principles</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category></item><item><title>Developer Myopia</title><link>http://devlicio.us/blogs/casey/archive/2009/10/05/developer-myopia.aspx</link><pubDate>Mon, 05 Oct 2009 12:07:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:52106</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>22</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=52106</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=52106</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2009/10/05/developer-myopia.aspx#comments</comments><description>&lt;p&gt;While &lt;a href="http://www.scottcreynolds.com/archive/2009/10/02/604.aspx"&gt;some may argue&lt;/a&gt; that TDD, BDD, SRP, ahderence to SOLID, use of Patterns, and many other development practices and principles are critical to achieving great software, these all seem to miss some core truths.&lt;/p&gt;
&lt;h3&gt;Most Software Has Not Been Developed This Way&lt;/h3&gt;
&lt;p&gt;Yep, sorry to disappoint, but the vast majority of software in production in the world today has had none of these principles and practices applied. Some of the software may have had some of these practices applied - but it is (I would guesstimate) an incredibly small percentage.&lt;/p&gt;
&lt;p&gt;And despite that (feel free to tell me I&amp;#39;m wrong) fact, most software works and continues to work. It processes your taxes correctly, makes sure your airplane doesn&amp;#39;t blow up on take off, scans your body for cancer, lets you bill your customers, tells you what you are doing tomorrow, and lets you keep in touch with friends and family.&lt;/p&gt;
&lt;h3&gt;Most Software &amp;quot;Mistakes&amp;quot; Are Not Development Practices&lt;/h3&gt;
&lt;p&gt;Steve McConnell, he of &lt;a href="http://cc2e.com/"&gt;Code Complete&lt;/a&gt; and &lt;a href="http://www.stevemcconnell.com/rd.htm"&gt;Rapid Development&lt;/a&gt; fame (books everyone in development or management should read) has just published his &amp;quot;&lt;a href="http://blogs.construx.com/blogs/stevemcc/archive/2008/05/13/Software_2700_s-Classic-Mistakes_2D002D00_2008.aspx"&gt;Software&amp;#39;s Classic Mistakes&lt;/a&gt;&amp;quot; list for 2008, and none of these things we developer&amp;#39;s like to refer to as &amp;quot;best practice&amp;quot; or &amp;quot;the right way&amp;quot; feature on the list - not in their specific forms, mnor even in their general forms.&lt;/p&gt;
&lt;p&gt;In fact - all of the classic mistakes (which cause software projects to be delayed or fail) are process mistakes, they are failures of people, not of coding constructs and practices.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unrealistic Expectations&lt;/li&gt;
&lt;li&gt;Overly Optimistic Schedules&lt;/li&gt;
&lt;li&gt;Shortchanged Quality Assurance&lt;/li&gt;
&lt;li&gt;Wishful Thinking&lt;/li&gt;
&lt;li&gt;Confusing Estimates With Targets&lt;/li&gt;
&lt;li&gt;Excessive Multi Tasking&lt;/li&gt;
&lt;li&gt;Feature Creep&lt;/li&gt;
&lt;li&gt;Noisy Crowded Offices&lt;/li&gt;
&lt;li&gt;Abandoning Planning Under Pressure&lt;/li&gt;
&lt;li&gt;Insufficient Risk management&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We can certainly look at this list and see how Agile, Lean and similar processes can help alleviate many of these, but where do you see &amp;quot;TDD&amp;quot;, &amp;quot;BDD&amp;quot;, &amp;quot;SOLID&amp;quot; or even &amp;quot;Automated Testing&amp;quot; resolving any of them? The closest we will come is to see &amp;quot;Shortchanged Quality Assurance&amp;quot; as being ticked off the list, but this still doesn&amp;#39;t remove the need for real QA on a project, and real QA people.&lt;/p&gt;
&lt;h3&gt;Developer Myopia&lt;/h3&gt;
&lt;p&gt;While as developer&amp;#39;s we see great value in many of these practices, we need to admit that we are actually a very small part of the equation, and sometimes developer myopia sneaks in - we think that what we do at a code level matters, substantially more than it does in the grand scheme of things.&lt;/p&gt;
&lt;p&gt;By all means, apply and practice these things that create &amp;quot;quality&amp;quot; software, but bear in mind, there are much bigger and more important problems to resolve too.&lt;/p&gt;
&lt;p&gt;Or to paraphrase (and bastardize)&amp;nbsp;the Agile manifesto: While we see value in software patterns and practices, there is more value in solving process problems first&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=52106" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Practices+and+Principles/default.aspx">Practices and Principles</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category></item><item><title>Ship it, or Ship Out</title><link>http://devlicio.us/blogs/casey/archive/2009/09/25/ship-it-or-ship-out.aspx</link><pubDate>Fri, 25 Sep 2009 08:38:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:51716</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>27</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=51716</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=51716</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2009/09/25/ship-it-or-ship-out.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.joelonsoftware.com/"&gt;Joel&lt;/a&gt;, in his inimitable way, &lt;a href="http://www.joelonsoftware.com/items/2009/09/23.html"&gt;posted the flame bait of all flame bait posts yesterday&lt;/a&gt;, explaining the role of the Duct Tape Programmer.&lt;/p&gt;
&lt;p&gt;To my surprise, the Twitterverse started to reverberate with commentary, but weirdly, almost all of it was very negative about the post, many claiming that Joel was just creating straw men and knocking them down, or was characterising developers who care about quality as being poor developers.&lt;/p&gt;
&lt;p&gt;I was surprised, because I read the article totally the other way around - and had said so earlier in the day to someone on Twitter, saying I largely agreed with it. It seems that there were two ways of reading the article, and mine differed substantially to most people I follow on Twitter.&lt;/p&gt;
&lt;p&gt;I was quite pleased to see Michael Neel post last night in a &lt;a href="http://devlicio.us/blogs/vinull/archive/2009/09/24/being-a-duct-tape-programmer.aspx"&gt;semi-defence of Joel&amp;#39;s standpoint&lt;/a&gt;, and I thought the 140 char limit of Twitter wasn&amp;#39;t enough for me to post my opinions.&lt;/p&gt;
&lt;h3&gt;Background&lt;/h3&gt;
&lt;p&gt;Joel has a bit of a record on this, he isn&amp;#39;t best liked by a large proportion of the developer community who see their focus and remit as producing high quality, well tested and highly maintainable software. His &lt;a href="http://blog.stackoverflow.com/2009/01/podcast-38/"&gt;original tirades in a podcast&lt;/a&gt; about his deep distrust of Test Driven Development and of Unit Testing in &lt;a href="http://blog.objectmentor.com/articles/2009/01/31/quality-doesnt-matter-that-much-jeff-and-joel"&gt;general brought uproar&lt;/a&gt;. And on that matter he was so far off the mark, it was understandable why he had riled so many people - he really just didn&amp;#39;t understand or &amp;quot;get&amp;quot; TDD or testing in general.&lt;/p&gt;
&lt;p&gt;But, what he had done, in conjunction with &lt;a href="http://www.codinghorror.com/blog/"&gt;Jeff Atwood&lt;/a&gt;, was to deliver a website, &lt;a href="http://stackoverflow.com/"&gt;stackoverflow.com&lt;/a&gt;, that was proving hugely successful, and was being used extensively by all those same developers who railed against his podcasts and blogs.&lt;/p&gt;
&lt;p&gt;That website, as Joel and Jeff explained, was not done with TDD, was not well tested (via Unit Tests), was badly hacked together in places, and used &amp;quot;old&amp;quot; technologies like TSQL over &amp;quot;modern&amp;quot; solutions like ORMs&lt;/p&gt;
&lt;p&gt;Whether Joel &amp;quot;got&amp;quot; TDD wasn&amp;#39;t important, what he and Jeff had done was to ship a product, get it to market, and build upon that release to make stackoverflow the massive success it is today. It&amp;#39;s so successful, that soon after stackoverflow was released, they used the same code and model to release other Q&amp;amp;A sites, and they continue to do so.&lt;/p&gt;
&lt;h3&gt;The Duct Tape Programmer&lt;/h3&gt;
&lt;p&gt;So with all of that in mind, it was sort of obviously flame bait for Joel to make a post that basically boiled down to &amp;quot;shipping it way more important than fancy patterns and great tools&amp;quot; - he certainly has a way of putting such a simple message that can antagonise the meekest of individuals (and some not so meek). &lt;/p&gt;
&lt;p&gt;It was a terrible choice of label, but I guess &amp;quot;Pragmatic Programmer&amp;quot; had already been taken.&lt;/p&gt;
&lt;h3&gt;Time, Quality, Functionality&lt;/h3&gt;
&lt;p&gt;I read the article slight differently - I read it as an urge to maintain your highest priority as shipping the product your business wants you to ship.&lt;/p&gt;
&lt;p&gt;There are three factors involved in a project (if you exclude Resourcing, which falls under Brooks Law):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Time&lt;/li&gt;
&lt;li&gt;Quality&lt;/li&gt;
&lt;li&gt;Functionality (or Scope)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you try and maintain all three factors as fixed, your project is doomed to fail. Something will, unless you are really lucky, break. And then one of those factors will suffer, and it will be luck as to which it is. At best you can fix two of those factors, and then the third has to be allowed to slip when the unexpected happens (as it always does).&lt;/p&gt;
&lt;p&gt;But, the important part here, is that which of those factors is fixed, and which is allowed to slip is NOT a developer decision - it is a business decision.&lt;/p&gt;
&lt;p&gt;Much of the outrage about Joel&amp;#39;s article stated that he isn&amp;#39;t a developer - and they are correct - he is a business owner, and prior to that a project manager. His focus is therefore on shipping his product, and inevitably from that perspective, the instinct is to fix Time and Functionality (ship as soon as possible, with as much functionality as possible) and to let Quality suffer to achieve that objective.&lt;/p&gt;
&lt;p&gt;This is a TOTALLY VALID business decision - it is just one that developers don&amp;#39;t like, it offends their sense of code quality and high standards.&lt;/p&gt;
&lt;h3&gt;Why Do Developers Care So Much About Quality?&lt;/h3&gt;
&lt;p&gt;I&amp;#39;ll start with the cynical view: development is only fun while you are trying new things, trying to perfect a tricky algorithm, or make some great new OSS component do some magic. By nature, the developers who care deeply about quality are also perfectionists, they like to make sure they have done a good job, and have written the best code they can.&lt;/p&gt;
&lt;p&gt;Go on, admit it, if developers just did routine coding all day long, our jobs would be boring. We like new toys, new language features, we like to play.&lt;/p&gt;
&lt;p&gt;And we know that better code will be easier to maintain - and developers HATE bug fixing duty, so we want to ensure we don&amp;#39;t have to do much of it.&lt;/p&gt;
&lt;p&gt;To a developer, the most important factor in any project is Quality, followed by Time (because we know our bosses will be mad if we miss our deadlines), but we are happy to slip Functionality because it matters little to us if a new feature isn&amp;#39;t included in the release.&lt;/p&gt;
&lt;h3&gt;Fundamentally We Are Not Aligned&lt;/h3&gt;
&lt;p&gt;Developers and business owners are not aligned in their goals - we prioritise the three factors very differently, and for different reasons.&lt;/p&gt;
&lt;p&gt;Only two things can happen here, your developers need to align with their business objectives, or the business needs to align with the developers - or they can both compromise.&lt;/p&gt;
&lt;p&gt;Agile is all about the compromise, making both sides aware of the issues involved, and then coming to an agreement, but fundamentally - it is STILL A BUSINESS DECISION.&lt;/p&gt;
&lt;p&gt;While it is the responsibility of a professional developer to explain all the problems they see with low quality code, and to make their boss aware of all the potential future issues this may cause, it is also their professional responsibility to go with the decision their boss makes.&lt;/p&gt;
&lt;p&gt;They have one other option - resign and go somewhere that is more closely aligned with their values.&lt;/p&gt;
&lt;h3&gt;Ship It or Ship Out&lt;/h3&gt;
&lt;p&gt;Whatever your opinions of Joel and Jeff&amp;#39;s understandings of TDD, Unit testing, maintainable code or just code in general (and I&amp;#39;m sure yours aren&amp;#39;t too far from mine), you have to admit they delivered a product to market (many in fact), and have turned it into a huge success. They may have to pay for that speed to market later, but that was a business decision they were willing to take.&lt;/p&gt;
&lt;p&gt;Never underestimate the value to a business of being fast to market - there is a risk the product will be so bugged it will backfire - but there is a chance they could steal the march on their competitors, and gain critical traction. Business is all about assessing risk, that is what a business owner has to do, and if they do it right their business flourishes.&lt;/p&gt;
&lt;p&gt;If your boss wants a product shipped by a particular date, and that is their highest priority, you have a responsibility to ship it. If they won&amp;#39;t sacrifice functionality to achieve that goal, then code quality will have to suffer - in that case do the best you can do with the restraints you are under. And if all that fails, quit, go somewhere that appreciates your values and dedication to your art - you do not have a right to hold your employer to ransom.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So, Ship It or Ship Out.&lt;/strong&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=51716" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/TDD/default.aspx">TDD</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Twitter/default.aspx">Twitter</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Testing/default.aspx">Testing</category></item><item><title>The Largest Wicked Problem in Software is Politics and Management</title><link>http://devlicio.us/blogs/casey/archive/2009/08/25/the-largest-wicked-problem-in-software-is-politics-and-management.aspx</link><pubDate>Tue, 25 Aug 2009 11:40:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:50714</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=50714</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=50714</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2009/08/25/the-largest-wicked-problem-in-software-is-politics-and-management.aspx#comments</comments><description>&lt;p&gt;I previously wrote a post stating that &lt;a href="http://devlicio.us/blogs/casey/archive/2009/08/04/software-is-a-wicked-problem.aspx"&gt;Software is a Wicked Problem&lt;/a&gt;, and indeed it is.&lt;/p&gt;
&lt;p&gt;There is a bigger Wicked Problem that affects software projects though, that of Politics and Management.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;While there are at least technical solutions to most software problems, and even wicked problems can be cracked eventually, it is a much harder and more time consuming issue to deal with political and managerial problems, and they largely turn out to be wicked problems in of themselves.&lt;/p&gt;
&lt;p&gt;And, as with all wicked problems, it is faster to fix the problem than it is to estimate how long it will take to fix - it also happens that with politics and managerial issues, it is often nearly impossible to estimate, or to actually fix the problems, so software developers spend most of their time trying to work around these problems rather than addressing them.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Wicked_problem"&gt;http://en.wikipedia.org/wiki/Wicked_problem&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.poppendieck.com/wicked.htm"&gt;http://www.poppendieck.com/wicked.htm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=50714" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category><category domain="http://devlicio.us/blogs/casey/archive/tags/wicked+problem/default.aspx">wicked problem</category></item><item><title>Software is a Wicked Problem</title><link>http://devlicio.us/blogs/casey/archive/2009/08/04/software-is-a-wicked-problem.aspx</link><pubDate>Tue, 04 Aug 2009 13:06:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:49828</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=49828</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=49828</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2009/08/04/software-is-a-wicked-problem.aspx#comments</comments><description>&lt;p&gt;A Wicked Problem, roughly speaking, has a number of properties:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The problem is not understood until after the 
formulation of a solution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wicked problems have no stopping 
rule.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Solutions to wicked problems are not right or 
wrong.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Every wicked problem is essentially novel and 
unique.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Every solution to a wicked problem is a &amp;#39;one 
shot operation&amp;#39;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wicked problems have no given alternative 
solutions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Software development is largely a Wicked Problem,&lt;strong&gt; &lt;/strong&gt;or in headline 
terms:&lt;/p&gt;
&lt;h3&gt;It is faster to create a solution to the problem than to estimate how 
long it will take to create that solution with any degree of accuracy, and the 
estimate will still be wrong.&lt;/h3&gt;
&lt;p&gt;
&lt;a href="http://en.wikipedia.org/wiki/Wicked_problem"&gt;http://en.wikipedia.org/wiki/Wicked_problem&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.poppendieck.com/wicked.htm"&gt;http://www.poppendieck.com/wicked.htm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=49828" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category></item><item><title>Twitter Went And Stuffed Replies!</title><link>http://devlicio.us/blogs/casey/archive/2009/05/13/twitter-went-and-stuffed-replies.aspx</link><pubDate>Wed, 13 May 2009 06:48:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:46635</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=46635</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=46635</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2009/05/13/twitter-went-and-stuffed-replies.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;m not going to spend too much time describing the problem ... &lt;a href="http://www.kevinwilliampang.com/post/Twitters-Small-Settings-Update.aspx"&gt;Kevin Pang has done so admirably here&lt;/a&gt;, however I do want to mention this &amp;quot;small&amp;quot; change as it directly affects a new site I am building right now to work over Twitter.&lt;/p&gt;
&lt;p&gt;Twitter&amp;#39;s latest blog post titled&amp;nbsp;&lt;a href="http://blog.twitter.com/2009/05/small-settings-update.html"&gt;Small Settings Update&lt;/a&gt;&amp;nbsp;states the following:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We&amp;#39;ve updated the Notices section of Settings to better reflect how folks are using Twitter regarding replies. Based on usage patterns and feedback, we&amp;#39;ve learned most people want to see when someone they follow replies to another person they follow-it&amp;#39;s a good way to stay in the loop.&amp;nbsp;However, receiving one-sided fragments via replies sent to folks you don&amp;#39;t follow in your timeline is undesirable. Today&amp;#39;s update removes this undesirable and confusing option.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What this essentially means is that the &amp;quot;viral&amp;quot; nature of Twitter has been largely disabled. No longer will you see interesting replies from people you follow to complete strangers and think &amp;quot;maybe that guy is worth following too, I&amp;#39;ll check him out&amp;quot;. If the person is only mentioned, then you will still see the message, bbut I would lay a large bet this is only a very small percentage of the Replies.&lt;/p&gt;
&lt;p&gt;I have no idea if Twitter did this to save bandwidth, or for some other more obscure reason, but ultimately it will hurt Twitter by slowing growth, as growth is largely by &amp;quot;discovering&amp;quot; people from replies. I&amp;#39;m sure &amp;quot;new&amp;quot; applciations will appear to try and plug this gap, but it is so deep in the Twitter API that it cannot be countered easily by other tools.&lt;/p&gt;
&lt;p&gt;From my own perspective, it seriously damages the growth potential of my new Twitter based site, so will leave us with other less palatable options like spamming people or creating follow bots to try and get people interested - neither of which is desirable or in my ethos.&lt;/p&gt;
&lt;p&gt;Dear Twitter, change it back please while it&amp;#39;s not too late!&lt;/p&gt;
&lt;p&gt;Dear Twitter users, please express your feelings via &lt;a href="http://search.twitter.com/search?q=%23fixreplies"&gt;#fixreplies&lt;/a&gt;&amp;nbsp; ... and remember you can follow my mini-rants &lt;a href="http://twitter.com/JakCharlton"&gt;@JakCharlton&lt;/a&gt; if this one wasn&amp;#39;t enough for you!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=46635" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Twitter/default.aspx">Twitter</category></item><item><title>Job Satisfaction, And Making The World A Better Place</title><link>http://devlicio.us/blogs/casey/archive/2009/03/29/job-satisfaction-and-making-the-world-a-better-place.aspx</link><pubDate>Sun, 29 Mar 2009 11:24:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:45215</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>15</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=45215</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=45215</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2009/03/29/job-satisfaction-and-making-the-world-a-better-place.aspx#comments</comments><description>&lt;p&gt;You know what we achieve with all our wonderful software patterns and practices? Not a lot on the whole.&lt;/p&gt;
&lt;p&gt;We do fairly well financially out of it, and many of those who use our software do fairly well financially from it too. A select few of us write software that can have a small impact on the well being of others, but even then, it is in a totally detached way.&lt;/p&gt;
&lt;p&gt;But how often can you say that your day at work has affected somebody else&amp;#39;s life for the better, or made a really positive change to the world? How often can you look in the mirror and say my whole day was spent helping other people?&lt;/p&gt;
&lt;p&gt;So, what the hell am I doing in the software game? Well, like I suspect many of us, I fell into it by accident. It was my hobby at school, I wrote games software and made a fairly comfortable (for a schoolboy) living from doing it.&lt;/p&gt;
&lt;p&gt;Although my choice of O Levels (equivalent to GCSEs these days) were picked around becoming a doctor, and even though my mother had to argue with the school for weeks to get them to allow me to do three sciences, home and family circumstances at that time meant I never actually took most of my school exams. So with nothing in the way of real qualifications, I drifted into what I was naturally good at - technical support and writing computer software. My hobby turned into    &lt;br /&gt;my career.&lt;/p&gt;
&lt;p&gt;Twenty odd years later, and I am more than comfortable with my career, I like to think I am pretty good at it. I also still often think, I could have been adding much more value to other people&amp;#39;s lives if I had stuck with my original choice. Recently I met a lady who was a nurse, and I was totally inspired by her and how much satisfaction she clearly got from her work &amp;ndash; she told me that I could still retrain even at this stage in life.&lt;/p&gt;
&lt;p&gt;Now I expect you are waiting for some kind of development related conclusion here ... but unfortunately there isn&amp;#39;t one. What there is, is a small realisation that I could probably be doing something more for the world.&lt;/p&gt;
&lt;p&gt;So, I have started seriously investigating my options for a radical career change - and to retrain as a medical doctor. Now this isn&amp;#39;t quite my swansong from development just yet. Not only do I have some major considerations to make, but I also have to put enough money aside to finance this shift, and after all that I have to succeed in an application to medical school, which in the UK is a very difficult task indeed, as places at our universities are very sought after, and the universities can afford to be very selective. I could even do one or two years getting the entry requirements, only to fail to get a place at medical school.&lt;/p&gt;
&lt;p&gt;But, I have started sending off enquiries to various universities asking for their advice on the best route in, and perhaps it will pay off. It will be time consuming, financially very hard in the short    &lt;br /&gt;term, but it could be the most rewarding thing I could possibly do.&lt;/p&gt;
&lt;h3&gt;Ultimately, Job Satisfaction is About More Than Financial Reward&lt;/h3&gt;
&lt;p&gt;Whatever I eventually do, I have made a decision to get out and start giving back something to the world, maybe that will be with 6 years of medical training, followed by years of excessively long hours for very little pay ... or maybe it will be just finding ways to make people&amp;#39;s lives better while continuing my career in software.&lt;/p&gt;
&lt;p&gt;I encourage you all to find something positive you can give back to the world - the development community has some incredibly smart and insightful people - let&amp;#39;s not waste all our efforts on arguing over whether we should invert our dependencies or not!&lt;/p&gt;
&lt;p&gt;And if you want somewhere to start doing your small bit, can I suggest you take a read of &lt;a target="_blank" href="http://weblogs.asp.net/bsimser/archive/2009/03/27/the-girl-next-door.aspx"&gt;The Girl Next Door by Bil Simser&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bloody hell that was DEEP!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=45215" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category></item><item><title>Welcome to Tuna – a Very Smart Fish!</title><link>http://devlicio.us/blogs/casey/archive/2009/03/11/welcome-to-tuna-a-very-smart-fish.aspx</link><pubDate>Wed, 11 Mar 2009 16:39:10 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:44923</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=44923</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=44923</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2009/03/11/welcome-to-tuna-a-very-smart-fish.aspx#comments</comments><description>&lt;p&gt;Devlcio.us is proud to have Tuna Toksoz join us as our newest blogger … he really is one smart fish, and if you have been following his blogging on &lt;a href="http://tunatoksoz.com/"&gt;http://tunatoksoz.com/&lt;/a&gt; then, you’ll be only too aware of his in depth knowledge of things like NHibernate and his involvement in Alt.Net Turkiye. He is also one of the most helpful and nicest guys I have come across in the InternetoSphere!&lt;/p&gt;  &lt;p&gt;Looking forward to many great posts from him soon at: &lt;a href="http://devlicio.us/blogs/tuna_toksoz"&gt;http://devlicio.us/blogs/tuna_toksoz&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=44923" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category></item></channel></rss>