<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/atom10full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-9283881</id><updated>2008-09-26T23:51:34.192+01:00</updated><title type="text">Paul's techie blog</title><subtitle type="html">The thoughts of a software developer with Agile tendencies.</subtitle><link rel="alternate" type="text/html" href="http://merecomplexities.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default?start-index=26&amp;max-results=25" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://paulwilson.blogspot.com/atom.xml" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>251</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://paulwilson.blogspot.com/atom.xml" type="application/atom+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site.</feedburner:browserFriendly><entry><id>tag:blogger.com,1999:blog-9283881.post-334003011678480086</id><published>2008-09-26T23:16:00.002+01:00</published><updated>2008-09-26T23:51:34.514+01:00</updated><title type="text" /><content type="html">&lt;h1&gt;Scotland on Rails 2009 - Call for Proposals&lt;/h1&gt;

&lt;a href="http://www.flickr.com/photos/24947950@N03/2387234843/" title="Scotland on Rails by Jim Weirich, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2321/2387234843_9127f95fab.jpg" width="375" height="500" alt="Scotland on Rails" /&gt;&lt;/a&gt;

&lt;p&gt;Last week, we opened up the CFP for Scotland on Rails 2009.  After the success of this year, and the buzz around SoR in Berlin, next year's going to be pretty special. We've already confirmed keynotes &lt;a href="http://www.vernix.org/marcel/"&gt;Marcel Molina&lt;/a&gt;, and Giles Bowkett&lt;a href="http://gilesbowkett.blogspot.com/"&gt;&lt;/a&gt;.  &lt;a href="http://chadfowler.com/"&gt;Chad Fowler&lt;/a&gt;'s coming too, and is teaching a charity tutorial along with Marcel.  &lt;/p&gt; 

&lt;p&gt;The venue is University of &lt;a href="http://maps.google.co.uk/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=18+Holyrood+Park+Rd,+Edinburgh,+City+of+Edinburgh,+EH16+5&amp;amp;sll=55.944153,-3.176508&amp;amp;sspn=0.022975,0.054932&amp;amp;ie=UTF8&amp;amp;ll=55.941798,-3.172646&amp;amp;spn=0.011488,0.027466&amp;amp;z=15"&gt;Edinburgh's Pollock Halls&lt;/a&gt; again, 26 to 28 March 2009.&lt;/p&gt;

&lt;p&gt;The call for sessions is here, by the way: &lt;a href="http://scotlandonrails.com/proposals.html"&gt;http://scotlandonrails.com/proposals.html&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/404186904" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/334003011678480086/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=334003011678480086" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/334003011678480086" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/334003011678480086" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/404186904/scotland-on-rails-2009-call-for.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2008/09/scotland-on-rails-2009-call-for.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-8832349608331122834</id><published>2008-09-24T22:36:00.003+01:00</published><updated>2008-09-26T23:15:59.492+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="railsconfeurope 2008 scotlandonrails" /><title type="text" /><content type="html">&lt;h1&gt;Rails Conference 2008&lt;/h1&gt;


 &lt;p&gt;It&amp;#8217;s been a few weeks since the European Rails Conference in Berlin and about time I shared my experiences.&lt;/p&gt;


 &lt;h2&gt;Vibe&lt;/h2&gt;


 &lt;p&gt;&lt;a href="http://www.flickr.com/photos/x180/2822423401/" title="RailsConf Europe Audience by duncandavidson, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3180/2822423401_cc29ea2f8e.jpg" width="500" height="333" alt="RailsConf Europe Audience" /&gt;&lt;/a&gt;&lt;/p&gt;


 &lt;p&gt;At the Bratwurst on Rails someone asked what I was excited about seeing at the conference, and I couldn&amp;#8217;t answer. Last year &lt;span class="caps"&gt;DHH&lt;/span&gt;&amp;#8217;s keynote was that the revolution was over, which seems to be holding true.  Changes are steady and incremental, and there doesn&amp;#8217;t seem much to get really excited over.  This year&amp;#8217;s &lt;span class="caps"&gt;DHH&lt;/span&gt; keynote was on refactoring (without mentioning the word): he made good points but nothing particularly new to anyone who&amp;#8217;s been exposed to Extreme Programming .&lt;/p&gt;


 &lt;p&gt;I don&amp;#8217;t know how much this was just my perception, but the conference felt a bit flat.&lt;/p&gt;


 &lt;h2&gt;Ruby with an Accent&lt;/h2&gt;


 &lt;p&gt;&lt;a href="http://www.flickr.com/photos/x180/2824222571/" title="Alan Francis and Paul Wilson by duncandavidson, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3255/2824222571_29251e7567.jpg" width="500" height="333" alt="Alan Francis and Paul Wilson" /&gt;&lt;/a&gt;&lt;/p&gt;


 &lt;p&gt;Alan and I talked on organising a regional conference; considering who we were up against and the niche non-technical nature of our talk, it was reasonably well attended and was followed by a lively question and answer session which spilled into the corridor track.  The slides are &lt;a href="http://en.oreilly.com/railseurope2008/public/schedule/detail/3549"&gt;here&lt;/a&gt;.  The session has also been accepted at &lt;a href="http://www.rubyconf.org/"&gt;RubyConf in Orlando&lt;/a&gt; but I&amp;#8217;m not going to make it &lt;a href="http://woss.name/"&gt;Graeme&lt;/a&gt; will be talking my place.&lt;/p&gt;


 &lt;h2&gt;RSpec&lt;/h2&gt;


 &lt;p&gt;&lt;a href="http://www.flickr.com/photos/dazed81/314460671/" title="Broken Specs by Dazed81, on Flickr"&gt;&lt;img src="http://farm1.static.flickr.com/121/314460671_b8965a132f.jpg" width="500" height="375" alt="Broken Specs" /&gt;&lt;/a&gt;&lt;/p&gt;


 &lt;p&gt;Last year there was a lot of excitement and sessions around &lt;a href="http://rspec.info/;"&gt;RSpec&lt;/a&gt; this year not so-much.  The corridor-track did confirm, though, that it has become the &lt;em&gt;de facto&lt;/em&gt; method of testing Rails apps. This is despite a large amount of indifference, even perhaps hostility, from the Rails core-team. I haven&amp;#8217;t tried or been exposed to RSpec much, though I admit to feeling a certain amount of antipathy towards it and &amp;#8216;BDD&amp;#8217; &amp;#8211; largely I don&amp;#8217;t see the point.  However people new to programmer testing do seem to get it.&lt;/p&gt;


 &lt;p&gt;One concern is that discussions around the advantages of RSpec seem to place it in the acceptance/customer testing niche.  I wonder if it is being used appropriately at the unit level. I really should try it out properly; I may even become a convert.&lt;/p&gt;


 &lt;h2&gt;Ruby versions&lt;/h2&gt;


 &lt;p&gt;&lt;a href="http://www.flickr.com/photos/x180/2822416949/" title="David A. Black by duncandavidson, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3186/2822416949_36081026c8.jpg" width="333" height="500" alt="David A. Black" /&gt;&lt;/a&gt;&lt;/p&gt;


 &lt;p&gt;Ruby&amp;#8217;s David A Black led a well-attended plenary &lt;a href="find_link??http://dablog.rubypal.com/2008/9/6/back-from-railsconf-europe-2008"&gt;symposimi&lt;/a&gt; which touched on the new Ruby versions.  There didn&amp;#8217;t seem to be a lot of excitement around 1.9, and zero interest in 1.8.7.  Pretty much the entire conference was present and from a show of hands, probably 25% had looked at 1.9 and a handful 1.8.7.  There was one person using 1.8.7, and that was because it was the only way she could get a patched version for whatever Linux flavour she was using.&lt;/p&gt;


 &lt;h2&gt;Alternative VMs&lt;/h2&gt;


 &lt;p&gt;&lt;a href="http://www.flickr.com/photos/chill/49098673/" title="Maglev by chill, on Flickr"&gt;&lt;img src="http://farm1.static.flickr.com/31/49098673_e4868bd5d9.jpg" width="500" height="333" alt="Maglev" /&gt;&lt;/a&gt;&lt;/p&gt;


 &lt;h3&gt;Rubinius&lt;/h3&gt;


 &lt;p&gt;The &lt;a href="http://rubini.us/"&gt;Rubinius&lt;/a&gt; presentation clashed with ours, but from what I&amp;#8217;ve heard (and gathered from other sources) the big news is that there&amp;#8217;s not much news.  They seem to have embarked on a rewrite phase and a 1.0 release is &lt;em&gt;sometime&lt;/em&gt; away.&lt;/p&gt;


 &lt;h3&gt;Maglev&lt;/h3&gt;


 &lt;p&gt;&amp;#8220;Monty Williams:http://smalltalkers.ning.com/profile/Monty ran a &lt;a href="http://ruby.gemstone.com/"&gt;Maglev&lt;/a&gt; BOF, which was really more of an unofficial presentation running after hours.  Again, there&amp;#8217;s not much to report here &amp;#8211; it runs benchmarks significantly  faster than &lt;span class="caps"&gt;MRI&lt;/span&gt;.  (The really interesting aspect &amp;#8211; the transparent persistence wasn&amp;#8217;t even demonstrated.)  A public beta, never mind a 1.0 release, is not going to happen anytime soon.&lt;/p&gt;


 &lt;p&gt;He did suggest that the eventual licensing model would include a reasonably generous free option.  I didn&amp;#8217;t make a note, but I think he was musing on single &lt;span class="caps"&gt;CPU&lt;/span&gt; and 1 or 2GB memory for free.&lt;/p&gt;


 &lt;h3&gt;JRuby&lt;/h3&gt;


 &lt;p&gt;I didn&amp;#8217;t go to any &amp;#8220;JRuby:http://jruby.codehaus.org/ presentations as there didn&amp;#8217;t seem to be much &lt;em&gt;that&lt;/em&gt; new and exciting to see.  From speaker-room conversation, I gather they are pushing the multi-threading advantages with Rails, and deployment on Glassfish.  They are, also making steady progress with regular 1.1x releases and remain the only production alternative to &lt;span class="caps"&gt;MRI&lt;/span&gt;.&lt;/p&gt;


 &lt;h2&gt;Working with multiple applications&lt;/h2&gt;


 &lt;p&gt;&lt;img src='http://merecomplexities.com/rebel-fleet.jpg'/&gt;&lt;/p&gt;


 &lt;p&gt;A recurring theme for me (well one tutorial and one presentation) was dividing your application into many little apps, both for re-packaging in different contexts and maintaining  modularity / separation of concerns.  This is an approach I&amp;#8217;ve never tried but quite like, although I&amp;#8217;d always felt a bit vague about how it would actually work.  My only known example, 37s&amp;#8217; Basecamp integration with Campfire and Writeboard seems quite a kludge.  Two approaches were presented: creating applications as &amp;#8216;resourceful&amp;#8217; plugins; deploying multiple applications with a single sign-on.&lt;/p&gt;


 &lt;h3&gt;Resourceful plugins&lt;/h3&gt;


 &lt;p&gt;The &amp;#8216;resourceful&amp;#8217; plugin is an approach to reuse mini-applications across many different sites. A conference site, for instance, is really a mixture of different applications: you might want a &lt;span class="caps"&gt;CMS&lt;/span&gt; for displaying the more static content, a blog application for news, a session submission and approval application, and a delegate registration application; a product site might want a &lt;span class="caps"&gt;CMS&lt;/span&gt; and blog, but need a shopping cart. Both sites probably want to customise the applications in some way.&lt;/p&gt;


 &lt;p&gt;In a half-day tutorial &lt;a href="http://en.oreilly.com/railseurope2008/public/schedule/speaker/1467"&gt;Ben Scofield&lt;/a&gt; presented an approach for extracting those separate applications into plugins for reuse, and non-invasive customisation, in different applications.  This is a similar approach to &lt;a href="http://rails-engines.org/"&gt;Engines&lt;/a&gt;, but without the need for a framework and deep hooks into the Rails code that need to be fixed for each release.&lt;/p&gt;


 &lt;p&gt;There presentation is &lt;a href="http://www.culann.com/2008/09/tutorial-aftermath"&gt;here&lt;/a&gt;.  You might also want to check out the source for &lt;a href="http://github.com/vigetlabs/bloget/tree/master"&gt;bloget&lt;/a&gt; and &lt;a href="http://github.com/vigetlabs/sandstone/tree/master"&gt;sandstone&lt;/a&gt;, a  blog and &lt;span class="caps"&gt;CMS&lt;/span&gt; application written as resourceful plugins.&lt;/p&gt;


 &lt;h3&gt;Multiple co-operating apps&lt;/h3&gt;


 &lt;p&gt;Justin Gehtland&amp;#8217;s presented a different aspect: deploying your site as multiple small rails app.  The is more robust: if one app goes down the other&amp;#8217;s keep going.  It also makes it possible to scale and tune different parts of the application according to their own usage.  The illusion of being a single app to the user is maintained through a single-signon server (eg &lt;a href="http://code.google.com/p/rubycas-server/"&gt;RubyCAS-Server&lt;/a&gt;), sharing code through plugins, a shared common database, and asynchronous messaging (eg via active-messaging).&lt;/p&gt;


 &lt;p&gt;Justin&amp;#8217;s written this up with example code &lt;a href="http://blog.thinkrelevance.com/2008/9/3/small-things-loosely-joined-written-fast"&gt;here&lt;/a&gt;.&lt;/p&gt;


 &lt;p&gt;As well including some great material in his talk, Justin is also a hugely entertaining speaker &amp;#8211; this was my favourite session of the conference.&lt;/p&gt;


 &lt;h2&gt;Fizzled out&lt;/h2&gt;


 &lt;p&gt;Like last year, there was no closing keynote: the last session ended and everyone just wandered off; the conference just fizzled out, like this blog post.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/402185029" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/8832349608331122834/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=8832349608331122834" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/8832349608331122834" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/8832349608331122834" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/402185029/rails-conference-2009-it-been-few-weeks.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2008/09/rails-conference-2009-it-been-few-weeks.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-1970765498725471774</id><published>2008-08-28T22:44:00.000+01:00</published><updated>2008-08-28T22:45:05.618+01:00</updated><title type="text" /><content type="html">&lt;h1&gt;Off to Berlin&lt;/h1&gt;

 &lt;p&gt;I&amp;#8217;m looking forward to going to to Berlin next week for &lt;a href="http://en.oreilly.com/railseurope2008/public/content/home"&gt;RailsConf Europe&lt;/a&gt;.  Last year&amp;#8217;s conference was interesting and great fun.&lt;/p&gt;


 &lt;p&gt;This year I&amp;#8217;ll be speaking with &lt;a href="http://alancfrancis.com/"&gt;Alan Francis&lt;/a&gt; on organising a regional conference.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/377505582" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/1970765498725471774/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=1970765498725471774" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/1970765498725471774" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/1970765498725471774" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/377505582/off-to-berlin-i-looking-forward-to.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2008/08/off-to-berlin-i-looking-forward-to.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-514963723831685007</id><published>2008-08-19T23:30:00.001+01:00</published><updated>2008-08-19T23:30:54.824+01:00</updated><title type="text" /><content type="html">&lt;h1&gt;Clarke Ching&amp;#8217;s Bastard &lt;span class="caps"&gt;CEO&lt;/span&gt;&lt;/h1&gt;

 &lt;p&gt;Being such a nice chap, &lt;a href="http://www.clarkeching.com/2008/08/bastard-ceos.html"&gt;Clarke&amp;#8217;s having writing the Bastard &lt;span class="caps"&gt;CEO&lt;/span&gt;&lt;/a&gt; in his soon-to-be-published &lt;a href="http://www.rollingrocksdownhill.com/"&gt;business novel&lt;/a&gt;.  Ironically it is incredibly easy for someone in a position of power to become an arse-hole: all they have to do is ignore their elevated rank.&lt;/p&gt;


 &lt;p&gt;In Gore Vidal&amp;#8217;s historical novel &lt;a href="http://en.wikipedia.org/wiki/Julian_(novel)"&gt;Julian&lt;/a&gt;, the newly created emperor is taking a bath while discussing politics with his uncle, a distinguished senator, when his friend Oribasius arrives:&lt;/p&gt;


&lt;blockquote&gt;
I submerged for a moment, eyes tight shut, soaking my head. When I came to the surface, Oribasius was sitting on the bench beside my uncle.

&amp;#8220;That is no way to approach the sacred presence.&amp;#8221; And I splashed Oribasius very satisfactorily. He laughed. My uncle Julian laughed too, for I had soaked him as well. Then I was alarmed. In just this way are monsters born. First the tyrant plays harmless games: splashes senators in the bath, serves wooden food to dinner guests, plays practical jokes; and no matter what he says or does, everyone flatters him, finds witty his most inane remarks. Then the small jokes begin to pall&amp;#8230;.
&lt;/blockquote&gt; 

 &lt;p&gt;Before he became emperor, Julian would have received some censure for splashing a senator: he has now lost that feedback; as emperor he now must either have the discipline and self-awareness to be an accurate judge of his own behaviour or becomes another Nero or Caligula.&lt;/p&gt;


 &lt;p&gt;Fortunately our managers and &lt;span class="caps"&gt;CEO&lt;/span&gt;&amp;#8217;s don&amp;#8217;t quite have the power and privileges of Roman emperors, but they often run mad in their own smaller ways. This is especially true if they believe their own myths about their &amp;#8220;open door policy&amp;#8221;, or &amp;#8220;speaking their own mind and expecting everyone else to do the same&amp;#8221;.  One of the lessons I took from the &lt;a href="http://agilescotland.blogspot.com/2006/03/deep-dynamics-of-agile-teams-2-day.html"&gt;Deep Dynamics of Agile Teams&lt;/a&gt; course I helped organise a few years ago was that figures in authority cause resentment when they do not recognise their own rank.  Behaviour which is acceptable between peers, can be inappropriate when coming from a high ranking individual: for instance gallows humour about the likelihood of redundancies is okay amongst work colleagues, but in extreme bad taste coming from a &lt;span class="caps"&gt;CEO&lt;/span&gt;.&lt;/p&gt;


 &lt;p&gt;I imagine Harry, Clarke&amp;#8217;s fictional &lt;span class="caps"&gt;CEO&lt;/span&gt;, to be someone lacking Julian&amp;#8217;s astuteness; he has come to believe what is implied by the behaviour of his subordinates that he is a particularly witty, interesting, and wise individual who&amp;#8217;s views everyone is eager to hear.  I would expect a Bastard &lt;span class="caps"&gt;CEO&lt;/span&gt; like Harry to&lt;/p&gt;


 &lt;ul&gt;
 &lt;li&gt;talk the most and for longest during meetings avoiding soliciting, listening to, or giving much time to other&amp;#8217;s views or questions&lt;/li&gt;
  &lt;li&gt;make inappropriate jokes about other&amp;#8217;s abilities, timeliness, or diligence (a joke about installing closed-circuit cameras to stop people slaking off for instance, would be great for demotivating a stressed-out development team)&lt;/li&gt;
  &lt;li&gt;organise meetings (or more likely get his PA to do it) and turn up very late, or not at all.  After all, no-one ever complains and Harry&amp;#8217;s time is more important than everyone else&amp;#8217;s time.&lt;/li&gt;
  &lt;li&gt;lecture others at length and in detail on how their jobs should be done, without any regard for the other&amp;#8217;s skills, experience, or actual productivity&lt;/li&gt;
  &lt;li&gt;Blatantly appropriating other&amp;#8217;s ideas as his own by copying entire emails or documents and signing them &amp;#8220;Harry&amp;#8221;, after-all when he owns the other person that person ideas are his own.  Besides he probably inspired them anyway.&lt;/li&gt;
 &lt;/ul&gt;


 &lt;p&gt;The corrupting influence of power is often about losing basic social feedback.  Finding ways to give the individual feedback on his or here behaviour can be a way of making working with them at least tolerable.  It can be a dangerous game though; sometimes it&amp;#8217;s best to just stay out of the way.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/369423753" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/514963723831685007/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=514963723831685007" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/514963723831685007" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/514963723831685007" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/369423753/clarke-ching-bastard-ceo-being-such.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2008/08/clarke-ching-bastard-ceo-being-such.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-4031908205503039396</id><published>2008-08-15T23:00:00.003+01:00</published><updated>2008-08-16T14:25:35.160+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="unit tests" /><category scheme="http://www.blogger.com/atom/ns#" term="Mock Objects" /><category scheme="http://www.blogger.com/atom/ns#" term="Interaction Based Tests" /><category scheme="http://www.blogger.com/atom/ns#" term="TDD" /><title type="text" /><content type="html">&lt;h1&gt;Mocks considered harmful&lt;/h1&gt;


 &lt;p&gt;Some time ago I tired of using JMock.  I&amp;#8217;d come to realise that it was badly affecting my production and test code.  I have since seen these problems consistently repeated in heavily mocked code-bases: these include incorrect production code with passing unit tests, hard to change production code, functional object decomposition, too many classes, hard to read tests, mammoth test set-ups.&lt;/p&gt;


 &lt;h2&gt;Concerning mocks, stubs, fakes, test doubles&lt;/h2&gt;


 &lt;p&gt;Martin Fowler&amp;#8217;s &lt;a href="http://martinfowler.com/articles/mocksArentStubs.html"&gt;Mocks aren&amp;#8217;t stubs&lt;/a&gt; essay clearly explains the distinction between Mocks and Stubs, and the associated &amp;#8220;Interaction-based&amp;#8221; versus &amp;#8220;State-based&amp;#8221; testing. He now uses &lt;a href="http://www.amazon.co.uk/xUnit-Test-Patterns-Refactoring-Addison-Wesley/dp/0131495054"&gt;Meszaros&amp;#8217;&lt;/a&gt; terminology of &amp;#8220;Test Doubles&amp;#8221; to mean any object that a test substitutes for a production object and Fakes which provide completely functional but unfit-for-production &amp;#8220;Test Doubles&amp;#8221;.  I am not going to use the Meszaros: I&amp;#8217;m uncomfortable with &amp;#8220;Double&amp;#8221; as being an unobvious term, preferring &amp;#8220;dummy object&amp;#8221; (I would use &amp;#8220;fake&amp;#8221; if it hadn&amp;#8217;t been taken); I don&amp;#8217;t think the distinction between stubs and fakes is important or, in practice, clearly defined.&lt;/p&gt;


 &lt;p&gt;Mocks and stubs are both &amp;#8220;dummy objects&amp;#8221;.  The distinction is important as they tend to encourage different styles of testing and production code.  With &lt;em&gt;mocks&lt;/em&gt; you would set up your expectations of its interaction with the production code, then run your test;  typically integration with xUnit ensures that the expectations were met.  Stubs are simple drop-in replacements for production objects, supplying canned answers to various operations.  Mocks invariably come from mocking frameworks, while stubs are typically hand-rolled.&lt;/p&gt;


 &lt;p&gt;Mock objects come packaged with their own ideology: the plausible belief that classes should be tested in isolation and in terms of the way they interact with their collaborators.  This is &lt;em&gt;Interaction Based Testing&lt;/em&gt;.&lt;/p&gt;


 &lt;p&gt;Classically we would use production objects where possible, only stubbing out objects which live on the edge of the system, such as database access code.  Tests would be written in terms of what is different after running the code under test, hence the retronym &amp;#8216;State Based Testing&amp;#8217;.  Any interaction testing, such as checking parameters sent to the database, is done by recording method calls and arguments and checking the results by old-fashioned xUnit asserts.&lt;/p&gt;


 &lt;h2&gt;Mocks make hard to follow tests&lt;/h2&gt;


 &lt;p&gt;&lt;a href="http://flickr.com/photos/nic/521609158/"&gt;&lt;img src="http://merecomplexities.com/lost.jpg" title="lost" alt="lost" /&gt;&lt;/a&gt;&lt;/p&gt;


 &lt;p&gt;Back in my mockist phase I would often return to some tests, and be surprised at how much difficulty I had following my own test code despite the (specious) elegance of JMock&amp;#8217;s fluent interface.  The unnatural ordering of actions in a mock tests doesn&amp;#8217;t help: mock test inverts the order of cause and effect.  In a classic test the order is&lt;/p&gt;


 &lt;ol&gt;
 &lt;li&gt;set up the environment&lt;/li&gt;
  &lt;li&gt;run the test&lt;/li&gt;
  &lt;li&gt;check what happened was what we expected to happen&lt;/li&gt;
 &lt;/ol&gt;


 &lt;p&gt;In a mock test it goes&lt;/p&gt;


 &lt;ol&gt;
 &lt;li&gt;set up the environment&lt;/li&gt;
  &lt;li&gt;set up the checks for what will happen (expectations)&lt;/li&gt;
  &lt;li&gt;run the test&lt;/li&gt;
 &lt;/ol&gt;


 &lt;p&gt;Putting the &amp;#8220;assertions&amp;#8221; before running the test violates the way my brain expects the universe to operate: I&amp;#8217;d normally expect to check what happened after it occured.  Also setting up the environment often merge into the test expectations blurring the purpose of the test.  Mock tests tend to come with a large amount of setup code, the sheer volume of which hampers readability.&lt;/p&gt;


 &lt;p&gt;While mock-code is hard to read, it is not correspondingly hard to write, and so abstruse code is encouraged.&lt;/p&gt;


 &lt;h2&gt;Wrong code that passes the tests&lt;/h2&gt;


 &lt;p&gt;&lt;a href="http://failblog.org/2008/01/03/fail-bridge/"&gt;&lt;img src="http://failblog.wordpress.com/files/2008/01/failbridge.jpg" alt="failbridge.jpg" height="300px"/&gt;&lt;/a&gt;&lt;/p&gt;


 &lt;p&gt;Mock tester writers use more mocks than classicists use stubs.  This partly because of the mockist philosophy of testing each class in isolation, and also because the existence of a framework attracts its use (while stubs tend to be hand-rolled).  The risk with dummy objects is that they can embed incorrect assumptions about how the real code operates.  An easy example is production code assuming one based indices or while the dummy assumes zero based.&lt;/p&gt;


 &lt;p&gt;While test-driving heavily mocked code we often needed to fire up the debugger &amp;#8211; we had a bunch of passing unit tests, but the functional tests were failing.&lt;/p&gt;


 &lt;h2&gt;Mocks hamper refactoring&lt;/h2&gt;


 &lt;p&gt;&lt;a href="http://www.flickr.com/photos/stoweboyd/1592114098/"&gt;&lt;img src="http://merecomplexities.com/gulliver1.jpg" title="Gulliver tied down by Lilliputians" alt="Gulliver tied down by Lilliputians" /&gt;&lt;/a&gt;&lt;/p&gt;


 &lt;p&gt;Mock tests concern themselves with the &lt;em&gt;behaviour&lt;/em&gt; of the class under test &amp;#8211; how its objects interact with its collaborators.  A mock test is all about what methods are called, and with what parameters on the mocks.  The tests are concerned with implementation rather than results.  Common refactorings such as &amp;#8216;move method&amp;#8217; break these tests, rather than being supported by them.&lt;/p&gt;


 &lt;p&gt;On a recent project the first stage of a refactoring was often a purge of the test&amp;#8217;s mocks so that it can support the changing implementation; as a side-effect we invariably rendered the test more readable and smaller.  This does increase the cost of many desirable refactorings above a level consistent with adding functionality.  Tests should lower the cost of change, not increase it.&lt;/p&gt;


 &lt;h2&gt;Mocks encourage too many classes&lt;/h2&gt;


 &lt;p&gt;&lt;a href='http://thedailywtf.com/Articles/The_Customer-Friendly_System.aspx'&gt;&lt;img src='http://www.thedailywtf.com/images/200608/stateModel.gif' alt='Daily WTF Customer Friendly System Diagram' height='300px'/&gt;&lt;/a&gt;&lt;/p&gt;


 &lt;p&gt;There is something about Mock tests, often aggravated by &lt;a href="http://merecomplexities.com/2007/11/what-point-of-spring-xml-configuration.html"&gt;dependency injection frameworks&lt;/a&gt; and a knowledge of &lt;a href="http://www.amazon.co.uk/Design-patterns-elements-reusable-object-oriented/dp/0201633612/ref=sr_11_1?ie=UTF8&amp;#38;qid=1218836447&amp;#38;sr=11-1"&gt;GoF design patterns&lt;/a&gt; that tends to encourage Functional Object Oriented Programming, aka &lt;a href="http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html"&gt;Treating Your Verbs as Nouns&lt;/a&gt;.  At the height of my mockism I was once writing some code to convert TIFFs to PDFs by shelling out to &lt;a href="http://www.remotesensing.org/libtiff/man/tiff2pdf.1.html"&gt;tiff2pdf&lt;/a&gt;.  As far as I remember, the process involved a &amp;#8216;LocateTiffToConvert&amp;#8217; object, a  &amp;#8216;CreateUniqueFileName&amp;#8217; object, a &amp;#8216;ShellOutToSystemCommand&amp;#8217; object, a factory for configuring the objects, and I still needed something to coordinate the process&lt;sup&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt;.  Each was thoroughly tested, but it&amp;#8217;s way too much code for a simple action.&lt;/p&gt;


 &lt;p&gt;It&amp;#8217;s not just me, I frequently see this violation  of   &lt;a href="http://c2.com/cgi/wiki?ExtremeProgrammingSimplicityDefinition"&gt;simplicity&lt;/a&gt; in mockist code-bases.  It can make things horribly difficult to understand, both by the sheer volume of classes involved and its tendency to &lt;a href="http://merecomplexities.com/2007/05/when-abstractions-attack-one-of-most.html"&gt;obscure the domain with technical concerns&lt;/a&gt;&lt;/p&gt;


 &lt;h2&gt; Disclaimer&lt;/h2&gt;


 &lt;p&gt;Nearly all my experience with mock-objects has been with Java and JMock.  I have used Ruby&amp;#8217;s Flexmock a bit and find it more palatable: I suspect that this is because Flexmock is really at least as much a stubbing framework as a mocking one; also coding in Ruby is always more palatable than Java.&lt;/p&gt;


 &lt;p id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt;  &lt;small&gt;I also wasn&amp;#8217;t pairing, being the only programmer on the project.  Pair programming &amp;#8211; may help prevent you coding like a tit.&lt;/small&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/366014760" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/4031908205503039396/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=4031908205503039396" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/4031908205503039396" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/4031908205503039396" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/366014760/mocks-considered-harmful-some-time-ago.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2008/08/mocks-considered-harmful-some-time-ago.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-4206054976748680488</id><published>2008-08-15T18:29:00.000+01:00</published><updated>2008-08-15T18:30:51.305+01:00</updated><title type="text" /><content type="html">&lt;h1&gt;Triple Programming&lt;/h1&gt;


 &lt;p&gt;A question that came up during some training the other day was &amp;#8220;if two people are better than one, wouldn&amp;#8217;t three be better than two?  Why not triple programming?&amp;#8221;.  You can come up with all sorts of reasons against 3 people coding on one computer, but real the answer is that we tried it and it didn&amp;#8217;t work.  XP is not built on a set of theories: the practices are things which have been tried and found to be successful on real projects.  Beck once said that all he did was observe Ward Cunningham and write down what he did.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/365839489" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/4206054976748680488/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=4206054976748680488" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/4206054976748680488" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/4206054976748680488" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/365839489/triple-programming-question-that-came.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2008/08/triple-programming-question-that-came.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-3976827499632655357</id><published>2008-05-14T02:05:00.004+01:00</published><updated>2008-05-14T13:39:30.311+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ruby fastri" /><title type="text" /><content type="html">&lt;h1&gt; FastRI set up on my Mac&lt;/h1&gt;


 &lt;p&gt;&lt;img src="fastri.jpg" alt="" /&gt;&lt;/p&gt;


 &lt;p&gt;RI is a bit like the Unix &lt;a href="http://en.wikipedia.org/wiki/Manual_page_(Unix)"&gt;man&lt;/a&gt; command for Ruby, giving command line access to &lt;span class="caps"&gt;API&lt;/span&gt; docs.  Trouble is that It can be slow, bordering on unusable.  &lt;a href="http://rubyforge.org/projects/fastri/"&gt;FastRi&lt;/a&gt; is miles faster.  You do need the &lt;em&gt;fastri-server&lt;/em&gt; running though.  Here&amp;#8217;s my setup.&lt;/p&gt;


 &lt;p&gt;First I installed &lt;a href="http://rubyforge.org/projects/fastri/"&gt;FastRi&lt;/a&gt;.  You can do a gem install, but running from a tarball install is faster, so I downloaded &lt;em&gt;fast-ri.0.3.1.tar.gz&lt;/em&gt; from the &lt;a href="http://rubyforge.org/frs/?group_id=2545"&gt;Rubyforge page&lt;/a&gt; and untarred.  From that directory I ran&lt;/p&gt;


&lt;code&gt;
$ sudo ruby setup.rb all --bindir=/usr/bin/
&lt;/code&gt;

 &lt;p&gt;Then I checked it worked by running &lt;em&gt;fastri-server -b&lt;/em&gt; to build the index, then &lt;em&gt;fastri-server&lt;/em&gt; to run the server.  In another terminal I type &lt;em&gt;fri Array&lt;/em&gt;, and the RI documentation for Array appeared at greased-ferret speeds.&lt;/p&gt;


 &lt;p&gt;Next I want the server to run in the background on startup, so first I killed the current &lt;em&gt;fastri-server&lt;/em&gt; and created a &lt;a href="http://developer.apple.com/documentation/Darwin/Reference/ManPages/man5/launchd.plist.5.html#//apple_ref/doc/man/5/launchd.plist"&gt;launchd plist configuration&lt;/a&gt;, &lt;strong&gt;/Library/LaunchDaemons/fastri-server.plist&lt;/strong&gt;&lt;/p&gt;


&lt;pre&gt;
&lt;code&gt;
    &amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
    &amp;lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" 
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&amp;gt;
    &amp;lt;plist version="1.0"&amp;gt;
    &amp;lt;dict&amp;gt;
        &amp;lt;key&amp;gt;Label&amp;lt;/key&amp;gt;
        &amp;lt;string&amp;gt;fastri-server&amp;lt;/string&amp;gt;
        &amp;lt;key&amp;gt;KeepAlive&amp;lt;/key&amp;gt;
        &amp;lt;true/&amp;gt;
        &amp;lt;key&amp;gt;ProgramArguments&amp;lt;/key&amp;gt;
        &amp;lt;array&amp;gt;
            &amp;lt;string&amp;gt;/usr/bin/fastri-server&amp;lt;/string&amp;gt;
        &amp;lt;/array&amp;gt;
    &amp;lt;/dict&amp;gt;
    &amp;lt;/plist&amp;gt;    
&lt;/code&gt;
&lt;/pre&gt;

 &lt;p&gt;Next I kicked the Daemon off&lt;/p&gt;


&lt;code&gt;
$ sudo launchctl load /Library/LaunchDaemons/fastri-server.plist 
&lt;/code&gt;

 &lt;p&gt;Then I confirmed that  &lt;em&gt;fri Array&lt;/em&gt; works again, this time from the &lt;em&gt;fastri-server&lt;/em&gt; daemon.&lt;/p&gt;


 &lt;p&gt;One thing still irritating me was that an RI document of any size scrolls off the top of my terminal window and I need to scroll up to read it.  I added a little shell script somewhere on the path, fastri-less.sh&lt;/p&gt;


&lt;pre&gt;
&lt;code&gt;
#!/usr/bin/env sh

/usr/bin/fri -f plain $1 | less    
&lt;/code&gt;
&lt;/pre&gt;

 &lt;p&gt;Next I aliased fri, and ri to use the new script.  In &lt;em&gt;~/.profile&lt;/em&gt;&lt;/p&gt;


&lt;pre&gt;
&lt;code&gt;
    alias ri='fastri-less.sh'
    alias fri='fastri-less.sh'
&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;That's about it.  Toying with setting up a job to reindex &lt;em&gt;fastri&lt;/em&gt; every so-often.  I'm not sure it's necessary; I'll see. &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/289964390" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/3976827499632655357/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=3976827499632655357" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/3976827499632655357" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/3976827499632655357" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/289964390/fastri-set-up-on-my-mac-ri-is-bit-like.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2008/05/fastri-set-up-on-my-mac-ri-is-bit-like.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-236114731353278957</id><published>2008-05-04T08:10:00.001+01:00</published><updated>2008-05-04T08:11:57.289+01:00</updated><title type="text" /><content type="html">&lt;h1&gt;From Job recruitment spam&lt;/h1&gt;

&lt;blockquote&gt;
Please note it is essential that applicants have worked in a structured development environment ideally utilising the Agile (SCRUM, XP) methodology or any other similar methods such as Waterfall, RAD or RUP.
&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/283161716" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/236114731353278957/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=236114731353278957" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/236114731353278957" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/236114731353278957" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/283161716/from-job-recruitment-spam-please-note.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2008/05/from-job-recruitment-spam-please-note.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-8642986682462049495</id><published>2008-04-22T22:23:00.001+01:00</published><updated>2008-04-22T22:52:31.430+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="scotlandonrails" /><title type="text" /><content type="html">&lt;h1&gt; Scotland on Rails&lt;/h1&gt;

  &lt;a href="http://www.flickr.com/photos/mathie/2410547008/" title="The Crowd by mathie, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2160/2410547008_d521a71564.jpg" width="500" height="333" alt="The Crowd" /&gt;&lt;/a&gt;
 &lt;p&gt;It&amp;#8217;s over two weeks since the Scotland on Rails conference.  All the feedback, and the general feel of the event, convinces us that it was a huge success. Conferences, like &lt;a href="http://kmspace.blogspot.com/2007/10/sense-making-and-knowledge-management.html"&gt;parties&lt;/a&gt;, are complex beasts: there&amp;#8217;s not a straightforward relationship between cause and effect, and even the success criteria cannot predicted in advance.  All us organisers can do is control the starting conditions, lay down some boundaries (start-stop times, meal breaks), scatter some attractors (presentations, talks, beer and pizza), and hope something good emerges.&lt;/p&gt;


 &lt;p&gt;Nether-the-less we humans are hard-wired to see causal relationships and despite myself I can&amp;#8217;t help believing some of the following helped:&lt;/p&gt;


 &lt;ul&gt;
 &lt;li&gt;Having one and a half tracks.  There&amp;#8217;s much to be said for having a good proportion of shared experience amongst the attendees, while the extra half track enabled us to use more of the (excellent) submissions and achieve a good balance of local, international, new, and experienced speakers.&lt;/li&gt;
  &lt;li&gt;A superb venue (by and large), with lots of room and natural light between sessions.  The &lt;a href="http://www.edinburghfirst.com/"&gt;Edinburgh First&lt;/a&gt; staff were amazingly helpful; I strongly recommend them for other events.&lt;/li&gt;
  &lt;li&gt;A great T-shirt design (thanks &lt;a href="http://www.codefluency.com/"&gt;Bruce Williams&lt;/a&gt;).  T-shirts are important for techie conferences, establishing identity amongst the attendees.  You wear the t-shirt; you reaffirm having been there. &lt;a href="http://www.flickr.com/photos/fraserspeirs/2393586594/" title="Scotland on Rails by fraserspeirs, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2287/2393586594_a6d491fa24.jpg" width="333" height="500" alt="Scotland on Rails" /&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;The Crags pub opposite the venue served as a good focal point for evening meetups. It was easy to find, spacious, served food, and most people were there.  Ok, it&amp;#8217;s not a fantastic pub, and it was a pity that many of the US visitors didn&amp;#8217;t get much further afield, but having one place to meet in the evening added to the feeling of community&lt;/li&gt;
  &lt;li&gt;Big-name, international, and up-and-coming speakers.  I don&amp;#8217;t know for certain, but it feels like our decision to invite &lt;a href="http://www.koziarski.net/"&gt;Koz&lt;/a&gt; early on changed the nature of the event from a small local affair to an international conference.  It certainly helped give us the confidence to go after other speakers and sponsors. &lt;a href="http://www.flickr.com/photos/fraserspeirs/2393548146/" title="Untitled by fraserspeirs, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2372/2393548146_048404f0af.jpg" width="500" height="333" alt="" /&gt;&lt;/a&gt; &lt;/li&gt;
  &lt;li&gt;Edinburgh is a lovely city, and a world-tourist destination. I wonder how much that influenced our US peakers and delegates.  &lt;/li&gt;
 &lt;/ul&gt;  



 &lt;p&gt;There were a lot of other factors, and we&amp;#8217;ve learnt lessons we&amp;#8217;ll apply to next year: particularly on the marketing side.  Maybe Scotland on Rails 2009 will be even better.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/275685514" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/8642986682462049495/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=8642986682462049495" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/8642986682462049495" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/8642986682462049495" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/275685514/scotland-on-rails-it-over-two-weeks.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2008/04/scotland-on-rails-it-over-two-weeks.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-6044244503293845029</id><published>2008-03-13T23:31:00.001Z</published><updated>2008-03-13T23:33:07.323Z</updated><title type="text" /><content type="html">&lt;h1&gt;Thought for the day&lt;/h1&gt;
&lt;blockquote&gt;
Agile projects have no real defensive walls; all they can do is deliver return on investment and hope the business values it. But we all know that ROI is only a part of what moves businesses. Those in the Agile world all know of resistance to Agile from those middle managers who see it as a threat to their power to command and control. Telling such a person that her sabotage endangers the company's ROI is like an abbot standing in the path of Christian raiders and threatening them with loss of their immortal souls: sometimes it works, but nowhere near often enough. And it never works with the worshippers of Odin.
&lt;/blockquote&gt;
&lt;a href="http://www.testing.com/cgi-bin/blog/2006/11/01"&gt;Brian Marick&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/251058677" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/6044244503293845029/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=6044244503293845029" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/6044244503293845029" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/6044244503293845029" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/251058677/thought-for-day-agile-projects-have-no.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2008/03/thought-for-day-agile-projects-have-no.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-5604021982388524577</id><published>2008-02-19T22:57:00.002Z</published><updated>2008-02-19T23:12:42.113Z</updated><title type="text" /><content type="html">&lt;h1&gt;Acceptance testing with FIT&lt;/h1&gt;

&lt;p&gt;Last month Brian Swan and I gave a pretty damned good talk for &lt;a href="http://agilescotland.blogspot.com/2008/01/agilescotland-make-requirements-fit.html"&gt;Agile Scotland&lt;/a&gt; on Acceptance Testing with &lt;a href="http://fit.c2.com/"&gt;FIT&lt;/a&gt;.  The feedback was great, anyway.  The slides are &lt;a href="http://merecomplexities.com/Getting-FIT.pdf"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt; If you missed it, don't worry.  We could be giving the talk again at Developer Day, Scotland.  If you want to hear the talk, you need to register and vote for us &lt;a href="http://developerdayscotland.com/main/tabid/65/Default.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/237833640" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/5604021982388524577/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=5604021982388524577" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/5604021982388524577" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/5604021982388524577" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/237833640/acceptance-testing-with-fit-last-month.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2008/02/acceptance-testing-with-fit-last-month.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-6298531587525144748</id><published>2008-02-17T22:49:00.001Z</published><updated>2008-02-17T22:50:54.741Z</updated><title type="text" /><content type="html">&lt;h1&gt; Scotland on Rails Registration now Open&lt;/h1&gt;


 &lt;p&gt;At last, Scotland on Rails (4 &amp;#8211; 5 April 2008) registration is now open, and we&amp;#8217;ve managed to keep the price low: it&amp;#8217;s £180 for two days.  We&amp;#8217;ve keynotes from &lt;a href="http://www.koziarski.net/"&gt;Michael Koziarski&lt;/a&gt; and &lt;a href="http://www.koziarski.net/"&gt;David Black&lt;/a&gt;, not to mention a strong line-up of sessions (includes &lt;a href="http://onestepback.org/"&gt;Jim Weirich&lt;/a&gt; for God&amp;#8217;s sake!) from Europe and the &lt;span class="caps"&gt;USA&lt;/span&gt;.&lt;/p&gt;


 &lt;p&gt;Register &lt;a href="http://scotlandonrails.com/register"&gt;here&lt;/a&gt;.  Oh and don&amp;#8217;t forget the charity tutorial on Thursday April 3rd.  We&amp;#8217;re firming up the details, but that&amp;#8217;s going to be well-worth the £75 (minimum) donation to the &lt;a href="http://www.chas.org.uk/"&gt;Children&amp;#8217;s Hospice Association Scotland&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/236676969" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/6298531587525144748/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=6298531587525144748" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/6298531587525144748" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/6298531587525144748" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/236676969/scotland-on-rails-registration-now-open.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2008/02/scotland-on-rails-registration-now-open.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-9094211082032047431</id><published>2008-02-07T22:30:00.000Z</published><updated>2008-02-07T22:38:06.269Z</updated><title type="text" /><content type="html">&lt;h1&gt;Scotland on Rails Speaker list&lt;/h1&gt;

&lt;p&gt;The full Scotland on Rails speaker list is now available &lt;a href="http://scotlandonrails.com/speakers"&gt;here&lt;/a&gt;.  It's an impressive line-up, with a good mix of "names" and local talent.&lt;/p&gt;

&lt;p&gt;The conference will 4/5 April 2008, at University of Edinburgh's Pollock Halls.  We'll be opening registration &lt;em&gt;soon&lt;/em&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/231251238" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/9094211082032047431/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=9094211082032047431" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/9094211082032047431" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/9094211082032047431" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/231251238/scotland-on-rails-speaker-list-full.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2008/02/scotland-on-rails-speaker-list-full.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-5702193721204187690</id><published>2008-01-23T23:39:00.000Z</published><updated>2008-01-23T23:44:46.114Z</updated><category scheme="http://www.blogger.com/atom/ns#" term="unit tests" /><category scheme="http://www.blogger.com/atom/ns#" term="Junit" /><category scheme="http://www.blogger.com/atom/ns#" term="functional tests" /><category scheme="http://www.blogger.com/atom/ns#" term="Jsunit" /><category scheme="http://www.blogger.com/atom/ns#" term="TDD" /><title type="text" /><content type="html">&lt;h1&gt;Unit tests are best&lt;/h1&gt;


 &lt;p&gt;Last year I was reading Eric Raymond&amp;#8217;s &lt;a href="http://www.faqs.org/docs/artu/"&gt;The Art of Unix Programming&lt;/a&gt; and was struck by the statement that &amp;#8220;debugging often occupies three-quarters or more of development time&amp;#8221;.  Yes, I thought, I remember when that was normal.  In the old days I used to spend a few hours coding something, then the rest of the day working out how I&amp;#8217;d done it wrong.&lt;/p&gt;


 &lt;p&gt;These days any time spent regularly debugging is a sign of something wrong.  That&amp;#8217;s a significant, and short-term, productivity gain of Test Driven Development that&amp;#8217;s often forgotten.  Done properly &lt;span class="caps"&gt;TDD&lt;/span&gt; means when you&amp;#8217;re  done, you&amp;#8217;re pretty confident that you&amp;#8217;re done.  You can go on and do something else.&lt;/p&gt;


 &lt;p&gt;&lt;img src="done_done_small.jpg" title="debugging beer" alt="debugging beer" /&gt;&lt;/p&gt;


 &lt;p&gt;&lt;span class="caps"&gt;TDD&lt;/span&gt; is mostly about unit-testing, and the trouble with unit-testing is that it&amp;#8217;s only the units that get tested.  The interactions between the units can be left out, and that&amp;#8217;s where the errors creep in.&lt;/p&gt;


 &lt;p&gt;&lt;img src="unit_tests_small.jpg" title="unit tests" alt="unit tests" /&gt;&lt;/p&gt;


 &lt;p&gt;Let&amp;#8217;s say you have a class that represents a spreadsheet; another class is responsible for populating the spreadsheet.  They are both thoroughly unit tested, but one assumes the row index is zero based and the other that the row index is one-based.  You may have a bit of debugging ahead.&lt;/p&gt;


 &lt;p&gt;Functional tests are commonly used to plug this gap.&lt;/p&gt;


 &lt;p&gt;&lt;img src="functional_test_small.jpg" title="functional tests" alt="functional tests" /&gt;&lt;/p&gt;


 &lt;p&gt;Functional tests are great.  They are worth having to boost confidence in the general correctness of the code; but they are a safety net.  They are not a good place to be catching problems: they run on a slower feedback loop than the unit-tests and when they highlight problems, and because they cover bigger chunks of code it can be tricky to find the source of a problem: they bring you back into debugging land. They also tend to take longer to run, and complicate the build.  And they can be a pain to set up, especially if you need lots of supporting data.&lt;/p&gt;


 &lt;p&gt;You can reduce your reliance on functional tests by minimising the assumptions made about the rest of the code in your unit-tests.  One way to do this is to steer clear of the &lt;a href="http://www.mockobjects.com/"&gt;Mock Object&lt;/a&gt; fetishism that is sweeping the nation(s).&lt;/p&gt;


 &lt;p&gt;&lt;img src="ban_mocks_small.jpg" title="ban mocks" alt="ban mocks" /&gt;&lt;/p&gt;


 &lt;p&gt;Use the real objects when you can. Sometimes, though you do need to fake things.&lt;/p&gt;


 &lt;p&gt;Let&amp;#8217;s say you&amp;#8217;ve some Java code that produces Json to be consumed by an Ajax request from a browser and processed by Javascript.  You can unit test the Java with Junit; you can even unit test the Javascript with &lt;a href="http://www.jsunit.net/"&gt;Jsunit&lt;/a&gt;.  But are you confident that it all works together?  &lt;a href="http://www.openqa.org/selenium/"&gt;Selenium&lt;/a&gt; or &lt;a href="http://wtr.rubyforge.org/"&gt;Watir&lt;/a&gt; tests would do the trick, but bring us back into functional testing land.&lt;/p&gt;


 &lt;p&gt;How about for each of the Json states you test in the Javascript, you make sure you have a Java test that covers producing that Json.  Save off the Json  and use it in both tests.  Now you have pretty much all of that functionality covered in &lt;em&gt;Unit Tests&lt;/em&gt;.&lt;/p&gt;


 &lt;p&gt;&lt;img src="shared_data.jpg" title="sharing data between Junit and Jsunit" alt="sharing data between Junit and Jsunit" /&gt;&lt;/p&gt;


 &lt;p&gt;Keeping the bulk of your tests is best for rapid feedback cycles and increased productivity.  You may need some functional  tests, but maybe not as much as you think.&lt;/p&gt;


&lt;blockquote&gt;&lt;em&gt;This post is a rehashing of the talk I gave on the &lt;a href="http://www.nakedagilists.com/jan-08/"&gt;January 19 Naked Agilist podcast&lt;/a&gt;.  I fluffed it, I&amp;#8217;m afraid but I would still recommend listening because the other speakers were great.&lt;/em&gt;
  &lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/221940907" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/5702193721204187690/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=5702193721204187690" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/5702193721204187690" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/5702193721204187690" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/221940907/unit-tests-are-best-last-year-i-was.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2008/01/unit-tests-are-best-last-year-i-was.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-9156661366798689503</id><published>2007-12-22T23:08:00.000Z</published><updated>2007-12-23T00:11:08.334Z</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="DSL" /><category scheme="http://www.blogger.com/atom/ns#" term="Kata" /><category scheme="http://www.blogger.com/atom/ns#" term="Fluent" /><title type="text" /><content type="html">&lt;h1&gt;Fluent interface for numbers Kata&lt;/h1&gt;


 &lt;p&gt;Taking the lead from &lt;a href="http://silkandspinach.net/2007/12/19/a-fluent-interface-for-numeric-literals/"&gt;Kevin Rutherford&lt;/a&gt;, I&amp;#8217;ve had a crack at Mike Feathers&amp;#8217; &lt;a href="http://beautifulcode.oreillynet.com/2007/12/the_cardinality_of_a_fluent_in.php"&gt;numeric literals kata&lt;/a&gt; in Ruby.  The idea is to allow the following sort of thing:-&lt;/p&gt;


&lt;blockquote&gt;
  &lt;pre&gt;&lt;code&gt;
    assert_equal 24, twenty.four  
    assert_equal 2100, two.thousand.one.hundred   
    assert_equal 1019000, one.million.nineteen.thousand 

  &lt;/code&gt;
&lt;/pre&gt;
&lt;/blockquote&gt;

 &lt;p&gt;My solution (with tests, obviously) is &lt;a href="http://merecomplexities.com/english_numbers_html_wrapped.rb"&gt;here&lt;/a&gt;.  Mike &lt;a href="http://beautifulcode.oreillynet.com/2007/12/the_cardinality_of_a_fluent_in.php"&gt;poses two questions&lt;/a&gt;&lt;/p&gt;


 &lt;p&gt;&lt;strong&gt;What qualities does a grammar need to have to create an embedded &lt;span class="caps"&gt;DSL&lt;/span&gt; which doesn’t allow nonsensical constructs?&lt;/strong&gt;&lt;/p&gt;


 &lt;p&gt;In my example I couldn&amp;#8217;t be bothered: &lt;em&gt;seven.eleven&lt;/em&gt; evaluates to 18, and I don&amp;#8217;t particularly care.  A solution that takes care to enforce a strict grammar goes against the grain in Ruby, in my opinion.&lt;/p&gt;


 &lt;p&gt;If you really need to be strict then you&amp;#8217;d probably be better going down the &lt;a href="http://martinfowler.com/bliki/DomainSpecificLanguage.html"&gt;External &lt;span class="caps"&gt;DSL&lt;/span&gt;&lt;/a&gt; route, rather than implementing an &lt;a href="http://martinfowler.com/bliki/InternalDslStyle.html"&gt;Internal &lt;span class="caps"&gt;DSL&lt;/span&gt;&lt;/a&gt; in Ruby.&lt;/p&gt;


 &lt;p&gt;&lt;strong&gt;What is the minimal number of classes needed to implement it?&lt;/strong&gt;&lt;/p&gt;


 &lt;p&gt;I went for zero.  Well &amp;#8211; kind-of.  I just added methods to &lt;em&gt;Object&lt;/em&gt; and &lt;em&gt;Number&lt;/em&gt;.  That&amp;#8217;s the nice thing about Ruby: you don&amp;#8217;t need that much code. Steve Yegge &lt;a href="http://steve-yegge.blogspot.com/2007/12/codes-worst-enemy.html"&gt;would be pleased&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/204836641" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/9156661366798689503/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=9156661366798689503" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/9156661366798689503" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/9156661366798689503" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/204836641/fluent-interface-for-numbers-kata.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2007/12/fluent-interface-for-numbers-kata.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-7712429405818507570</id><published>2007-12-14T12:17:00.000Z</published><updated>2007-12-14T12:18:29.715Z</updated><title type="text" /><content type="html">&lt;h1&gt; &amp;#8220;Agile&amp;#8221; &amp;#8211; oversold, under-delivered, and over here.&lt;/h1&gt;


    &lt;p&gt;Gordon Ramsey&amp;#8217;s &lt;a href="http://en.wikipedia.org/wiki/Ramsay's_Kitchen_Nightmares"&gt;Kitchen Nightmares&lt;/a&gt; is an excellent programme about consulting  and software development.  Gordon Ramsey visits  a failing restaurant and occasionally turns them round.  It&amp;#8217;s never one problem.  A failing restaurant is typically failing at all levels:  the cooking is sub-standard; management is lax; orders are badly organised; the menus are badly planned; the waiting staff are surly; the accounts are a mess.  Gordon Ramsey, Michelin star chef, understands the importance of &lt;em&gt;all&lt;/em&gt; the factors.&lt;/p&gt;


    &lt;p&gt;So, cooking is not the only factor in the failure or success of a restaurant.  But it is essential.  Cooking and serving quality food is what a good restaurant is about: it is at its core; it is its identity.&lt;/p&gt;


    &lt;p&gt;&lt;a href="http://www.clarkeching.com/2007/12/the-road-to-agi.html"&gt;Clarke Ching is pissed off&lt;/a&gt;.  He believes the &amp;#8220;Agile  Community&amp;#8221; is spending too much time and effort worrying a about technical matters, while the key to success is concentrating on marketing and negotiation skills. I do believe these things are important, necessary even.  If I didn&amp;#8217;t I wouldn&amp;#8217;t have  done things like run, organise and arrange courses and sessions on &lt;a href="http://merecomplexities.com/2007_02_01_archive.html"&gt;working with resistance&lt;/a&gt; and &lt;a href="http://agilescotland.blogspot.com/2006/03/deep-dynamics-of-agile-teams-2-day.html"&gt;team dynamics&lt;/a&gt;.&lt;/p&gt;


    &lt;p&gt;So, coding is not the only factor in the success or failure of a software project.  But it is essential.  Delivering tested features is what software development is about: it is at its core; it is its identity.&lt;/p&gt;


    &lt;p&gt;As &lt;a href="http://www.exampler.com/blog/2007/12/09/latour-5-disliking-the-divide/"&gt;Brian Marick says&lt;/a&gt;, its worse than Clarke thinks.   As &amp;#8220;Agile&amp;#8221; is being more successfully sold at the senior level I&amp;#8217;m seeing, and hearing about, a worrying trend of over-selling and under-delivery.  Corporate executives are being persuaded to give &amp;#8220;Agile&amp;#8221; a chance, and &amp;#8220;Agile&amp;#8221; is being foisted on teams that lack the passion and skills to deliver on the promise.&lt;/p&gt;


    &lt;p&gt;We&amp;#8217;ve overreached &amp;#8211; it&amp;#8217;s time to pull back and regroup to  concentrate on building, teaching, and improving the core skills and techniques we need for successful delivery.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/200257741" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/7712429405818507570/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=7712429405818507570" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/7712429405818507570" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/7712429405818507570" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/200257741/oversold-under-delivered-and-over-here.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2007/12/oversold-under-delivered-and-over-here.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-2321354016622506782</id><published>2007-12-05T12:13:00.000Z</published><updated>2007-12-05T12:25:49.287Z</updated><title type="text" /><content type="html">&lt;h1&gt; Rails prepares for Ruby 1.9&lt;/h1&gt;


    &lt;p&gt;I was flicking through the &lt;a href="http://dev.rubyonrails.org/svn/rails/tags/rel_2-0-0_RC2/"&gt;Rails 2  release candidate&lt;/a&gt; code and was vaguely amused to find&lt;/p&gt;


&lt;pre&gt;
  unless respond_to?(:send!)
    # Anticipating Ruby 1.9 neutering send
    alias send! send
  end

&lt;/pre&gt;

    &lt;p&gt;(In Ruby marking a method as &lt;em&gt;private&lt;/em&gt; is more of a hint than a command.  You can  get round it by using &lt;a href="http://www.ruby-doc.org/core/classes/Object.html#M000334"&gt;Object#send&lt;/a&gt; &amp;#8211; up until now.  One of the &lt;a href="http://eigenclass.org/hiki.rb?Changes+in+Ruby+1.9"&gt;Ruby 1.9 changes&lt;/a&gt; is that &lt;em&gt;send&lt;/em&gt; won&amp;#8217;t work for private methods &amp;#8211; you need to use &lt;em&gt;send!&lt;/em&gt;.)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/195495212" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/2321354016622506782/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=2321354016622506782" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/2321354016622506782" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/2321354016622506782" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/195495212/rails-prepares-for-ruby-1.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2007/12/rails-prepares-for-ruby-1.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-1391260417059868983</id><published>2007-11-24T01:05:00.000Z</published><updated>2007-11-24T01:07:23.905Z</updated><title type="text" /><content type="html">&lt;h1&gt;Brian Marick on &amp;#8220;Crossing the Chasm&amp;#8221;&lt;/h1&gt;


    &lt;p&gt;Agile&amp;#8217;s &lt;a href="http://www.amazon.co.uk/Crossing-Chasm-technology-mainstream-Technology/dp/1841120634"&gt;crossed Geoffrey Moore&amp;#8217;s chasm&lt;/a&gt; &amp;#8211; it&amp;#8217;s going mainstream.&lt;/p&gt;


    &lt;p&gt;Brian Marick&amp;#8217;s &lt;a href="http://video.google.com/videoplay?docid=-3673297496561472424&amp;#38;q=AAFTT&amp;#38;total=10&amp;#38;start=0&amp;#38;num=10&amp;#38;so=0&amp;#38;type=search&amp;#38;plindex=8"&gt;4 minute lightning talk here&lt;/a&gt; explains why this might not be such a good thing: the early majority is tiny, and the &amp;#8220;early adaopters&amp;#8221; (people interested in big wins) are currently wasting time and effort attempting to convert a bunch of people who don&amp;#8217;t really care.  Instead we should just give up on the &amp;#8220;late majority&amp;#8221; and concentrate on ourselves.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/189598219" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/1391260417059868983/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=1391260417059868983" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/1391260417059868983" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/1391260417059868983" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/189598219/brian-marick-on-chasm-agile-crossed.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2007/11/brian-marick-on-chasm-agile-crossed.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-44193634961709502</id><published>2007-11-24T01:03:00.000Z</published><updated>2007-11-24T01:04:39.285Z</updated><title type="text" /><content type="html">&lt;h1&gt; Quick suggestion for “bug reporting”&lt;/h1&gt;


 &lt;p&gt;How about using &lt;a href="http://www.openqa.org/selenium-ide/"&gt;Selenium &lt;span class="caps"&gt;IDE&lt;/span&gt;&lt;/a&gt; as a tool to help users / manual testers submit the “how to reproduce” part of a bug report?  I haven’t tried this out – just an idea a friend mentioned down the pub the other night.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/189598220" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/44193634961709502/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=44193634961709502" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/44193634961709502" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/44193634961709502" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/189598220/quick-suggestion-for-bug-reporting-how.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2007/11/quick-suggestion-for-bug-reporting-how.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-7398920543111664032</id><published>2007-11-16T23:58:00.000Z</published><updated>2007-11-17T22:23:42.829Z</updated><title type="text" /><content type="html">&lt;h1&gt;What&amp;#8217;s the point of Spring &lt;span class="caps"&gt;XML&lt;/span&gt; configuration?&lt;/h1&gt;


 &lt;p&gt;Don&amp;#8217;t know about you but I always test, build, package, test, and deploy the entire app to release a change in config, so  why is the &lt;a href="http://www.springframework.org/"&gt;Spring&lt;/a&gt; approach better than assembling my objects ourselves in code?  Initialising our objects in &lt;span class="caps"&gt;XML&lt;/span&gt; is a popular option, so it must give us something.&lt;/p&gt;


 &lt;p&gt;One thing that Spring &lt;em&gt;does not&lt;/em&gt; provide is &lt;a href="http://martinfowler.com/articles/injection.html"&gt;Dependency Injection&lt;/a&gt;.  Dependency Injection is a style of coding, and you don&amp;#8217;t need a framework to code in a particular style.  If you&amp;#8217;re puzzled about how to do DI without Spring, take another look at the &lt;a href="http://en.wikipedia.org/wiki/Design_Patterns"&gt;Gang-of-Four&lt;/a&gt; &lt;em&gt;Abstract Factory&lt;/em&gt; and &lt;em&gt;Builder&lt;/em&gt; patterns.  Coding factories is no harder than writing &lt;span class="caps"&gt;XML&lt;/span&gt;, and even makes it easier to write chunkier Junit tests for assembled components.&lt;/p&gt;


 &lt;p&gt;What I think we get out of coding our factories using &lt;em&gt;Spring &lt;span class="caps"&gt;XML&lt;/span&gt;&lt;/em&gt; is permission to relax the Java / OO rules during initialisation.  At application initialisation we get to indulge in (lovely) dynamic typing, slightly more worrying global variables, and even the downright alarming excuse not to write tests for behaviour.&lt;/p&gt;


 &lt;h2&gt;Dynamic typing&lt;/h2&gt;


 &lt;p&gt;&lt;img src="http://merecomplexities.com/xml.jpeg" alt="" /&gt;&lt;/p&gt;


 &lt;p&gt;If there&amp;#8217;s a type error it happens at runtime: its dynamic.  And you&amp;#8217;re still coding in a statically typed language because&amp;#8230;.. (&amp;#42;).&lt;/p&gt;


 &lt;h2&gt;Global variables&lt;/h2&gt;


 &lt;p&gt;&lt;a href="http://www.alljigsawpuzzles.co.uk/shopping/p31.htm"&gt;&lt;img src="http://merecomplexities.com/sm_imposs_beans.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;


 &lt;p&gt;The requirements change and your &lt;em&gt;WidgetRepository&lt;/em&gt;, configured in the widget.xml, needs to get hold of a database connection to the &amp;#8220;ooplah legacy system&amp;#8221; configured in &amp;#8220;ooplah.xml&amp;#8221;.  No problem &amp;#8211; just pass in the &amp;#8220;ooplahDataSource&amp;#8221; bean id and you&amp;#8217;re laughing.  One of your &lt;em&gt;Ooplah&lt;/em&gt; components needs a Widget, and the &amp;#8220;widgetRepository&amp;#8221; bean is ready and available.  It&amp;#8217;s all one big pot of bean soup.&lt;/p&gt;


 &lt;p&gt;Ok Spring does support hierarchical contexts, but know anyone making much use of them to partition their apps?&lt;/p&gt;


 &lt;h2&gt;No need to test&lt;/h2&gt;


 &lt;p&gt;&lt;img src="http://merecomplexities.com/red_bar.gif" alt="" /&gt;&lt;/p&gt;


 &lt;p&gt;So you&amp;#8217;ve factored your code into small composable units?  Well done.  Your users will be delighted.  And each unit is thoroughly unit tested?  Excellent.  (I bet you used &lt;a href="http://martinfowler.com/articles/mocksArentStubs.html"&gt;Mock Objects&lt;/a&gt;, but I&amp;#8217;ll let that go for now).  Well the &lt;span class="caps"&gt;XML&lt;/span&gt; stuff is just config, so you don&amp;#8217;t need to test that.&lt;/p&gt;


 &lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;WRONG&lt;/span&gt;!&lt;/strong&gt;&lt;/p&gt;


 &lt;p&gt;If you define behaviour by plugging your objects together in different ways then that configuration &lt;strong&gt;is code&lt;/strong&gt;.  No matter how well you&amp;#8217;ve tested the individual object you need to test how they work together.&lt;/p&gt;


 &lt;p&gt;Even if you&amp;#8217;ve automated end-to-end tests in place, you might ward away hours wasted at the debugger and fear of change by having some chunkier unit tests around your aggregate objects defining a particular behaviour.&lt;/p&gt;


 &lt;p&gt;A good side-effect of those chunkier tests is that they tend to encourage modular configuration with high adhesion within a single config file, and a few external dependencies stubbed for the test.&lt;/p&gt;


 &lt;p&gt;&lt;span style="font:x-small;"&gt;(*) .. because they&amp;#8217;re paying me ;-)&lt;/span&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/186036003" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/7398920543111664032/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=7398920543111664032" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/7398920543111664032" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/7398920543111664032" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/186036003/what-point-of-spring-xml-configuration.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2007/11/what-point-of-spring-xml-configuration.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-7120867946290600259</id><published>2007-11-09T23:28:00.000Z</published><updated>2007-11-09T23:31:19.289Z</updated><title type="text" /><content type="html">&lt;h1&gt;Twitter late adopter&lt;/h1&gt;


 &lt;p&gt;Just joined &lt;a href="http://twitter.com"&gt;Twitter&lt;/a&gt; out of curiosity.  Yeah, I know that&amp;#8217;s what they say about heroin.  I&amp;#8217;m not really sure what it&amp;#8217;s for, or what I&amp;#8217;ll get out of it.  I suppose it goes against my assumption(**) that no-one&amp;#8217;s really interested in what I&amp;#8217;m doing.&lt;/p&gt;


 &lt;p&gt;We&amp;#8217;ll see&amp;#8230;&lt;/p&gt;


 &lt;p style="font-size:xx-small";&gt;&lt;a href="http://www.google.com/search?q=limiting+belief"&gt;limiting belief&lt;/a&gt;?&lt;/p&gt;
 &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/182441099" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/7120867946290600259/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=7120867946290600259" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/7120867946290600259" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/7120867946290600259" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/182441099/twitter-late-adopter-just-joined.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2007/11/twitter-late-adopter-just-joined.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-6568596341940689362</id><published>2007-10-27T23:35:00.001+01:00</published><updated>2007-10-27T23:35:37.497+01:00</updated><title type="text" /><content type="html">&lt;h1&gt;Joel wisdom&lt;/h1&gt;


 &lt;p&gt;&lt;a href="http://www.joelonsoftware.com/items/2007/10/26.html"&gt;Joel&amp;#8217;s&lt;/a&gt; not keen on project managers who pressure developers to reduce estimates to fit a schedule:&lt;/p&gt;


 &lt;blockquote&gt;
  &lt;p&gt; But you can never get 4n from n, ever, and if you think you can, please email me the stock symbol for your company so I can short it.&lt;/p&gt;
 &lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/175984961" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/6568596341940689362/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=6568596341940689362" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/6568596341940689362" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/6568596341940689362" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/175984961/joel-wisdom-joel-not-keen-on-project.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2007/10/joel-wisdom-joel-not-keen-on-project.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-8997448481884036987</id><published>2007-10-03T11:33:00.000+01:00</published><updated>2007-10-03T11:36:02.760+01:00</updated><title type="text" /><content type="html">&lt;h1&gt;The clever and the lazy&lt;/h1&gt;

 &lt;p&gt;Pete &lt;a href="http://jiggypete.blogspot.com/2007/10/lazy-development.html"&gt;links&lt;/a&gt; to Paul Duvall&amp;#8217;s &lt;a href="http://www.testearly.com/2007/08/17/fire-your-best-peoplereward-the-lazy-ones/"&gt;post&lt;/a&gt; on &lt;em&gt;troublepreventing&lt;/em&gt; versus &lt;em&gt;troubleshooting&lt;/em&gt; development styles.   I am reminded of a quote from General &lt;a href="http://en.wikipedia.org/wiki/Kurt_von_Hammerstein-Equord"&gt;Kurt von Hammerstein-Equord&lt;/a&gt;:&lt;/p&gt;


 &lt;blockquote&gt;
  &lt;p&gt;I divide my officers into four classes; the clever, the lazy, the industrious, and the stupid. Each officer possesses at least two of these qualities. Those who are clever and industrious are fitted for the highest staff appointments. Use can be made of those who are stupid and lazy. The man who is clever and lazy however is for the very highest command; he has the temperament and nerves to deal with all situations. But whoever is stupid and industrious is a menace and must be removed immediately!&lt;/p&gt;
 &lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/164644244" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/8997448481884036987/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=8997448481884036987" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/8997448481884036987" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/8997448481884036987" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/164644244/clever-and-lazy-pete-links-to-paul.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2007/10/clever-and-lazy-pete-links-to-paul.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-866178137248408424</id><published>2007-09-24T00:29:00.000+01:00</published><updated>2007-09-24T00:38:10.200+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="RailsConfEurope RailsConfEurope07" /><title type="text" /><content type="html">&lt;h1&gt;So, European RailsConf 2007&amp;#8230;..&lt;/h1&gt;


 &lt;p&gt;Overall, much better buzz than &lt;a href="http://merecomplexities.com/2006/09/so-european-railsconf-2006.html"&gt;last year&lt;/a&gt;.  The content of the sessions was much higher; there were fewer keynotes, which was fine.  Mainly, though, there was just a better buzz.&lt;/p&gt;


 &lt;p&gt;There was a large Scottish contingent, and we&amp;#8217;ll be giving an overview of the event at the next Scottish Ruby User Group meeting.  It&amp;#8217;s at 19:30,  at &lt;a href="http://maps.google.co.uk/maps?f=q&amp;#38;hl=en&amp;#38;geocode=&amp;#38;q=16+St+Mary+Street,+Edinburgh&amp;#38;sll=55.951891,-3.183203&amp;#38;sspn=0.012062,0.034504&amp;#38;ie=UTF8&amp;#38;ll=55.950329,-3.183975&amp;#38;spn=0.012062,0.034504&amp;#38;z=15&amp;#38;om=1"&gt;The Edinburgh Training Centre, 16 St Mary&amp;#8217;s Street, Edinburgh, &lt;span class="caps"&gt;EH1 1SU&lt;/span&gt;&lt;/a&gt;.  In the meantime, a few random quotes (ok paraphrasings) from my notes:&lt;/p&gt;


 &lt;p&gt;&lt;strong&gt;&lt;a href="http://drnicwilliams.com/"&gt;Dr Nic&lt;/a&gt;&lt;/strong&gt;:&lt;/p&gt;


 &lt;blockquote&gt;
  &lt;p&gt;Java is like &lt;a href="http://en.wikipedia.org/wiki/Keith_Richards"&gt;Keith Richards&lt;/a&gt;: used to be cool, can tell you stories about itself, but not so cute anymore.&lt;/p&gt;
 &lt;/blockquote&gt;


 &lt;p&gt;&lt;strong&gt;&lt;a href="http://conferences.oreillynet.com/cs/railseurope2007/view/e_spkr/3173"&gt;Jason Hoffman&lt;/a&gt;&lt;/strong&gt; (in an aside):&lt;/p&gt;


 &lt;blockquote&gt;
  &lt;p&gt; The more they pay, the less they complain.  If you want a difficult user base, give your stuff away for free.&lt;/p&gt;
 &lt;/blockquote&gt;


 &lt;p&gt;&lt;strong&gt;&lt;a href="http://pragdave.pragprog.com/"&gt;Dave Thomas&lt;/a&gt;&lt;/strong&gt;:&lt;/p&gt;


 &lt;blockquote&gt;
  &lt;p&gt; Make something beautiful.  And if you do&amp;#8230;.. let me know by signing your work.&lt;/p&gt;
 &lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/160374112" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/866178137248408424/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=866178137248408424" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/866178137248408424" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/866178137248408424" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/160374112/so-european-railsconf-2007-overall-much.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2007/09/so-european-railsconf-2007-overall-much.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9283881.post-7968739148038563239</id><published>2007-09-16T22:52:00.000+01:00</published><updated>2007-09-17T06:40:38.025+01:00</updated><title type="text" /><content type="html">&lt;h1&gt; More &lt;span class="caps"&gt;NFJS&lt;/span&gt;&lt;/h1&gt;


 &lt;p&gt;Peter Aitken has a good account of August&amp;#8217;s &lt;a href="http://www.nofluffjuststuff.com/"&gt;No Fluff Just Stuff&lt;/a&gt; event in London &lt;a href="http://jiggypete.blogspot.com/2007/09/jiggy-jumps-into-action-after-nfsj.html"&gt;here&lt;/a&gt;.  I also have more observations.&lt;/p&gt;


 &lt;h2&gt;Grails&lt;/h2&gt;


 &lt;p&gt;Just as I previously had not bothered to look at Groovy, I didn&amp;#8217;t previously see the point of &lt;a href="http://grails.codehaus.org/"&gt;Grails&lt;/a&gt;, given &lt;a href="http://rubyonrails.org/"&gt;Rails&lt;/a&gt;.  Again, maybe I was wrong.  Reasons for considering Grails:&lt;/p&gt;


 &lt;ul&gt;
 &lt;li&gt;it sits  easily on a &lt;span class="caps"&gt;JVM&lt;/span&gt;, if that is what you need to use.   Unlike JRuby, it compiles completely down to bytecode.&lt;/li&gt;
  &lt;li&gt;being Groovy it can integrate with Java Code with fewer seams.&lt;/li&gt;
  &lt;li&gt;it is layered on top of &lt;a href="http://www.springframework.org/"&gt;Spring&lt;/a&gt; and &lt;a href="http://www.hibernate.org/"&gt;Hibernate&lt;/a&gt;, enabling use of Hibernates mature and reputedly excellent caching mechanisms.&lt;/li&gt;
 &lt;/ul&gt;


 &lt;p&gt;I should admit that I haven&amp;#8217;t yet used Grails in anger, so I can&amp;#8217;t really vouch for it properly.&lt;/p&gt;


 &lt;h2&gt; RIFE&lt;/h2&gt;


 &lt;p&gt;&lt;a href="http://rifers.org/"&gt;&lt;span class="caps"&gt;RIFE&lt;/span&gt;&lt;/a&gt; is yet another Java Web Framework.  It distinguishes itself by not only achieving &amp;#8220;Rails-like&amp;#8221; constraints in Java but by actually implementing &lt;a href="http://en.wikipedia.org/wiki/Continuation"&gt;Continuations&lt;/a&gt; for control flow.  Which all goes to show what you can achieve if you really try.&lt;/p&gt;


 &lt;h2&gt; AOP&lt;/h2&gt;


 &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming"&gt;&lt;span class="caps"&gt;AOP&lt;/span&gt;&lt;/a&gt; is another thing that I never so enough point in to really try out, beyond a few well-defined cases such as marking transaction boundaries.  Brain Sletton introduced &lt;span class="caps"&gt;AOP&lt;/span&gt; as a tool for enforcing or monitoring policies, such as class A can only be called from classes B or C.  Now this seems to be a very &lt;a href="http://martinfowler.com/bliki/DirectingAttitude.html"&gt;Directing&lt;/a&gt; rather than &lt;a href="http://martinfowler.com/bliki/EnablingAttitude.html"&gt;Enabling&lt;/a&gt; tool.  My impressions was strenghtened when Brian suggested that the Junior developers could be left to write the main code, while the senior developers (architects) controlled them with &lt;span class="caps"&gt;AOP&lt;/span&gt;.&lt;/p&gt;


 &lt;p&gt;To be fair, though, he did give quite a compelling example of using &lt;span class="caps"&gt;AOP&lt;/span&gt; for good, using it to detect all the places in an inherited Swing application where threading had been incorrectly used.&lt;/p&gt;


 &lt;h2&gt; Full stack frameworks&lt;/h2&gt;


 &lt;p&gt;Most of the web frameworks presented, Grails, Rife, JBoss Seam were full stack.  I&amp;#8217;m guessing this is a move away from the complexity, integration issues, and burden of choice of the mix and match approach that previously held sway in Java land.&lt;/p&gt;


 &lt;h2&gt; Bending Java&lt;/h2&gt;


 &lt;p&gt;Of the two pure Java language sessions  that I attended, &lt;span class="caps"&gt;AOP&lt;/span&gt; and Rife, both involved bending Java to be other than it was designed using byte code jiggery pokery.  If you need to do that kind of thing to get the language to behavae close to how you&amp;#8217;d like, maybe you&amp;#8217;re using the wrong language.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulsTechieBlog/~4/157331565" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/7968739148038563239/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9283881&amp;postID=7968739148038563239" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/7968739148038563239" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9283881/posts/default/7968739148038563239" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulsTechieBlog/~3/157331565/more-nfjs-peter-aitken-has-good-account.html" title="" /><author><name>Paul Wilson</name><uri>http://www.blogger.com/profile/18116527130003166375</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://merecomplexities.com/2007/09/more-nfjs-peter-aitken-has-good-account.html</feedburner:origLink></entry></feed>
