<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <link href="http://martinfowler.com/feed.atom" rel="self"/>
  <link href="http://martinfowler.com"/>
  <id>http://martinfowler.com/feed.atom</id>
  <title>Martin Fowler</title>
  <subtitle>Master feed of news and updates from martinfowler.com</subtitle>
  <author>
    <name>Martin Fowler</name>
    <email>fowler@acm.org</email>
    <uri>http://martinfowler.com</uri>
  </author>
  <updated>2012-05-10T12:46:00-04:00</updated>
<entry>
    <title>photostream 25</title>
    <link href="http://martinfowler.com/photos/25.html"/>
    <updated>2012-05-10T12:46:00-04:00</updated>
    <id>tag:martinfowler.com,2012-05-10:photostream-25</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/25.html'&gt;&lt;img src = 'http://martinfowler.com/photos/25.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Winterthur, DE&lt;/p&gt;
</content>
  </entry><entry>
    <title>Retreaded: StandardStoryPoints</title>
    <link href="http://martinfowler.com/bliki/StandardStoryPoints.html"/>
    <updated>2012-05-10T12:30:00-04:00</updated>
    <id>tag:martinfowler.com,2012-05-10:Retreaded--StandardStoryPoints</id>
    <category term=""/>
    <content type="html">
&lt;p class = 'original'&gt;&lt;a href = 'http://martinfowler.com/bliki/Retread.html'&gt;Retread&lt;/a&gt; of post orginally made on 06 Sep 2004&lt;/p&gt;

&lt;p&gt;I've heard a couple of questions recently about coming up with a
	standard story point mechanism for multiple teams using extreme
	programming's planning approach. The hope is have several teams all
	using equivalent story points, so that three story points of effort
	on one team is the same as on another.&lt;/p&gt;

&lt;p&gt;I think trying to come up with this at best of limited value, and
	at worst dangerous.&lt;/p&gt;

&lt;p&gt;The estimating system of extreme programming is based on
		&lt;a href="http://martinfowler.com/bliki/XpVelocity.html"&gt;XpVelocity&lt;/a&gt; and &lt;a href="http://martinfowler.com/bliki/YesterdaysWeather.html"&gt;YesterdaysWeather&lt;/a&gt;. Inherent
		in this is the idea that when you make estimates, the actual units
		you estimate aren't important - what's important is you estimate
		by rough comparative value and use &lt;a href="http://martinfowler.com/bliki/YesterdaysWeather.html"&gt;YesterdaysWeather&lt;/a&gt;
		for calibration. &lt;/p&gt;

&lt;p&gt;In this situation the story points act as an anchor for the
		feedback loop that Yesterday's Weather provides - nothing more.
		Baked into them are all sorts of assumptions about the nature of
		the team's task, the capability of the team, and whether the team
		are optimistic or pessimistic estimators. Once you try to come up
		with a standard across teams you are trying to normalize all of
		these factors. Trying to do this sounds very hard to me, and I'm
		not aware of anyone who has done this effectively. This doesn't
		mean its impossible, it just means it's hard.&lt;/p&gt;

&lt;p&gt;The dangerous aspect comes from once you have a standard unit for
	measurement across teams, someone is inevitably going to use it to
	compare the performance of teams. Even if everyone swears till they
	are blue in the face that they won't use it for cross team
	measurement, there will always be the suspicion that this will
	happen eventually. This will cause teams to distort their
	measurements so that it seems that they get more story points
	done. My fear is that this will break the feedback loop of
	yesterday's weather and knock the planning process off kilter. I'm
	always suspicious about these things because while it would be
	incredibly valuable to have a way to measure productivity I think
		the nature of software is such that we &lt;a href="http://martinfowler.com/bliki/CannotMeasureProductivity.html"&gt;CannotMeasureProductivity&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So to be worth trying, this has to yield some valuable benefits -
	but I don't see any. One reason that I've heard is to help people
	move onto teams and estimate more quickly. But you can't estimate on
	a new team until you get reasonably familiar with the problem and
	the current code base. As you do that you'll also get a feel for the
	relative sizes of story points on that team. We move people around
	between projects at ThoughtWorks and I've never heard anyone
	complain about difficulty of estimating when coming onto a new team
	due to differences in story points.&lt;/p&gt;

&lt;p class="repost"&gt;reposted on 10 May 2012&lt;/p&gt;
</content>
  </entry><entry>
    <title>Bliki: OrmHate</title>
    <link href="http://martinfowler.com/bliki/OrmHate.html"/>
    <updated>2012-05-08T11:31:00-04:00</updated>
    <id>http://martinfowler.com/bliki/OrmHate.html</id>
    <category term="bliki"/>
    <content type="html">
&lt;p&gt;While I was at the QCon conference in London a couple of months
  ago, it seemed that every talk included some snarky remarks about
  Object/Relational mapping (ORM) tools. I guess I should read the
  conference emails sent to speakers more carefully, doubtless there
  was something in there telling us all to heap scorn upon ORMs at
  least once every 45 minutes. But as you can tell, I want to push
  back a bit against this ORM hate - because I think a lot of it is unwarranted.&lt;/p&gt;

&lt;p&gt;The charges against them can be summarized in that they are
  complex, and provide only a leaky abstraction over a relational data
  store. Their complexity implies a grueling learning curve and often
  systems using an ORM perform badly - often due to naive interactions
  with the underlying database.&lt;/p&gt;

&lt;p&gt;There is a lot of truth to these charges, but such charges miss a
  vital piece of context. The object/relational mapping problem is
  &lt;i&gt;hard&lt;/i&gt;. Essentially what you are doing is synchronizing between
  two quite different representations of data, one in the relational
  database, and the other in-memory. Although this is usually referred
  to as object-relational mapping, there is really nothing to do with
  objects here. By rights it should be referred to as
  in-memory/relational mapping problem, because it's true of mapping
  RDBMSs to any in-memory data structure. In-memory data structures
  offer much more flexibility than relational models, so to program
  effectively most people want to use the more varied in-memory
  structures and thus are faced with mapping that back to relations
  for the database.&lt;/p&gt;
&lt;img height="395" src="http://martinfowler.com/bliki/images/ormHate/sketch.png" width="540"/&gt;
&lt;p&gt;The mapping is further complicated because you can make changes
  on either side that have to be mapped to the other. More
  complication arrives since you
  can have multiple people accessing and modifying the database
  simultaneously. The ORM has to handle this concurrency because you can't just rely
  on transactions- in most cases, you can't hold transactions
  open while you fiddle with the data in-memory.&lt;/p&gt;

&lt;p&gt;I think that if you're going to dump on something in the
    way many people do about ORMs, you have to state the alternative.
    What do you do instead of an ORM? The cheap shots I usually hear
    ignore this, because this is where it gets messy. Basically it
    boils down to two strategies, solve the problem differently (and
    better), or avoid the problem.  Both of these have significant
    flaws.&lt;/p&gt;
&lt;hr class="topSection"/&gt;
&lt;h2 id="ABetterSolution"&gt;A better solution&lt;/h2&gt;

&lt;p&gt;Listening to some critics, you'd think that the best thing for a
    modern software developer to do is roll their own ORM. The
    implication is that tools like
    Hibernate and Active Record have just become bloatware, so you
    should come up
    with your own lightweight alternative. Now I've spent many an hour
    griping at bloatware, but ORMs really don't fit the bill - and I say
    this with bitter memory. For much of the 90's I saw project after
    project deal with the object/relational mapping problem by writing
    their own framework - it was always much tougher than people
    imagined. Usually you'd get enough early success to commit deeply to
    the framework and only after a while did you realize you were in a
    quagmire - this is where I sympathize greatly with Ted Neward's
    famous quote that object-relational mapping is the &lt;a href="http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx"&gt;Vietnam
    of Computer Science&lt;/a&gt;&lt;a href="#footnote-vietnam"&gt;[1]&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The widely available open source ORMs (such as iBatis, Hibernate,
    and Active Record) did a great deal to remove this problem &lt;a href="#footnote-oss"&gt;[2]&lt;/a&gt;.
    Certainly they are not trivial tools to use, as I said the
    underlying problem is hard, but you don't have to deal with the full
    experience of writing that stuff (the horror, the horror). However much
    you may hate using an ORM, take my word for it - you're better off.&lt;/p&gt;

&lt;p&gt;I've often felt that much of the frustration with ORMs is about
    inflated expectations. Many people treat the relational database "like a
    crazy aunt who's shut up in an attic and whom nobody wants to talk
    about"&lt;a href="#footnote-aunt"&gt;[3]&lt;/a&gt;. In this world-view they just want to deal
    with in-memory data-structures and let the ORM deal with the
    database. This way of thinking can work for small applications and
    loads, but it soon falls apart once the going gets tough.
    Essentially the ORM can handle about 80-90% of the mapping problems,
    but that last chunk always needs careful work by somebody who really
    understands how a relational database works.&lt;/p&gt;

&lt;p&gt;This is where the criticism comes that ORM is a leaky
    abstraction. This is true, but isn't necessarily a reason to avoid
    them. Mapping to a relational database involves lots of repetitive,
    boiler-plate code. A framework that allows me to avoid 80% of that
    is worthwhile even if it is only 80%. The problem is in me for
    pretending it's 100% when it isn't. David Heinemeier Hansson, of
    Active Record fame, has always argued that if you are writing an
    application backed by a relational database you should damn well
    know how a relational database works. Active Record is designed with
    that in mind, it takes care of boring stuff, but provides manholes
    so you can get down with the SQL when you have to. That's a far
    better approach to thinking about the role an ORM should play.&lt;/p&gt;

&lt;p&gt;There's a consequence to this more limited expectation of what
    an ORM should do. I often hear people complain that they are
    forced to compromise their object model to make it more relational
    in order to please the ORM. Actually I think this is an inevitable consequence
    of using a relational database - you either have to make your
    in-memory model more relational, or you complicate your mapping
    code. I think it's perfectly reasonable to have a
    more relational domain model in order to simplify your
    object-relational mapping. That doesn't mean you should always
    follow the relational model exactly, but it does mean that you
    take into account the mapping complexity as part of your domain
    model design.&lt;/p&gt;

&lt;p&gt;So am I saying that you should always use an existing ORM rather
    than doing something yourself? Well I've learned to always avoid
    saying "always". One exception that comes to mind is when you're
    only reading from the database. ORMs are complex because they
    have to handle a bi-directional mapping. A uni-directional problem is
    much easier to work with, particularly if your needs aren't too
    complex and you are comfortable with SQL. This is one of the
    arguments for &lt;a href="http://martinfowler.com/bliki/CQRS.html"&gt;CQRS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So most of the time the mapping is a complicated problem, and
    you're better off using an admittedly complicated tool than starting a
    land war in Asia. But then there is the second alternative I
    mentioned earlier - can you avoid the problem?&lt;/p&gt;
&lt;hr class="topSection"/&gt;
&lt;h2 id="AvoidingTheProblem"&gt;Avoiding the problem&lt;/h2&gt;

&lt;p&gt;To avoid the mapping problem you have two alternatives. Either you use
    the relational model in memory, or you don't use it in the database.&lt;/p&gt;

&lt;p&gt;To use a relational model in memory basically means programming
    in terms of relations, right the way through your application. In
    many ways this is what the 90's CRUD tools gave you. They work very
    well for applications where you're just pushing data to the screen
    and back, or for applications where your logic is well expressed in
    terms of SQL queries. Some problems are well suited for this
    approach,  so if you can do this, you should. But
    its flaw is that often you can't.&lt;/p&gt;

&lt;p&gt;When it comes to not using relational databases on the disk, there
    rises a whole bunch of new champions and old memories. In the 90's
    many of us (yes including me) thought that object databases would
    solve the problem by eliminating relations on the disk. We all know
    how that worked out. But there is now the new crew of &lt;a href="http://martinfowler.com/nosql.html"&gt;NoSQL&lt;/a&gt;
    databases - will these allow us to finesse the ORM quagmire and 
    allow us to shock-and-awe our data storage?&lt;/p&gt;

&lt;p&gt;&lt;a href="http://martinfowler.com/bliki/NosqlDistilled.html"&gt;As you might have gathered&lt;/a&gt;, I think NoSQL is technology to be
    taken very seriously. If you have an application problem that maps
    well to a NoSQL data model - such as &lt;a href="http://martinfowler.com/bliki/AggregateOrientedDatabase.html"&gt;aggregates&lt;/a&gt; or graphs - then you
    can avoid the nastiness of mapping completely. Indeed this is often
    a reason I've heard teams go with a NoSQL solution. This is, I
    think, a viable route to go - hence my interest in increasing our
    understanding of NoSQL systems. But even so it only works when the
    fit between the application model and the NoSQL data model is good.
    Not all problems are technically suitable for a NoSQL database. And
    of course there are many situations where you're stuck with a
    relational model anyway. Maybe it's a corporate standard that you
    can't jump over, maybe you can't persuade your colleagues to accept
    the risks of an immature technology. In this case you can't avoid
    the mapping problem.&lt;/p&gt;

&lt;p&gt;So ORMs help us deal with a very real problem for most enterprise
    applications. It's true they are often misused, and sometimes the
    underlying problem
    can be avoided. They aren't pretty tools, but then the problem they
    tackle isn't exactly cuddly either. I think they deserve a little
    more respect and a lot more understanding.&lt;/p&gt;

&lt;div class="footnote-list"&gt;
&lt;div class="footnote-list-item" id="footnote-vietnam"&gt;
&lt;p&gt;&lt;span class="num"&gt;1: &lt;/span&gt;
      I have to confess a deep sense of conflict with the Vietnam
      analogy. At one level it seems like a case of the pathetic
      overblowing of software development's problems to compare a
      tricky technology to war. Nasty the programming may be, but
      you're still in a relatively comfy chair, usually with air
      conditioning, and bug-hunting doesn't involve bullets coming at
      you. But on another level, the phrase certainly resonates with
      the feeling of being sucked into a quagmire.
    &lt;/p&gt;
&lt;/div&gt;

&lt;div class="footnote-list-item" id="footnote-oss"&gt;
&lt;p&gt;&lt;span class="num"&gt;2: &lt;/span&gt;
      There were also commercial ORMs, such as TOPLink and Kodo. But the
      approachability of open source tools meant they became dominant.
    &lt;/p&gt;
&lt;/div&gt;

&lt;div class="footnote-list-item" id="footnote-aunt"&gt;
&lt;p&gt;&lt;span class="num"&gt;3: &lt;/span&gt;
      I like &lt;a href="http://www.amazon.com/gp/product/0321127420?ie=UTF8&amp;amp;tag=martinfowlerc-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321127420"&gt;this phrase&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=martinfowlerc-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0321601912" style="border:none !important; margin:0px !important;" width="1"/&gt; so much I feel
      compelled to subject it to re-use.
    &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry><entry>
    <title>photostream 24</title>
    <link href="http://martinfowler.com/photos/24.html"/>
    <updated>2012-05-05T10:04:00-04:00</updated>
    <id>tag:martinfowler.com,2012-05-05:photostream-24</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/24.html'&gt;&lt;img src = 'http://martinfowler.com/photos/24.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Boston, MA&lt;/p&gt;
</content>
  </entry><entry>
    <title>Retreaded: PublishedInterface</title>
    <link href="http://martinfowler.com/bliki/PublishedInterface.html"/>
    <updated>2012-05-03T10:18:00-04:00</updated>
    <id>tag:martinfowler.com,2012-05-03:Retreaded--PublishedInterface</id>
    <category term=""/>
    <content type="html">
&lt;p class = 'original'&gt;&lt;a href = 'http://martinfowler.com/bliki/Retread.html'&gt;Retread&lt;/a&gt; of post orginally made on 26 Dec 2003&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Published Interface&lt;/i&gt; is a term I used (first in &lt;a href="http://martinfowler.com/books.html#refactoring"&gt;Refactoring&lt;/a&gt;)
to refer to a class interface that's used outside the code base that
it's defined in. As such it means more than public in Java and indeed
even more than a non-internal public in C#. In my column for IEEE
Software I argued
that &lt;a href="http://martinfowler.com/ieeeSoftware/published.pdf"&gt;the distinction between published and public is actually more
important than that between public and private.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The reason is that with a non-published interface you can change
it and update the calling code since it is all within a single code
base. Such things as renames can be done, and done easily with modern
refactoring tools. But anything published so you can't reach the
calling code needs more complicated treatment.&lt;/p&gt;

&lt;p class="repost"&gt;reposted on 03 May 2012&lt;/p&gt;
</content>
  </entry><entry>
    <title>Bliki: TestPyramid</title>
    <link href="http://martinfowler.com/bliki/TestPyramid.html"/>
    <updated>2012-05-01T11:27:00-04:00</updated>
    <id>http://martinfowler.com/bliki/TestPyramid.html</id>
    <category term="bliki"/>
    <content type="html">
&lt;p&gt;The test pyramid is a concept developed by &lt;a href="http://www.mountaingoatsoftware.com/"&gt;Mike Cohn&lt;/a&gt;, described
  in his book &lt;a href="http://www.amazon.com/gp/product/0321579364?ie=UTF8&amp;amp;tag=martinfowlerc-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321579364"&gt;Succeeding with
  Agile&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=martinfowlerc-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0321601912" style="border:none !important; margin:0px !important;" width="1"/&gt;. Its essential point is that you should have many more
  low-level unit tests than high level end-to-end tests running
  through a GUI.&lt;/p&gt;
&lt;img height="373" src="http://martinfowler.com/bliki/images/testPyramid/pyramid.png" width="540"/&gt;
&lt;p&gt;For much of my career test automation meant tests that drove an
  application through its user-interface. Such tools would often
  provide the facility to record an interaction with the application
  and then allow you to play back that interaction, checking that the
  application returned the same results. Such an approach works well
  initially. It's easy to record tests, and the tests can be recorded
  by people with no knowledge of programming.&lt;/p&gt;

&lt;p&gt;But this kind of approach quickly runs into trouble, becoming an
  &lt;a href="http://watirmelon.com/2012/01/31/introducing-the-software-testing-ice-cream-cone/"&gt;ice-cream cone&lt;/a&gt;. Testing
  through the UI like this is slow, increasing build times. Often it
  requires installed licences for the test automation software, which
  means it can only be done on particular machines. Usually these cannot
  easily be run in a "headless" mode, monitored by scripts to put in a
  proper deployment pipeline.&lt;/p&gt;

&lt;p&gt;Most importantly such tests are very brittle. An enhancement to
  the system can easily end up breaking lots of such tests, which then
  have to be re-recorded. You can reduce this problem by abandoning
  record-playback tools, but that makes the tests harder to write.
  &lt;a href="#footnote-record-playback"&gt;[1]&lt;/a&gt; Even with good practices on
  writing them, end-to-end tests are more prone to &lt;a href="http://martinfowler.com/bliki/../articles/nonDeterminism.html"&gt;non-determinism problems&lt;/a&gt;,
  which can undermine trust in them. In short, tests that run end-to-end through the UI are:
  brittle, expensive to write, and time consuming to run. So the
  pyramid argues that you should do much more automated testing
  through unit tests than you should through traditional GUI based
  testing.&lt;/p&gt;

&lt;p&gt;The pyramid also argues for an intermediate layer of tests that
  act through a service layer of an application, what I refer to as
  &lt;a href="http://martinfowler.com/bliki/SubcutaneousTest.html"&gt;SubcutaneousTests&lt;/a&gt;. These can provide many of the
  advantages of end-to-end tests but avoid many of the complexities of
  dealing with UI frameworks. In web applications this would correspond
  to testing through an API layer while the top UI part of the pyramid
  would correspond to tests using something like &lt;a href="http://seleniumhq.org/"&gt;Selenium&lt;/a&gt; or Sahi..&lt;/p&gt;

&lt;p&gt;The test pyramid comes up a lot in Agile testing circles and
  while its core message is sound, there is much more to say
  about building a well-balanced test portfolio. In particular a
  common problem is that teams conflate the concepts of end-to-end
  tests, UI tests, and customer facing tests. These are all orthogonal
  characteristics. For example a rich javascript UI should have most
  of its UI behavior tested with javascript unit tests using something
  like &lt;a href="http://pivotal.github.com/jasmine/"&gt;Jasmine&lt;/a&gt;. A
  complex set of business rules could have tests captured in a
  customer-facing form, but run just on the relevant module much as
  unit tests are.&lt;/p&gt;

&lt;p&gt;In particular I always argue that high-level tests are there as a
  second line of test defense. If you get a failure in a high level
  test, not just do you have a bug in your functional code, you also
  have a missing unit test. Thus whenever you fix a failing end-to-end
  test, you should be adding unit tests too.&lt;/p&gt;

&lt;div class="footnote-list"&gt;
&lt;div class="footnote-list-item" id="footnote-record-playback"&gt;
&lt;p&gt;&lt;span class="num"&gt;1: &lt;/span&gt;
      Record-playback tools are almost always a bad idea for any kind
      of automation, since they resist changeability and obstruct
      useful abstractions. They are only worth having as a tool to
      generate fragments of scripts which you can then edit as a
      proper programming language, in the manner of &lt;a href="http://www.thoughtworks-studios.com/twist-agile-testing"&gt;Twist&lt;/a&gt;
      or &lt;a href="http://www.gnu.org/software/emacs/manual/html_node/emacs/Save-Keyboard-Macro.html"&gt;Emacs&lt;/a&gt;.
    &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry><entry>
    <title>photostream 23</title>
    <link href="http://martinfowler.com/photos/23.html"/>
    <updated>2012-04-27T21:10:00-04:00</updated>
    <id>tag:martinfowler.com,2012-04-27:photostream-23</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/23.html'&gt;&lt;img src = 'http://martinfowler.com/photos/23.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Middleton Place, Charleston, SC&lt;/p&gt;
</content>
  </entry><entry>
    <title>An English Literature Podcast</title>
    <link href="http://martinfowler.com/snips/201204261902.html"/>
    <updated>2012-04-26T19:02:00-04:00</updated>
    <id>tag:martinfowler.com,2012-04-26:An-English-Literature-Podcast</id>
    <category term=""/>
    <content type="html">&lt;p&gt;I&amp;#8217;ve added another &lt;a href='http://martinfowler.com/bliki/Podcasts.html'&gt;recommended podcast to my list&lt;/a&gt;, this one a is a treasure if you enjoy good fiction. &lt;a href='http://www.reallylikethisbook.com/'&gt;Why I Really Like This Book&lt;/a&gt; is a quirky sail through the lesser known waters of English Literature. The pilot is Kate Macdonald, who teaches English Literature but was frustrated at the limited range of books she could cover. Each podcast spends ten minutes or so exploring a single suggested book. Her first series was a random alphabetical wander, now she&amp;#8217;s taken to talking about sets of five books with a common theme. Recent sets include Five Appalling Fictional Women and Five Classic Detective Novels. If you&amp;#8217;re looking for ideas for books to curl up with, this is an excellent source of suggestions.&lt;/p&gt;</content>
  </entry><entry>
    <title>Retreaded: CustomerAffinity</title>
    <link href="http://martinfowler.com/bliki/CustomerAffinity.html"/>
    <updated>2012-04-26T09:55:00-04:00</updated>
    <id>tag:martinfowler.com,2012-04-26:Retreaded--CustomerAffinity</id>
    <category term=""/>
    <content type="html">
&lt;p class = 'original'&gt;&lt;a href = 'http://martinfowler.com/bliki/Retread.html'&gt;Retread&lt;/a&gt; of post orginally made on 28 Jul 2006&lt;/p&gt;

&lt;p&gt;When someone is looking at what makes up a top-class enterprise
	software developer, often the conversation may turn to knowledge of
	frameworks and languages, or perhaps the ability to understand
	complicated algorithms and data structures. For me, one of the most
	important traits in a programmer, or indeed in a development team,
	is something that I'll call Customer Affinity. This is the interest
	and closeness that the developers have in the business problem that
	the software is addressing, and in the people who live in that
	business world.&lt;/p&gt;

&lt;p&gt;There are many aspects to customer affinity. The first one is
	just the interest in the business, its processes and rules. I've
	always been fascinated by domains I've worked in: health care,
	derivatives, payroll, leasing - are all examples of really
	interesting domain problems with a lot of complexity that has to be
	organized and understood. For me aspects of a project such as
	object-relational mapping, remote process communication - what I
	think of as the plumbing of enterprise systems, don't have that same
	interest.&lt;/p&gt;

&lt;p&gt;It's important that a team has the plumbing working and under
control, but I believe that the more energy goes into the business
problem, the more effective at providing value a team will be. Which
is a good reason to use frameworks that solve and simplify as much of
the plumbing as possible.&lt;/p&gt;

&lt;p&gt;Another aspect of customer affinity is the ability to
	collaborate with domain experts. I don't think that detailed
	knowledge of the domain is an important thing for programmers to
	have; useful yes, but not important. What's more critical than
	knowledge is the ability to collaborate with those that have the
	knowledge.&lt;/p&gt;

&lt;p&gt;My high regard for customer affinity is one the main reasons why
	I'm such a fan of Extreme Programming and other agile methods. I
	found it very significant that when Kent Beck summarized XP to his
	agile peers at the snowbird workshop which coined 'agile', he chose
	to describe not the technical elements of XP, but his desire to
	change the nature of the customer/developer interaction.&lt;/p&gt;

&lt;p&gt;I've often heard this relationship mis-characterized. In
particular there is a belief in some quarters that the customer team
just comes up with stories which they throw at the developers. This
characterization is rather like the notion that requirements are just
lying out there to be gathered. Either way that's
not much of a collaboration. Instead developers need to work together
with domain people to
generate ideas with developers learning a lot about the business in
the process. &lt;/p&gt;

&lt;p&gt;One of Kent's suggested names for 'Agile' was
&lt;i&gt;conversational&lt;/i&gt; software development - the point being that it's
a two way communication. This isn't something like a telecoms protocol
that you can define, but the back and forth discussions about how
software can enhance the business are where the real value
lives. Much of this conversation is of half-baked ideas, some of which
grow into valuable features - often ones that aren't things that the
customer originally thought of.&lt;/p&gt;

&lt;p&gt;One of the things that frustrates me is how organizations often
	try to squelch customer affinity. It's not something people admit to
	doing, but it's a common consequence of other
	decisions. Organizational barriers can contribute to squelching -
	I've come across places where
	you have to get your manager to arrange with another manager just so
	you can have a conversation with someone on the business side. That
	hardly encourages you to get inside the workings of the business.&lt;/p&gt;

&lt;p&gt;I've often heard it said that enterprise software is boring, just
	shuffling data around, that people of talent will do "real" software
	that requires fancy algorithms, hardware hacks, or plenty of
	math. I feel that this usually  happens
	due to a lack of customer affinity. The real intellectual challenge
	of business software is figuring out what the real
	contribution of software can be to a business. You need both good
	technical and business knowledge to find that.  Working closely with
	business people to develop this knowledge, and
	&lt;a href="http://martinfowler.com/bliki/PleasingTheCustomer.html"&gt;PleasingTheCustomer&lt;/a&gt; as you do it, is  what makes
	enterprise software development fun - and motivation is the key to good
	and productive work.&lt;/p&gt;

&lt;p&gt;There are plenty of bright and capable people who want to learn
	about the businesses they write software for. Too often
	organizations make it hard for them to do so. Until that changes,
	our profession will continue to under-deliver on our potential.&lt;/p&gt;

&lt;p class="repost"&gt;reposted on 26 Apr 2012&lt;/p&gt;
</content>
  </entry><entry>
    <title>Bliki: EditingPublishingSeparation</title>
    <link href="http://martinfowler.com/bliki/EditingPublishingSeparation.html"/>
    <updated>2012-04-24T10:41:00-04:00</updated>
    <id>http://martinfowler.com/bliki/EditingPublishingSeparation.html</id>
    <category term="bliki"/>
    <content type="html">
&lt;p&gt;In my conversations with ThoughtWorks project teams over the last
  year or so, a regular theme has been the growing impact of content
  management systems (CMS). They aren't usually seen as helpful,
  indeed there is a clear sign that they are becoming a worryingly
  invasive tool - used for more than their core purpose in such a
  manner that they hinder overall development. &lt;/p&gt;

&lt;p&gt;Amongst the other irritations, a common failing is that they keep
  one copy of each article&lt;a href="#footnote-article"&gt;[1]&lt;/a&gt;. This single copy
  is edited as part of creating the content and published to readers
  (usually on some kind of state-change flag).&lt;/p&gt;

&lt;p&gt;The idea of keeping a single copy of some piece of data is a
  common one. It's the underlying principle behind the relational
  concept of normalization, and enterprise architects often try to
  ensure that critical data has a single authoritative copy.&lt;/p&gt;

&lt;p&gt;Yet for a CMS there's a clear downside - the data access patterns
  for editing and publication are very different. Editing involves
  small number of people frequently accessing the article, doing both
  reads and updates. Publishing involves many more people (we hope)
  accessing the article, but all doing reads. There are some edits
  done to fix problems in published articles, but these are far fewer
  than the reads and are from a well-controlled group of people.&lt;/p&gt;

&lt;p&gt;With two such different access paths, a few CMSs keep separate
  copies of the articles, controlled by relatively independent
  modules. The editing module is geared around the frequent updates,
  it provides support for editing, tracking changes and monitoring the
  workflow of the editing process. When an article is published it's
  copied over the publishing module.&lt;/p&gt;
&lt;img height="272" src="http://martinfowler.com/bliki/images/editingPublishing/edit-pub.png" width="540"/&gt;
&lt;p&gt;The publishing module treats the article as largely read-only,
  updated rarely and only by the editing module. Consequently the
  publishing module is designed around serving that article to a large
  number of readers. At the least this involves a different
  configuration of the data storage. The publishing module can be
  freely replicated across many nodes in a cluster, while it's usually
  better for the editing module to be centralized on a single node.
  There's also an argument for different data storage technology,
  allowing each module to use something appropriate to its access patterns.&lt;/p&gt;

&lt;p&gt;The articles can also be stored in different formats. Often
  articles are edited in one form but published in another, such as
  editing in markdown and publishing in html. In this case the editing
  module should store the markdown form while the publishing module
  stores html. The publishing module can also do some page composition
  work on the stored copy. So if you have a static header, this can be
  added to the stored article's html when the article is published,
  saving the effort of recomposing it for every read.&lt;a href="#footnote-precompose"&gt;[2]&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Separating these modules can also help with the editing workflow.
  Often people want to preview changes before publishing to the world,
  this is easy to do with the separation because you can publish to a
  private publishing module in a staging area. This can nicely finesse
  otherwise awkward logic to figure out what to publish from single
  storage.&lt;/p&gt;

&lt;p&gt;User-generated content does add something of a wrinkle to this
  approach. A wiki, which is entirely user-generated, is going to have
  a larger and less-well controlled group of editors than a curated
  site. Similarly reader comments will come from a wider range of
  writers. But even with user-generated content you should get many
  more readers than writers, so it makes sense to separate handling updates
  from serving published pages.&lt;/p&gt;

&lt;p&gt;Teams that use the rare systems that support editing-publishing
  separation find it works very well and most teams who use tools that
  don't have this style think it would improve things. If you're
  evaluating a CMS, or building one for your own needs, you should
  certainly consider editing-publishing separation as a key feature to
  look for.&lt;/p&gt;

&lt;div class="footnote-list"&gt;
&lt;div class="footnote-list-item" id="footnote-article"&gt;
&lt;p&gt;&lt;span class="num"&gt;1: &lt;/span&gt;
      I'm using "article" here to mean any item of content that the
      CMS manages.
    &lt;/p&gt;
&lt;/div&gt;

&lt;div class="footnote-list-item" id="footnote-precompose"&gt;
&lt;p&gt;&lt;span class="num"&gt;2: &lt;/span&gt;
      This does mean that any change to the header would require all
      the published articles to be rebuilt. Usually this would not be
      an issue compared to composing the page for each read.
    &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry><entry>
    <title>photostream 22</title>
    <link href="http://martinfowler.com/photos/22.html"/>
    <updated>2012-04-17T15:35:00-04:00</updated>
    <id>tag:martinfowler.com,2012-04-17:photostream-22</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/22.html'&gt;&lt;img src = 'http://martinfowler.com/photos/22.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;London&lt;/p&gt;
</content>
  </entry><entry>
    <title>Bliki: TestCoverage</title>
    <link href="http://martinfowler.com/bliki/TestCoverage.html"/>
    <updated>2012-04-17T11:17:00-04:00</updated>
    <id>http://martinfowler.com/bliki/TestCoverage.html</id>
    <category term="bliki"/>
    <content type="html">
&lt;p&gt;From time to time I hear people asking what value of test coverage (also
  called code coverage) they should aim for, or stating their coverage
  levels with pride. Such statements miss the point. Test coverage is
  a useful tool for finding untested parts of a codebase. Test
  coverage is of little use as a numeric statement of how good your
  tests are.&lt;/p&gt;
&lt;img height="185" src="http://martinfowler.com/bliki/images/testCoverage/sketch.png" width="540"/&gt;
&lt;p&gt;Let's look at the second statement first. I've heard of places
  that may say things like "you can't go into production with less
  than 87% coverage". I've heard some people say that you should use
  things like TDD and must get 100% coverage. A wise man once
  said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I expect a high level of coverage. Sometimes managers require
    one. There's a subtle difference.&lt;/p&gt;

&lt;p class="quote-attribution"&gt;-- Brian Marick&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you make a certain level of coverage a target, people will try
  to attain it. The trouble is that high coverage numbers are too easy
  to reach with low quality testing. At the most absurd level you have
  &lt;a href="http://martinfowler.com/bliki/AssertionFreeTesting.html"&gt;AssertionFreeTesting&lt;/a&gt;. But even without that you get lots
  of tests looking for things that rarely go wrong distracting you
  from testing the things that really matter. &lt;/p&gt;

&lt;p&gt;Like most aspects of programming, testing requires
  thoughtfulness. TDD is a very useful, but certainly not sufficient,
  tool to help you get good tests. If you are testing thoughtfully and
  well, I would expect a coverage percentage in the upper 80s or 90s.
  I would be suspicious of anything like 100% - it would smell of
  someone writing tests to make the coverage numbers happy, but not
  thinking about what they are doing.&lt;/p&gt;

&lt;p&gt;The reason, of course, why people focus on coverage numbers is
  because they want to know if they are testing enough. Certainly low
  coverage numbers, say below half, are a sign of trouble. But high
  numbers don't necessarily mean much, and lead to &lt;a href="http://blog.sriramnarayan.com/2011/04/dashboards-promote-ignorance.html"&gt;ignorance-promoting
  dashboards&lt;/a&gt;. Sufficiency of testing is much more complicated
  attribute than coverage can answer. I would say you are doing enough
  testing if the following is true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You rarely get bugs that escape into production, &lt;b&gt;and&lt;/b&gt;&lt;/li&gt;

&lt;li&gt;You are rarely hesitant to change some code for fear it will
  cause production bugs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Can you test too much? Sure you can. You are testing too much if
you can remove tests while still having enough. But this is a
difficult thing to sense. One sign you are testing too much is if
your tests are slowing you down. If it seems like a simple change to
code causes excessively long changes to tests, that's a sign that
there's a problem with the tests. This may not be so much that you are
testing too many things, but that you have duplication in your tests.&lt;/p&gt;

&lt;p&gt;Some people think that you have too many tests if they take too
long to run. I'm  less convinced by this argument. You can always move
slow tests to a later stage in your deployment pipeline, or even pull
them out of the pipeline and run them periodically. Doing these things
will slow down the feedback from those tests, but that's part of the
trade-off of build times versus test confidence.&lt;/p&gt;

&lt;p&gt;So what is the value of coverage analysis again? Well it helps you
find which bits of your code aren't being tested. &lt;a href="#footnote-devs"&gt;[1]&lt;/a&gt; It's worth running
coverage tools every so often and looking at these bits of untested
code. Do they worry you that they aren't being tested? &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If a part of your test suite is weak in a way that coverage can
  detect, it's likely also weak in a way coverage can't detect.&lt;/p&gt;

&lt;p class="quote-attribution"&gt;-- Brian Marick&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr class="topSection"/&gt;
&lt;h2 id="FurtherReading"&gt;Further Reading&lt;/h2&gt;

&lt;p&gt;Brian Marick has an excellent article on the &lt;a href="http://www.exampler.com/testing-com/writings/coverage.pdf"&gt;misuse
  of code coverage&lt;/a&gt;. And it's worth reading the &lt;a href="http://www.developertesting.com/archives/month200705/20070504-000425.html"&gt;pithy commentary of Testivus&lt;/a&gt;.&lt;/p&gt;

&lt;div class="footnote-list"&gt;
&lt;div class="footnote-list-item" id="footnote-devs"&gt;
&lt;p&gt;&lt;span class="num"&gt;1: &lt;/span&gt;
    By "you" here I mean the people writing the tests. Coverage is of
    little value to management since you need a technical background
    to understand whether the tests are good or whether the uncovered
    code is a problem.
  &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry><entry>
    <title>Progress on NoSQL Distilled</title>
    <link href="http://martinfowler.com/snips/201204171042.html"/>
    <updated>2012-04-17T10:42:00-04:00</updated>
    <id>tag:martinfowler.com,2012-04-17:Progress-on-NoSQL-Distilled</id>
    <category term=""/>
    <content type="html">&lt;p&gt;Time for a progress report on &lt;a href='http://martinfowler.com/bliki/NosqlDistilled.html'&gt;NoSQL Distilled&lt;/a&gt;. We&amp;#8217;ve done a round of technical review and are now pretty happy with the text, happy enough to move it into production.&lt;/p&gt;

&lt;p&gt;Production for a book these days is both more complicated and more responsive than it used to be. The next step on the book text is to do copy-editing and indexing. It sounds like we are going to get the &lt;a href='http://www.kirsanov.com/'&gt;same people&lt;/a&gt; I worked with on &lt;a href='http://martinfowler.com/books.html#dsl'&gt;my DSL book&lt;/a&gt;, which will be excellent news since they did a good job and were happy to work directly on the XML source in my repository. This simplifies and speeds up the whole process. They will also do the book design and convert the book in camera-ready for printing the physical books.&lt;/p&gt;

&lt;p&gt;I suspect, however, that this book will see more electronic copies than physical ones. In parallel with the copy-editing we&amp;#8217;ll be preparing the electronic copies. We intend to do a rough-cut version of the book as soon as we can. This should be available through &lt;a href='http://www.informit.com/authors/bio.aspx?a=8877bf0c-92bd-4d0d-8317-d67fe8b88eee'&gt;InformIT&lt;/a&gt;, Amazon, and &lt;a href='http://my.safaribooksonline.com'&gt;Safari&lt;/a&gt;. I&amp;#8217;ll make further announcements here as these become visible.&lt;/p&gt;</content>
  </entry><entry>
    <title>Rebecca Parsons and I speak on The Evolving Panorama of Data</title>
    <link href="http://www.infoq.com/presentations/The-Evolving-Panorama-of-Data"/>
    <updated>2012-04-16T10:57:00-04:00</updated>
    <id>tag:martinfowler.com,2012-04-16:Rebecca-Parsons-and-I-speak-on-The-Evolving-Panorama-of-Data</id>
    <category term=""/>
    <content type="html">&lt;p&gt;Our keynote at QCon London 2012 looks at the role data is playing in our lives (and that it&amp;#8217;s doing more than just getting bigger).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How the world of data is changing: its growing, becoming more distributed and connected.&lt;/li&gt;

&lt;li&gt;The industry&amp;#8217;s response: the rise of NoSQL, the shift to service integration, the appearance of event sourcing, the impact of clouds and new analytics with a greater role for visualization.&lt;/li&gt;

&lt;li&gt;How data is being used now, with a particular emphasis from Rebecca on data in the developing world.&lt;/li&gt;

&lt;li&gt;What does all this mean to our personal responsibilities as software professionals.&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry><entry>
    <title>Jez Humble and I speak on Continuous Delivery at YOW</title>
    <link href="http://yow.eventer.com/events/1004/talks/1062"/>
    <updated>2012-02-14T15:46:00-05:00</updated>
    <id>tag:martinfowler.com,2012-02-14:Jez-Humble-and-I-speak-on-Continuous-Delivery-at-YOW</id>
    <category term=""/>
    <content type="html">&lt;div class = 'img'&gt;&lt;img src = 'http://martinfowler.com/img/yow-snap.png' width = '150' height = '' alt = '' title = ''/&gt;&lt;/div&gt;&lt;p&gt;Video of the one-hour overview presentation that Jez and I gave at YOW at the end of last year. We cover the rationale for Continuous Delivery, the deployment pipeline, continuous integration, devops, and deployment strategies. The highlight is Jez&amp;#8217;s personification of a release candidate as a hero in a greek myth.&lt;/p&gt;</content>
  </entry><entry>
    <title>photostream 21</title>
    <link href="http://martinfowler.com/photos/21.html"/>
    <updated>2012-02-12T18:32:00-05:00</updated>
    <id>tag:martinfowler.com,2012-02-12:photostream-21</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/21.html'&gt;&lt;img src = 'http://martinfowler.com/photos/21.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;E&#x300;ze, France&lt;/p&gt;
</content>
  </entry><entry>
    <title>Bliki: PresentationSmells</title>
    <link href="http://martinfowler.com/bliki/PresentationSmells.html"/>
    <updated>2012-02-09T08:16:00-05:00</updated>
    <id>http://martinfowler.com/bliki/PresentationSmells.html</id>
    <category term="bliki"/>
    <content type="html">
&lt;p&gt;I've given lots of presentations, and since I go to a lot of
  conferences I see a lot too. This means I see a lot of problems,
  where people are doing things that reduce the efficacy of their
  talks. I've not tried to come up with a comprehensive list, so the
  ones I'm raising here are just a few things off the top of my head.
  Like most smells, these aren't always wrong, but should always make
  you think.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Sentences on slides.&lt;/b&gt; I could say bullet points here, as
  that's the most common way to misuse slides by turning them into
  &lt;a href="http://martinfowler.com/bliki/Slideument.html"&gt;Slideuments&lt;/a&gt;. But I think the real rogue is the sentence. My approach
  with slides is to treat them as a &lt;a href="http://martinfowler.com/bliki/VisualChannel.html"&gt;VisualChannel&lt;/a&gt;,
  following this it's important that the audience is listening to the
  speaker for the flow of words. Reading sentences breaks that up.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Floodmarks.&lt;/b&gt; Lots of slides have repetitive elements on the
  slide master that show up on every slide, these include corporate
  logos, legal boilerplate (such as copyrights), occasionally even tag
  lines. The audience either tunes out the &lt;a href="http://presentationpatterns.com/glossary.html"&gt;floodmark&lt;/a&gt; (which
  makes them useless) or is distracted by them (which is worse). I
  recommend you only put logos and the like on the first and last
  slide, that's quite enough to get them noticed, but not enough to be
  distracting. You only need a copyright statement on one slide - and
  even then I'd argue you don't really need it.&lt;a href="#footnote-copyright"&gt;[1]&lt;/a&gt; Are your slides really so amazing that you'll lose a
  fortune if someone copies them?&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Repetitive Pointer Movement.&lt;/b&gt; It's wise to always carry
  a laser pointer when giving a talk - indeed I suggest a combined
  remote-clicker laser device. But if you find yourself pointing to
  the same sequence of things every time you give the talk, then you
  should put that pointer sequence into the slides themselves. This
  may be as simple as an arrow or a highlight on the existing slides,
  or it may be rethinking the slides themselves to help bring out the
  point better.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Backtracking Slides.&lt;/b&gt; If you find yourself going back to a
  previous slide, that indicates the slide sequence isn't right.
  Instead you should copy the slide so that you keep going forwards
  through the deck. Once you've copied it, you can then think about
  whether it should be a true copy, or whether it should look
  different when used again in order to highlight how you are using it
  in the further sequence.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Slide Titles&lt;/b&gt; It seems to be mandatory that every slide has
  a title - but ask yourself if the slide's title is really needed.
  I've found I've often improved the visual channel by consciously removing slide
  titles.&lt;/p&gt;

&lt;p&gt;Having said all this, the most important thing is your content.
  If the content isn't solid, or you don't really care about it, then
  even outstanding slidecraft isn't going to save you.
  Conversely an audience will forgive all sorts of crummy presentation
  techniques if you have interesting things to say. &lt;/p&gt;

&lt;div class="footnote-list"&gt;
&lt;div class="footnote-list-item" id="footnote-copyright"&gt;
&lt;p&gt;&lt;span class="num"&gt;1: &lt;/span&gt;
      In many places there is implied copyright, even if you don't
      have a statement on a document. Even so, it's wise to keep one
      on the document somewhere to make it easier should you need to
      enforce copyright. I have to say, however, that I haven't heard
      of anyone suing anyone over copyright infringement of a slide
      deck.
    &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry><entry>
    <title>ThoughtWorks recruiting event in New York</title>
    <link href="http://www.thoughtworks.com/events/get-hired-new-york-minute"/>
    <updated>2012-02-07T15:17:00-05:00</updated>
    <id>tag:martinfowler.com,2012-02-07:ThoughtWorks-recruiting-event-in-New-York</id>
    <category term=""/>
    <content type="html">&lt;p&gt;This weekend, ThoughtWorks is hold a recruiting event in New York City. The idea is to compress the whole recruiting cycle down to a single weekend. The coding problem will be on Saturday, and those that pass that hurdle will be invited back for interviews on Sunday. The idea is that we&amp;#8217;ll get job offers to any successful candidates by Sunday evening. I&amp;#8217;ll be there for the first couple of hours on Saturday.&lt;/p&gt;</content>
  </entry><entry>
    <title>Infodeck on NoSQL and Polyglot Persistence</title>
    <link href="http://martinfowler.com/articles/nosql-intro.pdf"/>
    <updated>2012-02-07T10:26:00-05:00</updated>
    <id>tag:martinfowler.com,2012-02-07:Infodeck-on-NoSQL-and-Polyglot-Persistence</id>
    <category term=""/>
    <content type="html">&lt;p&gt;Pramod and I have put together a short &lt;a href='http://martinfowler.com/articles/nosql-intro.pdf'&gt;infodeck&lt;/a&gt; (pdf) outlining the reasons why NoSQL databases are an important new dish on the software development menu. It&amp;#8217;s directed at non-technical managers and customers to provide an outline of why the data world has seen this new entrant and some direction as to the kinds of projects which should give them a closer look.&lt;/p&gt;</content>
  </entry><entry>
    <title>photostream 20</title>
    <link href="http://martinfowler.com/photos/20.html"/>
    <updated>2012-02-04T16:54:00-05:00</updated>
    <id>tag:martinfowler.com,2012-02-04:photostream-20</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/20.html'&gt;&lt;img src = 'http://martinfowler.com/photos/20.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Stowe, VT&lt;/p&gt;
</content>
  </entry><entry>
    <title>Rebecca and I will be Keynoting at QCon London</title>
    <link href="http://martinfowler.com/snips/201201261024.html"/>
    <updated>2012-01-26T10:24:00-05:00</updated>
    <id>tag:martinfowler.com,2012-01-26:Rebecca-and-I-will-be-Keynoting-at-QCon-London</id>
    <category term=""/>
    <content type="html">&lt;div class = 'img'&gt;&lt;img src = 'http://martinfowler.com/snips/rebecca.jpg' width = '150' height = '' alt = '' title = ''/&gt;&lt;/div&gt;&lt;p&gt;QCon invited &lt;a href='http://www.thoughtworks.com/rebecca-parsons'&gt;Rebecca&lt;/a&gt; and I to do a &lt;a href='http://qconlondon.com/london-2012/presentation/The%20Data%20Panorama'&gt;keynote at QCon London&lt;/a&gt; (March 7). Over the last year or so we&amp;#8217;ve been seeing more and more of a change in how organizations think about data, so that seems a natural choice to talk about. Our clients are seeing larger volumes of data, that they need to analyze more quickly and more cleverly. We&amp;#8217;re seeing &lt;a href='http://martinfowler.com/bliki/NosqlDefinition.html'&gt;different technologies for data storage&lt;/a&gt; that have loosened the vice-like grip of relational databases. And we find our profession needs to start thinking about what our responsibilities are in managing all of this information.&lt;/p&gt;</content>
  </entry><entry>
    <title>Rebecca and I talk about DSLs on Software Engineering Radio</title>
    <link href="http://www.se-radio.net/2012/01/episode-182-domain-specific-languages-with-martin-fowler-and-rebecca-parsons/"/>
    <updated>2012-01-26T09:36:00-05:00</updated>
    <id>tag:martinfowler.com,2012-01-26:Rebecca-and-I-talk-about-DSLs-on-Software-Engineering-Radio</id>
    <category term=""/>
    <content type="html">&lt;p&gt;I&amp;#8217;ve long been a fan of the podcast series &lt;a href='http://www.se-radio.net/'&gt;Software Engineering Radio&lt;/a&gt;. The team there have built an excellent series of podcasts on various aspects of software development and I often listen to them while taking my afternoon walk. So I&amp;#8217;m glad to get a spot on there myself. In this episode I&amp;#8217;m on the program with Rebecca Parsons, my colleague and co-author of my &lt;a href='http://martinfowler.com/books.html#dsl'&gt;DSL book&lt;/a&gt; to talk about DSLs. We talk about what DSLs are, the differences between internal and external DSLs, and when you should (and shouldn&amp;#8217;t use DSLs). The episode is hosted by &lt;a href='http://www.voelter.de/'&gt;Markus V&#xF6;lter&lt;/a&gt;, who, of course, is a considerable expert on DSLs too - so it&amp;#8217;s really a three way conversation on the topic.&lt;/p&gt;</content>
  </entry><entry>
    <title>Bliki: CharityCodeJam</title>
    <link href="http://martinfowler.com/bliki/CharityCodeJam.html"/>
    <updated>2012-01-25T09:39:00-05:00</updated>
    <id>http://martinfowler.com/bliki/CharityCodeJam.html</id>
    <category term="bliki"/>
    <content type="html">
&lt;p&gt;Over the last couple of years several of my colleagues have been
   organizing code jam&lt;a href="#footnote-name"&gt;[1]&lt;/a&gt; events where developers
   get together to write software for charitable causes. A good
   example is a regular code-jam in New York that works on &lt;a href="http://rapidftr.com"&gt;RapidFTR&lt;/a&gt;. Chris George, a ThoughtWorker
   based in New York, helped organize a one-off event in New York in
   August 2010. The group didn't get as much done on the day as they
   had hoped, but in a bar afterwards decided to try to get together
   more regularly. Since then they've been meeting every week. It's a
   small group, still mostly ThoughtWorkers and friends, with a core
   of 3-4 people rising to a dozen when we've had a big project in
   town.&lt;a href="#footnote-brazil"&gt;[2]&lt;/a&gt;. (Chris is happy to have more people
   join the group, so if you are interested &lt;a href="http://martinfowler.com/bliki/mailto:cgeorge@thoughtworks.com"&gt;drop him an email&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;Many people have found these events to an enjoyable way to use
  our skills for purposes that we find rather more fulfilling than
  many day jobs, and a way both to learn new skills and learn from a
  different group of people. So I thought I should share our thoughts
  on how to set one up.&lt;/p&gt;

&lt;p&gt;The first thing is to find a suitable effort to contribute to. We
  look to contribute to projects producing open-source software for
  NGOs - the open source model fits well for such organizations. The
  two that we've built up most of a relationship are RapidFTR and
  OpenMRS. &lt;a href="http://rapidftr.com/"&gt;RapidFTR&lt;/a&gt; is a system
  designed to help reunite families after a natural disaster or other
  calamity. It allows people to quickly input information about either
  a lost child, or a child found without parents - then provide search
  facilities to match them up. &lt;a href="http://openmrs.org/"&gt;OpenMRS&lt;/a&gt; is an open source medical records
  system, designed to support various forms of health care delivery
  work. It's used by many health care groups all over the world (and
  not just in the developing world). &lt;/p&gt;

&lt;p&gt;Like New York, most of our code-jams begin as one-off events,  a
  single evening or all day event. These days we advertise
  heavily, and hope to get a good sample of local developers to come
  along and take part. One-off code jams like this don't usually
  produce much useful software, since they are too short to really
  accomplish much. But they still have value. Firstly they generate
  awareness, exposing the local development community both to the
  specific project and the notion of working on open-source efforts
  for NGOs. More directly they can be the seed for an regular code
  jam, so it's useful to put together activities that will encourage
  getting back together later. &lt;/p&gt;

&lt;p&gt;A regular code jam gets together on a schedule, with core of
  people who come most weeks. Such a group can make some significant
  contributions to a code base. People come because they get to work
  on some different technologies, with a different group of
  co-developers, to an audience that (unlike most open-source
  projects) isn't just other developers.&lt;/p&gt;

&lt;p&gt;To make meaningful progress, you need someone to
  prepare for each code jam by breaking down work-items into something
  small enough that people will be able to finish them during the time
  at the jam. Whatever people may say and hope, they'll rarely work on
  the project outside code jam hours, and the schedule is too
  infrequent to want half-done things hanging over. Small tasks allow
  teams to make perceptible progress each jam - which helps keep
  motivation high. We like to put these tasks online before each event
  so people can prepare if they want to, or just get a feel for what
  we're working on. We also set up a mailing list to keep up regular
  communication on the jam and support anyone who does contribute
  outside of the jam.&lt;/p&gt;

&lt;p&gt;Our regular code-jams succeed best when the group has a couple of
  champions who take the lead in organizing the event. It's best to
  have more than one champion, to cope with the work load and provide some
  resilience if they are absent for a while.&lt;/p&gt;

&lt;p&gt;We try to ensure the development environment is set up to allow
  people to come in quickly and become productive. Much of this is the
  same kind of thing that we do on projects anyway to enable &lt;a href="http://martinfowler.com/articles/continuousIntegration.html"&gt;continuous
  integration&lt;/a&gt; - make sure that installation and build are
  automated so people can quickly install the code base and get it
  working. It's important to mention this in the advertisements for
  the event - people are often put off from coming due to a concern
  that they'll never get started due to these issues. Even so, make
  sure that each event has at least one person who is familiar with
  the code base and build environment, she can then help others find
  their way around. Often someone will give a short overview of what
  the system does and how it works for new people at the start of the
  jam.&lt;/p&gt;

&lt;p&gt;We usually provide food to each event - that's an easy thing
  for us to do as a corporate contribution. As any XPer knows,
  sharing food when working is an important part of gelling a team.&lt;/p&gt;

&lt;p&gt;So, if the idea of a code-jam appeals to you, why not give it a
  try? Find a suitable project to contribute to, a group of a few
  people to act as a core, and spend a few sessions to get things
  going. (There are developer guides for both &lt;a href="http://martinfowler.com/bliki/https://wiki.openmrs.org/display/docs/Getting+Started+as+a+Developer"&gt;OpenMRS&lt;/a&gt;
  and &lt;a href="http://www.rapidftr.com/developer"&gt;RapidFTR&lt;/a&gt; to
  help you get started if those projects appeal to you.) If you get
  going on a stable basis - post in a blog somewhere so we see what
  code-jams are avaialable and learn more about how to get them going.
  &lt;/p&gt;

&lt;div class="footnote-list"&gt;
&lt;div class="footnote-list-item" id="footnote-name"&gt;
&lt;p&gt;&lt;span class="num"&gt;1: &lt;/span&gt;
      "Code-jam" is a problematic name for these events. As far as I can
      determine, the term "code-jam" was originally used for
      competitive events where programmers would try to best their
      peers in some programming challenge. The events I describe here
      are the utter opposite of this, on many levels, but have
      attracted the same name.
    &lt;/p&gt;
&lt;/div&gt;

&lt;div class="footnote-list-item" id="footnote-brazil"&gt;
&lt;p&gt;&lt;span class="num"&gt;2: &lt;/span&gt;
      When one of the team went down to our Porto Alegre office, he got
  a group contributing there too. 
    &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry><entry>
    <title>photostream 19</title>
    <link href="http://martinfowler.com/photos/19.html"/>
    <updated>2012-01-22T19:49:00-05:00</updated>
    <id>tag:martinfowler.com,2012-01-22:photostream-19</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/19.html'&gt;&lt;img src = 'http://martinfowler.com/photos/19.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Boston, MA&lt;/p&gt;
</content>
  </entry><entry>
    <title>Bliki: AggregateOrientedDatabase</title>
    <link href="http://martinfowler.com/bliki/AggregateOrientedDatabase.html"/>
    <updated>2012-01-19T09:11:00-05:00</updated>
    <id>http://martinfowler.com/bliki/AggregateOrientedDatabase.html</id>
    <category term="bliki"/>
    <content type="html">
&lt;p&gt;One of the first topics to spring to mind as we worked on
  &lt;a href="http://martinfowler.com/bliki/NosqlDistilled.html"&gt;NosqlDistilled&lt;/a&gt; was that NoSQL databases use different
  data models than the relational model. Most sources I've looked at
  mention at least four groups of data model: key-value, document,
  column-family, and graph. Looking at
  this list, there's a big similarity between the first three - all
  have a fundamental unit of storage which is a rich structure of
  closely related data: for key-value stores it's the value, for
  document stores it's the document, and for column-family stores it's the
  column family. In DDD terms, this group of data is an &lt;a href="http://domaindrivendesign.org/node/88"&gt;aggregate&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The rise of NoSQL databases has been driven primarily by the
 desire to store data effectively on large clusters - such as the
 setups used by Google and Amazon. Relational databases were not
 designed with clusters in mind, which is why people have cast around
 for an alternative. Storing aggregates as fundamental units makes a
 lot of sense for running on a cluster. Aggregates make natural units
 for distribution strategies such as sharding, since you have a large
 clump of data that you expect to be accessed together.&lt;/p&gt;

&lt;p&gt;An aggregate also makes a lot of sense to an application
 programmer. If you're capturing a screenful of information and
 storing it in a relational database, you have to decompose that
 information into rows before storing it away. &lt;/p&gt;
&lt;img height="345" src="http://martinfowler.com/bliki/images/aggregateOrientedDatabase/aggregate-split.png" width="540"/&gt;
&lt;p&gt;An aggregate makes for a much simpler mapping - which is why many
  early adopters of NoSQL databases report that it's an easier
  programming model.&lt;/p&gt;

&lt;p&gt;This synergy between the programming model and the distribution
 model is very valuable. It allows the database to use its knowledge
 of how the application programmer clusters the data to help
 performance across the cluster.&lt;/p&gt;

&lt;p&gt;There is a significant downside - the whole approach works really
 well when data access is aligned with the aggregates, but what if you
 want to look at the data in a different way? Order entry naturally
 stores orders as aggregates, but analyzing product sales cuts across
 the aggregate structure. The advantage of not using an aggregate
 structure in the database is that it allows you to slice and dice
 your data different ways for different audiences.&lt;/p&gt;

&lt;p&gt;This is why aggregate-oriented stores talk so much about
 map-reduce - which is a programming pattern that's well suited to
 running on clusters. Map-reduce jobs can reorganize the data
 into different groups for different readers - what many people refer
 to as materialized views. But it's more work to do this than using the
 relational model.&lt;/p&gt;

&lt;p&gt;This is part of the argument for &lt;a href="http://martinfowler.com/bliki/PolyglotPersistence.html"&gt;PolyglotPersistence&lt;/a&gt; -
 use aggregate-oriented databases when you are manipulating clear
 aggregates (especially if you are running on a cluster) and use
 relational databases (or a graph database) when you want to
 manipulate that data in different ways.&lt;/p&gt;

&lt;div class="footnote-list"/&gt;
</content>
  </entry><entry>
    <title>An open letter to Pearson opposing their support of SOPA and PIPA</title>
    <link href="http://martinfowler.com/articles/pearson-sopa.html"/>
    <updated>2012-01-12T14:04:00-05:00</updated>
    <id>tag:martinfowler.com,2012-01-12:An-open-letter-to-Pearson-opposing-their-support-of-SOPA-and-PIPA</id>
    <category term=""/>
    <content type="html">&lt;p&gt;&lt;a href='http://continuousdelivery.com/'&gt;Jez Humble&lt;/a&gt; and I have written an open letter to Pearson opposing their support of the SOPA and PIPA bills currently under consideration from the US congress.&lt;/p&gt;</content>
  </entry><entry>
    <title>Bliki: DiversityImbalance</title>
    <link href="http://martinfowler.com/bliki/DiversityImbalance.html"/>
    <updated>2012-01-11T10:57:00-05:00</updated>
    <id>http://martinfowler.com/bliki/DiversityImbalance.html</id>
    <category term="bliki"/>
    <content type="html">
&lt;p&gt;Although it's easy to become accustomed to it, it's pretty obvious
  the software development world has some serious issues in diversity.
  By this I mean that we have some notable differences in proportions
  of people compared to the general population. One of the most
  obvious differences is the low proportion of women, which is true
  all over the world (albeit noticeably less so in China). In the US,
  where I spend a good chunk of my time, the lack of African-Americans
  is also obvious. There's a lot been written on why such imbalances
  might exist, and what might be done about it. &lt;a href="#footnote-action"&gt;[1]&lt;/a&gt; But here I want to
  concentrate on a more fundamental question - does it matter?&lt;/p&gt;

&lt;p&gt;One point of view I hear fairly regularly is that these diversity
  imbalances are natural - because women don't have the aptitude or
  inclination for programming. This point of view upsets a lot of
  people but I think it's important to treat it seriously. I think of
  it as a hypothesis, which I'll call the natural balance hypothesis.
  It needs to be treated seriously because there's plenty of people
  who feel it explains the current situation - but I argue that it has
  two serious flaws, which mean that I must vigorously reject it.&lt;/p&gt;

&lt;p&gt;The first flaw is a simple one of evidence. There are (roughly)
  50% women in the world, so we should expect the ratio for women in
  computing to be 50% - unless there's real evidence that some other
  ratio is natural.&lt;a href="#footnote-example"&gt;[2]&lt;/a&gt; So far there's no such evidence. Sure, it's
  obvious that there are biological differences between men and women,
  and there is evidence that there are differences in brain function
  between the sexes. But there is no evidence that indicates that the
  skills that make people better programmers are more common in
  men.&lt;/p&gt;

&lt;p&gt;The only evidence that seems to occur to people who promote the
  natural balance hypothesis is the fact that there are less female
  programmers.&lt;a href="#footnote-past-women"&gt;[3]&lt;/a&gt; Personally I find it
  troubling when software professionals, who ought to be good at
  logical thinking, can reach so easily for such circular logic.&lt;/p&gt;

&lt;p&gt;It is the second flaw in the natural imbalance hypothesis that
  brings the heat into the discussion. Men have spent
  centuries using this kind of argument to deny women equal rights in
  all sorts of fields. Over the last century we've seen tons of
  evidence that this isn't true elsewhere, so why should
  it be true in software? As far as I'm concerned this shoddy history
  should make us doubly wary of the any suggestion that a diversity
  imbalance is natural. Unless someone comes up with decent evidence
  that there is a relevant biological difference, we must operate on
  the assumption that women are equally well suited to programming.&lt;/p&gt;

&lt;p&gt;You'll notice above that I said "inclination or aptitude". I've
  noticed a lot recently that advocates of the natural-balance
  hypothesis say less frequently that women have less aptitude than
  men for programming, instead they say that women don't want to do
  programming. But making statements with inclination is little
  better than with aptitude - there's still no evidence and it has
  just the same shoddy history.&lt;/p&gt;

&lt;p&gt;So, accepting that there is no good reason for a diversity
  imbalance, does such an imbalance matter? That is, given we have a
  unnatural imbalance, is it a problem that's sufficiently serious to
  spend energy on fixing it? I think there are many reasons why it
  matters to tackle our imbalances. First and foremost, there's a
  moral argument. I'm a strong meritocrat, who believes that we should
  strive for a society where everyone has an equal opportunity to
  fulfill their potential. A diversity imbalance suggest that there
  are many women, who would have good careers as programmers, who are
  not getting the opportunity to do so. I agree with &lt;a href="http://techcrunch.com/2011/11/19/racism-and-meritocracy/"&gt;Eric
  Ries's view&lt;/a&gt; that diversity imbalances suggest we are not as
  meritocratic as we like to think we are.&lt;/p&gt;

&lt;p&gt;This waste hurts our profession too. We need more and better
  software developers to produce valuable software that improves our
  lives. By not bringing enough women into the profession, we are
  handicapping ourselves. This will only become more serious as the
  demand for talent increases in the future. How can we say we are
  hiring the best people when we ignore significant chunks of our
  population. Critics of efforts to fix the diversity imbalance often
  fret that we risk failing to hire a well-qualified male, when we
  habitually fail to hire well-qualified females.&lt;/p&gt;

&lt;p&gt;Lack of diversity is itself a problem. Different people think
  differently, and consequently come up with different ways to solve
  problems. If you have a bunch of people with the same background,
  they miss lots of ideas - leading to inefficiencies and lack of
  innovation. &lt;a href="http://www.amazon.com/gp/product/0691138540?ie=UTF8&amp;amp;tag=martinfowlerc-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0691138540"&gt;A diverse group is usually more effective.&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=martinfowlerc-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0321601912" style="border:none !important; margin:0px !important;" width="1"/&gt;&lt;/p&gt;

&lt;p&gt;This lack of diversity also contributes to our marginalization as
  a profession. We are already in the situation where the opinions of
  programmers aren't taken as seriously as they should be by people
  outside our profession. We see this regularly in our discussions
  with business people who dismiss us as mere nerds. A diversity
  imbalance makes us look even more like some marginalizable
  outsider.&lt;/p&gt;

&lt;p&gt;Left to themselves, these kinds of imbalances tend to get worse.
  People have a natural, often sub-conscious, tendency to be around people
  like themselves. Consequently as a group becomes a smaller minority,
  they get excluded more. A warning sign is when people are turned
  away because they "won't fit in". &lt;/p&gt;

&lt;p&gt;There is a great deal of good potential in the software
  profession. We have a strong tendency towards meritocracy, a natural
  first position with exploiting the power of computers to enhance our
  lives, a lack of historical baggage in how we organize ourselves and
  our work. As a result I think we could provide a model to influence
  other social groups and lead the way in demonstrating how humans can
  collaborate. Diversity imbalances are a cancer to that position -
  how can we claim to be forward thinking when our diversity looks
  it comes from where the rest of the world was a couple of
  generations ago?&lt;/p&gt;
&lt;hr class="topSection"/&gt;
&lt;h2 id="FurtherReading"&gt;Further Reading&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://news.ycombinator.com/item?id=3452516"&gt;Hacker
 News&lt;/a&gt; discussion of this post (sigh).&lt;/li&gt;

&lt;li&gt;An excellent &lt;a href="http://martinfowler.com/bliki/Infodeck.html"&gt;Infodeck&lt;/a&gt; on gender differences in math
 and &lt;a href="http://www.slideshare.net/terriko/how-does-biology-explain-the-low-numbers-of-women-in-cs-hint-it-doesnt"&gt;
 why that isn't a factor in computing&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="footnote-list"&gt;
&lt;div class="footnote-list-item" id="footnote-action"&gt;
&lt;p&gt;&lt;span class="num"&gt;1: &lt;/span&gt;
      I started writing this bliki post over two
      years ago but have been stuck because I don't have any profound
      things to say about how we can fix the diversity imbalance. As a
      rule I try to ensure that everything I write provides
      information that readers can act on, so this post sat in limbo.
      Eventually I decided that I'm just so tired of people saying
      things like "there aren't many women programmers because women
      don't have the aptitude/inclination" that I decided that this
      bliki was worth posting - just so I could give that argument both
      barrels.
    &lt;/p&gt;
&lt;/div&gt;

&lt;div class="footnote-list-item" id="footnote-example"&gt;
&lt;p&gt;&lt;span class="num"&gt;2: &lt;/span&gt;
      I find it makes the discussion flow rather better if I use a
      concrete case, so I'm using the male-female diversity imbalance.
      The same arguments apply to most other diversity imbalances too
      - particularly those with a history of discrimination.
    &lt;/p&gt;
&lt;/div&gt;

&lt;div class="footnote-list-item" id="footnote-past-women"&gt;
&lt;p&gt;&lt;span class="num"&gt;3: &lt;/span&gt;
      Although female programmers are rare now, that wasn't the case in
      the 70's. That shift is another argument against the natural
      balance hypothesis.
    &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry><entry>
    <title>photostream 18</title>
    <link href="http://martinfowler.com/photos/18.html"/>
    <updated>2012-01-10T18:25:00-05:00</updated>
    <id>tag:martinfowler.com,2012-01-10:photostream-18</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/18.html'&gt;&lt;img src = 'http://martinfowler.com/photos/18.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Lindau, Germany&lt;/p&gt;
</content>
  </entry><entry>
    <title>Bliki: NosqlDefinition</title>
    <link href="http://martinfowler.com/bliki/NosqlDefinition.html"/>
    <updated>2012-01-09T09:30:00-05:00</updated>
    <id>http://martinfowler.com/bliki/NosqlDefinition.html</id>
    <category term="bliki"/>
    <content type="html">
&lt;p&gt;As soon as we started work on &lt;a href="http://martinfowler.com/bliki/NosqlDistilled.html"&gt;NosqlDistilled&lt;/a&gt; we were
  faced with a tricky conundrum - what are we writing about? What
  exactly is a NoSQL database? There's no strong definition of the
  concept out there, no trademarks, no standard group, not even a manifesto.&lt;/p&gt;

&lt;p&gt;The term originally surfaced at &lt;a href="http://blog.oskarsson.nu/2009/06/nosql-debrief.html"&gt;an informal
  meetup&lt;/a&gt; on June 11 2009 in San Francisco organized by Johan
  Oskarsson. At the session there were presentations from Voldemort,
  Cassandra, Dynomite, HBase, Hypertable, CouchDB, and MongoDB.
  The term caught on rapidly and few people would argue that only the
  databases mentioned at that meeting should be called NoSQL.&lt;/p&gt;

&lt;p&gt;Indeed there's often a twist in the name itself: many advocates
  of NoSQL say that it does not mean a "no" to SQL, rather it means
  Not Only SQL. On this point I think it's useful to separate an
  individual database from the kind of ecosystem that NoSQL advocates
  see as the future. When we say "x is a NoSQL database" I think it's
  silly to interpret NoSQL as "Not Only" because that would render the
  term meaningless. (You could then reasonably argue that SQL Server
  (say) is a NoSQL database.) So I think it's best to say a "NoSQL
  database" is a "no-sql" database. You should separately interpret the
  NoSQL ecosystem as a "not only" - although I prefer the term
  &lt;a href="http://martinfowler.com/bliki/PolyglotPersistence.html"&gt;PolyglotPersistence&lt;/a&gt; for this usage. &lt;a href="#footnote-caplitalize"&gt;[1]&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even with this matter out of the way, it's still not easy to
  define a NoSQL database. Does any database that doesn't use SQL
  qualify? How about older database technologies such as &lt;a href="http://en.wikipedia.org/wiki/IBM_Information_Management_System"&gt;IMS&lt;/a&gt;
  or &lt;a href="http://en.wikipedia.org/wiki/MUMPS"&gt;MUMPS&lt;/a&gt;? How
  about a relational system that didn't have SQL (such as the early &lt;a href="http://en.wikipedia.org/wiki/Ingres_(database)"&gt;Ingres&lt;/a&gt;)?
  What happens if someone manages to bolt a SQL interface onto one of the
  original septet?&lt;/p&gt;

&lt;p&gt;So for our book we took a view that NoSQL refers to a particular
  rush of recent databases. Some characteristics are common amongst
  these databases, but none are definitional.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not using the relational model (nor the SQL language)&lt;/li&gt;

&lt;li&gt;Open source&lt;/li&gt;

&lt;li&gt;Designed to run on large clusters&lt;/li&gt;

&lt;li&gt;Based on the needs of 21st century web properties&lt;/li&gt;

&lt;li&gt;No schema, allowing fields to be added to any record without controls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While I'm used to the blurry lines of definitions in the
   software industry, I confess my heart sinks at yet another one. But
   the important thing is that these databases provide a important
   addition to the way we'll be building application in next couple of
   decades. A lack of a clear definition will be no more than a gnat
   bite on their future successes.&lt;/p&gt;

&lt;div class="footnote-list"&gt;
&lt;div class="footnote-list-item" id="footnote-caplitalize"&gt;
&lt;p&gt;&lt;span class="num"&gt;1: &lt;/span&gt;
       If we take the "not-only" interpretation, then we should write
       "NOSQL" rather than "NoSQL". I almost always see it written as "NoSQL".
     &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry><entry>
    <title>Bliki: Slideument</title>
    <link href="http://martinfowler.com/bliki/Slideument.html"/>
    <updated>2011-12-19T09:41:00-05:00</updated>
    <id>http://martinfowler.com/bliki/Slideument.html</id>
    <category term="bliki"/>
    <content type="html">
&lt;p&gt;A slideument is a cross between a slide deck and a document. The
  idea is that you can use a single slide deck both for slides during
  your presentation and as a handout for people to read afterwards.
  The trouble is that those two needs lead to very different
  requirements on your slides, so you can't satisfy them both. The
  result is that slideuments usually fail at both.&lt;/p&gt;

&lt;p&gt;The main reason they fail is due to the amount of words and
  detail you need in the deck. If you want a stand-alone document you
  need enough context to make sense without the speaker being there.
  This requires a lot of words. But if the speaker is there, and
  speaking, then the audience ends up both reading and listening - and
  usually not concentrating properly on either. A good slide deck is a
  &lt;a href="http://martinfowler.com/bliki/VisualChannel.html"&gt;VisualChannel&lt;/a&gt;, it provides an accompaniment to the spoken
  words, reinforcing but not duplicating what is being said.&lt;/p&gt;

&lt;p&gt;If people want a stand-alone document, then you can provide them
  with one - but it should be a different document, one that's
  designed for reading and not speaking.&lt;/p&gt;

&lt;p&gt;The most sensible argument I've heard in favor of slideuments is
  that audience expects them, even if they are useless and never read
  later. I've a lot of sympathy with this argument, as it goes back to
  my first major presentation - a tutorial at OOPSLA in 1992. Since
  this was a big deal for me I decided to work hard to provide an
  extra-special contribution. So instead of the usual copies of
  slides, I wrote a special document to support the talk - about 40 or
  so pages - and provided that as a handout. That document was a much
  better coverage of the topic then the slides would be. But on the day I got lots
  of complaints becuase I didn't provide a copy of the slides. I am
  forever grateful to Rebecca Wirfs-Brock, who was the tutorial chair
  that year and backed me up. &lt;/p&gt;

&lt;p&gt;People do expect slides, even when they don't really make any
  sense, and often it's easiest just to run off a pdf. I think that
  ideally you should try for more. My approach in later tutorials was
  to give out both the document and the slide copies. These days I
  give people my &lt;a href="http://martinfowler.com/bliki/TalkNotes.html"&gt;TalkNotes&lt;/a&gt; URI that points to relevant
  articles I've written on the topic of my talk.&lt;/p&gt;

&lt;p&gt;Slideuments shouldn't be confused with &lt;a href="http://martinfowler.com/bliki/Infodeck.html"&gt;Infodecks&lt;/a&gt;&lt;/p&gt;
&lt;hr class="topSection"/&gt;
&lt;h2 id="FurtherReading"&gt;Further Reading&lt;/h2&gt;

&lt;p&gt;The term Slideument seems to have been coined by &lt;a href="http://www.presentationzen.com/presentationzen/"&gt;Garr Renolds&lt;/a&gt;
  (author of Presentation Zen). A couple of worthwhile posts by him:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.presentationzen.com/presentationzen/2006/04/slideuments_and.html"&gt;Slideuments and the catch-22 for conference speakers&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="http://www.presentationzen.com/presentationzen/2006/12/slideshare_and_.html"&gt;Slideshare and the "slideumentation" of presentations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's also &lt;a href="http://www.learninggeneralist.com/2010/02/for-heavens-sake-avoid-slideuments.html"&gt;an argument against slideuments&lt;/a&gt; from my colleague
  &lt;a href="http://www.learninggeneralist.com/"&gt;Sumeet Moghe&lt;/a&gt;&lt;/p&gt;
</content>
  </entry><entry>
    <title>photostream 17</title>
    <link href="http://martinfowler.com/photos/17.html"/>
    <updated>2011-11-22T17:35:00-05:00</updated>
    <id>tag:martinfowler.com,2011-11-22:photostream-17</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/17.html'&gt;&lt;img src = 'http://martinfowler.com/photos/17.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Wachusett Meadow, Princeton, MA&lt;/p&gt;
</content>
  </entry><entry>
    <title>Retreaded: SpecificationByExample</title>
    <link href="http://martinfowler.com/bliki/SpecificationByExample.html"/>
    <updated>2011-11-17T08:38:00-05:00</updated>
    <id>tag:martinfowler.com,2011-11-17:Retreaded--SpecificationByExample</id>
    <category term=""/>
    <content type="html">
&lt;p class = 'original'&gt;&lt;a href = 'http://martinfowler.com/bliki/Retread.html'&gt;Retread&lt;/a&gt; of post orginally made on 18 Mar 2004&lt;/p&gt;

&lt;p&gt;I was attending a workshop at XP/Agile Universe in 2002 when the
phrase 'Specification By Example' struck me as a way to describe one
of roles of testing in &lt;a href="http://martinfowler.com/articles/newMethodology.html#xp"&gt;XP&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;(These days it's terribly unfashionable to talk about Test Driven
Development (TDD) having anything to do with testing, but like &lt;a href="http://blogs.codehaus.org/people/tirsen/archives/000582_tdd_is_about_testing.html"&gt;Jon&lt;/a&gt; I do think that having a comprehensive automated test suite
is more valuable than the term 'side-effect' implies. Rather like if
someone offered me a million dollars to hike up a mountain. I may say
that the main purpose of the hike is the enjoyment of nature, but the
side-effect to my wallet is hardly trivial....)&lt;/p&gt;

&lt;p&gt;Specification By Example isn't the way most of us have been
brought up to think of specifications. Specifications are supposed to
be general, to cover all cases. Examples only highlight a few points,
you have to infer the generalizations yourself. This does mean that
Specification By Example can't be the only requirements technique you
use, but it doesn't mean that it can't take a leading role.&lt;/p&gt;

&lt;p&gt;So far the dominant idea with rigorous specifications, that is
those that can be clearly judged to be passed or failed, is to use pre
and post conditions. These techniques dominate in formal methods, and
also underpin &lt;a href="http://archive.eiffel.com/doc/manuals/technology/contract/"&gt;Design

by Contract&lt;/a&gt;. These techniques have their place, but they aren't
ideal. The pre-post conditions can be very easy to write in some
situations, but others can be very tricky. I've tried to use them in a
number enterprise application settings, and I've found that in many
situations it's as hard to write the pre and post conditions as it is
to write the solution. One of the great things about specification by
example is that examples are usually much easier to come up with,
particularly for the non-nerds who we write the software for. (&lt;a href="http://www.amazon.com/gp/product/0201824191?ie=UTF8&amp;amp;tag=martinfowlerc-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0201824191"&gt;Timothy Budd&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=martinfowlerc-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0321601912" style="border:none !important; margin:0px !important;" width="1"/&gt; pointed out that while you can
show a lot of stack behavior with pre and post conditions, it's very
tricky to write pre and post conditions that show the LIFO
property.)&lt;/p&gt;

&lt;p&gt;An important property of TDD tests is that they involve a
double-check. In fact this highlights an amusing little lie of the XP
community. They make a very strong point of saying things Once and
Only Once, but in fact they always say things twice: once in the code
and once in the tests. Kent has pointed out that this double-check
principle is a vital principle, and it's certainly one that humans use
all the time. The value of the double check is very much tied into
using different methods for each side of the double check. Combining
Specification By Example with production code means that you have both
things said quite differently, which increases their ability to find
errors.&lt;/p&gt;

&lt;p&gt;The formal specification community have constantly had trouble
verifying that a design satisfies a specification, particularly in
doing this without error prone humans. For Specification By Example,
this is easy. Another case of Specification By Example being less
valuable in theory but more valuable in practice.&lt;/p&gt;

&lt;p&gt;One Design by Contract fan pointed out that if you write a
specification in terms of tests, then the supplier could satisfy the
specification by just returning hard-coded responses to the specific
test inputs. My flippant answer to this is that if you are concerned
about this then the issue of tests versus Design by Contract is the
least of your worries. But there is a serious point here. Tests are
always going to be incomplete, so they always have to be backed up
with other mechanisms. Being the twisted mind that I am, I actually
see this as a plus. Since it's clear that Specification By Example
isn't enough, it's clear that you need to do more to ensure that
everything is properly communicated. One of the most dangerous things
about a traditional requirements specification is when people think
that once they've written it they are done communicating.&lt;/p&gt;

&lt;p&gt;Specification By Example only works in the context of a working
relationship where both sides are collaborating and not fighting. The
examples trigger abstractions in the design team while keeping the
abstractions grounded. You do need more - things like regular
conversation, techniques like &lt;a href="http://www.amazon.com/gp/product/0321125215?ie=UTF8&amp;amp;tag=martinfowlerc-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321125215"&gt;Domain Driven
Design&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=martinfowlerc-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0321601912" style="border:none !important; margin:0px !important;" width="1"/&gt;, indeed even doses of Design by Contract. While I've
never had the opportunity to use Design by Contract fully (i.e. with
Eiffel) I regularly think about interfaces in contractual terms.
Specification By Example is a powerful tool, perhaps my most used
tool, but never my only tool.&lt;/p&gt;

&lt;p&gt;(For more thinking on Specification By Example, if not by that
name, take a look at &lt;a href="http://www.exampler.com/blog/"&gt;Brian Marick's&lt;/a&gt;
writings. Somewhere on his site there probably is one super page that
sums up his view on it. Of course finding it is less valuable than
reading all the stuff there while you're trying) &lt;/p&gt;
&lt;hr class="topSection"/&gt;
&lt;h2 id="SomeLaterComments"&gt;Some Later Comments&lt;/h2&gt;

&lt;p&gt;A couple of years after I first wrote this, there was a &lt;a href="http://beust.com/weblog/archives/000392.html"&gt;post by Cedric
	Beust&lt;/a&gt; that was critical of agile methods that
	caused a minor blog spat. There were rebuttals by &lt;a href="http://www.langrsoft.com/blog/2006/06/open-note-to-google-i-thank-google-one.html"&gt;Jeff Langr&lt;/a&gt; and &lt;a href="http://butunclebob.com/ArticleS.UncleBob.AgilePeopleStillDontGetIt"&gt;Bob
	Martin&lt;/a&gt;, and I sent this post through the feed again.  Jeff Langr
  later added a &lt;a href="http://www.langrsoft.com/blog/2006/06/are-tests-specs-ive-presented-tdd.html"&gt;nice
	example&lt;/a&gt; using using tests as specification by example for Java's
	Math.pow function.&lt;/p&gt;

&lt;p class="repost"&gt;reposted on 17 Nov 2011&lt;/p&gt;
</content>
  </entry><entry>
    <title>photostream 16</title>
    <link href="http://martinfowler.com/photos/16.html"/>
    <updated>2011-11-11T09:22:00-05:00</updated>
    <id>tag:martinfowler.com,2011-11-11:photostream-16</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/16.html'&gt;&lt;img src = 'http://martinfowler.com/photos/16.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Boston, MA&lt;/p&gt;
</content>
  </entry><entry>
    <title>New series book - Service Design Patterns</title>
    <link href="http://martinfowler.com/books.html#sdp"/>
    <updated>2011-11-10T10:38:00-05:00</updated>
    <id>tag:martinfowler.com,2011-11-10:New-series-book---Service-Design-Patterns</id>
    <category term=""/>
    <content type="html">&lt;div class = 'img'&gt;&lt;img src = 'http://martinfowler.com/daigneau.jpg' width = '100' height = '133' alt = '' title = ''/&gt;&lt;/div&gt;&lt;p&gt;Addison-Wesley has published a new book in my Signature Series. It&amp;#8217;s by Robert Daigneau and it&amp;#8217;s called Service Design Patterns. It&amp;#8217;s a topic that&amp;#8217;s already had too many books on it, but I added this one to the series because I think Robert has done a particularly good job of collecting together the best advice on the topic and organizing it into a useful handbook. This is the book that I think ought to become the standard book on the topic.&lt;/p&gt;</content>
  </entry><entry>
    <title>Retreaded: ContextualValidation</title>
    <link href="http://martinfowler.com/bliki/ContextualValidation.html"/>
    <updated>2011-11-03T11:00:00-04:00</updated>
    <id>tag:martinfowler.com,2011-11-03:Retreaded--ContextualValidation</id>
    <category term=""/>
    <content type="html">
&lt;p class = 'original'&gt;&lt;a href = 'http://martinfowler.com/bliki/Retread.html'&gt;Retread&lt;/a&gt; of post orginally made on 07 Dec 2005&lt;/p&gt;

&lt;p&gt;In my writing endeavors, I've long intended to write a chunk of
	material on validation. It's an area that leads to a lot of
	confusion and it would be good to get some solid description of some
	of the techniques that work well. However life is full of things to
	write about, rather more than time allows.&lt;/p&gt;

&lt;p&gt;Some recent readings made me think about saying a few
	preliminary things on the topic. One common thing I see people do
	is to develop validation routines for objects. These routines come
	in various ways, they may be in the object or external, they may
	return a boolean or throw an exception to indicate failure. But one
	thing that I think constantly trips people up is when they think
	object validity on a context independent way such as an &lt;code&gt;isValid&lt;/code&gt;
	method implies.&lt;/p&gt;

&lt;p&gt;I think it's much more useful to think of validation as something
that's bound to a context - typically an action that you want to do.
Is this order valid to be filled, is this customer valid to check in
to the hotel. So rather than have methods like &lt;code&gt;isValid&lt;/code&gt;
have methods like &lt;code&gt;isValidForCheckIn&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;One of the consequences of this is that saving an object to a
	database is itself an action. Thinking about it that way raises some
	important questions. Often when people talk about a context-free
	validity, they mean it in terms of saving to a database. But the
	various validity checks that make this up should be interrogated
	with the question "should failing this test prevent saving?"&lt;/p&gt;

&lt;p&gt;In &lt;a href="http://www.amazon.com/gp/product/1568843224?ie=UTF8&amp;amp;tag=martinfowlerc-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1568843224"&gt;About Face&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=martinfowlerc-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0321601912" style="border:none !important; margin:0px !important;" width="1"/&gt; Alan Cooper advocated that we shouldn't let
our ideas of valid states prevent a user from entering (and saving)
incomplete information. I was reminded by this a few days ago when
reading a draft of a book that &lt;a href="http://www.jnsk.se/weblog/rss.xml"&gt;Jimmy Nilsson&lt;/a&gt; is working
on. He stated a principle that you should always be able to save an
object, even if it has errors in it. While I'm not convinced that this
should be an absolute rule, I do think people tend to prevent saving
more than they ought. Thinking about the context for validation may
help prevent that.&lt;/p&gt;

&lt;p class="repost"&gt;reposted on 03 Nov 2011&lt;/p&gt;
</content>
  </entry><entry>
    <title>ThoughtWorks Agile East</title>
    <link href="http://www.thoughtworks.com/events/agile-east-conference-2011"/>
    <updated>2011-10-13T16:20:00-04:00</updated>
    <id>tag:martinfowler.com,2011-10-13:ThoughtWorks-Agile-East</id>
    <category term=""/>
    <content type="html">&lt;p&gt;ThoughtWorks is organizing an &lt;a href='http://www.thoughtworks.com/events/spend-day-martin-fowler-neal-ford-other-agile-thought-leaders'&gt;Agile East&lt;/a&gt; event: a one day conference that we&amp;#8217;re holding in New York (November 2) and Atlanta (November 7). I&amp;#8217;ll be speaking, doing my usual &lt;a href='http://martinfowler.com/bliki/SuiteOfTalks.html'&gt;suite of talks&lt;/a&gt;. More importantly there&amp;#8217;s an impressive line up of my colleagues - the people whose ideas I clip and package up into those talks. So this is a great opportunity to listen to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Graham and Andy talk from their experiences in the technical leadership of agile projects&lt;/li&gt;

&lt;li&gt;project management lessons from Joe Z&lt;/li&gt;

&lt;li&gt;hot devops and continuous delivery juice from Rolf and Jez&lt;/li&gt;

&lt;li&gt;Ross&amp;#8217;s advice on IT budgeting&lt;/li&gt;

&lt;li&gt;Linda&amp;#8217;s take on integrating UX with an agile project&lt;/li&gt;

&lt;li&gt;Matt on using offshore teams for agile (he played a big role in building our offshore teams)&lt;/li&gt;

&lt;li&gt;a trio of talks on the gnarly topic of organizational change from Tiffany, Greg and Manu&lt;/li&gt;

&lt;li&gt;Chad explaining how to avoid the pitfalls of automated tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and a special guest in New York who will make all our talks seem pedestrian.&lt;/p&gt;</content>
  </entry><entry>
    <title>photostream 15</title>
    <link href="http://martinfowler.com/photos/15.html"/>
    <updated>2011-09-17T15:55:00-04:00</updated>
    <id>tag:martinfowler.com,2011-09-17:photostream-15</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/15.html'&gt;&lt;img src = 'http://martinfowler.com/photos/15.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Miyajima, Japan&lt;/p&gt;
</content>
  </entry><entry>
    <title>Interviewed about Agile in 2001 by Jim Highsmith</title>
    <link href="http://www.jimhighsmith.com/2011/09/14/interview-with-martin-fowler-circa-2001/"/>
    <updated>2011-09-16T08:20:00-04:00</updated>
    <id>tag:martinfowler.com,2011-09-16:Interviewed-about-Agile-in-2001-by-Jim-Highsmith</id>
    <category term=""/>
    <content type="html">&lt;p&gt;When I went to Snowbird in 2001 for the meeting that led to the &lt;a href='http://agilemanifesto.org/'&gt;Manifesto&lt;/a&gt;, Jim interviewed me for the book he was writing on &lt;a href='http://www.amazon.com/Agile-Software-Development-Ecosystems-Highsmith/dp/0201760436/'&gt;Agile Software Development Ecosystems&lt;/a&gt;. It provides a snapshot on my thinking on extreme programming and this thing that a few days later we called agile software development.&lt;/p&gt;</content>
  </entry><entry>
    <title>Retreaded: SoftwareDevelopmentAttitude</title>
    <link href="http://martinfowler.com/bliki/SoftwareDevelopmentAttitude.html"/>
    <updated>2011-09-08T10:04:00-04:00</updated>
    <id>tag:martinfowler.com,2011-09-08:Retreaded--SoftwareDevelopmentAttitude</id>
    <category term=""/>
    <content type="html">
&lt;p class = 'original'&gt;&lt;a href = 'http://martinfowler.com/bliki/Retread.html'&gt;Retread&lt;/a&gt; of post orginally made on 08 Mar 2004&lt;/p&gt;

&lt;p&gt;Many debates in software development are underpinned by whether
the speaker has a &lt;a href="http://martinfowler.com/bliki/DirectingAttitude.html"&gt;DirectingAttitude&lt;/a&gt; or an
&lt;a href="http://martinfowler.com/bliki/EnablingAttitude.html"&gt;EnablingAttitude&lt;/a&gt;. These different attitudes affect choices
over languages, designs, tools, processes, and lots more.&lt;/p&gt;

&lt;p&gt;Here's some examples of this dichotomy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A debate a while ago triggered by Joel Spolsky's post on &lt;a href="http://www.joelonsoftware.com/items/2003/10/13.html"&gt;exceptions&lt;/a&gt;.

He didn't like exceptions because they could be misused badly, leading
to confusing code (directing). Bill Caputo &lt;a href="http://www.williamcaputo.com/archives/000009.html"&gt;pointed
out&lt;/a&gt; that exceptions, when used well, make life much easier
(enabling).&lt;/li&gt;

&lt;li&gt;Some of the static/dynamic typing debate brings up these
points. Some arguments in favor of static typing talk about how they
prevent people from making certain kinds of mistake (directing) while
dynamic typers point out how static typing restricts some useful
idioms (enabling).&lt;/li&gt;

&lt;li&gt;Agile processes are &lt;a href="http://martinfowler.com/bliki/PeopleOriented.html"&gt;PeopleOriented&lt;/a&gt; (enabling),
while plan-driven methods seek to ensure that even a poor team can do
an acceptable job (directing).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't hard-wired attitudes. Often people are directing in
some cases and enabling in others. But I think there is a deep strain
running through here, often a personality issue, that runs underneath
much discussion on how we do software. (I'm very much in the enabling
category, as if you can't tell.)&lt;/p&gt;

&lt;p&gt;You might think that all restrictions on what a developer does
imply a directing attitude, but it's not that simple. As an example,
consider memory management. You can think of this as a directing
feature: programmers can't be trusted to manage memory correctly so
take away their ability to allocate memory. But I look at memory
management as an enabling technology - it takes away something I don't
&lt;i&gt;want&lt;/i&gt; to worry about, so I can concentrate better on those
things I do care about. Steve &lt;a href="http://stevef.truemesh.com/archives/000206.html"&gt;tied this thought nicely&lt;/a&gt; onto the
difference between problems and difficulties.&lt;/p&gt;

&lt;p class="repost"&gt;reposted on 08 Sep 2011&lt;/p&gt;
</content>
  </entry><entry>
    <title>photostream 14</title>
    <link href="http://martinfowler.com/photos/14.html"/>
    <updated>2011-09-07T19:01:00-04:00</updated>
    <id>tag:martinfowler.com,2011-09-07:photostream-14</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/14.html'&gt;&lt;img src = 'http://martinfowler.com/photos/14.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Gourdon, France&lt;/p&gt;
</content>
  </entry><entry>
    <title>Speaking in Frankfurt and Berlin in October</title>
    <link href="http://continuous-delivery.thoughtworks.com/events/software-design-21st-century-frankfurt-berlin-2011"/>
    <updated>2011-09-06T09:04:00-04:00</updated>
    <id>tag:martinfowler.com,2011-09-06:Speaking-in-Frankfurt-and-Berlin-in-October</id>
    <category term=""/>
    <content type="html">&lt;div class = 'img'&gt;&lt;img src = 'http://martinfowler.com/snips/tw-de.png' width = '150' height = '' alt = '' title = ''/&gt;&lt;/div&gt;&lt;p&gt;I&amp;#8217;ll be taking part in a couple of &lt;a href='http://continuous-delivery.thoughtworks.com/events/software-design-21st-century-frankfurt-berlin-2011'&gt;ThoughtWorks events in Germany&lt;/a&gt; during October. They are both evening events (Oct 17 Frankfurt and Oct 18 Berlin). I shall do my usual &lt;a href='http://martinfowler.com/bliki/SuiteOfTalks.html'&gt;suite of talks&lt;/a&gt; on some mix of topics. I&amp;#8217;ll be joined by two of my colleagues: Wolf Schlegel, who will be talking about continuous delivery and Erik D&#xF6;rnenburg who will be talking about using lean techniques with enterprise architecture.&lt;/p&gt;</content>
  </entry><entry>
    <title>photostream 13</title>
    <link href="http://martinfowler.com/photos/13.html"/>
    <updated>2011-08-31T22:29:00-04:00</updated>
    <id>tag:martinfowler.com,2011-08-31:photostream-13</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/13.html'&gt;&lt;img src = 'http://martinfowler.com/photos/13.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Highgate, London&lt;/p&gt;
</content>
  </entry><entry>
    <title>Update of "It's Not Just Standing Up"</title>
    <link href="http://martinfowler.com/articles/itsNotJustStandingUp.html"/>
    <updated>2011-08-29T09:21:00-04:00</updated>
    <id>tag:martinfowler.com,2011-08-29:Update-of--It-s-Not-Just-Standing-Up-</id>
    <category term=""/>
    <content type="html">&lt;div class = 'img'&gt;&lt;img src = 'http://martinfowler.com/snips/jyip.jpg' width = '100' height = '' alt = 'Jason Yip' title = 'Jason Yip'/&gt;&lt;/div&gt;&lt;p&gt;Short daily &amp;#8220;stand-up&amp;#8221; meetings are a regular feature of agile projects. Done well they allow frequent communication across the team with a high signal to noise ratio. Done badly, they can be pretty grim. For several years, this article by Jason Yip has become the definitive source of information on how to make them better. Jason has just finished a comprehensive revision of the article, so if you&amp;#8217;re looking to get the best from your stand-ups, you should take a good look at the tips in here.&lt;/p&gt;</content>
  </entry><entry>
    <title>Speaking at goto Aarhus</title>
    <link href="http://martinfowler.com/snips/201108290912.html"/>
    <updated>2011-08-29T09:12:00-04:00</updated>
    <id>tag:martinfowler.com,2011-08-29:Speaking-at-goto-Aarhus</id>
    <category term=""/>
    <content type="html">&lt;div class = 'img'&gt;&lt;img src = 'http://martinfowler.com/snips/goto_logo.png' width = '100' height = '' alt = '' title = ''/&gt;&lt;/div&gt;&lt;p&gt;As in so many previous years, I&amp;#8217;ll be speaking at the the &lt;a href='http://gotocon.com/aarhus-2011/'&gt;goto conference&lt;/a&gt; (formerly known as JAOO) in early October. This is an excellent conference with a good range of material across both technology and process. This year I&amp;#8217;ll be participating in a pair of tutorials.&lt;/p&gt;

&lt;p&gt;On Oct 9 I&amp;#8217;ll be with Jez Humble doing our full-day tutorial on Continuous Delivery, the first time we&amp;#8217;ve brought this tutorial to Aarhus. This will cover much of the ground in Jez and Dave&amp;#8217;s award winning book including the business case for Continuous Delivery, deployment pipelines, testing strategies, version control organization, and recipes for going live. We&amp;#8217;ve had a lot of good feedback on this tutorial so far, so I&amp;#8217;m glad to finally bring this to my favorite conference.&lt;/p&gt;

&lt;p&gt;On Oct 13 I&amp;#8217;ll join Rebecca Parsons to talk about Evolutionary Architecture. Rebecca&amp;#8217;s long been our chief technical firefighter on difficult projects, which often have complicated dependencies to enterprise architecture. I&amp;#8217;ve long been urging her to talk more about her experiences and techniques for handling these issues, so it will be good to work with her on this tutorial.&lt;/p&gt;

&lt;p&gt;In between I&amp;#8217;ll be hanging around the conference catching up on all the good pickings that will be available.&lt;/p&gt;

&lt;p&gt;(If you want to register, using the discount code &amp;#8220;fowl1250&amp;#8221; will get you a worthwhile discount.)&lt;/p&gt;</content>
  </entry><entry>
    <title>Neal Ford's video workshop on agile engineering</title>
    <link href="http://martinfowler.com/snips/201108261000.html"/>
    <updated>2011-08-26T10:00:00-04:00</updated>
    <id>tag:martinfowler.com,2011-08-26:Neal-Ford-s-video-workshop-on-agile-engineering</id>
    <category term=""/>
    <content type="html">&lt;div class = 'img'&gt;&lt;img src = 'http://martinfowler.com/snips/neal.jpg' width = '100' height = '103' alt = 'Neal Ford' title = 'Neal Ford'/&gt;&lt;/div&gt;&lt;p&gt;My colleague Neal Ford is a frequent writer and speaker who shares many of my interests and opinions (and is an excellent source of ideas for me to clip). In 2009-10 he wrote a &lt;a href='http://www.ibm.com/developerworks/java/library/j-eaed1/index.html'&gt;series of fifteen articles&lt;/a&gt; for IBM developerWorks which dug deeper into the question of evolutionary architecture and design. His topics included Test Driven Development, leveraging reusable code, refactoring towards design and Domain-Specific Languages.&lt;/p&gt;

&lt;p&gt;Now he&amp;#8217;s followed on from this and recorded a &lt;a href='http://my.safaribooksonline.com/video/-/9781449314439'&gt;video workshop on Agile Engineering Practices&lt;/a&gt; for O&amp;#8217;Reilly that&amp;#8217;s available on safari books online. These cover much of the topics that make evolutionary design possible, including Test-Driven Design, automation, and testing strategies.&lt;/p&gt;</content>
  </entry><entry>
    <title>photostream 12</title>
    <link href="http://martinfowler.com/photos/12.html"/>
    <updated>2011-08-25T15:35:00-04:00</updated>
    <id>tag:martinfowler.com,2011-08-25:photostream-12</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/12.html'&gt;&lt;img src = 'http://martinfowler.com/photos/12.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Mesa Arch, Canyonlands N.P., Utah&lt;/p&gt;
</content>
  </entry><entry>
    <title>ThoughtWorks Microsite on Continuous Delivery</title>
    <link href="http://continuous-delivery.thoughtworks.com"/>
    <updated>2011-08-24T10:02:00-04:00</updated>
    <id>tag:martinfowler.com,2011-08-24:ThoughtWorks-Microsite-on-Continuous-Delivery</id>
    <category term=""/>
    <content type="html">&lt;p&gt;ThoughtWorks has launched a &lt;a href='http://continuous-delivery.thoughtworks.com/'&gt;microsite devoted to Continuous Delivery&lt;/a&gt;. At the moment you&amp;#8217;ll find some short videos from the ThoughtWorks Live event we did in May, plus links to recent writing by Jez Humble (oops, now I have to call him the &lt;a href='http://drdobbs.com/joltawards/231500080?pgno=7'&gt;award-winning&lt;/a&gt; Jez Humble). We also post details of our upcoming events in the field of Continuous Delivery and Devops.&lt;/p&gt;</content>
  </entry><entry>
    <title>Beaten Again</title>
    <link href="http://martinfowler.com/snips/201108240949.html"/>
    <updated>2011-08-24T09:49:00-04:00</updated>
    <id>tag:martinfowler.com,2011-08-24:Beaten-Again</id>
    <category term=""/>
    <content type="html">&lt;p&gt;In the software world, we have the &lt;a href='http://drdobbs.com/joltawards'&gt;Jolt awards&lt;/a&gt;. These were originally run by Software Development magazine and are now run by Dr Dobbs magazine. My books have won a couple of &amp;#8216;productivity awards&amp;#8217; - which are essentially the runner-up awards - but I&amp;#8217;ve never snagged to top award (now called the &amp;#8216;excellence award&amp;#8217;). This year my &lt;a href='\'&gt;DSL book&lt;/a&gt; was up for an award and &lt;a href='http://drdobbs.com/joltawards/231500080?pgno=2'&gt;won a &amp;#8216;finalist award&amp;#8217;&lt;/a&gt; (essentially this means I was runner-up to the runner-ups).&lt;/p&gt;

&lt;p&gt;So I failed again, but this year I would have been very annoyed if I had won. I&amp;#8217;ve argued all year that Jez and Dave&amp;#8217;s book on &lt;a href='http://martinfowler.com/books.html#continuousDelivery'&gt;Continuous Delivery&lt;/a&gt; was the most important book released this year, and so I&amp;#8217;m glad that Dr Dobbs &lt;a href='http://drdobbs.com/joltawards/231500080?pgno=7'&gt;agreed with me&lt;/a&gt; and gave them the excellence award. Congratulations to Jez and Dave in joining the long list of people who have kept me away from this award.&lt;/p&gt;

&lt;p&gt;Although I keep missing the top prize, my signature series has a very good record with these awards. The 10 books in my series so far have picked up 1 finalist, 4 productivity and 2 excellence awards. Not a bad hit rate.&lt;/p&gt;</content>
  </entry><entry>
    <title>photostream 11</title>
    <link href="http://martinfowler.com/photos/11.html"/>
    <updated>2011-08-03T18:14:00-04:00</updated>
    <id>tag:martinfowler.com,2011-08-03:photostream-11</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/11.html'&gt;&lt;img src = 'http://martinfowler.com/photos/11.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Villa Rufolo, Ravello, Italy&lt;/p&gt;
</content>
  </entry><entry>
    <title>ThoughtWorks Technology Radar</title>
    <link href="http://www.thoughtworks.com/radar"/>
    <updated>2011-08-02T10:58:00-04:00</updated>
    <id>tag:martinfowler.com,2011-08-02:ThoughtWorks-Technology-Radar</id>
    <category term=""/>
    <content type="html">&lt;p&gt;We have now released the latest version of the ThoughtWorks Technology Radar. This is where a bunch of my colleagues get together and discuss the technologies that they think are worth keeping an eye on. It&amp;#8217;s not intended to be some comprehensively researched list, as it&amp;#8217;s just the aggregation of the opinions of the small group of people that create it. But since that group is an experienced group of ThoughtWorks consultants, I think it&amp;#8217;s a useful pointer to things to pay attention to in enterprise software.&lt;/p&gt;</content>
  </entry><entry>
    <title>photostream 10</title>
    <link href="http://martinfowler.com/photos/10.html"/>
    <updated>2011-07-12T19:56:00-04:00</updated>
    <id>tag:martinfowler.com,2011-07-12:photostream-10</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/10.html'&gt;&lt;img src = 'http://martinfowler.com/photos/10.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Canterbury Cathedral, Canterbury, England&lt;/p&gt;
</content>
  </entry><entry>
    <title>The LMAX Architecture</title>
    <link href="http://martinfowler.com/articles/lmax.html"/>
    <updated>2011-07-12T09:43:00-04:00</updated>
    <id>tag:martinfowler.com,2011-07-12:The-LMAX-Architecture</id>
    <category term=""/>
    <content type="html">&lt;p&gt;When I was at QCon London last year, there was much buzz around a talk about a new retail trading system. The thing that got people&amp;#8217;s attention was its approach to achieving its high performance needs - reaching 6 million TPS. It does this by running all its business logic on a single JVM thread, getting high speed without all the complications of concurrent programming. This article describes the architecture they use to pull this off.&lt;/p&gt;</content>
  </entry><entry>
    <title>photostream 9</title>
    <link href="http://martinfowler.com/photos/9.html"/>
    <updated>2011-07-06T18:45:00-04:00</updated>
    <id>tag:martinfowler.com,2011-07-06:photostream-9</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/9.html'&gt;&lt;img src = 'http://martinfowler.com/photos/9.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Gloucester, MA&lt;/p&gt;
</content>
  </entry><entry>
    <title>Mike Mason and I talk about Feature Branching</title>
    <link href="http://www.thoughtworks.com/perspectives/30-06-2011-continuous-delivery"/>
    <updated>2011-07-05T10:05:00-04:00</updated>
    <id>tag:martinfowler.com,2011-07-05:Mike-Mason-and-I-talk-about-Feature-Branching</id>
    <category term=""/>
    <content type="html">&lt;div class = 'img'&gt;&lt;img src = 'http://martinfowler.com/snips/mike-and-mf.jpg' width = '159' height = '88' alt = 'Mike Mason and Martin Fowler' title = 'Mike Mason and Martin Fowler'/&gt;&lt;/div&gt;&lt;p&gt;In this video (12 minutes) &lt;a href='http://mikemason.ca/blog/'&gt;Mike Mason&lt;/a&gt; and I talk about the perils of &lt;a href='http://martinfowler.com/bliki/FeatureBranch.html'&gt;Feature Branching&lt;/a&gt; and its alternatives.&lt;/p&gt;</content>
  </entry><entry>
    <title>photostream 8</title>
    <link href="http://martinfowler.com/photos/8.html"/>
    <updated>2011-06-23T19:41:00-04:00</updated>
    <id>tag:martinfowler.com,2011-06-23:photostream-8</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/8.html'&gt;&lt;img src = 'http://martinfowler.com/photos/8.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Boscastle, Cornwall&lt;/p&gt;
</content>
  </entry><entry>
    <title>Sam Newman talks about Continuous Delivery</title>
    <link href="http://www.thoughtworks.com/events/push-the-button"/>
    <updated>2011-06-21T09:37:00-04:00</updated>
    <id>tag:martinfowler.com,2011-06-21:Sam-Newman-talks-about-Continuous-Delivery</id>
    <category term=""/>
    <content type="html">&lt;div class = 'img'&gt;&lt;img src = 'http://martinfowler.com/snips/sam-cd.jpg' width = '116' height = '116' alt = 'Sam Newman' title = 'Sam Newman'/&gt;&lt;/div&gt;&lt;p&gt;&lt;a href='http://www.samnewman.org'&gt;Sam Newman&lt;/a&gt; is one of our Principal Consultants based in London who has been heavily involved in the development of our approaches to &lt;a href='http://martinfowler.com/delivery.html'&gt;Continuous Delivery&lt;/a&gt;. Recently he gave a series of QTB (Quarterly Technology Briefing) talks and &lt;a href='http://www.thoughtworks.com/events/push-the-button'&gt;one of these was videoed&lt;/a&gt; and put on the ThoughtWorks site. It&amp;#8217;s an excellent overview of why it&amp;#8217;s important to learn how to do Continuous Delivery on the modern web, together with an overview of the practices needed to achieve it.&lt;/p&gt;
&lt;!-- 
still of Sam taken from frame 9169 of video
--&gt;</content>
  </entry><entry>
    <title>photostream 7</title>
    <link href="http://martinfowler.com/photos/7.html"/>
    <updated>2011-05-28T09:54:00-04:00</updated>
    <id>tag:martinfowler.com,2011-05-28:photostream-7</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/7.html'&gt;&lt;img src = 'http://martinfowler.com/photos/7.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Jordan Pond, Acadia N.P., ME&lt;/p&gt;
</content>
  </entry><entry>
    <title>Reference pages for DSL patterns</title>
    <link href="http://martinfowler.com/dslCatalog"/>
    <updated>2011-05-13T09:35:00-04:00</updated>
    <id>tag:martinfowler.com,2011-05-13:Reference-pages-for-DSL-patterns</id>
    <category term=""/>
    <content type="html">&lt;p&gt;I&amp;#8217;ve been very tardy in doing this, but I&amp;#8217;ve finally put up a set of reference pages for the patterns in the &lt;a href='http://martinfowler.com/books.html#dsl'&gt;DSL Book&lt;/a&gt;. There&amp;#8217;s not much on each page, just the intent, chapter reference, and sometimes some summary text. I&amp;#8217;ve primarily put these up to give them a stable URI for reference purposes. There&amp;#8217;s a chance I&amp;#8217;ll put supplemental material up there too, but I&amp;#8217;ve had that intention before without anything happening.&lt;/p&gt;</content>
  </entry><entry>
    <title>photostream 6</title>
    <link href="http://martinfowler.com/photos/6.html"/>
    <updated>2011-05-12T20:41:00-04:00</updated>
    <id>tag:martinfowler.com,2011-05-12:photostream-6</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/6.html'&gt;&lt;img src = 'http://martinfowler.com/photos/6.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;St Malo, Brittany, France&lt;/p&gt;
</content>
  </entry><entry>
    <title>photostream 5</title>
    <link href="http://martinfowler.com/photos/5.html"/>
    <updated>2011-05-07T18:07:00-04:00</updated>
    <id>tag:martinfowler.com,2011-05-07:photostream-5</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/5.html'&gt;&lt;img src = 'http://martinfowler.com/photos/5.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Castle Hill, Ipswich, MA&lt;/p&gt;
</content>
  </entry><entry>
    <title>Musings on ebooks</title>
    <link href="http://martinfowler.com/articles/ebook.html"/>
    <updated>2011-05-05T09:18:00-04:00</updated>
    <id>tag:martinfowler.com,2011-05-05:Musings-on-ebooks</id>
    <category term=""/>
    <content type="html">&lt;p&gt;It&amp;#8217;s only just over a year since I got my first ebook reader. Now I only buy paper books when I really have to. I wrote my last book thinking of it primarily as a paper book, but that will be the last time, in the future electronic forms will be at the front of my mind. It&amp;#8217;s clear ebooks will change the book industry in a dramatic way, but it&amp;#8217;s not clear exactly how. Here are my current thoughts on what&amp;#8217;s happening.&lt;/p&gt;</content>
  </entry><entry>
    <title>Tutorial on Continuous Delivery at goto; Aarhus</title>
    <link href="http://martinfowler.com/snips/201105031617.html"/>
    <updated>2011-05-03T16:17:00-04:00</updated>
    <id>tag:martinfowler.com,2011-05-03:Tutorial-on-Continuous-Delivery-at-goto--Aarhus</id>
    <category term=""/>
    <content type="html">&lt;div class = 'img'&gt;&lt;img src = 'http://martinfowler.com/snips/jez.jpg' width = '116' height = '125' alt = 'Jez Humble' title = 'Jez Humble'/&gt;&lt;/div&gt;&lt;p&gt;I&amp;#8217;ll be joining my colleague Jez Humble to give another of our tutorials on Continuous Delivery at &lt;a href='http://gotocon.com/aarhus-2011/presentations/show_presentation.jsp?oid=3172'&gt;goto; Aarhus&lt;/a&gt;. This is the rebranded incarnation of JAOO - which has been my favorite conference for a long time now. This will be our first time doing the full day continuous delivery tutorial in Aarhus.&lt;/p&gt;</content>
  </entry><entry>
    <title>Reflections on 10 years since the agile manifesto at SD Times</title>
    <link href="http://www.sdtimes.com/link/35489"/>
    <updated>2011-05-03T13:05:00-04:00</updated>
    <id>tag:martinfowler.com,2011-05-03:Reflections-on-10-years-since-the-agile-manifesto-at-SD-Times</id>
    <category term=""/>
    <content type="html">&lt;p&gt;SD Times has published an interview with me on my thoughts on ten years since the Agile Manifesto. I answer questions about what brought me to the meeting, whether I think the manifesto should be changed, and what I see in the next five years of the agile movement.&lt;/p&gt;</content>
  </entry><entry>
    <title>photostream 4</title>
    <link href="http://martinfowler.com/photos/4.html"/>
    <updated>2011-05-02T14:17:00-04:00</updated>
    <id>tag:martinfowler.com,2011-05-02:photostream-4</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/4.html'&gt;&lt;img src = 'http://martinfowler.com/photos/4.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Kumarakom, Kerala, India&lt;/p&gt;
</content>
  </entry><entry>
    <title>Signature Series 40% off until May 15</title>
    <link href="http://martinfowler.com/snips/201104281449.html"/>
    <updated>2011-04-28T14:49:00-04:00</updated>
    <id>tag:martinfowler.com,2011-04-28:Signature-Series-40--off-until-May-15</id>
    <category term=""/>
    <content type="html">&lt;p&gt;It&amp;#8217;s been going on for a bit, but I&amp;#8217;ve been tardy in letting people know. Addison-Wesley are currently having &lt;a href='http://www.informit.com/promotions/promotion.aspx?promo=138302'&gt;a promotion on signature series books&lt;/a&gt;. You get 40% off if you buy through informIT and buy at least two books in any of the series (ie mine, Kent&amp;#8217;s or Mike&amp;#8217;s).&lt;/p&gt;</content>
  </entry><entry>
    <title>Adding photos to my feed</title>
    <link href="http://martinfowler.com/snips/201104231610.html"/>
    <updated>2011-04-23T16:10:00-04:00</updated>
    <id>tag:martinfowler.com,2011-04-23:Adding-photos-to-my-feed</id>
    <category term=""/>
    <content type="html">&lt;p&gt;You may have noticed some photos cropping up in my news feed. Like many geeks I indulge in photography. So far this has been a harmless personal diversion, but I&amp;#8217;ve reached the point where I&amp;#8217;m feeling a desire to share some of my photos with the Internet - just in case we have a shortage. So you&amp;#8217;ll see photos appear in my photostream from time to time. I intend to post no more than one or two a week.&lt;/p&gt;</content>
  </entry><entry>
    <title>photostream 3</title>
    <link href="http://martinfowler.com/photos/3.html"/>
    <updated>2011-04-23T15:12:00-04:00</updated>
    <id>tag:martinfowler.com,2011-04-23:photostream-3</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/3.html'&gt;&lt;img src = 'http://martinfowler.com/photos/3.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Mont Saint-Michel, Normandy, France&lt;/p&gt;
</content>
  </entry><entry>
    <title>photostream 2</title>
    <link href="http://martinfowler.com/photos/2.html"/>
    <updated>2011-04-23T15:11:00-04:00</updated>
    <id>tag:martinfowler.com,2011-04-23:photostream-2</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/2.html'&gt;&lt;img src = 'http://martinfowler.com/photos/2.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Charlestown, MA&lt;/p&gt;
</content>
  </entry><entry>
    <title>photostream 1</title>
    <link href="http://martinfowler.com/photos/1.html"/>
    <updated>2011-04-23T15:10:00-04:00</updated>
    <id>tag:martinfowler.com,2011-04-23:photostream-1</id>
    <category term=""/>
    <content type="html">
&lt;p&gt;&lt;a href = 'http://martinfowler.com/photos/1.html'&gt;&lt;img src = 'http://martinfowler.com/photos/1.jpg'&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;401 Trail, Crested Butte, CO&lt;/p&gt;
</content>
  </entry><entry>
    <title>Going Beyond Curly Braces</title>
    <link href="http://martinfowler.com/snips/201104191654.html"/>
    <updated>2011-04-19T16:54:00-04:00</updated>
    <id>tag:martinfowler.com,2011-04-19:Going-Beyond-Curly-Braces</id>
    <category term=""/>
    <content type="html">&lt;p&gt;On my long flight down to Australia recently I dug into a copy of &lt;a href='http://pragprog.com/titles/btlang/seven-languages-in-seven-weeks'&gt;Seven Languages in Seven Weeks&lt;/a&gt;. I spent less than seven hours on it, but found it a worthwhile read. He takes a lightening tour through seven languages. It&amp;#8217;s not enough to go into much depth on any them, but it is enough to get a rough feel what&amp;#8217;s interesting about them. I&amp;#8217;d particularly recommend it if you are just starting to explore beyond the curly-brace languages that dominate so much of current programming.&lt;/p&gt;

&lt;p&gt;One thing I particularly appreciate about pragprog books is that you get access to electronic versions in multiple formats. This book worked very well on the Kindle, despite the small screen.&lt;/p&gt;</content>
  </entry><entry>
    <title>Article on Non-Determinism in Tests</title>
    <link href="http://martinfowler.com/articles/nonDeterminism.html"/>
    <updated>2011-04-14T09:19:00-04:00</updated>
    <id>tag:martinfowler.com,2011-04-14:Article-on-Non-Determinism-in-Tests</id>
    <category term=""/>
    <content type="html">&lt;p&gt;In conversations with project teams, I&amp;#8217;ve heard a lot about problems with flaky, unreliable tests. These non-deterministic tests are a serious problem with testing efforts. So I&amp;#8217;ve written an article that talks about how to deal with these non-determinisms, discussing how to cope with some common causes: lack of isolation, asynchronous behavior, remote services, time, and resource leaks.&lt;/p&gt;</content>
  </entry><entry>
    <title>Q&amp;A on Story Points</title>
    <link href="http://blog.anandvishwanath.in/2011/03/questioning-story-points.html"/>
    <updated>2011-03-29T08:57:00-04:00</updated>
    <id>tag:martinfowler.com,2011-03-29:Q-A-on-Story-Points</id>
    <category term=""/>
    <content type="html">&lt;p&gt;My colleague &lt;a href='http://blog.anandvishwanath.in/'&gt;Anand Vishwanath&lt;/a&gt; has put together a nice Q&amp;amp;A on the role Story Points play on a project.&lt;/p&gt;</content>
  </entry><entry>
    <title>InfoQ interviews Jez Humble and me about Continuous Delivery</title>
    <link href="http://martinfowler.com/snips/201102181539.html"/>
    <updated>2011-02-18T15:39:00-05:00</updated>
    <id>tag:martinfowler.com,2011-02-18:InfoQ-interviews-Jez-Humble-and-me-about-Continuous-Delivery</id>
    <category term=""/>
    <content type="html">&lt;p&gt;After our tutorial at QCon San Francisco last year, the InfoQ people sat us down for an &lt;a href='http://www.infoq.com/interviews/jez-humble-martin-fowler-cd'&gt;interview on Continuous Delivery&lt;/a&gt;.&lt;/p&gt;</content>
  </entry><entry>
    <title>Update on malware issue with ThoughtWorks web sites</title>
    <link href="http://martinfowler.com/snips/201102181119.html"/>
    <updated>2011-02-18T11:19:00-05:00</updated>
    <id>tag:martinfowler.com,2011-02-18:Update-on-malware-issue-with-ThoughtWorks-web-sites</id>
    <category term=""/>
    <content type="html">&lt;p&gt;I&amp;#8217;ve posted &lt;a href='../articles/malware.html'&gt;an article detailing our malware attack&lt;/a&gt;. The short form is that we believe our sites are clear, but we currently have to operate them with reduced functionality. The malware only attacks a small proportion of visitors (which is part of what makes it difficult to deal with). However if you have visited our sites since Christmas with a windows machine, you should read more.&lt;/p&gt;</content>
  </entry><entry>
    <title>Speaking at ThoughtWorks Australia QTB</title>
    <link href="http://martinfowler.com/snips/201102171401.html"/>
    <updated>2011-02-17T14:01:00-05:00</updated>
    <id>tag:martinfowler.com,2011-02-17:Speaking-at-ThoughtWorks-Australia-QTB</id>
    <category term=""/>
    <content type="html">&lt;p&gt;Next week I&amp;#8217;m heading off to spend some time in Australia (thankfully away from all this snow-shovelling). While I&amp;#8217;m there I&amp;#8217;ll be participating in a series of &lt;a href='http://www.thoughtworks.com/events/thoughtworks-quarterly-briefing-continuous-delivery'&gt;Quarterly Technology Briefings&lt;/a&gt;. These will take the form of a panel Q&amp;amp;A on &lt;a href='http://martinfowler.com/delivery.html'&gt;Continuous Delivery&lt;/a&gt;. On the panel I shall be over-shadowed by &lt;a href='http://memeagora.blogspot.com/'&gt;Neal Ford&lt;/a&gt; and we will both be over-shadowed by &lt;a href='http://evan.bottch.com/'&gt;Evan Bottcher&lt;/a&gt;.&lt;/p&gt;</content>
  </entry><entry>
    <title>Investigating ThoughtWorks in Vancouver</title>
    <link href="http://martinfowler.com/snips/201102081553.html"/>
    <updated>2011-02-08T15:53:00-05:00</updated>
    <id>tag:martinfowler.com,2011-02-08:Investigating-ThoughtWorks-in-Vancouver</id>
    <category term=""/>
    <content type="html">&lt;p&gt;&lt;a href='http://www.linkedin.com/in/sidpinney'&gt;Sid Pinney&lt;/a&gt; often takes on the job of investigating new locations for ThoughtWorks offices. He&amp;#8217;s been one of the first to help start our offices in England, China, and Brazil. Last week I got an email saying he&amp;#8217;s investigating possibilities in Vancouver. He&amp;#8217;s looking for people to talk to: so if you&amp;#8217;re a prospective client, possible employee, or are just friendly and looking to have Sid buy you a free food - get in touch with him by &lt;a href='mailto:sgpinney@thoughtworks.com'&gt;email&lt;/a&gt; or &lt;a href='http://twitter.com/twsidpinney'&gt;twitter&lt;/a&gt;.&lt;/p&gt;</content>
  </entry><entry>
    <title>Malware alert on thoughtworks.com</title>
    <link href="http://martinfowler.com/snips/201102031214.html"/>
    <updated>2011-02-03T12:14:00-05:00</updated>
    <id>tag:martinfowler.com,2011-02-03:Malware-alert-on-thoughtworks-com</id>
    <category term=""/>
    <content type="html">&lt;p&gt;We seem to have a shy but annoying piece of malware hanging out on thoughtworks.com. As far as we can tell, it manifests itself as a hidden iframe that redirects you to a site that hosts malware. We&amp;#8217;re a bit vague on this, as it only appears rarely so only a couple of people have seen it.&lt;/p&gt;

&lt;p&gt;Our biggest sign of it is via google. Google reported our site on Jan 7th as having problems, we looked into it, didn&amp;#8217;t find anything, and Google&amp;#8217;s complaint went away very quickly. The flag went up again on Jan 31st and this time they emailed our webmaster. We looked again for a problem, without any success, so we asked them to re-review our site. Since then various Google diagnostics have raising and lowering the suspicious flag at a dizzying rate. As I write this the site is considered safe, but given the volatility of the opinion, we aren&amp;#8217;t sure about how things will go. (If you&amp;#8217;re concerned you can check &lt;a href='http://safebrowsing.clients.google.com/safebrowsing/diagnostic?site=www.thoughtworks.com'&gt;Google&amp;#8217;s safebrowsing link&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;Clearly this is a bit of malware that&amp;#8217;s set to only show itself occasionally, which makes it harder to deal with. The tricky bit is to find how it&amp;#8217;s getting into the site. We&amp;#8217;ve checked all our content and not found anything suspicious, but it could be third party javascript libraries, could be our Drupal instance, could even be a problem with our apache installation - but we don&amp;#8217;t know for sure.&lt;/p&gt;

&lt;p&gt;We&amp;#8217;re investigating this further (including following the recommendations of &lt;a href='http://www.stopbadware.org/home/security'&gt;stopbadware&lt;/a&gt;) but haven&amp;#8217;t yet found the root cause, although we do have some strong suspects. If you see anything suspicious on our site or would like to pass on any suggestions, please contact &lt;a href='mailto:webmaster@thoughtworks.com'&gt;Andy Yates&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As far as I know, this problem &lt;a href='http://safebrowsing.clients.google.com/safebrowsing/diagnostic?site=martinfowler.com'&gt;does not affect&lt;/a&gt; martinfowler.com - which is a static site built with my custom scripts, so is less likely to attract such a problem. But do let me know if you see anything.&lt;/p&gt;</content>
  </entry><entry>
    <title>Video of Wikileaks panel</title>
    <link href="http://martinfowler.com/snips/201101211118.html"/>
    <updated>2011-01-21T11:18:00-05:00</updated>
    <id>tag:martinfowler.com,2011-01-21:Video-of-Wikileaks-panel</id>
    <category term=""/>
    <content type="html">&lt;p&gt;I enjoyed the Churchill Club panel discussion on wikileaks on Wednesday. It&amp;#8217;s thoughtful and well worth watching &lt;a href='http://fora.tv/2011/01/19/WikiLeaks_Why_It_Matters_Why_It_Doesnt'&gt;the video&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I particularly appreciated Daniel Ellsberg&amp;#8217;s picture of the climate of government secrecy and Roy&amp;#8217;s call to follow the example of librarians resisting secret gag orders. (There was a bit were it threatens to sink deep into the nature of libertarianism, but fortunately that didn&amp;#8217;t last long.) While my thoughts on wikileaks are complicated (and I&amp;#8217;ve not had the energy to write about them) I think the incident raises some very serious issues around the contending forces of privacy and openness. This panel provides a useful briefing on some of these perspectives.&lt;/p&gt;</content>
  </entry><entry>
    <title>Cindy is doing the Avon Walk for Breast Cancer</title>
    <link href="http://martinfowler.com/snips/201101201043.html"/>
    <updated>2011-01-20T10:43:00-05:00</updated>
    <id>tag:martinfowler.com,2011-01-20:Cindy-is-doing-the-Avon-Walk-for-Breast-Cancer</id>
    <category term=""/>
    <content type="html">&lt;p&gt;Last year Cindy, my wife, did Boston&amp;#8217;s Avon walk to raise money for breast cancer research. She decided to it again this year. Last year a good proportion of the money she raised came from my readers, and we&amp;#8217;re hoping we can get another round of support from you this year. If you&amp;#8217;d like to donate, please go to her &lt;a href='http://avonwalk.org/goto/Cindy.Chabot'&gt;walk page&lt;/a&gt;.&lt;/p&gt;</content>
  </entry><entry>
    <title>Speaking event in Hamburg</title>
    <link href="http://martinfowler.com/snips/201101180928.html"/>
    <updated>2011-01-18T09:28:00-05:00</updated>
    <id>tag:martinfowler.com,2011-01-18:Speaking-event-in-Hamburg</id>
    <category term=""/>
    <content type="html">&lt;p&gt;I&amp;#8217;m going to Germany next week and we&amp;#8217;ve added a third speaking event to my trip. As well as speaking at &lt;a href='http://www.sigs-datacom.de/oop2011/oop2011-eng/latest-news.html'&gt;OOP&lt;/a&gt; in Munich and in &lt;a href='http://jugcologne.eu/'&gt;Cologne&lt;/a&gt;, ThoughtWorks has organized a &lt;a href='http://www.thoughtworks.com/events/software-design-21st-century-deutschland'&gt;speaking event in Hamburg&lt;/a&gt; on Jan 31st. My colleagues Erik D&#xF6;ernenburg and Wolf Schlegel will give a talk on Continuous Deployment and I&amp;#8217;ll follow with my usual &lt;a href='http://martinfowler.com/bliki/SuiteOfTalks.html'&gt;SuiteOfTalks&lt;/a&gt;.&lt;/p&gt;</content>
  </entry><entry>
    <title>WikiLeaks:  Why it Matters. Why it Doesn&#x2019;t?</title>
    <link href="http://martinfowler.com/snips/201101171156.html"/>
    <updated>2011-01-17T11:56:00-05:00</updated>
    <id>tag:martinfowler.com,2011-01-17:WikiLeaks---Why-it-Matters--Why-it-Doesn---t-</id>
    <category term=""/>
    <content type="html">&lt;p&gt;ThoughtWorks and The Churchill Club are presenting a &lt;a href='http://www.thoughtworks.com/events/wikileaks-why-it-matters-why-it-doesnt'&gt;panel discussion on Wikileaks&lt;/a&gt; which will explore the consequences of this saga on the freedom of the internet. The panel features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://en.wikipedia.org/wiki/Daniel_Ellsberg'&gt;Daniel Ellsberg&lt;/a&gt; (of Pentagon Papers fame)&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.shirky.com/'&gt;Clay Shirky&lt;/a&gt; (thoughtful writer about the internet)&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.thoughtworks.com/roy-singham'&gt;Roy Singham&lt;/a&gt; (ThoughtWorks&amp;#8217;s founder)&lt;/li&gt;

&lt;li&gt;&lt;a href='http://en.wikipedia.org/wiki/Peter_Thiel'&gt;Peter Thiel&lt;/a&gt; (co-founder of PayPal)&lt;/li&gt;

&lt;li&gt;&lt;a href='http://en.wikipedia.org/wiki/Jonathan_Zittrain'&gt;Jonathan Zittrain&lt;/a&gt; (law professor at Harvard).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The panel is moderated by &lt;a href='http://en.wikipedia.org/wiki/Paul_Jay'&gt;Paul Jay&lt;/a&gt; from The Real News Network.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s being held at 5.30 PST on Wednesday January 19th at the Santa Clara Marriott. You can also watch the event live on &lt;a href='http://fora.tv/live/churchill_club/Wikileaks_Why_it_Matters'&gt;Fora.tv&lt;/a&gt; and &lt;a href='http://therealnews.com/t2/about-us/events'&gt;The Real News Network&lt;/a&gt;. Streaming starts at 7pm PST.&lt;/p&gt;</content>
  </entry></feed>

