ThoughtWorker Blogs


For a complete listing of ThoughtWorker blogs, you can go to blogs.thoughtworks.com

Marc McNeill : Banks don’t want you emailing their staff

Last updated: 2008-07-02T13:46:28Z


You went to the local branch of your bank and spoke to a really helpful person there.  In the few minutes you were with her you established a relationship with her.  You felt comfortable and confident that she would take ownership of your request.  But before she could deal with your query, disaster!  You left some critical information at home. Can I email it to you later you asked her? Silly question. Have you ever tried emailing someone in the branch network?  Chances are the frontline staff don’t have external email.  What sort of business is it that doesn’t give its staff email and the ability to communicate on a personal level with its customers?  the same sort of business that has centralised all its customer contact and put it behind IVR. So you give up on email. Can I give you a ring with the details later you asked her? She shakes her head.  She doesn’t have a number.  you see the branch doesn’t give out its number to the public. Go through the 0845 central switchboard, and let someone in the call centre pass a message to the person in the branch.  (With no formal process to get this to happen, good luck if your messages ever gets passed on). In fact the only way you will probably get a message to the  person you talked to this morning is if you send a fax.  One step removed from the telex, two away from the telegram. What is it with the banks that they don’t want their staff to have external email access?


Jay Fields : Windows, C#'s Achilles' heel

Last updated: 2008-07-01T18:16:00Z


Before doing Ruby full time I spent most of my days coding in C#. In those days C# wasn't quite as good as Java, but I did prefer the .net library. Visual Studio crashed, but not very often, and ReSharper made coding much less painful. I was developing on a Windows box, but I had never known any other development environment, so I didn't mind. I was happy.Then the Ruby hype began. I've never really been a big fan of hype, but I do like trying out new technologies if anyone credible has given it two thumbs up. Ruby had more than enough advocates, so I decided to try it out for a project or two. When I started my second project my Dell windows laptop died, and I took the opportunity to switch to the Mac -- one of the best moves of my development life.Almost 28 months later, I find myself interested in C# again. The features of C# 3.5 appear interesting, and I've always liked the idea of being skilled in multiple languages. You know, the right tool for the job and all that. There are plenty of situations where C# is the right tool. There's a large install base and a big community also. Being part of that community, using the new version, innovating, that sounds like fun. But, there's one thing that really kills C#, Windows.Windows really prevents me from diving in head first. I haven't run Windows since I bought my first Mac. The features of C# 3.5 are so appealing that I've been contemplating the idea for awhile now, but the idea of a Windows development environment has held me back from making the switch. Okay, that's a lie, not having a client doing C# 3.5 is the real reason I haven't crossed over. But, wouldn't it be nice if you could work with C# on a mac? I'm not talking parallels, I'm talking about full on development in Leopard. Truthfully, switching to Windows wont stop me from giving C# 3.5 a try, but I wonder how many other people are hesitant for the same reason. No matter how beautiful C# becomes, Windows will always be it's Achilles' heel.© Jay Fields - www.jayfields.com


Jay Fields : Agile: User Story Estimation Techniques

Last updated: 2008-07-01T13:17:00Z


I recently published an article about estimation on InfoQ.One of the great things about working as a consultant is the ability to try out many different ideas and adapting your personal favourite process to include things that work. This article gives the details about user story estimation techniques that I've found effective.....read more...© Jay Fields - www.jayfields.com


Jake Scruggs http://www.blogger.com/profile/16274380203959781950 noreply@blogger.com : Presenting at Lone Star Ruby Conf

Last updated: 2008-07-01T03:00:42Z


Word on the street is that Lone Star Ruby Conf was one of the best regional conferences last year, so I'm pretty excited to be presenting at the 2008 edition. It's happening Sept 4-6th in Austin, TX and speakers include: Matz, Evan Phoenix, Jim Weirich, The Rails Envy Guys, and too many other luminaries to name.

I'll be giving a talk entitled "Using Metrics to Take a Hard Look at Your Code" which is a distilation of my thinking over the past year about how to use numbers not as a hammer with which to beat people, but as a tool to improve your code.

Registration just opened up today, but space is limited so go sign up soon.


Martin Fowler : AgileVersusLean

Last updated: 2008-06-26T13:21:00Z


I'm thinking of using agile software development - but should I use Lean software development instead?

This question is one I've run into a few times recently. It's not a question I can answer quickly as the question is based on a false premise about the relationship between lean and agile. So first I need to go into some history to help explain that relationship.

"Lean" fundamentally refers an approach in the manufacturing world that was originally developed by Toyota in the 1950's. At this time Japanese industry was recovering from the ravages of the second world war. This approach, often called the Toyota Production System is mostly credited to Taiichi Ohno, although he was influenced by various western thinkers - particularly Deming. The Toyota Production System became well known in the rest of the world in the 1990's when westerners started writing books to explain why the Japanese were beating the US at so many industries. The western writers called this approach Lean Manufacturing. Although Japanese industry in general has run into stickier times since then, Toyota continues to outperform most western auto companies.

Agile software development is an umbrella term for several software development methods (including Extreme Programming and Scrum) that were developed in the 1990s. These methods share a common philosophy which was described as values and principles in the Manifesto for Agile Software Development. (My essay "The New Methodology" goes into this in more depth.)

There was a connection between lean manufacturing and agile software from the beginning in that many of the developers of the various agile methods were influenced by the ideas of lean manufacturing. This connection was made more explicit by Mary and Tom Poppendieck. Mary had worked in a manufacturing plant that had adopted lean manufacturing and her husband Tom is an experienced software developer. They have written a couple of books on the application of Lean ideas in the software world. When people talk about Lean Software they are usually referring to the ideas in these books, although others have been making similar links.

Lean manufacturing and agile software methods have a very similar philosophy. Both place a lot of stress on adaptive planning and a people focused approach. As a result lean's ideas fit in very well with the agile software story. Mary and Tom have both been very active in the agile community - indeed I'd credit Mary with an important role in forming the Agile Alliance. (Like me, she was a founding board member of the Agile Alliance, but she was far more effective in it than I was.)

I've already mentioned that lean manufacturing was an influence on agilists from the beginning, and in the last few years more ideas have appeared in the agile world with a clear lean manufacturing heritage. These range from concrete techniques like Value Stream Maps, to articulations of existing agile concepts such as the Last Responsible Moment for making design decisions. The idea of thinking of analysis and design documentation as inventory came from the Poppendiecks. Several agilists I know emphasize the importance of reducing cycle time - another strongly lean-influenced idea. My colleague Richard Durnall has a nice summary of how lean knowledge can blend in with agile thinking.

A particularly strong appeal to many people about lean ideas is that they provide a way of explaining agile software development to people - particularly senior people both within IT and senior customers. This explanation ranges from a crude appeal to emulate Toyota to detailed discussions of how lean manufacturing's benefits translate to the ideas in agile software development.

So as you can see, lean and agile are deeply intertwined in the software world. You can't really talk about them being alternatives, if you are doing agile you are doing lean and vice-versa. Agile was always meant as a very broad concept, a core set of values and principles that was shared by processes that look superficially different. You don't do agile or lean you do agile and lean. The only question is how explicitly you use ideas that draw directly from lean manufacturing.

The Poppendiecks didn't introduce lean as a separate idea, nor did they introduce lean as a published process in the style of Scrum or XP. Rather they introduced lean as a set of thinking tools that could easily blend in with any agile approach. I think of lean as a strand of thinking within the agile community, like a pattern in a rich carpet.

There is a distinct lean software community, as in a mailing list calling itself lean and people who label themselves as lean thinkers. But this is no different to the fact that there are also strong XP, Scrum, and other communities. Most people in these communities consider themselves part of the broader agile movement and many people are active in more than one of these agile communities. The whole point of coining the word 'agile' comes from a recognition that we share a core set of values and principles and this common core means what we have in common is greater than our differences.



Jason Yip http://www.blogger.com/profile/08286768587936088382 noreply@blogger.com : Co-location can hide communication problems

Last updated: 2008-06-26T11:50:13Z


We may still be communicating inefficiently but because face-to-face has such high bandwidth, we don't notice. In that sense, co-location is actually raising the water level rather than lowering it.

Without co-location, effective software development teams have no choice but to develop more disciplined communication protocols.

Of course, I'd rather have BOTH good communication protocols AND high-bandwidth communication.



Jason Yip http://www.blogger.com/profile/08286768587936088382 noreply@blogger.com : This is the way we've done it for years

Last updated: 2008-06-26T09:33:05Z


When someone says "This is the way we've done it for years", usually it's with the implication that this is a good thing.

But if they've been doing something for years, surely that would be more than enough time to figure out how to improve it? Surely, they haven't stumbled upon perfection and there's nothing left to learn...

In Lean circles I've sometimes encountered a rather harsh description for this kind of behaviour: oxygen thief.



Jason Yip http://www.blogger.com/profile/08286768587936088382 noreply@blogger.com : The software community has nothing to learn from Lean operations

Last updated: 2008-06-26T09:20:46Z


... only if the software community thinks that software ends once it's deployed to production.



Jay Fields : The Simplest Thing That Could Possibly Work

Last updated: 2008-06-25T19:11:00Z


the simplest thing that could possibly work -- it's a phrase held dearly to all agile developers, but it's also a common source of disagreement. I recently saw two different interpretations of the phrase that I considered to be worth sharing.

Often the emphasis of the phrase is like so: the simplest thing that could possibly work. However, recently Ian Robinson was discussing the idea that the emphasis should be: the simplest thing that could possibly work. The difference is only emphasis, but it's a change worth considering.

I was also part of a discussion the other day where a developer was following a pattern correctly, but it was causing us to add a significant amount of additional code. This code would have supported several features that seemed nice to us, but our domain expert hadn't asked for any of those features. I would have been happy to go along if there was a small amount of code or if the nice features were on our roadmap, but neither of those things were true. I began to advocate for breaking the pattern and doing only what we needed to do. It allowed us to delete ~60% of the code we were currently working with.

At first the developer said "this is where we're going to disagree on the simplest thing that could possibly work." He argued that we were backing ourselves into a corner by not following the pattern; therefore, what I was suggesting couldn't possibly work. I took a few moments to consider his point of view. I concluded that he might be right, but deleting 60% of the code we were currently working with meant that the remaining 40% was so small that if we did need to rewrite in the future it would actually be easier than the amount of effort required to maintain the prematurely put in place architecture.

I believe there are occasions where the simplest thing that could possibly work is writing 10 lines of code today that do what you need, and deleting them tomorrow in light of new requirements.

There are, of course, a few caveats. I had been pairing with the developer for about 4 hours and was able to accurately assess what the difference actually was between what we were doing and what we could be doing. Once we both saw how much effort it was to follow the pattern, it was easy for us to trim to the simpler version. I think it would have been more painful to speculate on the pattern implementation effort, and we may not have agreed on the outcome.

Also, painting yourself into a corner when you can jump over the paint is fine, but if someone else keeps painting on the other side, you may not be able to get out. The small amount of code that we wrote can be rewritten in about an hour, but if someone else was going to add to that code then we would have probably gone down the more complicated path. No one was building on our code so we weren't as worried about the foundation we put in place.



Martin Fowler : SegmentationByFreshness

Last updated: 2008-06-24T22:19:00Z


One of the biggest issues with media websites is dealing with high amounts of traffic. Media is all about getting eyeballs, but if you get too many hits at once, slow performance can cause problems and damage your reputation. This problem is exacerbated by the bursty nature of this web traffic. You can be cruising along at a manageable rate, then get hit with a big news story which causes a big spike. One of our clients have seen spikes of two orders of magnitude in a matter of a couple of minutes.

The general solution in computing to speed up access to the same information is to use caches. If you keep requesting my home page the web server will build up a cache in memory so repeated requests avoid touching the disk.

It's easy to keep a cache for my website, because this page, like my entire site, is entirely static. Most media sites, however, contain a lot of dynamic content. You might not think there's much business logic on your average newspaper website, but once you start looking at advertising links, related stories, special features and the like, things get a good bit more interesting. A travel story to France might link to articles on french food, and advertising that knows that a web browser in Canada is interested in a holiday in the Loire Valley. Personalization makes this even worse, my personalized preferences should generate a personalized feature list on heavy red wines. Such logic is complex in its own right, it makes for a lot of computation with each request, and crucially it ruins most caching strategies.

The way to deal with this is to divide a page up into segments where each segment has a similar determination of freshness. The article on Loire travel can be relatively static, changing only to correct errors. A related article list which feeds off tags for "France" and "Loire" will change more often, but maybe only every few days. If we arrange this properly a request for a page with these two items may be able to gather everything from caches.

The most common way of doing this that I've seen is to form caches on the web server and assemble the page segments when the page gets hit. Tools like Sitemesh are a good option for this approach. As you write the page for 18th century loire delights, you include call-outs for sections like related articles. When you get the actual web request the web server takes the page and assembles the page from the separate pieces. Much of this can be cached in the web server, which avoids hitting the back-end domain logic and database.

An interesting possibility is to go even further and use the many caches that exist in the web itself. Most calls for this web page don't even reach my web server since my page gets cached many times along the way. If you build a web page dynamically and assemble it on the server, you have to take the hit to deliver the page. An alternative is to assemble the page on the client and then draw each segment from its own URL. Each segment could be cached in different places with different caching policies.

How might this work? We might store the static article content as XHTML at an URL like http://gallifreyTimes/travel/18-century-loire-delights. Inside that file we want to insert some related articles by looking up articles tagged with "loire" and "france". In the static page we put in a simple "a" tag.

 <a class = "relatedLinks" href = "relatedLinks/france+loire">Related Links</a> 

In the header for the static page we link it to some javascript in a separate library file. When we download the Loire article the javascript runs and scans the article for elements with the right class: in this case an "a" element with the "relatedLinks" class. (The behaviour library is a good way to do this.) When it finds the element it uses the information in the element to synthesize an URL for that segment. In this case it would use what's in the element's href attribute to come up with an URL like http://gallifreyTimes/relatedArticles/france+loire. Once it's got that URL it then gets the content and uses it to replace the original "a" element. Since the related articles list is handled through an URL, other gets on that URL cause caches through the Internet to warm up, so there's a good chance that retrieving the page may never cause a hit on the original server.

This technique of using Javascript to replace a placeholder element with more content is a form of Progressive Enhancement. The descriptions I've found for Progressive Enhancement focus on adding features for accessibility with limited browsers. This example also has that benefit. If I browse the page with a browser that has no javascript, I'll get a useful link. The general idea behind Progressive Enhancement is that the basic page served is useful on basic browsers, then we use techniques such as javascript to add in more fancy features.

In the context of caching, the value is that each progressive enhancement weaves in a lump of HTML with different freshness rules. The original page is static, the related links change daily, but both can be cached independently and weaved together. I can do all sorts of additional elements, as long as I take care to keep segment the page by the freshness rules. So I could include a personalized weather forecast based on the user's profile to every page by having the javascript pick up the user id from the http session, using it to construct an URL like http://gallifreyTimes/personalWeather/martinfowler, retrieving the content (which would often be cached on my hard drive) and weaving it into the page.



ThoughtWorks is a global IT consultancy. We deliver bespoke applications, no-nonsense consulting and help organisations become agile.

ThoughtWorks Ltd, 9th Floor Berkshire House, 168-173 High Holborn, London, WC1V 7AA
T +44 (0) 20 7497 4500 F +44 (0) 20 7497 4501 E info-uk@thoughtworks.com

Perspectives



Thought Provoking

We would like to share our latest thinking with you.


[ ]