<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-90440057274722849</id><updated>2012-03-14T17:34:55.543Z</updated><category term='stereotypes'/><category term='qcon london'/><category term='non-tech'/><category term='sitemesh'/><category term='comment'/><category term='tools'/><category term='java 5'/><category term='books'/><category term='maven'/><category term='gwt'/><category term='events'/><category term='photos'/><category term='what not to do'/><category term='c#'/><category term='travel'/><category term='css'/><category term='story cards'/><category term='agile'/><category term='configuration'/><category term='metrics'/><category term='girls'/><category term='spring'/><category term='devoxx'/><category term='kanban'/><category term='video'/><category term='todo'/><category term='.net'/><category term='cycling'/><category term='performance'/><category term='JavaOne11'/><category term='code'/><category term='london'/><category term='training'/><category term='lmax'/><category term='presentations'/><category term='lean'/><category term='jcp'/><category term='work environment'/><category term='people are people'/><category term='advice'/><category term='java'/><category term='None'/><category term='ljc'/><category term='process'/><category term='disruptor'/><category term='aop'/><category term='cargo cultism'/><category term='thoughtworks'/><category term='links'/><category term='concurrency'/><category term='question'/><category term='ui'/><category term='interview'/><category term='certification'/><category term='mechanical sympathy'/><category term='android'/><category term='ddd'/><category term='scrum'/><category term='jobs'/><category term='data structures'/><category term='joel'/><category term='build'/><category term='opinion'/><category term='html'/><category term='reference'/><category term='offshore'/><category term='jax london'/><category term='awards'/><category term='in progress'/><category term='gender'/><category term='testing'/><category term='requirements'/><category term='caching'/><category term='your work'/><category term='conferences'/><category term='ide'/><title type='text'>Trisha's Ramblings</title><subtitle type='html'>I'm a Java developer who's passionate about lots of things.  Oddly, actual technology is quite low down on that list.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>86</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-694710872718988564</id><published>2012-02-12T21:01:00.000Z</published><updated>2012-02-12T21:01:41.911Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='requirements'/><category scheme='http://www.blogger.com/atom/ns#' term='people are people'/><title type='text'>Why the customer isn't always right</title><content type='html'>Last week I went to get my hair cut (yes, sorry, this is a story about hair). &amp;nbsp;I had thought long and hard about what I wanted. &amp;nbsp;I researched, checked styles online, and bought a magazine so I could show my hairdresser exactly what I was after and there would be no confusion. &amp;nbsp;I was determined I would not be spending that ridiculous amount of money on something I was not going to be happy with. &amp;nbsp;I was even bold enough to ask for some changes to it at the end, which I have never ever had the courage to do before.&lt;br /&gt;&lt;br /&gt;He did an excellent job. &amp;nbsp;It was almost exactly what I had asked for, with some variations to account for my particular hair type. &amp;nbsp;It was a very cute hair style that suited me. &amp;nbsp;But I had a niggling doubt.&lt;br /&gt;&lt;br /&gt;A few days later, that niggle was a certainty. &amp;nbsp;It wasn't what I wanted.&lt;br /&gt;&lt;br /&gt;However, it was what I had asked for.&lt;br /&gt;&lt;br /&gt;Being English, the thought of going back and telling him I wasn't happy with it was horrifying. &amp;nbsp;Especially since he had done a really good job of it. &amp;nbsp;It wasn't his fault that what I'd asked for wasn't what I had actually wanted. &amp;nbsp;But I knew what I wanted now, and I was prepared to pay for it (again).&lt;br /&gt;&lt;br /&gt;This time I didn't show him a picture. &amp;nbsp;I didn't point to anything specific. &amp;nbsp;I said I wanted it much shorter after all and outlined the look I was going for. &amp;nbsp;We had a conversation about it and I left it to him to apply his skills to actually implement it.&lt;br /&gt;&lt;br /&gt;This time, I was much happier with the results. &amp;nbsp;In fact, it was exactly what I wanted.&lt;br /&gt;&lt;br /&gt;So what?&lt;br /&gt;&lt;br /&gt;Of course this got me thinking about work. &amp;nbsp;It's not just a lame excuse to write about girl stuff on a supposedly technical blog. &amp;nbsp;It got me thinking about our customers.&lt;br /&gt;&lt;br /&gt;Whoever our customers are, whether they're end users, internal business owners, external clients, or we work in a bank and have fifteen thousand layers of Business Analysts between us and Real People, whoever they are they want something from us. &amp;nbsp;And in many places, we, the techies, have trained them to ask for more and more specific things, so they can be sure they're going to get what they really want. &amp;nbsp;Remember that time Bob asked for that extra field on that report because it would make his job easier? &amp;nbsp;Remember when Sandra wanted the workflow to be altered in a specific way? &amp;nbsp;It's because they know that if they ask for something specific, the chances are better that it will make its way to the front of the work queue at some point, and when it comes out the other end it is more likely to be what they wanted.&lt;br /&gt;&lt;br /&gt;Only it isn't, is it?&lt;br /&gt;&lt;br /&gt;There's always another field to add, or another change to make. &amp;nbsp;And your customer isn't quite satisfied, even though you did exactly what they asked for. &amp;nbsp;And sometimes they don't tell you that they're not getting what they need from your system, because it's expensive or time consuming to get changes made.&lt;br /&gt;&lt;br /&gt;The key to delivering something they really want, instead of something else that's merely adding to the weight of your code, is finding out what they're actually trying to achieve.&lt;br /&gt;&lt;br /&gt;So Bob wants that extra field. &amp;nbsp;That's easy enough. &amp;nbsp;But when you ask him why he wants that extra field, turns out it's because the numbers in the reports he's getting at the moment aren't the ones he needs, or aren't quite correct. &amp;nbsp;He's probably created a monstrous Excel spreadsheet into which he manually types half of the numbers from the reports it took you ages to develop, which munges them into something quite different, in order to get the real thing he wants. &amp;nbsp;He's just missing this one small piece of information to get the final figure correct. &amp;nbsp;It would save your company a lot of time/money/mis-typing errors if you completely re-wrote the reports Bob uses to give him exactly what he needs. &amp;nbsp;Or if you gave him a tool to download CSV formatted raw data from the database.&lt;br /&gt;&lt;br /&gt;It's not Bob's fault he can't ask for this, he doesn't know what we're capable of providing him. &amp;nbsp;It's not our fault for not delivering it the first time round, we don't know what he does day-to-day. &amp;nbsp;But having a conversation where we recognise where the knowledge lies (Bob knows what the output of his day job is presumably, and we know what's available and how we can provide it), and collaborating to come up with the least rubbish solution for everyone, is a step to providing that overused term, "business value".&lt;br /&gt;&lt;br /&gt;We're not on different sides here, we all play for the same team - we want our jobs to be as painless as possible, which (should) ultimately provide better efficiency for our company. &amp;nbsp;After all, we want the company to make money so they can pay us, right?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;Caveat: Mileage may vary. &amp;nbsp;Sometimes, with some customers, you really do need to tell them what they want.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-694710872718988564?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/694710872718988564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2012/02/why-customer-isnt-always-right.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/694710872718988564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/694710872718988564'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2012/02/why-customer-isnt-always-right.html' title='Why the customer isn&apos;t always right'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>2</thr:total><georss:featurename>London, UK</georss:featurename><georss:point>51.5081289 -0.128005</georss:point><georss:box>51.350006900000004 -0.443862 51.6662509 0.187852</georss:box></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-5104518460669643088</id><published>2012-02-01T07:43:00.001Z</published><updated>2012-02-01T09:55:44.913Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='disruptor'/><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>Upcoming speaking events</title><content type='html'>In theory, I am busy writing material for my upcoming speaking events, rather than writing terribly &lt;a href="http://mechanitis.blogspot.com/2011/12/christmas-decorations-teach-me-lesson.html"&gt;illuminating&lt;/a&gt; posts on my blog (see what I did there?). &amp;nbsp;In actuality I am being lazy and have pretty much taken January off for a recharge.&lt;br /&gt;&lt;br /&gt;In the spirit of doing something which ticks both the event-speaking and blogging boxes, this is a quick update on the conferences I'm confirmed for so far. &amp;nbsp;Put the following dates in your diary - these are my first international solo speaking events:&lt;br /&gt;&lt;br /&gt;7th March - QCon London - &lt;a href="http://qconlondon.com/london-2012/speaker/Trisha+Gee"&gt;Concurrent Programming Using The Disruptor&lt;/a&gt;&amp;nbsp;(sadly I can't stay for the whole conference as it clashes with the only holiday I had booked for 2012).&lt;br /&gt;23rd May - GOTO Copenhagen - &lt;a href="http://gotocon.com/cph-2012/speaker/Trisha+Gee"&gt;Concurrent Programming Using The Disruptor&lt;/a&gt;&amp;nbsp;&amp;amp; War Stories.&lt;br /&gt;25-26th May - GOTO Amsterdam - &lt;a href="http://gotocon.com/amsterdam-2012/speaker/Trisha+Gee"&gt;Concurrent Programming Using The Disruptor&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The presentation will be more of a user's guide to the Disruptor than anything we've done before. &amp;nbsp;An hour isn't a lot of time to cover all the functionality everyone might want to see, so I'm still trying to work out the balance between giving an introduction/overview for those who haven't seen it before, and going into some of the cool features that have been added since I first started blogging about it. &amp;nbsp;If there's anything you would particularly like to see covered, let me know - I'll put the most frequently requested things in there.&lt;br /&gt;&lt;br /&gt;Ideally I'd run a workshop session at some point, but that will require quite a lot more preparation, so I'll only do that if there is interest in it (if someone wants to fly me somewhere interesting to do that so much the better!!).&lt;br /&gt;&lt;br /&gt;Maybe I'll see you at one of these events?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-5104518460669643088?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/5104518460669643088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2012/02/upcoming-speaking-events.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/5104518460669643088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/5104518460669643088'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2012/02/upcoming-speaking-events.html' title='Upcoming speaking events'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-2006399423584049538</id><published>2012-01-17T18:08:00.000Z</published><updated>2012-01-17T19:06:54.022Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Christmas decorations teach me a lesson about troubleshooting</title><content type='html'>And now, after an absence of several weeks, you get to see how long it takes me to write some of these posts.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-_IL9JCpG-YI/TxUujcWyp3I/AAAAAAAAIvg/uMQCtOKGPcs/s1600/DSC_0037.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="267" src="http://2.bp.blogspot.com/-_IL9JCpG-YI/TxUujcWyp3I/AAAAAAAAIvg/uMQCtOKGPcs/s400/DSC_0037.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I was putting up the Christmas decorations one Saturday when my worst fear was realised&lt;sup&gt;1&lt;/sup&gt; - one of my three strings of lights was not working.&lt;br /&gt;&lt;br /&gt;The first two went up fine. &amp;nbsp;The third lit up when I plugged it in, and in less than a second went out. &amp;nbsp;Curses. &amp;nbsp;This is not what I wanted, this was supposed to be a short exercise in making my tiny little flat look festive.&lt;br /&gt;&lt;br /&gt;So I set about the tedious task of starting from the end closest to the plug and replacing every bulb, one by one, with a spare one to see if it magically lit up again. &amp;nbsp;When it doesn't, you take the spare back out and replace it with the original bulb. &amp;nbsp;I remember my parents going through this ritual every Christmas, the tediousness of this activity is more memorable than the fleeting joy of shinies.&lt;br /&gt;&lt;br /&gt;While I was doing this, my mind was back on the job I'd been doing at work the previous week - battling an Internet Explorer 7 performance problem. &amp;nbsp;We have automated performance tests which give us an indication of the load time for our application in Chrome and IE, and some time in the previous couple of weeks our IE performance had significantly degraded in the development code. &amp;nbsp;Due to a number of too-boring-to-explain-here circumstances, the last known good revision was four days and nearly 250 revisions earlier than the first revision that showed the performance problem.&lt;br /&gt;&lt;br /&gt;Since we couldn't see anything to indicate it was an environmental problem, the logical next step was to pinpoint the revision which caused the problem, so we could either fix it or get performance gains from somewhere else in the system.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-gnC5YOnp9-8/TxUy6Y0I72I/AAAAAAAAIvo/bDlg30_CMvA/s1600/revisions1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="88" src="http://3.bp.blogspot.com/-gnC5YOnp9-8/TxUy6Y0I72I/AAAAAAAAIvo/bDlg30_CMvA/s320/revisions1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The most obvious way to do this, given there were no obvious suspects, is with a binary search of the revisions. &amp;nbsp;Our last known good revision was 081, our first poor performing one was 240. &amp;nbsp;So the thing to do is to check revision 160, see if it falls on the poor or good performance side.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-NyxMETVmxrM/TxUy6uuKWuI/AAAAAAAAIvs/HG9HdBMMZfE/s1600/revisions2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="88" src="http://2.bp.blogspot.com/-NyxMETVmxrM/TxUy6uuKWuI/AAAAAAAAIvs/HG9HdBMMZfE/s320/revisions2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If 160 proves to be a poor performer, check revision 120....&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-LEjXqVBWAxM/TxUy7Ipt3UI/AAAAAAAAIv4/U4gq2gIrgzs/s1600/revisions3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="88" src="http://4.bp.blogspot.com/-LEjXqVBWAxM/TxUy7Ipt3UI/AAAAAAAAIv4/U4gq2gIrgzs/s320/revisions3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;...if 160 is fine, test revision 200...&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-a4pDFa23AS8/TxUy8AZZL6I/AAAAAAAAIv8/YGX5b314ZPA/s1600/revisions4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="88" src="http://3.bp.blogspot.com/-a4pDFa23AS8/TxUy8AZZL6I/AAAAAAAAIv8/YGX5b314ZPA/s320/revisions4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;...and keep splitting the revisions by half until you find the suspect.&lt;br /&gt;&lt;br /&gt;So of course that's what I want to do with my stupid Christmas lights. &amp;nbsp;I do not want to sequentially check each light bulb, that has a worst-case number-of-bulbs-tried = n, where n is the number of bulbs (probably a couple of hundred, although it felt like several thousand). &amp;nbsp;So, in computer speak, O(n). &amp;nbsp;The binary search algorithm is O(log n). &amp;nbsp;At university, this Big Oh had no context for me. &amp;nbsp;But when you've taken 10 minutes to get a quarter of the way through your Christmas lights, and you diagnosed your IE performance problems... well, actually it took days. &amp;nbsp;But the point is, a binary search for the missing bulb would definitely have been a Good Thing.&lt;br /&gt;&lt;br /&gt;I know you're dying to know if I tracked down the problem in Internet Explorer - I did. &amp;nbsp;What's the worst case when you're doing a binary search? &amp;nbsp;It's when the thing you're looking for is veeeery close to either your start point or your end point. &lt;br /&gt;&lt;br /&gt;The revision number I was after was number 237. &amp;nbsp;Sigh.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-TKU7fyVqnxs/TxUzePYv0eI/AAAAAAAAIwI/ewwyYBPE8no/s1600/revisions5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="88" src="http://3.bp.blogspot.com/-TKU7fyVqnxs/TxUzePYv0eI/AAAAAAAAIwI/ewwyYBPE8no/s320/revisions5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;And my Christmas tree lights? &amp;nbsp;Well, through the boredom I remembered that modern lights are in sections, so they have a sort of built-in binary search - well, limited segments will go dark if a single bulb is out - which allows you to narrow down your problem area. &amp;nbsp;Since the whole string was out, I figured something else was probably wrong.&lt;br /&gt;&lt;br /&gt;Turned out the plug had come out of the socket.&lt;br /&gt;&lt;br /&gt;So:&lt;br /&gt;&lt;b&gt;Lesson 1&lt;/b&gt;: Theoretical computer science does have a place when you care about how long something takes. &amp;nbsp;When it's you feeling the pain, you'll do anything to make it stop.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lesson 2&lt;/b&gt;: When diagnosing a problem you will always biased towards what you think it is, in the face of actual evidence. &amp;nbsp;I was afraid I would have to search the whole set of lights for a blown bulb, so that's the problem I was looking for when the lights failed. &amp;nbsp;In actual fact it was a problem with a much simpler solution.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt; - OK, "worst fear" in this very limited context only - it's not like I lie awake at night in July afraid that one of the bulbs on my Christmas lights has blown.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-2006399423584049538?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/2006399423584049538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/12/christmas-decorations-teach-me-lesson.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2006399423584049538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2006399423584049538'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/12/christmas-decorations-teach-me-lesson.html' title='Christmas decorations teach me a lesson about troubleshooting'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-_IL9JCpG-YI/TxUujcWyp3I/AAAAAAAAIvg/uMQCtOKGPcs/s72-c/DSC_0037.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-1677712885480282029</id><published>2011-12-22T15:53:00.000Z</published><updated>2011-12-22T15:54:48.426Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='gender'/><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>Video: Why we shouldn't target women</title><content type='html'>If you have a &lt;a href="http://www.parleys.com/"&gt;Parleys&lt;/a&gt; subscription, you can watch the whole "Why we shouldn't target women" panel from Devoxx 2011 a month or so ago. &amp;nbsp;Watch me attempt to monopolise the whole panel as if it was my idea or something...&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="395" width="395"&gt;  &lt;param name="movie" value="http://www.parleys.com/dist/share/parleysshare.swf"/&gt;  &lt;param name="allowFullScreen" value="true"/&gt;  &lt;param name="wmode" value="direct"/&gt;  &lt;param name="bgcolor" value="#222222"/&gt;  &lt;param name="flashVars" value="sv=true&amp;amp;pageId=2861"/&gt;  &lt;embed src="http://www.parleys.com/dist/share/parleysshare.swf" type="application/x-shockwave-flash" flashVars="sv=true&amp;amp;pageId=2861" allowfullscreen="true" bgcolor="#222222" width="395" height="395"/&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-1677712885480282029?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/1677712885480282029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/12/video-why-we-shouldnt-target-women.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/1677712885480282029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/1677712885480282029'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/12/video-why-we-shouldnt-target-women.html' title='Video: Why we shouldn&apos;t target women'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-6607373886164268511</id><published>2011-12-21T17:46:00.002Z</published><updated>2011-12-21T18:04:16.608Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='lmax'/><category scheme='http://www.blogger.com/atom/ns#' term='jobs'/><category scheme='http://www.blogger.com/atom/ns#' term='advice'/><title type='text'>How to make your CV Not Suck</title><content type='html'>When you're applying for a job at &lt;a href="http://www.lmax.com/"&gt;LMAX&lt;/a&gt;, your CV (or résumé, for our American readers) usually comes through me and I decide whether to call you for a technical phone screen.&lt;br /&gt;&lt;br /&gt;I'm going to let you into a secret. &lt;br /&gt;&lt;br /&gt;I'm going to tell you the criteria I use when judging your CV.&lt;br /&gt;&lt;br /&gt;Now, you could say this is a foolish thing for me to do, because now when you apply you'll be "cheating" and writing your CV to pass these guidelines.&lt;br /&gt;&lt;br /&gt;Good.&lt;br /&gt;&lt;br /&gt;LMAX isn't the only company that's going to judge your CV based on these criteria. I firmly believe that an increase in quality of the CVs in our industry can only be A Good Thing. &amp;nbsp;An increase in the quality of &lt;i&gt;your&lt;/i&gt; CV is definitely A Good Thing for &lt;i&gt;you&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Even more importantly, if I get CVs that do not pass these basic criteria, now I know you either don't read the &lt;a href="http://blogs.lmax.com/"&gt;LMAX blogs&lt;/a&gt; (shame on you), or you're not able to follow simple instructions (bodes poorly for your ability to learn within the company).&lt;br /&gt;&lt;br /&gt;The thing that you have to keep in mind when you're writing your CV is that the reader really does spend less than a minute reading it. &amp;nbsp;It's not fair, true. &amp;nbsp;But it's the way humans are. I'm not in HR or recruitment, I have a proper job as a software developer, and I need to get back to that as soon as I can. &amp;nbsp;When I get CVs in batches of up to 12, as I regularly do, I'm not free to spend more than 10 minutes going through all of them.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;The Easy Stuff&lt;/span&gt;&lt;br /&gt;&lt;b&gt;You must be able to spell&lt;/b&gt;&lt;br /&gt;You really must. &amp;nbsp;There are things called Spell Checkers and they are amazing. &amp;nbsp;Some of these new-fangled pieces of software even show you your errors in this cool squiggly red underline in your document.&lt;br /&gt;&lt;br /&gt;I'm reading your CV in Open Office, and if I see red squigglies under words that aren't technologies or acronyms I'm going to wonder how good your attention to detail is.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;You must use capital letters in the appropriate places&lt;/b&gt;&lt;br /&gt;It's traditional to start a sentence with a capital. &amp;nbsp;It's also traditional to use a capital "I" not "i" when referring to oneself. &amp;nbsp;We're not 14 years old, we're not writing an SMS to our mates. &amp;nbsp;We're applying for a proper job paying proper money.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Correct grammar is appreciated&lt;/b&gt;&lt;br /&gt;Whether you're a native English-speaker or not, you need to get someone else who is a native English-speaker to check the prose in your CV to see if it scans correctly. &amp;nbsp;For me, it's not about being prejudiced against you because you're not a natural author, it's a) attention to detail again and b) your ability to make yourself understood. &amp;nbsp;If your sentence construction, choice of words or simple comma placement is off, I'll have to read that sentence a couple of times to parse it and it's going to trip me up and ruin my flow. &amp;nbsp;I want to get a good feel for you from reading your CV, so if I stumble a few times I'm not going to feel like I connected with you.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Harder and fluffier&lt;/span&gt;&lt;br /&gt;&lt;b&gt;I don't care which versions of Spring you've worked with&lt;/b&gt;&lt;br /&gt;I know you need a checklist of technologies on your CV so it gets past the non-technical recruitment agents and get picked up via automated searches. &amp;nbsp;This is a bigger problem with our industry than one I want to tackle right now. &amp;nbsp;So I'll let you off having buzzword bingo on your CV. &amp;nbsp;However, your CV needs to be more than just a list of technologies you have used vaguely, or perhaps once read about. &lt;br /&gt;&lt;br /&gt;It's useful to me if a) you put the technology check list in a single place on your CV, b) you give an indication of your level of proficiency in that technology (novice/competent/master) or length of time you've used it in a commercial environment, and&amp;nbsp;c) you organise them in some useful fashion - preferably the ones that are appropriate to the job you're applying for near the top, or at least those you're happiest with at the top. &amp;nbsp;Alternatively put the checklist of technologies next to the role you used them in.&lt;br /&gt;&lt;br /&gt;Often I will completely ignore this section because I'm more interested in your ability to learn and your passion for what you do.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;I want to know about your passions&lt;/b&gt;&lt;br /&gt;In the old days I used to fast forward to your hobbies and interests, but these days we're encouraged not to put those on the CV in case you're judged against them. &amp;nbsp;Which seems like political correctness gone crazy, but then when you think about it you can infer a lot about a person from their hobbies and interests, and therefore you could be pre-judging them based on some criteria that is not at all associated with their ability to do the job. &amp;nbsp;For example, if they have hobbies that take them all over England I might infer they have a car and can drive - OK, it's a dumb example, but you get the idea.&lt;br /&gt;&lt;br /&gt;These days, given that I'm trying to find great team members to work with me at LMAX, I'm looking for things like: your blog; any contributions to open source software; your involvement in a Java User Group (or other extra-curricular activity). &amp;nbsp;I'm not going to discard you if you don't have any of these things, but if you do it's definitely extra brownie points for you.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;I want to know if you worship at the altar of technology, or if you're business-value driven&lt;/b&gt;&lt;br /&gt;Either of these things is fine - we need people who are very business-focussed and people who are rabid about technology, as well as all those in between, to build a good team. &amp;nbsp;Another axis of interest is people/process - are you passionate about people, about building a good team, about helping them to deliver?&lt;br /&gt;&lt;br /&gt;Getting a feel for where you sit on these axes is not for me to discard you, but if you look like you're strongly in one of these camps and I feel like we need a team member to really push that area, then you stand a much better chance of getting a phone interview.&lt;br /&gt;&lt;br /&gt;I'll get an indication of where you are by the way you talk about your roles and your achievements. &amp;nbsp;This does not help me:&lt;br /&gt;&lt;blockquote style="background-color: white; line-height: 16px;"&gt;Senior Developer on a web administration application. &amp;nbsp;Product was implemented using JavaScript, HTML, Spring, Hibernate, JMS, and MySQL.&lt;/blockquote&gt;This is much more useful:&lt;br /&gt;&lt;blockquote style="background-color: white; line-height: 16px;"&gt;I was part of a team of four developers implementing a web based administration application, commissioned to enable internal users to update the settings of our reporting tool. &amp;nbsp;This saved the support staff approximately 4 hours every week, as they no longer needed to manually update the database. We used agile techniques such as daily standups and weekly iterations in order to provide quick feedback to the business.&lt;/blockquote&gt;(I made both of those up, by the way, before anyone starts trying to sue me for stealing something off their CV).&lt;br /&gt;&lt;br /&gt;Here I can see:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The size of the team, and your ability to work in a team&lt;/li&gt;&lt;li&gt;You understood the business need you were trying to fulfill&lt;/li&gt;&lt;li&gt;You have worked in an agile environment and at least pay lip service to why you were working that way.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;I don't really care about the specific technologies you used, the fact that you mentioned web-based and database gives me enough of a feel.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sometimes prospective employers really do stalk you&lt;/b&gt;&lt;br /&gt;Personally I think claims that prospective employers will check every facet of your web presence are somewhat over-exaggerated. &amp;nbsp;If I barely have 60 seconds to read your CV, I'm not going to check you out on Facebook, my life is too short.&lt;br /&gt;&lt;br /&gt;However, if you claim to have written a book I will look it up on &lt;a target="_blank" href="http://amazon.com/?_encoding=UTF8&amp;tag=trissramb-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;Amazon&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=trissramb-20&amp;l=ur2&amp;o=1" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;. &amp;nbsp;If you have a publication or example code, I will glance at those. &amp;nbsp;If you've worked for a company I've worked for in the past, I'll look you up on &lt;a href="http://uk.linkedin.com/in/trishagee"&gt;LinkedIn&lt;/a&gt;&amp;nbsp;to see if we have any common connections (or worse, to see if I should remember you and simply don't). &amp;nbsp;I'll also use LinkedIn if your CV is not screaming yes or no, to see if there's an extra dimension in your profile which will tip me one way or the other.&lt;br /&gt;&lt;br /&gt;So be aware of your web presence, particularly something that is aimed at your professional image like LinkedIn, and make sure it represents you the way you want it to.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;In Conclusion&lt;/b&gt;&lt;/div&gt;&lt;div&gt;This post might be simply a good way to increase my own workload - every CV I get from now on may be an automatic pass, and then I have to call all of you before I can start weeding you out.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But I don't mind too much about that. &amp;nbsp;I get concerned sometimes that good people are not getting the interviews they deserve, not just at LMAX but across the industry, because they get almost no good CV advice. &amp;nbsp;Frequently the people who are the first to read CVs are agencies who are not technologists. &amp;nbsp;By all means, have words on there that will make your CV appear on their search results. &amp;nbsp;But you need to put something on there for me, a real developer, because strings of keywords tell me nothing about you.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If I can improve the quality of just one person's CV with this post, I'm happy. &amp;nbsp;If I have given you that first step towards that job you &lt;i&gt;really&lt;/i&gt; want, then that's even better.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-6607373886164268511?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/6607373886164268511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/12/how-to-make-your-cv-not-suck.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/6607373886164268511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/6607373886164268511'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/12/how-to-make-your-cv-not-suck.html' title='How to make your CV Not Suck'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-3233226425097271055</id><published>2011-12-04T12:28:00.001Z</published><updated>2011-12-04T12:44:17.529Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='jax london'/><category scheme='http://www.blogger.com/atom/ns#' term='disruptor'/><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>Video of our JAX London session</title><content type='html'>At &lt;a href="http://jaxlondon.com/"&gt;JAX London&lt;/a&gt; Mike and I presented "Understanding the Disruptor - A Beginner's Guide to Hardcore Concurrency". &amp;nbsp;This is the session we &lt;a href="http://mechanitis.blogspot.com/2011/10/mike-and-i-debut-our-new-disruptor.html"&gt;initially previewed&lt;/a&gt; to the London Java Community a few weeks earlier. &amp;nbsp;The content is the same, but the feel of the presentation was quite different to us - the venue for the LJC event was more intimate, and it was easier to interact with the audience. &amp;nbsp;At JAX, we were up on stage, which was pretty cool actually, but meant that it felt more like a lecture and it was less easy to connect with the audience.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/DCdGlxBbKU4" width="560"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;We received some really great feedback on this presentation, and it was brilliant to see a lot of the speakers from JAX there watching us.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-3233226425097271055?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/3233226425097271055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/12/video-of-our-jax-london-session.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/3233226425097271055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/3233226425097271055'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/12/video-of-our-jax-london-session.html' title='Video of our JAX London session'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/DCdGlxBbKU4/default.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-3673550540961937634</id><published>2011-12-04T12:05:00.001Z</published><updated>2011-12-04T15:32:43.973Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='devoxx'/><category scheme='http://www.blogger.com/atom/ns#' term='gender'/><category scheme='http://www.blogger.com/atom/ns#' term='interview'/><category scheme='http://www.blogger.com/atom/ns#' term='links'/><title type='text'>Interview by the Oracle Technology Network at Devoxx</title><content type='html'>Tori Wieldt from the Oracle Technology Network interviewed me at Devoxx. &amp;nbsp;Because I was there to be on the &lt;a href="http://mechanitis.blogspot.com/2011/11/why-we-shouldnt-target-women.html"&gt;Why We Shouldn't Target Women&lt;/a&gt; panel, the interview is just another platform for me to air my views on this subject again. &lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="395" width="395"&gt;&lt;param name="movie" value="http://www.parleys.com/dist/share/parleysshare.swf"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="wmode" value="direct"&gt;&lt;/param&gt;&lt;param name="bgcolor" value="#222222"&gt;&lt;/param&gt;&lt;param name="flashVars" value="sv=true&amp;pageId=2769" &gt;&lt;/param&gt;&lt;embed src="http://www.parleys.com/dist/share/parleysshare.swf" type="application/x-shockwave-flash" flashVars="sv=true&amp;pageId=2769" allowfullscreen="true" bgcolor="#222222" width="395" height="395"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;Yes, I am actually wearing pink....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-3673550540961937634?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/3673550540961937634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/12/interview-by-oracle-technology-network.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/3673550540961937634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/3673550540961937634'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/12/interview-by-oracle-technology-network.html' title='Interview by the Oracle Technology Network at Devoxx'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-186095863663111072</id><published>2011-11-28T20:37:00.001Z</published><updated>2011-11-28T21:47:35.409Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='disruptor'/><category scheme='http://www.blogger.com/atom/ns#' term='ljc'/><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>London Java Community Open Conference</title><content type='html'>Saturday was, hopefully, my last conference of the year. &amp;nbsp;My lucky readers should start to see some posts which are not simply me gushing about another opportunity to hang out with awesome people and learn about interesting "stuff".&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-pY5RNaGdzKc/TtP9CtxtxzI/AAAAAAAAIu0/JTuUubrCF6g/s1600/DSC_0035.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="214" src="http://4.bp.blogspot.com/-pY5RNaGdzKc/TtP9CtxtxzI/AAAAAAAAIu0/JTuUubrCF6g/s320/DSC_0035.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Who wants to propose a session?&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;In many ways the &lt;a href="http://www.meetup.com/Londonjavacommunity/"&gt;London Java Community&lt;/a&gt; Open Conference was my favourite one so far, and not just because it's near home and I helped to organise it. &amp;nbsp;One of the awesome things about both &lt;a href="http://mechanitis.blogspot.com/2011/10/javaone-2011-roundup.html"&gt;Java One&lt;/a&gt; and &lt;a href="http://mechanitis.blogspot.com/2011/11/devoxx-story-so-far.html"&gt;Devoxx&lt;/a&gt; was the opportunity to travel, to see new places and to meet people you might not meet in London. &amp;nbsp;The scale, and the opportunities to meet key players in the Java world, were the things I probably appreciated the most from both of those conferences. &amp;nbsp;And you can tell from my posts I really enjoyed them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But the LJC conference was probably perfect as my last one for 2011:&lt;/div&gt;&lt;div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-W-M-FpMSB8o/TtP9R2P6uiI/AAAAAAAAIu8/ZXAGUEuhb7Y/s1600/DSC_0065.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-W-M-FpMSB8o/TtP9R2P6uiI/AAAAAAAAIu8/ZXAGUEuhb7Y/s320/DSC_0065.jpg" width="214" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;"How do you spell 'lightning'?"&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;ul&gt;&lt;li&gt;Being on home turf with awesome people who have really helped drag me kicking and screaming into the conference scene really brought home to me what an amazing year this has been. &amp;nbsp;This time last year, I felt I barely had the credentials to be a behind-the-scenes organiser for the LJC, and I didn't attend last year's conference because I wasn't sure how much I would get out of it. &amp;nbsp;This year, I'm at the conference giving two sessions, having made my international&amp;nbsp;début&amp;nbsp;already.&lt;/li&gt;&lt;li&gt;With 120 people you feel like you can talk to everyone at some point if you want to. &amp;nbsp;I don't think I managed that, but I probably chatted in one way or another with maybe half the attendees. &amp;nbsp;The great thing about this is you see the wide variety of things people are working on - the technologies, the business problems, the team and company sizes, the methodologies. It's eye-opening and quite exciting.&lt;/li&gt;&lt;li&gt;It seemed that a small, open conference like this drives content based on relevance. &amp;nbsp;We had no vendor pitches, although John was contractually obliged to mention Atlassian at least once every half hour (but as they paid for the beer, this was only fair). &amp;nbsp;People vote with their feet, and attend the sessions that they will get the most out of. &amp;nbsp;I liked this format a lot.&lt;/li&gt;&lt;li&gt;I presented alone for the first time, not hiding behind &lt;a href="http://mikes-tech.blogspot.com/"&gt;Mike&lt;/a&gt;&amp;nbsp;or &lt;a href="http://mechanical-sympathy.blogspot.com/"&gt;Martin&lt;/a&gt;. &amp;nbsp;I found this surprisingly liberating. &amp;nbsp;I love working with those guys, but without them providing a safety net I actually found my confidence increasing as I realised I was perfectly capable of answering things I would probably have let them field.&lt;/li&gt;&lt;li&gt;My second session was more workshop-like, and I wanted the audience to guide what we covered. &amp;nbsp;I thought it went really well, I loved letting the audience guide it, and I enjoyed giving it.&lt;/li&gt;&lt;li&gt;I was honoured (and terrified) to be asked to be part of a Meet the Experts panel with people who actually know what they're talking about. &amp;nbsp;I was very very pleased to get away with not being asked any questions about being a girl or the length of my skirt. &amp;nbsp;We had a great discussion around writing high performance code, about different technologies and their applicability, and about the future of Java and JVM-based languages.&lt;/li&gt;&lt;li&gt;I loved the venue. &amp;nbsp;The rooms were a nice range of sizes, all with projectors of course, but also whiteboard space and flip charts. &amp;nbsp;It looked like a 1960s version of the future - all shiny white surfaces and curving lines. &amp;nbsp;But it felt like a space to create and innovate in.&lt;/li&gt;&lt;li&gt;Mike's Hacking the Open JDK session in the morning was excellent. &amp;nbsp;Again, this was another example of a workshop format working really well. &amp;nbsp;He gave some good background to compilers in general, and a good walk through of some of the code that's there at the moment. &amp;nbsp;He was happy to share stuff he'd learnt the hard way, and it made me want to get more involved in that side of things.&lt;/li&gt;&lt;li&gt;The food was &lt;i&gt;awesome&lt;/i&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-T2mIA_BATOs/TtP-H7zXG0I/AAAAAAAAIvE/zpPILN-XR1A/s1600/DSC_0054.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="214" src="http://3.bp.blogspot.com/-T2mIA_BATOs/TtP-H7zXG0I/AAAAAAAAIvE/zpPILN-XR1A/s320/DSC_0054.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Clearly people haven't had enough coffee yet.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;My sessions were User's Guides to the Disruptor - a beginner's and a more advanced one. &amp;nbsp;The beginner's was&amp;nbsp;an updated summary of the Disruptor stuff already covered in this blog - the ring buffer, writing to and reading from it, and configuration. &amp;nbsp;The second session covered &amp;nbsp;more advanced ideas: you don't need a ring buffer any more; cache lines and false sharing; worker pools; aggregate event handlers. This session was a lot less prepared and more collaborative, and I loved giving it. &amp;nbsp;Maybe that's my teacher-genetics coming out.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The aim of both sessions was to give people an idea of how to actually use the Disruptor - developers are definitely interested in how and why it works, but we've been evangelising a lot and now there are very sensible questions being asked about how to get it to do various things. &amp;nbsp;I'd like to run some more of these sessions in future, and to add more material to the blog.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-6Fzn_ybxqys/TtP_H1sV-ZI/AAAAAAAAIvM/2Vx-NmjgLT4/s1600/DSC_0117.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="214" src="http://3.bp.blogspot.com/-6Fzn_ybxqys/TtP_H1sV-ZI/AAAAAAAAIvM/2Vx-NmjgLT4/s320/DSC_0117.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;And finally, a proper meal before more beer.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;Back to the conference. &amp;nbsp;Were there any downsides? &amp;nbsp;Personally I had none. &amp;nbsp;If I had to suggest an improvement for next year, it's that we would like to see more novice speakers presenting. &amp;nbsp;The LJC has always been about nurturing this talent, and a small conference like this one with a friendly audience, many of whom you may already know, is a great place to practice. &amp;nbsp;The lightning talks showed the great variety (and abilities) of our members, it would be nice to expand this to full sessions. &amp;nbsp;As I found, filling a 30 minute session is not anywhere near as hard as you think!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm really looking forward to next year's LJC conference, and I'm totally buzzing from the positive vibe from this year's.&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-jrd5fzdD4Jg/TtP7_O_05CI/AAAAAAAAIus/nnx_gab0UEk/s1600/DSC_0096.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="267" src="http://2.bp.blogspot.com/-jrd5fzdD4Jg/TtP7_O_05CI/AAAAAAAAIus/nnx_gab0UEk/s400/DSC_0096.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The LJC Associates modelling their lovely new t-shirts. &amp;nbsp;Mine fits!&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-186095863663111072?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/186095863663111072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/11/london-java-community-open-conference.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/186095863663111072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/186095863663111072'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/11/london-java-community-open-conference.html' title='London Java Community Open Conference'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-pY5RNaGdzKc/TtP9CtxtxzI/AAAAAAAAIu0/JTuUubrCF6g/s72-c/DSC_0035.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-2319932514859908286</id><published>2011-11-20T07:07:00.001Z</published><updated>2011-12-04T12:14:19.304Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='devoxx'/><category scheme='http://www.blogger.com/atom/ns#' term='gender'/><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>Why We Shouldn't Target Women</title><content type='html'>I'm back from Devoxx, having had lots of food for thought. &amp;nbsp;In particular, my panel on Why We Shouldn't Target Women generated a lot of discussion and I'm still trying to process it all.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-eRa9yncj_HA/TsdmXlW-JhI/AAAAAAAAIng/5UUHweA8pWE/s1600/DSC_0136.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="428" src="http://3.bp.blogspot.com/-eRa9yncj_HA/TsdmXlW-JhI/AAAAAAAAIng/5UUHweA8pWE/s640/DSC_0136.jpg" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Martijn Verburg; Regina ten Bruggencate; Trisha Gee; Antonio Goncalves; Claude Falguière; Kim Ross&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;The panel went really well, we got decent interaction from the audience, and of course my fellow panel members were awesome. &amp;nbsp;I managed to restrain myself from using the opportunity as my own personal soap box and allowed other people to speak occasionally. &amp;nbsp;Sadly the only male on the panel stole the show somewhat, so Antonio won't be invited in future... Actually in seriousness, it was great to have a guy on the panel to present his point of view. &amp;nbsp;It was interesting that he's a father, highlighting that parenting issues are not the same as women's issues, and conflating those two concerns hurts both genders. But Antonio's hair is far too shiny and pretty and he's funnier than I am, so I'm not standing next to him again.&lt;br /&gt;&lt;br /&gt;I'd love to make a note of all the issues discussed during the hour, but I'll be honest, I was too busy trying not to fall over in my girly six-inch stiletto boots to remember anything that happened. &amp;nbsp;The video will hopefully be available on Parleys some time in the future, so I will link to it when it's there if it's not too horribly embarrassing. &lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-xiMJbYyi8p8/Tsdmcsb99JI/AAAAAAAAIoQ/ycVvxgezN7A/s1600/DSC_0142.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="428" src="http://4.bp.blogspot.com/-xiMJbYyi8p8/Tsdmcsb99JI/AAAAAAAAIoQ/ycVvxgezN7A/s640/DSC_0142.jpg" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Someone let me have the microphone again...&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;One question that came up more than once throughout the week was: IT/programming is not the only industry with a lack of women, why should we care? &amp;nbsp;Maybe it's just natural?&lt;br /&gt;&lt;br /&gt;I think we need to be very careful before writing off such an imbalance as "natural". &amp;nbsp;We need to make sure first that we aren't discriminating against groups, consciously or through some unnoticed system bias. &amp;nbsp; &amp;nbsp;And for me, the thing is that we notice that women aren't well represented in technical roles, but we don't necessarily notice the other groups of people who might be being put off for similar (or maybe totally different) reasons. &amp;nbsp;We can't so easily tell if gays, jews, parents, shy people, folks from poor backgrounds or any other less&amp;nbsp;distinguishable&amp;nbsp;sets of people are finding it hard to make it as a programmer.&lt;br /&gt;&lt;br /&gt;We can see the figures for females. &amp;nbsp;In the UK in 2008:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;44.7% of people taking ICT (Information and Communications Technology) at GCSE (age 14-16) are girls. &amp;nbsp;As in many other subjects these days, the girls get better results than the boys.&lt;/li&gt;&lt;li&gt;38.6% of kids taking ICT at A Level (16-18) are girls. &amp;nbsp;Only 9.6% of Computing students are girls. Again, girls outperform the boys in both subjects.&lt;/li&gt;&lt;li&gt;19.4% of those studying Computer Science at university are women. &amp;nbsp;This is down from 24% in 2003.&lt;/li&gt;&lt;li&gt;Through a not-very-scientific poll of the members of the London Java Community, it looks like approximately 15% of techies in industry are women. &amp;nbsp;Interestingly, some companies have a much higher proportion than others, but I think that's something to explore another time.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;The thing that worries me about these figures are a) the "pipeline" hints at a drop-off in interest in the subject, not a lack of ability, since the girls are doing well tech subjects but choose not to pursue them and b) the numbers are declining in some areas, specifically university applications. &amp;nbsp;I've read studies that show the percentage of those in technical jobs who are women has been steadily declining since the 80s, but it's difficult to get specific figures, especially as I'm particularly interested in programming / technical roles rather than just the percentage of women "in IT".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If the numbers are declining, that seems like a smell to me. &amp;nbsp;Not only do we have some sort of image problem which puts people like those who have two X chromosomes off from entering our industry, we're driving them away when they get here. &amp;nbsp;And I don't&amp;nbsp;believe&amp;nbsp;that's because women find they're not good at it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Other industries have been successful at attracting a higher proportion of women - for example, in 1950, only 15% of&amp;nbsp;accountants&amp;nbsp;were women. &amp;nbsp;By 1985 half of all accounting majors were women, and by 1990 the majority of the workforce was female. &amp;nbsp;It would be nice to think we could learn something from our friends in the Maths world. &amp;nbsp;After all, the skills are not dissimilar. &amp;nbsp;But they have a slight advantage over us - in many countries all children are required to study maths until age 16. &amp;nbsp;However, there are very few 16-year-olds who have any programming experience at all. &amp;nbsp;Either we need to accept that we're going to have to hire kids with other degrees and train them to be programmers, or we're going to have to do some serious outreach to interest kids in programming and technology long before they start to make their exam choices. &amp;nbsp;In the UK, they need to choose their GCSE subjects at 14, which means we probably need to be&amp;nbsp;targeting&amp;nbsp;kids as young as 10 or 11. &amp;nbsp;That's not inconceivable, when you think about it - how many of us were programming in BASIC aged eight or nine? &amp;nbsp;Could we not teach kids to write an iPhone app or a Facebook app instead? &amp;nbsp;I was very pleased to hear someone in our audience was teaching their daughter to program. &amp;nbsp;At an even younger age, the least you can do is buy your kids Lego - I'm sure that exercises the right parts of the brain.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The point is, that I don't think we can conclude that it's "natural" for girls to not be interested in programming. &amp;nbsp;The first programmer was a woman, and during the war and even &lt;a href="http://www.stanford.edu/group/gender/cgi-bin/wordpressblog/2011/06/researcher-reveals-how-computer-geeks-replaced-computer-girls/"&gt;into the '60s many programmers were women&lt;/a&gt;. &amp;nbsp;I think that if we can work with schools to provide some tutoring in computing at a younger age we might be able to attract kids who wouldn't have thought about programming as a career choice before. &amp;nbsp;Some of these may be women, some will not. &amp;nbsp;That's fine, diversity is our ultimate goal.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Which leads me onto another point - special treatment of women. &amp;nbsp;I've said it before I'm sure - I think singling out women to attempt to increase their numbers does more harm than good, for a number of reasons:&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;It makes women think that there must be something wrong in our industry if women need to be treated differently, or mentored differently, or need additional training to get by. Or it makes us think that we really aren't as good as our male counterparts because we're being given special treatment.&lt;/li&gt;&lt;li&gt;It builds up resentment amongst our male colleagues, so they soon begin to wonder if we're doing our job because we're good at it, or if we got there because we got lots more help, or because we're there to tick some sort of box&lt;/li&gt;&lt;li&gt;It's not solving the problem of lack of overall diversity - where are the programs for people who went to the wrong schools, for those who didn't think about programming as a career, for a million other special interest groups that exist out there?&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Some of the ideas that imply special treatment are things like: all women events (you should know by now &lt;a href="http://mechanitis.blogspot.com/2011/01/on-how-not-to-target-girl-geeks.html"&gt;how I feel about those&lt;/a&gt;); free entry to conferences for women; higher pay for women at certain companies. &amp;nbsp;Although I would benefit from all of these things, I hate them. &amp;nbsp;I feel like I'm being compensated for this terrible affliction of being born female.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, what can we do?&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Reach out to those you want speaking at your conferences. &amp;nbsp;This might include women, it might include people from other "minorities", or it might just be awesome people that you want there making your conference look good. &amp;nbsp;&lt;/li&gt;&lt;li&gt;Use these people for marketing and role models - it is indeed possible that if you have some female faces on your conference site and posters, you might attract more women attendees. &amp;nbsp;Actually, if you have more women role models you might attract more men, but hey, it's all about diversity.&lt;/li&gt;&lt;li&gt;Buy your kids Lego and teach them programming.&lt;/li&gt;&lt;li&gt;Treat women in your company like people the same as anyone else. &amp;nbsp;We were asked about how to deal with a younger female boss. &amp;nbsp;Kim's answer was perfect: "Like an older, male boss".&lt;/li&gt;&lt;li&gt;Get involved in mentoring programmes, not just for women but for people of all ages - kids at school, undergraduates, or people who are already in the industry and want to take that next step, for example to speaking at conferences or writing or leading teams or becoming CTO.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Since the panel I've been pointed, numerous times, to this excellent article which talks about &lt;a href="http://techcrunch.com/2011/11/19/racism-and-meritocracy/"&gt;racism, sexism, and&amp;nbsp;meritocracies&lt;/a&gt;. &amp;nbsp;I particularly like the line "Explicit diversity programs have the solution exactly backwards". &amp;nbsp;Well worth a read.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-2319932514859908286?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/2319932514859908286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/11/why-we-shouldnt-target-women.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2319932514859908286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2319932514859908286'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/11/why-we-shouldnt-target-women.html' title='Why We Shouldn&apos;t Target Women'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-eRa9yncj_HA/TsdmXlW-JhI/AAAAAAAAIng/5UUHweA8pWE/s72-c/DSC_0136.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-3102670635748098638</id><published>2011-11-16T18:16:00.001Z</published><updated>2011-12-04T12:14:29.616Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='devoxx'/><category scheme='http://www.blogger.com/atom/ns#' term='gender'/><category scheme='http://www.blogger.com/atom/ns#' term='ljc'/><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>Devoxx: The story so far</title><content type='html'>&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-z5FCR4QblNk/TsUvDD-bLYI/AAAAAAAAIWE/9t29vnc03dw/s1600/DSC_0051.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="267" src="http://1.bp.blogspot.com/-z5FCR4QblNk/TsUvDD-bLYI/AAAAAAAAIWE/9t29vnc03dw/s400/DSC_0051.JPG" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Stephan wearing the Brazilian flag at the opening keynote&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;ul&gt;&lt;li&gt;European conferences are different (and cool) because you get to hear even more languages spoken than you usually do in London (apparently the most diverse city in the world for spoken languages). &amp;nbsp;I think the idea of a Paris Devoxx with 75% of the talks in French is brilliant - I'm always banging on about diversity, we shouldn't expect developers to learn&amp;nbsp;in English only.&lt;/li&gt;&lt;li&gt;Really great to meet up with some of the people I met at Java One and am starting to feel more a part of the global community.&lt;/li&gt;&lt;li&gt;Seems to me there are slightly more women here than at the other conferences I've been to, and not just because &lt;a href="https://twitter.com/#!/reginatb38"&gt;Regina&lt;/a&gt; and I pulled together four women for a panel on women technologists. &amp;nbsp;And once again, a lot of guys asking why this is, because they want things to change.&lt;/li&gt;&lt;li&gt;A highlight was seeing my namesake, AutoTrish, up on a cinema-sized screen in front of hundreds of people at &lt;a href="http://www.davefarley.net/"&gt;Dave Farley&lt;/a&gt;'s Continuous Delivery presentation.&lt;/li&gt;&lt;li&gt;Building on from my twitter revelation at JAX London, I've found twitter very useful here for messaging people I want to meet up with, but also for chatting to new people and making new friends. &amp;nbsp;It's not quite as intimate as JAX London though because there are billions more people here, so the chances of actually bumping into the twitter friends is much lower.&lt;/li&gt;&lt;li&gt;Have had lots of interesting conversations with people about the Open JDK, which I guess is the logical extension of the interesting conversations I had about the JCP In San Francisco.&lt;/li&gt;&lt;li&gt;A community event like this is different to an event like Java One, because a single organisation isn't calling the shots. &amp;nbsp;It's interesting (and great) that Oracle and Google can both be here talking about the cool stuff they're up to.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ZiS6GQB_8No/TsUvuKMEJuI/AAAAAAAAIWM/RnQ3792tbsQ/s1600/DSC_0054.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="267" src="http://3.bp.blogspot.com/-ZiS6GQB_8No/TsUvuKMEJuI/AAAAAAAAIWM/RnQ3792tbsQ/s400/DSC_0054.JPG" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The Diabolical Developer&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Conferences are clearly something that appeal to me - I love meeting people and chatting about interesting and (sometimes) intelligent things; I love learning stuff and indexing it away, possibly for future references; I love hanging out with people like the &lt;a href="http://www.meetup.com/Londonjavacommunity/"&gt;LJC&lt;/a&gt; guys (Ben, Martijn and John); I love kicking around ideas of what more we can do at LMAX with our lot (&lt;a href="http://mikes-tech.blogspot.com/"&gt;Mike&lt;/a&gt;, &lt;a href="http://www.davefarley.net/"&gt;Dave&lt;/a&gt;, Dali). &lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-NbOeHExh7WA/TsUv-XFma8I/AAAAAAAAIWU/UJxlYEKYLLs/s1600/DSC_0059.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="267" src="http://3.bp.blogspot.com/-NbOeHExh7WA/TsUv-XFma8I/AAAAAAAAIWU/UJxlYEKYLLs/s400/DSC_0059.JPG" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Dave's Continuous Delivery&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;I'm really looking forward to my panel this afternoon, I'm going to be ranting about how we target women for tech jobs. &amp;nbsp;Should be fun.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-gCXKwCpl4j4/TsUwoP2jU3I/AAAAAAAAIWc/4eE8egAKUkM/s1600/DSC_0072.JPG" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="214" src="http://3.bp.blogspot.com/-gCXKwCpl4j4/TsUwoP2jU3I/AAAAAAAAIWc/4eE8egAKUkM/s320/DSC_0072.JPG" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Nice 'tash!&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Shameless plug: Mike and Dali are raising money for men's health with their rather awesome 'tashes. &amp;nbsp;It took guts to stand up on stage and present with that handlebar, please &lt;a href="http://uk.movember.com/mospace/2544604/"&gt;give a penny or two&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-3102670635748098638?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/3102670635748098638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/11/devoxx-story-so-far.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/3102670635748098638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/3102670635748098638'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/11/devoxx-story-so-far.html' title='Devoxx: The story so far'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-z5FCR4QblNk/TsUvDD-bLYI/AAAAAAAAIWE/9t29vnc03dw/s72-c/DSC_0051.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-1352458068573177907</id><published>2011-11-15T18:00:00.000Z</published><updated>2011-12-04T12:26:39.760Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='jax london'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='ljc'/><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>JAX London - I learn stuff and meet people</title><content type='html'>A couple of weeks ago, I was at &lt;a href="http://jaxlondon.com/"&gt;JAX London&lt;/a&gt; along with a number of the &lt;a href="http://www.meetup.com/Londonjavacommunity/"&gt;London Java Community&lt;/a&gt; regulars (&lt;a href="http://martijnverburg.blogspot.com/"&gt;Martijn&lt;/a&gt;/&lt;a href="https://twitter.com/#!/kittylyst"&gt;Ben&lt;/a&gt;/&lt;a href="http://jr0cket.com/"&gt;John&lt;/a&gt;/&lt;a href="http://www.meetup.com/london-software-craftsmanship/members/5737653/"&gt;Sandro&lt;/a&gt;/&lt;a href="http://devangelist.blogspot.com/"&gt;Simon&lt;/a&gt;/&lt;a href="http://zoah.co.uk/jax-london"&gt;Zoe&lt;/a&gt; I'm looking at you....)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-IjhCGApfG_A/TrlkKBsNZQI/AAAAAAAAIV0/Dsei_5U3TBY/s1600/IMGP0035.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="267" src="http://3.bp.blogspot.com/-IjhCGApfG_A/TrlkKBsNZQI/AAAAAAAAIV0/Dsei_5U3TBY/s400/IMGP0035.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;My purpose for attending was largely to present the &lt;a href="http://mechanitis.blogspot.com/2011/10/mike-and-i-debut-our-new-disruptor.html"&gt;Hardcore Concurrency for Beginners&lt;/a&gt; talk that &lt;a href="http://mikes-tech.blogspot.com/"&gt;Mike&lt;/a&gt; and I debuted at an LJC event a few weeks back.  Almost as important was catching up with the aforementioned LJCers and meeting with as many people as would talk to me.  After the disappointment of the sessions at Java One, sitting in a room being talked at was quite low down on my list of priorities.Sometimes it's nice to be wrong.&lt;br /&gt;&lt;br /&gt;The sessions at JAX were of a very high standard, and I learnt something from every one.  I was pleasantly surprised by the calibre of international speakers that were there, and the sessions seemed to be pitched right for me personally, which was nice.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Downsides:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I'm going to cover these first because I like to end on a high note. &amp;nbsp;Firstly, although I was interested in the Open JDK session at the community night, it was really on way too late (and after too much beer - i.e. more than none) to get the most out of it.&lt;/li&gt;&lt;li&gt;It's a bit of a shame that our session was the last presentation on the final day, by that time people's brains are fried and we didn't get as many questions, or as much interaction, as we usually would. &amp;nbsp;Maybe that's because everyone understood and agreed with us. &amp;nbsp;But we did get great feedback so I could be scraping the barrel for things to complain about.&lt;/li&gt;&lt;/ul&gt;The following sections outline the main takeaway points for me.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;Software Craftsmanship / Design&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.meetup.com/london-software-craftsmanship/members/5737653/"&gt;Sandro&lt;/a&gt; did a great job emphasising that Software Craftsmanship is about professionalism, not beauty. &amp;nbsp;We should be doing the right thing because we want to, because it makes everyone's lives easier in the long run, and because it &lt;i&gt;is&lt;/i&gt; the right thing to do, not because some process dictates that we do it. &amp;nbsp;The other thing that really struck me was how having a craftsman's mindset leads to us taking ownership of our career and investing in it. &amp;nbsp;He also challenged us to stop being miserable and negative. &amp;nbsp;If we're happy, we'll attract more (presumably happy) people into our circle.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://codemanship.co.uk/parlezuml/blog/"&gt;Jason Gorman&lt;/a&gt;'s Slow and Dirty presentation showed that ignoring quality slows down delivery not just in the long run, in terms of maintainability, but also in the short run - a TDD exercise of approximately 30 minutes took less time to get right when done in a test driven fashion, despite that fact that we all still think writing tests takes too much time.  He pointed out that Twitter and Facebook are statistical aberrations - not every startup can afford to assume they will be bought out of their scalability problems.  There was lots of interesting stuff here about quality, which was pretty inspiring at the time but in retrospect, as a team that already does Test Driven Development almost to the extreme, I wonder what's next for us to improve our quality even further.&lt;br /&gt;Simon Ritter's keynote stated that code should be a joy to read, not simply easy to read, and &lt;a href="https://twitter.com/#!/AdamBien"&gt;Adam Bien&lt;/a&gt;'s presentation talking about simplifying code: thinking about design, and not getting bogged down in unnecessary design patterns in order to implement something simple.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Concurrency / Parallelism / Performance&lt;/b&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-LZf05BIgfGY/Tr_GwtTq6zI/AAAAAAAAIV8/3GnJFWQYCig/s1600/5634379146_9838de9e9d_z.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="267" src="http://3.bp.blogspot.com/-LZf05BIgfGY/Tr_GwtTq6zI/AAAAAAAAIV8/3GnJFWQYCig/s400/5634379146_9838de9e9d_z.jpg" width="400" /&gt;&lt;/a&gt;Russel Winder's session around message passing had me thinking.  It was particularly interesting to see him say things that are possibly the opposite of what we (the LMAX/Disruptor types) are preaching.  For example, that programmers shouldn't care about the low-level details; that we should be using models (i.e. abstraction) to deal with parallelism; that you should let the JVM deal with thread management.  However, I think he's fundamentally coming from the same place as us: "concurrency" in the past was not a good model, it was designed for old hardware that was trying to run multiple processes on a single core.  With multi-core systems you need to be running code in parallel instead. &lt;br /&gt;&lt;br /&gt;Dan Hardiker's performance testing presentation was another one that reinforced that testing first, finding what the real performance is, profiling and then targeted experimentation are all fundamental to getting good performance.  There was a lot of good advice to how to write good performance tests too.&lt;br /&gt;Another point from Simon Ritter's keynote reiterated that the performance free lunch was over, and we need to get better at writing parallel code.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Workshops&lt;/b&gt;&lt;br /&gt;Both the Open JDK session and Ben and Martijn's "Spring cleaning your code base with Java 7" had me attempting to do things with my mac I never intended to do (i.e. write code).  Thanks to Ben and Martijn's patience, I finally got IntelliJ playing nicely on the mac with Java 7, which was a challenge but I'm pretty pleased I've achieved it.  The Open JDK one was not as successful for me personally, but I got a good feel for the process of building it (i.e. it's hard and it takes a very long time).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Other great stuff:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The keynote by James Governor from &lt;a href="http://redmonk.com/"&gt;Redmonk&lt;/a&gt; was really thought-provoking. &amp;nbsp;So thought-provoking I wrote no notes and can't remember any of it.&lt;/li&gt;&lt;li&gt;As last time, the Community night was really great. &amp;nbsp;I met new people and I hung out with some old favourites. &amp;nbsp;Dear God I must stop drinking with those guys. Hotel bars are particularly awful for losing track of time.&lt;/li&gt;&lt;li&gt;I heard about the Java 7+ features enough times from various people to be able to give an overview of the release plan to my geek friends in the pub on Friday (hey, they asked).&lt;/li&gt;&lt;li&gt;I learnt how to use twitter to bridge that gap between me and other&amp;nbsp;attendees, and made new friends without having to do the scary thing of approaching strangers.&lt;/li&gt;&lt;li&gt;The lunches we rather good.&lt;/li&gt;&lt;li&gt;Going to a conference 20 minutes from home is a bonus. &amp;nbsp;Nice to meet other London devs as well as the European ones too.&lt;/li&gt;&lt;li&gt;To me, it seems as if the relevance of the JCP is starting to seep out into the real(er) world.&lt;/li&gt;&lt;li&gt;The tables for laptops at the front of the rooms was an awesome idea. &amp;nbsp;For a start, it encouraged people to get into the room early to get one of those seats.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;I had a great time at the conference, I learnt stuff and met people, which is all I really want.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For once, the photos aren't mine.  &lt;i&gt;Images courtesy of &lt;a href="http://jaxlondon.com/"&gt;JAX London&lt;/a&gt;&lt;/i&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-1352458068573177907?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/1352458068573177907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/11/jax-london-i-learn-stuff-and-meet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/1352458068573177907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/1352458068573177907'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/11/jax-london-i-learn-stuff-and-meet.html' title='JAX London - I learn stuff and meet people'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-IjhCGApfG_A/TrlkKBsNZQI/AAAAAAAAIV0/Dsei_5U3TBY/s72-c/IMGP0035.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-2015054960796662468</id><published>2011-11-09T08:16:00.000Z</published><updated>2011-11-09T09:32:43.517Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='lmax'/><category scheme='http://www.blogger.com/atom/ns#' term='gender'/><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>A NYSE Product Manager and an LMAX Developer walk into a low latency trading seminar...</title><content type='html'>"What... exactly... were you guys looking to get out of today's event? Because..."&lt;br /&gt;&lt;br /&gt;"Because we're girls?"&lt;br /&gt;&lt;br /&gt;"Um... yes..."&lt;br /&gt;&lt;br /&gt;Kim impetuously opts for The Truth: "We're here to meet men."&lt;br /&gt;&lt;br /&gt;Our interrogator looks round dubiously. &lt;br /&gt;&lt;br /&gt;"No, really, why are you here?"&lt;br /&gt;&lt;br /&gt;Phew. &amp;nbsp;My reputation is intact&lt;sup&gt;1&lt;/sup&gt;&lt;br /&gt;&lt;br /&gt;Kim eloquently describes what her situation is as Product Manager and the criteria she's measuring third party products against. &amp;nbsp;I explain how LMAX aims to be the fastest retail exchange in the world, and therefore low latency is a tiny bit important to us. &amp;nbsp;I talk about how we created &lt;a href="http://code.google.com/p/disruptor/"&gt;The Disruptor&lt;/a&gt; on our path to achieve that goal. &amp;nbsp;The guys gathered around us look a little... shell-shocked.&lt;br /&gt;&lt;br /&gt;I'm exaggerating for Dramatic Effect. &amp;nbsp;Before anyone starts getting upset about the only two girls at the event who weren't staff or hospitality being singled out, you have to give the guys credit. &amp;nbsp;They approached us, engaged us in conversation, and had a very serious question about what we were after, and was there anything the vendor could do to either improve their offering or to make their sales pitch more appealing.&lt;br /&gt;&lt;br /&gt;And don't get me wrong - it's brilliant being different in a situation like that, if people are brave / foolish / drunk enough to talk to you. &amp;nbsp;It beats the hell out of sitting in a corner trying to get up the nerve to speak to Strangers (been there, done that).&lt;br /&gt;&lt;br /&gt;But it is quite a contrast, even from the Java events (JAX London, Java One). &amp;nbsp;There, I was in a select group of people of the female&amp;nbsp;persuasion. &amp;nbsp;But I was also part of a community, and treated as A Developer. &amp;nbsp;At very specialised events (low latency, high performance in particular) diversity is almost non-existent. &amp;nbsp;You can count the number of women on one hand (if you can see any at all) and even the developers wear suits (poor bastards). &amp;nbsp;However it would probably be better if you could hide your surprise at hearing technical terminology coming out of a woman's mouth. &lt;br /&gt;&lt;br /&gt;But... I kinda like it. &amp;nbsp;Yes, I'm an alien. &amp;nbsp;Yes, I'm special. &amp;nbsp;But if it means you make the extra effort to speak to me, I can live with that.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt;&amp;nbsp;"Extra extra, read all about it! &lt;i&gt;Blogger And International Conference Speaker Only Does It To Meet Boys&lt;/i&gt;!" &amp;nbsp;Not quite &lt;i&gt;Jordan Stalks Rugby Ace For Sperm Donor&lt;/i&gt;. &amp;nbsp;Which I really did see this morning.&lt;br /&gt;&lt;br /&gt;EDIT: oh yes, and of course I forgot to plug my panel at Devoxx next week: &lt;a href="http://devoxx.com/display/DV11/Why+We+Shouldn%27t+Target+Women"&gt;"Why we shouldn't target women"&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-2015054960796662468?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/2015054960796662468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/11/nyse-product-manager-and-lmax-developer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2015054960796662468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2015054960796662468'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/11/nyse-product-manager-and-lmax-developer.html' title='A NYSE Product Manager and an LMAX Developer walk into a low latency trading seminar...'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-2296420876898967311</id><published>2011-11-06T16:13:00.000Z</published><updated>2011-11-06T16:14:02.436Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaOne11'/><category scheme='http://www.blogger.com/atom/ns#' term='gender'/><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>More videos from Java One 2011</title><content type='html'>It must be time for me to move on from talking about Java One, it has dominated my blog of late. &amp;nbsp;But also I want to talk about JAX London from this week.&lt;br /&gt;&lt;br /&gt;But before I move on, it's probably worth rounding off with the last two resources from the conference.&lt;br /&gt;&lt;br /&gt;1) &lt;a href="http://mechanical-sympathy.blogspot.com/"&gt;Martin Thompson&lt;/a&gt; and I are interviewed about the &lt;a href="http://code.google.com/p/disruptor/"&gt;Disruptor &lt;/a&gt;winning the Duke Award (we come in halfway through):&lt;br /&gt;&lt;br /&gt;&lt;object id="flashObj" width="640" height="360" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,47,0"&gt;&lt;param name="movie" value="http://c.brightcove.com/services/viewer/federated_f9?isVid=1&amp;isUI=1" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;param name="flashVars" value="videoId=1203095587001&amp;linkBaseURL=http%3A%2F%2Fmedianetwork.oracle.com%2Fvideo%2Fplayer%2F1203095587001&amp;playerID=1217746023001&amp;playerKey=AQ~~,AAAAAFcSbzI~,OkyYKKfkn3x1llKvCBQgVazGCPhNSKRX&amp;domain=embed&amp;dynamicStreaming=true" /&gt;&lt;param name="base" value="http://admin.brightcove.com" /&gt;&lt;param name="seamlesstabbing" value="false" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="swLiveConnect" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://c.brightcove.com/services/viewer/federated_f9?isVid=1&amp;isUI=1" bgcolor="#FFFFFF" flashVars="videoId=1203095587001&amp;linkBaseURL=http%3A%2F%2Fmedianetwork.oracle.com%2Fvideo%2Fplayer%2F1203095587001&amp;playerID=1217746023001&amp;playerKey=AQ~~,AAAAAFcSbzI~,OkyYKKfkn3x1llKvCBQgVazGCPhNSKRX&amp;domain=embed&amp;dynamicStreaming=true" base="http://admin.brightcove.com" name="flashObj" width="640" height="360" seamlesstabbing="false" type="application/x-shockwave-flash" allowFullScreen="true" allowScriptAccess="always" swLiveConnect="true" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;2) I'm interviewed by &lt;a href="http://jduchess.org/"&gt;Duchess&lt;/a&gt; about life, the universe and everything (well, the London Java Community, the JCP, the LMAX Disruptor and Duke Award, and women programmers).&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,47,0" height="360" id="flashObj" width="640"&gt;&lt;param name="movie" value="http://c.brightcove.com/services/viewer/federated_f9?isVid=1&amp;isUI=1" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;param name="flashVars" value="videoId=1231299099001&amp;linkBaseURL=http%3A%2F%2Fmedianetwork.oracle.com%2Fvideo%2Fplayer%2F1231299099001&amp;playerID=1217746023001&amp;playerKey=AQ~~,AAAAAFcSbzI~,OkyYKKfkn3x1llKvCBQgVazGCPhNSKRX&amp;domain=embed&amp;dynamicStreaming=true" /&gt;&lt;param name="base" value="http://admin.brightcove.com" /&gt;&lt;param name="seamlesstabbing" value="false" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="swLiveConnect" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://c.brightcove.com/services/viewer/federated_f9?isVid=1&amp;isUI=1" bgcolor="#FFFFFF" flashVars="videoId=1231299099001&amp;linkBaseURL=http%3A%2F%2Fmedianetwork.oracle.com%2Fvideo%2Fplayer%2F1231299099001&amp;playerID=1217746023001&amp;playerKey=AQ~~,AAAAAFcSbzI~,OkyYKKfkn3x1llKvCBQgVazGCPhNSKRX&amp;domain=embed&amp;dynamicStreaming=true" base="http://admin.brightcove.com" name="flashObj" width="640" height="360" seamlesstabbing="false" type="application/x-shockwave-flash" allowFullScreen="true" allowScriptAccess="always" swLiveConnect="true" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-2296420876898967311?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/2296420876898967311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/11/more-videos-from-java-one-2011.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2296420876898967311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2296420876898967311'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/11/more-videos-from-java-one-2011.html' title='More videos from Java One 2011'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-4774062041765212322</id><published>2011-10-28T15:52:00.003+01:00</published><updated>2011-10-29T09:06:04.618+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaOne11'/><category scheme='http://www.blogger.com/atom/ns#' term='gender'/><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>On The Similarities Between Girls And Aliens</title><content type='html'>I discovered, through the power of the search words that lead to my blog, that there was &lt;a href="https://plus.google.com/110635974610895095726/posts/fTygidL33cx"&gt;an incident at JavaOne&lt;/a&gt; that once again opens the can of worms that is Sexism In IT.&lt;br /&gt;&lt;br /&gt;This Makes Me Sad. &amp;nbsp;I had a really positive experience at JavaOne. &amp;nbsp;In fact, I would say it was the one conference I've been to in the last 12 months where I felt like my gender &lt;i&gt;wasn't&lt;/i&gt; a problem - I even got away with wearing hotpants (tweed is business-casual, right??) without being mistaken for anything other than a developer.&lt;br /&gt;&lt;br /&gt;I know incidents like this cause a lot of tension, and I want to explore why. &amp;nbsp;Get ready for some gross generalisations: women get upset because they feel they're being marginalised or treated differently; men get upset because they think we're being over-sensitive, especially when the cause is something unintentional. &amp;nbsp;I sometimes wonder, as I'm sure other people do, if perhaps picking up every incident harms our cause more than advancing it. &amp;nbsp;But then I feel that the&amp;nbsp;unconscious&amp;nbsp;stuff is exactly the stuff that needs to be pointed out - if you don't realise you're causing a problem, you can't change your behaviour.&lt;br /&gt;&lt;br /&gt;So what I wanted to do was... well, what I wanted to do was not rant about gender (again) and be a good little non-gendered programmer. &amp;nbsp;But then I thought that spreading a bit of understanding might be A Good Thing. &amp;nbsp;After all, we're all about &lt;a href="http://en.wikipedia.org/wiki/Continuous_improvement_process"&gt;continuous improvement&lt;/a&gt;, right?&lt;br /&gt;&lt;br /&gt;I'm sure many people have been one of a minority at some point in their lives (brace yourselves for a litany of stereotyping) - the only man at their daughter's dance recital; the only white guy on a basketball team; the only straight guy in a gay bar (accidents happen!); the only girl on the development team...  Speaking for myself, in those situations I'm not actually looking for things which prove that I'm Not One Of Them.  I'm sub-consciously seeking reassurance that I'm not an alien, a freak of nature, the odd one out.&lt;br /&gt;&lt;br /&gt;I've been in mostly male environments for the last 16 years - this is the norm for me, it's my life. &amp;nbsp;It freaks me out if I'm surrounded by women actually. &amp;nbsp;What's jarring and uncomfortable is when the difference of your gender becomes apparent: when all the t-shirts are boy-shaped and boy-sized; when someone makes a joke about "women"; when someone addresses the room with "Gentlemen" - or worse, they try and make up for it: "Gentlemen. &amp;nbsp;Oh, and Ladies. &amp;nbsp;Well, Lady &amp;lt;nervous smile&amp;gt;". &amp;nbsp;Thanks, that doesn't make me feel like an outsider &lt;i&gt;at all&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Something else that really highlights the difference in genders is when you have plenty of women at the conference... but they're not the attendees. &amp;nbsp;They're manning the booths (marketing/sales or just plain hired "help"), they're taking tickets, they're dishing out the lunches. &amp;nbsp;In these cases, it becomes normal to assume that "girl" = "staff". &amp;nbsp;Not guest. &amp;nbsp;Not equal.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mechanitis.blogspot.com/2011/04/tradetech-2011-not-like-developer.html"&gt;TradeTech&lt;/a&gt; was one of the worst examples of this that I've experienced. &amp;nbsp;Those (wo)manning the booths had been chosen for their aesthetics not their knowledge. &amp;nbsp;There was even entertainment consisting of scantily clad stilt-walkers - at a financial conference! &amp;nbsp;I made the mistake of turning up in a skirt - for those who know my dress sense, it was not one of my arse-length ones, it was just above my knees - and everyone assumed I was selling something. I had a job to persuade them that I had actually paid for my ticket.&lt;br /&gt;&lt;br /&gt;So. &amp;nbsp;What am I trying to get at?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;We're not trying to make you uncomfortable when we point out tiny accidental possibly maybe sexist or sexist-seeming comments/incidents. &amp;nbsp;We're trying to stamp out behaviour that can&amp;nbsp;subconsciously&amp;nbsp;be pushing women (or other minorities/groups) out of our industry. &amp;nbsp;We like it here, we want to stay, and we want others to join us.&lt;/li&gt;&lt;li&gt;It's very easy to alienate people who are not 100% comfortable in your environment. &amp;nbsp;Every time I see t-shirts in boys size only I'm reminded I'm Not One Of You.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;...and what can we do?&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Well, the t-shirts is an easy one. &amp;nbsp;So easy, and so stupid, you might not think it's worthwhile. &amp;nbsp;Especially as people like me don't even &lt;i&gt;want&lt;/i&gt; your free t-shirt. &amp;nbsp;But I want to feel like you wanted me to want it. &amp;nbsp;Please stock some skinny-fit tees in multiple sizes, and stock smalls and mediums of the normal shape. &amp;nbsp;There are guys who would like this too. &amp;nbsp;Even if you can't get rid of your skinny tees, it will do wonders for your image.&lt;/li&gt;&lt;li&gt;Never assume your audience is all male. &amp;nbsp;Never even assume it's "mostly" male. &amp;nbsp;If your sister/girlfriend/mother/daughter might frown at something you're saying, don't say it. &amp;nbsp;You'll look like an idiot. &amp;nbsp;You can assume your audience is all technical, and joke about managers, or is all Java, and take the mickey out of C#. &amp;nbsp;Don't draw arbitrary battle lines based on gender/race/origin - any jokes should make all the audience feel included, not like specific individuals are excluded.&lt;/li&gt;&lt;li&gt;There's already been a lot said elsewhere about encouraging women speakers at events. &amp;nbsp;I'm totally behind this, but it's a fine line because I'm also totally against positive discrimination. &amp;nbsp;For the purposes of this blog, I would just say make sure you have some women on your speakers list, in the same way you would probably ensure you have a Java 7 talk, or a talk on the shiniest new technology, or other miscellaneous checkboxes you need to tick in order to make your conference a success.&lt;/li&gt;&lt;li&gt;Not sure what to suggest around many of the girls there being staff... I guess something simple like clear uniforms would stop people assuming female delegates are there to hand out lunch. &amp;nbsp;And making sure that your staff/helpers/organisers are of both genders too.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;If you're interested in this whole topic, or want to tell me I'm wrong to my face, come along my panel at Devoxx - &lt;a href="http://www.devoxx.com/display/DV11/Why+We+Shouldn%27t+Target+Women"&gt;Why We Shouldn't Target Women&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-4774062041765212322?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/4774062041765212322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/10/on-similarities-between-girls-and.html#comment-form' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/4774062041765212322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/4774062041765212322'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/10/on-similarities-between-girls-and.html' title='On The Similarities Between Girls And Aliens'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>14</thr:total><georss:featurename>London W8, UK</georss:featurename><georss:point>51.50146 -0.1932625</georss:point><georss:box>51.4915755 -0.2130035 51.5113445 -0.1735215</georss:box></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-7493354706885839093</id><published>2011-10-21T10:41:00.001+01:00</published><updated>2011-10-22T13:05:11.701+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='disruptor'/><category scheme='http://www.blogger.com/atom/ns#' term='events'/><category scheme='http://www.blogger.com/atom/ns#' term='links'/><category scheme='http://www.blogger.com/atom/ns#' term='ljc'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Mike and I debut our new Disruptor presentation</title><content type='html'>Last Tuesday&amp;nbsp;&lt;a href="http://mikes-tech.blogspot.com/"&gt;Mike&lt;/a&gt; and I unveiled our brand shiny new presentation: &lt;a href="http://www.meetup.com/Londonjavacommunity/events/32877942/"&gt;Understanding the Disruptor, a Beginner's Guide to Hardcore Concurrency&lt;/a&gt;. &amp;nbsp;This was a preview of the talk we'll be doing at &lt;a href="http://jaxlondon.com/2011/sessions/?tid=2175"&gt;JAX London&lt;/a&gt; on the 2nd November.&lt;br /&gt;&lt;br /&gt;A &lt;a href="http://vimeo.com/30781988"&gt;video of the session&lt;/a&gt; is available, as are &lt;a href="http://www.slideshare.net/trishagee/understanding-the-disruptor"&gt;the slides&lt;/a&gt;. &amp;nbsp;I promise not to say "so" anywhere near as many times when I repeat my performance at JAX (is there anything more painful than watching yourself on video?).&lt;br /&gt;&lt;br /&gt;I thought the session went really really well. &amp;nbsp;We got some great questions at the end, we had an audience that was engaged, and I was dead pleased we didn't lose anyone with the assembly language. &amp;nbsp;We had some very valuable feedback afterwards too.&lt;br /&gt;&lt;br /&gt;As well as our presentation, there were three great lightning talks:&lt;br /&gt;&lt;ul&gt;&lt;b&gt;Somay Nakhal on&amp;nbsp;Java Thread States&lt;/b&gt; - Somay gave a nice overview of thread lifecycles with code and some great diagrams. &amp;nbsp;I liked how he made this more applicable to the real world than the sort of book examples you get.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://twitter.com/#!/gedb"&gt;Ged Byrne&lt;/a&gt; on the shiny new&amp;nbsp;&lt;a href="http://ljcbookclub.wordpress.com/2011/10/11/coherence-3-5-book-review/"&gt;LJC Book Club&lt;/a&gt;&lt;/b&gt; - Ged reminded us how great it is to read an actual, paper book. &amp;nbsp;How committing to reading page by page forces you to learn in a different way to jumping around internet references that might not give you the context you need. &amp;nbsp;I thought this was a great presentation with humour, and I liked the way he challenged us to "expand our minds". &amp;nbsp;Although the actual book he was reviewing was &lt;a href="http://www.blogger.com/%3Ca%20href=%22http://www.amazon.com/gp/product/1847196128/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=trissramb-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399369&amp;amp;creativeASIN=1847196128%22%3EOracle%20Coherence%203.5%3C/a%3E%3Cimg%20src=%22http://www.assoc-amazon.com/e/ir?t=trissramb-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1847196128&amp;amp;camp=217145&amp;amp;creative=399369%22%20width=%221%22%20height=%221%22%20border=%220%22%20alt=%22%22%20style=%22border:none%20!important;%20margin:0px%20!important;%22%20/%3E"&gt;Oracle Coherence 3.5&lt;/a&gt;, I've decided I need to read &lt;a href="http://www.blogger.com/%3Ca%20href=%22http://www.amazon.com/gp/product/1456438786/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=trissramb-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399373&amp;amp;creativeASIN=1456438786%22%3EBeautiful%20Software%3C/a%3E%3Cimg%20src=%22http://www.assoc-amazon.com/e/ir?t=trissramb-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1456438786&amp;amp;camp=217145&amp;amp;creative=399373%22%20width=%221%22%20height=%221%22%20border=%220%22%20alt=%22%22%20style=%22border:none%20!important;%20margin:0px%20!important;%22%20/%3E"&gt;Beautiful Software&lt;/a&gt;, which Ged quoted at the end of the talk.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://vanillajava.blogspot.com/"&gt;Peter Lawrey&lt;/a&gt; on&amp;nbsp;Common Java Misconceptions&lt;/b&gt; - A session which plays well with what we're trying to preach when we talk about &lt;a href="http://gotocon.com/amsterdam-2011/presentation/Tackling%20the%20folklore%20surrounding%20high%20performance%20computing"&gt;Tackling Folklore&lt;/a&gt;. &amp;nbsp;He covered a few topics that are assumed to be "truth". &amp;nbsp;For example, dealing with garbage collection is not a &lt;i&gt;mandatory&lt;/i&gt; part of writing Java - you could write GC-friendly code for a start. &amp;nbsp;Also it's naive to assume the JDK is written in an efficient way, anyone who's actually dug around it for a while will realise that newer, more efficient methods of programming have not been applied to all areas of the (massive) existing code base. &amp;nbsp;I think it's great to have people out there talking about this stuff, it's too easy to make assumptions and take things for granted. &amp;nbsp;The most important thing he said: "If you're told something, don't just believe it - test it yourself first".&lt;/ul&gt;All of us (me, Mike and the lightning talk presenters) got such a great response it has encouraged us at the LJC to try and push for more real developers presenting their experiences. &amp;nbsp;We have a lot of great presentations from vendors, but what's more applicable to Java guys and girls across the board is other developers sharing the problems they're trying to solve and how they go about that process.&lt;br /&gt;&lt;br /&gt;I'm very much looking forward to presenting this again at JAX.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-7493354706885839093?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/7493354706885839093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/10/mike-and-i-debut-our-new-disruptor.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/7493354706885839093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/7493354706885839093'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/10/mike-and-i-debut-our-new-disruptor.html' title='Mike and I debut our new Disruptor presentation'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-1142580323506333269</id><published>2011-10-12T16:02:00.000+01:00</published><updated>2011-10-18T09:50:13.583+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opinion'/><category scheme='http://www.blogger.com/atom/ns#' term='disruptor'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaOne11'/><category scheme='http://www.blogger.com/atom/ns#' term='jcp'/><category scheme='http://www.blogger.com/atom/ns#' term='ljc'/><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>JavaOne 2011: Roundup</title><content type='html'>Having been back in London for a few days I've had some time to digest the madness that was last week.&lt;br /&gt;&lt;br /&gt;My lasting impression of JavaOne is almost entirely positive. &amp;nbsp;Granted, it was my first major conference, so maybe I'm just not jaded yet. &amp;nbsp;But let me tell you what I loved about it (yes, I did cover some of these in my &lt;a href="http://mechanitis.blogspot.com/2011/10/java-one-initial-observations.html"&gt;last post&lt;/a&gt;):&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-RlwrbbMeTWI/TpWq7Aw_7OI/AAAAAAAAIQ0/UiDjINFvXjo/s1600/bruno.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="219" src="http://1.bp.blogspot.com/-RlwrbbMeTWI/TpWq7Aw_7OI/AAAAAAAAIQ0/UiDjINFvXjo/s320/bruno.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;First and foremost, the people. &amp;nbsp;I don't remember meeting a single grumpy person. Everyone I spoke to was there to get the most out of the experience, regardless of how many times they'd been previously. &amp;nbsp;In my experience, techies are not conditioned to be socially comfortable, yet&amp;nbsp;introductions were made and&amp;nbsp;the conversations flowed easily.&lt;/li&gt;&lt;li&gt;Of course it wasn't just the attendees who were friendly, the staff and organisers were approachable and helpful, and it was nice to have people hanging around to direct you.&lt;/li&gt;&lt;li&gt;One of the (few) advantages of having the event over multiple hotels was the outdoor space between them. &amp;nbsp;It's unfortunate that it rained, &amp;nbsp;but I really liked being able to hang around outside. &amp;nbsp;I especially liked that they had provided power points for your laptop, so you didn't have to be cooped up indoors to update your blog. &amp;nbsp;I also thought that having to walk between the venues was good exercise, given I didn't make it to the gym last week. However I can see why people want to move the event back to one central location.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-UOsWpFnYjSw/TpWrGSgqheI/AAAAAAAAIQ8/Hx8nyX5S3uA/s1600/martijn.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-UOsWpFnYjSw/TpWrGSgqheI/AAAAAAAAIQ8/Hx8nyX5S3uA/s200/martijn.jpg" width="177" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;I personally found the sessions less useful than the networking. &amp;nbsp;I mostly attended the high-performance / concurrency sessions, but I probably should have been to ones about things I &lt;i&gt;didn't&lt;/i&gt; know (e.g. other JVM languages). &amp;nbsp;My favourite session was &lt;a href="http://martijnverburg.blogspot.com/"&gt;Martijn's&lt;/a&gt; Diabolical Developer session, but then I'm a fan of stand-up comedy. &amp;nbsp;&lt;/li&gt;&lt;li&gt;Another favourite was the &lt;a href="http://javaposse.com/"&gt;Java Posse&lt;/a&gt;&amp;nbsp;live podcast. &amp;nbsp;I'm ashamed to admit that I've never listened to one before (my excuse: I don't listen to podcasts at all because I don't have a long commute to work, which would be the ideal time). &amp;nbsp;I thought it was great how everyone felt like a part of the Java Posse and not a passive audience.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-8az7qiRldX8/TpWro5J2Z2I/AAAAAAAAIRM/fCD-liE8g9o/s1600/javaposse.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="214" src="http://4.bp.blogspot.com/-8az7qiRldX8/TpWro5J2Z2I/AAAAAAAAIRM/fCD-liE8g9o/s320/javaposse.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;I really felt that Oracle was trying its best to invoke the spirit of community. &amp;nbsp;Maybe that's because when I wasn't in sessions or having random conversations, I was in Java User Group or &lt;a href="http://jcp.org/en/home/index"&gt;Java Community Process&lt;/a&gt; events. &amp;nbsp;It seems pretty clear to me that the inclusion of &lt;a href="http://soujava.org.br/"&gt;SouJava&lt;/a&gt; and the &lt;a href="http://www.meetup.com/Londonjavacommunity/"&gt;London Java Community&lt;/a&gt; in the JCP EC has shaken things up a bit. &amp;nbsp;But then, I would say that - I'm biased. &amp;nbsp;But the vibe I was getting across the whole conference was that having the community involved in this key decision-making organisation is a step forward. &amp;nbsp;I would even go so far as to claim that it inspired a number of other players to seriously consider getting on board rather than complaining from the sidelines.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-vuIJB2I4Elo/TpWrcuMqwoI/AAAAAAAAIRE/M8Y6MkPZW6E/s1600/jduchess.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="145" src="http://4.bp.blogspot.com/-vuIJB2I4Elo/TpWrcuMqwoI/AAAAAAAAIRE/M8Y6MkPZW6E/s320/jduchess.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;On a related note, I really enjoyed the final &lt;a href="http://www.oracle.com/ocom/groups/systemobject/@mktg_admin/documents/webcontent/videoplayer-ocom.html?bctid=1176404830001&amp;amp;playerID=single-social&amp;amp;size=events"&gt;keynote on community&lt;/a&gt;. To me, that was an indication that Oracle takes our participation very seriously. &amp;nbsp;I liked that it was split into a lot of different interviews and panels, all quite short, which showcased the variety of the Java platform community. &amp;nbsp;I came out of that feeling pretty warm and fluffy about the future of our technology, and proud to be an active part of it.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Stuff I was not so bothered about:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Vendor keynotes. &amp;nbsp;Pretty dull to be honest. &amp;nbsp;I understand why they had them but after the first one I didn't turn up to any more.&lt;/li&gt;&lt;li&gt;The other bad points I already mentioned in the last post.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Personal highlights:&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-aovhDAhVoKI/TpWryE1AKMI/AAAAAAAAIRU/vnwMqPGquSQ/s1600/intro-to-disruptor.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="154" src="http://3.bp.blogspot.com/-aovhDAhVoKI/TpWryE1AKMI/AAAAAAAAIRU/vnwMqPGquSQ/s200/intro-to-disruptor.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Picking up the Duke's Choice Award (&lt;a href="http://www.oracle.com/ocom/groups/public/@ocom/documents/digitalasset/512339.jpg"&gt;video&lt;/a&gt;&amp;nbsp;- note: only seems to work in Firefox for me) for &lt;a href="http://code.google.com/p/disruptor/"&gt;the Disruptor&lt;/a&gt;. Yeah yeah, I'll shut up about it at some point, let me have my moment of glory.&lt;/li&gt;&lt;li&gt;Co-presenting a session on the Disruptor with &lt;a href="http://mechanical-sympathy.blogspot.com/"&gt;Martin&lt;/a&gt;. &amp;nbsp;He invited me to stand up with him when we realised I could go to the event, and I was terrified of the thought. &amp;nbsp;So I did it.&lt;/li&gt;&lt;li&gt;Meeting and being interviewed by the &lt;a href="http://jduchess.org/"&gt;JDuchess&lt;/a&gt; ladies. &amp;nbsp;The video doesn't seem to be available, so maybe I was rubbish, but it was a cool thing for me all the same.&lt;/li&gt;&lt;li&gt;Talking about the Disruptor for the &lt;a href="http://blogs.oracle.com/javaspotlight/entry/java_spotlight_episode_51_live"&gt;Java Spotlight Podcast&lt;/a&gt;&amp;nbsp;and the Oracle news guys (again, I can't find the content for this yet).&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;I had a really brilliant time, and would love to repeat the experience again as soon as possible!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-1142580323506333269?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/1142580323506333269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/10/javaone-2011-roundup.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/1142580323506333269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/1142580323506333269'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/10/javaone-2011-roundup.html' title='JavaOne 2011: Roundup'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-RlwrbbMeTWI/TpWq7Aw_7OI/AAAAAAAAIQ0/UiDjINFvXjo/s72-c/bruno.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-706660663945348521</id><published>2011-10-04T23:31:00.000+01:00</published><updated>2011-10-06T17:13:11.784+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='disruptor'/><category scheme='http://www.blogger.com/atom/ns#' term='lmax'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaOne11'/><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>JavaOne: Initial Observations</title><content type='html'>So I've been at JavaOne for the better part of three days, it's time to record some of my observations so far:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The wireless access is rubbish.&lt;/li&gt;&lt;li&gt;&amp;lt;Gross generalisation&amp;gt; technical people are not natural public speakers. &amp;nbsp;Makes me feel better about the presentations I'm going to be giving (see &lt;a href="http://www.meetup.com/Londonjavacommunity/events/32877942/"&gt;A Beginner's Guide to Hardcore Concurrency&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;The sessions are less useful than getting out and chatting. &amp;nbsp;I've had a really excellent time, I've met: people from other Java User Groups; the &lt;a href="http://jduchess.org/"&gt;Duchess&lt;/a&gt; girls; other Duke Award winners; the &lt;a href="http://www.azulsystems.com/"&gt;Azul&lt;/a&gt; guys; guys (well, girls) from O'Reilly books; JCP members and many random and awesome people.&lt;/li&gt;&lt;li&gt;Everyone thinks that Large is an acceptable default t-shirt size (it's not). &amp;nbsp;Vendors - if you're really serious about appealing to The Other Gender you need to stock XS, if not actual skinny tees.&lt;/li&gt;&lt;li&gt;If you're running a conference, you should probably have your projection screens &lt;i&gt;above&lt;/i&gt; the height of the audience members' heads&lt;/li&gt;&lt;li&gt;People at JavaOne are dead friendly. &amp;nbsp;I've ended up in a lot of conversations just by virtue of standing alone for longer than 30 seconds. &amp;nbsp;It is noticeably easier to talk to people here than at the conferences I've been attending in London. &amp;nbsp;Not sure if that's a location thing or a domain thing.&lt;/li&gt;&lt;li&gt;Socialising in London is &lt;a href="http://mechanitis.blogspot.com/2011/09/what-my-hangovers-can-teach-you-about.html"&gt;great practice&lt;/a&gt; for this sort of event. &amp;nbsp;I am capable of taking advantage of free drink and still maintaining a conversation and staying upright in 6 inch heels.&lt;/li&gt;&lt;li&gt;I miss American breakfasts. &amp;nbsp;I've been gorging myself on pancakes, biscuits and gravy, and eggs benedict. &amp;nbsp;I'll be calling my personal trainer as soon as I return.&lt;/li&gt;&lt;li&gt;Haven't seen anything to contradict my view that San Francisco is not the Brit's typical view of California - the weather is rubbish. &amp;nbsp;London has been hotter and sunnier this week.&lt;/li&gt;&lt;li&gt;Sharing an apartment with your CTO is not as weird as you might think. &amp;nbsp;Especially if you relegate him to the closet (no, that's not a euphemism).&lt;/li&gt;&lt;li&gt;It's difficult to remember to Tweet or blog when you're totally engrossed in conversations with people.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Here's a photo of me representing &lt;a href="http://www.lmaxtrader.co.uk/"&gt;LMAX&lt;/a&gt; as I pick up the &lt;a href="http://java.com/en/dukeschoice/index.jsp"&gt;Duke Award&lt;/a&gt; we won for the &lt;a href="http://code.google.com/p/disruptor/"&gt;Disruptor&lt;/a&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-z4fj8X89gh8/TouHpDgIy4I/AAAAAAAAIKs/v_3k_WC8rCU/s1600/duke.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="313" src="http://2.bp.blogspot.com/-z4fj8X89gh8/TouHpDgIy4I/AAAAAAAAIKs/v_3k_WC8rCU/s320/duke.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;(Thanks to &lt;a href="http://martijnverburg.blogspot.com/"&gt;Martijn&lt;/a&gt; for taking the photo).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I was grabbed for an interview which should be available (un-edited - erk!) on&amp;nbsp;&lt;a href="http://java.net/"&gt;java.net&lt;/a&gt;&amp;nbsp;at some point, I'll post it when it's available (if it's not rubbish).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-706660663945348521?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/706660663945348521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/10/java-one-initial-observations.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/706660663945348521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/706660663945348521'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/10/java-one-initial-observations.html' title='JavaOne: Initial Observations'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-z4fj8X89gh8/TouHpDgIy4I/AAAAAAAAIKs/v_3k_WC8rCU/s72-c/duke.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-1352949592277965777</id><published>2011-09-27T18:01:00.001+01:00</published><updated>2011-09-27T18:01:11.848+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lmax'/><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='ljc'/><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>JavaOne 2011</title><content type='html'>So, I'm off to &lt;a href="http://www.oracle.com/javaone/index.html"&gt;JavaOne&lt;/a&gt; next week!&lt;br /&gt;&lt;br /&gt;This is an unexpected and very pleasant surprise. &amp;nbsp;I'll be there with &lt;a href="http://mechanical-sympathy.blogspot.com/"&gt;Martin&lt;/a&gt; (of the &lt;a href="http://code.google.com/p/disruptor/"&gt;Disruptor&lt;/a&gt; fame), and &lt;a href="http://martijnverburg.blogspot.com/"&gt;Martijn&lt;/a&gt; (that's not going to get confusing at all). &amp;nbsp;Martin will be talking about the Disruptor on Thursday, and Martijn is busy talking about... everything. &amp;nbsp;Most importantly for the &lt;a href="http://www.meetup.com/Londonjavacommunity/"&gt;LJC&lt;/a&gt; he's representing us in our &lt;a href="http://mechanitis.blogspot.com/2011/05/london-java-community-elected-to-jcp.html"&gt;shiny new JCP Executive Committee&lt;/a&gt; role.&lt;br /&gt;&lt;br /&gt;I'm really looking forward to meeting pretty much anyone and everyone who'll talk to me. &amp;nbsp;It's the first international conference I've been to and I'm hoping to meet people I wouldn't normally get a chance to see in London. &amp;nbsp;It's also really cool to be able to represent both &lt;a href="http://www.lmaxtrader.co.uk/"&gt;LMAX&lt;/a&gt; and the London Java Community. Hopefully it won't lead to some sort of split personality syndrome.&lt;br /&gt;&lt;br /&gt;Almost more excitingly, I'll be doing a spot of shopping in New York on the way there and back. Because, well, it would be rude to fly over to the States and not drop in on my old home.&lt;br /&gt;&lt;br /&gt;Maybe I'll get a chance to catch up with some of you in one of those amazing cities...?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-1352949592277965777?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/1352949592277965777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/09/javaone-2011.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/1352949592277965777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/1352949592277965777'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/09/javaone-2011.html' title='JavaOne 2011'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-2828463604927115738</id><published>2011-09-23T21:05:00.000+01:00</published><updated>2011-09-23T21:10:50.550+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='jcp'/><category scheme='http://www.blogger.com/atom/ns#' term='ljc'/><title type='text'>First public appearance caught on video</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-287f97612eb2190a" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v13.nonxt5.googlevideo.com/videoplayback?id%3D287f97612eb2190a%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1334017555%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D36192D76F06C90BFE377AE737FBD6ABC0BFF12AB.1094DC0BA8CB7364FB65A7E88835C32AB3E33488%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D287f97612eb2190a%26offsetms%3D5000%26itag%3Dw160%26sigh%3DzHzyKS8xvdgfqY81PzOmfaF842E&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v13.nonxt5.googlevideo.com/videoplayback?id%3D287f97612eb2190a%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1334017555%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D36192D76F06C90BFE377AE737FBD6ABC0BFF12AB.1094DC0BA8CB7364FB65A7E88835C32AB3E33488%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D287f97612eb2190a%26offsetms%3D5000%26itag%3Dw160%26sigh%3DzHzyKS8xvdgfqY81PzOmfaF842E&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;Remember a while back I talked about &lt;a href="http://mechanitis.blogspot.com/2011/05/my-first-public-appearance.html"&gt;my first public appearance&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;Well, I chased down the video, because I'm masochistic, and here it is for you all to enjoy. &amp;nbsp;Pleasingly my mannerisms are slightly less of a camp man trapped in a woman's body, which was my impression the last time I saw myself presenting. &amp;nbsp;It helps that YouTube has made the video so dark you can't see me.&lt;br /&gt;&lt;br /&gt;Slides are &lt;a href="http://www.slideshare.net/trishagee/introduction-to-the-java-community-process"&gt;available for all to enjoy&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Special thanks to &lt;a href="http://www.playfish.com/"&gt;Playfish&lt;/a&gt; for hosting the event - as always, their hospitality was awesome. &amp;nbsp;The fact that they didn't serve wine is probably a Good Thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-2828463604927115738?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/2828463604927115738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/09/first-public-appearance-caught-on-video.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2828463604927115738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2828463604927115738'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/09/first-public-appearance-caught-on-video.html' title='First public appearance caught on video'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-3290866250225420196</id><published>2011-09-20T18:09:00.001+01:00</published><updated>2011-09-20T18:11:20.957+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='jobs'/><category scheme='http://www.blogger.com/atom/ns#' term='ddd'/><title type='text'>Are you an awesome developer?</title><content type='html'>&lt;a href="http://careers.stackoverflow.com/jobs/13468/java-developer-lmax?a=fUyRLfG"&gt;We are hiring&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;If you think we're &lt;a href="http://code.google.com/p/disruptor/"&gt;doing something interesting&lt;/a&gt;, or if you think you can help us do our thing &lt;i&gt;even better&lt;/i&gt;, come join us. &amp;nbsp;Your boss will be the dude who wrote &lt;a href="http://continuousdelivery.com/about/"&gt;Continuous Delivery&lt;/a&gt;, you'll get a chance to experience what &lt;a href="http://blog.codeaholics.org/"&gt;Danny&lt;/a&gt; calls meta-Agile (or Agile Agile), and you'll really start to care about &lt;a href="http://www.amazon.com/gp/product/0321125215/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=trissramb-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399377&amp;amp;creativeASIN=0321125215"&gt;Domain-Driven Design&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=trissramb-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0321125215&amp;amp;camp=217145&amp;amp;creative=399377" style="border: none !important; margin: 0px !important;" width="1" /&gt;.&lt;br /&gt;&lt;br /&gt;Ideally we're after Java people, but at the heart of it we want people who are dead passionate about development.&lt;br /&gt;&lt;br /&gt;Apply via the &lt;a href="http://careers.stackoverflow.com/jobs/13468/java-developer-lmax?a=fUyRLfG"&gt;Stack Overflow Careers advert&lt;/a&gt;&amp;nbsp;(you get extra brownie points if you mention my blog).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-3290866250225420196?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/3290866250225420196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/09/are-you-awesome-developer.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/3290866250225420196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/3290866250225420196'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/09/are-you-awesome-developer.html' title='Are you an awesome developer?'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-8097917445444158468</id><published>2011-09-17T15:53:00.000+01:00</published><updated>2011-09-18T10:46:40.702+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='cargo cultism'/><title type='text'>What my hangovers can teach you about Agile</title><content type='html'>As a survival trait for living and working in the cites&lt;sup&gt;1&lt;/sup&gt; of London, I have a set of rituals to avoid hangovers.  If you are not a single person living in a city like London, you might not understand how vital this is.  Most networking, particularly in the financial services industry, is done in the presence of alcohol.&lt;br /&gt;&lt;br /&gt;So preventing the inevitable hangover is quite important to the other part of the job – the actual working bit.  I'll let you into a secret and tell you my nightly ritual:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Floss and clean teeth (OK I'll admit, I barely floss when I'm sober let alone drunk)&lt;/li&gt;&lt;li&gt;Cleanse/tone/moisturise (I'm a rubbish girl, this is a very recent ritual for me)&lt;/li&gt;&lt;li&gt;Apply &lt;a href="http://www.sallyhansen.co.uk/products/diamond-cuticle-nail-cream"&gt;cuticle cream&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Do my calf stretches&lt;/li&gt;&lt;li&gt;Drink 500ml of water&lt;/li&gt;&lt;li&gt;Eat something, even if it's a dirty McDonalds (quarter pounder with cheese, no pickle no onion).&lt;/li&gt;&lt;/ul&gt;Prior to all this is the additional requirement “don't drink more than a bottle and a half of wine”.  Everyone has their limits, &lt;i&gt;lots&lt;/i&gt; of practice means I know full well what mine are.&lt;br /&gt;&lt;br /&gt;This actually works for me.  I won't claim to feel capable of being quite as high performance as the code I'm working on, but I won't feel like killing myself, and I will make it to the gym before work and do a whole day of productive coding.&lt;br /&gt;&lt;br /&gt;If you were trying to solve a similar problem (“no debilitating hangovers”), you might try and follow my rituals.  But you might decide that drinking the water was going to mean you had to go to the loo in the night, and strike that off the list.  You might be on a diet, so you don't have the food, thinking the alcohol is calories enough for the night.  And you'll follow everything else religiously, but still have hangovers.&lt;br /&gt;&lt;br /&gt;Or you might ignore the alcohol intake guidelines, thinking the stuff that you do at home to repair the damage should be enough, and drink 12 pints of&amp;nbsp;margaritas.  Or you might be the sort of person who can only get away with drinking a couple of glasses of wine / pints of beer, and follow my rules perfectly, but still feel like dying the next day.  &lt;br /&gt;&lt;br /&gt;And when this happens you'll look at my rituals and think "What a waste of time!  This person has no idea what they're talking about", and throw the whole lot out of the window and go back to doing waterfall development (oh wait, I'm getting ahead of myself).&lt;br /&gt;&lt;br /&gt;Or you'll do the bits that actually prevent the hangover (the water, the food, restricting alchol) and go around telling the interweb I have no idea what I'm talking about because the other stuff is a waste of time.&lt;br /&gt;&lt;br /&gt;The key point here is that this works for &lt;i&gt;me&lt;/i&gt;.  It's foolish of me to tell the world this will fix all their problems, and pointless for others to copy it without realising &lt;i&gt;why&lt;/i&gt; they're doing it.&lt;br /&gt;&lt;br /&gt;For example – why on Earth is “apply cuticle cream” on there? It doesn't actually fix the problem of dehydration due to excessive alcohol intake.  But it's important to me, because I need to make the time to do the whole ritual to get my brain into the right place for sleep.  It's also dead important for my subconscious – alcohol is basically abuse of my body, the beauty part of the regime is to remind my brain that its important to take care of myself too.  It doesn't fix the immediate issue of hangover the next day, but it aims to prevent future problems of drowning my sorrows in alcohol.  It's an important part of my Long Term Plan – these rituals need to be worked into the daily steps to lead eventually to World Domination.&lt;br /&gt;&lt;br /&gt;And calf stretches?  Well, I'm injured, have had shin splints for a million years.  If I want to run the Royal Parks Half Marathon in October, I need to stretch 3 times a day.  Doesn't matter if I'm drunk or not, it's not an excuse.  The half marathon is a very important longer-term goal.  But &lt;i&gt;you&lt;/i&gt; don't need to do it.  Well, unless you have the same issue.&lt;br /&gt;&lt;br /&gt;The important thing is that all of these rituals are tied to a goal. &amp;nbsp;But they're not the same goal:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Floss and clean teeth.  GOAL – don't get told off by the dentist.  Don't require fillings - costs money and not great for overall health.&lt;/li&gt;&lt;li&gt;Cleanse/tone/moisturise.  GOAL – prepare subconscious for sleep and remind brain that body needs love.&lt;/li&gt;&lt;li&gt;Apply cuticle cream.  GOAL –&amp;nbsp;prepare subconscious for sleep and remind brain that body needs love.&lt;/li&gt;&lt;li&gt;Do my calf stretches GOAL – Royal Parks Half Marathon&lt;/li&gt;&lt;li&gt;Drink 500ml of water GOAL – prevent Debilitating Hangover&lt;/li&gt;&lt;li&gt;Eat something, even if it's a dirty McDonalds GOAL – prevent Debilitating Hangover.&lt;/li&gt;&lt;/ul&gt;The thing here is that if I didn't do the stuff to aim towards longer-term goals, I might be more inclined to drink more out of boredom or despair, I might have worse hangovers in the future.&lt;br /&gt;&lt;br /&gt;To paraphrase Eddie Izzard “...and that's like &lt;strike&gt;our Lord Jesus&lt;/strike&gt; the agile process...”.  Agile, in whatever form you take it (actually all processes) is supposed to enable you as a team / organisation to work better.  Whichever cult you follow, there are practices designed to work for you to make you more productive.  But you do have to continuously improve, gather and act on feedback, and, most importantly, to know why you're doing what you're doing.  Otherwise it's just &lt;a href="http://en.wikipedia.org/wiki/Cargo_cult"&gt;cargo cultism&lt;/a&gt; – you look like you're doing everything, but the results just don't arrive.  I've worked for a &lt;a href="http://blogs.msdn.com/b/ericgu/archive/2006/10/13/scrumbut.aspx"&gt;scrum-but&lt;/a&gt; company – they had the cards, short iterations, invested customers. &amp;nbsp;But no single product owner, they never acted on the results of retrospectives, and most importantly the team didn't own the work they'd signed up to.  They also had a project manager who told people what they were doing.  This doesn't answer the question.  This is drinking 12 pints of scrumpy and&amp;nbsp;doing "cleanse/tone/moisturise",&amp;nbsp;and wondering why it still hurts.&lt;br /&gt;&lt;br /&gt;You have to understand the problem.&amp;nbsp;You can't blindly follow the stuff that you fancy, the stuff you find easy.  If it's easy, it's probably something you were already doing. &amp;nbsp;If you picked up agile to make a change to deliver more/better/faster, there is going to be some pain.  Because if what you were doing before was working, you'd carry on doing it.  So improvement is going to be &lt;i&gt;hard&lt;/i&gt;.  At first.&lt;br /&gt;&lt;br /&gt;The key is to stick with it, to check progress, to continuously improve.  To find what works for you.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt; Random fact of the day: London is &lt;a href="http://www.lightuplondon.com/london-facts/12040.html"&gt;actually two cities&lt;/a&gt;, the City of London and the City of Westminster. &amp;nbsp;But you probably already knew that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-8097917445444158468?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/8097917445444158468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/09/what-my-hangovers-can-teach-you-about.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/8097917445444158468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/8097917445444158468'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/09/what-my-hangovers-can-teach-you-about.html' title='What my hangovers can teach you about Agile'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>3</thr:total><georss:featurename>London W8, UK</georss:featurename><georss:point>51.50146 -0.1932625</georss:point><georss:box>51.4915755 -0.2130035 51.5113445 -0.1735215</georss:box></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-533873199170516661</id><published>2011-09-04T18:52:00.002+01:00</published><updated>2011-09-18T09:58:27.873+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='training'/><title type='text'>Effective Sketches</title><content type='html'>On Thursday I was at &lt;a href="http://www.codingthearchitecture.com/2011/09/02/effective_sketches_at_skills_matter.html"&gt;Simon Brown's Effective Sketches&lt;/a&gt; session at &lt;a href="http://skillsmatter.com/"&gt;Skillsmatter&lt;/a&gt;. &amp;nbsp;Just because my pictures are pretty awesome doesn't mean there's no opportunity for continuous learning.&lt;br /&gt;&lt;br /&gt;The points Simon made in the session really made sense to me, and I wish I could have had something like that as a primer when they taught us UML at university. &amp;nbsp;Without the context of what the diagrams were supposed to mean, to convey, all the boxes and lines made no sense to me back then. &amp;nbsp;I'm still not a fan of large chunks of UML because I think the convention sometimes gets in the way of real meaning.&lt;br /&gt;&lt;br /&gt;My take-away points were:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Don't try and squidge everything onto a single diagram. &amp;nbsp;The reason lots of different flavours of architecture diagrams exist (e.g. &lt;a href="http://www.codingthearchitecture.com/pages/book/logical-view.html"&gt;logical view&lt;/a&gt;, &lt;a href="http://www.codingthearchitecture.com/pages/book/infrastructure-view.html"&gt;infrastructure view&lt;/a&gt;, etc) is because you have different audiences for each of the diagrams and different things that are important when you're looking at it from one particular angle.&lt;/li&gt;&lt;li&gt;One diagram you particularly need, especially if you are producing a stack of documentation for a system (e.g. you're a consultant presenting findings to the client) is a really &lt;a href="http://www.codingthearchitecture.com/pages/book/context-view.html"&gt;succinct, summary view&lt;/a&gt; of what the system is actually trying to achieve.&lt;/li&gt;&lt;li&gt;If you're not going to use UML, you should at least agree on consistency and some conventions - for example, does the direction of an arrow represent data flow or dependency?&lt;/li&gt;&lt;li&gt;UML tools make it easier to represent different views of a data model and retain consistency. &amp;nbsp;One diagram is less likely to contradict a different view if your sketching tool points this mistake out to you.&lt;/li&gt;&lt;li&gt;Yes, your code should be self-documenting. &amp;nbsp;But you can't give the code to your business customers or expect your hardware guys to figure out your requirements from it. &amp;nbsp;To pass knowledge around the business it's more efficient to have diagrams representing the shared understanding of the domain.&lt;/li&gt;&lt;li&gt;Architecture diagrams should show the intent and the vision of the system.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;I also used my laptop to take notes for the first time. &amp;nbsp;In the past I've preferred not to use a laptop, because a) I like pencil and paper and it allows me to &lt;a href="https://picasaweb.google.com/lh/photo/phq_PRPQOYxViiz4Il6ONDDlgmlkuyHYOu3BaLXdFVg?feat=directlink"&gt;doodle&lt;/a&gt; and b) the temptation to read my e-mail or check facebook is not something I want to succumb to. &amp;nbsp;But &lt;a href="http://www.codingthearchitecture.com/2011/08/27/using_evernote_for_training_courses.html"&gt;using Evernote&lt;/a&gt; really worked for me, I could annotate the slides with my notes, and it made converting my notes into this post a lot easier.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PS it has not escaped me that this is one post without a diagram. &amp;nbsp;The irony is not lost on me.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-533873199170516661?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/533873199170516661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/09/effective-sketches.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/533873199170516661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/533873199170516661'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/09/effective-sketches.html' title='Effective Sketches'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-3959307774169998436</id><published>2011-08-30T10:18:00.002+01:00</published><updated>2011-08-30T10:32:56.853+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='disruptor'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Disruptor 2.0 - All Change Please</title><content type='html'>Martin recently &lt;a href="http://mechanical-sympathy.blogspot.com/2011/08/disruptor-20-released.html"&gt;announced version 2.0&lt;/a&gt; of &lt;a href="http://code.google.com/p/disruptor/"&gt;the Disruptor&lt;/a&gt;&amp;nbsp;- basically there have been so many changes since we first open-sourced it that it's time to mark that officially. &amp;nbsp;His post goes over all the changes, the aim of this article is to attempt to translate my previous blog posts into new-world-speak, since it's going to take a long time to re-write each of them all over again.  Now I see the disadvantage of hand-drawing everything.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;In the old world&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-R3vHFiqPCPo/TlvTk9cQEvI/AAAAAAAAIKA/1-o7vhoxGnQ/s1600/1P3C-Diamond-RingBuffer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="356" src="http://1.bp.blogspot.com/-R3vHFiqPCPo/TlvTk9cQEvI/AAAAAAAAIKA/1-o7vhoxGnQ/s640/1P3C-Diamond-RingBuffer.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This is an example of a configuration of the Disruptor (specifically a diamond configuration). &amp;nbsp;If none of this means anything to you, feel free to go back and refresh yourself on all the (now outdated) &lt;a href="http://mechanitis.blogspot.com/search/label/disruptor"&gt;Disruptor details&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The most obvious changes over the last few weeks have been:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Updated naming convention&lt;/li&gt;&lt;li&gt;Integrating the producer barrier into the ring buffer&lt;/li&gt;&lt;li&gt;Adding the &lt;a href="http://www.symphonious.net/2011/07/11/lmax-disruptor-high-performance-low-latency-and-simple-too/"&gt;Disruptor wizard&lt;/a&gt; into the main code base.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;The New World Order&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-4aCmflSb7Fs/TlvZ5z8BesI/AAAAAAAAIKE/kAXR_7Ly5FI/s1600/NewWorldOrder.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="219" src="http://2.bp.blogspot.com/-4aCmflSb7Fs/TlvZ5z8BesI/AAAAAAAAIKE/kAXR_7Ly5FI/s640/NewWorldOrder.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You'll see the fundamentals are pretty much the same. &amp;nbsp;It's simpler, because the &lt;code&gt;ProducerBarrier&lt;/code&gt; is no longer an entity in its own right - its replacement is the &lt;code&gt;PublishPort&lt;/code&gt; interface, which is implemented by the &lt;code&gt;RingBuffer&lt;/code&gt; itself.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Similarly the name &lt;code&gt;DependencyBarrier&lt;/code&gt; instead of &lt;code&gt;ConsumerBarrier&lt;/code&gt; clarifies the job of this object; &lt;code&gt;Publisher&lt;/code&gt; (instead of &lt;code&gt;Producer&lt;/code&gt;) and &lt;code&gt;EventProcessor&lt;/code&gt; instead of &lt;code&gt;Consumer&lt;/code&gt; also more accurately represent what these things do. &amp;nbsp;There was always a little confusion over the name &lt;code&gt;Consumer&lt;/code&gt;, since consumers never actually consumed anything from the ring buffer.  It was simply a term that we hoped would make sense to those who were used to queue implementations.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Not shown on the diagram is the name change of the items in the &lt;code&gt;RingBuffer&lt;/code&gt; - in the old world, we called this &lt;code&gt;Entry&lt;/code&gt;, now they're an &lt;code&gt;Event&lt;/code&gt;, hence &lt;code&gt;EventProcessor&lt;/code&gt; at the other end.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The aim of this wholesale rename has not been to completely discredit all my old blogs so I can continue blogging about the Disruptor &lt;i&gt;ad infinitum&lt;/i&gt;. This is far from what I want - I have other, more fluffy, things to write about. &amp;nbsp;The aim of the rename is to make it easier to understand how the Disruptor works and how to use it. Although &lt;a href="http://www.lmaxtrader.co.uk/"&gt;we&lt;/a&gt; use the Disruptor for event processing, when we open sourced it we wanted it to look like a general purpose solution, so the naming convention tried to represent that. &amp;nbsp;But in fact the event processing model does seem more intuitive.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;No more tedious wiring&lt;/b&gt;&lt;br /&gt;Now the &lt;a href="http://www.symphonious.net/2011/08/13/the-disruptor-wizard-is-dead-long-live-the-disruptor-wizard/"&gt;Disruptor wizard is part of the Disruptor&lt;/a&gt; itself, my whole &lt;a href="http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-wiring-up.html"&gt;post on wiring&lt;/a&gt; is pretty pointless - which is good, actually, because it was a little involved.&lt;br /&gt;&lt;br /&gt;These days, if you want to create the diamond pattern (for example the &lt;a href="http://code.google.com/p/disruptor/source/browse/trunk/code/src/perf/com/lmax/disruptor/DiamondPath1P3CPerfTest.java?r=294"&gt;FizzBuzz&lt;/a&gt; performance test), it's a lot simpler:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;pre&gt;DisruptorWizard dw = new DisruptorWizard&amp;lt;FizzBuzzEvent&amp;gt;(&lt;br /&gt;                         ENTRY_FACTORY, &lt;br /&gt;                         RING_BUFFER_SIZE, &lt;br /&gt;                         EXECUTOR,&lt;br /&gt;                         ClaimStrategy.Option.SINGLE_THREADED,&lt;br /&gt;                         WaitStrategy.Option.YIELDING);&lt;br /&gt;FizzBuzzEventHandler fizzHandler = &lt;br /&gt;                         new FizzBuzzEventHandler(FIZZ);&lt;br /&gt;FizzBuzzEventHandler buzzHandler = &lt;br /&gt;                         new FizzBuzzEventHandler(BUZZ);&lt;br /&gt;FizzBuzzEventHandler fizzBuzzHandler = &lt;br /&gt;                         new FizzBuzzEventHandler(FIZZ_BUZZ);&lt;br /&gt;&lt;br /&gt;dw.handleEventsWith(fizzHandler, buzzHandler)&lt;br /&gt;  .then(fizzBuzzHandler);&lt;br /&gt;&lt;br /&gt;RingBuffer ringBuffer = dw.start();&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Note there is a &lt;a href="http://code.google.com/p/disruptor/wiki/DisruptorWizard"&gt;Wiki page&lt;/a&gt; on the Disruptor Wizard.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Other changes: performance improvements&lt;/b&gt;&lt;br /&gt;As Martin mentions in &lt;a href="http://mechanical-sympathy.blogspot.com/2011/08/disruptor-20-released.html"&gt;his post&lt;/a&gt;, he's managed to significantly improve the performance (even more!) of the Disruptor in 2.0. &lt;br /&gt;&lt;br /&gt;The short version of this is that there is a shiny new class,&amp;nbsp;&lt;code&gt;Sequence&lt;/code&gt;, which both takes care of the &lt;a href="http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-why-its-so-fast_22.html"&gt;cache line padding&lt;/a&gt;, and removes the need for &lt;a href="http://mechanitis.blogspot.com/2011/08/dissecting-disruptor-why-its-so-fast.html"&gt;memory barriers&lt;/a&gt;. &amp;nbsp;The cache line padding is now done slightly differently because, bless Java 7's little cotton socks, it managed to "optimise" our old technique away.&lt;br /&gt;&lt;br /&gt;I'll leave you to read the details over there, in this post I just wanted to give a quick summary of the changes and explain why my old diagrams may no longer be correct.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-3959307774169998436?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/3959307774169998436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/08/disruptor-20-all-change-please.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/3959307774169998436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/3959307774169998436'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/08/disruptor-20-all-change-please.html' title='Disruptor 2.0 - All Change Please'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-R3vHFiqPCPo/TlvTk9cQEvI/AAAAAAAAIKA/1-o7vhoxGnQ/s72-c/1P3C-Diamond-RingBuffer.png' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-4976264809406226328</id><published>2011-08-13T10:17:00.000+01:00</published><updated>2011-08-13T10:17:41.355+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='london'/><category scheme='http://www.blogger.com/atom/ns#' term='photos'/><category scheme='http://www.blogger.com/atom/ns#' term='non-tech'/><title type='text'>What I Did On My Holidays</title><content type='html'>And now, a post for my long-neglected, less technical readers.&lt;br /&gt;&lt;br /&gt;I took a week off in July to try and avoid that Oh My God I Missed Summer Again feeling.  Granted, it's easy to get that in the UK even if you're not stuck in an office the entire time.&lt;br /&gt;&lt;br /&gt;Really this is just an excuse to post some photos on the blog.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-mOMqqFVCFi8/TkY2yVOPIiI/AAAAAAAAIJs/5vZHMmyqubk/s1600/Embankment.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="268" src="http://1.bp.blogspot.com/-mOMqqFVCFi8/TkY2yVOPIiI/AAAAAAAAIJs/5vZHMmyqubk/s400/Embankment.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Monday&lt;/b&gt;&lt;br /&gt;Hopped on the bike and explored from Kensington to Westminster.&lt;br /&gt;&lt;br /&gt;Felt distinctly smug when I grabbed my lunch from Victoria amongst all the less fortunate people who had to go back to their offices.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-WxvvRy0iE9w/TkY3P8gtp_I/AAAAAAAAIJw/qXE_1DbSUV4/s1600/Gull.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="267" src="http://3.bp.blogspot.com/-WxvvRy0iE9w/TkY3P8gtp_I/AAAAAAAAIJw/qXE_1DbSUV4/s400/Gull.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Tuesday&lt;/b&gt;&lt;br /&gt;Decided to dose up on Culture, and went to the &lt;a href="http://www.nationalgallery.org.uk/"&gt;National Gallery&lt;/a&gt;. &amp;nbsp;Last time I was there I was eight years old, and I distinctly remember admiring the frames more than the art.&lt;br /&gt;&lt;br /&gt;The rather&amp;nbsp;marvellous&amp;nbsp;&lt;a href="http://www.artfinder.com/"&gt;Artfinder&lt;/a&gt; makes up for the fact that you can't take photos inside the gallery - I can share most of the &lt;a href="http://www.artfinder.com/user/4229/collection/tuesday/public/"&gt;pieces that struck me&lt;/a&gt; when I was there.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-THH2_9dBQL8/TkY6P5ka5zI/AAAAAAAAIJ0/IHCur57_naA/s1600/Secret.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-THH2_9dBQL8/TkY6P5ka5zI/AAAAAAAAIJ0/IHCur57_naA/s400/Secret.jpg" width="267" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Wednesday&lt;/b&gt;&lt;br /&gt;Finally got around to embarking on one of the walks in &lt;a href="http://www.amazon.com/Secret-London-Exploring-Original-Unusual/dp/1566566363?ie=UTF8&amp;amp;tag=trissramb-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;Secret London&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=trissramb-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=1566566363" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt;. &amp;nbsp;I chose to do the City, from St Paul's, covering Bank, Monument and Liverpool St.&lt;br /&gt;&lt;br /&gt;It was&amp;nbsp;fascinating. I've worked in a lot of places round there, socialise there regularly, and have explored a number of the nooks and crannies. &amp;nbsp;But I was astounded at how many places I had never seen, alleys I had no idea existed, and gardens hidden away between modern office blocks.&lt;br /&gt;&lt;br /&gt;Highly recommended.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-WyWhmBr0Ay8/TkY7VjTQQRI/AAAAAAAAIJ4/5TJmXfQ_644/s1600/LondonBridge.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="267" src="http://3.bp.blogspot.com/-WyWhmBr0Ay8/TkY7VjTQQRI/AAAAAAAAIJ4/5TJmXfQ_644/s400/LondonBridge.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Thursday&lt;/b&gt;&lt;br /&gt;My parents dropped by and I racked my brain for a different way to explore this massive, old city. &amp;nbsp;And it came to me: using the artery of the city - the river. &amp;nbsp;So we took a boat to Greenwich.&lt;br /&gt;&lt;br /&gt;Where they were &lt;a href="http://www.wharf.co.uk/2011/07/batman-filming-in-greenwich.html"&gt;filming Batman&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And I didn't know until after we'd left.&lt;br /&gt;&lt;br /&gt;Gutted.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-WTSxxolJIlg/TkY7vahoneI/AAAAAAAAIJ8/VIteMVNt6Uo/s1600/Sky.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="267" src="http://1.bp.blogspot.com/-WTSxxolJIlg/TkY7vahoneI/AAAAAAAAIJ8/VIteMVNt6Uo/s400/Sky.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Friday&lt;/b&gt;&lt;br /&gt;The sun finally makes an appearance. I was going to write a blog post, but I refuse to be indoors on a sunny day if I can get outside for some Vitamin D production (and I hadn't bought my &lt;a href="http://store.apple.com/uk/browse/home/shop_mac/family/macbook_air"&gt;new shiny&lt;/a&gt; then).&lt;br /&gt;&lt;br /&gt;Sat in the park, sunbathed. &lt;br /&gt;&lt;br /&gt;Brilliant day.&lt;br /&gt;&lt;br /&gt;Brilliant week.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-4976264809406226328?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/4976264809406226328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/08/what-i-did-on-my-holidays.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/4976264809406226328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/4976264809406226328'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/08/what-i-did-on-my-holidays.html' title='What I Did On My Holidays'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-mOMqqFVCFi8/TkY2yVOPIiI/AAAAAAAAIJs/5vZHMmyqubk/s72-c/Embankment.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-4779725373579082285</id><published>2011-08-07T19:37:00.002+01:00</published><updated>2011-08-30T10:24:51.000+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='disruptor'/><category scheme='http://www.blogger.com/atom/ns#' term='lmax'/><category scheme='http://www.blogger.com/atom/ns#' term='mechanical sympathy'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Dissecting the Disruptor: Demystifying Memory Barriers</title><content type='html'>My recent slow-down in posting is because I've been trying to write a post explaining &lt;a href="http://en.wikipedia.org/wiki/Memory_barrier"&gt;memory barriers&lt;/a&gt; and their applicability in &lt;a href="http://code.google.com/p/disruptor"&gt;the Disruptor&lt;/a&gt;.  The problem is, no matter how much I read and no matter how many times I ask the ever-patient &lt;a href="http://mechanical-sympathy.blogspot.com/"&gt;Martin&lt;/a&gt; and &lt;a href="http://mikes-tech.blogspot.com/"&gt;Mike&lt;/a&gt; questions trying to clarify some point, I just don't intuitively grasp the subject.  I guess I don't have the deep background knowledge required to fully understand.&lt;br /&gt;&lt;br /&gt;So, rather than make an idiot of myself trying to explain something I don't really get, I'm going to try and cover, at an abstract / massive-simplification level, what I do understand in the area. &amp;nbsp;Martin has written a post&amp;nbsp;&lt;a href="http://mechanical-sympathy.blogspot.com/2011/07/memory-barriersfences.html"&gt;going into memory barriers&lt;/a&gt;&amp;nbsp;in some detail, so hopefully I can get away with skimming the subject.&lt;br /&gt;&lt;br /&gt;Disclaimer: any errors in the explanation are completely my own, and no reflection on the implementation of the Disruptor or on the &lt;a href="http://www.lmaxtrader.co.uk/"&gt;LMAX &lt;/a&gt;guys who actually do know about this stuff.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What's the point?&lt;/b&gt;&lt;br /&gt;My main aim in this series of blog posts is to explain how the Disruptor works and, to a slightly lesser extent, why.  In theory I should be able to provide a bridge between the code and &lt;a href="http://disruptor.googlecode.com/files/Disruptor-1.0.pdf"&gt;the technical paper&lt;/a&gt; by talking about it from the point of view of a developer who might want to use it.&lt;br /&gt;&lt;br /&gt;The paper mentioned memory barriers, and I wanted to understand what they were, and how they apply.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What's a Memory Barrier?&lt;/b&gt;&lt;br /&gt;It's a CPU instruction. &amp;nbsp;Yes, once again, we're thinking about CPU-level stuff in order to get the performance we need (Martin's famous Mechanical Sympathy). &amp;nbsp;Basically it's an instruction to a) ensure the order in which certain operations are executed and b) influence visibility of some data (which might be the result of executing some instruction).&lt;br /&gt;&lt;br /&gt;Compilers and CPUs can re-order instructions, provided the end result is the same, to try and optimise performance. &amp;nbsp;Inserting a memory barrier tells the CPU and the compiler that what happened before that command needs to stay before that command, and what happens after needs to stay after. &amp;nbsp;All similarities to a trip to Vegas are entirely in your own mind.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-wae8jx9Ehuw/Tjg5oFT5M7I/AAAAAAAAIJI/J00e1Fy42DU/s1600/MemoryBarrier.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-wae8jx9Ehuw/Tjg5oFT5M7I/AAAAAAAAIJI/J00e1Fy42DU/s1600/MemoryBarrier.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The other thing a memory barrier does is force an update of the various CPU caches - for example, a write barrier will flush all the data that was written before the barrier out to cache, therefore any other thread that tries to read that data will get the most up-to-date version regardless of which core or which socket it might be executing by.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What's this got to do with Java?&lt;/b&gt;&lt;br /&gt;Now I know what you're thinking - this isn't assembler. &amp;nbsp;It's Java. &lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;The magic incantation here is the word&amp;nbsp;&lt;code&gt;volatile&lt;/code&gt;&amp;nbsp;(something I felt was never clearly explained in the Java certification). &amp;nbsp;If your field is&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;volatile&lt;/span&gt;&lt;span class="Apple-style-span"&gt;, the Java Memory Model inserts a write barrier instruction after you write to it, and a read barrier instruction before you read from it.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-mdQ0VfzF_XM/TjhOOM4PBEI/AAAAAAAAIJQ/K25fNMkKufU/s1600/MemoryBarrierWrite.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-mdQ0VfzF_XM/TjhOOM4PBEI/AAAAAAAAIJQ/K25fNMkKufU/s1600/MemoryBarrierWrite.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;br /&gt;This means if you write to a volatile field, you know that:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Any thread accessing that field after the point at which you wrote to it will get the updated value&amp;nbsp;&lt;/li&gt;&lt;li&gt;Anything you did before you wrote that field is guaranteed to have happened and any updated data values will also be visible, because the memory barrier flushed all earlier writes to the cache.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;Example please!&lt;/b&gt;&lt;/div&gt;&lt;div&gt;So glad you asked. &amp;nbsp;It's about time I started drawing doughnuts again.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The&amp;nbsp;&lt;a href="http://code.google.com/p/disruptor/source/browse/trunk/code/src/main/com/lmax/disruptor/RingBuffer.java"&gt;RingBuffer&lt;/a&gt;&amp;nbsp;&lt;code&gt;cursor&lt;/code&gt; is one of these magic volatile thingies, and it's one of the reasons we can get away with implementing the Disruptor without locking.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-_JxCXwReRgA/TjhGfFrokHI/AAAAAAAAIJM/i_VC0M_K5hw/s1600/BarriersWriteExample.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="226" src="http://2.bp.blogspot.com/-_JxCXwReRgA/TjhGfFrokHI/AAAAAAAAIJM/i_VC0M_K5hw/s400/BarriersWriteExample.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Producer will obtain the next &lt;a href="http://code.google.com/p/disruptor/source/browse/trunk/code/src/main/com/lmax/disruptor/AbstractEntry.java?spec=svn109&amp;amp;r=201"&gt;Entry&lt;/a&gt; (or batch of them) and do whatever it needs to do to the entries, updating them with whatever values it wants to place in there. &amp;nbsp;&lt;a href="http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-writing-to-ring.html"&gt;As you know&lt;/a&gt;, at the end of all the changes the producer calls the commit method on the ring buffer, which updates the sequence number. &amp;nbsp;This write of the volatile field (&lt;code&gt;cursor&lt;/code&gt;) creates a memory barrier which ultimately brings all the caches up to date (or at least invalidates them accordingly). &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At this point, the consumers can get the updated sequence number (8), and because the memory barrier also guarantees the ordering of the instructions that happened before then, the consumers can be confident that all changes the producer did to to the &lt;a href="http://code.google.com/p/disruptor/source/browse/trunk/code/src/main/com/lmax/disruptor/AbstractEntry.java?spec=svn109&amp;amp;r=201"&gt;Entry&lt;/a&gt; at position 7 are also available.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;...and on the Consumer side?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;The sequence number on the Consumer is volatile, and read by a number of external objects - other &lt;a href="http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-wiring-up.html"&gt;downstream&lt;/a&gt; consumers might be tracking this consumer&lt;a href="http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-wiring-up.html"&gt;,&lt;/a&gt;&amp;nbsp;and&amp;nbsp;the &lt;a href="http://code.google.com/p/disruptor/source/browse/trunk/code/src/main/com/lmax/disruptor/ProducerBarrier.java?spec=svn109&amp;amp;r=201"&gt;ProducerBarrier&lt;/a&gt;/&lt;a href="http://code.google.com/p/disruptor/source/browse/trunk/code/src/main/com/lmax/disruptor/RingBuffer.java?spec=svn109&amp;amp;r=242"&gt;RingBuffer&lt;/a&gt; (depending on whether you're looking at older or newer code) tracks it to make sure the the ring doesn't wrap.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-qoKYeSC2_OM/Tj7HG5U6RaI/AAAAAAAAIJc/hnLVu3EL-kE/s1600/MemoryBarrierReadExample.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-qoKYeSC2_OM/Tj7HG5U6RaI/AAAAAAAAIJc/hnLVu3EL-kE/s1600/MemoryBarrierReadExample.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;So, if your downstream consumer (C2) sees that an earlier consumer (C1) reaches number 12, when C2 reads entries up to 12 from the ring buffer it will get all updates C1 made to the entries before it updated its sequence number.&lt;br /&gt;&lt;br /&gt;Basically everything that happens after C2 gets the updated sequence number (shown in blue above) must occur after everything C1 did to the ring buffer before updating its sequence number (shown in black).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Impact on performance&lt;/b&gt;&lt;br /&gt;Memory barriers, being another CPU-level instruction, don't have the same &lt;a href="http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-why-its-so-fast.html"&gt;cost as locks&lt;/a&gt;&amp;nbsp; - the kernel isn't interfering and arbitrating between multiple threads. &amp;nbsp;But&amp;nbsp;nothing comes for free. &amp;nbsp;Memory barriers do have a cost - the compiler/CPU cannot re-order instructions, which could potentially lead to not using the CPU as efficiently as possible, and refreshing the caches obviously has a performance impact. &amp;nbsp;So don't think that using volatile instead of locking will get you away scot free.&lt;br /&gt;&lt;br /&gt;You'll notice that the Disruptor implementation tries to read from and write to the sequence number as infrequently as possible. &amp;nbsp;Every read or write of a &lt;code&gt;volatile&lt;/code&gt; field is a relatively costly operation. However, recognising this also plays in quite nicely with batching behaviour - if you know you shouldn't read from or write to the sequences too frequently, it makes sense to grab a whole batch of Entries and process them before updating the sequence number, both on the Producer and Consumer side. Here's an example from &lt;a href="http://code.google.com/p/disruptor/source/browse/trunk/code/src/main/com/lmax/disruptor/BatchConsumer.java?r=239"&gt;BatchConsumer&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;table id="src_table_0" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre;"&gt;&lt;tbody style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;tr id="sl_svn239_121" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_122" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;long&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; nextSequence &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;b&gt;sequence &lt;/b&gt;&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;+&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;1&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_123" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;while&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;running&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_124" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;{&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_125" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;try&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_126" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;{&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_127" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;final&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;long&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; availableSequence &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; consumerBarrier&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;waitFor&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;nextSequence&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;);&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_128" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;while&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;nextSequence &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; availableSequence&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_129" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;{&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_130" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; entry &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; consumerBarrier&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;getEntry&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;nextSequence&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;);&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_131" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; handler&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;onAvailable&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;entry&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;);&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_132" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nextSequence&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;++;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_133" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;}&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_135" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; handler&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;onEndOfBatch&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;();&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_136" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;b&gt;sequence &lt;/b&gt;&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; entry&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;getSequence&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;();&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_137" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;}&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_138" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pln"&gt;&lt;span class="Apple-style-span" style="color: #000088;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_142" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;catch&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;final&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;Exception&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; ex&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_143" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;{&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_144" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exceptionHandler&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;handle&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;ex&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; entry&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;);&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_145" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;b&gt;sequence &lt;/b&gt;&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; entry&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;getSequence&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;();&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_146" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nextSequence &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; entry&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;getSequence&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;()&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;+&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;1&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_147" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;}&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn239_148" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;}&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;(You'll note this is the "old" code and naming conventions, because this is inline with my previous blog posts, I thought it was slightly less confusing than switching straight to the new conventions).&lt;br /&gt;&lt;br /&gt;In the code above, we use a local variable to increment during our loop over the entries the consumer is processing. &amp;nbsp;This means we read from and write to the volatile sequence field (shown in bold) as infrequently as we can get away with.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;In Summary&lt;/b&gt;&lt;br /&gt;Memory barriers are CPU instructions that allow you to make certain assumptions about when data will be visible to other processes. &amp;nbsp;In Java, you implement them with the &lt;code&gt;volatile&lt;/code&gt; keyword. &amp;nbsp;Using volatile means you don't necessarily have to add locks willy nilly, and will give you performance improvements over using them. &amp;nbsp;However you need to think a little more carefully about your design, in particular how frequently you use volatile fields, and how frequently you read and write them.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS Given that the &lt;a href="http://mechanitis.blogspot.com/2011/08/disruptor-20-all-change-please.html"&gt;New World Order&lt;/a&gt; in the Disruptor uses totally different naming conventions now to everything I've blogged about so far, I guess the next post is mapping the old world to the new one.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-4779725373579082285?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/4779725373579082285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/08/dissecting-disruptor-why-its-so-fast.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/4779725373579082285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/4779725373579082285'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/08/dissecting-disruptor-why-its-so-fast.html' title='Dissecting the Disruptor: Demystifying Memory Barriers'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-wae8jx9Ehuw/Tjg5oFT5M7I/AAAAAAAAIJI/J00e1Fy42DU/s72-c/MemoryBarrier.png' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-6303346494343166831</id><published>2011-07-22T16:42:00.001+01:00</published><updated>2011-08-02T19:20:54.389+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='disruptor'/><category scheme='http://www.blogger.com/atom/ns#' term='lmax'/><category scheme='http://www.blogger.com/atom/ns#' term='mechanical sympathy'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Dissecting the Disruptor: Why it's so fast (part two) - Magic cache line padding</title><content type='html'>We mention the phrase Mechanical Sympathy quite a lot, in fact it's even &lt;a href="http://mechanical-sympathy.blogspot.com/"&gt;Martin's blog title&lt;/a&gt;. &amp;nbsp;It's about understanding how the underlying hardware operates and programming in a way that works with that, not against it.&lt;br /&gt;&lt;br /&gt;We get a number of comments and questions about the mysterious cache line padding in the &lt;a href="http://code.google.com/p/disruptor/source/browse/trunk/code/src/main/com/lmax/disruptor/RingBuffer.java"&gt;RingBuffer&lt;/a&gt;, and I referred to it in the &lt;a href="http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-why-its-so-fast.html"&gt;last post&lt;/a&gt;. &amp;nbsp;Since this lends itself to pretty pictures, it's the next thing I thought I would tackle.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Comp Sci 101&lt;/b&gt;&lt;br /&gt;One of the things I love about working at &lt;a href="http://www.lmaxtrader.co.uk/"&gt;LMAX&lt;/a&gt; is all that stuff I learnt at university and in my A Level Computing actually means something. &amp;nbsp;So often as a developer you can get away with not understanding the CPU, data structures or &lt;a href="http://en.wikipedia.org/wiki/Big_O_notation"&gt;Big O notation&lt;/a&gt;&amp;nbsp;- I spent 10 years of my career forgetting all that. &amp;nbsp;But it turns out that if you do know about these things, and you apply that knowledge, you can come up with some very clever, very fast code.&lt;br /&gt;&lt;br /&gt;So, a refresher for those of us who studied this at school, and an intro for those who didn't. &amp;nbsp;Beware - this post contains massive over-simplifications.&lt;br /&gt;&lt;br /&gt;The CPU is the heart of your machine and the thing that ultimately has to do all the operations, executing your program. &amp;nbsp;Main memory (RAM) is where your data (including the lines of your program) lives. &amp;nbsp;We're going to ignore stuff like hard drives and networks here because &lt;a href="https://code.google.com/p/disruptor/"&gt;the Disruptor&lt;/a&gt; is aimed at running as much as possible in memory.&lt;br /&gt;&lt;br /&gt;The CPU has several layers of cache between it and main memory, because even accessing main memory is too slow. &amp;nbsp;If you're doing the same operation on a piece of data multiple times, it makes sense to load this into a place very close to the CPU when it's performing the operation (think a loop counter - you don't want to be going off to main memory to fetch this to increment it every time you loop around).&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-_rreUS6uUzs/TicrO8neu9I/AAAAAAAAIIs/1GVO_DbXcQo/s1600/CPUCache.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-_rreUS6uUzs/TicrO8neu9I/AAAAAAAAIIs/1GVO_DbXcQo/s400/CPUCache.png" width="298" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The closer the cache is to the CPU, the faster it is and the smaller it is. &amp;nbsp;L1 cache is small and very fast, and right next to the core that uses it. &amp;nbsp;L2 is bigger and slower, and still only used by a single core. &amp;nbsp;L3 is more common with modern multi-core machines, and is bigger again, slower again, and shared across cores on a single socket. &amp;nbsp;Finally you have main memory, which is shared across all cores and all sockets.&lt;br /&gt;&lt;br /&gt;When the CPU is performing an operation, it's first going to look in L1 for the data it needs, then L2, then L3, and finally if it's not in any of the caches the data needs to be fetched all the way from main memory. &amp;nbsp;The further it has to go, the longer the operation will take. &amp;nbsp;So if you're doing something very frequently, you want to make sure that data is in L1 cache.&lt;br /&gt;&lt;br /&gt;Martin and Mike's &lt;a href="http://www.infoq.com/presentations/LMAX"&gt;QCon presentation&lt;/a&gt; gives some indicative figures for the cost of cache misses:&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table style="text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;i&gt;Latency from CPU to...&lt;/i&gt;&lt;/td&gt;&lt;td style="padding-left: 5px; padding-right: 5px;"&gt;&lt;i&gt;Approx. number of&lt;br /&gt;CPU cycles&lt;/i&gt;&lt;/td&gt;&lt;td style="padding-left: 5px; padding-right: 5px;"&gt;&lt;i&gt;Approx. time &lt;br /&gt;in nanoseconds&lt;/i&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;Main memory&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;~60-80ns&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt;QPI transit&lt;br /&gt;(between sockets, not drawn)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;~20ns&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt;L3 cache&lt;/td&gt;&lt;td&gt;~40-45 cycles, &lt;/td&gt;&lt;td&gt;~15ns&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt;L2 cache&lt;/td&gt;&lt;td&gt;~10 cycles, &lt;/td&gt;&lt;td&gt;~3ns&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt;L1 cache&lt;/td&gt;&lt;td&gt;~3-4 cycles,&lt;/td&gt;&lt;td&gt;~1ns&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt;Register&lt;/td&gt;&lt;td&gt;1 cycle&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;If you're aiming for an end-to-end latency of something like 10 milliseconds, an 80 nanosecond trip to main memory to get some missing data is going to take a serious chunk of that.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Cache lines&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Now the interesting thing to note is that it's not individual items that get stored in the cache - i.e. it's not a single variable, a single pointer. &amp;nbsp;The cache is made up of cache lines, typically 64 bytes, and it effectively references a location in main memory. &amp;nbsp;A Java &lt;code&gt;long&lt;/code&gt; is 8 bytes, so in a single cache line you could have 8 &lt;code&gt;long&lt;/code&gt; variables.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/--A4eyU2Joec/TicxZW-yQoI/AAAAAAAAIIw/E40PtQOzMfE/s1600/CacheLines.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="301" src="http://4.bp.blogspot.com/--A4eyU2Joec/TicxZW-yQoI/AAAAAAAAIIw/E40PtQOzMfE/s400/CacheLines.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;(I'm going to ignore the multiple cache-levels for simplicity)&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;This is brilliant if you're accessing an array of longs - when one value from the array gets loaded into the cache, you get up to 7 more for free. &amp;nbsp;So you can walk that array very quickly. &amp;nbsp;In fact, you can iterate over any data structure that is allocated to contiguous blocks in memory very quickly. &amp;nbsp;I made a passing reference to this in the very &lt;a href="http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-whats-so-special.html"&gt;first post about the ring buffer&lt;/a&gt;, and it explains why we use an array for it.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;So if items in your data structure aren't sat next to each other in memory (linked lists, I'm looking at you) you don't get the advantage of freebie cache loading. &amp;nbsp;You could be getting a cache miss for every item in that data structure.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, there is a drawback to all this free loading. &amp;nbsp;Imagine your &lt;code&gt;long&lt;/code&gt; isn't part of an array. &amp;nbsp;Imagine it's just a single variable. &amp;nbsp;Let's call it &lt;code&gt;head&lt;/code&gt;, for no real reason. &amp;nbsp;Then imagine you have another variable in your class right next to it. &amp;nbsp;Let's arbitrarily call it &lt;code&gt;tail&lt;/code&gt;. &amp;nbsp;Now, when you load &lt;code&gt;head&lt;/code&gt; into your cache, you get &lt;code&gt;tail&lt;/code&gt; for free. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-4mwTYGoo99U/Tic141EFSgI/AAAAAAAAII0/Q2Y18D38iN0/s1600/FalseSharing.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-4mwTYGoo99U/Tic141EFSgI/AAAAAAAAII0/Q2Y18D38iN0/s400/FalseSharing.png" width="358" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Which sounds fine. &amp;nbsp;Until you realise that &lt;code&gt;tail&lt;/code&gt; is being written to by your producer, and &lt;code&gt;head&lt;/code&gt; is being written to by your consumer. &amp;nbsp;These two variables aren't actually closely associated, and in fact are going to be used by two different threads that might be running on two different cores.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ORwRPsgwzVI/Tic4MDC9SHI/AAAAAAAAII4/1bBv6awjOj0/s1600/FalseSharingWriteHead.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="375" src="http://4.bp.blogspot.com/-ORwRPsgwzVI/Tic4MDC9SHI/AAAAAAAAII4/1bBv6awjOj0/s400/FalseSharingWriteHead.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Imagine your consumer updates the value of &lt;code&gt;head&lt;/code&gt;. &amp;nbsp;The cache value is updated, the value in memory is updated, and any other cache lines that contain head are invalidated because other caches will not have the shiny new value. &amp;nbsp;And remember that we deal with the level of the whole line, we can't just mark &lt;code&gt;head&lt;/code&gt; as being invalid.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-jPntzX3pGao/Tic6xdP9uXI/AAAAAAAAII8/THPUBZrvgX8/s1600/FalseSharingReadTail.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="385" src="http://4.bp.blogspot.com/-jPntzX3pGao/Tic6xdP9uXI/AAAAAAAAII8/THPUBZrvgX8/s400/FalseSharingReadTail.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Now if some process running on the other core just wants to read the value of &lt;code&gt;tail&lt;/code&gt;, the whole cache line needs to be re-read from main memory. &amp;nbsp;So a thread which is nothing to do with your consumer is reading a value which is nothing to do with &lt;code&gt;head&lt;/code&gt;, and it's slowed down by a cache miss.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Of course this is even worse if two separate threads are writing to the two different values.  Both cores are going to be invalidating the cache line on the other core and having to re-read it every time the other thread has written to it.  You've basically got write-contention between the two threads even though they're writing to two different variables.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;This is called &lt;a href="http://en.wikipedia.org/wiki/False_sharing"&gt;false sharing&lt;/a&gt;, because every time you access &lt;code&gt;head&lt;/code&gt; you get &lt;code&gt;tail&lt;/code&gt; too, and every time you access &lt;code&gt;tail&lt;/code&gt;, you get &lt;code&gt;head&lt;/code&gt; as well. &amp;nbsp;All this is happening under the covers, and no compiler warning is going to tell you that you just wrote code that's going to be very inefficient for concurrent access.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;Our solution - magic cache line padding&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;You'll see that the Disruptor eliminates this problem, at least for architecture that has a cache size of 64 bytes or less, by adding padding to ensure the ring buffer's sequence number is never in a cache line with anything else.&lt;/div&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; white-space: pre;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;table id="src_table_0" style="border-collapse: collapse; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left;"&gt;&lt;tbody style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;tr id="sl_svn234_33" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="kwd" style="color: #000088;"&gt;    public&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;long&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; p1&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; p2&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; p3&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; p4&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; p5&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; p6&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; p7&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="com" style="color: #880000;"&gt;// cache line padding&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn234_34" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;private&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;volatile&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;long&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; cursor &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; INITIAL_CURSOR_VALUE&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn234_35" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;public&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;long&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; p8&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; p9&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; p10&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; p11&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; p12&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; p13&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; p14&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="com" style="color: #880000;"&gt;// cache line padding&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;So there's no false sharing, no unintended contention with any other variables, no needless cache misses.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;It's worth doing this on your &lt;code&gt;Entry&lt;/code&gt; classes too - if you have different consumers writing to different fields, you're going to need to make sure there's no false sharing between each of the fields.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;EDIT: Martin wrote a more technically correct and detailed &lt;a href="http://mechanical-sympathy.blogspot.com/2011/07/false-sharing.html"&gt;post about false sharing&lt;/a&gt;, and posted performance results too.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-6303346494343166831?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/6303346494343166831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-why-its-so-fast_22.html#comment-form' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/6303346494343166831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/6303346494343166831'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-why-its-so-fast_22.html' title='Dissecting the Disruptor: Why it&apos;s so fast (part two) - Magic cache line padding'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-_rreUS6uUzs/TicrO8neu9I/AAAAAAAAIIs/1GVO_DbXcQo/s72-c/CPUCache.png' height='72' width='72'/><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-2518766996904244035</id><published>2011-07-16T16:36:00.003+01:00</published><updated>2011-08-30T10:26:59.007+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='disruptor'/><category scheme='http://www.blogger.com/atom/ns#' term='lmax'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Dissecting the Disruptor: Why it's so fast (part one) - Locks Are Bad</title><content type='html'>Martin Fowler has written a &lt;a href="http://martinfowler.com/articles/lmax.html"&gt;&lt;span id="goog_1736243820"&gt;&lt;/span&gt;really good article&lt;span id="goog_1736243821"&gt;&lt;/span&gt;&lt;/a&gt; describing not only &lt;a href="http://code.google.com/p/disruptor/"&gt;the Disruptor&lt;/a&gt;, but also how it fits into the architecture at &lt;a href="http://www.lmaxtrader.co.uk/"&gt;LMAX&lt;/a&gt;. &amp;nbsp;This gives some of the context that has been missing so far, but the most frequently asked question is still "What is the Disruptor?".&lt;br /&gt;&lt;br /&gt;I'm working up to answering that. &amp;nbsp;I'm currently on question number two: "Why is it so fast?".&lt;br /&gt;&lt;br /&gt;These questions do go hand in hand, however, because I can't talk about why it's fast without saying what it does, and I can't talk about what it is without saying why it is that way.&lt;br /&gt;&lt;br /&gt;So I'm trapped in a circular dependency. &amp;nbsp;A circular dependency of blogging.&lt;br /&gt;&lt;br /&gt;To break the dependency, I'm going to answer question one with the simplest answer, and with any luck I'll come back to it in a later post if it still needs explanation:&amp;nbsp;the Disruptor is a way to pass information between threads.&lt;br /&gt;&lt;br /&gt;As a developer, already my alarm bells are going off because the word "thread" was just mentioned, which means this is about concurrency, and Concurrency Is Hard.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Concurrency 101&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-jFd0nHVAUzA/Th6pstBr8rI/AAAAAAAAIH4/_eCHINrgH50/s1600/ThreadContention.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="231" src="http://3.bp.blogspot.com/-jFd0nHVAUzA/Th6pstBr8rI/AAAAAAAAIH4/_eCHINrgH50/s400/ThreadContention.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Imagine two threads are trying to change the same value. &lt;br /&gt;&lt;br /&gt;&lt;i&gt;Case One:&lt;/i&gt; Thread 1 gets there first:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The value changes to "blah"&lt;/li&gt;&lt;li&gt;Then the value changes to "blahy" when Thread 2 gets there.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;i&gt;Case Two:&lt;/i&gt; Thread 2 gets there first:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;The value changes to "fluffy"&lt;/li&gt;&lt;li&gt;Then the value changes to "blah" when Thread 1 gets there.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;i&gt;Case Three:&lt;/i&gt; Thread 1 interrupts Thread 2:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Thread 2 gets the value "fluff" and stores it as &lt;code&gt;myValue&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Thread 1 goes in and updates value to "blah"&lt;/li&gt;&lt;li&gt;Then Thread 2 wakes up and sets the value to "fluffy".&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Case Three is probably the only one which is definitely wrong, unless you think the naive approach to wiki editing is OK (&lt;a href="http://code.google.com/"&gt;Google Code&lt;/a&gt; Wiki, I'm looking at you...). &amp;nbsp;In the other two cases it's all about intentions and predictability. &amp;nbsp;Thread 2 might not care what's in &lt;code&gt;value&lt;/code&gt;, the intention might be to append "y" to whatever is in there regardless. &amp;nbsp;In this circumstance, cases one and two are both correct.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;But if Thread 2 only wanted to change "fluff" to "fluffy", then both cases two and three are incorrect.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Assuming that Thread 2 wants to set the value to "fluffy", there are some different approaches to solving the problem.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Approach One: Pessimistic locking&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-2A7ebRJ1z5g/Th6t4t2AO8I/AAAAAAAAIH8/gAYXlVq86-s/s1600/ConcurrencyPessimisticLocking.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="257" src="http://4.bp.blogspot.com/-2A7ebRJ1z5g/Th6t4t2AO8I/AAAAAAAAIH8/gAYXlVq86-s/s400/ConcurrencyPessimisticLocking.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;(Does the "No Entry" sign make sense to people who don't drive in Britain?)&lt;br /&gt;&lt;br /&gt;The terms pessimistic and optimistic locking seem to be more commonly used when talking about database reads and writes, but the principal applies to getting a lock on an object.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Thread 2 grabs a lock on &lt;code&gt;Entry&lt;/code&gt; as soon as it knows it needs it and stops anything from setting it. Then it does its thing, sets the value, and lets everything else carry on.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;You can imagine this gets quite expensive, with threads hanging around all over the place trying to get hold of objects and being blocked. &amp;nbsp;The more threads you have, the more chance that things are going to grind to a halt.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Approach Two: Optimistic locking&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-MC3Zia0u-LI/TiGrA4AEKKI/AAAAAAAAIIo/7q-x9sSJYR4/s1600/ConcurrencyOptimisticLocking.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="252" src="http://2.bp.blogspot.com/-MC3Zia0u-LI/TiGrA4AEKKI/AAAAAAAAIIo/7q-x9sSJYR4/s400/ConcurrencyOptimisticLocking.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;In this case Thread 2 will only lock &lt;code&gt;Entry&lt;/code&gt; when it needs to write to it. &amp;nbsp;In order to make this work, it needs to check if &lt;code&gt;Entry&lt;/code&gt; has changed since it first looked at it. &amp;nbsp;If Thread 1 came in and changed the value to "blah" after Thread 2 had read the value, Thread 2 couldn't write "fluffy" to the &lt;code&gt;Entry&lt;/code&gt; and trample all over the change from Thread 1. &amp;nbsp;Thread 2 could either re-try (go back, read the value, and append "y" onto the end of the new value), which you would do if Thread 2 didn't care what the value it was changing was; or it could throw an exception or return some sort of failed update flag if it was expecting to change "fluff" to "fluffy". &amp;nbsp;An example of this latter case might be if you have two users trying to update a Wiki page, and you tell the user on the other end of Thread 2 they'll need to load the new changes from Thread 1 and then reapply their changes.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Potential Problem: Deadlock&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Locking can lead to all sorts of issues, for example deadlock. &amp;nbsp;Imagine two threads that need access to two resources to do whatever they need to do:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-sDyHhoLnwxw/Th60id1KUEI/AAAAAAAAIIE/_ru21J5fklI/s1600/ConcurrencyDeadlock.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-sDyHhoLnwxw/Th60id1KUEI/AAAAAAAAIIE/_ru21J5fklI/s400/ConcurrencyDeadlock.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;If you've used an over-zealous locking technique, both threads are going to sit there forever waiting for the other one to release its lock on the resource. &amp;nbsp;That's when you reboot &lt;strike&gt;Windows&lt;/strike&gt; your computer.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Definite Problem: Locks are sloooow...&lt;/b&gt;&lt;br /&gt;The thing about locks is that they need the operating system to arbitrate the argument. &amp;nbsp;The threads are like siblings squabbling over a toy, and the OS kernel is the parent that decides which one gets it. It's like when you run to your Dad to tell him your sister has nicked the &lt;a href="http://www.amazon.com/Transformers-Power-Bots-Optimus-Prime/dp/B003A6CK0O?ie=UTF8&amp;amp;tag=trissramb-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;Transformer&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=trissramb-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=B003A6CK0O" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt; when you wanted to play with it - he's got bigger things to worry about than you two fighting, and he might finish off loading the dishwasher and putting on the laundry before settling the argument. &amp;nbsp;If you draw attention to yourself with a lock, not only does it take time to get the operating system to arbitrate, the OS might decide the CPU has better things to do than servicing your thread.&lt;br /&gt;&lt;br /&gt;The Disruptor paper talks about an experiment we did. &amp;nbsp;The test calls a function incrementing a 64-bit counter in a loop 500 million times. &amp;nbsp;For a single thread with no locking, the test takes 300ms. &amp;nbsp;If you add a lock (and this is for a single thread, no contention, and no additional complexity other than the lock) the test takes&amp;nbsp;10,000ms. &amp;nbsp;That's, like, two orders of magnitude slower. &amp;nbsp;Even more astounding, if you add a second thread (which logic suggests should take maybe half the time of the single thread with a lock) it takes&amp;nbsp;224,000ms. &amp;nbsp;Incrementing a counter 500 million times takes nearly a &lt;i&gt;thousand &lt;/i&gt;times longer when you split it over two threads instead of running it on one with no lock.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Concurrency Is Hard and Locks Are Bad&lt;/b&gt;&lt;br /&gt;I'm just touching the surface of the problem, and obviously I'm using very simple examples. &amp;nbsp;But the point is, if your code is meant to work in a multi-threaded environment, your job as a developer just got a lot more difficult:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Naive code can have unintended consequences.&lt;/b&gt;&amp;nbsp; Case Three above is an example of how things can go horribly wrong if you don't realise you have multiple threads accessing and writing to the same data.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Selfish code is going to slow your system down.&lt;/b&gt;&amp;nbsp; Using locks to protect your code from the problem in Case Three can lead to things like deadlock or simply poor performance.&lt;/li&gt;&lt;/ul&gt;This is why many organisations have some sort of concurrency problems in their interview process (certainly for Java interviews). &amp;nbsp;Unfortunately it's very easy to learn how to answer the questions without really understanding the problem, or possible solutions to it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How does the Disruptor address these issues?&lt;/b&gt;&lt;br /&gt;For a start, it doesn't use locks. &amp;nbsp;At all.&lt;br /&gt;&lt;br /&gt;Instead, where we need to make sure that operations are thread-safe (specifically, updating the next available sequence number in the case of &lt;a href="http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-writing-to-ring.html"&gt;multiple producers&lt;/a&gt;), we use a &lt;a href="http://en.wikipedia.org/wiki/Compare-and-swap"&gt;CAS &lt;/a&gt;(Compare And Swap/Set) operation. &amp;nbsp;This is a CPU-level instruction, and in my mind it works a bit like optimistic locking - the CPU goes to update a value, but if the value it's changing it from is not the one it expects, the operation fails because clearly something else got in there first.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-j7wPAJe3YuE/TiFBp0XCn6I/AAAAAAAAIIM/FrketUYEsFY/s1600/ConcurrencyCAS.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="170" src="http://4.bp.blogspot.com/-j7wPAJe3YuE/TiFBp0XCn6I/AAAAAAAAIIM/FrketUYEsFY/s320/ConcurrencyCAS.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Note this could be two different cores rather than two separate CPUs.&lt;br /&gt;&lt;br /&gt;CAS operations are much cheaper than locks because they don't involve the operating system, they go straight to the CPU. &amp;nbsp;But they're not cost-free - in the experiment I mentioned above, where a lock-free thread takes 300ms and a thread with a lock takes 10,000ms, a single thread using CAS takes 5,700ms. &amp;nbsp;So it takes less time than using a lock, but more time than a single thread that doesn't worry about contention at all.&lt;br /&gt;&lt;br /&gt;Back to the Disruptor - I talked about the &lt;a href="http://code.google.com/p/disruptor/source/browse/trunk/code/src/main/com/lmax/disruptor/ClaimStrategy.java"&gt;ClaimStrategy&lt;/a&gt; when I &lt;a href="http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-writing-to-ring.html"&gt;went over the producers&lt;/a&gt;. &amp;nbsp;In the code you'll see two strategies, a &lt;code&gt;SingleThreadedStrategy&lt;/code&gt; and a &lt;code&gt;MultiThreadedStrategy&lt;/code&gt;. &amp;nbsp;You could argue, why not just use the multi-threaded one with only a single producer? &amp;nbsp;Surely it can handle that case? &amp;nbsp;And it can. &amp;nbsp;But the multi-threaded one uses an &lt;a href="http://download.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicLong.html"&gt;AtomicLong&lt;/a&gt; (Java's way of providing CAS operations), and the single-threaded one uses a simple long with no locks and no CAS. &amp;nbsp;This means the single-threaded claim strategy is as fast as possible, given that it knows there is only one producer and therefore no contention on the sequence number.&lt;br /&gt;&lt;br /&gt;I know what you're thinking: turning one single number into an AtomicLong can't possibly have been the only thing that is the secret to the Disruptor's speed. And of course, it's not - otherwise this wouldn't be called "Why it's so fast (part &lt;i&gt;one&lt;/i&gt;)".&lt;br /&gt;&lt;br /&gt;But this is an important point - there's only one place in the code where multiple threads might be trying to update the same value. &amp;nbsp;Only one place in the whole of this complicated data-structure-slash-framework. &amp;nbsp;And that's the secret. &amp;nbsp;Remember everything has its own sequence number? &amp;nbsp;If you only have one producer then every sequence number in the system is only ever written to by one thread. That means there is no contention. &amp;nbsp;No need for locks. &amp;nbsp;No need even for CAS. &amp;nbsp;The only sequence number that is ever written to by more than one thread is the one on the &lt;code&gt;ClaimStrategy&lt;/code&gt; if there is more than one producer.&lt;br /&gt;&lt;br /&gt;This is also why each variable in the &lt;code&gt;Entry&lt;/code&gt; &lt;a href="http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-wiring-up.html"&gt;can only be written to by one consumer&lt;/a&gt;. &amp;nbsp;It ensures there's no write contention, therefore no need for locks or CAS.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Back to why queues aren't up to the job&lt;/b&gt;&lt;br /&gt;So you start to see why queues, which may implemented as a ring buffer under the covers, still can't match the performance of the Disruptor. &amp;nbsp;The queue, and the&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Circular_buffer"&gt;basic ring buffer&lt;/a&gt;, only has two pointers - one to the front of the queue and one to the end:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-9yewqxZu37M/TiGdFiaCj6I/AAAAAAAAIIU/bF4fxONwB_8/s1600/QueueMultiple.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="130" src="http://4.bp.blogspot.com/-9yewqxZu37M/TiGdFiaCj6I/AAAAAAAAIIU/bF4fxONwB_8/s400/QueueMultiple.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If more than one producer wants to place something on the queue, the tail pointer will be a point of contention as more than one thing wants to write to it. &amp;nbsp;If there's more than one consumer, then the head pointer is contended, because this is not just a read operation but a write, as the pointer is updated when the item is consumed from the queue.&lt;br /&gt;&lt;br /&gt;But wait, I hear you cry foul! &amp;nbsp;Because we already knew this, so queues are usually single producer and single consumer (or at least they are in all the queue comparisons in our performance tests).&lt;br /&gt;&lt;br /&gt;There's another thing to bear in mind with queues/buffers. &amp;nbsp;The whole point is to provide a place for things to hang out between producers and consumers, to help buffer bursts of messages from one to the other. &amp;nbsp;This means the buffer is usually full (the producer is out-pacing the consumer) or empty (the consumer is out-pacing the producer). &amp;nbsp;It's rare that the producer and consumer will be so evenly-matched that the buffer has items in it but the producers and consumers are keeping pace with each other.&lt;br /&gt;&lt;br /&gt;So this is how things really look. &amp;nbsp;An empty queue:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-_-lU_Ey7mi4/TiGmx5Ja2jI/AAAAAAAAIIg/gQOZ8f76mLM/s1600/QueueEmpty.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="173" src="http://1.bp.blogspot.com/-_-lU_Ey7mi4/TiGmx5Ja2jI/AAAAAAAAIIg/gQOZ8f76mLM/s400/QueueEmpty.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;...and a full queue:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ARPMAbYKnoE/TiGm4hgxeDI/AAAAAAAAIIk/xMl4ItVob2U/s1600/QueueFull.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="178" src="http://3.bp.blogspot.com/-ARPMAbYKnoE/TiGm4hgxeDI/AAAAAAAAIIk/xMl4ItVob2U/s400/QueueFull.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;The queue needs a size so that it can tell the difference between empty and full. &amp;nbsp;Or, if it doesn't, it might determine that based on the contents of that entry, in which case reading an entry will require a write to erase it or mark it as consumed. &lt;br /&gt;&lt;br /&gt;Whichever implementation is chosen, there's quite a bit of contention around the tail, head and size variables, or the entry itself if a consume operation also includes a write to remove it.&lt;br /&gt;&lt;br /&gt;On top of this, these three variables are often in the same &lt;a href="http://en.wikipedia.org/wiki/CPU_cache"&gt;cache line&lt;/a&gt;, leading to &lt;a href="http://en.wikipedia.org/wiki/False_sharing"&gt;false sharing&lt;/a&gt;. &amp;nbsp;So, not only do you have to worry about the producer and the consumer both causing a write to the size variable (or the entry), updating the tail pointer could lead to a cache-miss when the head pointer is updated because they're sat in the same place. &amp;nbsp;I'm going to duck out of going into that in detail because this post is quite long enough as it is.&lt;br /&gt;&lt;br /&gt;So this is what we mean when we talk about "Teasing Apart the Concerns" or a queue's "conflated concerns". &amp;nbsp;By giving everything its own sequence number and by allowing only one consumer to write to each variable in the &lt;code&gt;Entry&lt;/code&gt;, the only case the Disruptor needs to manage contention is where more than one producer is writing to the ring buffer.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;In summary&lt;/b&gt;&lt;br /&gt;The Disruptor a number of advantages over traditional approaches:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;No contention = no locks = it's very fast.&lt;/li&gt;&lt;li&gt;Having everything track its own sequence number allows multiple producers and multiple consumers to use the same data structure.&lt;/li&gt;&lt;li&gt;Tracking sequence numbers at each individual place (ring buffer, claim strategy, producers and consumers), plus the &lt;a href="http://code.google.com/p/disruptor/source/browse/trunk/code/src/main/com/lmax/disruptor/RingBuffer.java"&gt;magic cache line padding&lt;/a&gt;, means no false sharing and no unexpected contention.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;EDIT: Note that version 2.0 of the Disruptor uses different names to the ones in this article. &amp;nbsp;Please see &lt;a href="http://mechanitis.blogspot.com/2011/08/disruptor-20-all-change-please.html"&gt;my summary of the changes&lt;/a&gt; if you are confused about class names.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-2518766996904244035?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/2518766996904244035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-why-its-so-fast.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2518766996904244035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2518766996904244035'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-why-its-so-fast.html' title='Dissecting the Disruptor: Why it&apos;s so fast (part one) - Locks Are Bad'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-jFd0nHVAUzA/Th6pstBr8rI/AAAAAAAAIH4/_eCHINrgH50/s72-c/ThreadContention.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-8405358707462665737</id><published>2011-07-12T18:41:00.000+01:00</published><updated>2011-07-12T18:41:53.433+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gender'/><category scheme='http://www.blogger.com/atom/ns#' term='photos'/><title type='text'>In answer to one of the search terms which led to my blog...</title><content type='html'>..."&lt;span class="Apple-style-span" style="color: #333333; font-family: 'trebuchet ms', verdana, arial, sans-serif; font-size: 13px; line-height: 19px; white-space: nowrap;"&gt;what do female programmers look like":&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'trebuchet ms', verdana, arial, sans-serif; font-size: 13px; line-height: 19px; white-space: nowrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-JCg_zObpzy0/ThyGOeFES3I/AAAAAAAAIHY/ddfmvbsDtgM/s1600/DSC_0137.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-JCg_zObpzy0/ThyGOeFES3I/AAAAAAAAIHY/ddfmvbsDtgM/s320/DSC_0137.jpg" width="214" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Well, sometimes...&lt;br /&gt;&lt;br /&gt;If there are any girl programmers out there who are interested in being part of a montage showing who we are, I'd be dead (see what I did there...?) interested in putting us all on one page. &amp;nbsp;And not just because I'm narcissistic. Although that helps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-8405358707462665737?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/8405358707462665737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/07/in-answer-to-one-of-search-terms-which.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/8405358707462665737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/8405358707462665737'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/07/in-answer-to-one-of-search-terms-which.html' title='In answer to one of the search terms which led to my blog...'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-JCg_zObpzy0/ThyGOeFES3I/AAAAAAAAIHY/ddfmvbsDtgM/s72-c/DSC_0137.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-8973699910601366229</id><published>2011-07-10T17:02:00.003+01:00</published><updated>2011-08-30T10:27:41.438+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='disruptor'/><category scheme='http://www.blogger.com/atom/ns#' term='lmax'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Dissecting the Disruptor: Wiring up the dependencies</title><content type='html'>So now I've covered the &lt;a href="http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-whats-so-special.html"&gt;ring buffer&lt;/a&gt; itself, &lt;a href="http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-how-do-i-read-from.html"&gt;reading&lt;/a&gt; from it and &lt;a href="http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-writing-to-ring.html"&gt;writing&lt;/a&gt; to it.&lt;br /&gt;&lt;br /&gt;Logically the next thing to do is to wire everything up together.&lt;br /&gt;&lt;br /&gt;I talked about multiple producers - they have the producer barrier to keep them in order and under control. &amp;nbsp;I've talked about consumers in a simple situation. &amp;nbsp;Multiple consumers can get a little more involved. &amp;nbsp;&lt;a href="http://www.lmaxtrader.co.uk/"&gt;We've&lt;/a&gt; done some clever stuff to allow the consumers to be dependent on each other and the ring buffer. &amp;nbsp;Like a lot of applications, we have a pipeline of things that need to happen before we can actually get on with the business logic - for example, we need to make sure the messages have been journalled to disk before we can do anything.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://disruptor.googlecode.com/files/Disruptor-1.0.pdf"&gt;Disruptor paper&lt;/a&gt; and the performance tests cover some basic configurations that you might want. I'm going to go over the most interesting one, mostly because I needed the practice with the graphics tablet.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Diamond configuration&lt;/b&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/disruptor/source/browse/trunk/code/src/perf/com/lmax/disruptor/DiamondPath1P3CPerfTest.java"&gt;DiamondPath1P3CPerfTest&lt;/a&gt; illustrates a configuration which is not too uncommon - a single producer with three consumers. &amp;nbsp;The tricky point being that the third consumer is dependent upon the previous two consumers to finish before it can do anything.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-34LTXhqK1wA/ThSvXbNTAjI/AAAAAAAAIFY/qpFZNXWgbPE/s1600/1P3C-Diamond.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="264" src="http://4.bp.blogspot.com/-34LTXhqK1wA/ThSvXbNTAjI/AAAAAAAAIFY/qpFZNXWgbPE/s400/1P3C-Diamond.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Consumer three might be your business logic, consumer one could be backing up the data received, and consumer two may be preparing the data or something.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Diamond configuration using queues&lt;/b&gt;&lt;br /&gt;In a &lt;a href="http://www.theserverside.com/news/1363672/Building-a-Scalable-Enterprise-Applications-Using-Asynchronous-IO-and-SEDA-Model"&gt;SEDA-style architecture&lt;/a&gt;, each stage will be separated by a queue:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-4Di1CzgcZR0/ThSzSdp1sTI/AAAAAAAAIFc/9mhK_7hLBdk/s1600/1P3C-Diamond-Queue.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="263" src="http://1.bp.blogspot.com/-4Di1CzgcZR0/ThSzSdp1sTI/AAAAAAAAIFc/9mhK_7hLBdk/s400/1P3C-Diamond-Queue.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;(Why does queue have to have so many "e"s? &amp;nbsp;It's the letter I have the most trouble with in these drawings).&lt;br /&gt;&lt;br /&gt;You might get an inkling of the problem here: for a message to get from P1 to C3 it has to travel through four whole queues, each queue taking its cost in terms of putting the message on the queue and taking it off again.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Diamond configuration using the Disruptor&lt;/b&gt;&lt;br /&gt;In the &lt;a href="http://code.google.com/p/disruptor/"&gt;Disruptor&lt;/a&gt; world, it's all managed on a single ring buffer:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-fGp-zkgVWs0/ThnC8m1O8bI/AAAAAAAAIHI/jUZJ6Xos608/s1600/1P3C-Diamond-RingBuffer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="359" src="http://1.bp.blogspot.com/-fGp-zkgVWs0/ThnC8m1O8bI/AAAAAAAAIHI/jUZJ6Xos608/s640/1P3C-Diamond-RingBuffer.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;It does look more complicated. &amp;nbsp;But the ring buffer remains the single point of contact between all the players, and the interactions are all based on the barriers checking the sequence numbers of the things it's dependent upon.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;The producer side is fairly simple, it's the single producer model described in my &lt;a href="http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-writing-to-ring.html"&gt;last post&lt;/a&gt;. Interestingly, the producer barrier doesn't have to care about all the consumers. &amp;nbsp;It only cares about consumer three, because if consumer three has finished with an item in the ring buffer the other two will already have processed it. &amp;nbsp;So if C3 has moved on, that slot in the ring buffer is available.&lt;br /&gt;&lt;br /&gt;To manage the dependencies between the consumers you need two consumer barriers. &amp;nbsp;The first just talks to the ring buffer and consumers one and two ask it for the next available item. &amp;nbsp;The second consumer barrier knows about consumers one and two, and it will return the lowest sequence number processed by both consumers.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How consumer dependencies work in the Disruptor&lt;/b&gt;&lt;br /&gt;Hmm. &amp;nbsp;I can see I'm going to need an example.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-CDUq8tbkg5U/ThTBcrHD_wI/AAAAAAAAIFo/edukW6dAG5Q/s1600/1P3C-Diamond-RingBuffer-Example.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="294" src="http://3.bp.blogspot.com/-CDUq8tbkg5U/ThTBcrHD_wI/AAAAAAAAIFo/edukW6dAG5Q/s640/1P3C-Diamond-RingBuffer-Example.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;We're joining the party halfway through the story: the producer has filled the ring buffer up to sequence number 22; consumer one has read and processed everything up to 21; consumer two has processed everything up to sequence 18; consumer three, which is dependent upon the other consumers, has only made it as far as 15.&lt;br /&gt;&lt;br /&gt;The producer can't write anything more to the ring buffer because sequence 15 is taking up the slot where we'd want to put sequence 23.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-PKLturGyJac/ThnEt30SVLI/AAAAAAAAIHM/8w-q90sErcY/s1600/1P3C-Diamond-RingBuffer-Example2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="314" src="http://3.bp.blogspot.com/-PKLturGyJac/ThnEt30SVLI/AAAAAAAAIHM/8w-q90sErcY/s640/1P3C-Diamond-RingBuffer-Example2.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;(I'm sorry, I really did try to find an alternative to red and green, but everything else was just as ambiguous).&lt;br /&gt;&lt;br /&gt;The first consumer barrier lets consumers one and two know they can grab anything up to sequence 22, the highest sequence number in the ring buffer. &amp;nbsp;The second consumer barrier checks the ring buffer sequence, but it also checks the sequences on the other two consumers and returns the lowest value. &amp;nbsp;So consumer three is told it can get anything up to sequence 18 from the ring buffer.&lt;br /&gt;&lt;br /&gt;Note that the consumers are still reading the entries directly from the ring buffer - consumers one and two are not taking the entries off the ring buffer and then passing them on to consumer three. &amp;nbsp;Instead, the second consumer barrier is letting consumer three know which entry in the ring buffer it's safe to process.&lt;br /&gt;&lt;br /&gt;This raises a question - if everything comes directly off the ring buffer, how is consumer three going to find out about anything the first two consumers have done? &amp;nbsp;If all consumer three cares about is that the earlier consumers have done their job (e.g. replicating the data to somewhere else) then everything's fine - when consumer three is told the job is done, it's happy. &amp;nbsp;If, however, consumer three needs the results of an earlier consumer's processing, where does it get that from?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Modifying entries&lt;/b&gt;&lt;br /&gt;The secret is to write them to the ring buffer&amp;nbsp;&lt;code&gt;Entry&lt;/code&gt; itself. &amp;nbsp;This way, when consumer three grabs the entry off the ring buffer, it will have been populated with all the information consumer three needs to do the job. &amp;nbsp;The really important part of this is that for each field on the &lt;code&gt;Entry&lt;/code&gt;&amp;nbsp;only one consumer is allowed to write to it. &amp;nbsp;This prevents any write-contention which will slow the whole thing down.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-C26vt5NZaFo/ThnI4LpUzdI/AAAAAAAAIHU/I_9vAzu8EQY/s1600/FizzBuzzEntry.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="215" src="http://3.bp.blogspot.com/-C26vt5NZaFo/ThnI4LpUzdI/AAAAAAAAIHU/I_9vAzu8EQY/s400/FizzBuzzEntry.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;You can see this in &lt;a href="http://code.google.com/p/disruptor/source/browse/trunk/code/src/perf/com/lmax/disruptor/DiamondPath1P3CPerfTest.java"&gt;DiamondPath1P3CPerfTest&lt;/a&gt; - &lt;a href="http://code.google.com/p/disruptor/source/browse/trunk/code/src/perf/com/lmax/disruptor/support/FizzBuzzEntry.java"&gt;FizzBuzzEntry&lt;/a&gt; has two fields as well as the value: &lt;code&gt;fizz&lt;/code&gt; and &lt;code&gt;buzz&lt;/code&gt;. &amp;nbsp;If the consumer is a Fizz consumer, it writes to &lt;code&gt;fizz&lt;/code&gt;. &amp;nbsp;If it's a Buzz consumer, it writes to &lt;code&gt;buzz&lt;/code&gt;. &amp;nbsp;The third consumer, FizzBuzz, will read both of these fields but not write to either, since reading is fine and won't cause contention.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Some actual Java code&lt;/b&gt;&lt;br /&gt;All this looks more complicated than the queue implementation. &amp;nbsp;And yes, it does involve a bit more coordination. &amp;nbsp;But this is hidden from the consumers and producers, they just talk to the barriers. &amp;nbsp;The trick is in the configuration. &amp;nbsp;The diamond graph in the example above would be created using something like the following:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;ConsumerBarrier consumerBarrier1 = ringBuffer.createConsumerBarrier();&lt;br /&gt;&lt;br /&gt;BatchConsumer consumer1 = new BatchConsumer(consumerBarrier1, handler1);&lt;br /&gt;BatchConsumer consumer2 = new BatchConsumer(consumerBarrier1, handler2);&lt;br /&gt;&lt;br /&gt;ConsumerBarrier consumerBarrier2 = &lt;br /&gt;    ringBuffer.createConsumerBarrier(consumer1, consumer2);&lt;br /&gt;&lt;br /&gt;BatchConsumer consumer3 = new BatchConsumer(consumerBarrier2, handler3);&lt;br /&gt;&lt;br /&gt;ProducerBarrier producerBarrier = &lt;br /&gt;    ringBuffer.createProducerBarrier(consumer3);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;In summary&lt;/b&gt;&lt;br /&gt;So there you have it - how to wire up the Disruptor with multiple consumers that are dependent on each other. &amp;nbsp;The key points:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Use multiple consumer barriers to manage dependencies between consumers.&lt;/li&gt;&lt;li&gt;Have the producer barrier watch the last consumer in the graph.&lt;/li&gt;&lt;li&gt;Allow only one consumer to write to an individual field in an &lt;code&gt;Entry&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;EDIT: Adrian has &lt;a href="http://www.symphonious.net/2011/07/11/lmax-disruptor-high-performance-low-latency-and-simple-too/"&gt;written a nice DSL&lt;/a&gt; to make wiring up the Disruptor much easier.&lt;br /&gt;&lt;br /&gt;EDIT 2: Note that version 2.0 of the Disruptor uses different names to the ones in this article. &amp;nbsp;Please see&amp;nbsp;&lt;a href="http://mechanitis.blogspot.com/2011/08/disruptor-20-all-change-please.html"&gt;my summary of the changes&lt;/a&gt;&amp;nbsp;if you are confused about class names. &amp;nbsp;Also Adrian's DSL is now part of the main Disruptor code base.&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-8973699910601366229?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/8973699910601366229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-wiring-up.html#comment-form' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/8973699910601366229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/8973699910601366229'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-wiring-up.html' title='Dissecting the Disruptor: Wiring up the dependencies'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-34LTXhqK1wA/ThSvXbNTAjI/AAAAAAAAIFY/qpFZNXWgbPE/s72-c/1P3C-Diamond.png' height='72' width='72'/><thr:total>12</thr:total><georss:featurename>London W8, UK</georss:featurename><georss:point>51.50145999999999 -0.19326249999994616</georss:point><georss:box>51.492911499999984 -0.20578299999994615 51.51000849999999 -0.18074199999994617</georss:box></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-7488797114767130976</id><published>2011-07-04T15:27:00.003+01:00</published><updated>2011-08-30T10:28:23.665+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='disruptor'/><category scheme='http://www.blogger.com/atom/ns#' term='lmax'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Dissecting the Disruptor: Writing to the ring buffer</title><content type='html'>&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;This is the missing piece in the end-to-end view of the Disruptor. &amp;nbsp;Brace yourselves, it's quite long. &amp;nbsp;But I decided to keep it in a single blog so you could have the context in one place.&lt;br /&gt;&lt;br /&gt;The important areas are: not wrapping the ring; informing the consumers; batching for producers; and how multiple producers work.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ProducerBarriers&lt;/b&gt;&lt;br /&gt;The &lt;a href="http://code.google.com/p/disruptor/"&gt;Disruptor code&lt;/a&gt; has interfaces and helper classes for the &lt;code&gt;Consumer&lt;/code&gt;s, but there's no interface for your producer, the thing that writes to the ring buffer. &amp;nbsp;That's because nothing else needs to access your producer, only you need to know about it. &amp;nbsp;However, like the consuming side, a &lt;code&gt;ProducerBarrier&lt;/code&gt; is created by the ring buffer and your producer will use this to write to it.&lt;br /&gt;&lt;br /&gt;Writing to the ring buffer involves a two-phase commit. &amp;nbsp;First, your producer has to claim the next slot on the buffer. &amp;nbsp;Then, when the producer has finished writing to the slot, it will call &lt;code&gt;commit&lt;/code&gt; on the &lt;code&gt;ProducerBarrier&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;So let's look at the first bit. &amp;nbsp;It sounds easy - "get me the next slot on the ring buffer". &amp;nbsp;Well, from your producer's point of view it is easy. &amp;nbsp;You simply call &lt;code&gt;nextEntry()&lt;/code&gt; on the &lt;code&gt;ProducerBarrier&lt;/code&gt;. &amp;nbsp;This will return you an &lt;code&gt;Entry&lt;/code&gt; object which is basically the next slot in the ring buffer.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The ProducerBarrier makes sure the ring buffer doesn't wrap&lt;/b&gt;&lt;br /&gt;Under the covers, the &lt;code&gt;ProducerBarrier&lt;/code&gt; is doing all the negotiation to figure out what the next slot is, and if you're allowed to write to it yet.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-YOp3ahmnRLw/ThCPQmuS2gI/AAAAAAAAIE0/oI-w-1l2RJc/s1600/PreventRingFromWrapping.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="231" src="http://3.bp.blogspot.com/-YOp3ahmnRLw/ThCPQmuS2gI/AAAAAAAAIE0/oI-w-1l2RJc/s640/PreventRingFromWrapping.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;(I'm not convinced the &lt;a href="http://www.amazon.com/Wacom-CTL460-Bamboo-Pen-Tablet/dp/B002OOWC3I?ie=UTF8&amp;amp;tag=trissramb-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;shiny new graphics tablet&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=trissramb-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=B002OOWC3I" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt; is helping the clarity of my pictures, but it's  fun to use).&lt;br /&gt;&lt;br /&gt;For this illustration, we're going to assume there's only one producer writing to the ring buffer. &amp;nbsp;We will deal with the intricacies of multiple producers later.&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;ConsumerTrackingProducerBarrier&lt;/code&gt; has a list of all the &lt;code&gt;Consumers&lt;/code&gt; that are accessing the ring buffer. &amp;nbsp;Now to me this seemed a bit odd - I wouldn't expect the &lt;code&gt;ProducerBarrier&lt;/code&gt; to know anything about the consuming side.  But wait, there is a reason. &amp;nbsp;Because we don't want the "conflation of concerns" a queue has (it has to track the head and tail which are sometimes the same point), our consumers are responsible for knowing which sequence number they're up to, not the ring buffer. &amp;nbsp;So, if we want to make sure we don't wrap the buffer, we need to check where the consumers have got to.&lt;br /&gt;&lt;br /&gt;In the diagram above, one &lt;code&gt;Consumer&lt;/code&gt; is happily at the same point as the highest sequence number (12, highlighted in red/pink). The second &lt;code&gt;Consumer&lt;/code&gt; is a bit behind - maybe it's doing I/O operations or something - and it's at sequence number 3. &amp;nbsp;Therefore consumer 2 has the whole length of the buffer to go before it catches up with consumer 1.&lt;br /&gt;&lt;br /&gt;The producer wants to write to the slot on the ring buffer currently occupied by sequence 3, because this slot is the one after the current ring buffer cursor. &amp;nbsp;But the &lt;code&gt;ProducerBarrier&lt;/code&gt; knows it can't write here because a &lt;code&gt;Consumer&lt;/code&gt; is using it. &amp;nbsp;So the &lt;code&gt;ProducerBarrier&lt;/code&gt; sits and spins, waiting, until the consumers move on.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Claiming the next slot&lt;/b&gt;&lt;br /&gt;Now imagine consumer 2 has finished that batch of entries, and moves its sequence number on. Maybe it got as far as sequence 9 (in real life I expect it will make it as far as 12 because of the way consumer batching works, but that doesn't make the example as interesting).&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-IxEJ_Dy6_RU/ThCVQIwgLoI/AAAAAAAAIE4/-z4AsZD5nVg/s1600/ProducerNextEntry.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="236" src="http://4.bp.blogspot.com/-IxEJ_Dy6_RU/ThCVQIwgLoI/AAAAAAAAIE4/-z4AsZD5nVg/s640/ProducerNextEntry.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The diagram above shows what happens when consumer 2 updates to sequence number 9. &amp;nbsp;I've slimmed down the &lt;code&gt;ConsumerBarrier&lt;/code&gt; in this picture because it takes no active part in this scene.&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;ProducerBarrier&lt;/code&gt; sees that the next slot, the one that had sequence number 3, is now available. &amp;nbsp;It grabs the &lt;code&gt;Entry&lt;/code&gt; that sits in this slot (I've not talked specifically about the &lt;code&gt;Entry&lt;/code&gt; class, but it's basically a bucket for stuff you want to put into the ring buffer slot which has a sequence number), sets the sequence number on the &lt;code&gt;Entry&lt;/code&gt; to the next sequence number (13) and returns this entry to your producer. &amp;nbsp;The producer can then write whatever value it wants into this &lt;code&gt;Entry&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Committing the new value&lt;/b&gt;&lt;br /&gt;The second phase of the two-stage commit is, well, the commit.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-vBm6k86SO4k/ThCm5GgkhEI/AAAAAAAAIFA/dB-9NNz47qw/s1600/ProducerCommit.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="224" src="http://2.bp.blogspot.com/-vBm6k86SO4k/ThCm5GgkhEI/AAAAAAAAIFA/dB-9NNz47qw/s640/ProducerCommit.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The green represents our newly updated &lt;code&gt;Entry&lt;/code&gt; with sequence 13 - yeah, I'm sorry, I'm red-green colour-blind too. &amp;nbsp;But other colours were even more rubbish.&lt;br /&gt;&lt;br /&gt;When the producer has finished writing stuff into the entry it tells the &lt;code&gt;ProducerBarrier&lt;/code&gt; to commit it.&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;ProducerBarrier&lt;/code&gt; waits for the ring buffer cursor to catch up to where we are (for a single producer this will always be a bit pointless - e.g. we know the cursor is already at 12, nothing else is writing to the ring buffer). &amp;nbsp;Then the &lt;code&gt;ProducerBarrier&lt;/code&gt; updates the ring buffer cursor to the sequence number on the updated &lt;code&gt;Entry&lt;/code&gt; - 13 in our case. &amp;nbsp;Next, the &lt;code&gt;ProducerBarrier&lt;/code&gt; lets the consumers know there's something new in the buffer. &amp;nbsp;It does this by poking the &lt;code&gt;WaitStrategy&lt;/code&gt; on the &lt;code&gt;ConsumerBarrier&lt;/code&gt; - "Oi, wake up! Something happened!" (note - different &lt;code&gt;WaitStrategy&lt;/code&gt; implementations deal with this in different ways, depending upon whether it's blocking or not).&lt;br /&gt;&lt;br /&gt;Now consumer 1 can get entry 13, consumer 2 can get everything up to and including 13, and they all live happily ever after.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ProducerBarrier batching&lt;/b&gt;&lt;br /&gt;Interestingly the disruptor can batch on the producer side as well as &lt;a href="http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-how-do-i-read-from.html"&gt;on the Consumer side&lt;/a&gt;. &amp;nbsp;Remember when consumer 2 finally got with the programme and found itself at sequence 9? &amp;nbsp;There is a very cunning thing the &lt;code&gt;ProducerBarrier&lt;/code&gt; can do here - it knows the size of the buffer, and it knows where the slowest &lt;code&gt;Consumer&lt;/code&gt; is. &amp;nbsp;So it can figure out which slots are now available.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-781DHcbmG2g/ThCXT2xo0xI/AAAAAAAAIE8/5Gls4znj3zw/s1600/ProducerBatching.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="236" src="http://4.bp.blogspot.com/-781DHcbmG2g/ThCXT2xo0xI/AAAAAAAAIE8/5Gls4znj3zw/s640/ProducerBatching.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If the &lt;code&gt;ProducerBarrier&lt;/code&gt; knows the ring buffer cursor is at 12, and the slowest &lt;code&gt;Consumer&lt;/code&gt; is at 9, it can let producers write to slots 3, 4, 5, 6, 7 and 8 before it needs to check where the consumers are.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Multiple producers&lt;/b&gt;&lt;br /&gt;You thought I was done, but there's more.&lt;br /&gt;&lt;br /&gt;I slightly lied in some of the above drawings. &amp;nbsp;I implied that the sequence number the &lt;code&gt;ProducerBarrier&lt;/code&gt; deals with comes directly from the ring buffer's cursor. &amp;nbsp;However, if you look at the code you'll see that it uses the &lt;code&gt;ClaimStrategy&lt;/code&gt; to get this. &amp;nbsp;I skipped this to simplify the diagrams, it's not so important in the single-producer case.&lt;br /&gt;&lt;br /&gt;With multiple producers, you need yet another thing tracking a sequence number. &amp;nbsp;This is the sequence that is available for writing to. &amp;nbsp;Note that this is not the same as ring-buffer-cursor-plus-one - if you have more than one producer writing to the buffer, it's possible there are entries in the process of being written that haven't been committed yet.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-xPQJAkN7lgg/ThC8FGgosdI/AAAAAAAAIFE/qZO9xuiKFPY/s1600/ProducersNextEntry.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="274" src="http://4.bp.blogspot.com/-xPQJAkN7lgg/ThC8FGgosdI/AAAAAAAAIFE/qZO9xuiKFPY/s640/ProducersNextEntry.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Let's revisit claiming a slot. &amp;nbsp;Each producer asks the &lt;code&gt;ClaimStrategy&lt;/code&gt; for the next available slot. &amp;nbsp;Producer 1 gets sequence 13, like in the single producer case above. &amp;nbsp;Producer 2 gets sequence 14, even though the ring buffer cursor is still only pointing to 12, because the &lt;code&gt;ClaimSequence&lt;/code&gt; is dishing out the numbers and has been keeping track of what's been allocated.&lt;br /&gt;&lt;br /&gt;So each producer has its own slot with a shiny new sequence number.&lt;br /&gt;&lt;br /&gt;I'm going colour producer 1 and its slot in green, and producer 2 and its slot in a suspiciously pink-looking purple.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-4bSeLcewe-Q/ThDCM1rWOyI/AAAAAAAAIFQ/cF_dPHKNm-I/s1600/ProducersCommit.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-4bSeLcewe-Q/ThDCM1rWOyI/AAAAAAAAIFQ/cF_dPHKNm-I/s1600/ProducersCommit.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Now imaging producer 1 is away with the fairies, and hasn't got around to committing for whatever reason. &amp;nbsp;Producer 2 is ready to commit, and asks the &lt;code&gt;ProducerBarrier&lt;/code&gt; to do so.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As we saw in the earlier commit diagram, the &lt;code&gt;ProducerBarrier&lt;/code&gt; is only going to commit when the ring buffer cursor reaches the slot behind the one it wants to commit into. &amp;nbsp;In this case, the cursor needs to reach 13 so that we can commit 14. &amp;nbsp;But we can't, because producer 1 is staring at something shiny and hasn't committed yet. &amp;nbsp;So the &lt;code&gt;ClaimStrategy&lt;/code&gt; sits there spinning until the ring buffer cursor gets to where it should be.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-2kzqD61cJNU/ThDEYBSFOkI/AAAAAAAAIFU/WY0m9sn5y-w/s1600/ProducersCommit2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="204" src="http://4.bp.blogspot.com/-2kzqD61cJNU/ThDEYBSFOkI/AAAAAAAAIFU/WY0m9sn5y-w/s640/ProducersCommit2.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Now producer 1 wakes up from its coma and asks to commit entry 13 (green arrows are sparked by the request from producer 1). &amp;nbsp;The &lt;code&gt;ProducerBarrier&lt;/code&gt; tells the &lt;code&gt;ClaimStrategy&lt;/code&gt; to wait for the ring buffer cursor to get to 12, which it already had of course. &amp;nbsp;So the ring buffer cursor is incremented to 13, and the &lt;code&gt;ProducerBarrier&lt;/code&gt; pokes the &lt;code&gt;WaitStrategy&lt;/code&gt; to let everything know the ring buffer was updated. &amp;nbsp;Now the &lt;code&gt;ProducerBarrier&lt;/code&gt; can finish the request from producer 2, increment the ring buffer cursor to 14, and let everyone know that we're done.&lt;br /&gt;&lt;br /&gt;You'll see that the ring buffer retains the ordering implied by the order of the initial &lt;code&gt;nextEntry()&lt;/code&gt; calls, even if the producers finish writing at different times. &amp;nbsp;It also means that if a producer is causing a pause in writing to the ring buffer, when it unblocks any other pending commits can happen immediately.&lt;br /&gt;&lt;br /&gt;Phew. &amp;nbsp;And I managed to describe all that without mentioning a memory barrier once.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;EDIT: The most recent version of the&amp;nbsp;&lt;a href="http://code.google.com/p/disruptor/source/browse/trunk/code/src/main/com/lmax/disruptor/RingBuffer.java?r=239"&gt;RingBuffer&lt;/a&gt;&amp;nbsp;hides away the Producer Barrier. &amp;nbsp;If you can't see a&amp;nbsp;&lt;a href="http://code.google.com/p/disruptor/source/browse/trunk/code/src/main/com/lmax/disruptor/ProducerBarrier.java?r=239"&gt;ProducerBarrier&lt;/a&gt;&amp;nbsp;in the code you're looking at, then assume where I say "producer barrier" I mean "ring buffer"&lt;br /&gt;&lt;br /&gt;EDIT 2: Note that version 2.0 of the Disruptor uses different names to the ones in this article. &amp;nbsp;Please see&amp;nbsp;&lt;a href="http://mechanitis.blogspot.com/2011/08/disruptor-20-all-change-please.html"&gt;my summary of the changes&lt;/a&gt;&amp;nbsp;if you are confused about class names.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-7488797114767130976?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/7488797114767130976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-writing-to-ring.html#comment-form' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/7488797114767130976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/7488797114767130976'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-writing-to-ring.html' title='Dissecting the Disruptor: Writing to the ring buffer'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-YOp3ahmnRLw/ThCPQmuS2gI/AAAAAAAAIE0/oI-w-1l2RJc/s72-c/PreventRingFromWrapping.png' height='72' width='72'/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-8259927828802789000</id><published>2011-06-28T19:57:00.005+01:00</published><updated>2011-08-30T10:28:49.824+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='disruptor'/><category scheme='http://www.blogger.com/atom/ns#' term='lmax'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Dissecting the Disruptor: How do I read from the ring buffer?</title><content type='html'>The next in the series of understanding &lt;a href="http://code.google.com/p/disruptor/"&gt;the Disruptor pattern&lt;/a&gt; developed at &lt;a href="http://www.lmaxtrader.com/"&gt;LMAX&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;After the &lt;a href="http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-whats-so-special.html"&gt;last post&lt;/a&gt; we all understand ring buffers and how awesome they are. &amp;nbsp;Unfortunately for you, I have not said anything about how to actually populate them or read from them when you're using the Disruptor.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ConsumerBarriers and Consumers&lt;/b&gt;&lt;br /&gt;I'm going to approach this slightly backwards, because it's probably easier to understand in the long run. &amp;nbsp;Assuming that some magic has populated it: how do you read something from the ring buffer? &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-XfVLYjAqNeY/TgjrImkZ-BI/AAAAAAAAIEg/_SM2EqIgATs/s1600/ConsumerWaitFor.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="214" src="http://1.bp.blogspot.com/-XfVLYjAqNeY/TgjrImkZ-BI/AAAAAAAAIEg/_SM2EqIgATs/s640/ConsumerWaitFor.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;(OK, I'm starting to regret using Paint/&lt;a href="http://www.gimp.org/"&gt;Gimp&lt;/a&gt;. &amp;nbsp;Although it's an excellent excuse to purchase a graphics tablet if I do continue down this road. &amp;nbsp;Also UML gurus are probably cursing my name right now.)&lt;br /&gt;&lt;br /&gt;Your &lt;code&gt;Consumer&lt;/code&gt; is the thread that wants to get something off the buffer. &amp;nbsp;It has access to a &lt;code&gt;ConsumerBarrier&lt;/code&gt;, which is created by the &lt;code&gt;RingBuffer&lt;/code&gt; and interacts with it on behalf of the &lt;code&gt;Consumer&lt;/code&gt;. &amp;nbsp;While the ring buffer obviously needs a sequence number to figure out what the next available slot is, the consumer also needs to know which sequence number it's up to - each consumer needs to be able to figure out which sequence number it's expecting to see next. &amp;nbsp;So in the case above, the consumer has dealt with everything in the ring buffer up to and including 8, so it's expecting to see 9 next.&lt;br /&gt;&lt;br /&gt;The consumer calls &lt;code&gt;waitFor&lt;/code&gt; on the &lt;code&gt;ConsumerBarrier&lt;/code&gt; with the sequence number it wants next&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code style="font-size: 12px;"&gt;    final long availableSeq = consumerBarrier.waitFor(nextSequence);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;and the &lt;code&gt;ConsumerBarrier&lt;/code&gt; returns the highest sequence number available in the ring buffer - in the example above, 12. &amp;nbsp;The &lt;code&gt;ConsumerBarrier&lt;/code&gt; has a &lt;code&gt;WaitStrategy&lt;/code&gt; which it uses to decide how to wait for this sequence number - I won't go into details of that right now, the code has comments in outlining the advantages and disadvantages of each.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Now what?&lt;/b&gt;&lt;br /&gt;So the consumer has been hanging around waiting for more stuff to get written to the ring buffer, and it's been told what has been written - entries 9, 10, 11 and 12. &amp;nbsp;Now they're there, the consumer can ask the &lt;code&gt;ConsumerBarrier&lt;/code&gt; to fetch them.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-NKI4nQgA_Co/TgjsGRyaTWI/AAAAAAAAIEk/S7fAyNrjlXQ/s1600/ConsumerRequest.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="222" src="http://2.bp.blogspot.com/-NKI4nQgA_Co/TgjsGRyaTWI/AAAAAAAAIEk/S7fAyNrjlXQ/s640/ConsumerRequest.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As it's fetching them, the &lt;code&gt;Consumer&lt;/code&gt; is updating its own cursor. &lt;br /&gt;&lt;br /&gt;You should start to get a feel for how this helps to smooth latency spikes - instead of asking "Can I have the next one yet? &amp;nbsp;How about now? &amp;nbsp;Now?" for every individual item, the &lt;code&gt;Consumer&lt;/code&gt; simply says "Let me know when you've got more than this number", and is told in return how many more entries it can grab. &amp;nbsp;Because these new entries have definitely been written (the ring buffer's sequence has been updated), and because the only things trying to get to these entries can only read them and not write to them, this can be done without locks. &amp;nbsp;Which is nice. &amp;nbsp;Not only is it safer and easier to code against, it's much faster not to use a lock.&lt;br /&gt;&lt;br /&gt;And the added bonus - you can have multiple &lt;code&gt;Consumers&lt;/code&gt; reading off the same &lt;code&gt;RingBuffer&lt;/code&gt;, with no need for locks and no need for additional queues to coordinate between the different threads. &amp;nbsp;So you can really run your processing in parallel with the Disruptor coordinating the effort.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://code.google.com/p/disruptor/source/browse/trunk/code/src/main/com/lmax/disruptor/BatchConsumer.java"&gt;BatchConsumer&lt;/a&gt; is an example of consumer code, and if you implement the &lt;a href="http://code.google.com/p/disruptor/source/browse/trunk/code/src/main/com/lmax/disruptor/BatchHandler.java"&gt;BatchHandler &lt;/a&gt;you can get the &lt;code&gt;BatchConsumer&lt;/code&gt; to do the heavy lifting I've outlined above. &amp;nbsp;Then it's easy to deal with the whole batch of entries processed (e.g. from 9-12 above) without having to fetch each one individually.&lt;br /&gt;&lt;br /&gt;EDIT: Note that version 2.0 of the Disruptor uses different names to the ones in this article. &amp;nbsp;Please see&amp;nbsp;&lt;a href="http://mechanitis.blogspot.com/2011/08/disruptor-20-all-change-please.html"&gt;my summary of the changes&lt;/a&gt;&amp;nbsp;if you are confused about class names.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-8259927828802789000?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/8259927828802789000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-how-do-i-read-from.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/8259927828802789000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/8259927828802789000'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-how-do-i-read-from.html' title='Dissecting the Disruptor: How do I read from the ring buffer?'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-XfVLYjAqNeY/TgjrImkZ-BI/AAAAAAAAIEg/_SM2EqIgATs/s72-c/ConsumerWaitFor.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-1128284351498738322</id><published>2011-06-22T16:01:00.000+01:00</published><updated>2011-06-22T16:01:51.918+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='data structures'/><category scheme='http://www.blogger.com/atom/ns#' term='disruptor'/><category scheme='http://www.blogger.com/atom/ns#' term='lmax'/><title type='text'>Dissecting the Disruptor: What's so special about a ring buffer?</title><content type='html'>Recently we open sourced the &lt;a href="http://code.google.com/p/disruptor/"&gt;LMAX Disruptor&lt;/a&gt;, the key to what makes our exchange so fast. &amp;nbsp;Why did we open source it? &amp;nbsp;Well, we've realised that conventional wisdom around high performance programming is... a bit wrong. We've come up with a better, faster way to share data between threads, and it&amp;nbsp;would be selfish not to share it with the world. &amp;nbsp;Plus it makes us look dead clever.&lt;br /&gt;&lt;br /&gt;On the site you can &lt;a href="https://code.google.com/p/disruptor/"&gt;download a technical article&lt;/a&gt; explaining what the Disruptor is and why it's so clever and fast. &amp;nbsp;I even get a writing credit on it, which is gratifying when all I really did is insert commas and re-phrase sentences I didn't understand.&lt;br /&gt;&lt;br /&gt;However I find the whole thing a bit much to digest all at once, so I'm going to explain it in smaller pieces, as suits my&amp;nbsp;&lt;a href="http://www.randsinrepose.com/archives/2003/07/10/nadd.html"&gt;NADD&lt;/a&gt; audience.&lt;br /&gt;&lt;br /&gt;First up - the ring buffer. &amp;nbsp;Initially I was under the impression the Disruptor was just the ring buffer. &amp;nbsp;But I've come to realise that while this data structure is at the heart of the pattern, the clever bit about the Disruptor is controlling access to it. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;What on earth is a ring buffer?&lt;/b&gt;&lt;br /&gt;Well, it does what it says on the tin - it's a ring (it's circular and wraps), and you use it as a buffer to pass stuff from one context (one thread) to another:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-3gtuTbWgI-Y/TgD92AhOVxI/AAAAAAAAIDE/cWsAT81B0AI/s1600/RingBuffer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-3gtuTbWgI-Y/TgD92AhOVxI/AAAAAAAAIDE/cWsAT81B0AI/s1600/RingBuffer.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;(OK, I drew it in Paint. &amp;nbsp;I'm experimenting with sketch styles and hoping my OCD doesn't kick in and demand perfect circles and straight lines at precise angles).&lt;br /&gt;&lt;br /&gt;So basically it's an array with a pointer to the next available slot.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-WCm0iWYOrfc/TgD_cVBQExI/AAAAAAAAIDI/cEohveH8LP8/s1600/RingBufferInitial.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-WCm0iWYOrfc/TgD_cVBQExI/AAAAAAAAIDI/cEohveH8LP8/s1600/RingBufferInitial.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As you keep filling up the buffer (and presumable reading from it too), the sequence keeps incrementing, wrapping around the ring:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-cwPlKupFfks/TgEBetHtvmI/AAAAAAAAIDM/prOjrOPDo_E/s1600/RingBufferWrapped.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-cwPlKupFfks/TgEBetHtvmI/AAAAAAAAIDM/prOjrOPDo_E/s1600/RingBufferWrapped.png" /&gt;&lt;/a&gt;&lt;/div&gt;To find the slot in the array that the current sequence points to you use a mod operation:&lt;br /&gt;&lt;blockquote style="padding: 5px;"&gt;sequence mod array length = array index&lt;/blockquote&gt;So for the above ring buffer (using Java mod syntax): &lt;code&gt;12 % 10 = 2&lt;/code&gt;.  Easy.&lt;br /&gt;&lt;br /&gt;Actually it was a total accident that the picture had ten slots. &amp;nbsp;Powers of two work better because computers think in binary.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;So what?&lt;/b&gt;&lt;br /&gt;If you look at Wikipedia's entry on &lt;a href="http://en.wikipedia.org/wiki/Circular_buffer"&gt;Circular Buffers&lt;/a&gt;, you'll see one major difference to the way we've implemented ours - we don't have a pointer to the end. &amp;nbsp;We only have the next available sequence number. &amp;nbsp;This is deliberate - the original reason we chose a ring buffer was so we could support reliable messaging. &amp;nbsp;We needed a store of the messages the service had sent, so when another service sent a &lt;a href="http://en.wikipedia.org/wiki/Nak"&gt;nak&lt;/a&gt; to say they hadn't received some messages, it would be able to resend them.&lt;br /&gt;&lt;br /&gt;The ring buffer seems ideal for this. &amp;nbsp;It stores the sequence to show where the end of the buffer is, and if it gets a nak it can replay everything from that point to the current sequence:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-r054oYKWMAM/TgHWQjn-zTI/AAAAAAAAIEM/jH73U5AChvA/s1600/RingBufferReplay.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="149" src="http://4.bp.blogspot.com/-r054oYKWMAM/TgHWQjn-zTI/AAAAAAAAIEM/jH73U5AChvA/s320/RingBufferReplay.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The difference between the ring buffer as we've implemented it, and the queues we had traditionally been using, is that we don't consume the items in the buffer - they stay there until they get over-written. &amp;nbsp;Which is why we don't need the "end" pointer you see in the Wikipedia version. &amp;nbsp;Deciding whether it's OK to wrap or not is managed outside of the data structure itself (this is part of the producer and consumer behaviour - if you can't wait for me to get round to blogging about it, check out the &lt;a href="https://code.google.com/p/disruptor/"&gt;Disruptor site&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;And it's so great because...?&lt;/b&gt;&lt;br /&gt;So we use this data structure because it gives us some nice behaviour for reliable messaging. &amp;nbsp;It turns out though that it has some other nice characteristics. &lt;br /&gt;&lt;br /&gt;Firstly, it's faster than something like a linked list because it's an array, and has a&amp;nbsp;predictable&amp;nbsp;pattern of access. &amp;nbsp;This is nice and CPU-cache-friendly - at the hardware level the entries can be pre-loaded, so the machine is not constantly going back to main memory to load the next item in the ring.&lt;br /&gt;&lt;br /&gt;Secondly, it's an array and you can pre-allocate it up front, making the objects effectively immortal. &amp;nbsp;This means the garbage collector has pretty much nothing to do here. &amp;nbsp;Again, unlike a linked list which creates objects for every item added to the list - these then all need to be cleaned up when the item is no longer in the list.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The missing pieces&lt;/b&gt;&lt;br /&gt;I haven't talked about how to prevent the ring wrapping, or specifics around how to write stuff to and read things from the ring buffer. &amp;nbsp;You'll also notice I've been comparing it to a data structure like a linked list, which I don't think anyone believes is the answer to the world's problems.&lt;br /&gt;&lt;br /&gt;The interesting part comes when you compare the Disruptor with an implementation like a queue. &amp;nbsp;Queues usually take care of all the stuff like the start and end of the queue, adding and consuming items, and so forth. &amp;nbsp;All the stuff I haven't really touched on with the ring buffer. &amp;nbsp;That's because the ring buffer itself isn't responsible for these things, we've moved these concerns outside of the data structure.&lt;br /&gt;&lt;br /&gt;For more details you're just going to have to &lt;a href="https://code.google.com/p/disruptor/"&gt;read the paper or check out the code&lt;/a&gt;. &amp;nbsp;Or &lt;a href="http://www.infoq.com/presentations/LMAX"&gt;watch Mike and Martin&lt;/a&gt; at QCon San Francisco last year. &amp;nbsp;Or wait for me to have a spare five minutes to get my head around the rest of it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-1128284351498738322?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/1128284351498738322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-whats-so-special.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/1128284351498738322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/1128284351498738322'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-whats-so-special.html' title='Dissecting the Disruptor: What&apos;s so special about a ring buffer?'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-3gtuTbWgI-Y/TgD92AhOVxI/AAAAAAAAIDE/cWsAT81B0AI/s72-c/RingBuffer.png' height='72' width='72'/><thr:total>10</thr:total><georss:featurename>London W11, UK</georss:featurename><georss:point>51.5124611 -0.20588229999998475</georss:point><georss:box>51.499967600000005 -0.22059479999998474 51.5249546 -0.19116979999998476</georss:box></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-1131806816371744575</id><published>2011-06-20T09:28:00.002+01:00</published><updated>2011-06-22T16:17:34.828+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='links'/><title type='text'>A chance to see some of my actual code (even if it is C#)</title><content type='html'>Remember I posted about &lt;a href="http://mechanitis.blogspot.com/2011/05/why-java-developers-hate-net.html"&gt;having to write .NET&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;Well, the &lt;a href="http://www.lmaxtrader.co.uk/api-trading/resources-releases"&gt;code and the tutorial&lt;/a&gt; are available for you, my lucky readers, to &lt;strike&gt;rip to pieces&lt;/strike&gt; view.&lt;br /&gt;&lt;br /&gt;I am not the only person responsible for this code though, so be kind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-1131806816371744575?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/1131806816371744575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/06/chance-to-see-some-of-my-actual-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/1131806816371744575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/1131806816371744575'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/06/chance-to-see-some-of-my-actual-code.html' title='A chance to see some of my actual code (even if it is C#)'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-2912200365746726071</id><published>2011-06-14T16:39:00.001+01:00</published><updated>2011-06-14T18:34:44.407+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='awards'/><category scheme='http://www.blogger.com/atom/ns#' term='ljc'/><title type='text'>Vote for the LJC</title><content type='html'>I nominated &lt;a href="http://community.lmaxtrader.com/"&gt;LMAX&lt;/a&gt; for a couple of JAX Innovation Awards, but unfortunately we did not get shortlisted :(&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, the &lt;a href="http://www.meetup.com/Londonjavacommunity/"&gt;London Java Community&lt;/a&gt; did! &amp;nbsp;So if you have a second please vote for the LJC for Top Java Ambassador&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://vote.jax-awards.com/"&gt;&lt;img border="0" height="261" src="http://1.bp.blogspot.com/-1BeeQFQjUv0/TfeACqnJQoI/AAAAAAAAIC0/2guB2bQebfE/s400/JAX_US_IA_Button_Vote_For_Me.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-2912200365746726071?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/2912200365746726071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/06/vote-for-ljc.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2912200365746726071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2912200365746726071'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/06/vote-for-ljc.html' title='Vote for the LJC'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-1BeeQFQjUv0/TfeACqnJQoI/AAAAAAAAIC0/2guB2bQebfE/s72-c/JAX_US_IA_Button_Vote_For_Me.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-2058678217927068275</id><published>2011-06-12T20:55:00.001+01:00</published><updated>2011-06-12T21:07:16.957+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lmax'/><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>STAC London Summit</title><content type='html'>On Wednesday I tagged along to the &lt;a href="http://www.stacresearch.com/node/8970"&gt;STAC London Summit&lt;/a&gt; to provide backup for &lt;a href="http://mikes-tech.blogspot.com/"&gt;Mike&lt;/a&gt;, who was on the "The Future of Messaging Middleware" panel.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-NRHoNyOb8Bs/TfUO0FswkoI/AAAAAAAAICw/PaFNJkS6sEU/s1600/IMG_20110608_162250.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-NRHoNyOb8Bs/TfUO0FswkoI/AAAAAAAAICw/PaFNJkS6sEU/s320/IMG_20110608_162250.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;The panel consisted of two messaging providers, one hardware (Solace Systems) and one software (29West/Informatica), and two "users", Citihub and &lt;a href="http://community.lmaxtrader.com/"&gt;LMAX&lt;/a&gt;. &amp;nbsp; &amp;nbsp;Obviously both providers were arguing that theirs was the best solution. But what I found interesting is that I came away with the impression that everyone was really on the same side - everyone wants to use or to provide the best system, but there are different approaches. Which one you adopt is likely to be influenced by how your team work and the hardware you have (or can obtain).&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Mike touched on how we as developers need to do more than simply rely on fast messaging to provide our high performance. &amp;nbsp;At LMAX, we keep banging on about mechanical sympathy and clean, well designed code to make sure we make the most of the infrastructure. &amp;nbsp;He also got a dig in at&amp;nbsp;&lt;a href="http://java.sun.com/developer/technicalArticles/Ecommerce/jms/index.html"&gt;JMS&lt;/a&gt;, which I don't think anyone disagreed with.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;The main point I took away, however, is that although speed is very important in ultra high performance trading (of course), control is becoming almost more important: specifically configuration and monitoring. &amp;nbsp;Because it's all well and good having a super-fast messaging infrastructure, but if you can't get it to do what you want, or you can't see what it's doing, where the bottlenecks are, or even if you're using it properly, it's a massive waste of cash.&lt;br /&gt;&lt;br /&gt;Throughout later presentations and panels, and some chat afterwards, I picked up the configuration/monitoring theme a few more times. &amp;nbsp;Fast is one thing, high availability is another, which should not be ignored simply for speed of execution.&lt;br /&gt;&lt;br /&gt;Something else I heard a &lt;i&gt;lot&lt;/i&gt; is how Java is totally unsuitable for high performance systems. &amp;nbsp;Well... we'd like to disprove that. &amp;nbsp;I guess we need need to get out there and start talking about why this is a myth.&lt;br /&gt;&lt;br /&gt;I was impressed with the event actually. &amp;nbsp;It was such a contrast to &lt;a href="http://mechanitis.blogspot.com/2011/04/tradetech-2011-not-like-developer.html"&gt;TradeTech&lt;/a&gt;, which was all vendors and boys in suits who couldn't wait to get to the pub. &amp;nbsp;This summit hit our sweet spot - technology and trading. &amp;nbsp;The presentations were aimed at people with both deep technical knowledge and a clear understanding of the business domain. &amp;nbsp;It was somewhere we could talk quite comfortably about what we do, with a good mix of attendees who were seriously interested in the field.&lt;br /&gt;&lt;br /&gt;Something I particularly liked was how the vendor pitches were kept to lightning talks - five minutes per pitch. &amp;nbsp;This was an excellent idea. &amp;nbsp;You got enough of a flavour to decide to find out more if it looked like something useful, but not so much you were bored or felt sold to.&lt;br /&gt;&lt;br /&gt;The event was also a really good size, it seemed to encourage networking and chatting. &amp;nbsp;People mingled more easily than at any of the other events I've been to recently, and not necessarily because they already knew each other. &amp;nbsp;Mike and I were approached by a lot of people who were either curious to find out what LMAX did, or had already heard of us through some other channel. &amp;nbsp;I even gave out a bunch of business cards, which finally justified the long, hard battle I had getting them ("Developers don't need business cards" apparently - but what if I meet a cute guy? &amp;nbsp;How am I supposed to give him my number?).&lt;br /&gt;&lt;br /&gt;The only disappointment was not delivering on promises. The agenda &lt;i&gt;distinctly &lt;/i&gt;mentions cocktails. &amp;nbsp;But instead there was simply wine and beer. &amp;nbsp;I forgave them because the wine was decent and there was plenty of it.&lt;br /&gt;&lt;br /&gt;In conclusion, I was impressed and definitely want to go to more of these events. We'd love to get more involved at presenting at some too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-2058678217927068275?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/2058678217927068275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/06/stac-london-summit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2058678217927068275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2058678217927068275'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/06/stac-london-summit.html' title='STAC London Summit'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-NRHoNyOb8Bs/TfUO0FswkoI/AAAAAAAAICw/PaFNJkS6sEU/s72-c/IMG_20110608_162250.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-457141227333284912</id><published>2011-05-30T21:18:00.000+01:00</published><updated>2011-05-30T21:18:51.362+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='events'/><category scheme='http://www.blogger.com/atom/ns#' term='ljc'/><title type='text'>My first public appearance</title><content type='html'>I'm finally moving up from working behind the scenes to actually doing a (short) presentation for the LJC. I'm going to be giving a lightning talk on Wednesday at the &lt;a href="http://www.meetup.com/Londonjavacommunity/events/17394725/"&gt;AWS Elastic Beanstalk event&lt;/a&gt;,&amp;nbsp;on&amp;nbsp;the JCP - what it is and what our election to the executive committee means. &amp;nbsp;&lt;a href="http://www.meetup.com/Londonjavacommunity/events/17394725/"&gt;Ben and Martin's post&lt;/a&gt;&amp;nbsp;gives a little more background on the subject.&lt;br /&gt;&lt;br /&gt;Another &lt;a href="http://www.lmaxtrader.co.uk/"&gt;LMAX&lt;/a&gt; LJC member&amp;nbsp;&lt;a href="http://mikes-tech.blogspot.com/"&gt;Mike&lt;/a&gt; will also be giving a lightning talk, on Project Coin.&lt;br /&gt;&lt;br /&gt;Now all I have to do is write it...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-457141227333284912?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/457141227333284912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/05/my-first-public-appearance.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/457141227333284912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/457141227333284912'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/05/my-first-public-appearance.html' title='My first public appearance'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-5128347281354568092</id><published>2011-05-23T08:28:00.000+01:00</published><updated>2011-05-23T08:28:47.824+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lmax'/><category scheme='http://www.blogger.com/atom/ns#' term='thoughtworks'/><category scheme='http://www.blogger.com/atom/ns#' term='links'/><category scheme='http://www.blogger.com/atom/ns#' term='ljc'/><title type='text'>Getting around a bit</title><content type='html'>I'm honoured to now be listed on three aggregated blog feeds:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The new and somewhat embryonic &lt;a href="http://blogs.lmax.com/"&gt;blogs.lmax.com&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;The &lt;a href="http://ljc.aggrity.com/"&gt;London Java Community Aggrity&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.thoughtworks.com/blogs/alumni"&gt;ThoughtWorks Alumni&lt;/a&gt;, along with a whole host of distinguished names.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;The pressure's on to try and write useful stuff. &amp;nbsp;Oh OK, I'll settle for "entertaining".&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-5128347281354568092?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/5128347281354568092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/05/getting-around-bit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/5128347281354568092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/5128347281354568092'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/05/getting-around-bit.html' title='Getting around a bit'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-1476066486546175731</id><published>2011-05-20T18:22:00.001+01:00</published><updated>2011-05-20T19:29:44.400+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ide'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='lmax'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Why Java developers hate .NET</title><content type='html'>I have been struggling with .NET.&amp;nbsp; Actually, I have been fighting pitched battles with it.&lt;br /&gt;&lt;br /&gt;All I want to do is take our existing Java client example code and write an equivalent in C#.&amp;nbsp; Easy, right?&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Trisha's Guide to Converting Java to C#&lt;/h3&gt;Turns out writing the actual C# is relatively straightforward.&amp;nbsp; Putting to one side the question of writing optimal code (these are very basic samples after all), to get the examples to compile and run was a simple process:&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;1. Find-and-replace the following (only you can't use Ctrl+R like I expect.&amp;nbsp; Sigh.)&lt;/h4&gt;&lt;blockquote style="line-height: 16px; size: 10px;"&gt;&lt;code&gt;final&lt;/code&gt; = &lt;code&gt;readonly&lt;/code&gt; (but remove from method params)&lt;br /&gt;&lt;code&gt;System.out.printf&lt;/code&gt; = &lt;code&gt;Console.WriteLine&lt;/code&gt;&lt;br /&gt;&lt;code&gt;Map&lt;/code&gt; = &lt;code&gt;Dictionary&lt;/code&gt;&lt;br /&gt;&lt;code&gt;BigDecimal&lt;/code&gt; = &lt;code&gt;decimal&lt;/code&gt;&lt;br /&gt;&lt;code&gt;Set&lt;/code&gt;... oh.&amp;nbsp; I have no idea. &lt;/blockquote&gt;&lt;br /&gt;&lt;h4&gt;2. When using callbacks, replace anonymous inner classes with delegates&lt;/h4&gt;&lt;br /&gt;&lt;b&gt;Java&lt;/b&gt;&lt;br /&gt;&lt;blockquote style="clear: both;"&gt;&lt;pre&gt;&lt;code&gt;something.doSomething(new SomethingRequest(),&lt;br /&gt;  new SomethingCallBack()&lt;br /&gt;  {&lt;br /&gt;    public void onSuccess()&lt;br /&gt;    {&lt;br /&gt;      System.out.println("Action successful");&lt;br /&gt;    }&lt;br /&gt;  &lt;br /&gt;    public void onFailure()&lt;br /&gt;    {&lt;br /&gt;      System.err.println("Action failed");&lt;br /&gt;    }&lt;br /&gt;  });&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;C#&lt;/b&gt;&lt;br /&gt;&lt;blockquote style="clear: both;"&gt;&lt;pre&gt;&lt;code&gt;private void foo ()&lt;br /&gt;{&lt;br /&gt;  _something.DoSomething(new SomethingRequest(), &lt;br /&gt;                         SomethingSuccess, &lt;br /&gt;                         SomethingFailure);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private void SomethingSuccess()&lt;br /&gt;{&lt;br /&gt;  Console.WriteLine("Action successful");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private void SomethingFailure()&lt;br /&gt;{&lt;br /&gt;  Console.Error.WriteLine("Action failed");&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;I rather like this pattern actually.  You can't really tell in the noddy example above, but the C# code is generally shorter and more reusable.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;3. Replace getters and setters with properties&lt;/h4&gt;&lt;br /&gt;&lt;b&gt;Java&lt;/b&gt;&lt;br /&gt;&lt;blockquote style="clear: both;"&gt;&lt;pre&gt;&lt;code&gt;private class MyClass&lt;br /&gt;{&lt;br /&gt;  private BigDecimal myField = new BigDecimal("-1.0");&lt;br /&gt;&lt;br /&gt;  public BigDecimal getMyField()&lt;br /&gt;  {&lt;br /&gt;    return myField;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setMyField(BigDecimal instructionId)&lt;br /&gt;  {&lt;br /&gt;    this.myField = myField&lt;br /&gt;  }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;C#&lt;/b&gt;&lt;br /&gt;&lt;blockquote style="clear: both;"&gt;&lt;pre&gt;&lt;code&gt;internal class MyClass&lt;br /&gt;{&lt;br /&gt;  public decimal MyField{ get; set; }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;What the... where did all my code go??&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;My Thoughts&lt;/h4&gt;I was pleasantly surprised with the language.  In general, for what I was doing, the equivalent C# was a lot less code.  The fact that the syntax is not wildly different from Java made the transition relatively easy, even if I don't get all the nuances.&lt;br /&gt;&lt;br /&gt;I didn't really like the enums - I can see what purpose they serve, but I quite like the way the Java ones are pretty much classes in their own right with properties of their own - it allows you to encapsulate some of your simplest domain objects.  But it's a minor point, not a deal-breaker.&lt;br /&gt;&lt;br /&gt;The C# capitalisation makes me queasy though.  I just can't get my head around it.  In Java, if I say:&lt;br /&gt;&lt;pre&gt;com.mechanitis.foo.Bar&lt;/pre&gt;I know the class is Bar and the rest is the package (or namespace, or whatever).  This is more useful when you're using static methods and so forth:&lt;br /&gt;&lt;pre&gt;com.mechanitis.foo.Bar.thatThingIWantToDo()&lt;/pre&gt;&lt;br /&gt;In C#, I know the thing at the end is a method and the thing before that is a class, but it doesn't jump out at me:&lt;br /&gt;&lt;pre&gt;Com.Mechanitis.Foo.Bar.ThatThingIWantToDo();&lt;/pre&gt;&lt;br /&gt;And if you're using a property:&lt;br /&gt;&lt;pre&gt;Com.Mechanitis.Foo.Bar.MyProperty;&lt;/pre&gt;&lt;br /&gt;The whole thing makes me dizzy.&lt;br /&gt;&lt;br /&gt;You could argue that all this is redundant with modern tools and IDEs doing all the heavy lifting for you - nice colourisation etc.&lt;br /&gt;&lt;br /&gt;Which brings me to The Rant.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Oh My Dear God What Is Wrong With Visual Studio?&lt;/h3&gt;C# needs to be a shorter, more succinct language because it takes &lt;i&gt;three billion times longer&lt;/i&gt; to do anything in Visual bloody Studio.&lt;br /&gt;&lt;br /&gt;I'm coming at this from a Java, &lt;a href="http://www.jetbrains.com/idea/"&gt;IntelliJ &lt;/a&gt;point of view, so there's always the possibility it might be lack of familiarity with the tool, rather than the tool itself, which is the problem.&amp;nbsp; It's a long time since I used VS, and that was back in the 90s when I was doing ASP and COM (shhh, don't tell anyone).&lt;br /&gt;&lt;br /&gt;But things shouldn't be this hard.&amp;nbsp; I was ready to accept, due to my newbie status, the IDE not helping me. I didn't expect it to actively hinder me.&lt;br /&gt;&lt;br /&gt;For example: it took hours of my life that I will never get back to discover that you can't simply run a class that has a main method by right-clicking and selecting "run" (note: I'm not even trying Ctrl+F10).&amp;nbsp; No.&amp;nbsp; I have to select, at a Solution level, which Projects are runnable.&amp;nbsp; Then I have to select at the Project level the class with the main method I actually want to run.&amp;nbsp; Then, it opens up a terminal window and runs it in there, which promptly disappears when the program errors or finishes.&amp;nbsp; What's wrong with outputting in the output window of the IDE? Is that not what it's for?&lt;br /&gt;&lt;br /&gt;Finally I worked out how to run the cursed program (seriously, like that's not the first thing everyone wants to do?&amp;nbsp; How do people write "Hello World"?).&amp;nbsp; Now, where are the command line arguments?&amp;nbsp; Of course, they're at the project properties level too, because each project only has one entry point. &amp;nbsp;I seriously had to Google that too because I couldn't work it out from the IDE alone.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The next day, my &lt;a href="http://www.jetbrains.com/resharper/"&gt;ReSharper &lt;/a&gt;licence had expired. &amp;nbsp;I decided I should attempt to limp on without it, after all hundreds of developers must be surviving with just Visual Studio. &amp;nbsp;How bad could it be?&lt;br /&gt;&lt;br /&gt;Very bad, it turns out.&lt;br /&gt;&lt;br /&gt;All those helpful little squiggles I was leaning heavily on to convert my Java to C#?&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The red to tell you you're utterly wrong.&lt;/li&gt;&lt;li&gt;The orange to tell you could be using less code.&lt;/li&gt;&lt;li&gt;The blue to remind you to stop thinking in Java and helpfully offer corrected naming.&lt;/li&gt;&lt;li&gt;The green to suggest stuff that C# could do differently.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Yeah, all gone.&lt;br /&gt;&lt;br /&gt;How do people code like this?&amp;nbsp; Do they really just do a build to check if it's all wrong or not?&lt;br /&gt;&lt;br /&gt;Next, I try to find a class. &amp;nbsp;I actually&amp;nbsp;have no idea how to do this, because I can't use Ctrl+N.&amp;nbsp; So I Ctrl&lt;br /&gt;&lt;br /&gt;I realise this is a waste of time anyway, because one thing that &lt;i&gt;really&lt;/i&gt; annoys me about Visual Studio is that I can't find a way to sync the project tree to the class file I'm looking at. &amp;nbsp;I can't get it to jump to highlight where I am. &amp;nbsp;When I'm using IntelliJ, I find this dead useful when I want to see other stuff in the same package.&lt;br /&gt;&lt;br /&gt;Less than ten minutes after attempting to use Visual Studio without ReSharper, I've abandoned the fight and tracked down a licence and installed it.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Documentation isn't a standard function of .NET?&lt;/h3&gt;What sort of message does this give developers? &amp;nbsp;Documentation isn't important?&lt;br /&gt;&lt;br /&gt;I always thought&amp;nbsp;Javadoc was pretty ugly and clunky. In addition, now our IDEs generate so much, it's frequently meaningless.&amp;nbsp; But it is generated by standard Java tools, and HTML is a standard format that can be read on pretty much any computer with any operating system.&lt;br /&gt;&lt;br /&gt;I could not believe how hard it was to get the XML comments out of&amp;nbsp;the&amp;nbsp;C# into something the user can actually read.&amp;nbsp; Thank goodness, &lt;a href="http://www.symphonious.net/"&gt;some enterprising member of the team&lt;/a&gt; had already done that for us. &amp;nbsp;All I needed to do was hack/crowbar the tutorial I'd been working on into the generated documentation, so it ended up in the Windows help files in some fashion.&lt;br /&gt;&lt;br /&gt;I know there's a way to get HTML/XML files into the end result using &lt;a href="http://sandcastle.codeplex.com/"&gt;Sandcastle&lt;/a&gt;, but hours of Googling only told me it &lt;i&gt;was&lt;/i&gt; possible, not how to do it. &amp;nbsp;I still have no idea what the correct question is to ask to find the solution.&lt;br /&gt;&lt;br /&gt;Right now, this is an unsolved mystery. &amp;nbsp;Our .NET client users will have to read the plain HTML I'm afraid.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;In Conclusion&lt;/h3&gt;Are we lowly Java developers spoilt with our shiny IDEs?&lt;br /&gt;&lt;br /&gt;Or is there such a fundamentally different approach to development for .NET people that all the functionality is there, I just can't find it?&lt;br /&gt;&lt;br /&gt;I'm disappointed if I'm honest.&amp;nbsp; I'm sure the .NET camp used to tout their tools as their superiority.&amp;nbsp; I ended up feeling sorry for the poor NET people.&amp;nbsp; Is there anything they can use that isn't Visual Studio?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In Conclusion: Despite the nasty capitalisation I found myself surprisingly taken with C#. &amp;nbsp;But until they can give me a proper development environment, I won't be tempted by the dark side any time soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-1476066486546175731?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/1476066486546175731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/05/why-java-developers-hate-net.html#comment-form' title='24 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/1476066486546175731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/1476066486546175731'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/05/why-java-developers-hate-net.html' title='Why Java developers hate .NET'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>24</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-3223157679814214657</id><published>2011-05-16T18:20:00.001+01:00</published><updated>2011-05-17T08:13:22.400+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='ljc'/><title type='text'>The London Java Community elected to the JCP SE/EE Executive Committee</title><content type='html'>As an associate member of the &lt;a href="http://www.meetup.com/Londonjavacommunity/"&gt;London Java Community&lt;/a&gt; (LJC), I'm very pleased with the news that we won an Open seat on the Java SE/EE executive committee. &amp;nbsp;&lt;a href="http://jcp.org/en/whatsnew/elections"&gt;The results&lt;/a&gt; show that we got an astonishing 47.5% of the vote - if an MP got voted in with that percentage the newspapers would probably be using the word "landslide".&lt;br /&gt;&lt;br /&gt;It's quite exciting to be one of the two user groups involved. &amp;nbsp;We hope to balance some of the larger corporate organisations, we're the voice of real life Java developers who use the language every day, for enterprise development or open source projects.&lt;br /&gt;&lt;br /&gt;You can argue Java is dying, but the community is not. &amp;nbsp;And I think we're exactly the people to guide its future.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;PS (Warning: gratuitous plug incoming) If you're at all Java-curious and you like drinking and attempting to be social, join us this Tuesday for our monthly &lt;a href="http://www.meetup.com/Londonjavacommunity/events/16360581/"&gt;Developer Sessions&lt;/a&gt; at the Porterhouse in Covent Garden.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-3223157679814214657?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/3223157679814214657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/05/london-java-community-elected-to-jcp.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/3223157679814214657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/3223157679814214657'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/05/london-java-community-elected-to-jcp.html' title='The London Java Community elected to the JCP SE/EE Executive Committee'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-219020212519818308</id><published>2011-04-26T13:26:00.000+01:00</published><updated>2011-04-26T13:26:43.529+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='non-tech'/><category scheme='http://www.blogger.com/atom/ns#' term='cycling'/><title type='text'>Cyclist tribes</title><content type='html'>Living and working in central London, you quickly learn that the fastest way around town is to cycle.&lt;br /&gt;&lt;br /&gt;My extensive research into this activity has shown there are a number of different cycling tribes. Of course, I have split them into the two groups that are most appropriate to me: 1) slower than me and 2) faster than me. You can probably tell what sort of a cyclist I am by my attitude to the two groups.&lt;br /&gt;&lt;br /&gt;1. Slower than me:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Wicker shopping basket. Doesn't matter what the rest of the bike looks like, or the biker, I will always try to get ahead of these. &amp;nbsp;The extra scary ones are the women in flowing dresses who might be university professors.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Barclays_Cycle_Hire"&gt;Boris Bikes&lt;/a&gt;. &amp;nbsp;When there's a tube strike, Avoid At All Costs. &amp;nbsp;These people probably haven't been on a bike since they were in school, and it shows.&lt;/li&gt;&lt;li&gt;Hoody (always a male) on a BMX-style bike with the seat far too low, riding in too low a gear, with baggy jeans that show their... well... everything.&amp;nbsp;Never have lights on their bikes. &amp;nbsp;Always has a satchel / record bag for maximum inappropriately-dressed-for-cycling points. These buggers are a pain because they never obey traffic lights and will join the road from the pavement on either side, cutting you up in the process. Getting past them is easy, keeping them behind you is much harder.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Not wearing a helmet. Probably not a serious cyclist, so probably easy to overtake. A similar category to the hoody, doesn't obey traffic laws and enormously unpredictable. Otherwise known as an organ donor.&lt;/li&gt;&lt;li&gt;Wearing a skirt. Of course, this doesn't apply to me. In the same category: jeans, sandals, high-heeled shoes (not all at once).&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;2. Faster than me:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Cleats. If you have cleats on the bike I'm going to let you go first from the lights. You'll be fast and possibly suicidal when weaving through traffic.&lt;/li&gt;&lt;li&gt;Lycra, especially on a guy. Even if they're not faster than me, they will always overtake, and always pull in front of me at lights. It's an ego thing. &amp;nbsp;Something about those tight shorts possibly.&lt;/li&gt;&lt;li&gt;Panniers. Generally, but not always, a “proper” cyclist, even if they're on a rubbish bike. These guys have experience.&lt;/li&gt;&lt;/ul&gt;One to watch: businessman in a suit on a Brompton. You can't trust these guys, they can be deceptively fast. It's always embarrassing to be overtaken by them. How do they not sweat into their Armani?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Who does that leave?&lt;br /&gt;&lt;br /&gt;Well, my lot: helmet, high vis jacket, shorts (knee-length with pockets). Usually obeys the lights, quick enough, some unpredictability when over-/under-taking. Most of these guys will weave to some extent, but not suicidally. &amp;nbsp;My tribe is probably one of the biggest, and it leads to lots of subtle negotiation at traffic lights - sizing each other up - checking the bike, the kit, the shoes - to decide whether or not to pull ahead or drop back. &lt;br /&gt;&lt;br /&gt;But I mess with people's heads in summer by occasionally wearing a short skirt (with shorts underneath, I'm not out to cause accidents) and wedge sandals, and cycling at 20mph.&lt;br /&gt;&lt;br /&gt;I hate to conform to expectations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-219020212519818308?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/219020212519818308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/04/cyclist-tribes.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/219020212519818308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/219020212519818308'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/04/cyclist-tribes.html' title='Cyclist tribes'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-8625544868021823493</id><published>2011-04-18T09:25:00.000+01:00</published><updated>2011-04-18T09:25:06.411+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lmax'/><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>TradeTech 2011 - Not like a developer conference</title><content type='html'>I attended TradeTech last week, an annual event about Equities and Derivatives trading.  I assumed from the title that there would be a reasonable focus on technology, but I found it was more “Trade” and less “Tech”.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-bWCpxKcxqUo/TahF0DBHxII/AAAAAAAAIAc/XXZzeNj_4K0/s1600/DSC_0009.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="214" src="http://2.bp.blogspot.com/-bWCpxKcxqUo/TahF0DBHxII/AAAAAAAAIAc/XXZzeNj_4K0/s320/DSC_0009.jpg" style="cursor: move;" width="320" /&gt;&lt;/a&gt;The fascinating thing to me was how different this is from the sorts of technology conferences I've been to.  For example, I popped into &lt;a href="http://jaxlondon.com/"&gt;JAX&lt;/a&gt; this week (albeit in the evening for drinks).  At technology conferences (&amp;lt;gross-generalisation&amp;gt;) people tend to subscribe to a variety of dress codes and fashion clans, usually from jeans through the range of business casual, including your fair share of goths and alternatives.  Suits would be unusual (&amp;lt;/gross-generalisation&amp;gt;).  At this place, people were scarily conformist.  A few years back, the suits at least would be different colours – navy, greys and black – and may or may not include pin stripes.  On Thuresday, almost everyone was wearing a particular shade of tasteful dark grey.&lt;br /&gt;&lt;br /&gt;I was also pretty shocked at the time people snuck off to go to the pub.  Don't get me wrong, I'm all in favour of imbibing alcoholic beverages as frequently as possible. &amp;nbsp;And I prefer networking in the pub to poncing around in some conference centre.  But I feel it's Bad Form, and I was surprised (and a little bit jealous) that it seemed to be the norm.  I felt for all of the later presenters.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-YInq4o3Vu8c/TahGzuaMylI/AAAAAAAAIAk/vCmhBplBl3g/s1600/DSC_0001.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="214" src="http://2.bp.blogspot.com/-YInq4o3Vu8c/TahGzuaMylI/AAAAAAAAIAk/vCmhBplBl3g/s320/DSC_0001.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Still, I showed my support for them and I turned up to some actual presentations. &amp;nbsp;The most interesting ones to me were Baroness Eliza Manningham-Buller talking about her time as head of MI5, and Richard Peterson going Inside the Trader's Brain.&lt;br /&gt;&lt;br /&gt;The Baroness was talking about leadership during times of crisis – she was in charge shortly after 9/11.  What I found interesting, and resonated with me, was her focus on her people.  An intelligence organisation is all about the people who work for it.  She stressed that it was important to bring fun into the work place, especially because it was a particularly traumatic period to be working.  She instigated family days and helped the employees show their families what it was they did.  I'm not quite sure how much they could show, given the nature of that industry.  But I liked that she understood the people were more than just minions, workers in a hive, that they had families and that they wanted to be proud of their work and share it with the significant people in their lives.&lt;br /&gt;&lt;br /&gt;She also refused to take credit for anything for herself, but talked about her team, about the people around her and in the organisation. I like leaders who recognise that it's not all about them.&lt;br /&gt;&lt;br /&gt;The thing that stuck with me the most is she said that leaders who take themselves too seriously are not taken seriously by their underlings.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-3a8b0gyz_wM/TahHg3a-m-I/AAAAAAAAIAo/izyXXXYoXbI/s1600/DSC_0005.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="214" src="http://1.bp.blogspot.com/-3a8b0gyz_wM/TahHg3a-m-I/AAAAAAAAIAo/izyXXXYoXbI/s320/DSC_0005.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Richard Peterson's presentation was about the risk-taking and risk-avoidance areas of the brain.  He showed how your risk-taking behaviour is influenced by bias, and how subtle it is.  There was a lot of interesting stuff in this, which scratches my random-interest-in-psychology itch, and confirms what I've been reading/hearing about how behaviour can be triggered and changed.&lt;br /&gt;&lt;br /&gt;Ultimately he gave some advice for how to reduce the impact the rest of the world might have on your trading strategy, which is applicable to all of us:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Maintain healthy routines&lt;/li&gt;&lt;li&gt;Take time to reflect daily&lt;/li&gt;&lt;li&gt;Letting go&lt;/li&gt;&lt;li&gt;Gratitude&lt;/li&gt;&lt;/ol&gt;The ulterior motive for me to be at TradeTech was to watch my boss's “How To Do 100,000 Transactions Per Second At Less Than 1 Millisecond Latency?” presentation.  This was a cut-down and updated version of the one he and &lt;a href="http://mikes-tech.blogspot.com/"&gt;Mike&lt;/a&gt; gave &lt;a href="http://www.infoq.com/presentations/LMAX"&gt;at QCon&lt;/a&gt; last year.  If you are at all interested in concurrency, high performance, or programming generally, it's well worth the hour to watch it.  It outlines the architecture we use at &lt;a href="http://community.lmaxtrader.com/"&gt;LMAX&lt;/a&gt; to get very high performance from our exchange without using anything particularly special in terms of hardware.  All it takes is good design and something Martin calls mechanical sympathy.&lt;br /&gt;&lt;br /&gt;Anyway enough corporate plugging.&lt;br /&gt;&lt;br /&gt;Overall I came back from TradeTech with lots of ideas of things I wanted to do at work and ways to help us market the platform in future.  I also came back with a certain cynicism for these types of very vendor-heavy events.  However, I did meet some interesting people, and it was a different crowd to my usual technical comfort zone.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;And it did get me thinking, which is really all these things should do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-8625544868021823493?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/8625544868021823493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/04/tradetech-2011-not-like-developer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/8625544868021823493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/8625544868021823493'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/04/tradetech-2011-not-like-developer.html' title='TradeTech 2011 - Not like a developer conference'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-bWCpxKcxqUo/TahF0DBHxII/AAAAAAAAIAc/XXZzeNj_4K0/s72-c/DSC_0009.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-3016439808057670796</id><published>2011-04-12T10:48:00.000+01:00</published><updated>2011-04-12T10:48:15.669+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reference'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>CSS for Developers: Horizontal and Vertical Centring</title><content type='html'>First, an apology. &amp;nbsp;I will be using the British spelling for "centre", because, well, I'm British. &amp;nbsp;But it gets really confusing because you have to use the American spelling in the code. &amp;nbsp;And doesn't "Centring" just look wrong?&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 18px; font-weight: bold; line-height: 20px;"&gt;Part Five: Horizontal and Vertical Centring&lt;/span&gt;&lt;/div&gt;One of the most common things you want to do with blocks of content is to centre it. &amp;nbsp;In particular, you would think that vertically centring content would be straightforward, but it turns out that in HTML/CSS it just isn't.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5.1 Horizontal Centring&lt;/b&gt;&lt;br /&gt;Centring a paragraph of text is clearly easy - all you need is &lt;code&gt;text-align: center&lt;/code&gt;. &amp;nbsp;However, sometimes you want to centre a block, something like a div, without having all the text centred as well. &amp;nbsp;This is slightly trickier than you might expect, because the only CSS attributes you have are for centring text.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-s_aPLxH1lO0/TZ85v7cEiDI/AAAAAAAAH-s/f6Glb4ynFq8/s1600/Horizontal+Centering.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="310" src="http://1.bp.blogspot.com/-s_aPLxH1lO0/TZ85v7cEiDI/AAAAAAAAH-s/f6Glb4ynFq8/s400/Horizontal+Centering.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;blockquote style="clear: both;"&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Horizontal Centering&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;        #div1, #div13 {&lt;br /&gt;            background-color: #DDDDDD;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        #div2, #div14 {&lt;br /&gt;            background-color: #BBBBBB;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        #div3, #div15 {&lt;br /&gt;            background-color: #999999;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        #container, #container5 {&lt;br /&gt;            border: 1px solid black;&lt;br /&gt;            margin: 5px;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        #container5 {&lt;br /&gt;            text-align: center;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        #to-center {&lt;br /&gt;            margin-left: auto;&lt;br /&gt;            margin-right: auto;&lt;br /&gt;            width: 200px;&lt;br /&gt;            border: 5px solid red;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        #to-center2 {&lt;br /&gt;            margin-left: auto;&lt;br /&gt;            margin-right: auto;&lt;br /&gt;            width: 200px;&lt;br /&gt;            border: 5px solid red;&lt;br /&gt;            display: block;&lt;br /&gt;            position: relative;&lt;br /&gt;            text-align: left;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div id="container"&amp;gt;&lt;br /&gt;    &amp;lt;div id="to-center"&amp;gt;&lt;br /&gt;        &amp;lt;div id="div1"&amp;gt;One&amp;lt;/div&amp;gt;&lt;br /&gt;        &amp;lt;div id="div2"&amp;gt;Two&amp;lt;/div&amp;gt;&lt;br /&gt;        &amp;lt;div id="div3"&amp;gt;Three&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id="container5"&amp;gt;&lt;br /&gt;    &amp;lt;div id="to-center2"&amp;gt;&lt;br /&gt;        &amp;lt;div id="div13"&amp;gt;One&amp;lt;/div&amp;gt;&lt;br /&gt;        &amp;lt;div id="div14"&amp;gt;Two&amp;lt;/div&amp;gt;&lt;br /&gt;        &amp;lt;div id="div15"&amp;gt;Three&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;Using &lt;code&gt;margin-left: auto&lt;/code&gt; and &lt;code&gt;margin-right: auto&lt;/code&gt; on the block you want to centre is a neat trick for doing this. &amp;nbsp;And it works fine in Chrome and Firefox. &amp;nbsp;However, it's not so great in IE 7:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-7CjwdD0e5Zs/TaQMBDIixyI/AAAAAAAAH-0/pr1B7IG1ZTw/s1600/centering-in-ie.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="173" src="http://3.bp.blogspot.com/-7CjwdD0e5Zs/TaQMBDIixyI/AAAAAAAAH-0/pr1B7IG1ZTw/s400/centering-in-ie.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The trick for getting it centred here (the second block) is to set &lt;code&gt;text-align: centre&lt;/code&gt; on the div containing the block to centre (&lt;code&gt;container5&lt;/code&gt;), then reset the &lt;code&gt;text-align&lt;/code&gt; to &lt;code&gt;left&lt;/code&gt; on the centred block (&lt;code&gt;to-center2&lt;/code&gt;) so the text isn't centred. &amp;nbsp;Yes, a total faff.&lt;br /&gt;&lt;br /&gt;However, there is some good news. &amp;nbsp;You can get IE to behave the same way as the more sane browsers by setting it into Strict Mode:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-leiXBjTwj-Q/TaQN9OV5ToI/AAAAAAAAH-4/qKj3Kr8nOxc/s1600/strict-mode-ie.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="173" src="http://1.bp.blogspot.com/-leiXBjTwj-Q/TaQN9OV5ToI/AAAAAAAAH-4/qKj3Kr8nOxc/s400/strict-mode-ie.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Remember kids: Strict Mode Is Your Friend. &amp;nbsp;And all you need to do is add the following to the top of your HTML file:&lt;br /&gt;&lt;blockquote style="clear: both;"&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;b&gt;5.2 Vertical Centring&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-MfC3Bqvoif4/TaQQafZOJWI/AAAAAAAAH-8/f-Micc1inTU/s1600/Screenshot-Vertical+Centering+-+Google+Chrome.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="311" src="http://4.bp.blogspot.com/-MfC3Bqvoif4/TaQQafZOJWI/AAAAAAAAH-8/f-Micc1inTU/s400/Screenshot-Vertical+Centering+-+Google+Chrome.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;blockquote style="clear: both;"&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Vertical Centering&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;        #div1, #div4, #div7 {&lt;br /&gt;            background-color: #DDDDDD;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        #div3, #div6, #div9 {&lt;br /&gt;            background-color: #999999;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        #div5 {&lt;br /&gt;            height: 40px;&lt;br /&gt;            line-height: 40px;&lt;br /&gt;            background-color: yellow;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        #div2 {&lt;br /&gt;            height: 50px;&lt;br /&gt;            background-color: orange;&lt;br /&gt;            vertical-align: middle;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        #div8 {&lt;br /&gt;            height: 40px;&lt;br /&gt;            line-height: 40px;&lt;br /&gt;            background-color: cyan;&lt;br /&gt;            font-weight: bolder;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        #container1, #container2, #container3 {&lt;br /&gt;            border: 1px solid black;&lt;br /&gt;            margin: 5px;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div id="container2"&amp;gt;&lt;br /&gt;    &amp;lt;div id="div4"&amp;gt;One&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="div5"&amp;gt;Two&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="div6"&amp;gt;Three&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id="container1"&amp;gt;&lt;br /&gt;    &amp;lt;div id="div1"&amp;gt;One&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="div2"&amp;gt;Two&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="div3"&amp;gt;Three&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id="container3"&amp;gt;&lt;br /&gt;    &amp;lt;div id="div7"&amp;gt;One&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="div8"&amp;gt;Massive line of text that needs to wrap to show the centering totally doesn't work when you have more than one line of text.&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="div9"&amp;gt;Three&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;Given some of the problems with horizontal alignment, it shouldn't come as a surprise to find vertical alignment is not simple at all.&lt;br /&gt;&lt;br /&gt;Us straightforward developer types would expect to be able to put &lt;code&gt;vertical-align: middle&lt;/code&gt; on a div and expect all content inside that div to be, well, vertically aligned in the middle. &amp;nbsp;However this is not the case - see the orange block above. &amp;nbsp;A quick Google will tell you why this doesn't work, and I don't intend to duplicate the explanation here.&lt;br /&gt;&lt;br /&gt;There is a nice hack which works for single lines of text though: if you set the &lt;code&gt;height&lt;/code&gt; of the container and the &lt;code&gt;line-height&lt;/code&gt; to the same value, the text will be vertically centred within that container (see the yellow panel, &lt;code&gt;div5&lt;/code&gt;, above). This works really well for things like buttons or icons.&lt;br /&gt;&lt;br /&gt;However, it doesn't work so well for paragraphs of text or sentences that might wrap, &lt;code&gt;line-height&lt;/code&gt; is for a single line of text only. &amp;nbsp;See the cyan panel above for what happens if your text wraps.&lt;br /&gt;&lt;br /&gt;I'd love to give you an answer on how to get this to work for text that wraps, but I haven't found a satisfactory solution yet. &amp;nbsp;What I usually do is set a fixed height on the container and then set the margin on the text so that it sits in a way that looks vaguely centred. &amp;nbsp;Not a solution I'm happy with, because a) it can sometimes render slightly differently on different browsers b) it's a very fragile solution if you're going to internationalise your page as some languages will have longer or shorter paragraphs and c) it feels like a massive hack.&lt;br /&gt;&lt;br /&gt;If anyone has a nice solution for vertically centring paragraphs of text I'd love to hear it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-3016439808057670796?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/3016439808057670796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/04/css-for-developers-horizontal-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/3016439808057670796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/3016439808057670796'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/04/css-for-developers-horizontal-and.html' title='CSS for Developers: Horizontal and Vertical Centring'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-s_aPLxH1lO0/TZ85v7cEiDI/AAAAAAAAH-s/f6Glb4ynFq8/s72-c/Horizontal+Centering.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-3216679066386100979</id><published>2011-04-04T08:17:00.000+01:00</published><updated>2011-04-04T08:17:07.427+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='work environment'/><title type='text'>How to show your employees how much you hate them</title><content type='html'>Due to a combination of my restlessness, my consulting experience, and employers that insist on moving offices frequently, I've had the dubious honour of working in a variety of environments.&lt;br /&gt;&lt;br /&gt;Today I will teach you, the employer, how to show your staff just how much you hate them.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Kitchen Is Not For Eating In&lt;/b&gt;&lt;br /&gt;Since eating and drinking is unfortunately a fundamental part of being human and staying alive, you will need to provide your staff with a space that pretends to address these needs.&lt;br /&gt;&lt;br /&gt;The best example I have seen so far has been a "kitchen" with: no sink; no kettle; no microwave; a tiny under-counter fridge for employee food (for approx 50 employees); nowhere to sit and a maximum&amp;nbsp;capacity&amp;nbsp;of 3 people standing. You're probably wondering how I knew it was a kitchen. &amp;nbsp;Well, it had a counter top. And a coffee machine which also dispensed slightly warmed water. &amp;nbsp;And The Largest Drinking Water Dispenser In The World&lt;sup&gt;1&lt;/sup&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;The most important thing to remember here is that This Is Not A Communal Space. &amp;nbsp;Heaven forbid that your&amp;nbsp;minions&amp;nbsp;actually&amp;nbsp;&lt;i&gt;talk&amp;nbsp;&lt;/i&gt;to each other.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;For bonus points: if you really want to show your code monkeys how much you despise them, you can dispense with the coffee machine entirely and supply only Nescafe Gold Blend instant coffee. &amp;nbsp;Honestly, developers don't care what form their caffeine comes in&lt;sup&gt;2&lt;/sup&gt;. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Importance Of The Loo/Bathroom/Restroom&lt;/b&gt;&lt;br /&gt;(Note for our North American brethren - there's no bath in there and I certainly don't go there to rest. &amp;nbsp;Can we call them toilets and be done with it?)&lt;br /&gt;&lt;br /&gt;If the cubicle door looks like it's already come off the hinges a couple of times and been sellotaped back on, if the cubicles are made of plywood, if there's a&amp;nbsp;genuine&amp;nbsp;chance that someone could get trapped in there by the dodgy door lock, if the loo paper is that tracing paper you used to get in school, perfect. You've managed to convey to your staff just how little they mean to you. &amp;nbsp;If you have been successful in this, your employees will show you exactly how they feel about you by the state they leave the bathrooms in.&lt;br /&gt;&lt;br /&gt;For bonus points:&amp;nbsp;don't pay the cleaning staff enough so the paper and towels aren't replaced frequently.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;The Office Canteen Is Also Not For Eating In&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;If you've done your job correctly with the kitchen and the toilets, your employees are probably desperate for somewhere they can congregate. &amp;nbsp;You must not allow this - if they get together, they could have Dangerous Conversations, where they Share Ideas and Collaborate.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;A rookie mistake would be to not provide a canteen at all. &amp;nbsp;Do not fall into this trap! If you don't provide food on site, your staff will leave the building, and who knows where they're going to go, what they'll get up to, who they might meet? &amp;nbsp;No, you want to provide them with facilities you control.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;However, you want them to go to their miserable little cubicles to eat, so make sure there isn't enough space for them to sit in the canteen. &amp;nbsp;For best results, provide a couple of tables and chairs but ensure they're always filled. &amp;nbsp;That gives them&amp;nbsp;elusive&amp;nbsp;hope that maybe, some day, they will be the ones on that table.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;For bonus points: have a separate management restaurant. &amp;nbsp;This should be visible enough that your employees are aware it exists and that it's better (table service, for example), but private enough that it becomes a mythical place. Then you must make sure they know, every day, that they are not allowed to use it.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Go For Tones Of Grey And Brown&lt;/b&gt;&lt;br /&gt;Nothing says "your life is worthless" like a 1970s-council-style-office. &amp;nbsp;If it's made of concrete and has laminated mirrored windows, so much the better. &amp;nbsp;To go the extra mile, put up 10 foot high "inspirational" photos of people playing on beaches, in black and white. &amp;nbsp;That way your employees will remember that there is an exciting world out there, but they can't get to it, and they can't even enjoy it by proxy in this miserable, monochromatic office.&lt;br /&gt;&lt;br /&gt;For bonus points: your cupboards should all be laminated&amp;nbsp;Formica, in murky brown.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Reduce Natural Light Sources&lt;/b&gt;&lt;br /&gt;I used to think that working in a basement was the worst fate that could befall me. After I did it twice, I swore to never again work in an office with no natural light.&lt;br /&gt;&lt;br /&gt;However, there is an even more devious way to make your staff miserable. Ensure there are windows in the office, nice big ones. &amp;nbsp;Then build cubicles throughout the floor, so that your employees can see there &lt;i&gt;is&lt;/i&gt; a window, but they cannot see out of it, or receive any actual light from it. &amp;nbsp;Watch them pine and fade away, or fight over the desks close to the window.&lt;br /&gt;&lt;br /&gt;For bonus points: make sure the people closest to the windows have their monitors angled for maximum screen glare. &amp;nbsp;Then these unfortunates will close the office blinds voluntarily, and really minimise vitamin D production in your minions.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Provide Beds/Bedrooms In The Office&lt;/b&gt;&lt;br /&gt;Now, you might be thinking that this is a little cushy for your minions. &amp;nbsp;I can assure you, the drain on morale is worth it. &amp;nbsp;By providing beds, you don't have to shell out for expensive hotels for visiting employees, or for taxis for those who have to work late. &amp;nbsp;It gives your staff the message that they belong to you, you even own their sleeping hours.&lt;br /&gt;&lt;br /&gt;For bonus points: put the bedrooms on the Management Floor (you know, that special floor for those who have Made It), so that your lowest-level employees have to walk through this opulent splendour in order to grab a couple of hours of poor quality sleep, before being herded back into their cubicles to put in another 20 hour day.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;In Conclusion&lt;/b&gt;&lt;br /&gt;It doesn't matter what size company you are, by following some or all of these rules you can successfully communicate to your Peons just how meaningless their little lives are to you. &amp;nbsp;Large companies seem to be particularly good at this, but a determined start-up can also alienate all three of its employees if it tries.&lt;br /&gt;&lt;br /&gt;By showing your staff how much you hate them, you are sure to attract and retain the best quality people, and motivate them to work hard and efficiently to realise business value for you.&lt;br /&gt;&lt;br /&gt;Oh wait....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;sup&gt;1&lt;/sup&gt; It was the size of a wardrobe.  All it did was filter and UV "purify" tap water.  It  also claimed to be smart, it would dispense a cup if you needed one and detect if you didn't.  It attempted to determine the size of the container you placed in it and fill it appropriately (and failed every time).  It would tell you how many seconds were left until it had finished filling your vessel, but not give you the option to stop it, or to continue for longer.  Seriously.  A tap would have been fine.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;sup&gt;2&lt;/sup&gt; In case you don't know - they really DO care. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-3216679066386100979?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/3216679066386100979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/04/how-to-show-your-employees-how-much-you.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/3216679066386100979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/3216679066386100979'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/04/how-to-show-your-employees-how-much-you.html' title='How to show your employees how much you hate them'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-8623350543864861177</id><published>2011-02-14T21:42:00.002Z</published><updated>2011-02-14T21:54:48.186Z</updated><title type='text'>For those who might want to make the leap from Developer to Architect</title><content type='html'>The last two weeks, actual work has conspired to keep me away from the blog. How rude. I miss "the beach" already.&lt;br /&gt;&lt;br /&gt;It seems only fair to summarise the lessons I have learnt whilst masquerading as an architect on a short consulting stint with &lt;a href="http://www.dancingmango.com/blog/"&gt;Marc McNeill&lt;/a&gt;. &amp;nbsp;Simon Brown at &lt;a href="http://www.codingthearchitecture.com/"&gt;Coding the Architecture&lt;/a&gt; is much better at talking about this stuff than I am, but I need to update the blog with something!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Ask dumb questions&lt;/b&gt;&lt;br /&gt;Someone's called you in because they want your help, and presumably if their problem was simple they would have fixed it already. &amp;nbsp;You're not there to know everything out of the box, you're there to find out what's going on and summarise it. That means asking questions, even the dumb ones. &amp;nbsp;That's something I learnt off &lt;a href="http://www.davefarley.net/"&gt;my previous boss&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Draw lots of pretty pictures&lt;/b&gt;&lt;br /&gt;As a developer, I like to think in code, I like to poke around it to find out what's going on. &amp;nbsp;But if you want to get a feel for the bigger picture, not having access to the code, or even the&amp;nbsp;documentation, could be better. &amp;nbsp;It forces you to look beyond the detail. &amp;nbsp;Sketch things out on the whiteboard to help get the picture of the domain and the systems in your head. &lt;br /&gt;&lt;br /&gt;Of course, there's always the worry that your pictures aren't the reality. &amp;nbsp;That's why you need to...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Check your theories/pictures/numbers with everyone&lt;/b&gt;&lt;br /&gt;In the first week of the engagement I made some assumptions based on the information I had gathered so far. &amp;nbsp;Once I'd run those past the architects and developers really working on the code, I found they were only half the story. &amp;nbsp;The feedback from those guys helped evolve the picture of the current state of play, and shaped the future direction.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. Take notes&lt;/b&gt;&lt;br /&gt;Especially of acronyms used and people's names and roles.&lt;br /&gt;&lt;br /&gt;This is probably more a "me" thing. &amp;nbsp;My memory works as an index, so I need the detail somewhere - I can remember I wrote something about something, and where I wrote it, but I won't remember the details. &amp;nbsp;I also find that simply writing things down helps to get it straight in my head. &amp;nbsp;I probably didn't use 50% of my notes, but all that information was in my head.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;5. Buy your own whiteboard pens!&lt;/b&gt;&lt;br /&gt;I've worked in a lot of places, as a consultant and a permanent employee. &amp;nbsp;And one thing you can almost guarantee is that the pens in your meeting room will not work. &amp;nbsp;Or they'll be permanent.&lt;br /&gt;&lt;br /&gt;I also bought a board rubber and spray cleaner, but that's probably my OCD....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;At the end of an intense two weeks we had delivered:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A picture of the existing architecture&lt;/li&gt;&lt;li&gt;Pictures of three phases of future architecture&lt;/li&gt;&lt;li&gt;An approximate roadmap for delivery&lt;/li&gt;&lt;li&gt;Guide estimates for the stories discovered&lt;/li&gt;&lt;li&gt;...and pages and pages of supporting diagrams and information.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;The air in Les Alpes must've helped get the brain moving! &amp;nbsp;Of course, I took my camera on my little jaunt to France.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-K4qsRxew0X4/TVma3mkCSmI/AAAAAAAAH-Q/IFeWDHl1W4U/s1600/DSC_0128.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://4.bp.blogspot.com/-K4qsRxew0X4/TVma3mkCSmI/AAAAAAAAH-Q/IFeWDHl1W4U/s400/DSC_0128.JPG" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It was a great first role for me at ThoughtWorks. &amp;nbsp;I worked my socks off and thoroughly enjoyed it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-8623350543864861177?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/8623350543864861177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/02/for-those-who-might-want-to-make-leap.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/8623350543864861177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/8623350543864861177'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/02/for-those-who-might-want-to-make-leap.html' title='For those who might want to make the leap from Developer to Architect'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-K4qsRxew0X4/TVma3mkCSmI/AAAAAAAAH-Q/IFeWDHl1W4U/s72-c/DSC_0128.JPG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-5626883308637084555</id><published>2011-01-28T10:53:00.001Z</published><updated>2011-01-28T11:00:56.088Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='reference'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>CSS for Developers: Cross Browser Table Border Behaviour</title><content type='html'>One of the aims of this series is to highlight some stupid gotchas in support for CSS in the different browsers.&lt;br /&gt;&lt;br /&gt;Today's gotcha is table borders.&lt;br /&gt;&lt;br /&gt;Yes, yes, I said don't use tables. &amp;nbsp;What I means is, don't use tables for layout. But you can use tables for, you know, tabular data. &amp;nbsp;Like, for examples, &lt;a href="http://www.lmaxtrader.co.uk/"&gt;lists of instruments and their bid and ask prices&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;But you should know that even when you use strict mode, Internet Explorer has slightly... eccentric... rendering behaviour for tables. &amp;nbsp;Actually to be specific, it's IE7 only.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_7adQd_YVgmQ/TUKbXmpH7EI/AAAAAAAAH8U/r5TfaQlzi9E/s1600/Screen+shot+2011-01-28+at+10.28.51.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_7adQd_YVgmQ/TUKbXmpH7EI/AAAAAAAAH8U/r5TfaQlzi9E/s1600/Screen+shot+2011-01-28+at+10.28.51.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Table Borders&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;        table, td {&lt;br /&gt;            border: 1px solid black;&lt;br /&gt;        }&lt;br /&gt;        td {&lt;br /&gt;            height: 20px;&lt;br /&gt;            min-width: 5px;&lt;br /&gt;        }&lt;br /&gt;    &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;table cellpadding="0" cellspacing="0"&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;first cell&amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;second&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&lt;br /&gt;            &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;        &amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&lt;br /&gt;            &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;        &amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;The HTML here is a simple table with a border round all the cells (using CSS &lt;code&gt;border&lt;/code&gt;, not the deprecated border attribute on the table) - a fairly common situation.&lt;br /&gt;&lt;br /&gt;This is how it renders in IE7:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_7adQd_YVgmQ/TUKh2Lb-S0I/AAAAAAAAH8c/9BQkjC_UaFg/s1600/table-borders-in-ie.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="466" src="http://4.bp.blogspot.com/_7adQd_YVgmQ/TUKh2Lb-S0I/AAAAAAAAH8c/9BQkjC_UaFg/s640/table-borders-in-ie.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Note the distinct lack of a border around the lower two cells. &amp;nbsp;If a table cell is empty, or contains a div which is empty, IE doesn't render the cell at all.&lt;br /&gt;&lt;br /&gt;The cheat to get around this is to add &lt;code&gt;&amp;amp;nbsp;&lt;/code&gt; into every empty cell - either inside the div, if there's a div in there, or inside the td if there's nothing else in there. &amp;nbsp;Then IE wakes up and remembers to render the borders.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-5626883308637084555?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/5626883308637084555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/01/css-for-developers-cross-browser-table.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/5626883308637084555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/5626883308637084555'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/01/css-for-developers-cross-browser-table.html' title='CSS for Developers: Cross Browser Table Border Behaviour'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_7adQd_YVgmQ/TUKbXmpH7EI/AAAAAAAAH8U/r5TfaQlzi9E/s72-c/Screen+shot+2011-01-28+at+10.28.51.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-2600304540716703461</id><published>2011-01-27T09:56:00.001Z</published><updated>2011-01-27T10:00:26.670Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>My Experiences with Android Development</title><content type='html'>Because I was missing coding, and because my friend and I had an awesome phone app idea at the weekend, I thought I'd try my hand at developing an Android application this week.&lt;br /&gt;&lt;br /&gt;I want to give a quick overview of my preliminary thoughts on getting started on this endeavour. &lt;br /&gt;&lt;br /&gt;Background: I've got more than 10 years Java experience, but any UI for the applications I've worked on was always a web UI. &amp;nbsp;I am &lt;i&gt;completely&lt;/i&gt; new to mobile app development.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Getting Started&lt;/b&gt;&lt;br /&gt;I spent maybe a day and a half reading the excellent &lt;a href="http://developer.android.com/guide/basics/what-is-android.html"&gt;Android developer documentation&lt;/a&gt;&amp;nbsp;and attempting to hack out a quick 'droid app.&lt;br /&gt;&lt;br /&gt;I was surprised to find the &lt;a href="http://developer.android.com/guide/topics/fundamentals.html"&gt;Application Fundamentals&lt;/a&gt; section actually made sense to me. &amp;nbsp;There appears to be a clear architecture with design guidelines laid out for developers to follow. &amp;nbsp;This shouldn't really be a surprise I suppose, but years of hacking around with web UIs with poorly implemented MVC architectures must have left me thinking that all frameworks are less "frame" and more "work".&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Setup&lt;/b&gt;&lt;br /&gt;I remember the disaster of trying to get my first JDK working on my 486 - what a nightmare! &amp;nbsp;And getting Tomcat 3 installed and running? &amp;nbsp;Forget it. &amp;nbsp;I also remember the last time I made a serious stab at a learning a new technology. &amp;nbsp;I tried develop a &lt;a href="http://www.grails.org/"&gt;Grails&lt;/a&gt;/Groovy application in Eclipse. &amp;nbsp;The IS guys had to rescue my laptop from me during that enterprise before I could do it any serious damage.&lt;br /&gt;&lt;br /&gt;Installing the SDK on my mac was surprisingly simple, especially bearing in mind I'm new both to OSX and to mobile development. &amp;nbsp;I don't know if it's because Android development has been well thought out and well supported, or if it's a function of both the industry's maturity and my own experience. &lt;br /&gt;&lt;br /&gt;The integration with &lt;a href="http://www.jetbrains.com/idea/"&gt;IntelliJ&lt;/a&gt; was much slicker than I expected, especially since I'm using the freebie Community edition. &amp;nbsp;I don't remember the exact steps to tell it I wanted to create an Android project, but it must have been ridiculously easy otherwise I would remember the trauma. &amp;nbsp;I do remember a little confusion around installing the Android platform - I hadn't understood the difference between installing the SDK and then installing a specific API for it. &amp;nbsp;But the &lt;a href="http://developer.android.com/guide/developing/other-ide.html"&gt;documentation&lt;/a&gt; and the &lt;a href="http://developer.android.com/guide/developing/tools/othertools.html#android"&gt;android&lt;/a&gt; application got me on the right track in the end. &amp;nbsp;And then when I clicked the "run" button in IntelliJ, hey presto! &amp;nbsp;The emulator appeared and there was my app!&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I loved the emulator. &amp;nbsp;I had some confused idea that I would have to plug my own phone into the laptop to see my application. &amp;nbsp;Instead, the emulator looks enough like my actual phone to give me decent feedback on how the app is going to behave. &amp;nbsp;The downside is I was trying to play with the camera, and I couldn't see how that would really work in the emulator, but I got a fair idea.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Did it work?&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I managed to get a rudimentary application running, with a button and some descriptive text (it's not about to win any awards). &amp;nbsp;The button was supposed to launch the camera viewer, but my first few attempts just resulted in the crash notification. &amp;nbsp;It didn't take long to figure out how to use &lt;a href="http://developer.android.com/guide/developing/debug-tasks.html"&gt;logcat&lt;/a&gt; to see the stack trace and see I hadn't set the permissions correctly to use the camera, so I rooted through the &lt;a href="http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html"&gt;CameraPreview&lt;/a&gt; example in &lt;a href="http://developer.android.com/resources/samples/ApiDemos/index.html"&gt;APIDemos &lt;/a&gt;to figure out how to set up the AndroidManifest.xml correctly, and rather amazingly it all worked!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Any downsides?&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I was surprised (and slightly disappointed) at the amount of XML configuration. &amp;nbsp;I've seen plenty of evil Spring and Ant XML in the enterprise and I thought frameworks were moving away from that. &amp;nbsp;The manifest I can understand I suppose, but it felt a bit weird to be defining the UI in XML. &amp;nbsp;It seemed like a bit of an afterthought tagged on after all the well-defined architecture behind the scenes.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;But maybe this will make more sense to me as I develop my application further.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;In Summary&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;I was pleasantly surprised to be able to get an Android application (albeit a very basic one) working in only a few hours.&lt;/li&gt;&lt;li&gt;Development in IntelliJ was &lt;i&gt;much &lt;/i&gt;easier than I expected.&lt;/li&gt;&lt;li&gt;The documentation is actually very good.&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;We'll see how I feel about it when I start trying to do more than a very simple example application.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-2600304540716703461?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/2600304540716703461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/01/my-intro-to-android-development.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2600304540716703461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2600304540716703461'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/01/my-intro-to-android-development.html' title='My Experiences with Android Development'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-7810960408054466345</id><published>2011-01-25T09:08:00.000Z</published><updated>2011-01-25T09:08:09.012Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='reference'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>CSS for Developers: Column Layout Using CSS</title><content type='html'>This is a continuation of my &lt;a href="http://mechanitis.blogspot.com/search/label/css"&gt;series of CSS&lt;/a&gt; hints / tips / cheats for developers (and other technical-but-not-UI people).&lt;br /&gt;&lt;br /&gt;The screenshots are in Chrome on a Mac. &amp;nbsp;The originals were on Firefox on Ubuntu so I can tell you the behaviour is identical.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Part Three: Column Layout Using CSS (or: still no excuse to use tables)&lt;/h3&gt;&lt;div&gt;Today's example is a simple one, but worth knowing all the same. &amp;nbsp;The aim is, once again, not to use HTML tables to provide any sort of layout. &amp;nbsp;In most cases not only does using a div reduce the size of your DOM (and potentially help &lt;a href="http://mechanitis.blogspot.com/2011/01/gwt-why-verticalpanel-is-evil.html"&gt;improve the performance of your page&lt;/a&gt;), it's actually a lot less complicated to organise your layout this way.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;3.1 Display Elements or Text in Columns&lt;/h4&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_7adQd_YVgmQ/TT1v4bAebwI/AAAAAAAAH8Q/oM4PAaNx3dI/s1600/Screen+shot+2011-01-24+at+12.21.02.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_7adQd_YVgmQ/TT1v4bAebwI/AAAAAAAAH8Q/oM4PAaNx3dI/s1600/Screen+shot+2011-01-24+at+12.21.02.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear: both;"&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Column layout&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;        #col1 {&lt;br /&gt;            background-color: yellow;&lt;br /&gt;            /**have to know the width **/&lt;br /&gt;            width: 30%;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #col2 {&lt;br /&gt;            background-color: lightBlue;&lt;br /&gt;            width: 30%;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;    &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div id="col1"&amp;gt;&lt;br /&gt;    &amp;lt;div&amp;gt;1&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div&amp;gt;2&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id="col2"&amp;gt;&lt;br /&gt;    &amp;lt;div&amp;gt;3&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div&amp;gt;4&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Again you can see we're &lt;a href="http://mechanitis.blogspot.com/2011/01/css-for-developers-joy-of-floats.html"&gt;using &lt;code&gt;float&lt;/code&gt; on the divs&lt;/a&gt; to get them to appear side-by side.&lt;br /&gt;&lt;br /&gt;The code is much more intuitive organised this way - everything from a single column is grouped together in a single div. &amp;nbsp;If this was done using tables, you'd have the content for a single column scattered in different cells on different rows of the table. &amp;nbsp;Re-arranging the order of the columns in the case of tables is much more of a pain in the neck. &amp;nbsp;With a div, it's a simple move.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-7810960408054466345?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/7810960408054466345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/01/css-for-developers-column-layout-using.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/7810960408054466345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/7810960408054466345'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/01/css-for-developers-column-layout-using.html' title='CSS for Developers: Column Layout Using CSS'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_7adQd_YVgmQ/TT1v4bAebwI/AAAAAAAAH8Q/oM4PAaNx3dI/s72-c/Screen+shot+2011-01-24+at+12.21.02.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-7935933749907813498</id><published>2011-01-24T09:54:00.000Z</published><updated>2011-01-24T09:54:15.086Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='stereotypes'/><category scheme='http://www.blogger.com/atom/ns#' term='gender'/><category scheme='http://www.blogger.com/atom/ns#' term='thoughtworks'/><title type='text'>On Changing The Image Of Programmers</title><content type='html'>Gah!!  &lt;a href="http://techcrunch.com/2011/01/20/manfest-destiny-2/"&gt;This is &lt;i&gt;exactly&lt;/i&gt;&lt;/a&gt;  what I was &lt;a href="http://mechanitis.blogspot.com/2011/01/on-how-not-to-target-girl-geeks.html"&gt;talking about&lt;/a&gt;&amp;nbsp;- it's pink, it mentions shoes, and it's about as patronising as you can get.&lt;br /&gt;&lt;br /&gt;Would&amp;nbsp;the chart&amp;nbsp;be different if your possible outcomes were&amp;nbsp;&lt;a href="http://www.microsoft.com/presspass/exec/billg/"&gt;Bill Gates&lt;/a&gt;,&amp;nbsp;&lt;a href="http://www.apple.com/pr/bios/jobs.html"&gt;Steve Jobs&lt;/a&gt;,&amp;nbsp;&lt;a href="http://www.facebook.com/markzuckerberg"&gt;Mark Zuckerberg&lt;/a&gt;, and&amp;nbsp;&lt;a href="http://www.linux.org/info/linus.html"&gt;Linus Torvalds&lt;/a&gt;? &amp;nbsp;I bet for a start it wouldn't mention Jimmy Choos or choice of handbags. &amp;nbsp;And it probably wouldn't be in baby blue either.&lt;br /&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;Which leads me nicely onto the next subject I have strong opinions on: Role models. &amp;nbsp;Why do we need them?&amp;nbsp;&lt;i&gt;Do&amp;nbsp;&lt;/i&gt;we need them?&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;If there is &lt;i&gt;any&lt;/i&gt; good to be salvaged from that horrific infographic, it's that it gave me what I've been trying to research - some female role models in technology.&amp;nbsp;Unfortunately&amp;nbsp;it hit the other button I was ranting about earlier - they're all very presentable and polished. &amp;nbsp;I don't doubt their value as role models, it's great to have people like that to try and emulate. &amp;nbsp;But&amp;nbsp;surely there must be IT women out there who look like real people? &amp;nbsp;And how many of them started as programmers? &amp;nbsp;I know there's a wider issue around women in technical professions, and women at the top of organisations in any business domain, but I'm trying to keep focused on the issues faced by girl programmers specifically.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Do we need role models?&lt;/b&gt;&lt;br /&gt;I feel almost a responsibility to be a role model. &amp;nbsp;I joined &lt;a href="http://www.thoughtworks.com/"&gt;ThoughtWorks&lt;/a&gt; because I felt it would give me a better platform for greater visibility, so I could show that girls could do this job. &amp;nbsp;I feel passionately that the industry desperately needs excellent role models to overcome the stereotypes kids are absorbing (in our western society) about what it means to be a programmer(/developer/techy).&lt;br /&gt;&lt;br /&gt;My friend &lt;a href="http://twitter.com/#!/mnowster"&gt;Mazz&lt;/a&gt; feels&amp;nbsp;quite differently. &amp;nbsp;She doesn't see why she should have a greater responsibility to be a role model simply because of her gender. &amp;nbsp;It wouldn't be expected of her co-workers. &amp;nbsp;She suggests that by making a career in programming an option for all, or worse, by&amp;nbsp;targeting&amp;nbsp;specific groups (e.g. women) we're devaluing the industry. &amp;nbsp;Surely we're stronger if we only attract people who are interested in the first place? &lt;br /&gt;&lt;br /&gt;During a week long trip to Vegas (it's a hard life), Mazz and I realised we actually agreed on fundamentals:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Mazz doesn't believe we need female role models to tempt women into programming&lt;/li&gt;&lt;li&gt;I believe we need more diverse role models than we currently have.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;If Mazz doesn't want to be a role model because she's perfectly happy getting on with doing her job bloody brilliantly, then that's totally cool - after all, if minorities are expected to do stuff which distracts them from their day job, it's going to make them less appealing to employers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My aim in being a role model was not specifically to get more girls into programming, but to show to the world that we're not all speccy asexual white boys. &amp;nbsp;Some of us are speccy white girls. &amp;nbsp;And this shows the ridiculousness of trying to encourage girls to be role models - you've only changed one dimension. And having a token bisexual black disabled older lady is only going to narrow the field you're appealing to.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;So what do we need to change?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Back to the question that started this off - "what do we need to do to encourage the girls?". &amp;nbsp;The answer, it would seem, is not to roll out the girls, dress them up and parade them around. &amp;nbsp;After all, we got here with no female role models. &amp;nbsp;And we may very well have been put off by role models like us - a teenage Mazz and a teenage Trish would probably not identify with the heel-wearing blonde I've become, despite my all-round awesomeness.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When I worked at &lt;a href="http://www.ford.co.uk/AboutFord/CompanyInformation/FordinBritain"&gt;Ford &lt;/a&gt;they used to tell us a story about marketing. &amp;nbsp;They told us that &lt;a href="http://www.harley-davidson.com/"&gt;Harley Davidson&lt;/a&gt; understood that to market something, you had to market it at the person your customers &lt;i&gt;wanted&lt;/i&gt; to be. &amp;nbsp;A Harley is a statement, a lifestyle choice. &amp;nbsp;They focused on promoting that lifestyle, promoting the image of the Harley biker, all leather and macho attitude. &amp;nbsp;They knew that the majority of their customers were CEOs, lawyers, doctors. &amp;nbsp;Guys who'd made it in life and had the cash to spend. But if they'd marketed Harley Davidson directly to the stereotypes of these guys they would have lost their market. &amp;nbsp;These men did not buy a Harley as part of their CEO persona. &amp;nbsp;They bought them because they aspired to be the leather-wearing macho guy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I don't know how true that story is, but I do know Harley Davidson revitalised their failing business by focusing on &lt;a href="http://www.webpronews.com/topnews/2005/07/28/case-study-harley-davidson"&gt;creating a community around their brand&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So back to the question: How do we get more girls into programming?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And the answer is: We're asking the wrong question. &lt;br /&gt;&lt;br /&gt;The real question is: How do we attract more than just the "typical" geeks into programming? &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And when you ask that question, you realise it's absurd to assume that attractive female role models and women-centered events are going to fix the problem, or even make any significant headway on it. &amp;nbsp;You're narrowing your field of appeal instead of broadening it. &amp;nbsp;You're being exclusive instead of inclusive.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Where can we find appropriate role models to represent us?&lt;/b&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;We have diversity amongst geeks. &amp;nbsp;We've got diversity along the typical dimensions (age/race/sexuality/gender etc etc). &amp;nbsp;But in addition we're all individuals and we're going to appeal to other individuals. &amp;nbsp;I might appeal to someone who likes shoes. &amp;nbsp;I might appeal to someone who likes photography. &amp;nbsp;I might appeal to someone who thinks Java developers should give a toss about the user experience. &amp;nbsp;I might appeal to someone who is massively OCD about the names of their variables.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;We shouldn't care what little boxes those people tick on the dimensions that make absolutely no difference to their ability to program. &amp;nbsp;In fact, if we focus less on this and more on our general awesomeness as geeks, we might find so-called minorities are happier to represent us.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Even with diverse role models we might have trouble getting the media to let go of their stereotype of the geek programming in their bedroom. &amp;nbsp;But we might not - I did a search for "geek" on The Sun's website, and I found a&amp;nbsp;&lt;i&gt;lot&lt;/i&gt;&amp;nbsp;more references to&amp;nbsp;&lt;a href="http://www.wikihow.com/Wear-Geek-Chic-Style-(for-Girls)"&gt;geek chic&lt;/a&gt;, and celebrities claiming to be geeks, than to stories of the lonely computer programmer who went crazy and killed everyone.&lt;br /&gt;&lt;br /&gt;It is the time of the geek. &amp;nbsp;Let's ride the wave and bring other people to the party.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;So who should our role models be?&lt;/b&gt;&lt;/div&gt;Everyone.&lt;br /&gt;&lt;br /&gt;All of us.&lt;br /&gt;&lt;br /&gt;You.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-7935933749907813498?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/7935933749907813498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/01/on-changing-image-of-programmers.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/7935933749907813498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/7935933749907813498'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/01/on-changing-image-of-programmers.html' title='On Changing The Image Of Programmers'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-3694185229428088107</id><published>2011-01-21T11:10:00.000Z</published><updated>2011-01-21T11:10:28.222Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='lmax'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>GWT: Why VerticalPanel is Evil</title><content type='html'>At &lt;a href="http://www.lmaxtrader.co.uk/about-lmax"&gt;LMAX&lt;/a&gt; we adopted &lt;a href="http://code.google.com/webtoolkit/gettingstarted.html"&gt;Google Web Toolkit&lt;/a&gt; pretty early on. &amp;nbsp;One of the motivations for using it was so we only had to worry about recruiting Java guys, and then we could all work on every part of the application including the web UI. &amp;nbsp;Sure, you can learn a bunch of different skills if you want to, but it reduced context-switching and kept the skill set we were hiring for to a nice short list.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The problem is that GWT does a very nice job of pretending to be Java whilst actually compiling down to HTML and JavaScript. &amp;nbsp;If you don't have some understanding of the end result (the &lt;a href="http://www.w3.org/DOM/"&gt;DOM&lt;/a&gt; the browser is going to be rendering) it's going to be hard to get the performance you need from a &lt;a href="http://www.lmaxtrader.co.uk/trading-platforms/web-platform"&gt;low-latency trading application&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My number one bug-bear with GWT is &lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/2.1/com/google/gwt/user/client/ui/VerticalPanel.html"&gt;VerticalPanel&lt;/a&gt;. &amp;nbsp;To the uninitiated developer, this seems like the sort of thing that will be useful everywhere. &amp;nbsp;You often want stuff stacked on top of each other - think menus, lists, the layout of a dialog. &amp;nbsp;What is not obvious is that it uses tables for layout under the covers, and I've mentioned in the past that &lt;a href="http://mechanitis.blogspot.com/2011/01/css-for-developers-horizontal-layout.html"&gt;Tables Should Not Be Used For Layout&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A much less obvious way of getting the same result with (usually) no extra effort is to use &lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/2.1/com/google/gwt/user/client/ui/FlowPanel.html"&gt;FlowPanel&lt;/a&gt;. &amp;nbsp;This is rendered as a div, and most of the time the elements that get inserted into it will render in a vertical stack.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;VerticalPanel Code&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;VerticalPanel panel = new VerticalPanel();&lt;br /&gt;panel.add(/* your widget */);&lt;br /&gt;panel.add(/* your second widget */);&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;VerticalPanel Rendered As HTML&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;table&amp;gt;&lt;br /&gt;  &amp;lt;tbody&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;      &amp;lt;td&amp;gt;&lt;br /&gt;        &amp;lt;!-- your widget here --&amp;gt;&lt;br /&gt;      &amp;lt;/td&amp;gt;&lt;br /&gt;     &amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;      &amp;lt;td&amp;gt;&lt;br /&gt;        &amp;lt;!-- your second widget here --&amp;gt;&lt;br /&gt;      &amp;lt;/td&amp;gt;&lt;br /&gt;     &amp;lt;tr&amp;gt;&lt;br /&gt;  &amp;lt;/tbody&amp;gt;&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;FlowPanel Code&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;FlowPanel panel = new FlowPanel();&lt;br /&gt;panel.add(/* your widget */);&lt;br /&gt;panel.add(/* your second widget */);&lt;/code&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;FlowPanel Rendered As HTML&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;div&amp;gt;&lt;br /&gt;  &amp;lt;!-- your widget here --&amp;gt;&lt;br /&gt;  &amp;lt;!-- your second widget here --&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;You can see that the DOM generated for a very similar-looking 3 lines of code is much much smaller for &lt;code&gt;FlowPanel&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Who Cares?&lt;/span&gt;&lt;br /&gt;Right, but we're only talking about a few more elements, and browsers are pretty smart about optimising these things. &amp;nbsp;Right?&lt;br /&gt;&lt;br /&gt;Maybe. &amp;nbsp;But if you use &lt;code&gt;VerticalPanel&lt;/code&gt; for all your containers, for every box which needs to be a slightly different colour, for every place you want to change the alignment slightly, things get very big very fast. &amp;nbsp;This is an example of real code from an early prototype, where we had several nested panels (not unheard of if you've got a complex dialog box with lots of elements in it. &amp;nbsp;Like, say, a deal ticket). &amp;nbsp;And I've stripped out a lot of the table attributes that made this even more heinous:&lt;/div&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;table&amp;gt;&lt;br /&gt;  &amp;lt;tbody&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;      &amp;lt;td align="left"&amp;gt;&lt;br /&gt;        &amp;lt;table id="panel1"&amp;gt;&lt;br /&gt;          &amp;lt;tbody&amp;gt;&lt;br /&gt;            &amp;lt;tr&amp;gt;&lt;br /&gt;              &amp;lt;td align="left" style="vertical-align: top;"&amp;gt;&lt;br /&gt;                &amp;lt;table class="orders-input"&amp;gt;&lt;br /&gt;                  &amp;lt;tbody&amp;gt;&lt;br /&gt;                    &amp;lt;tr&amp;gt;&lt;br /&gt;                      &amp;lt;td align="left"&amp;gt;&lt;br /&gt;                        &amp;lt;table class="row"&amp;gt;&lt;br /&gt;                          &amp;lt;tbody&amp;gt;&lt;br /&gt;                            &amp;lt;tr&amp;gt;&lt;br /&gt;                              &amp;lt;td align="left"&amp;gt;&lt;br /&gt;                                &amp;lt;table id="container"&amp;gt;&lt;br /&gt;                                  &amp;lt;tbody&amp;gt;&lt;br /&gt;                                    &amp;lt;tr&amp;gt;&lt;br /&gt;                                      &amp;lt;table id="panel2"&amp;gt;&lt;br /&gt;                                        &amp;lt;tbody&amp;gt;&lt;br /&gt;                                          &amp;lt;tr&amp;gt;&lt;br /&gt;                                            &amp;lt;td align="left"&amp;gt;&lt;br /&gt;                                              &amp;lt;table class="controls"&amp;gt;&lt;br /&gt;                                                &amp;lt;tbody&amp;gt;&lt;br /&gt;                                                  &amp;lt;tr&amp;gt;&lt;br /&gt;                                                    &amp;lt;td align="left"&amp;gt;&lt;br /&gt;                                                      &amp;lt;!-- widget --&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;For every &lt;code&gt;table&lt;/code&gt; element and associated elements (&lt;code&gt;tbody&lt;/code&gt;, &lt;code&gt;tr&lt;/code&gt;, &lt;code&gt;td&lt;/code&gt;), you would get a single div element instead if you simply replace every instance of &lt;code&gt;VerticalPanel&lt;/code&gt; in this stack with a &lt;code&gt;FlowPanel&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;div&amp;gt;&lt;br /&gt;  &amp;lt;div id="panel1"&amp;gt;&lt;br /&gt;    &amp;lt;div class="orders-input"&amp;gt;&lt;br /&gt;      &amp;lt;div class="row"&amp;gt;&lt;br /&gt;        &amp;lt;div id="container"&amp;gt;&lt;br /&gt;          &amp;lt;div id="panel2"&amp;gt;&lt;br /&gt;            &amp;lt;div class="controls"&amp;gt;&lt;br /&gt;              &amp;lt;!-- widget --&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;See?  Much nicer.&lt;br /&gt;&lt;br /&gt;This is exactly what we did do, and we saw a&amp;nbsp;noticeable&amp;nbsp;speed improvement across all browsers -&amp;nbsp;noticeable&amp;nbsp;to a real user, not just some millisecond improvement on a performance test. &amp;nbsp;Mind you, users' brains are amazing things and your system has to react in &lt;a href="http://www.useit.com/papers/responsetime.html"&gt;less than 0.1 seconds for a user to perceive it as instantaneous&lt;/a&gt;. &amp;nbsp;So even in a browser, every millisecond counts.&lt;br /&gt;&lt;br /&gt;In addition to improved performance, you get a nice bonus: now the layout is no longer controlled by tables, you can really easily shove stuff around and make things look pretty with the clever use of &lt;a href="http://mechanitis.blogspot.com/search/label/css"&gt;CSS&lt;/a&gt;. &amp;nbsp;If you're really lucky, you can chuck that stuff over to your designers and not have to do another GWT compile when someone wants to move things 3 pixels to the left. &amp;nbsp;Which they will.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-3694185229428088107?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/3694185229428088107/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/01/gwt-why-verticalpanel-is-evil.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/3694185229428088107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/3694185229428088107'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/01/gwt-why-verticalpanel-is-evil.html' title='GWT: Why VerticalPanel is Evil'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-7574493308623288037</id><published>2011-01-20T09:30:00.000Z</published><updated>2011-01-20T09:30:08.908Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='opinion'/><category scheme='http://www.blogger.com/atom/ns#' term='gender'/><title type='text'>On How Not To Target Girl Geeks</title><content type='html'>(First, let me say this post contains opinion, stereotyping and sweeping generalisations. &amp;nbsp;But that's sort of the point. &amp;nbsp;Also I don't pretend for one moment to speak for all girl programmers, I can only speak for myself)&lt;br /&gt;&lt;br /&gt;When I first started this blog, I wanted to just post "proper" technical information. &amp;nbsp;I wanted to prove that there are girls out there doing "real" programming.&lt;br /&gt;&lt;br /&gt;I specifically didn't want to talk about my gender. &amp;nbsp;I wanted to prove by silence that gender is incidental to what I do.&lt;br /&gt;&lt;br /&gt;But, it doesn't really work that way, does it? &lt;br /&gt;&lt;br /&gt;Firstly because one of the first things I get asked by guys when I meet them in this industry is "why aren't there more girl programmers?" (that's after they ask "do you work in HR?" followed by "are you a real programmer?" - I'm not joking, this happened this week).&lt;br /&gt;&lt;br /&gt;And secondly because I'm pretty passionate about the gender issue. &amp;nbsp;To be specific: I'm passionate about &lt;i&gt;diversity&lt;/i&gt;. &amp;nbsp;It's just that I'm more qualified to bang on about gender rather than something like race, sexuality, age etc.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;What's started you off again this time?&lt;/span&gt;&lt;br /&gt;The&amp;nbsp;&lt;a href="http://www.meetup.com/Londonjavacommunity/"&gt;London Java Community&lt;/a&gt;&amp;nbsp;got me thinking by asking "Is there anything we can do to attract more girls to the events?"&lt;br /&gt;&lt;br /&gt;The thing is, the reason people (boys) keep asking this question is because they &lt;i&gt;want&lt;/i&gt; more girls in the industry / at events. &amp;nbsp;They &lt;i&gt;want&lt;/i&gt; them to feel involved and included. &amp;nbsp;I've said it before, but I mean it - I've never come across malicious sexism at work. &amp;nbsp;Yes there is subconscious sexism. &amp;nbsp;But the boys want the girls to come and play. &amp;nbsp;Why wouldn't they? &amp;nbsp;How many boys really want to work in a team which has 12 developers and only one is a girl? &lt;br /&gt;&lt;br /&gt;But think about it: who is the worst person to ask why girls don't like being developers?&lt;br /&gt;&lt;br /&gt;Yep. &amp;nbsp;A girl developer.&lt;br /&gt;&lt;br /&gt;Because we love it. &amp;nbsp;We're here because we like programming, we like our jobs, we're good at it. &amp;nbsp;We weren't stopped by sexism (assumed or real), by boys clubs, by not having female role models, by... well, any of the myriad of reasons posited as to why girls don't become programmers.&lt;br /&gt;&lt;br /&gt;I have no idea why a girl wouldn't want to be a programmer. &amp;nbsp;It's brilliant! &amp;nbsp;It's problem-solving, logical and creative, you're usually surrounded by intelligent people who are striving toward the same goal as you, and you get to meet a lot of boys :-)&lt;br /&gt;&lt;br /&gt;So, back to the question at hand: how do we appeal to girls, as a user group and ultimately as an industry?&lt;br /&gt;&lt;br /&gt;There are lots and lots of ideas kicking around this area, and I'm going to start by ranting about the things I think we&lt;i&gt; shouldn't&lt;/i&gt; be doing. &amp;nbsp;This, of course, is totally my opinion so helpings of salt might be required.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;No Pink&lt;/span&gt;&lt;br /&gt;I get so angry about this!! &amp;nbsp;As if the &lt;a href="http://www.guardian.co.uk/theguardian/2009/dec/12/pinkstinks-the-power-of-pink"&gt;pinkification&lt;/a&gt; of our little girls wasn't bad enough, "people" (I have no idea who) think that they can inflict this upon grown-ups too!&lt;br /&gt;&lt;br /&gt;Why, WHY, would a &lt;a href="http://www.womenintechnology.co.uk/"&gt;website that is aimed at professional technical women&lt;/a&gt;&amp;nbsp;be branded in childish hues of the hated colour? &amp;nbsp;I didn't even click on a single link, I'm not sure what service it's supposed to provide, because I was so disgusted by the colour palate I closed the browser.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;In particular&lt;/i&gt;, if your target demographic is the somewhat unusual creature the girl-geek, or at least the lady technologist, what makes you think that ultra-feminine colour is going to appeal to us? &amp;nbsp;&lt;a href="http://technology.timesonline.co.uk/tol/news/tech_and_web/article7011125.ece"&gt;Apparently&lt;/a&gt; "The November 2009 Times/Lady Geek Female Appeal Study showed that only 9% of women want technology to be feminine, let alone pink."&lt;br /&gt;&lt;br /&gt;What do you think, that your average (female) maths graduate is going to decide Computing Is For Me Because It's Pink? &amp;nbsp;Really?&lt;br /&gt;&lt;br /&gt;I worry about this: are these &lt;a href="http://techettes.com/"&gt;sites&lt;/a&gt; (&lt;a href="http://www.mobiles.co.uk/pink-mobile-phones.html"&gt;phones&lt;/a&gt;/&lt;a href="http://www.luuux.com/technology/pink-psp-women"&gt;consoles&lt;/a&gt;/&lt;a href="http://www.carpages.co.uk/smart/smart-fortwo-13-12-05.asp"&gt;cars&lt;/a&gt;) designed by men, and that's what they think women like? &amp;nbsp;Or were they designed by women who really believe that's what ALL women like?&lt;br /&gt;&lt;br /&gt;Please. &amp;nbsp;Stop it. &amp;nbsp;Now. &amp;nbsp;It's&amp;nbsp;embarrassing.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Be careful about your role models&lt;/span&gt;&lt;br /&gt;Take the &lt;a href="http://fwd.five.tv/gadget-show"&gt;gadget show&lt;/a&gt;, for example. &amp;nbsp;I don't actually watch it, I'll be honest, because I really don't need someone tempting me to spend money on things I don't require. &amp;nbsp;But as an example of this point it's perfect - just the picture at the top of the page says it all to me: two reasonably attractive women (I know not everyone floats your boat but they're not ugly), token black guy and two white guys who certainly don't float my boat. &amp;nbsp;If only one of them was gay, their diversity tick sheet would be perfect.&lt;br /&gt;&lt;br /&gt;I am not for one second suggesting any of these guys don't know their stuff. &amp;nbsp;That is not the point at all. &amp;nbsp;I just wonder - if one of the women looked like someone's mum, would they have got the job? &amp;nbsp;The&amp;nbsp;subconscious&amp;nbsp;message here is that yes, it's totally fine to be a girl and a geek. &amp;nbsp;But you still have to look good too.&lt;br /&gt;&lt;br /&gt;And there's another message there - if you're a guy and you're into technology, you don't have to be hot. In fact, the role models we see are definitely on the Not Hot end of the scale. &amp;nbsp;&lt;a href="http://politicolnews.com/wp-content/uploads/2010/01/Bill_Gates_718639.jpg"&gt;Bill Gates&lt;/a&gt; anyone?&lt;br /&gt;&lt;br /&gt;So girls get a double-whammy - I have to know what I'm talking about and look good (whilst also trying to prove that girls who look good have brains); and there are no hot guys in the industry.&lt;br /&gt;&lt;br /&gt;Hmm, no thanks, I think I'll get a job in marketing.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Don't assume all women are the same&lt;/span&gt;&lt;br /&gt;In fact don't assume anything about the girls you want to attract. &amp;nbsp;Actually, assume they're people. &amp;nbsp;Like you. &amp;nbsp;And geeks. &amp;nbsp;Like you.&lt;br /&gt;&lt;br /&gt;For example. &amp;nbsp;I actually do like shoes and clothes. &amp;nbsp;But plenty of my fellow girl-geeks are about as bothered about that stuff as their male counter-parts. &amp;nbsp;So trying to appeal to girls with iPhone apps that help you pick you next pair of Jimmy Choos might not be the approach you want to take. &amp;nbsp;You'll attract a subset of women, sure, but they might not be the ones you want.&lt;br /&gt;&lt;br /&gt;Imagine if you wanted to get more guys into programming, and you decided to do it by using football as the hook. &amp;nbsp;Yes, you'd get certain guys interested. But I've met more guys who are utterly disinterested in football in IT than I've met girls who dislike it.&lt;br /&gt;&lt;br /&gt;We're not all the same. &amp;nbsp;We're interested in all sorts of different stuff.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Be very very careful about women-only events&lt;/span&gt;&lt;br /&gt;My personal feelings are that there should be no need for all-girl conferences or all-girl line-ups. &amp;nbsp;To me, it implies that girls want something different to boys, and that girls only listen to other females.&lt;br /&gt;&lt;br /&gt;I think there are places for these sorts of things, especially if you're aiming it at girls who might be more uncomfortable with guys around (e.g. some sort of mentoring). &amp;nbsp;So I'm not going to say flat-out they're wrong.&lt;br /&gt;&lt;br /&gt;It's just I think it's not the right angle to attack the problem. &amp;nbsp;And you're segregating based on one dimension only, but as I said we're all different and we all have different problems. &amp;nbsp;The issues a non-white (am I allowed to say that?) lady might face could be different to those a middle class white girl like me has to deal with. &amp;nbsp;And do you want all-black conferences, and all-gay conferences, and so on and so forth? &amp;nbsp;Why are we special? &amp;nbsp;Why are we allowed to exclude the boys? &amp;nbsp;It's sexist.&lt;br /&gt;&lt;br /&gt;Also, as a girl-geek, I get a bit freaked out when I'm surrounded by women, even if they're all geeks like me. &amp;nbsp;I'm much more comfortable talking to a guy, they tend not to try to read between the lines of everything you say or wonder if you're bitching about them behing their back &amp;lt;/gross generalisation&amp;gt;. &lt;br /&gt;&lt;br /&gt;Diversity is about being inclusive, not exclusive.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;In Conclusion&lt;/span&gt;&lt;br /&gt;Lots of the girl-geek, women-in-IT movement often appears to me&amp;nbsp;as if women are "special" and need different treatment. This&amp;nbsp;is not helping our cause&amp;nbsp;&lt;i&gt;at all&lt;/i&gt;. It causes resentment amongst our&amp;nbsp;male peers&amp;nbsp;and it puts off women who don't&amp;nbsp;define themselves by their gender - people like the girls who are already in our industry. We like&amp;nbsp;technology, we love programming, and we're good at our jobs.&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;So. &amp;nbsp;I don't know why there aren't more girls in programming. &amp;nbsp;And I don't have the answers as to what will tempt them in.&lt;br /&gt;&lt;br /&gt;But, just for me, next time you're creating an advert or a website or something aimed at geek-girls, can we have more hot guys please?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-7574493308623288037?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/7574493308623288037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/01/on-how-not-to-target-girl-geeks.html#comment-form' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/7574493308623288037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/7574493308623288037'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/01/on-how-not-to-target-girl-geeks.html' title='On How Not To Target Girl Geeks'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-8603279120740247540</id><published>2011-01-19T10:13:00.000Z</published><updated>2011-01-19T10:13:59.532Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='reference'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>CSS for Developers: The Joy of Floats</title><content type='html'>As promised, the Long Awaited Follow-Up to &lt;a href="http://mechanitis.blogspot.com/2011/01/css-for-developers-horizontal-layout.html"&gt;CSS for Developers Part One&lt;/a&gt;! Well, long-awaited if you're as afflicted with &lt;a href="http://randsinrepose.com/archives/2003/07/10/nadd.html"&gt;NADD&lt;/a&gt; as I am.&lt;br /&gt;&lt;br /&gt;Quick recap - the aim of this series is to provide a quick and easy how-to around the magic that is CSS. &amp;nbsp;It's primarily aimed at developers, although I would hope it's comprehensible to a range of tech-savvy people.&lt;br /&gt;&lt;br /&gt;(Note: unless otherwise stated, the screenshots are in Chrome on a Mac - given an earlier version of this guide I can tell you the behaviour is identical to Firefox on Ubuntu).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Part Two: The Joy of Floats (or: why they don't do what you think they should)&lt;/h3&gt;&lt;div&gt;&lt;a href="http://mechanitis.blogspot.com/2011/01/css-for-developers-horizontal-layout.html"&gt;Last time&lt;/a&gt; I stated that using float is a great way to position elements contained in a div. &amp;nbsp;Well, it has its downsides too. &amp;nbsp;Quite a few actually.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So this post documents the ones I ran into and what we did on the&amp;nbsp;&lt;a href="http://www.lmaxtrader.co.uk/trading-platforms/web-platform"&gt;LMAX Trader UI&lt;/a&gt;&amp;nbsp;to get it to look the way we wanted.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Disclaimer: There might be better ways to do a lot of this stuff - if you locate them via Google or work them out for yourself then well done!&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;2.1 Starting a New Line Using Floats&lt;/h4&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_7adQd_YVgmQ/TTWDOKiuyGI/AAAAAAAAH7o/aW8vVEQPwg0/s1600/Screen+shot+2011-01-18+at+12.09.10.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_7adQd_YVgmQ/TTWDOKiuyGI/AAAAAAAAH7o/aW8vVEQPwg0/s1600/Screen+shot+2011-01-18+at+12.09.10.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;blockquote style="clear: both;"&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Horizontal flow&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;        #left {&lt;br /&gt;            background-color: cyan;&lt;br /&gt;            width: 50%;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #center {&lt;br /&gt;            background-color: yellow;&lt;br /&gt;            width: 50%;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #right {&lt;br /&gt;            background-color: red;&lt;br /&gt;            width: 50%;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #next-line {&lt;br /&gt;            background-color: green;&lt;br /&gt;            width: 200px;&lt;br /&gt;            clear: left;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;    &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div id="container"&amp;gt;&lt;br /&gt;    &amp;lt;div id="left"&amp;gt;Left&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="center"&amp;gt;Center&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="right"&amp;gt;Right&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="next-line"&amp;gt;Next Line&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;clear: left&lt;/code&gt; will reset any left float from before the div it is applied to. This will cause the div to be shown on a new line, although it can still have a float property as well&lt;/li&gt;&lt;li&gt;&lt;code&gt;clear: right&lt;/code&gt; will put the div below any divs with a right float applied&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;code&gt;clear: both&lt;/code&gt; will do both.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I usually do&amp;nbsp;&lt;code&gt;clear: both&lt;/code&gt;&amp;nbsp;if I need to ensure the div will be on a new line.&lt;/div&gt;&lt;br /&gt;&lt;h4&gt;2.2 Right Aligning Floated Divs&lt;/h4&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_7adQd_YVgmQ/TTWQ_QYj2wI/AAAAAAAAH7s/fEbaFExTDoU/s1600/Screen+shot+2011-01-18+at+13.07.35.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_7adQd_YVgmQ/TTWQ_QYj2wI/AAAAAAAAH7s/fEbaFExTDoU/s1600/Screen+shot+2011-01-18+at+13.07.35.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Float Right&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;        #left {&lt;br /&gt;            float: right;&lt;br /&gt;            border: 1px solid gray;&lt;br /&gt;        }&lt;br /&gt;        #center {&lt;br /&gt;            float: right;&lt;br /&gt;            border: 1px solid gray;&lt;br /&gt;        }&lt;br /&gt;        #right {&lt;br /&gt;            float: right;&lt;br /&gt;            border: 1px solid gray;&lt;br /&gt;        }&lt;br /&gt;        #container {&lt;br /&gt;            background-color: yellow;&lt;br /&gt;            height: 26px;&lt;br /&gt;        }&lt;br /&gt;        #left2 {&lt;br /&gt;            float: left;&lt;br /&gt;            border: 1px solid gray;&lt;br /&gt;        }&lt;br /&gt;        #center2 {&lt;br /&gt;            float: left;&lt;br /&gt;            border: 1px solid gray;&lt;br /&gt;        }&lt;br /&gt;        #right2 {&lt;br /&gt;            float: left;&lt;br /&gt;            border: 1px solid gray;&lt;br /&gt;        }&lt;br /&gt;        #container2 {&lt;br /&gt;            clear: both;&lt;br /&gt;            float: right;&lt;br /&gt;            background-color: #90ee90;&lt;br /&gt;            height: 26px;&lt;br /&gt;        }&lt;br /&gt;    &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;div id="container"&amp;gt;&lt;br /&gt;        &amp;lt;div id="left"&amp;gt;Left&amp;lt;/div&amp;gt;&lt;br /&gt;        &amp;lt;div id="center"&amp;gt;Center&amp;lt;/div&amp;gt;&lt;br /&gt;        &amp;lt;div id="right"&amp;gt;Right&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="container2"&amp;gt;&lt;br /&gt;        &amp;lt;div id="left2"&amp;gt;Left&amp;lt;/div&amp;gt;&lt;br /&gt;        &amp;lt;div id="center2"&amp;gt;Center&amp;lt;/div&amp;gt;&lt;br /&gt;        &amp;lt;div id="right2"&amp;gt;Right&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;If you want to right-align a number of elements (for example, buttons at the bottom of a dialog), there are two approaches. One is to set &lt;code&gt;float: right&lt;/code&gt; on each individual item (see the yellow panel above) - you'll notice that this means the divs are displayed in reverse order, because they're set to float to the right of each other. A better approach is to put the divs you want right-aligned into a container div and float that to the right (see the green panel). This ensures the correct ordering of the items.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;2.3 Floating Behaviour to be Aware Of: float left next to float right (cross browser)&lt;/h4&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_7adQd_YVgmQ/TTWWrN6MenI/AAAAAAAAH7w/5FCQisV-Lyo/s1600/Screen+shot+2011-01-18+at+13.33.15.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_7adQd_YVgmQ/TTWWrN6MenI/AAAAAAAAH7w/5FCQisV-Lyo/s1600/Screen+shot+2011-01-18+at+13.33.15.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Float right next to float left&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;        #left {&lt;br /&gt;            background-color: blue;&lt;br /&gt;            width: 50%;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #center {&lt;br /&gt;            background-color: yellow;&lt;br /&gt;            width: 50%;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #right {&lt;br /&gt;            background-color: red;&lt;br /&gt;            width: 50%;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #next-line {&lt;br /&gt;            background-color: green;&lt;br /&gt;            width: 50%;&lt;br /&gt;            clear: left;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #float-left {&lt;br /&gt;            clear: left;&lt;br /&gt;            background-color: purple;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #float-right {&lt;br /&gt;            background-color: cyan;&lt;br /&gt;            float: right;&lt;br /&gt;        }&lt;br /&gt;    &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div id="container"&amp;gt;&lt;br /&gt;    &amp;lt;div id="left"&amp;gt;Left&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="center"&amp;gt;Center&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="right"&amp;gt;Right&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;div id="next-line"&amp;gt;Next Line&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;div id="float-left"&amp;gt;Floating Left&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="float-right"&amp;gt;Floating Right&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;In Firefox and Chrome (tested under Ubuntu and OS X), if you clear the float on a single div element, that div and all the ones after it will appear underneath all the previous ones. &amp;nbsp;For example, see the "Floating left" (purple) and "Floating right" (cyan) divs above. &amp;nbsp;The two divs appear on the same line, floating side-by-side.&lt;br /&gt;&lt;br /&gt;This may even be the same behaviour in IE in strict mode (I don't remember if I tested it). &amp;nbsp;But by default, Internet Explorer renders this quite differently.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_7adQd_YVgmQ/TTWZ428ju9I/AAAAAAAAH70/LmBX2Gw9mAA/s1600/floating-left-and-right-in-ie.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="442" src="http://2.bp.blogspot.com/_7adQd_YVgmQ/TTWZ428ju9I/AAAAAAAAH70/LmBX2Gw9mAA/s640/floating-left-and-right-in-ie.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;(Apologies for some of the inconsistency in screenshots - given my choices of operating systems, getting the cursed screenshots in IE was... challenging).&lt;br /&gt;&lt;br /&gt;The point is that in IE the &lt;code&gt;float: right&lt;/code&gt;&amp;nbsp;is quite literal - it floats to the right directly underneath the last floated element, regardless of any prior &lt;code&gt;clear&lt;/code&gt; commands.&lt;br /&gt;&lt;br /&gt;If you want to get the same behaviour across all browsers, you need to be stricter with adding containers for different content areas:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Float right next to float left - correct&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;        #left {&lt;br /&gt;            background-color: blue;&lt;br /&gt;            width: 50%;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #center {&lt;br /&gt;            background-color: yellow;&lt;br /&gt;            width: 50%;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #right {&lt;br /&gt;            background-color: red;&lt;br /&gt;            width: 50%;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #next-line {&lt;br /&gt;            background-color: green;&lt;br /&gt;            width: 50%;&lt;br /&gt;            clear: left;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #float-left {&lt;br /&gt;            background-color: purple;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #float-right {&lt;br /&gt;            background-color: cyan;&lt;br /&gt;            float: right;&lt;br /&gt;        }&lt;br /&gt;    &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div id="container"&amp;gt;&lt;br /&gt;    &amp;lt;div id="left"&amp;gt;Left&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="center"&amp;gt;Center&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="right"&amp;gt;Right&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="next-line"&amp;gt;Next Line&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div style="clear: both"&amp;gt;&lt;br /&gt;    &amp;lt;div id="float-left"&amp;gt;Floating Left&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="float-right"&amp;gt;Floating Right&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h4&gt;2.4 Floating Behaviour to be Aware Of: parent divs of floated elements do not resize to child&lt;/h4&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_7adQd_YVgmQ/TTWhG9sPQdI/AAAAAAAAH74/yLmOsJKFsdU/s1600/Screen+shot+2011-01-18+at+14.17.37.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_7adQd_YVgmQ/TTWhG9sPQdI/AAAAAAAAH74/yLmOsJKFsdU/s1600/Screen+shot+2011-01-18+at+14.17.37.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_7adQd_YVgmQ/TTWhG9sPQdI/AAAAAAAAH74/yLmOsJKFsdU/s1600/Screen+shot+2011-01-18+at+14.17.37.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Floats in containers&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;        #left {&lt;br /&gt;            border: 1px solid blue;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #right {&lt;br /&gt;            border: 1px solid red;&lt;br /&gt;            float: right;&lt;br /&gt;        }&lt;br /&gt;        #container {&lt;br /&gt;            border: 1px solid black;&lt;br /&gt;        }&lt;br /&gt;    &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div id="container"&amp;gt;&lt;br /&gt;    &amp;lt;div id="left"&amp;gt;Left&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="right"&amp;gt;Right&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;In the code above, we have a "parent" div, &lt;code&gt;container&lt;/code&gt;, with two children, &lt;code&gt;left&lt;/code&gt; and &lt;code&gt;right&lt;/code&gt;. &amp;nbsp;Both of these children are floating, it doesn't actually matter that one's left and one's right. &amp;nbsp;What you might not be able to see clearly is that the parent, &lt;code&gt;container&lt;/code&gt;, has zero height. &amp;nbsp;It's got a black border, you should be able to see that the top and bottom of the border are actually next to each other, showing the div has no height of its own.&lt;br /&gt;&lt;br /&gt;However the children have a height, the height shrinks to fit the content, the text.&lt;br /&gt;&lt;br /&gt;What I'm trying to get at is that if you want to place something underneath the left and right divs, you can't rely on the browser working out where the bottom is and placing other divs underneath them:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_7adQd_YVgmQ/TTWj1ojxVqI/AAAAAAAAH78/emZCrAAWor4/s1600/Screen+shot+2011-01-18+at+14.29.24.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_7adQd_YVgmQ/TTWj1ojxVqI/AAAAAAAAH78/emZCrAAWor4/s1600/Screen+shot+2011-01-18+at+14.29.24.png" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Floats in containers&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;        #left {&lt;br /&gt;            border: 1px solid blue;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #right {&lt;br /&gt;            border: 1px solid red;&lt;br /&gt;            float: right;&lt;br /&gt;        }&lt;br /&gt;        #container {&lt;br /&gt;            border: 1px solid black;&lt;br /&gt;        }&lt;br /&gt;        #container2 {&lt;br /&gt;            border: 1px solid yellow;&lt;br /&gt;        }&lt;br /&gt;        #left2 {&lt;br /&gt;            background-color: green;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #right2 {&lt;br /&gt;            background-color: purple;&lt;br /&gt;            float: right;&lt;br /&gt;        }&lt;br /&gt;    &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div id="container"&amp;gt;&lt;br /&gt;    &amp;lt;div id="left"&amp;gt;Left&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="right"&amp;gt;Right&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id="container2"&amp;gt;&lt;br /&gt;    &amp;lt;div id="left2"&amp;gt;Left&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="right2"&amp;gt;Right&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;(You'll note this is not an article about design!  I'm trying to use a combination of colours, outlines etc to make the point clear, not to make it look good)&lt;br /&gt;&lt;br /&gt;Basically the floated divs are effectively absolutely positioned, and therefore take up no space on the document (more on this in a later post).&lt;br /&gt;&lt;br /&gt;The way I've got round this in the past is to set a specific height on the parent div to force any following elements to appear underneath it.  This works, but it can be fragile.  In particular, it doesn't allow for wrapping text (more on this later too).&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Still to come:&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Position and Display: relative, absolute, block, inline... what does it really mean?&lt;/li&gt;&lt;li&gt;Horizontal and Vertical&amp;nbsp;Centring&lt;/li&gt;&lt;li&gt;Strict Mode Is Your Friend&lt;/li&gt;&lt;li&gt;Column layout using CSS&lt;/li&gt;&lt;li&gt;Why "width: 100%" might go off the edge of the page&lt;/li&gt;&lt;li&gt;Cross-browser table border behaviour&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;Previously:&lt;/i&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;a href="http://mechanitis.blogspot.com/2011/01/css-for-developers-horizontal-layout.html"&gt;Horizontal Layout using CSS&lt;/a&gt;&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-8603279120740247540?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/8603279120740247540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/01/css-for-developers-joy-of-floats.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/8603279120740247540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/8603279120740247540'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/01/css-for-developers-joy-of-floats.html' title='CSS for Developers: The Joy of Floats'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_7adQd_YVgmQ/TTWDOKiuyGI/AAAAAAAAH7o/aW8vVEQPwg0/s72-c/Screen+shot+2011-01-18+at+12.09.10.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-1546903531237732110</id><published>2011-01-18T10:57:00.000Z</published><updated>2011-01-18T10:57:13.792Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='joel'/><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>FogBugs and Kiln World Tour</title><content type='html'>Last Thursday I was fortunate enough to get a place on the &lt;a href="http://worldtour.fogcreek.com/"&gt;FogBugz and Kiln World Tour&lt;/a&gt;. &amp;nbsp;I booked it before I moved jobs, and I'll be honest I had no real interest in the software. &amp;nbsp;I've been reading Joel's books and blogs since my friend Brent bought me &lt;a href="http://www.amazon.co.uk/gp/product/1590593898"&gt;Joel on Software&lt;/a&gt;&amp;nbsp;and made me read it (he had the foresight to know I'd want to hang on to his copy if he'd lent it to me!). &amp;nbsp;I wanted to see the man in the flesh and hear what he had to say about his software. &amp;nbsp;Because really, do we honestly need yet another bug-tracking / project-management tool?&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Who would benefit from FogBugz?&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.joelonsoftware.com/AboutMe.html"&gt;Joel&lt;/a&gt;'s demo was really good at demonstrating exactly how you might use the software - the processes you might follow, how to raise / update a ticket and chase it, and how you can see what's going on with the projects tracked.&lt;br /&gt;&lt;br /&gt;I can actually think of a number of companies I've worked for, or friends have worked for, that would see an improvement in productivity from using &lt;a href="http://www.fogcreek.com/FogBugz/"&gt;FogBugz&lt;/a&gt; for bug tracking / project management. &amp;nbsp;When I worked at Touch Clarity (later swallowed by &lt;a href="http://www.omniture.com/"&gt;Omniture&lt;/a&gt;, which was gobbled by &lt;a href="http://www.adobe.com/"&gt;Adobe&lt;/a&gt;) I was desperately looking for a product to help us:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Record defects&lt;/li&gt;&lt;li&gt;Capture new feature requests&lt;/li&gt;&lt;li&gt;Assign tasks to developers&lt;/li&gt;&lt;li&gt;Estimate tasks&lt;/li&gt;&lt;li&gt;Track progress - both at a project level and for individual developers&lt;/li&gt;&lt;li&gt;Provide us with a lightweight process which was easy to follow&lt;/li&gt;&lt;li&gt;Generate reports for management.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;From the demo I saw, FogBugz will do everything we wanted at that time. &amp;nbsp;We were using &lt;a href="http://www.bugzilla.org/"&gt;Bugzilla&lt;/a&gt; back then, and badly. &amp;nbsp;I'd also investigated &lt;a href="http://www.xplanner.org/"&gt;XPlanner&lt;/a&gt;, &lt;a href="http://www.versionone.com/Product/Product_Planning.asp"&gt;VersionOne&lt;/a&gt;&amp;nbsp;and a bunch of other defect/project management tools, and not really seen anything that did what I wanted (certainly that was cheap enough). &amp;nbsp;But this was back in 2004/5, we were doing a half-hearted version of &lt;a href="http://www.extremeprogramming.org/"&gt;eXtreme Programming&lt;/a&gt;, and we didn't have a lot of cash to burn. &amp;nbsp;It was hard then to find a lightweight, customisable, inexpensive tool.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The things I saw in FogBugz that I thought would be useful were:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Nice UI - usability of these things is so frequently under-valued.&lt;/li&gt;&lt;li&gt;Really easy to track what's going on with a defect, to add and edit comments etc. &amp;nbsp;I actually liked that the edit feature still tracked versions of the comments, I can see how some organisations would need that audit trail.&lt;/li&gt;&lt;li&gt;Evidence-based scheduling - I liked the way that it uses past information to have a good guess at how accurate an estimate will be, and therefore the soonest, likely and latest times a feature might be delivered by.&lt;/li&gt;&lt;li&gt;Visibility over an individual developer's workload.&lt;/li&gt;&lt;li&gt;Visibility over work at a project-level&lt;/li&gt;&lt;li&gt;Loads of charts/reports to let you slice and dice the stuff you have in there.&lt;/li&gt;&lt;li&gt;Dependency management&lt;/li&gt;&lt;li&gt;Neat integration to source control - yes, I know you can get this for loads of management tools now, it doesn't mean it's not useful. It seemed pretty slick here.&lt;/li&gt;&lt;li&gt;It seemed quick. &amp;nbsp;But then it could have been a locally-running instance with about 3 defects in it.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/div&gt;The things I thought would not be so useful in a more Agile environment:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Evidence-based scheduling&lt;/li&gt;&lt;li&gt;Visibility over an individual developer's workload.&lt;/li&gt;&lt;li&gt;Lots of the ways the data can be sliced and diced&lt;/li&gt;&lt;li&gt;Dependency management&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;So, you like it and you don't like it?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Yeah yeah, I've gone all multiple-personality again. &amp;nbsp;The stuff I liked about the product would be dead useful for the types of projects that work that way - where you assign work to individual developers who estimate the work; where developers are assigned to specific projects; where stories / features might not be broken down into small, independent tasks. &amp;nbsp;These places might be running waterfall, or some agile-ish process, or no process at all. &amp;nbsp;A tool like this will give them much better visibility over what's going on, over which deadlines won't be met, over who's estimates are flaky and who's are generally reliable.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However even before I joined &lt;a href="http://www.thoughtworks.com/"&gt;ThoughtWorks&lt;/a&gt;, before I joined &lt;a href="http://www.lmaxtrader.co.uk/about-lmax"&gt;LMAX&lt;/a&gt;, I was sold on Agile as a more natural way to run development teams (this is despite having worked with Touch Clarity's sort-of-XP and A Very Large Media Organisation's &lt;a href="http://bitsnwidgets.com/2008/04/19/DontBeASCRUMBUT.aspx"&gt;ScrumBut&lt;/a&gt;). &amp;nbsp;The problems that some of the features in FogBugz tries to address are similar to the problems that Agile (&lt;a href="http://www.extremeprogramming.org/rules.html"&gt;XP&lt;/a&gt;/&lt;a href="http://www.scrumalliance.org/learn_about_scrum"&gt;Scrum&lt;/a&gt;/&lt;a href="http://availagility.co.uk/2008/10/28/kanban-flow-and-cadence/"&gt;Kanban&lt;/a&gt; or some hybrid of these) is also supposed to address.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Evidence-based scheduling: I totally agree with getting statistical about this - teams and management should have a good idea how reliable estimates are. &amp;nbsp;But one of the ways to reduce the variation is to have the estimates done by the team. &amp;nbsp;At LMAX, we would have three developers estimate every story. &amp;nbsp;With any luck at least one of those would know enough about it to provide some solid technical guidance on what was involved, but if there wasn't someone in a group of three that had that knowledge, chances were pretty good the team generally were going to be pretty vague on it. &amp;nbsp;Granted, if you're using FogBugz you can enter the team estimate instead of just the individual who is going to implement it and then your evidence-based scheduling will be for team-estimates instead of personal ones. &amp;nbsp;This is totally fine, in fact it's a good thing - I just think we shouldn't use evidence-based scheduling to "fix" the problem that estimates are just that - an estimate, a guess.&lt;/li&gt;&lt;li&gt;Visibility over a developer's workload: If you're doing pair programming (XP), if the team takes ownership of the implementation of features / stories (Scrum), there's no need to look at how busy an individual developer is. &amp;nbsp;Yes, there are lots of organisations that do allocate work to individuals. &amp;nbsp;In many (most?) Agile-practicing teams, this will not be happening. &amp;nbsp;So really you only need visibility over a team or project level.&lt;/li&gt;&lt;li&gt;Reporting: Ah, I love reporting. &amp;nbsp;I love data, statistics, pretty charts. Maybe I'm secretly a project manager. &amp;nbsp;But it's SO easy to get hung up on the stats, on one tiny measurement, rather than the bigger picture - are we getting closer to "done" or not? &amp;nbsp;I think you should be able to get at all that data, but not get carried away micro-optimising for metrics which may be hiding bigger problems.&lt;/li&gt;&lt;li&gt;Dependency management: another thing that is dead important in some types of teams or organisations. &amp;nbsp;But the last few Agile projects I've worked on have not tracked hard-link dependencies at all - each story should stand alone, should be estimated on the basis of just doing that piece of work. &amp;nbsp;Yes, this is idealistic, and even in the projects where we did not officially track dependencies, we'd have a good idea of a very general order things should be done in (or an idea of the order things could be done in to make life easier). &amp;nbsp;But these things can be fluid, if a specific feature needs to be done now, you shouldn't have to do every single story that might have a tiny piece of functionality this story is dependent on - just tackle this story and everything you need for it. &amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;All of those points could be blog posts in their own right, I know it's taken me years to get my head around the way I personally see Agile. &amp;nbsp;But you get the idea, or maybe you don't - that's fine, maybe you're in exactly the sort of place that could use FogBugz to improve your productivity.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;FogBugz vs Mingle&lt;/span&gt;&lt;/div&gt;&lt;div&gt;I started at &lt;a href="http://www.thoughtworks.com/"&gt;ThoughtWorks&lt;/a&gt; last week, so I'd better mention that &lt;a href="http://www.thoughtworks-studios.com/"&gt;ThoughtWorks Studios&lt;/a&gt; have a competitor product, &lt;a href="http://www.thoughtworks-studios.com/mingle-agile-project-management"&gt;Mingle&lt;/a&gt;. &amp;nbsp;I'm reasonably well-qualified to talk about it since I've been using it in anger for the last two years in a maturing agile environment, and&amp;nbsp;I had my Mingle&amp;nbsp;&lt;s&gt;indoctrination&lt;/s&gt;&amp;nbsp;induction last week.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To me, the main difference is the angle the two products are taking to approach the same problem: how do you provide a tool that&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;is easy and lightweight enough to use that people (particularly developers) will keep it up to date;&lt;/li&gt;&lt;li&gt;tracks just the right amount of data that people have visibility over the state of development (What are we doing? &amp;nbsp;Are we going to hit our deadlines? What are our blockers?)&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;div&gt;To me, it seems FogBugz is coming from the traditional development model - it might not be anything as formal as waterfall, but it may not be based on short iterations and assumes individuals rather than teams are assigned work. &amp;nbsp;Mingle was developed for the Agile team, e.g. collective responsibility, pair programming, short iterations.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mingle is highly configurable, and while FogBugz has a number of templates and custom work flows, Mr Spolsky specifically stated at the demo that these really shouldn't be used. &amp;nbsp;That they've worked hard to find a process that works, and we should all follow that.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, Mingle embraces the differences between teams/processes and FogBugz specifically discourages it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I reckon these things are actually also the potential downfalls for both products too: &amp;nbsp;Mingle can be abused so badly that it adds no value; FogBugz could be so prescriptive it slows down productivity.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But it's horses for courses, every tool has its advantages and disadvantages. &amp;nbsp;Or should I be pushing Mingle at this point until I pass my probation??&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Kiln, and an introduction to DVCS&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Good Lord, I've written all that stuff and that's only from the short demo at the start of the day.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fortunately I have a lot less to say about the latter part. &amp;nbsp;It was an introduction to Distributed Version Control (DVCS), and it was pitched absolutely right for someone like me. &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've never used a DVCS; most recently I've been using &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt;, but I've also used &lt;a href="http://pvcs.synergex.com/"&gt;PVCS&lt;/a&gt;, &lt;a href="http://www-01.ibm.com/software/awdtools/clearcase/"&gt;ClearCase&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/aa302175.aspx#vssmap_topic2"&gt;VSS&lt;/a&gt;&amp;nbsp;and a bunch of others (in fact, I'm pretty sure I've had to learn a new source control system every time I've switched project or company!). &amp;nbsp;I've been introduced to &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt;&amp;nbsp;over a lunchtime, and I read Martin Fowler's blog post on &lt;a href="http://martinfowler.com/bliki/VersionControlTools.html"&gt;version control tools&lt;/a&gt;. &amp;nbsp;The intro provided by FogCreek was spot on for me. &amp;nbsp;It showed me:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;The differences between a DVCS and something like Subversion (OK, specifically svn, which is fine for me);&lt;/li&gt;&lt;li&gt;Advantages of using a distributed source control system;&lt;/li&gt;&lt;li&gt;Some mindsets that you need to change when switching from svn to a DVCS like &lt;a href="http://mercurial.selenic.com/"&gt;Mercurial&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;The FogCreek way of setting up the repositories.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;The last point was particularly useful in giving some real-life examples of how to use a DVCS and why.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then there was some stuff on why &lt;a href="http://www.fogcreek.com/kiln/"&gt;Kiln&lt;/a&gt; might give you more than just the freebie Mercurial install.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It was more useful in a general fashion than the FogBugz section. &amp;nbsp;However, like the FogBugz talk, I got a good feel for the types of teams/companies Kiln might be good for, and why you might use it. &amp;nbsp;Personally it convinced me that using a DVCS in general is probably better than Subversion (insert usual disclaimer of different tools being appropriate for different situations). &amp;nbsp;It certainly encourages working practices that will lead to a) less accidental loss of code (after all, that's what source control is for) and b) if well organised, better separation of bugs / features / stories and better integration across versions and branches.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you want to know what I've been blathering on about in this section, check out Joel's &lt;a href="http://hginit.com/00.html"&gt;excellent introduction to Mercurial&lt;/a&gt;. &amp;nbsp;OK, I admit it, I haven't read it all. &amp;nbsp;But it seems to cover everything that was covered in the conference session, with Joel's usual wit and appeal to the developer mindset.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;In Other News&lt;/span&gt;&lt;/div&gt;&lt;div&gt;In terms of an education session, the "World Tour" was excellent - succinct, easy to digest, and (to my mind) aimed exactly at the audience.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;However&lt;/i&gt;. &amp;nbsp;I actually ended the (half) day being slightly disappointed, and not just because these tools don't seem to be ideal for the Agile team.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;I didn't get enough of a chance to network. &amp;nbsp;Now, I'm happy to admit this is a problem I regularly have - because, like many developers, I find it difficult to talk to new people in a big room full of people I don't know. &amp;nbsp;However, given that this was a big room full of developers, I wish there had been more of an effort made to help us to mix and network. Before the talks we were on tables in another room having coffee etc, which I liked because it did lead to some conversation in small groups. &amp;nbsp;But I would have been nice if there had been a chance at the end of the talks to chat to people and&amp;nbsp;dissect&amp;nbsp;the session (if there actually was, it was so badly publicised I missed it). &amp;nbsp;I went with a stack of business cards and didn't give a single one out.&lt;/li&gt;&lt;li&gt;The half day didn't seem like enough. &amp;nbsp;But this might be more a reflection of the above point since I got what I wanted from the talks, any more would have been too much info. &amp;nbsp;So maybe I just wanted more time with the attendees and with the FogCreek guys.&lt;/li&gt;&lt;li&gt;I was shocked by how few women there were. &amp;nbsp;I'm no tech newbie, I've been to training sessions, conferences, user groups, seminars, and worked on site at a lot of different types of places. &amp;nbsp;I was very surprised to see that in a room of several hundred people I counted 5 women (myself included). &amp;nbsp;This seems low even for gathering of techies, it seems &lt;i&gt;very&lt;/i&gt; low for a presentation on a piece of software that is effectively project management software. &amp;nbsp;I don't have the stats to hand, but in my personal experience any technical event with even a sniff of project management stuff is better represented across both genders. &amp;nbsp;I wouldn't normally comment on it because it's something I'm used to myself, but I've been asked a bunch of times in the last two weeks "what do we need to do to encourage more participation by women?", and I have my eyes open for stuff which might help me answer that.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;In Conclusion&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;A generally good, well-run event, especially as it was free (if I recall correctly).&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.fogcreek.com/fogbugz/"&gt;FogBugz&lt;/a&gt; and &lt;a href="http://www.fogcreek.com/kiln/"&gt;Kiln&lt;/a&gt; are excellent tools for a certain type of organisation / team, and I'm not talking about a small minority of teams here.&lt;/li&gt;&lt;li&gt;If you're Agile, these tools are probably not for you. &amp;nbsp;You can get them to work, and if you're "kind of" agile they're probably better than a lot of your options. &amp;nbsp;But true agile teams running an effective process might find themselves hindered more than helped.&lt;/li&gt;&lt;li&gt;I'm going to download and install a DVCS the very next time I have to write a line of code.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-1546903531237732110?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/1546903531237732110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/01/fogbugs-and-kiln-world-tour.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/1546903531237732110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/1546903531237732110'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/01/fogbugs-and-kiln-world-tour.html' title='FogBugs and Kiln World Tour'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-2156916908191540870</id><published>2011-01-17T11:59:00.000Z</published><updated>2011-01-17T11:59:45.920Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='reference'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>CSS for Developers: Horizontal Layout Using CSS</title><content type='html'>I'm a Java Developer. &amp;nbsp;But I'm also a Web Developer. &amp;nbsp;Web Developers have been so badly maligned over the last decade or so that I always feel wary (and sometimes slightly ashamed) admitting this. &amp;nbsp;There's some sort of assumption that Web Developers (and Front End Developers) aren't real programmers. Similarly, "real" developers don't like to be tainted by coming into contact with that nasty "front end stuff" in case someone mistakes them for a designer.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Trust me, no-one is going to mistake a Java Developer for a designer. &amp;nbsp;For a start, when designers wear geeky glasses it's ironic. &amp;nbsp;Or chic. &amp;nbsp;Or something.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But developers will be forced to do something around the front end at some point in their lives. &amp;nbsp;Even if it's because they're sick of manually kicking off some process and want to give the users a big red button to press instead.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, as much to compensate for my own goldfish-like brain as anything else, I'm going to make a note of some of the CSS stuff I've used or found helpful during my mad scramblings to get the &lt;a href="http://www.lmaxtrader.co.uk/"&gt;LMAX Trader&lt;/a&gt; user interface to a) look the way we wanted b) perform fast enough so our &lt;a href="http://www.infoq.com/presentations/LMAX"&gt;awesome back end performance&lt;/a&gt; wasn't totally invisible to the retail user and c) Not Suck Too Badly in Internet Explorer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;Part One: Horizontal Layout (or: There's No Excuse For Tables Any More)&lt;/h3&gt;&lt;/div&gt;&lt;div&gt;You may (or may not) have heard that using tables for layout is a Bad Thing. &amp;nbsp;But to be fair, most of us don't care. &amp;nbsp;I've done it myself, it's usually the quickest way to lay stuff out on the page, especially if you're new to HTML / CSS and/or short on time. &amp;nbsp;There are loads of arguments all over the web as to why this is a bad thing, but the reasons I didn't want tables on the &lt;a href="http://www.lmaxtrader.co.uk/"&gt;LMAX&lt;/a&gt; UI was a) we saw the performance improve by a really simple replacement of tables with divs and b) given the amount the UI was mutating, divs positioned with CSS was going to allow us a much quicker turnaround for the umpteenth re-design of the UI (ideally the upshot of this would be letting the designers mess with the CSS when they changed their minds and leave us developers out of it).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway let's assume Tables Are Bad. &amp;nbsp;Tables are only for tabular data, not for layout. &amp;nbsp;In my world.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h4&gt;1.1 Simple Horizontal Layout Using Inline&lt;/h4&gt;&lt;/div&gt;&lt;div&gt;The most common use of tables for layout is where you put elements side by side - the default behaviour of divs is that they lay out underneath each other.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However it's pretty easy to get divs to behave this way too, and using divs has some advantages over using tables.&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_7adQd_YVgmQ/TTQhm7XQHTI/AAAAAAAAH7c/3JE1vQBCbgw/s1600/Screen+shot+2011-01-14+at+17.14.37.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_7adQd_YVgmQ/TTQhm7XQHTI/AAAAAAAAH7c/3JE1vQBCbgw/s640/Screen+shot+2011-01-14+at+17.14.37.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Horizontal flow&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;        #left {&lt;br /&gt;            background-color: cyan;&lt;br /&gt;            display: inline;&lt;br /&gt;        }&lt;br /&gt;        #center {&lt;br /&gt;            background-color: yellow;&lt;br /&gt;            display: inline;&lt;br /&gt;        }&lt;br /&gt;        #right {&lt;br /&gt;            background-color: red;&lt;br /&gt;            display: inline;&lt;br /&gt;        }&lt;br /&gt;    &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div id="container"&amp;gt;&lt;br /&gt;    &amp;lt;div id="left"&amp;gt;Left&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="center"&amp;gt;Center&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="right"&amp;gt;Right&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;The first option is to use &lt;code style="font-size: 12px;"&gt;display: inline&lt;/code&gt;. &amp;nbsp;This will lay div elements next to each other, similar to a &lt;code style="font-size: 12px;"&gt;span&lt;/code&gt;. &amp;nbsp;This is the simplest way to get divs to appear side-by-side.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The disadvantage of this technique, however, is that inline elements can't be sized the same way as standard divs. &amp;nbsp;By default they contract to fit the content.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The screenshot above is from Chrome on the mac - you'll notice by default the elements have some spacing between them. &amp;nbsp;Reducing the margin/borders on the elements doesn't seem to eliminate this, so that's something else you might need to consider if you use this mechanism to display elements side-by-side.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div&gt;&lt;h4&gt;1.2 Simple Horizontal Layout Using Floats&lt;/h4&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_7adQd_YVgmQ/TTQh06-qxcI/AAAAAAAAH7g/5zKQIsKeEdk/s1600/Screen+shot+2011-01-17+at+10.57.25.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/_7adQd_YVgmQ/TTQh06-qxcI/AAAAAAAAH7g/5zKQIsKeEdk/s640/Screen+shot+2011-01-17+at+10.57.25.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Horizontal flow&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;        #left {&lt;br /&gt;            background-color: cyan;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #center {&lt;br /&gt;            background-color: yellow;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #right {&lt;br /&gt;            background-color: red;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;    &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div id="container"&amp;gt;&lt;br /&gt;    &amp;lt;div id="left"&amp;gt;Left&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="center"&amp;gt;Center&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="right"&amp;gt;Right&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Similar to using inline, floating a div will do the following:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Make it shrink to fit the content&lt;/li&gt;&lt;li&gt;Lay it out side-by-side with any sibling floating divs.&lt;/li&gt;&lt;/ol&gt;You'll want to apply padding, margins, height, width and whatever else to make it appear less rubbish.&lt;br /&gt;&lt;div&gt;&lt;h4&gt;&lt;br class="Apple-interchange-newline" /&gt;1.3 Wrapping Horizontal Layout&lt;/h4&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_7adQd_YVgmQ/TTQkOi9uxMI/AAAAAAAAH7k/FWxavDriCp0/s1600/Screen+shot+2011-01-17+at+11.12.36.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/_7adQd_YVgmQ/TTQkOi9uxMI/AAAAAAAAH7k/FWxavDriCp0/s640/Screen+shot+2011-01-17+at+11.12.36.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Horizontal flow&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;        #left {&lt;br /&gt;            background-color: cyan;&lt;br /&gt;            width: 50%;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #center {&lt;br /&gt;            background-color: yellow;&lt;br /&gt;            width: 50%;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;        #right {&lt;br /&gt;            background-color: red;&lt;br /&gt;            width: 50%;&lt;br /&gt;            float: left;&lt;br /&gt;        }&lt;br /&gt;    &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div id="container"&amp;gt;&lt;br /&gt;    &amp;lt;div id="left"&amp;gt;Left&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="center"&amp;gt;Center&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="right"&amp;gt;Right&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/div&gt;The advantage you have using divs over tables is that you can get the browser to work out how the elements should flow. &amp;nbsp;Tables require you to determine exactly how many cells appear on each row, but with divs you can determine a width for each element and have the browser work out whether to show it on a new line or not. &amp;nbsp;This will work with both percentage and pixel widths. &lt;br /&gt;&lt;ul&gt;&lt;li&gt;If you want a more table-like structure where you know exactly how many elements should appear on each line, use a percentage of the screen with. &amp;nbsp;&lt;/li&gt;&lt;li&gt;If you know the width of each element, you should set a pixel width on the elements and have the browser work out how many to show per line.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The next CSS post will go over floating behaviour in a little more detail.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-2156916908191540870?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/2156916908191540870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2011/01/css-for-developers-horizontal-layout.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2156916908191540870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2156916908191540870'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2011/01/css-for-developers-horizontal-layout.html' title='CSS for Developers: Horizontal Layout Using CSS'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_7adQd_YVgmQ/TTQhm7XQHTI/AAAAAAAAH7c/3JE1vQBCbgw/s72-c/Screen+shot+2011-01-14+at+17.14.37.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-6984452169470317353</id><published>2010-10-31T17:05:00.000Z</published><updated>2011-01-13T13:09:26.485Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='lmax'/><title type='text'>Live at Last</title><content type='html'>We went live with &amp;quot;real&amp;quot; customers this week just gone. &amp;nbsp;It's the culmination of nearly two years work for me personally, and three years for our company.&lt;br/&gt;&lt;br/&gt;&lt;img src="http://sphotos.ak.fbcdn.net/hphotos-ak-snc4/hs991.snc4/76493_450908175811_545840811_6068221_1642738_n.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;It's really nice to be live at last, and to have our name out there.  It might (in fact, should) change the focus of our work.  Without paying customers it's much more difficult to prioritise work based on what they might need or want.&lt;br/&gt;&lt;br/&gt;Exciting times for LMAX!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-6984452169470317353?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/6984452169470317353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2010/10/live-at-last.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/6984452169470317353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/6984452169470317353'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2010/10/live-at-last.html' title='Live at Last'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-2913502688399988040</id><published>2010-07-09T11:28:00.000+01:00</published><updated>2011-01-18T17:31:41.958Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='kanban'/><category scheme='http://www.blogger.com/atom/ns#' term='lean'/><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>Lean Software and Systems Conference 2010 (Bletchley Park)</title><content type='html'>This is just a summary of the points I took from the Lean conference at Bletchley. &amp;nbsp;They all need expanding, this is just the stuff that struck me that I want to record.&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;A Kanban Multiverse – Karl Scotland&lt;/span&gt;&lt;br /&gt;&lt;b&gt;Points from his talk&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Meaning = visualise; interact; persist&lt;/li&gt;&lt;li&gt;Kanban provides the translation between communities&lt;/li&gt;&lt;li&gt;Remove columns from the Kanban board - no more chucking things over the wall to people&lt;/li&gt;&lt;li&gt;Flip charts for design models&lt;/li&gt;&lt;li&gt;Dots on cards for every day in dev, crosses for every day in test&lt;/li&gt;&lt;li&gt;Exploration of UI is part of the card&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Ideas applicable for my project&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Add broken acceptance tests to the Kanban Board?&lt;/li&gt;&lt;li&gt;Start doing task breakdowns again&lt;/li&gt;&lt;li&gt;Add issues and impediments to Kanban board?&lt;/li&gt;&lt;li&gt;Mingle should be updated to reflect the Kanban, at the moment the states are incorrect&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Converting a Scrum Team to Kanban - Mattias Skarin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Points from his talk&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Moved from releases per iterations to releases per week&lt;/li&gt;&lt;li&gt;Shifted motivation from delivering at end of iteration towards delivering quality&lt;/li&gt;&lt;li&gt;Establish release cadence and team rhythm&lt;/li&gt;&lt;li&gt;Root cause analysis to find problems and target them&lt;/li&gt;&lt;li&gt;Removed the need for estimates&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Ideas applicable for my project&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Shift to focus on release cadence from iterations?&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;Product Development in the Land of the Free&lt;/span&gt;&lt;br /&gt;&lt;b&gt;Points from their talk&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Goal should be to “Delight Customers”&lt;/li&gt;&lt;li&gt;Sitting together decreases waste&lt;/li&gt;&lt;li&gt;Sysadmins belong to the team and rotate&lt;/li&gt;&lt;li&gt;Deliver value fast enough and you don't have to ask for permission&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;Learn to Lean: Becoming a Lean Startup – Damon Morgan&lt;/span&gt;&lt;br /&gt;&lt;b&gt;Points from his talk&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Introduce a learning culture: blogs, brown bags, conferences&lt;/li&gt;&lt;li&gt;Scrum introduces a half-day overhead of planning etc.&lt;/li&gt;&lt;li&gt;Scrum implies a handed off release to QA / Ops&lt;/li&gt;&lt;li&gt;Didn't have “QA” but “Developer/Testers” and “Tester/Developers”&lt;/li&gt;&lt;li&gt;Lean = planning on demand.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Not sure when we're supposed to do retrospectives with a pull model?&lt;/li&gt;&lt;li&gt;Definition of Done is not only released to production, but has two&amp;nbsp;possibilities: Generating Value and Not Generating Value&lt;/li&gt;&lt;li&gt;Cards that are “complete” but not released are inventory (and therefore waste)&lt;/li&gt;&lt;li&gt;Need fast smoke tests&lt;/li&gt;&lt;li&gt;Monitoring allows you to reduce errors and see if the release was good. Auto-rollback if not&lt;/li&gt;&lt;li&gt;Releases can be small, feature-specific releases&lt;/li&gt;&lt;li&gt;Have an ideas wall for anyone to contribute&lt;/li&gt;&lt;li&gt;AB Testing very useful to this organisation.&lt;/li&gt;&lt;li&gt;Reduced reliance on estimates&lt;/li&gt;&lt;li&gt;Releases not a big deal – happen daily&lt;/li&gt;&lt;li&gt;Measure outcomes, not activity&lt;/li&gt;&lt;li&gt;Out of 20 ideas, maybe one works. But cost/benefit clear and well understood&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Ideas for us&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Become more release-focussed&lt;/li&gt;&lt;li&gt;Should we encourage developers to do (more) exploratory testing?&lt;/li&gt;&lt;li&gt;Definition of done should be “released”&lt;/li&gt;&lt;li&gt;Better automated monitoring&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;Using Kanban to Continuously Improve – Benjamin Mitchel&lt;/span&gt;&lt;br /&gt;&lt;b&gt;Points from his talk&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Quality First&lt;/li&gt;&lt;li&gt;Flow important&lt;/li&gt;&lt;li&gt;“What wasted your time?” to do root cause analysis&lt;/li&gt;&lt;li&gt;Measure time taken to flow through the board&lt;/li&gt;&lt;li&gt;Even if you show people metrics they still don't believe you&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Ideas for us&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Thank goodness we're not a big enterprise organisation&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;Behaviour Driven Development – Liz Keogh&lt;/span&gt;&lt;br /&gt;&lt;b&gt;Points from her talk&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The term BDD and what it means has solidified over time, but it's nothing new&lt;/li&gt;&lt;li&gt;Concentrate on your riskiest tests first&lt;/li&gt;&lt;li&gt;Write your tests starting “should”&lt;/li&gt;&lt;li&gt;Conversations are around behaviour not tests&lt;/li&gt;&lt;li&gt;Development of stories is focussed on learning&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Ideas for us&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;We're pretty good at BDD&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;Value Stream Languages – Eric Willeke&lt;/span&gt;&lt;br /&gt;&lt;b&gt;Points from his talk&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Really just a summary of the day / Lean&lt;/li&gt;&lt;li&gt;We should respect different languages&lt;/li&gt;&lt;li&gt;Break things down into what you need to learn, not what you need to do and how long it will take&lt;/li&gt;&lt;li&gt;Variation comes from time it takes to learn, not time it takes to do&lt;/li&gt;&lt;li&gt;Ask “what do we need to know that we don't know now?”&lt;/li&gt;&lt;li&gt;Break milestones down accordingly – High Learning → High Risk → Core Value → High Value&lt;/li&gt;&lt;li&gt;Standup should be phrased “what did we learn yesterday; what do I need to learn today”&lt;/li&gt;&lt;li&gt;When your acceleration of learning decreases it might be time to stop designing and start doing&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Ideas for us&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Maybe a shift in thinking about “learning” instead of “doing”&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;Summary&lt;/span&gt;&lt;br /&gt;&lt;b&gt;Points frequently repeated and/or relevant to my project&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Aim towards no estimation&lt;/li&gt;&lt;li&gt;Not focussing on iterations but on releases&lt;/li&gt;&lt;li&gt;Releases are part of the definition of done&lt;/li&gt;&lt;li&gt;Our BDD and basic Kanban is pretty good&lt;/li&gt;&lt;li&gt;Visibility allows us to find bottlenecks and target them&lt;/li&gt;&lt;li&gt;Focussing on learning might be a path to improvement&lt;/li&gt;&lt;li&gt;Silos are Bad, mmmkay?&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-2913502688399988040?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/2913502688399988040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2010/07/lean-software-and-systems-conference.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2913502688399988040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/2913502688399988040'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2010/07/lean-software-and-systems-conference.html' title='Lean Software and Systems Conference 2010 (Bletchley Park)'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-7042195724668513150</id><published>2009-05-15T13:22:00.000+01:00</published><updated>2011-01-13T13:10:34.202Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='gender'/><category scheme='http://www.blogger.com/atom/ns#' term='links'/><title type='text'>Comments on representations of our industry</title><content type='html'>I&amp;nbsp;have not (yet) seen the presentation &lt;a href="http://blogs.tedneward.com/2009/05/01/On+Speaking+Trolling+Inciting+And+Growing.aspx"&gt;this post &lt;/a&gt;is referring to.&amp;nbsp; But I think many of the comments Ted makes are very valid, and our industry as a whole should occasionally stop and think.&amp;nbsp; I've seen Ted speak at QCon, and I've had a lot of time for his comments ever since.&lt;br /&gt;&lt;br /&gt;I'm aware that this blog is rapidly filling with comments about gender and perceptions and people-y stuff, when I originally wanted it to be a purely technical blog.&amp;nbsp; But I guess this other stuff interests me more. &amp;nbsp;And there are less people talking about it than there are talking about pure technical solutions to problems.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-7042195724668513150?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/7042195724668513150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2009/05/comments-on-representations-of-our.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/7042195724668513150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/7042195724668513150'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2009/05/comments-on-representations-of-our.html' title='Comments on representations of our industry'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-3320312081532975280</id><published>2009-04-02T10:34:00.000+01:00</published><updated>2011-01-13T13:10:34.204Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='links'/><title type='text'>Why changing jobs frequently is not necessarily a bad thing...</title><content type='html'>...in fact, &lt;a href="http://www.infoq.com/news/2009/03/models_apprenticeship"&gt;it's actually a good thing&lt;/a&gt;.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-3320312081532975280?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/3320312081532975280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2009/04/why-changing-jobs-frequently-is-not.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/3320312081532975280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/3320312081532975280'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2009/04/why-changing-jobs-frequently-is-not.html' title='Why changing jobs frequently is not necessarily a bad thing...'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-1866234162466780805</id><published>2009-03-30T11:44:00.000+01:00</published><updated>2011-01-13T13:10:34.207Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='gender'/><category scheme='http://www.blogger.com/atom/ns#' term='girls'/><title type='text'>Sexism in IT?</title><content type='html'>&lt;a href="http://www.guardian.co.uk/commentisfree/2009/mar/25/women-it-ada-lovelace"&gt;Let's celebrate our IT women&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;quot;Everyone&amp;quot; knows that there are more men than women in IT.&amp;nbsp; That it's a &amp;quot;boys&amp;quot; job. &amp;nbsp;Not a lot of people know that the first programmer was a woman.&amp;nbsp; Not a lot of people realise the number of women in IT is DECREASING. &amp;nbsp;And has been since the 80s. &amp;nbsp;In a working world where I&amp;nbsp;honestly believe that *in general* there are more opportunities for women&amp;nbsp;(OK, inline with the other stuff I've been reading I'll caveat this with white, middle-class women), it seems shocking that such a growth industry as IT&amp;nbsp;is actually losing women, and appears unable to determine why, or stop the flow.&lt;br /&gt;&lt;br /&gt;I get asked a lot, as a girl programmer, why there aren't more women in IT. &amp;nbsp;This is a complicated issue and one I've been thinking about for years and still don't have any good answers, but I&amp;nbsp;personally think it's more about perception than anything else.&lt;br /&gt;&lt;br /&gt;I don't think it's because you get more outright sexism and laddish behaviour in IT than anywhere else.&amp;nbsp; I've worked in half a dozen companies, in a range of industries, including very male industries like manufacturing and banking, I've been a consultant so been onsite at a bunch more companies.&amp;nbsp; And I&amp;nbsp;have to say I don't think&amp;nbsp;I've ever seen the sort of behaviour that is mentioned in the article. &lt;br /&gt;&lt;br /&gt;I would go so far as to say IT, certainly in terms of programming or IT&amp;nbsp;support, actually attracts men that are quite the opposite to laddish.&amp;nbsp; So here I will succumb to gross generalisation and stereotypes myself, but the guys I've worked with are highly intelligent and more likely to rate you on your ability than on your colour, sex or background. &amp;nbsp;These are often guys who were actually studying at school rather than absorbing anti-female sentiments in the pub or from The Sun.&lt;br /&gt;&lt;br /&gt;I find being a woman in IT&amp;nbsp;both a blessing and a curse.&amp;nbsp; As a girl, you are, I believe, more likely to get through to interview, and since you stand out as different are more likely to be remembered and called back for a second interview.&amp;nbsp; I think once in the organisation, we suffer more with low self-esteem and find ourselves constantly trying to &amp;quot;prove&amp;quot; that we're not just some token bimbo hired by HR.&amp;nbsp; And do you know why?&amp;nbsp; Not because anyone ELSE thinks that, but because WE think that. &amp;nbsp;We are our own worst enemies.&lt;br /&gt;&lt;br /&gt;We need to take a leaf from the boys' book and have more faith in ourselves, more confidence.&amp;nbsp; We might not be as good as that person over there at this particular thing, or this other person at something else, but we are good at what we do, otherwise we wouldn't be there. &amp;nbsp;And if we express our insecurities instead of our confidence, other people will assume we're as mediocre as we sometimes think we are.&lt;br /&gt;&lt;br /&gt;Some of the very worst culprits for sexism in our industry are us, the girls who are already in it.&amp;nbsp; Yes, it does exist, I am not denying that for a second&lt;sup&gt;1&lt;/sup&gt;.&amp;nbsp; But the way to overcome it is to reflect it back at them, not to internalise it as our problem, something wrong with us for being in the wrong job. &amp;nbsp;The more we show that it's normal for us to be here, that we belong here, the better we'll feel about ourselves.&amp;nbsp; And maybe we'll attract a few more girls too.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;sup&gt;;1&lt;/sup&gt;Take, for example, the CEO&amp;nbsp;who interviewed me and said &amp;quot;I'm probably not allowed to say this, but how will you feel working in an environment full of men&amp;quot;.&amp;nbsp; To which my answer was, have you read my CV?&amp;nbsp; I went to a boys' school for sixth form, I was one of 6 girls on my degree course (out of approx 150), I&amp;nbsp;worked at Ford for 4 years.&amp;nbsp; Don't you think&amp;nbsp;I would be more freaked out working with girls?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-1866234162466780805?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/1866234162466780805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mechanitis.blogspot.com/2009/03/sexism-in-it.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/1866234162466780805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/90440057274722849/posts/default/1866234162466780805'/><link rel='alternate' type='text/html' href='http://mechanitis.blogspot.com/2009/03/sexism-in-it.html' title='Sexism in IT?'/><author><name>Trisha</name><uri>http://www.blogger.com/profile/11486870702929760981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_7adQd_YVgmQ/TS8RlIOPzII/AAAAAAAAH64/4ClHmmhPH5k/s1600-R/161658_545840811_726472_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-90440057274722849.post-314948441812678188</id><published>2009-02-24T11:04:00.000Z</published><updated>2011-01-13T13:10:34.210Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='what not to do'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='links'/><title type='text'>Scrum but...</title><content type='html'>Having experience &lt;a href="http://martinfowler.com/bliki/FlaccidScrum.html"&gt;Flaccid Scrum&lt;/a&gt;, I find this article interesting, and agree with most of it.&lt;br /&gt;&lt;br /&gt;I'd also like to add though, that if you do the scrum practices&amp;nbsp;(story cards, stand ups, retrospectives, etc) but don't buy into the fundamental principals, you will not succeed.&amp;nbsp; And that means everyone on the team, not just the people in charge. &amp;nbsp;In particular, if the team is not empowered, is not committing to the estimates and the iteration plan in its heart, and and does not trust, then you are probably better off using traditional processes.&amp;nbsp; Or just as likely to fail whatever process you use.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/90440057274722849-314948441812678188?l=mechanitis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mechanitis.blogspot.com/feeds/314948441812678188/comments/default' title='Post Comments'/><link rel='r
