<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;A0QFSHo6fCp7ImA9WhVUFkw.&quot;"><id>tag:blogger.com,1999:blog-7846496</id><updated>2012-05-21T17:55:19.414+01:00</updated><category term="seo" /><category term="qcon" /><category term="dtr" /><category term="ecommerce" /><category term="security" /><category term="development" /><category term="internet" /><category term="search" /><category term="microsoft" /><category term="design" /><category term="nosql" /><category term="social" /><category term="google" /><category term="biztalk debatch" /><title>Hugo+</title><subtitle type="html">Drawing the owl, circles not included.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.rodger-brown.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>230</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/HugoRodger-brown" /><feedburner:info uri="hugorodger-brown" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><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 gd:etag="W/&quot;DkYFSH8_fCp7ImA9WhdXEk8.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-4931788887402950303</id><published>2011-08-24T23:15:00.001+01:00</published><updated>2011-08-24T23:15:19.144+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-24T23:15:19.144+01:00</app:edited><title>Our economy is based on The Wealth of Nations, and it’s out of date…</title><content type="html">&lt;p&gt;This is a post I’ve been meaning to write for some time, and have never got around to as it’s just too big a thing to get straight in my head. I’m writing something now (and it’s little more than the title) just because I think I should lay down a marker. Apologies in advance to anyone who was looking for something more insightful.&lt;/p&gt; &lt;p&gt;The summary is this: &lt;a href="http://en.wikipedia.org/wiki/The_Wealth_of_Nations"&gt;The Wealth of Nations&lt;/a&gt; by &lt;a href="http://en.wikipedia.org/wiki/Adam_Smith"&gt;Adam Smith&lt;/a&gt; is the de facto bible of western economics, and its core tenet is the Division of Labour, which he studied through the prism of industrialisation and specifically the manufacture of pins.&lt;/p&gt; &lt;p&gt;Problem is, we’re moving beyond a classic industrial society – possibly to something identified as the Information Age. And in this age, classical economics no longer apply. This is most clearly seen in my own industry – software development, which works in precisely the opposite fashion: productivity increases as work is consolidated into a smaller group of more talented (and expensive) developers. The Division of Labour is not only unproductive, but positively destructive, as anyone who has scrambled through an offshore project can attest.&lt;/p&gt; &lt;p&gt;This paradox undermines many well-meaning corporate initiatives, and until we have a clear, and open, debate on this we are, frankly, a bit f*ked.&lt;/p&gt; &lt;p&gt;More to follow.&lt;/p&gt; &lt;p&gt;&lt;sup&gt;&lt;/sup&gt;&lt;/p&gt; &lt;p&gt;&lt;sup&gt;[1]&lt;/sup&gt; Notwithstanding the “Invisible Hand”, which is the other core message.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-4931788887402950303?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/4931788887402950303/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=4931788887402950303" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/4931788887402950303?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/4931788887402950303?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/AAFSR4ulGVU/our-economy-is-based-on-wealth-of.html" title="Our economy is based on The Wealth of Nations, and it’s out of date…" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2011/08/our-economy-is-based-on-wealth-of.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAMQ3Y9eSp7ImA9WhdTEEs.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-3954870899696428689</id><published>2011-07-07T20:43:00.001+01:00</published><updated>2011-07-07T20:43:02.861+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-07T20:43:02.861+01:00</app:edited><title>Yes, Facebook has lots of users. So what?</title><content type="html">&lt;p&gt;Another day, another &lt;a href="http://www.telegraph.co.uk/technology/facebook/8621527/Facebooks-Skype-deal-could-see-off-Google.html"&gt;article&lt;/a&gt; about Facebook's global takeover. Yes, I know that FB now has 750m members, which is clearly a lot of people. However, the obsession with registered users feels very like the rush for pixels in the digital camera business a few back, or the stampede for ever larger app stores amongst the mobile vendors.&lt;/p&gt;  &lt;p&gt;I don't care if FB has 1bn members (anecdotal evidence suggests that registrations peaks at apprx. 50% internet users within a country), a camera has 50m pixels or my mobile app store has 1m applications - if they're not my friends, my favourite apps, or the pictures still come out blurry it's a problem.&lt;/p&gt;  &lt;p&gt;Google+ is the victim in the latest article - with the Facebook-Skype deal apparently sounding the death-knell for the new Hangouts video-chat service. I don't think it will kill it, and what is more, I think the niche audience that G+ is rapidly acquiring (albeit fanned by the limited access to invites) is more valuable than the mass of humanity represented by FB*.&lt;/p&gt;  &lt;p&gt;In a similar vein, if I was a camera vendor I would pay a lot more to advertise on Flickr than Facebook (yes, I know Flickr doesn't have ads, it's a theoretical point), because people on Flickr care about photos, and people on Facebook don't. (I'm also sure there are hundreds of amateur photo groups on Facebook - but if they really cared they'd be on Flickr, as it's a destination defined by the quality of images available.)&lt;/p&gt;  &lt;p&gt;I am sure that it makes sense for all commercial entities to have a presence on Facebook, and to invest in a &amp;quot;social media strategy&amp;quot;, but they are supporting acts; the web is the superset of all properties, and will outlive Facebook.&lt;/p&gt;  &lt;p&gt;* NB This obviously doesn't apply to the drinks brand WKD - whose natural habitat is clearly Facebook on a Friday night.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-3954870899696428689?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/3954870899696428689/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=3954870899696428689" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/3954870899696428689?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/3954870899696428689?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/YpqUKuIFqMs/yes-facebook-has-lots-of-users-so-what.html" title="Yes, Facebook has lots of users. So what?" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2011/07/yes-facebook-has-lots-of-users-so-what.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cMR305eyp7ImA9WhZUFE8.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-5275641620475466136</id><published>2011-06-05T20:33:00.001+01:00</published><updated>2011-06-07T06:38:06.323+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-07T06:38:06.323+01:00</app:edited><title>What agile means to me</title><content type="html">&lt;p&gt;&lt;em&gt;[Update: in response to some of the comments here and on HN, I thought it might be worth updating with a note on my personal experience with Agile, which appears at the bottom of the post.]&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Agile (with a big 'A') has become so mainstream now that it has started to become the problem. An alarming number of people who espouse the virtues of Agile, and who quote the Agile Manifesto believe that Agile is a project management methodology, and that Agile really means SCRUM, XP, Kanban, and that it is embodied in the daily stand-up, whiteboards or writing requirements on post-it notes. I was once told by an Agile Trainer (LOL) that the correct way to phrase the requirement &amp;quot;we need advertising placeholders on the site, and some way to manage which ads appear where&amp;quot; was &amp;quot;As a User, I wish to be marketed to.&amp;quot; Needless to say his company lost a $m project on the back of such BS.&lt;/p&gt;  &lt;p&gt;As a result of all this, Agile (big 'A' again) has become a bit of an albatross - it doesn't really work, it doesn't deliver the benefits it promised, and it inevitably involves a lot of arguing amongst the team about who should be doing what, and when.&lt;/p&gt;  &lt;p&gt;All of which distracts from the fact that agility (small 'a' this time) is a wonderful thing, that can be achieved, that does provide enormous benefits, and that should be encouraged in everything we (as an industry) do. Agile (small 'a') refers to team dynamics, delivery processes, the software itself (how easy is it to change), and operations. Everyone should aim to be agile.&lt;/p&gt;  &lt;p&gt;So, a few lessons I've learned along the (hard) way:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The best way to achieve your goal is to start with the right people &lt;/li&gt;    &lt;li&gt;If you've found the right people, let them get on with the job you're paying them for &lt;/li&gt;    &lt;li&gt;The people with the best ability to plan the delivery are the people doing the work &lt;/li&gt;    &lt;li&gt;A small team with a manageable backlog needs very little Project Management &lt;/li&gt;    &lt;li&gt;Everyone on the team “needs to know”. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;A few things that help this happen on a practical level:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Try and avoid building towards a pre-determined marketing / launch date &lt;/li&gt;    &lt;li&gt;If you do have a fixed time, then scope is variable &lt;/li&gt;    &lt;li&gt;Never try messing around with team sizes to massage delivery &lt;/li&gt;    &lt;li&gt;Automate everything in sight - builds, deployments, testing, progress reporting, tea-making &lt;/li&gt;    &lt;li&gt;Measure as much as you can - no feedback == no direction &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;And finally some other things that will prevent you from getting there:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;If you have to have everything on your requirements list, you can't be agile &lt;/li&gt;    &lt;li&gt;If you need to plan beyond the next sprint with any degree of accuracy, you're not agile &lt;/li&gt;    &lt;li&gt;If you think you can &amp;quot;fix&amp;quot; an iteration by adding more people, you're not agile &lt;/li&gt;    &lt;li&gt;If you are prepared to change the end date of an iteration to &amp;quot;fit something in&amp;quot;, you're not agile &lt;/li&gt;    &lt;li&gt;If you have to give a fixed date for delivery - it's very, very difficult to be agile.      &lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;u&gt;Postscript: my personal experience with Agile.&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;I worked for several years at a company that was at the forefront of the Agile movement in the UK, and I believe that at one point they had more registered SCRUM Master practitioners than anyone else in the country. (I think Sensai Schwaber visited in person at one point, although I’d left by then.) They were generally acknowledged to be the leaders in the field.&lt;/p&gt;  &lt;p&gt;The incident in the post occurred when I returned to the company as a client, parachuted into a large project that they were running with the full SCRUM toolkit (“Agile Coach” included), that was running into trouble, principally the fact that it was &lt;strong&gt;not&lt;/strong&gt; agile. The project was rescued by hiring a team of people with the right combination of aptitude &amp;amp; attitude.&lt;/p&gt;  &lt;p&gt;As I say in the post – agility is a great goal, and everyone should aim for it – but don’t make the mistake of thinking that Agile is the means to achieve it.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-5275641620475466136?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/5275641620475466136/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=5275641620475466136" title="18 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/5275641620475466136?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/5275641620475466136?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/ZXPdsbe7Sms/what-agile-means-to-me.html" title="What agile means to me" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>18</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2011/06/what-agile-means-to-me.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQNRX8_fip7ImA9WhZUE00.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-6815469857976676894</id><published>2011-06-05T19:59:00.001+01:00</published><updated>2011-06-05T19:59:54.146+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-05T19:59:54.146+01:00</app:edited><title>Driving to the airport, agile-style.</title><content type="html">&lt;p&gt;If you were travelling from A-B, and planning the journey yourself, you might look it up on Google Maps. GM would give you a route, and an estimated time for the journey - let's say it's one hour for our mythical trip. Now let's assume that the destination for our journey is the airport, as we have a plane to catch - i.e. we absolutely have to be there on time.&lt;/p&gt;  &lt;p&gt;In this scenario, would you leave the house one hour before the flight departs (let's ignore the reality of parking / check-in / security etc. - we're on the company jet, just driving up to the plane)? Of course not - if you had to be there on time, and you were taking someone else's directions, even someone with the 'authority' of Google, you'd probably add at least 50%, and probably 100% to the estimate. Even then, you're still subject to the vagaries of the traffic - something that affects everyone, regardless of whether they've driven the route before. &lt;/p&gt;  &lt;p&gt;If you were to approach the journey from an agile point of view, you wouldn't book the airline ticket in advance - you'd catch the plane when you got there. And you wouldn't plan the route either - you'd hire a driver, who knew the route, and simply tell him the destination. He'd make up the route as he went along, avoiding traffic problems if possible by using his previous experience. It’s pretty clear that if you just set out from A, travelling to B as fast as you could, it would take less time than if mentally started at B, then worked backwards to determine when you ought to leave A. &lt;/p&gt;  &lt;p&gt;Agile behaviour in a software development team requires a similar faith in the ‘driver’ – in this case the people in the team. The quickest way to reach your destination is to have faith in the team to deliver, and to make sure that they understand the destination. If you then insist on them following a specific route, then you have just removed their capacity to avoid delays and dead-ends – removing the reason you hired them in the first place. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;If you want to be agile, you have to trust in your team.&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;(And yes, this does mean that outsourcing a project cannot be agile. It also means that agile is NOT a project management methodology. It’s a way of working.)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-6815469857976676894?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/6815469857976676894/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=6815469857976676894" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/6815469857976676894?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/6815469857976676894?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/2K67L7PUWdQ/driving-to-airport-agile-style.html" title="Driving to the airport, agile-style." /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2011/06/driving-to-airport-agile-style.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcGQX08fSp7ImA9WhZWFkg.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-3433947449393449090</id><published>2011-05-16T00:49:00.000+01:00</published><updated>2011-05-17T17:33:40.375+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-17T17:33:40.375+01:00</app:edited><title>Application Lifecycle Management</title><content type="html">&lt;p&gt;&lt;i&gt;[Update: a couple of people have called me out on this post, and suggested that it would only work from the bottom up if you hire good developers. This is true. This entire blog is based on the philosophy that the cheapest and most efficient way to achieve any given goal in software is to hire a smaller number of better developers. If you have a different philosophy, then you may find this site more helpful &lt;a href="http://hrb.fm/keHPzD"&gt;http://hrb.fm/keHPzD&lt;/a&gt;.] &lt;/i&gt;&lt;/p&gt;  &lt;p&gt;ALM is described on Wikipedia as:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“…a continuous process of managing the life of an application through governance, development and maintenance. ALM is the marriage of business management to software engineering made possible by tools that facilitate and integrate requirements management, architecture, coding, testing, tracking, and release management.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The phrase itself is enough to make the blood run cold, but I’ve been struggling recently to justify why I think it’s a Bad Thing, and I think I’ve worked it out: it’s all about the direction in which processes are created and applied. &lt;/p&gt;  &lt;p&gt;ALM comes from the Old World (aka I.T.), where working practices are created by Architects and applied downwards to development teams. It’s a process designed to commoditise development, and to manage human beings out of the equation. If the process is sufficiently detailed and watertight, then developers can become replaceable – which in turn allows you to find cheapers versions.&amp;#160; &lt;/p&gt;  &lt;p&gt;This is lowest common denominator thinking – by creating a process that allows poor developers to work effectively, that same process will prevent good developers from doing what they’re good at. It’s mediocrity by design. Which in I.T. terms is not necessarily a bad thing – ERP, Accounting, Warehouse Management Systems – these are things that are: a.) operated in a controlled environment, b.) used by specially-trained staff, c.) defined by stability, not innovation.&lt;/p&gt;  &lt;p&gt;None of this applies to web application development – which is defined in contrast by: a.) public access, b.) self-service, c.) continuous innovation, and pace of change. In this New World (otherwise known as The Web), companies are defined by the quality of their development staff – they are the asset, and they need be allowed to flourish, and not capped by&amp;#160; process.&lt;/p&gt;  &lt;p&gt;The kicker to this is that process is still a good thing in this New World – but the new processes are designed not to prevent developers from getting things wrong, but to make it easier for them to get things right. ALM should exist in practice, but it should (in fact must) come from the bottom up – the processes are organic and designed by the developers, for the developers. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;There’s no requirement for management to even be aware of these processes – they should manage by outcome, not intervention.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;NB If this rings any bells with you I would recommend Orson Scott Card’s “software developers as bees” article - &lt;a title="http://hrb.fm/lIOR0w " href="http://hrb.fm/lIOR0w "&gt;http://hrb.fm/lIOR0w &lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-3433947449393449090?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/3433947449393449090/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=3433947449393449090" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/3433947449393449090?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/3433947449393449090?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/sz7uc2xiUrw/application-lifecycle-management.html" title="Application Lifecycle Management" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2011/05/application-lifecycle-management.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIARnk6cCp7ImA9WhZXGUk.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-9139952404513752066</id><published>2011-05-09T14:42:00.001+01:00</published><updated>2011-05-09T14:42:27.718+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-09T14:42:27.718+01:00</app:edited><title>Web app or native - looks like HTML is winning the war.</title><content type="html">&lt;p&gt;When the iPhone launched, one of the major gripes was the lack of support for native apps. Steve Jobs launched the web-apps-look-like-native-apps program, was roundly criticised for the lack of a native SDK, and sure enough it turned out it was already in the pipeline. The App-Age was born.&lt;/p&gt;  &lt;p&gt;(Not long after, Palm released webOS, a web-app platform from inception, and it was roundly praised for its innovative approach.)&lt;/p&gt;  &lt;p&gt;Circle back round a few years, and the plethora of native platforms (iOS, Android, RIM, webOS, WP7) and form factors (phone, tablet) combined with the emergence of HTML5 as a &amp;quot;standard&amp;quot; (albeit one implemented (in)differently by each platform developer) means that web-apps are now back in favour.&lt;/p&gt;  &lt;p&gt;PhoneGap in particular seems to have captured the mindshare of the mobile developer community; it will be interesting to see how this battle plays out over the coming year. Gaming aside, once local storage becomes a common feature, web apps look unstoppable.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-9139952404513752066?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/9139952404513752066/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=9139952404513752066" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/9139952404513752066?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/9139952404513752066?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/YA1-_FBjso0/web-app-or-native-looks-like-html-is.html" title="Web app or native - looks like HTML is winning the war." /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2011/05/web-app-or-native-looks-like-html-is.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAESX8_eyp7ImA9WhZRF0U.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-6892944250760840109</id><published>2011-04-14T14:28:00.001+01:00</published><updated>2011-04-14T14:28:28.143+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-14T14:28:28.143+01:00</app:edited><title>Ode to Dropbox</title><content type="html">&lt;p&gt;I’ve been using Dropbox for about 18 months, and before that I was a Mesh fan, and in the dim and distant past I spent many, many hours fighting with Plaxo and ActiveSync (see &lt;a href="http://blog.rodger-brown.com/2004/10/synchronicity-part-2.html"&gt;here&lt;/a&gt; for a post from 2004 on my frustrations at the time) - so I like to think I know a thing or two about file syncing issues.&lt;/p&gt;  &lt;p&gt;I have a separate work Dropbox account, which for the past couple of months has been so far over its (free) limit that I've had to stop using it (there's only so much you can legitimately clear out!) In the meantime, two things have been happening - I've been adding to the local directory, in anticipation of a future upgrade, and other people have been adding content to the remote folders. I had enough faith in Dropbox already to be able to cope with this – I’d get another 3GB of new content coming down, and Dropbox would get a few MB of changes from my local machine. Easy.&lt;/p&gt;  &lt;p&gt;Unfortunately, having upgraded, I discovered that in some overzealous spring-cleaning I had removed critical user profile files, and so the Windows user account associated with the work Dropbox account was corrupt, and I couldn't login and start Dropbox. This meant that all of my changes were now stuck in a local folder that couldn’t be synced, hidden amongst 2GB of data that had already been synced to the cloud.&lt;/p&gt;  &lt;p&gt;My solution was to create a brand new Windows account and to copy over the entire 2GB archive to this new profile before hitting the sync button - but this meant that instead of adding just my recent changes, I would be syncing the entire 2GB local directory to the new user profile, 99% of which was already on Dropbox, uploaded from a different Dropbox sync. I was convinced this would result in conflict armageddon (and about 48 hours of file transfers – 2GB up, 3GB down, merge, sync, index.)&lt;/p&gt;  &lt;p&gt;I left it running over lunch, came back and discovered... nothing. It had just worked.&lt;/p&gt;  &lt;p&gt;Dropbox is an amazing piece of software, and if they don't sell up to Microsoft (Windows 8 - Live Mesh replacement), Apple (MobileMe replacement) or Google (Chrome OS file system) for several billion dollars something ain't right.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-6892944250760840109?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/6892944250760840109/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=6892944250760840109" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/6892944250760840109?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/6892944250760840109?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/Ghf6SNXFwXI/ode-to-dropbox.html" title="Ode to Dropbox" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2011/04/ode-to-dropbox.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYNSH0zfSp7ImA9WhZREE4.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-2330433557847079048</id><published>2011-03-31T23:53:00.001+01:00</published><updated>2011-04-05T21:43:19.385+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-05T21:43:19.385+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="microsoft" /><title>Google lives in Perpetual Beta, whilst Microsoft shoots for RTM.</title><content type="html">&lt;p&gt;Something came up in conversation today that struck a chord with the (my) favourite topic of the moment – why is MSFT not responding to everything going on around it?&lt;/p&gt;  &lt;p&gt;I don’t really know anything at all about MSFT’s business – I’m a .net guy, I’ve been to Redmond, I’ve seen the inside of the machine, but I don’t know all the ins-and-outs. But I do know what they do – and more importantly, how they do it, and that gives me enough to form an opinion.&lt;/p&gt;  &lt;p&gt;They produce software. And the software they produce, even to this day, is distributed on physical disks. That’s right – they burn their software onto shiny plastic disks, which are then distributed around the world (“filling the channel”). And this is their problem.&lt;/p&gt;  &lt;p&gt;Culturally, MSFT is still working in a physical disk world. If you’re burning your software onto 100m disks, you can’t afford to get it wrong, and you can’t easily get it back again once it’s left the building. So they create enormous product development cycles, building towards huge, monolithic, releases. They still call their final releases RTM (Release to Manufacturing). Their development processes are built around this concept, their product development process are built around this concept. Worse still, they have partnerships with disk-pressing plants and disk-selling retail channels. And all of this baggage they haul around with themselves to this day.&lt;/p&gt;  &lt;p&gt;Back in the 90s, the talk was of how MSFT missed the boat, misunderstood the internet, and then woke up. They suddenly Got It. The built a better browser, killed Netscape, and now they owned it. Except that they didn’t. They thought that the internet &lt;strong&gt;was&lt;/strong&gt; the browser – and since they owned the desktop, they could fold in a browser for free and their job was done. Wrong.&lt;/p&gt;  &lt;p&gt;They still don’t get the internet; only 18 months ago I was being told, in Redmond, that whilst the internet was nice, desktop applications were nicer, so could we please put our internet-only Silverlight idea on hold, and just get with the Windows 7 program.&lt;/p&gt;  &lt;p&gt;Google has none of this this heritage – it was born from the internet. As was Facebook. They can innovate and release at internet speed. A Google search results page is a continuously evolving multi-variate test. When they say that they live life in beta – they’re not lying – they really are trying new ideas every single day, live. &lt;strong&gt;Google is never “RTM”.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;And Microsoft cannot compete – because of its legacy. They have a vault of cash, and some fantastic talent, but until they start to shed some of their physical dead-weight, until they acknowledge what the internet has done to &lt;strong&gt;their&lt;/strong&gt; business (a business they invented), they are heading into retirement. The world they built is innovating away from them, and they’re just too slow to react.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-2330433557847079048?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/2330433557847079048/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=2330433557847079048" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/2330433557847079048?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/2330433557847079048?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/LCFHyIqh-vU/google-lives-in-perpetual-beta-whilst.html" title="Google lives in Perpetual Beta, whilst Microsoft shoots for RTM." /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2011/03/google-lives-in-perpetual-beta-whilst.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4FQXs_fCp7ImA9WhZSFU8.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-7842459349981405997</id><published>2011-03-30T23:25:00.001+01:00</published><updated>2011-03-30T23:25:10.544+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-30T23:25:10.544+01:00</app:edited><title>webOS Developer Connect (London) – notes from a (very) small island</title><content type="html">&lt;p&gt;I’ve just come back from the HP webOS “Connect” meeting in London, where a bar full of eager mobile web developers were being courted (with free* beer no less) by the worldwide VP of Developer Relations, Richard Kerris.&lt;/p&gt;  &lt;p&gt;I didn’t stay the full distance, leaving after about an hour and a half, and that in itself is not a good sign.&lt;/p&gt;  &lt;p&gt;Kerris himself gave a great, and sincere, introduction to the evening. He seems like a nice guy – competent, articulate, honest. He promised the best mobile developer program in the world, access to 100m devices in the coming years (HP have committed to getting webOS onto notebooks – or possibly netbooks, one of them). The devices look good, the OS seems to be right in the 2011 sweetspot, and HP has a mountain of money – so anticipation levels were high.&lt;/p&gt;  &lt;p&gt;And then the presentations began.&lt;/p&gt;  &lt;p&gt;I stayed for about half-a-dozen ten minute presentations, and frankly they were lamentable. Someone from the Guardian (where isn’t there a Guardian presenter these days) gave a great little talk on how important &lt;strike&gt;iOS&lt;/strike&gt; mobile devices are to their future strategy. Unfortunately they don’t have any webOS applications.&lt;/p&gt;  &lt;p&gt;Then came a German games developer – seriously, flown in from Germany. As if there’s no one comparable in the UK. Except apparently there isn’t. He too gave a nice talk – predominantly on how the first SDK didn’t really work, and how he ported his first webOS app to iOS in a couple of days. And he’s a paid (in expenses at least) advocate.&lt;/p&gt;  &lt;p&gt;Then we had a succession of very nice people, all of whom had various degrees of hello world apps to show, but nothing commercially viable. At which point I had to leave.&lt;/p&gt;  &lt;p&gt;I wasn’t the biggest fan of the &lt;a href="http://qconlondon.com/london-2011/presentation/Making+Apps+That+Don%27t+Suck"&gt;Pirate&lt;/a&gt; at QCon, but at least he had a company, employing real people, making money from iOS.&lt;/p&gt;  &lt;p&gt;I like Mr. Kerris, and I like webOS. Hell, I even quite liked an HP laptop I saw advertised the other day, but this was a pretty poor show from HP. They couldn’t even pull together a set of speakers willing to endorse the platform professionally. We wanted Rovio to turn up, or possibly Zynga. Or someone, anyone, who was doing something that might make money out of this. If HP are putting on a roadshow for developers (as is their stated intent) they need a lot more firepower, and if that means taking some US developers on the road with them, then that’s what they need to do.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;* That’s free as in beer.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-7842459349981405997?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/7842459349981405997/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=7842459349981405997" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/7842459349981405997?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/7842459349981405997?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/B7gTJSvH3vA/webos-developer-connect-london-notes.html" title="webOS Developer Connect (London) – notes from a (very) small island" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2011/03/webos-developer-connect-london-notes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkAMQn88cSp7ImA9WhZSEk8.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-3623488966802055701</id><published>2011-03-27T11:13:00.001+01:00</published><updated>2011-03-27T11:13:03.179+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-27T11:13:03.179+01:00</app:edited><title>Color may have something to it after all…</title><content type="html">&lt;p&gt;I was at an event on Thursday evening at @&lt;a href="http://www.techhub.com"&gt;TechHub&lt;/a&gt; and the &lt;a href="https://profiles.google.com/u/0/adewale/about"&gt;host&lt;/a&gt; for the evening invited everyone there to install &lt;a href="http://www.color.com/"&gt;Color&lt;/a&gt; and at least give it a go before wading in to the “&lt;a href="http://gigaom.com/2011/03/24/is-colors-team-really-worth-41m-idea-be-damned/"&gt;$41m for what&lt;/a&gt;?” debate. His teaser was quite an interesting one – by firing up Color on his phone he was able to see photos coming in from the party upstairs, and by commenting on the photos (i.e. socialising) he got himself invited to the party. &lt;/p&gt;  &lt;p&gt;Edge-case or mainstream – not sure, but it did at least counter the “wtf would I want to share photos with people I’m already in room with” argument.&lt;/p&gt;  &lt;p&gt;(NB I still think $41m is absurd, and &lt;strong&gt;we are definitely in a bubble&lt;/strong&gt; – Color may not be pets.com, but we’re only one high-profile flop from dotcom 2.0)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-3623488966802055701?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/3623488966802055701/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=3623488966802055701" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/3623488966802055701?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/3623488966802055701?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/uj_LLtEgCXo/color-may-have-something-to-it-after.html" title="Color may have something to it after all…" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2011/03/color-may-have-something-to-it-after.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UMQH4zfip7ImA9WhZSEUg.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-3309317951671156667</id><published>2011-03-26T14:54:00.001Z</published><updated>2011-03-26T14:54:41.086Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-26T14:54:41.086Z</app:edited><title>The Government is “joining up”– be afraid!</title><content type="html">&lt;p&gt;Today I applied online for a new driving licence – and as part of the process I was warned that the photo they had on record for me was only valid for a further six months. However, when I put in my passport number it found the photo I had scanned in when I got my new passport a few weeks previously. I was asked if I would like to use that instead – as it was valid for the next ten years.&lt;/p&gt;  &lt;p&gt;Aside from the great user experience (from a Government website no less), this points to two things:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;There is now inter-department “joined-up” Government&lt;/li&gt;    &lt;li&gt;I now have a de facto identity card – whether it’s physical or not&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The ramifications of this are enormous, and - in conjunction with recent treasury annoucement re. the combining of tax and national insurance – we are closing in on a time when the Government might have a “single customer record” – which is not necessarily a good thing.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-3309317951671156667?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/3309317951671156667/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=3309317951671156667" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/3309317951671156667?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/3309317951671156667?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/CPsrKs-HWKw/government-is-joining-up-be-afraid.html" title="The Government is “joining up”– be afraid!" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2011/03/government-is-joining-up-be-afraid.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEBQ30zfSp7ImA9WhZTGEU.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-9122057585946435916</id><published>2011-03-23T12:15:00.001Z</published><updated>2011-03-23T12:17:32.385Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-23T12:17:32.385Z</app:edited><title>Using a foreign language to challenge UX</title><content type="html">&lt;p&gt;I have spent the morning trying to test a new website that is currently available to me in Ukranian and Swedish – neither of which I speak. I have a basic understanding of the site, having seen it in its original english some time ago, and I know the functional requirements. Not being able to speak Swedish meant that when filling in a form I had to make educated guesses based on the pure UX itself – was the warning text in red, was it in a relevant position etc.&lt;/p&gt;  &lt;p&gt;This turned out to be a fantastic way of testing the site. I repeatedly failed to submit a form because I hadn’t filled in a mandatory field, and the shape / style of the visual cues weren’t obvious enough to me.&lt;/p&gt;  &lt;p&gt;Another example – something that was obvious to me, but not to the native speakers, was an inconsistency in button styles – which caused me to cancel my form submission because I thought the cancel button was the confirmation button.&lt;/p&gt;  &lt;p&gt;I think I may have invented a new technique.&lt;/p&gt;  &lt;p&gt;(&lt;em&gt;In a similar fashion I do know someone who used to proof-read professionally, and she would read a document backwards – so that she could spell-check each word individually and out of context!&lt;/em&gt;)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-9122057585946435916?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/9122057585946435916/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=9122057585946435916" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/9122057585946435916?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/9122057585946435916?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/WkGxbjawzsw/using-foreign-language-to-challenge-ux.html" title="Using a foreign language to challenge UX" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2011/03/using-foreign-language-to-challenge-ux.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4NSXwyeSp7ImA9WhZTFEk.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-2603162131223098194</id><published>2011-03-18T09:36:00.001Z</published><updated>2011-03-18T09:36:38.291Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-18T09:36:38.291Z</app:edited><title>How we use HipChat</title><content type="html">&lt;p&gt;Inspired by a blog &lt;a href="http://37signals.com/svn/posts/681-behind-the-scenes-at-37signals-design"&gt;post&lt;/a&gt; (many years ago) by the 37Signals team on their use of Campfire, their own chat application, I have been trying, unsuccessfully, to wean the development team off Windows Live Messenger, Skype, et al. for team chat. &lt;/p&gt;  &lt;p&gt;I had been looking for a long, long time for something that would allow us to maintain long-lived (and searchable) chat archives, but that would also allow us to plug in some of our automated systems. Campfire itself didn’t work for us as it’s web-based, and no one was willing to give up the taskbar icon / notification process.&lt;/p&gt;  &lt;p&gt;Cue &lt;a href="http://www.hipchat.com"&gt;HipChat&lt;/a&gt; – which we’ve been using for a few weeks now, and which I am now unilaterally declaring a hit. I thought it might be interesting to show how we use the chat, and how our build / vcs systems interact with the chat application, so here you are – Profero developer chat, now in colour (click to view full-size):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_O96n_YKifVE/TYMno8Jme0I/AAAAAAAAAuo/ZoqqVIeg5vY/s1600-h/how-we-use-hipchat%5B7%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="how-we-use-hipchat" border="0" alt="how-we-use-hipchat" src="http://lh3.ggpht.com/_O96n_YKifVE/TYMnpcyeotI/AAAAAAAAAus/G_3kBSHJ-Ek/how-we-use-hipchat_thumb%5B5%5D.png?imgmax=800" width="675" height="292" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-2603162131223098194?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/2603162131223098194/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=2603162131223098194" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/2603162131223098194?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/2603162131223098194?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/4uIK5h8rXrc/how-we-use-hipchat.html" title="How we use HipChat" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_O96n_YKifVE/TYMnpcyeotI/AAAAAAAAAus/G_3kBSHJ-Ek/s72-c/how-we-use-hipchat_thumb%5B5%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2011/03/how-we-use-hipchat.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cDRnc-eSp7ImA9WhZTEU8.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-4227225341082878586</id><published>2011-03-14T16:56:00.000Z</published><updated>2011-03-14T17:51:17.951Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-14T17:51:17.951Z</app:edited><title>QCon London 2011 Review</title><content type="html">&lt;p&gt;I’ve done a quick round-up day-by-day, but here are my overall thoughts on QCon 2011. &lt;/p&gt;  &lt;p&gt;The conference as a whole seemed slightly subdued after last year – it was sold out, so I guess it had the same number of attendees, but many of the sessions were half-full, and there was often an uncomfortable silence at the end of presentations when they were opened up for questions.&lt;/p&gt;  &lt;p&gt;There was no stand-out presentation of the calibre of last year’s Facebook keynote, nor anything as technically impressive as the LMAX talk, despite presentations from Facebook, Google, Twitter, Netflix, VISA, Best Buy and a host of other big names. This year seemed to be more about getting things done – the nuts-and-bolts rather than the vision.&lt;/p&gt;  &lt;p&gt;On the plus side, there was an entire track devoted to NoSQL this year, and many of the other presentations included large slices of NoSQL goodness – be in no doubt, NoSQL is no longer a niche – this is mainstream technology, in production across the web today. A big thank you to Alex Popescu not only for hosting the track, but also for his tireless efforts to bring NoSQL to the attention of the community with his blog &lt;a href="http://nosql.mypopescu.com/"&gt;http://nosql.mypopescu.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I’ve touched on it my daily digest, but I got a real feeling that some of the more extreme team dynamics (see &lt;a href="http://blog.rodger-brown.com/2011/03/qcon-2011-london-day-one.html"&gt;Dan North&lt;/a&gt; and &lt;a href="http://blog.rodger-brown.com/2011/03/qcon-2011-london-day-one.html"&gt;Fred George’s&lt;/a&gt; talks in particular) are gaining traction – there seems to be a split forming between the radical side which is eschewing almost all project management practices, and those who are artlessly turning Agile into everything Waterfall had been (process over people). &lt;/p&gt;  &lt;p&gt;Maybe continuous deployment is the secret sauce that moves development from being project-based to business-as-usual; no need for a project plan, it’s just the job – come in, develop a feature, deploy it, go home. It looks like developers are now working with Ops (DevOps is everywhere) so closely that they are now testing and depoying their own code, and …. drum roll … it’s working! I have a train of thought going at the moment that says that if development costs moved from Capex to Opex (and innovation becomes a cost of doing business on the internet) companies would understand the requirements much better. No end date, no fixed scope – development just rolls on, day after day.&lt;/p&gt;  &lt;p&gt;HTML5 was also hot this year – Google and Facebook were both touting their experiences / thoughts, and I wouldn’t be surprised if both didn’t settle on it as a core mobile development platform – which makes the demise of WebOS all the more poignant – right idea, wrong time?&lt;/p&gt;  &lt;p&gt;The functional programming track was down from last year – server-side JS and Node.js in particular were this year’s favourites, with asynchronous programming the new concurrency paradigm. Since no one could claim production experience with Node, it’s hard to see where that’s going right now.&lt;/p&gt;  &lt;p&gt;Overall, another great conference, good speakers, and some interesting experiences shared. There wasn’t a truly memorable talk, but that aside, as someone said (and I’ve said before) – we are in a golden age for software development – we may never have it so good again, so get out there and make the most of it.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blog.rodger-brown.com/2011/03/qcon-2011-london-day-one.html"&gt;Day one review&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.rodger-brown.com/2011/03/qcon-2011-london-day-two.html"&gt;Day two review&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.rodger-brown.com/2011/03/qcon-2011-london-day-three.html"&gt;Day three review&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-4227225341082878586?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/4227225341082878586/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=4227225341082878586" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/4227225341082878586?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/4227225341082878586?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/U7x-6CUS774/qcon-london-2011-review.html" title="QCon London 2011 Review" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2011/03/qcon-london-2011-review.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUAQ3c8fCp7ImA9WhZREE4.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-4319077997964157551</id><published>2011-03-13T23:41:00.001Z</published><updated>2011-04-05T21:44:02.974+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-05T21:44:02.974+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="qcon" /><title>QCon 2011 (London): Day Three</title><content type="html">&lt;p&gt;Day three went a bit more webby – and technical, and frankly, a bit flat. It seemed slightly lacklustre.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://qconlondon.com/london-2011/presentation/Things+I+Wish+I%27d+Known"&gt;Keynote: Things I Wish I’d Known (Rod Johnson)&lt;/a&gt; 7/10:&lt;/p&gt;  &lt;p&gt;Co-founder of SpringSource, Rod is a successful entrepeneur, and entertaining speaker. He gave us a very personal take on the lessons learned, although I’m not sure I personally took anything away from it. I didn’t take any notes, so can’t really comment.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://qconlondon.com/london-2011/presentation/Single+Page+Apps+and+the+Future+of+History"&gt;Single Page Apps and Future of History (Michael Mahemoff)&lt;/a&gt; 7/10:&lt;/p&gt;  &lt;p&gt;Good talk from Michael (Googler) on the history of the web, and what single page apps will mean. Not much new here (for me) – this was more of a review session, but Michael put it all into context.&amp;#160; A good discussion of the hashbang debate followed, along with things like REST, Hijax, and the history API of HTML5 (push/pop/replace) – I’m still not totally convinced by SPAs, but they do seem to be gaining ground. For me, the summary is that many apps these days are very task focussed, and so a SPA may fit, but for a larger site, pages are still the way to go.&lt;/p&gt;  &lt;p&gt;I had actually been hoping for a session on WebSockets, but apparently that was cancelled. Que sera, sera.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://qconlondon.com/london-2011/presentations/show_presentation.jsp?oid=2778"&gt;Node.js: Asynchronous I/O For Fun and Profit (Stefan Tilkov)&lt;/a&gt; 7/10:&lt;/p&gt;  &lt;p&gt;Node.js is a very hot topic right now, and this session was packed to the rafters. Stefan gave us a great run-through of the model, and some possible uses. This was a code-level demo – although it was noted that no one in the room (inc. Stefan) had experience of running Node in production. Definitely one to watch, and I’m glad I went, but it was more out of interest than a practical requirement.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://qconlondon.com/london-2011/presentation/HTML5+%40+Facebook"&gt;HTML5 @ Facebook (David Recordon)&lt;/a&gt; 7/10:&lt;/p&gt;  &lt;p&gt;Key take-away here was the use of HTML/CSS/JS for mobile application development – clearly a focus at Facebook. David called out PhoneGap specifically, which kind of torpedos any other “appcelerator” framework given that it has the Facebook seal, and is free.&lt;/p&gt;  &lt;p&gt;There was a bit of a review as to how Facebook use HTML – specifically the BigPipe process – which is very clever, but not exactly news. &lt;/p&gt;  &lt;p&gt;Basically – they’re really clever at Facebook, and have more money than anyone else. Copy them with care – it may not work out quite as well as you had hoped.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://qconlondon.com/london-2011/presentation/Using+a+Graph+Database+to+power+the+Web+Of+Things"&gt;ThingWorx and Neo4j (Rick Bullotta &amp;amp; Emil Eifrem)&lt;/a&gt; 7/10:&lt;/p&gt;  &lt;p&gt;Bit of a sales pitch from Rick around his company, ThingWorx, which I didn’t really get (database of everything, and how it’s related to everything else), with not enough really information on Neo4j, the graph database.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://qconlondon.com/london-2011/presentation/HBase+%40+Facebook"&gt;HBase @ Facebook (Kannan Muthukkaruppan)&lt;/a&gt; 6/10:&lt;/p&gt;  &lt;p&gt;OK, so it was the last presentation, but it was also very, very technical. This was pretty serious stuff, and I lost track early on. As before, they’re cleverer than you are, at Facebook, so copy carefully.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-4319077997964157551?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/4319077997964157551/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=4319077997964157551" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/4319077997964157551?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/4319077997964157551?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/Eu0EujjUlR8/qcon-2011-london-day-three.html" title="QCon 2011 (London): Day Three" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2011/03/qcon-2011-london-day-three.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUAQ3c8fSp7ImA9WhZREE4.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-9026315359431908847</id><published>2011-03-13T23:03:00.001Z</published><updated>2011-04-05T21:44:02.975+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-05T21:44:02.975+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="qcon" /><title>QCon 2011 (London): Day Two</title><content type="html">&lt;p&gt;Day two was (for me) primarily about the big guys – Google, Twitter, Netflix &amp;amp; Best Buy all made appearances, so this was less about the Special Forces of day one, and more about how that theory scales.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://qconlondon.com/london-2011/presentation/Innovation+at+Google"&gt;Keynote: Innovation at Google (Patrick Copeland)&lt;/a&gt; 8/10:&lt;/p&gt;  &lt;p&gt;Great talk from Patrick Copeland on Google culture. Hard to summarise in short-form, but essentially the emphasis is on innovators (people) and not on ideas. Ideas are worthless without execution, everyone has an idea (Google themselves have 100-200k employee ideas in their idea-database), but very few people can make something out of an idea. Look for the spikey, difficult people – constantly challenging, never taking the easy route. Be prepared to fail, and fail fast – use data mercilessly to measure an idea, and if it’s not going anywhere kill it – Wave is the poster child for this philosophy. Google ‘dog-food’ anything and everything – not just new ideas per se, but even within the core product. Every search results page served is a complex multi-variate test (I’ve noticed this myself), measured and analysed. Like the previous day’s talks – no one should get too attached to anything – as everything is expendable. Fun section on the concept of the “pretendo-type” or “pretotype” – an example being the Palm guy who made a fake Palm Pilot out of wood and carried it around with him to see if it felt right. (See pretotype.org.) &lt;/p&gt;  &lt;p&gt;One possible newsworthy item here was the impending launch of “Androgen” – a “v. fast prototyping tool for Android”. Watch this space.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://qconlondon.com/london-2011/presentation/Building+Best+Buy%27s+BBY+Open+RESTful+Commerce+Engine"&gt;Building Best Buy’s RESTful Commerce Engine (Brian Sletten)&lt;/a&gt; 8/10:&lt;/p&gt;  &lt;p&gt;Starting to get into deep tech here, which was great. I worked with BBY a few years back, so have some appreciation of the complexity of creating software for such a behemoth, and they seem to have done a great job on their commerce API. The secret – well, there is no silver bullet (of course), but they seem to have taken a pragmatic approach – start simple, listen to your users and build out. I loved the purity of their implementation – particularly the use of hypermedia to provide fully-formed URLs to client software. You call the initial URL, and it will return all of the available service URLs. If they release a new service, they add it to the manifest, and you use it when you need to. Additional features included the use / extension of the link/rel attribute.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Our old friend “small teams, co-located” cropped up again – is there anyone who still believes that anonymous, distributed, teams of developer-drones can succeed?&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;One thing that they apparently found very useful is BDD – they have a very complete set (1,000+) of Cucumber tests that they can run – which apparently help enormously with smoke / regression testing new releases.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://qconlondon.com/london-2011/presentation/Data+Architecture+at+Twitter+Scale"&gt;Data Architecture at Twitter Scale (Nick Kallen)&lt;/a&gt; 7/10:&lt;/p&gt;  &lt;p&gt;Now we’re getting very deep – this was the first of a number of very technical presentations, which I can’t really do justice to here – though I would recommend the presentation when it finally appears on InfoQ. It was a really interesting data history lesson on Twitter – how they migrated from the original Rails / MySQL implementation to the (incredibly exotic) system they run today. Suffice to say, I now understand why the API restricts you to the last 3,200 tweets. They are fortunate in being to optimise for some incredibly precise scenarios, and so have built an architecture that supports those specific use cases. As one example, all of a user’s read-only timeline is cached in memory – so that when someone tweets all of their followers receive a message (pub-sub) that is then prepended to their own in-memory timeline. They have internal SLAs around every scenario – which includes propagating updates within a second – just imagine what that means when Ashton Kutcher tweets… (they can support 4.8m messages/second).&lt;/p&gt;  &lt;p&gt;Couple of interesting bits: all engineering solutions are considered transient (following the theme), good enough is considered good enough, and until recently social graph events (following/unfollowing) exceeded tweet events. Counter-intuitive, but true.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://qconlondon.com/london-2011/presentation/Behind+the+Scenes+at+Visa"&gt;Behind the Scenes at VISA (John Davies)&lt;/a&gt; 8/10:&lt;/p&gt;  &lt;p&gt;This was a first – the only unrecorded session (I believe), this was a walk into the murky world of the world’s finance backbone. I hesitate to repeat anything here – I fear for my safety! John’s own presentation was neutered by the policy wonks at VISA, so this was largely a Q&amp;amp;A session. Interesting factoids: VISA runs on a mainframe (is not distributed), it runs on 99.99999% availability, it provides the US government with their GDP figures, it can afford to lose two data centres without interrupting service. No one knows where the DCs are, and their core systems have probably only changed 10% in twenty years (contrast with Dan North’s software half-life measured in months). This is the opposite of Agile, and probably good for it – this is, next to ICBM programming, about as serious as it gets. But that also presents VISA with a problem – when Hyves (Dutch Facebook) introduced a payment system, VISA card transactions dropped 25% in nine months – if Facecbook (/Google / ?) were to do the same, VISA’s entire business could collapse, and with their bunker-mentality they would have no way to react. So, they’re getting out into the community, hence John’s presence at QCon – VISA needs the development community more than we need them – but this could present some life-changing opportunites to some.&lt;/p&gt;  &lt;p&gt;Be warned though – if you work at VISA you may have to sign quite a long, restrictive, covenant.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://qconlondon.com/london-2011/presentation/Netflix%E2%80%99s+Cloud+Data+Architecture"&gt;Netflix’s Cloud Data Architecture (Siddarth Anand)&lt;/a&gt; 8/10:&lt;/p&gt;  &lt;p&gt;Some great facts re. Netflix – they were spending $600m/year on USPS postage before embracing the web, streaming costs 1% of posting a DVD, at peak they account for 20% of downstream bandwidth in the US, they have $2bn in revenue, and they do all this with 400 employees, 15 of which are in IT operations. That’s 15. Extraordinary stuff.&lt;/p&gt;  &lt;p&gt;Anyway, they decided to move everything to AWS, which they did, in commendable JFDI style. One interesting point – they never attempted a wholesale data import from DC to cloud – but instead moved a user’s records on demand – when the user first accessed the new site. This meant that they were able to move everyone across over a two-three week period.&lt;/p&gt;  &lt;p&gt;Yet again, as if it needed re-emphasising – small teams of capable people, empowered to do the job.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://qconlondon.com/london-2011/presentation/Using+Hypermedia+Services+for+System+Integration"&gt;Using Hypermedia Services for System Integration (Tim Ewald)&lt;/a&gt; 6/10:&lt;/p&gt;  &lt;p&gt;This was the end session of the REST track, and I felt a bit like I’d walked into a private conference. This talk was quite opinionated, and there was a lot of speaker-audience chat about how important it was to use link/rel for hypermedia, or some other document annotation. I don’t really care – the theory of hypermedia is interesting in general, and specific implementations are interesting (qv BBY session), but frankly the academic details are not. This was a classic case of over-thinking. A bit more JFDI, a little less ivory-tower please.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-9026315359431908847?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/9026315359431908847/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=9026315359431908847" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/9026315359431908847?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/9026315359431908847?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/VnUWKaRJDcY/qcon-2011-london-day-two.html" title="QCon 2011 (London): Day Two" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2011/03/qcon-2011-london-day-two.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUAQ3c8fSp7ImA9WhZREE4.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-6100389272743815239</id><published>2011-03-13T20:53:00.001Z</published><updated>2011-04-05T21:44:02.975+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-05T21:44:02.975+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="qcon" /><title>QCon 2011 (London): Day One</title><content type="html">&lt;p&gt;Great opening day to QCon, with quite a consistent theme – we appear to have moved beyond Agile to a new post-Agile “lean development” model. This was echoed from the keynote through three of the five talks. This is the anti-offshore, anti-project-management, “let us get on with it” model – which may not work for many companies, but does appear to pay huge dividends to those brave enough to embrace it.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://qconlondon.com/london-2011/presentation/Scaling+Lean+%26+Agile%3A+Large%2C+Multisite+or+Offshore+Delivery"&gt;Keynote: Scaling Lean &amp;amp; Agile (Craig Larman)&lt;/a&gt; 8/10:    &lt;br /&gt;Keynote speech, interesting, insightful take on how to manage effective development across very large (1000+) teams. Essentially the QCon basics - hire great people, get out of their way. Avoid job titles - foster a culture of the master programmer - banish the word architect, and create cross-functional teams. Spend 5-10% of a sprint digging deeper into requirements for the next sprint. Great software engineers are gardners, not architects. Oh, and avoid project management tools where possible - it adds little except overhead.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://qconlondon.com/london-2011/presentation/From+months+to+minutes+-+upping+the+stakes"&gt;From months to minutes - upping the stakes (Dan North)&lt;/a&gt; 8/10:    &lt;br /&gt;Taking it up a notch, Dan North (a QCon regular) spoke about his conversion from Agile to the new post-Agile world - working in financial trading firm where software is released every three seconds on average. Or something like that. Dan's a good speaker, giving an entertaining talk, and a lot of what he said resonated with the keynote - small teams, tightly integrated (inc. the 'client'), with a lot of autonomy and control. You would have to build up a heck of a lot of trust to get away with this! Most interesting concept he spoke about is that of &amp;quot;Software Half-life&amp;quot; - this time taken for 50% of the codebase to be re-written. He estimated theirs in months - the codebase is constantly refactored out of existence; in a world like this, no one gets hung up on their own code perfection - get it done, and out of the door (&amp;quot;spike-and-stabilise&amp;quot;). He also spoke of the &amp;quot;path-to-production&amp;quot; being the most effective test-bed. True, but again, you'd need an awful lot of trust on account to be able to live like this. Fun though.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://qconlondon.com/london-2011/presentation/Lean+Programmer+Anarchy"&gt;Lean Programmer Anarchy (Fred George)&lt;/a&gt; 8/10:    &lt;br /&gt;Taking it up another notch (or ten), Fred George introduced us to &amp;quot;Developer Driven Development&amp;quot; - a world without QA, BA or PM - just developers and the client (internal). This is a world where developers are measured on their contribution to the bottom line - so frankly no one gives a damn about the backlog or what you did yesterday. Hard to believe it really works like this - but apparently it does, and the business now thinks that more developers = more profit, so on they come. Developers hire their own, self-organise and manage their own time. Extraordinary, but a great fun presentation. One interesting point that reflected the keynote was the &amp;quot;cult of the programmer&amp;quot; - a/c Fred, in the bad old days (of waterfall), being a developer was a crappy job (true), and so any decent developer wanted to move on to becoming an &amp;quot;architect&amp;quot;. This is no longer the case - as Fred put it - how many surgeons wake up one morning and decide to become a hospital administrator? Developers can now grow old at the keyboard, like geeky rock stars, which is a great thing (IMO).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://qconlondon.com/london-2011/presentation/Bringing+developers+and+testers+closer+together+with+Visual+Studio"&gt;Bringing Developers and Testers Together with Visual Studio (Giles Davies)&lt;/a&gt; 4/10:    &lt;br /&gt;Talk about coming down to earth with a bump! I walked into this talk by mistake - a last minute room-change meant that the &amp;quot;Do's and Don'ts on Android&amp;quot; talk I was expecting was in the adjacent room. In contrast to the previous talks (and the keynote) - the word from MSFT was &amp;quot;do you want developers having access to the test environment - probably not!&amp;quot; - cue tumbleweed. This was so at odds with the tone of the day (developer anarchy = profit) that it was hard to imagine it was the same conference. I felt sorry for the presenter - it wasn't his fault, and he did a grand job of demonstrating some convoluted Visual Studio features - I'll give him 4/5 for presenting and the content 0/5. Topped off with some Q&amp;amp;A around licensing. Wrong conference MSFT.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://qconlondon.com/london-2011/presentation/Agile+Operations+-+optimising+the+business+one+shell+script+at+a+time"&gt;Agile Operations (Dan North and Chris Read)&lt;/a&gt; 8/10:    &lt;br /&gt;Dan teamed up with (another ex-ThoughtWorker) Chris Read here to demonstrate how it all comes together. Great fun, and a repeat of a (ThoughtWorks) presentation from QCon SF that I watched a while back - basically reinforcing the concept of &amp;quot;Infrastructure as Code&amp;quot; - a lot of which depends on tools like Chef / Puppet / CFEngine etc. Putting everything into version control, rolling out changes to infrastructure like you would with code. The advantage of versioning includes having a comment attached to each change - no more mystery DNS updates! NB - these guys still deploy application code using hand-rolled shell scripts - the Chefification is for the network infrastructure only. Echoed one of the other themes of the day - &amp;quot;optimise for change&amp;quot; - change will happen, so embrace it and build it into your work. Like Etsy - these guys often find it's quicker to redeploy than rollback - sign of a good process IMO.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://qconlondon.com/london-2011/presentation/Making+Apps+That+Don%27t+Suck"&gt;Making Apps That Don't Suck (Mike Lee)&lt;/a&gt; 5/10:    &lt;br /&gt;Mike Lee is a legend, apparently. He's built some great apps on iOS, made some money (I guess), and is now travelling around the world dressed as a pirate. He's also a bit of a tit - and whilst I was interested in his views on iOS development, something he clearly knows about, I wasn't remotely interested in his views on life - which were of fortune-cookie sophistication. I have subsequently read that he was fired (&lt;a href="http://techcrunch.com/2008/08/26/tapulous-cofounder-mike-lee-ejected-from-company/)"&gt;http://techcrunch.com/2008/08/26/tapulous-cofounder-mike-lee-ejected-from-company/)&lt;/a&gt; from his own company. No surprise to me.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://qconlondon.com/london-2011/presentation/Innovations+and+Integrations%3A+Applying+Trendy+Technologies+to+NASA+Mission+Operations+Planning"&gt;NASA Keynote (Mark Powell)&lt;/a&gt; 6/10:    &lt;br /&gt;Second keynote of the day - this from a NASA guy, although not, much to the audience's dismay, someone writing software for spaceships. Still, it was interesting stuff - they clearly have some clever people working at NASA, but generally a downbeat end to the day.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-6100389272743815239?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/6100389272743815239/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=6100389272743815239" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/6100389272743815239?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/6100389272743815239?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/x4MXGXwzIjQ/qcon-2011-london-day-one.html" title="QCon 2011 (London): Day One" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2011/03/qcon-2011-london-day-one.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MBQ3ozeCp7ImA9Wx9SGE0.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-8647708720934499543</id><published>2010-12-08T10:50:00.001Z</published><updated>2010-12-08T10:50:52.480Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-08T10:50:52.480Z</app:edited><title>Shoreditch – partying like it’s 1999</title><content type="html">&lt;blockquote&gt;   &lt;p&gt;     &lt;br /&gt;I’m a bit late on this one, but when I read about this on holiday - &lt;a title="http://www.wired.co.uk/news/archive/2010-11/04/david-cameron-silicon-roundabout" href="http://www.wired.co.uk/news/archive/2010-11/04/david-cameron-silicon-roundabout"&gt;http://www.wired.co.uk/news/archive/2010-11/04/david-cameron-silicon-roundabout&lt;/a&gt; – I thought I was dreaming. Silicon roundabout has apparently become mainstream, but this is very, very old news (even in real, i.e. not-internet, time).&lt;/p&gt;    &lt;p&gt;I went to my first Old Street rooftop digital / web collective launch party in 1999 – Hoxton Square was &lt;em&gt;the&lt;/em&gt; place during the original dotcom bubble. Lastminute.com was headquartered down the road in Farringdon, I went to an interview at Gorrilla Park Ventures in a converted warehouse near Spitalfields – the idea that the tech community has suddenly converged on the strip running from Farringdon through Old Street to Shoreditch is pure marketing fluff.&lt;/p&gt;    &lt;p&gt;Perhaps we’re just waking up after the 10-year hangover.&lt;/p&gt;&lt;/blockquote&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-8647708720934499543?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/8647708720934499543/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=8647708720934499543" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/8647708720934499543?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/8647708720934499543?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/VtrRZ_Ly69E/shoreditch-partying-like-its-1999.html" title="Shoreditch – partying like it’s 1999" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2010/12/shoreditch-partying-like-its-1999.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ENQHw9cCp7ImA9Wx5bGUs.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-4464159469525736389</id><published>2010-11-05T12:54:00.001Z</published><updated>2010-11-05T12:54:51.268Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-05T12:54:51.268Z</app:edited><title>Web Forms (1): Validation</title><content type="html">&lt;p&gt;This post is more of a note-to-self than anything. Part one of a two-parter, concentrating on web form processing – first from a server-side point of view, and then later, from a user-centric client-side point of view. The aim is to document a pattern for forms processing that is consistent and repeatable for any website. Think PRG (Post-Redirect-Get), with some server-side detail added in for good measure. PRG+.&lt;/p&gt;  &lt;p&gt;In this post, I just want to focus on server-side data validation, and how to deal with the different types of invalid data entry. The first point to note is that you should never make any assumption about the origin of the data. You must ignore any notion of client-side validation – the data that your controller receives as the request could have come from anywhere, and may contain anything. Data is sent over the wire as text key-value pairs, and should therefore go through a number of validation steps:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Checking the data type – everything arrives as a string over the wire, so needs checking&lt;/li&gt;    &lt;li&gt;Simple data type logic – is an email in a valid format, is a date of birth set in the past&lt;/li&gt;    &lt;li&gt;Domain logic – is an email / username a duplicate, does a product exist, is the price ‘right’?&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Only at this point can you attempt to process the form with any confidence.&lt;/p&gt;  &lt;p&gt;When an rule fails, there are a couple of different ways in which the user can be notified:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Return to the form, and allow them to amend the invalid data&lt;/li&gt;    &lt;li&gt;Proceed to a new page, with appropriate messaging (e.g. PRG)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I will go into more detail around this side of the process in the next post (when to redirect, how to notify users etc.), however one thing I would highlight here is the difference between recoverable and unrecoverable errors: if the data fails validation before any changes are made server-side, then I believe the user should be alerted via a warning message and not an error message. Errors should indicate that something went wrong, and if a form fails validation then the user should always have the option to amend their data and resubmit it. In project management terminology, warnings indicate a risk (something that could go wrong if mitigating action is not taken), whilst errors indicate an issue – something that has gone wrong already.&lt;/p&gt;  &lt;p&gt;I also believe that there is a difference between the simple data validation and the contextual business domain validation, and that only the first type should ever be replicated client-side (ignoring AJAX for now – more of that next time). In an MVC world, I think the first type can be done by the controller, and that this validation should match client-side validation, whilst the second type should be done deeper into the model and / or application domain. (Assuming that the controller is just that – a controller – and that it delegates the ‘doing’ to other components.)&lt;/p&gt;  &lt;p&gt;Below is some pseudo-code demonstrating what I believe** to be the ideal processing and validation for a sample form request handler.&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;ProcessForm(request)      &lt;br /&gt;{&amp;#160; &lt;br /&gt;&lt;font color="#008000"&gt;&amp;#160;&amp;#160;&amp;#160; /* first do some 'dumb' data type validation of input values – remember       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; that all request values are passed over the wire as text, so they need to        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; be validated according to the basic destination data type. At this point         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; client-side validation should be ignored – we don’t know that the information        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; was submitted using the form – we simply know which controller was called. */        &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; if (! isEmail(request.email))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; view-data.errors.add(new InvalidPropertyException(&amp;quot;email&amp;quot;))       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#666666"&gt;if (! isZipcode(request.zip))        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; view-data.errors.add(new InvalidPropertyException(&amp;quot;zipcode&amp;quot;))         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#a5a5a5"&gt;if (! isDate(request.dob))        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; view-data.errors.add(new InvalidPropertyException(&amp;quot;dob&amp;quot;))        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; etc.&lt;/font&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&lt;font color="#a5a5a5"&gt;&amp;#160; &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* if we have any errors so far then don't bother continuing, return to the       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; form and prompt the user for new values. This is WARNING, and not an ERROR,         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; as nothing has been changed server-side, and the user can always amend the         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; values and resubmit. This is the server-side equivalent of client-side JS         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; validation. */&amp;#160; &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160; if (view-data.hasErrors)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#f79646"&gt;returnToFormAndHighlightIssues()&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;font color="#008000"&gt;&amp;#160;&amp;#160;&amp;#160; /* if we get here then we know that the values are 'correct' but that doesn't       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&lt;font color="#008000"&gt;mean they will work. This next validation step may require more context than        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; the simple &lt;/font&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&lt;font color="#008000"&gt;validation above – it is not something that can (or should) be&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; replicated in client-side JS. e.g. is the price in the acceptable range, is the         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; username available. */        &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160; try       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; model = new model(request.email, request.zip, request.dob, request.price)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; doSomethingWithModel(model)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&lt;font color="#008000"&gt;&amp;#160;&amp;#160;&amp;#160; /* exception thrown by any property setter that doesn't like the value it's       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; given; this is functionally equivalent to the case above - nothing has really         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; happened so log this as a WARNING, and not an ERROR */&lt;/font&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; catch (&lt;strong&gt;&lt;u&gt;InvalidPropertyException&lt;/u&gt;&lt;/strong&gt;)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; view-data.errors.add(theException)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#f79646"&gt;returnToFormAndHighlightIssues()&lt;/font&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&lt;font color="#008000"&gt;&amp;#160;&amp;#160;&amp;#160; /* exception thrown by the doSomethingWithModel method that occurs BEFORE        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; anything has been committed, and whilst there is the opportunity to resubmit         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; the data. An example of this might be an attempt to register a duplicate         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; username; this can be marked as a WARNING or an ERROR, depending on context.*/        &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160; catch (&lt;strong&gt;&lt;u&gt;RecoverableException&lt;/u&gt;&lt;/strong&gt;)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; view-data.errors.add(theException)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#ff8000"&gt;returnToFormAndHighlightErrors()&lt;/font&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&lt;font color="#008000"&gt;&amp;#160;&amp;#160;&amp;#160; /* exception thrown by the doSomethingWithModel method after data has been        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; irreversibly committed. In this case resubmitting the data is not desirable,         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; and the user should be alerted! An example of this might be a database         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; exception after the record has been partially committed. */        &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160; catch (&lt;strong&gt;&lt;u&gt;UnrecoverableException&lt;/u&gt;&lt;/strong&gt;, AnyOtherUnexpectedException)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; view-data.errors.add(theException)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#ff0000"&gt;renderDifferentPageWithMoreInformation()        &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;font color="#008000"&gt;&amp;#160;&amp;#160;&amp;#160; // phew - if we got here it all went well, so we render the anticipated page&lt;/font&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;renderExpectedPage()&lt;/strong&gt;       &lt;br /&gt;}       &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;** It would be fair to say that my views on this aren’t universally accepted – comments welcome.&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-4464159469525736389?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/4464159469525736389/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=4464159469525736389" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/4464159469525736389?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/4464159469525736389?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/MLkQdG_M-RE/web-forms-1-validation.html" title="Web Forms (1): Validation" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2010/11/web-forms-1-validation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04ASX84cSp7ImA9Wx5UFU4.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-824105821929775002</id><published>2010-10-20T00:45:00.001+01:00</published><updated>2010-10-20T00:45:48.139+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-20T00:45:48.139+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="search" /><category scheme="http://www.blogger.com/atom/ns#" term="internet" /><title>Guardian Open Platform – IT, or Innovation?</title><content type="html">&lt;p&gt;Earlier this week I attended the Enterprise Search &lt;a href="http://www.meetup.com/es-london/"&gt;Meetup&lt;/a&gt; that was held at the Guardian’s office, and entitled “&lt;a href="http://www.meetup.com/es-london/calendar/14829629/"&gt;Search at the Guardian&lt;/a&gt;”. &lt;/p&gt;  &lt;p&gt;It was a great event, lots of interesting details and a good insight into the Guardian, who, through their &lt;a href="http://www.guardian.co.uk/open-platform"&gt;Open Platform&lt;/a&gt; initiative, seem to running away from the rest of Fleet Street in terms of innovation and open data. Who knows, perhaps they even “get” online?&lt;/p&gt;  &lt;p&gt;Plenty of others have written &lt;a href="http://bit.ly/bXptOe"&gt;reviews&lt;/a&gt; of the event, and most of the speakers themselves blog regularly about the Open Platform, so I won’t go into that here – suffice to say that, in the words of &lt;a href="http://twitter.com/currybet"&gt;Martin Belam&lt;/a&gt;, “Open Data is basically one big advanced search query”.&lt;/p&gt;  &lt;p&gt;What I found most interesting about the evening was the philosophy / approach behind the initiative, something that I believe is neatly illustrated by their choice of search software. &lt;/p&gt;  &lt;p&gt;The Guardian held a search “bake-off” when they had to decide whether to upgrade their Endeca implementation to a new version, and they invited &lt;a href="http://www.endeca.com"&gt;Endeca&lt;/a&gt;, &lt;a href="http://sharepoint.microsoft.com/en-us/product/capabilities/search/Pages/Fast-Search.aspx"&gt;FAST&lt;/a&gt; and Apache &lt;a href="http://lucene.apache.org/solr/"&gt;Solr&lt;/a&gt;. The eventual winner, and apparently this was a decision that ignored commercial factors, was the ‘free’ one – Solr. And why – well, because when it came down to it, Solr was more developer-friendly, and they knew that when they started to push the boundaries of the product, they could either reach out to the community, or, heaven-forbid, do it themselves.&lt;/p&gt;  &lt;p&gt;This is not a rant about Open Source Software, however, as I’m not sure that’s the point. I think the Guardian is probably spending more on people tweaking their free software by hand than they would have spent on the licence fee for the expensive commercial software equivalents. &lt;/p&gt;  &lt;p&gt;To me, the point is this: on the plus side, the commercial product comes with a supportable SLA, a sense of security around the product vendor, and a contract, which allows the user to hold the vendor to account in the event of failure. It also comes with a set of documented tools and user manuals – a product is designed to slot into an operational model.&lt;/p&gt;  &lt;p&gt;On the downside, it is very hard to innovate around a commercial product – if it doesn’t do what you want it to, you simply have to sit and wait for the next release. &lt;/p&gt;  &lt;p&gt;To an IT-style &amp;quot;CIO”, this is perfect – a fixed contract allows them to manage costs and budget for the year ahead – as well as safe-guarding their position (it would be hard to fire someone for choosing to buying Endeca over Solr in a large organisation.) It reinforces the idea of technology as an operational cost, to be managed down. This is is the essence of “IT”.&lt;/p&gt;  &lt;p&gt;The alternative approach is to invest that same money in people – clever people, empowered to innovate. For the same amount of money they are now treating technology as a competitive advantage, something that can be used to put clear water between themselves and their peers. It’s a huge gamble, and the person responsible almost certainly &lt;strong&gt;will&lt;/strong&gt; lose their job if it doesn’t pay off.&lt;/p&gt;  &lt;p&gt;In answer to my question on the night - “What is the commercial model, and why would anyone pay to support this initiative”, it was clear that whilst there is no direct commercial model as such (it’s free, after all) they were already seeing benefits. As &lt;a href="http://twitter.com/#!/cuica"&gt;Stephen Dunn&lt;/a&gt; (whose decision it may have been) pointed out, by opening up their platform they are capable of supporting far more partners than they would have been by trying to integrate them into their core systems. (I’m not sure this was the original design goal, but I may be wrong.)&lt;/p&gt;  &lt;p&gt;A brave initiative from the Guardian, and one worth supporting.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-824105821929775002?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/824105821929775002/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=824105821929775002" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/824105821929775002?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/824105821929775002?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/Ov0LHJpkkgk/guardian-open-platform-it-or-innovation.html" title="Guardian Open Platform – IT, or Innovation?" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2010/10/guardian-open-platform-it-or-innovation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEAQHc-eyp7ImA9Wx5UFU8.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-7006397997403503792</id><published>2010-10-19T23:33:00.001+01:00</published><updated>2010-10-19T23:34:01.953+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-19T23:34:01.953+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="internet" /><title>DNS Propagation</title><content type="html">&lt;p&gt;We all tell clients that DNS changes take 24-48 hours to propagate, but we very rarely get to see any evidence of this. Well, now I have a nice chart showing just this.&lt;/p&gt;  &lt;p&gt;A website that I am, ahem, involved with, went offline for a period of time earlier this week on account of a ‘miscommunication’ with the company hosting the DNS name servers. As a result, they removed the DNS record from their servers, and the domain simply disappeared from the internet. The solution was pretty simple – update the name servers to the current hosting provider (the ever reliable &lt;a href="http://www.rackspace.com"&gt;Rackspace&lt;/a&gt;, who I have no hesitation in plugging – their service desk is fantastic). Then all I had to do was sit back and wait.&lt;/p&gt;  &lt;p&gt;Fortunately, at the same time the site was being monitored by the equally reliable &lt;a href="http://www.pingdom.com"&gt;Pingdom&lt;/a&gt;, who monitor the site from 25 &lt;a href="https://pp.pingdom.com/index.php/member/probe_servers"&gt;locations&lt;/a&gt; in 10 &lt;a href="https://pp.pingdom.com/index.php/member/probe_servers"&gt;countries&lt;/a&gt; across Europe and North America (not representative of the world, I know, but enough to make this interesting).&lt;/p&gt;  &lt;p&gt;This meant that I could watch the propagation of the DNS change as it was picked up by their servers. Again, this is not a scientific survey, but interesting nonetheless.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_O96n_YKifVE/TL4cuNa6AhI/AAAAAAAAAn8/vOhVLgLZ_fs/s1600-h/dns_propagation%5B8%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="dns_propagation" border="0" alt="dns_propagation" src="http://lh3.ggpht.com/_O96n_YKifVE/TL4cukWiteI/AAAAAAAAAoA/jRSFOldebf0/dns_propagation_thumb%5B6%5D.png?imgmax=800" width="401" height="227" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-7006397997403503792?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/7006397997403503792/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=7006397997403503792" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/7006397997403503792?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/7006397997403503792?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/eW7cAIWjrys/dns-propagation.html" title="DNS Propagation" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_O96n_YKifVE/TL4cukWiteI/AAAAAAAAAoA/jRSFOldebf0/s72-c/dns_propagation_thumb%5B6%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2010/10/dns-propagation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcGSXw-eip7ImA9Wx5WGEU.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-8384169876650626513</id><published>2010-09-30T21:53:00.001+01:00</published><updated>2010-09-30T21:53:48.252+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-30T21:53:48.252+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="development" /><category scheme="http://www.blogger.com/atom/ns#" term="design" /><title>User-centred design</title><content type="html">&lt;p&gt;In a follow-up to my previous post on admin interfaces, I thought I’d post on something that happened the other day on the current project.&lt;/p&gt;  &lt;p&gt;As part of the ecommerce site we’re building we have a dedicated service for managing email notifications (registration, order confirmation, lost password etc. – about 50 in total), and during development we’ve been using Google’s SMTP service to do the sending itself. A couple of days ago I wanted to find out whether an email had been sent (as it hadn’t been received), and the easiest way to do that was to log in to the associated Gmail account and look into the Sent Items folder.&lt;/p&gt;  &lt;p&gt;Turns out, the best logging / admin tool for an email service is, well, an email service. You can search through the emails, filter them, track them, configure various options and more. It just works.&lt;/p&gt;  &lt;p&gt;At the same time, whilst thinking through the process for website administrators to take down certain products, the solution is not to give them access to a special website from where they can use the the Take-Down function (for which they will need the appropriate training and documentation), it’s to put a Take-Down button on the website product page that is only visible to people who are administrators. No “process re-engineering” required. &lt;/p&gt;  &lt;p&gt;This user-centred design concept may yet catch on…&lt;/p&gt;  &lt;p&gt;(Of course, it can get a bit out of hand – qv the “customer journey re-engineering manager” comment in this article - &lt;a title="http://hrb.fm/aMakDY" href="http://hrb.fm/aMakDY"&gt;http://hrb.fm/aMakDY&lt;/a&gt; – rather embarrassingly I think I know the people involved!)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-8384169876650626513?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/8384169876650626513/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=8384169876650626513" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/8384169876650626513?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/8384169876650626513?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/SR2VfBlxOyU/user-centred-design.html" title="User-centred design" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2010/09/user-centred-design.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAHQXgyeyp7ImA9Wx5WFU8.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-2256105364015969989</id><published>2010-09-26T20:02:00.001+01:00</published><updated>2010-09-26T20:02:10.693+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-26T20:02:10.693+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="development" /><category scheme="http://www.blogger.com/atom/ns#" term="nosql" /><category scheme="http://www.blogger.com/atom/ns#" term="internet" /><title>HTTP self-service</title><content type="html">&lt;p&gt;HTTP is all around us – it has become the de facto transport protocol of choice; web servers may be the primary source, but routers / access points have used it for a&amp;#160; long time, databases have begun to use it (e.g. CouchDB, RavenDB), and now even console apps have taken to its user-friendly interface. We’ve been using Mercurial on our latest project, which is a fantastic application in its own right, and despite being essentially a console application, it too contains its own HTTP server. Type in “hg serve” at the command line, and it will start up a single-use dedicated HTTP server, which provides a great online user interface.&lt;/p&gt;  &lt;p&gt;I won’t go into the details (you can try it yourself), but it did set me thinking. Running background applications on a server have always suffered from the lack of user interface, but embedding an HTTP server in the application would allow you&amp;#160; to offer this**. Moreover, within a locked-down production environment you could provide network access to an application using a protocol that sysadmins understand.&lt;/p&gt;  &lt;p&gt;Digging a little deeper, I came across &lt;a href="http://kayakhttp.com/docs/server/"&gt;Kayak&lt;/a&gt; – a lightweight .NET HTTP server, which would allow just this. It should be possible to use this (or an equivalent)&amp;#160; to bundle an HTTP server in with your services to serve up things like: logs, service status (e.g. databases up, network locations running) &amp;amp; configuration information. This would also allow you to manage / update configuration settings in runtime, and to combine multiple services into a simple management console. &lt;/p&gt;  &lt;p&gt;Ultimately, it would be great to provide a mechanism for uploading software updates – in the same way that you update router firmware – navigate to a URL, upload an update package, and then restart the service. Add in scripting support, and it would make management of a multi-server environment much, much simpler, without the need for an expensive System Centre type application.&lt;/p&gt;  &lt;p&gt;I’m so convinced that this is a good idea that I’m going to set up a project to demonstrate its application, so watch this space.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;** NB – when I say “user” interface, I am obviously talking about the tech-team, not end-users. I’m not advocating opening this kind of interface to the internet – this is internal only!&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-2256105364015969989?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/2256105364015969989/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=2256105364015969989" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/2256105364015969989?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/2256105364015969989?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/iufPrx7WqxE/http-self-service.html" title="HTTP self-service" /><author><name>Hugo Rodger-Brown</name><uri>http://www.blogger.com/profile/12695583613011940337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2010/09/http-self-service.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4EQn4_cSp7ImA9Wx5XE0Q.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-9149612776507984591</id><published>2010-09-13T18:28:00.001+01:00</published><updated>2010-09-13T18:28:23.049+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-13T18:28:23.049+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="development" /><title>Whatever happened to XSLT?</title><content type="html">&lt;p&gt;Many, many years ago I built a website that used XHTML/XSLT to render all of the pages (this was back in the old-school ASP days). It worked a treat, and I’ve had a certain regard for XSLT ever since.&lt;/p&gt;  &lt;p&gt;Which is why I was curious when some colleagues were tasked with building an email template system for an ecommerce system (large ecommerce systems can have dozens of email templates covering things like order confirmation, registration, forgotten password etc.) and then decided to use their own custom templating language. &lt;/p&gt;  &lt;p&gt;Surely this is what XSLT was invented for – taking one block of XML (e.g. order details) and transforming it into another (an XHTML representation of the order)? “Too hard” came the reply; “it’s another language to learn” was another.&lt;/p&gt;  &lt;p&gt;I wondered if this was a wide-spread complaint, so did a quick Google, and it appears as if XSLT has dropped into a black hole. It’s either so ubiquitous that no one talks about it anymore (it just works), or people are genuinely turned off by it. &lt;/p&gt;  &lt;p&gt;It’s a shame, because with all of the fuss about DSLs these days, XSLT deserves an honourable mention.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-9149612776507984591?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/9149612776507984591/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=9149612776507984591" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/9149612776507984591?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/9149612776507984591?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/AH7ByLt46CI/whatever-happened-to-xslt.html" title="Whatever happened to XSLT?" /><author><name>Hugo Rodger-Brown</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2010/09/whatever-happened-to-xslt.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYNSH0zfSp7ImA9WhZREE4.&quot;"><id>tag:blogger.com,1999:blog-7846496.post-3573269132462849052</id><published>2010-08-22T21:24:00.003+01:00</published><updated>2011-04-05T21:43:19.385+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-05T21:43:19.385+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="google" /><title>Google’s “High Performance Image Serving”</title><content type="html">&lt;p&gt;&lt;em&gt;[Update] I stand corrected - I do now have billing enabled on my Apps account, and can confirm that images are served with all the correct response headers set. The URLs do indeed support 304 conditional GETs on the production infrastructure, which makes this a very attractive image hosting solution. Well done Google, apologies for the mis-representation.     &lt;br /&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;(NB – &lt;del&gt;this article is based on the development SDK (1.3.6) – I haven’t been able to test on the production infrastructure as yet as for some reason Google won’t authorize billing on my AppEngine account, without which the Blobstore is unavailable!&lt;/del&gt;)&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;The concept of a hosted service that manages image serving / caching, resizing &amp;amp; cropping is something that has cropped up in projects I’ve been involved with for the past 5 years (and the rest). &lt;/p&gt;  &lt;p&gt;I had a hand in a startup about 6 years ago now that processed MMS (picture messages) that people sent in. At its simplest this involved storing people’s uploaded images, and then cropping / rotating and resizing the images to fit a certain profile (we were printing them out, and needed to convert landscape to portrait, and crop to a fixed aspect ratio.)&lt;/p&gt;  &lt;p&gt;Subsequent to that experience I worked for many years in online digital entertainment, developing a platform for the processing of music / video assets, and one of the elements we also needed was the ability to take in hi-res images, shrink to an acceptable size / format (e.g. not TIFF), and then host them for delivery across a CDN.&lt;/p&gt;  &lt;p&gt;The project I’m currently working on has a combination of the two – processing user-generated content for serving back over the web. What we need is an image processing service, backed with a large data store, and a high-performance cache.&lt;/p&gt;  &lt;p&gt;So, it was with great excitement that I noticed that the Google App Engine SDK comes with an in-built library to do exactly this. It’s built on top of the Picasa library (it even includes the “I feel lucky” transformation), and enables cropping, resizing, rotation etc. The App Engine platform has no file-backed storage, but the datastore does include the BlobProperty type, which can be used to store binary data (such as images). A simple image processor using this took about fifteen minutes to set up (which was mainly cut-and-paste from their sample app &lt;a href="http://code.google.com/appengine/docs/python/images/overview.html#Transforming_Images_in_Python"&gt;here&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;(Some people may by now be thinking “&lt;a href="http://tinysrc.net/"&gt;Tinysrc&lt;/a&gt;” – the online service that resizes images for mobile screens – well, no surprises, tinysrc runs on AppEngine – this is precisely how they do it, except that they pull the images from a remote server – they are not stored.)&lt;/p&gt;  &lt;p&gt;The downside of this approach is the the datastore has a 1MB limit per entity, which makes it borderline useful if you’re dealing with UGC (web-optimised images should never be 1MB, but the image someone just uploaded from their new digital camera could easily be.)&lt;/p&gt;  &lt;p&gt;Fortunately, Google provides a secondary datastore specifically for large binary objects, called the Blobstore. It’s well documented (&lt;a href="http://code.google.com/appengine/docs/python/blobstore/overview.html"&gt;here&lt;/a&gt;), so I won’t repeat that, but what I can say is that it integrates directly with the Image api (see &lt;a href="http://code.google.com/appengine/docs/python/images/overview.html#Transforming_Images_from_the_Blobstore"&gt;here&lt;/a&gt;). There are some complex limits about the amount of data you can process, so read the article carefully, but suffice to say it can be done. (See &lt;a href="http://hrb.fm/c7saHS"&gt;here&lt;/a&gt; for a nice example of the blobstore / image api interaction.)&lt;/p&gt;  &lt;p&gt;A killer function, which has been publicised this last week (as “&lt;a href="http://googleappengine.blogspot.com/2010/08/multi-tenancy-support-high-performance_17.html"&gt;High Performance Image Serving&lt;/a&gt;”), is the “get_serving_url” &lt;a href="http://code.google.com/appengine/docs/python/images/functions.html"&gt;function&lt;/a&gt; in the Images api – which takes in a Blobstore object key, and returns a fixed URL that can be used as the static image URL.This looks almost like a Google CDN – the ability to serve images as static content, with the ability to crop / resize on the fly (albeit using &lt;a href="http://code.google.com/appengine/docs/python/images/functions.html#imgsize"&gt;fixed sizes&lt;/a&gt;) thrown in for free.&lt;/p&gt;  &lt;p&gt;[Updated – see intro] &lt;strike&gt;And yet… if you set up an image service using these amazing (and practically free) resources, you’ll find a fairly large hole in the implementation. It’s our old friend HTTP status codes. &lt;del&gt;The fixed URL exposed by the images service does not support a 304 (content unmodified) status – meaning that every time you call for it, you get the whole thing, increasing server bandwidth and client download times.&lt;/del&gt; &lt;em&gt;(See introductory note – this may just be a development server issue – TBC.)&lt;/em&gt;&lt;/strike&gt;&lt;/p&gt;  &lt;p&gt;&lt;strike&gt;I can only assume that this is deliberate – as Google gets its money from the bandwidth charge. It is however extremely annoying.&lt;/strike&gt;&lt;/p&gt;  &lt;p&gt;Links:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Google: &lt;a href="http://code.google.com/appengine/docs/python/blobstore/overview.html"&gt;Blobstore API&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Google: &lt;a href="http://code.google.com/appengine/docs/python/blobstore/overview.html"&gt;Image API&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Google: &lt;a href="http://googleappengine.blogspot.com/2010/08/multi-tenancy-support-high-performance_17.html"&gt;App Engine blog article&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Tinysrc: &lt;a href="http://tinysrc.net/"&gt;Image resizing service&lt;/a&gt; based on App Engine &lt;/li&gt;    &lt;li&gt;Tin Isles Blog: &lt;a href="http://hrb.fm/c7saHS"&gt;sample code&lt;/a&gt; using &lt;strong&gt;&lt;em&gt;get_serving_url&lt;/em&gt;&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7846496-3573269132462849052?l=blog.rodger-brown.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.rodger-brown.com/feeds/3573269132462849052/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7846496&amp;postID=3573269132462849052" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/3573269132462849052?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7846496/posts/default/3573269132462849052?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HugoRodger-brown/~3/-5UIvwG4zG8/googles-high-performance-image-serving.html" title="Google’s “High Performance Image Serving”" /><author><name>Hugo Rodger-Brown</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.rodger-brown.com/2010/08/googles-high-performance-image-serving.html</feedburner:origLink></entry></feed>

