<?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-5943246977515325910</id><updated>2012-02-16T03:52:57.332-08:00</updated><category term='Personal'/><category term='Macintosh'/><category term='Writing'/><category term='Design'/><category term='Java'/><category term='Agile'/><category term='General Geek Stuff'/><title type='text'>Blood, Sweat and Tiers</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>34</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-6067564376311822716</id><published>2009-01-19T02:44:00.000-08:00</published><updated>2009-01-19T02:47:40.176-08:00</updated><title type='text'>First post on Blogger</title><content type='html'>I'm moving my blog over to Blogger, so if you're reading this, it means you've found the new location. Well done :) &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With a little luck, all the old posts from Moveable Type will get imported in the next few days and I can retire the old site before it gets bulldozed!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5943246977515325910-6067564376311822716?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/6067564376311822716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2009/01/first-post-on-blogger.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/6067564376311822716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/6067564376311822716'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2009/01/first-post-on-blogger.html' title='First post on Blogger'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-3577635029160016498</id><published>2008-09-24T10:01:00.000-07:00</published><updated>2009-09-20T03:45:09.808-07:00</updated><title type='text'>Nostradufus</title><content type='html'>Our company holds an annual conference where customers from all over the country come to see and hear the latest goings on with our rather large software product. I get up and give a couple of presentations at this event, generally covering our technical evolution and our high level plans for the coming year. Being of the agile persuasion, I have advocated a convention of three releases per year with published guidance on what's likely to be included in each release over the next year. This lets customers into our view of the collective priorities but allows us to remain flexible as we roll along. This guidance gets republished after each release so there is always about a year of product roadmap visibility that customers know is likely to change.&lt;br/&gt;&lt;br/&gt;So much for the back story. As I started preparing for this year's conference, I looked back at last year's presentations to remind myself what I'd said. I had one slide for each of the forthcoming three releases, with about four features per release, for a total of 12 feature predictions for 2008. Guess how many have turned out to be true? As I looked at the list I was quite surprised to find that not a single one of my 12 priority features had come to pass. Not one.&lt;br/&gt;&lt;br/&gt;I sat back and pondered this for a bit. It's not like we hadn't done our three releases right on time with a slew of very well received initiatives that most customers agree are taking us where they want to go. Our development team has never been so well respected for what it has achieved over the last few years, and the consensus is that the challenge now lies with the customers to keep up with us after a decade of the reverse.&lt;br/&gt;&lt;br/&gt;All I can say is that even when you make predictions that you think are safe, even when you give yourself room to move, even when you profess agility and despise those practices in your profession that seem to think the world can bend to the gantt chart rather than the reverse, even when you have the inordinate luxury of making your own deadlines and correctly frame your horizon scans as guidance and not promises, you can still fool yourself into thinking you know something that you don't.&lt;br/&gt;&lt;br/&gt;The good news is that taking an agile approach means you talk to customers frequently enough and update them on what's happening and why frequently enough that you have no qualms about having a laugh about this with them because they, too, are focused on this year's progress, not last year's plan. I'm just glad my salary isn't tied to my ability to follow a plan, because I can't even follow one I created myself!&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/5943246977515325910-3577635029160016498?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/3577635029160016498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2008/09/nostradufus.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/3577635029160016498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/3577635029160016498'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2008/09/nostradufus.html' title='Nostradufus'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-8424991340299594376</id><published>2006-10-08T03:28:00.000-07:00</published><updated>2009-09-20T03:45:09.808-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>The Truth or a Comforting Lie?</title><content type='html'>Long time no blog. I've been distracted in recent months  learning about non-geek stuff like investing in the stock market, which I may blog about at some point. But what has inspired me to pick up my virtual pen again is the apparent mainstream rise in popularity of agile development. Bear in mind that I'm in Australia so your time lines may vary, but these days there are very large organisations stating agile development as a key aspiration and sending head hunters around about scrounging for anyone who can spell it correctly to lead them to the promised land.  Five years ago we relatively early adopters of eXtreme Programming would band together and tell each other stories of what a wonderful world it would be when major banks and telcos saw the light and changed their evil waterfall ways. Now it seems we may have gotten what we wished for and perhaps we should have been more careful.&lt;br/&gt;&lt;br/&gt;Refer to &lt;a href="http://www.martinfowler.com/bliki/AgileImposition.html"&gt;Martin Fowler's recent post&lt;/a&gt; on how top-down imposition of agile is pretty un-agile by definition; he's far more calm and articulate then I am. But as someone who has seen agile succeed and fail, I thought I'd throw my opinion into the ring for a bit of perspective for the recently converted. The greatest success with which I have been involved personally was simply awesome. A true agile poster child project: the brochure for it would tell you that we estimated it almost perfectly, delivered it on time and on budget, have had so few bugs in two years of production use that you'd have several fingers left counting them digitally, and the system transformed the business in a truly fundamental way. And we're not talking about a small project here: 20 people all up for 18 months and several million dollars. This is all absolutely true. What the brochure would fail to mention most likely is that we clashed with several internal stakeholders to the point where I was excluded from the building for a week in the middle of the project, that we needed the best team of developers I've ever seen to pull it off, the best project manager I've ever seen, the best iteration manager, customer representative and analysts and we had to fight off any number of die-hard process nazis who did not share our value system of actually delivering something of value (think Vogons). The brochure would also fail to mention that the organisation that witnessed this startling occurrence was quite committed to hiding this anomalous project like an embarrassing relative; you see, we outsiders had been brought in as the third attempt at this project in three years, and were set up to fail. The brochure probably would not mention that either.&lt;br/&gt;&lt;br/&gt;Where I've seen agile fail is quite simply when you don't have all of these things working for you. Like having a distracted customer who can't spend the time with the team. Like having developers who really don't care about the craftsmanship of their work. Like having analysts who just type requirements into documents without any actual analysis. Like testers who just do the happy scenarios because the other ones are too hard. Like having a project manager who focuses on avoiding failure rather than achieving success. The problem with agile is that any one of these can severely damage or even kill your project despite the health of the others.&lt;br/&gt;&lt;br/&gt;So the good news is that agile can and does work. The bad news is that agile can and does fail. So what are you to do? Looking back on that successful project, what made it work was, unfortunately, probably the same old things that have made any project work in any human endeavour since human endeavours began; highly skilled and committed people who bust a gut, put their necks on the line and get really lucky as well. And guess what? If you took these circumstances and did waterfall, you'd be just fine.  What agile is great at is failing fast and eliminating waste. The feedback cycles are there to detect and correct the course of the project almost as soon as it starts. I'm not sure how common this expression is, but when someone asks you a question to which the true answer will be very upsetting for them, the initial response is often, "Do you prefer the truth or a comforting lie?" That successful project had been estimated prior to my team's arrival. When we took a look, our estimate was 3.5 times higher and the duration was twice as long. We had extreme pressure to just hide our estimate and do the typical budget blowout thing later on. Not doing so and being honest nearly killed the project before it started. Agile is for those who can handle the truth; waterfall is for those who prefer the comforting lie. Either one may be right for you and your organisation.&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/5943246977515325910-8424991340299594376?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/8424991340299594376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2006/10/truth-or-comforting-lie.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/8424991340299594376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/8424991340299594376'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2006/10/truth-or-comforting-lie.html' title='The Truth or a Comforting Lie?'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-2765474788907983915</id><published>2006-05-27T17:01:00.000-07:00</published><updated>2009-09-20T03:45:09.808-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General Geek Stuff'/><title type='text'>Speed Read With Your Eyes Shut</title><content type='html'>Q: What do you get when you cross:&lt;br/&gt;&lt;br/&gt;* your Mac&lt;br/&gt;* your ipod&lt;br/&gt;* &lt;a href="http://www.gutenberg.org/"&gt;Project Gutenberg&lt;/a&gt;, my favourite source of great literature in goold old single-file ASCII text&lt;br/&gt;* &lt;a href="http://www.cepstral.com/demos/"&gt;Cepstral William&lt;/a&gt;, the sexiest robot text-to-speech voice around, and&lt;br/&gt;* &lt;a href="http://www.rogueamoeba.com/audiohijackpro/"&gt;Audio Hijack Pro&lt;/a&gt; to capture whatever William says and turn it into bookmarkable mp3 files to put on your ipod...?&lt;br/&gt;&lt;br/&gt;A: A supply of the world's best audiobooks that will last longer than you will, that you can take anywhere with you, enjoy with your feet up and your eyes closed (unless you're driving, of course). But not only that, unlike a normal audiobook that you might buy from &lt;a href="http://www.audible.com"&gt;Audible&lt;/a&gt;, you can crank the speed up to whatever your brain can handle! Speed reading with your eyes shut. Cool.&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/5943246977515325910-2765474788907983915?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/2765474788907983915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2006/05/speed-read-with-your-eyes-shut.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/2765474788907983915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/2765474788907983915'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2006/05/speed-read-with-your-eyes-shut.html' title='Speed Read With Your Eyes Shut'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-1153763693116618809</id><published>2006-04-25T03:18:00.000-07:00</published><updated>2009-09-20T03:45:09.809-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General Geek Stuff'/><title type='text'>Joining the Rails fashion set</title><content type='html'>Last weekend &lt;a href="http://www.redhillconsulting.com.au/blogs/simon"&gt;Simon&lt;/a&gt; and Stuart The Blogless and I joined the fashion set by putting our first Rails application into production. It's a real estate web site for a beautiful part of Australia called the Southern Highlands (about an hour from Sydney). You can visit &lt;a href="http://www.campbelljonesproperty.com.au"&gt;Campbell Jones Property&lt;/a&gt; for a look if you like.&lt;br/&gt;&lt;br/&gt;A few features of the site:&lt;br/&gt;* the constrained box design was chosen by the client so don't blame me!&lt;br/&gt;* funky interactive map on &lt;a href="http://www.campbelljonesproperty.com.au/buy/search"&gt;the search page&lt;/a&gt; - go Stuart!&lt;br/&gt;* little ajaxy forms to submit feedback without doing page refreshes&lt;br/&gt;* main image on &lt;a href="http://www.campbelljonesproperty.com.au/buy/property_listing/141/main"&gt;the property listing page&lt;/a&gt; changes as you hover over the thumbnails&lt;br/&gt;* client-side scrolling of bio information on &lt;a href="http://www.campbelljonesproperty.com.au/sell/meet_our_team"&gt;the meet the team page&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;A few 'behind the scenes' things:&lt;br/&gt;* all the images are in a &lt;a href="http://www.postgresql.org"&gt;Postgres&lt;/a&gt; database but are cached by Rails as they are used&lt;br/&gt;* images are uploaded in hi-res by the client and crunched on the server using &lt;a href="http://www.imagemagick.org/"&gt;ImageMagick&lt;/a&gt; to generate the various form factors required for the site - a real time saver for the client&lt;br/&gt;* lots of admin screens for updating listings, team members, etc&lt;br/&gt;&lt;br/&gt;A few lessons learned as a J2EE guy working on his first Rails app:&lt;br/&gt;* Rails makes the backend stuff so easy that the pain in the butt becomes all about the HTML and CSS - by far the most painful part on such a pixel-perfect design like this. Normally on a J2EE app you don't notice because everything is that painful!&lt;br/&gt;* Postgres rocks&lt;br/&gt;* Rails caching is very cool. The site warms up nicely&lt;br/&gt;* database migrations are good but you can't sustain writing them using model objects if your model is changing (which it will). So you're basically writing SQL for migrations, but that's ok&lt;br/&gt;* some of the Rails association stuff is a bit weird, but the worst thing is some of the 'silent failures' you get when saving related records. Never a good idea.&lt;br/&gt;* some of the Rails plugins are a bit naive. For example, acts_as_list, which lets a model include positional ordering, doesn't let you put a UNIQUE constraint in the database for the position column as the update code is not transactional. Hope to find some time to fix that one.&lt;br/&gt;* Rails routes rock&lt;br/&gt;&lt;br/&gt;So what's the conclusion about Rails? Is it perfect? Hell, no! Is it productive? Hell, yes! Does it beat the J2EE stack for database-backed web apps? By a country mile. I will not choose J2EE over Rails to build such an application, that's for sure. To be honest, it feels a little like the Mac/Windows discussions I find myself having reasonably regularly. To say something is way better than something else does not mean the thing is perfect. It just means it's better. Rails is like that - it's not perfect, it's just way better. I sincerely hope that Rails does not go mainstream or we'll all have to go find something else to be our competitive advantage. May the industry behemoths ignore Rails for many years to come!&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/5943246977515325910-1153763693116618809?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/1153763693116618809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2006/04/joining-rails-fashion-set.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/1153763693116618809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/1153763693116618809'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2006/04/joining-rails-fashion-set.html' title='Joining the Rails fashion set'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-339707586780540315</id><published>2006-04-16T10:59:00.000-07:00</published><updated>2009-09-20T03:45:09.809-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>The 'Things That S**t Me' List</title><content type='html'>As a card-carrying member for several years of the cult of &lt;a href="http://www.davidco.com/"&gt;'Getting Things Done'&lt;/a&gt;, a way of running one's life that has proven hugely beneficial, I find that every year or so I tweak and extend the system in an effort to make it work better. For example, I've tried several different computerised systems to implement the GTD methodology, from &lt;a href="http://www.thebrain.com"&gt;Personal Brain&lt;/a&gt; to &lt;a href="http://shared.snapgrid.com/gtd_tiddlywiki.html"&gt;GTD Tiddlywiiki&lt;/a&gt; to &lt;a href="http://www.mindjet.com"&gt;Mind Manager&lt;/a&gt;. My latest incarnation is some hand-written shell scripts using a command line (bash shell) that runs on both Mac and PC and is super-fast to use. I'll blog about this in more detail some time soon.&lt;br/&gt;&lt;br/&gt;But now I have stumbled across an enhancement to the methodology itself. If you're not familiar with it, it's basically a personal workflow system wit major steps: collect, process, organise, review, do. At first it's hard to get your head around how much work you have to do before you do any work! There are also several defined lists that you maintain, such as agendas for each person you interact with regularly, a list of things you're waiting for others to do, a 'someday maybe' list, next actions lists organised by context (such as home, work, online, travelling, out and about) etc, etc. The idea is that you capture everythhing (and I do mean everything), review it regularly and enable yourself to notch forward on many fronts in small increments in a context-optimised way just like a multitasking operating system.&lt;br/&gt;&lt;br/&gt;So I offer to the GTD community my personal recommendation to maintain a 'things that shit me' list. Keep it up to date, capture new things into it often, review it every week, and use it as inspiration to make improvements. If you think I'm being flippant, think again. When you're angry, frustrated, stressed,or otherwise unhappy and the solution isn't immediately apparent, it's an effective short circuit just to name it, look at it next to all the other things that drive you nuts, and choose when you have the energy and time to pick some of them to turn into projects in your GTD system for improving your life. There is a very good feeling when you delete something from this list, let me tell you, and that's the real key. It's a smell if all you ever do is add to it, so make sure you pat yourself on the back each week by knocking something off your 'things that shit me' list. You'll be a nicer person to be around and that is probably the biggest benefit of all.&lt;br/&gt;&lt;br/&gt;I assume you're interested in an example, so here's an excerpt from my current 'things that shit me' list:&lt;br/&gt;&lt;br/&gt;The leaves in the skylight in the kitchen&lt;br/&gt;I don't have enough storage space in the office at home&lt;br/&gt;my house keys don't open the side door&lt;br/&gt;the way my phone only starts telling you the battery is low when it has a minute of life left&lt;br/&gt;I can't use my little dictaphone in bright sunlight 'cos I can't read the screen&lt;br/&gt;the tree that overhangs the carport&lt;br/&gt;I haven't figured out how to do my fortnightly trips with just a backpack&lt;br/&gt;you can't get clip-on sunnies for my glasses&lt;br/&gt;I'm not set up to scan things conveniently at home or at work&lt;br/&gt;the handrail in the bathroom keeps falling off&lt;br/&gt;the laundry door leaked in the last big storm we had&lt;br/&gt;I never have time to play the drums&lt;br/&gt;theres piles of mysterious crap in my book case&lt;br/&gt;i am notsure if priorities in my gtd system should be related to projects or actions&lt;br/&gt;i get so much comment spam on my blog&lt;br/&gt;moving around the screen on the mac when the zoom is on is too slow&lt;br/&gt;i cant print on my home printer when i'm connected to the vpn&lt;br/&gt;the plumbago outt the front is out of control&lt;br/&gt;wikiwords seems to have been turned off in the wiki&lt;br/&gt;ruby barking drives us mad&lt;br/&gt;the hard drive on the mac is just about full&lt;br/&gt;i do not have a functional tickler file at least electronically&lt;br/&gt;i have no way to track how much support work we're doing versus project work&lt;br/&gt;we don't use a single issue tracking system&lt;br/&gt;i can't print from the mac on my home network&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/5943246977515325910-339707586780540315?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/339707586780540315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2006/04/that-st-me-list.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/339707586780540315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/339707586780540315'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2006/04/that-st-me-list.html' title='The &amp;#39;Things That S**t Me&amp;#39; List'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-8323105982010485187</id><published>2006-03-23T13:18:00.000-08:00</published><updated>2009-09-20T03:45:09.809-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>A Revised National Anthem for Australia</title><content type='html'>To celebrate the 10th anniversary of the most pathetic government in Australia's history (I mean, really, how you can keep a straight face sending troops to Iraq while funding the Iraqi regime via the AWB and locking up those who flee the chaos and seek asylum with no legal recourse is quite beyond me), I hereby present a revised national anthem in Little Johnny's honour. Just in time for the happily frequent renditions at the Commonwealth Games:&lt;br/&gt;&lt;br/&gt;&lt;h3&gt;"Advance Whose Skin Is Fair"&lt;/h3&gt;&lt;br/&gt;by James Ross&lt;br/&gt;&lt;br/&gt;Australians all let us rejoice&lt;br/&gt;For we are rich and white&lt;br/&gt;With golden soil and lust for oil&lt;br/&gt;We reckon she'll be right&lt;br/&gt;Our land abounds in nature's gifts&lt;br/&gt;We've never learned to share&lt;br/&gt;In history's page let every stage&lt;br/&gt;Advance whose skin is fair&lt;br/&gt;&lt;br/&gt;Beneath our radiant southern cross&lt;br/&gt;We'll toil with hearts and hands&lt;br/&gt;To make sure noone different&lt;br/&gt;Sets foot upon our lands&lt;br/&gt;For those who come across the sea&lt;br/&gt;We've prison cells to spare&lt;br/&gt;With courage let us all combine to&lt;br/&gt;advance whose skin is fair&lt;br/&gt;In joyful strains then let us sing&lt;br/&gt;advance whose skin is fair&lt;br/&gt;&lt;br/&gt;Copyright &amp;copy; 2006 James Ross. All Rights Reserved. Of course. This machine kills fascists.&lt;br/&gt;&lt;br/&gt;We now return you to your regularly scheduled program of agile software development....&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/5943246977515325910-8323105982010485187?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/8323105982010485187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2006/03/revised-national-anthem-for-australia.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/8323105982010485187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/8323105982010485187'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2006/03/revised-national-anthem-for-australia.html' title='A Revised National Anthem for Australia'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-291898750639744211</id><published>2005-12-24T02:24:00.000-08:00</published><updated>2009-09-20T03:45:09.809-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Signal to Noise Ratio in Rails</title><content type='html'>Like all the other Mac-toting fashion hounds, I've been playing with Ruby on Rails of late. I have the good fortune of having a buddy who has a paying gig building a Rails site and he is kind enough to give me commit rights so I can use it in a meaningful way without giving up my day job as a J2EE guy, and without having to find an excuse to use it at work.&lt;br/&gt;&lt;br/&gt;Without getting all hysterical about it, there are many things in Rails that should give pause to the J2EE crowd. When I switched from C++ to Java, the thing I liked most about coding in Java was the much improved signal-to-noise ratio compared with C++. I found I spent much less time thinking about computer stuff and much more time thinking about the problem at hand and the concepts of the problem space, largely ignoring the problems of the implementation  space. This was partly the language, partly the libraries, and partly the community around Java at the time, but when you add it all up, the result was better software faster, which is really all I want.&lt;br/&gt;&lt;br/&gt;Now, having used the classic J2EE stack for a while (Struts/Tiles/Hibernate, et al), and having watched J2EE vendors bloat their products to the point of collapse, using Rails has given me the same feeling. No struts-config.xml, no tiles-defs.xml, no *.hbm.xml files, and much less time thinking about the machine and its implementation layers. The signal-to-noise ratio is simply better than in the form of J2EE I've learned. Ruby/Rails also appear to have the libraries and the community to make the whole stack work. The whole setup feels more supple and malleable than Java, and, since that feeling was what attracted me to Java, that has to be a concern for those who think Java is some kind of universal maximum, rather than just a local one, as all technologies are.&lt;br/&gt;&lt;br/&gt;There are some things in Rails about which I retain mixed feelings.  ActiveRecord seems to me to be less of an O/R mapping layer, and more of an O/R unification layer. This caused me severe brain ache for a while, but I'm suspending disbelief for the moment. The unit testing model involves database access (and lots of it), which is a definition of unit testing I've always disliked strongly. The functional testing model (so far as I have looked) doesn't use a model based on parsing and filling out and submitting the HTML forms served by the running application. It appears to be more a controller-testing setup than what I would call a functional testing setup. But I'm only a newbie and might have missed some stuff.&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/5943246977515325910-291898750639744211?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/291898750639744211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/12/signal-to-noise-ratio-in-rails.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/291898750639744211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/291898750639744211'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/12/signal-to-noise-ratio-in-rails.html' title='Signal to Noise Ratio in Rails'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-1828887507421735356</id><published>2005-11-22T02:31:00.000-08:00</published><updated>2009-09-20T03:45:09.809-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General Geek Stuff'/><title type='text'>Brain Fade?</title><content type='html'>How can the most important application I have be so neglected by its creators? I've been waiting a year and a half for a new version of &lt;a href="http://www.thebrain.com"&gt;Personal Brain&lt;/a&gt; and&lt;a href="http://www.thebrain.com/products/personalbrain/support/whatsnew.html"&gt; this is what I get&lt;/a&gt; - half a dozen fixes to bugs I hadn't noticed and not a single new feature. One of the highlights is that they've updated their phone number because they moved offices! I don't know if this company is starved for resources, but if ever there was a company that deserves some, this is it. I hope I don't jinx them and they get snapped up by Microsoft and ruined, but this slow death is possibly worse!&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/5943246977515325910-1828887507421735356?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/1828887507421735356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/11/brain-fade.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/1828887507421735356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/1828887507421735356'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/11/brain-fade.html' title='Brain Fade?'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-8070220779195149008</id><published>2005-10-28T15:40:00.000-07:00</published><updated>2009-09-20T03:45:09.809-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General Geek Stuff'/><title type='text'>Now we're cooking</title><content type='html'>I've only recently started using a laptop all day every day, so I thought it was time to put to use a trick shown to me by some buddies for making the all-day laptop experience a lot more ergonomic. So a quick trip to the homewares store for a cook book stand, and bingo! You've got the screen at eye level. Check out the picture for an idea of how it works. You need to invest in an external keyboard and mouse, of course, but it's the poor man's docking station. Start a fashion trend in your cube farm today!&lt;br/&gt;&lt;br/&gt;&lt;img alt="cooking.jpg" src="http://www.redhillconsulting.com.au/blogs/james/archives/cooking.jpg" /&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/5943246977515325910-8070220779195149008?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/8070220779195149008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/10/now-we-cooking.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/8070220779195149008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/8070220779195149008'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/10/now-we-cooking.html' title='Now we&amp;#39;re cooking'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-2790459084314865340</id><published>2005-10-27T11:05:00.000-07:00</published><updated>2009-09-20T03:45:09.810-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Flat Out in First</title><content type='html'>Imagine you're driving from one side of the city to the other with a friend and you're in a big hurry. You're running really late and you're desperate to get where you're going. To your amazement, your friend sets off down the road and puts the pedal to the metal in first gear. He's gripping the wheel, concentrating fiercely, the engine is screaming, and you're being overtaken by every car on the road, doing about 30kph.&lt;br/&gt;&lt;br/&gt;You say to your friend, "Hey, don't you want to go into second gear?"&lt;br/&gt;&lt;br/&gt;But your friend says, "Don't interrupt me, man, I'm going as fast as I can and I really need to concentrate here"&lt;br/&gt;&lt;br/&gt;You try again. "But we'll get there faster if you change gears!"&lt;br/&gt;&lt;br/&gt;But your friend says, "No we won't! I tried that before and putting in the clutch __definitely__ slows you down, silly! And the last thing I can do now is slow down when we're running so late!"&lt;br/&gt;&lt;br/&gt;The problem with development teams is that you can't actually hear the engine screaming and see the car shaking and feel the lack of speed. But it seems to me a lot of development teams are flat out in first gear. Agile development has a lot of practices that are all about changing gears.&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/5943246977515325910-2790459084314865340?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/2790459084314865340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/10/flat-out-in-first.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/2790459084314865340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/2790459084314865340'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/10/flat-out-in-first.html' title='Flat Out in First'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-1749896723361942005</id><published>2005-10-22T08:14:00.000-07:00</published><updated>2009-09-20T03:45:09.810-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>An Agile Requirements Parable</title><content type='html'>In my current role I'm trying to introduce agile development into a team of about 30 people. One of the challenges is the approach to requirements. The incumbent process is pretty standard waterfall with requirements documents that are both too big to read and too short to be used as the only input for development, as well as being written from an implementation perspective rather than a user perspective. As well as being written up front in their entirety before coding begins. So no news here.&lt;br/&gt;&lt;br/&gt;But the biggest issue is (as usual) not a technical one but a human one, in this case the implicit belief that requirements can be 'captured' if you just think hard enough (and long enough) as opposed to the agile view that requirements need to be trawled for constantly, starting at a high level and increasing the resolution as implementation approaches, leaving the resolution lower for far-off things.&lt;br/&gt;&lt;br/&gt;I unwittingly stumbled on a requirements parable the other day when, of all things, I attempted to buy a new pen. I succeeded in purchasing a pen, but I failed to get one that met all my requirements. I'm serious; I couldn't even buy a pen for myself that satisfied all my requirements. Read on if you are still on your chair.&lt;br/&gt;&lt;br/&gt;So, why did I need this pen? I carry around a pocket notebook and a pen wherever I go, having learned from experience that freeing my brain from minutiae leaves it free to dream and create.  I've tried other tools, PDA's, dictaphones, etc, but the good old pen and notebook just works. The definition of 'works' here is that the time and effort between being confronted with something that I need to remember but that I don't want to deal with emmediately must be minimised. I even have a kind of code for the notes I take to speed it up, and recently spent half an hour in a stationery shop buying just the right notebook (with high end features like one of those built in straps to mark your page). So I'm pretty serious about this pen. It has to be able to be connected to the notebook firmly so they can't be separated accidentally, and it has to have a broad enough point that my dim eyes can see what I've written.&lt;br/&gt;&lt;br/&gt;So how did I go wrong? Well, the pen I've used for a long time started to become unreliable, so I had to replace it. It literally did not occur to me that the fact it was one of those ones that you press the top to extend the ballpoint was important. I was thinking maybe I'd try a felt tip pen rather than a ballpoint as the nibs come in wider formats.  So I looked at the mountains of pens in the store and picked a broad-nib felt tip number with a clip that attached snugly to my notebook. So how long did it take to realise my error? The first thought I had that I wanted to write down, I pulled the unit out of my pocket, separated the pen and instinctively went to push the button to extend the ballpoint with one hand while flipping to the current page with the other. Only there was no button. There was a cap! That requires two hands (or one hand far more dextrous than mine) to pull off and put somewhere else, probably on the butt of the body of the pen. I was stupefied. I was now thinking about the damned pen and not the brilliant idea I'd just had.. If there is something you just want to stay out of your way, it's the thing between you and your great ideas.&lt;br/&gt;&lt;br/&gt;So what's the moral of the story? I guess it's something like this: Assuming you are capable of defining requirements up front without exposing users to the solution is bogus. Even if the system is well established. Even if it's as simple as a pen. Even if you're so clever that you can read the customer's mind. :P&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/5943246977515325910-1749896723361942005?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/1749896723361942005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/10/agile-requirements-parable.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/1749896723361942005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/1749896723361942005'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/10/agile-requirements-parable.html' title='An Agile Requirements Parable'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-4637888951672064744</id><published>2005-09-03T15:02:00.000-07:00</published><updated>2009-09-20T03:45:09.810-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>Back in the iLife</title><content type='html'>When I started my new job a few weeks ago, I had to wait a while before my new laptop arrived from Dell. So I turned up on the first day with my Powerbook and plugged in. I was very pleased to find that Apple Mail knows all about Exchange servers out of the box, so I was up and running with no problems and went on happily for a couple of weeks. When the Dell arrived, I spent a couple of days with both machines on the desk while getting it all set up. It was only after switching the Mac back to home use mode and starting to use the Dell for work that I was struck by an obvious solution to a problem I'd been facing for a long time. One of the reasons I switched jobs was in pursuit of a better work/life balance. To me this means drawing a sharper line between the two something I've struggled with in recent years. And here I was looking at the solution: use one computer for work and another for life. Sounds simple, but I missed it until now. So now the Dell stays off over the weekend (it stays on long enough to check the week's work in to CVS at home), and doesn't get looked at until Monday morning. The Mac, with photos, videos, electronic books, music software and fun geek stuff like Ruby and Objective C stays on all weekend and is nothing but fun. Nice.&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/5943246977515325910-4637888951672064744?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/4637888951672064744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/09/back-in-ilife.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/4637888951672064744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/4637888951672064744'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/09/back-in-ilife.html' title='Back in the iLife'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-300230845647511522</id><published>2005-08-18T09:18:00.000-07:00</published><updated>2009-09-20T03:45:09.810-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>It's Mac time now...for my old man</title><content type='html'>It's been a while since I blogged at all, having been a little busy switching jobs, having recently also switched computers (to a Mac Powerbook) and having tried to switch programming languages (learning some Objective C, which is lots of fun). But I'm convinced enough by my Mac experience to have convinced my dear old dad to jump as well (to a Mac Mini) on the demise of his old PC. So does that make me an official cult member? I've also started thinking that one of those flat panel iMacs will look pretty good next to the espresso machine for my wife and daughters to use......:P&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/5943246977515325910-300230845647511522?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/300230845647511522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/08/it-mac-time-nowfor-my-old-man.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/300230845647511522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/300230845647511522'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/08/it-mac-time-nowfor-my-old-man.html' title='It&amp;#39;s Mac time now...for my old man'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-1139088536343603131</id><published>2005-06-14T15:41:00.000-07:00</published><updated>2009-09-20T03:45:09.810-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macintosh'/><title type='text'>It (sort of) just works!</title><content type='html'>A lot of my geek buddies have been switching to the Mac over the last 18 months or so, and with the new FBT year rolling around, I thought I'd get a half-price PowerBook 15-inch with all the bells and whistles to join in the fun. For those of you not in Australia (shame on you), there is a tax law here that allows anyone to buy a laptop each year with pre-tax dollars. This is a great deal (since our top tax rate is almost 50 percent) and is very popular as you might imagine.&lt;br/&gt;&lt;br/&gt;Anyway, I'm showing my age by saying it's 19 years since I last had a Mac, so I knew things would have changed quite a bit in the meantime. I've been reading 'Mac OS X The Missing Manual' while waiting for my machine to arrive so I already had some of the keyboard shortcuts down before I had the box open. Which brings me to the first of my observations about the oft-repeated cries of "It just works" by the MacCult members...don't get me wrong, this little baby is a beautiful thing, but in the interests of full disclosure, I thought I'd jot down my notes on the switching experience...&lt;br/&gt;&lt;br/&gt;Getting the machine delivered was something Apple found quite challenging. I ordered the PowerBook, MS Office, iWork, .mac and Logic Express, and they got off to a bad start by shipping the software individually so that a couple of times  when the courier's arrival at my house found nobody at home, they went away until we called them and could commit to waiting at home for a full day before they'd deliver. Not so bad for a single delivery, but when the order is part-shipped in four separate trips, this gets a bit old. Of course the software was no use without the machine, which didn't turn up at all. Problem was, the online order status page showed it as having been shipped many days ago. Several calls to the courier and Apple finally led to the discovery that the courier had returned it to Apple because the exterior box was slightly damaged in transit. Still no drama, except that Apple seemed to not have a process to keep it moving. I had to call them multiple times to get multiple people to find the box and ship it to me after testing that the machine was OK. Very annoying.&lt;br/&gt;&lt;br/&gt;The machine arrived last Friday and with sweaty palms I fired it up. The warm, welcoming and soothing setup process came to a shuddering halt at the wireless network setup screen. No matter what I did, I could not get it to connect to my network. Now I know my 128-bit WEP key off by heart, so this should not be hard. Eventually I gave up in disgust and told it I didn't have a network at all. When I got into the OS proper, I found I had extra options, including to change its default WEP key size of 40 bits to the 128 I needed. Up and running immediately, but obviously unimpressed with the unnecessary dumbing down of the setup program.&lt;br/&gt;&lt;br/&gt;A little later on, I cracked open my iWork 05 disc and stuck it in. Lo and behold, the machine refused to install the software because a later version was already installed on the machine. So I go hunting and find a trial version of iWork, which I start and am annoyed to find there is no 'enter the serial number from your boxed copy you just brought home from the store and I'll start working for you' option. So I drag the application to the trash, since that's what book said was all that was needed to uninstall an application. No dice. A call to a Mac buddy and a little Spotlight magic later and I find a couple of files in the /Library/Receipts folder, which has something to do with the auto-update feature for the software. Killing off the files and now I can install my software. This is software I bought with the machine, you realise. And the machine won't let me install it. This is not what I call 'It just works'&lt;br/&gt;&lt;br/&gt;The rest of my installs go pretty much according to plan (after Office downloads the 50Mb of updates needed to actually get it to run properly). The only other disappointment was the Logic Express has not had the latest UI goodness like the rest of the apps that sport the Apple logo. They've done the box up nice, but the app must be one of those 'carbonised' ones they talk about.&lt;br/&gt;&lt;br/&gt;Of course, before I could really start using the apps, I had to sort out the accessibility options. Being a visually impaired person, one of the things that tipped me to considering the Mac was the built in accessibility features, particularly the new VoiceOver software that speaks the UI to you as you use the machine. Annoying as all get out to anyone standing nearby, but pretty darn useful for me. In fact, as I type this, it's reading each word as I go. Overall, the software is good, and I can save the money I'd normally have to spend getting set up with specialist software, so I'm happy about that. It's got a few minor issues like jumping around a little crazily when the screen is magnified and the focus shifts, and not reading full paragraphs of text in Safari if they contain a (gasp!) hyperlink, but not too bad at all.&lt;br/&gt;&lt;br/&gt;Things really started to crank when I got my head around expose, spotlight and some of the apps that come with it. iMovie is awesome in its elegance and simplicity and speed (I talk as someone who purchased Pinnacle video editing software for Windows) and iPhoto blew me away when I imported my six years worth of photos from its home in a nicely structured directory, and iPhoto turned the directory names into keywords that I can search, so 'Antonia's Wedding' instantly finds all the right pics. Awesome.&lt;br/&gt;&lt;br/&gt;I find I'm not as productive when typing and editing text because I don't know all the keyboard shortcuts for selecting a word or a paragraph, but that will come with practice. It is true what they say that it just feels solid, and having a large number of apps open doesn't seem to have the same drag effect as it does in Windows. Now I just have to figure out how to replace all the apps I rely on like The Brain and Microsoft Money. I'm not in a great hurry as I invested in Virtual PC to ease the transition. I haven't actually used it yet, as I'm trying to just feel the vibe for now. And I must say it feels pretty gooood. I look forward to being snobbish and dismissive of my Windows colleagues very soon.&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/5943246977515325910-1139088536343603131?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/1139088536343603131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/06/it-sort-of-just-works.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/1139088536343603131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/1139088536343603131'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/06/it-sort-of-just-works.html' title='It (sort of) just works!'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-8427609901141784001</id><published>2005-05-15T14:41:00.000-07:00</published><updated>2009-09-20T03:45:09.811-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>Too busy to blog</title><content type='html'>Lately I've been too busy to blog, as I've been helping &lt;a href="http://www.redhillconsulting.com.au/blogs/simon/"&gt;Simon&lt;/a&gt; write &lt;a href="http://tinyurl.com/cnwen"&gt;his first book&lt;/a&gt;. As far as we know, it's the first book on algorithms to use design patterns and &lt;a href="http://c2.com/cgi/wiki?TestDrivenDevelopment"&gt;TDD&lt;/a&gt;, but I could be wrong. Be sure to buy your mum one for christmas...:P&lt;br/&gt;&lt;br/&gt;Having finally succumbed to the weight of my geek buddies buying Macs, I've just ordered a new &lt;a href="http://store.apple.com/1-800-MY-APPLE/WebObjects/AppleStore.woa/72102/wo/Qt6fjD2bLSqk2csDmVG19eXPxur/0.0.11.1.0.6.23.1.1.1.1.0.0.1.0"&gt;Powerbook&lt;/a&gt;, so I reckon I'll be posting a bit about the experience. I've had to buy a copy of &lt;a href="http://store.apple.com/1-800-MY-APPLE/WebObjects/AppleStore.woa/72102/wo/Qt6fjD2bLSqk2csDmVG19eXPxur/4.0.11.1.0.6.25.7.11.0.3"&gt;Virtual PC&lt;/a&gt; to ease the switch, but I'd like to retire all my Windows apps if I can.&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/5943246977515325910-8427609901141784001?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/8427609901141784001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/05/too-busy-to-blog.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/8427609901141784001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/8427609901141784001'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/05/too-busy-to-blog.html' title='Too busy to blog'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-8381564939554531415</id><published>2005-03-06T13:23:00.000-08:00</published><updated>2009-09-20T03:45:09.811-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>A couple of views on coupling</title><content type='html'>Having read both &lt;a href="http://domaindrivendesign.org/book/"&gt;Domain Driven Design&lt;/a&gt; and &lt;a href="http://www.manning.com/bauer"&gt;Hibernate in Action&lt;/a&gt; recently, I found an interesting contradiction between them...here's what Eric Evans has to say about promiscuous coupling between your domain classes:&lt;br/&gt;&lt;br/&gt;"It is important to constrain relationships as much as possible. A bidirectional association means that both objects can be understood only together. When application requirements do not call for traversal in both directions, adding a traversal direction reduces interdependence and simplifies the design. Understanding the domain may reveal a natural directional bias."&lt;br/&gt;&lt;br/&gt;...and here's what Gavin King and Christian Bauer have to say on the same subject:&lt;br/&gt;&lt;br/&gt;"Good uses for unidirectional one-to-many associations are uncommon in practice, and we don�t&lt;br/&gt;have one in our auction application. You may remember that we started with the&lt;br/&gt;Item and Bid mapping in chapter 3, making it first unidirectional, but we quickly&lt;br/&gt;introduced the other side of the mapping."&lt;br/&gt;&lt;br/&gt;So I agree with Eric, but I'm using Hibernate. Things that make you go hmmmm....&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/5943246977515325910-8381564939554531415?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/8381564939554531415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/03/couple-of-views-on-coupling.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/8381564939554531415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/8381564939554531415'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/03/couple-of-views-on-coupling.html' title='A couple of views on coupling'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-637279872577016098</id><published>2005-01-08T04:06:00.000-08:00</published><updated>2009-09-20T03:45:09.811-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General Geek Stuff'/><title type='text'>A new brain for Christmas</title><content type='html'>Software isn't the kind of thing your mother buys you for Christmas, at least not in my family (I'm a first-generation geek). So to help with my new year's resolution of being more organised (those who know me might say anal retentive), I picked myself up a christmas present of a copy of &lt;a href="http://www.thebrain.com/"&gt;Personal Brain&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;A colleague showed me the brain a year or so ago, and I used it sporadically, finding it particularly useful when triaging ideas arriving rapidly and randomly, like in requirements gathering workshops. It works really well in this kind of environment, where a little bit of thought association goes a long way. But when I noticed that a new version had come out, I thought I'd get it and this time (gasp!) I actually read the manual. What a difference that makes, I must say. Now I know the hot keys to make navigation and construction easier, and I know how to make 'thoughts' refer to files, folders and web sites, I'll be darned if it isn't a fantastic way to organise your stuff. Within a day or so of mostly input, I started to get some benefit back in rapid access to whatever I was thinking about, and was surprised at how limiting and pervasive the whole hierarchical file structure we're trained in is and how much it affects my productivity.&lt;br/&gt;&lt;br/&gt;The brain has a very simple model of parent, child and 'jump' connections between thoughts. You can have any number of each type of link (actually there is an arbitrary limit which is kind of weird, but it's enough for my purposes) and restructuring them is simple. That's really all there is to it, and like most great ideas, that's all there needs to be.&lt;br/&gt;&lt;br/&gt;Here's a screenshot of my brain when I'm thinking about &lt;a href="http://sourceforge.net/projects/joodi"&gt;joodi&lt;/a&gt;. You'll see 'parent' thoughts above the central thought, 'child' thoughts below, 'jump' thoughts to the left and siblings to the right. The funky way the window reorganises itself when you move between thoughts is worth seeing, so go get it and have a play if you're interested.&lt;br/&gt;&lt;a href="http://www.redhillconsulting.com.au/blogs/james/archives/images/screenshot of the brain plex window.html" onclick="window.open('http://www.redhillconsulting.com.au/blogs/james/archives/images/screenshot of the brain plex window.html','popup','width=673,height=482,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"&gt;&lt;img src="http://www.redhillconsulting.com.au/blogs/james/archives/images/screenshot of the brain plex window-thumb.jpg" width="200" height="143" border="0" /&gt;&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/5943246977515325910-637279872577016098?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/637279872577016098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/01/new-brain-for-christmas.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/637279872577016098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/637279872577016098'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2005/01/new-brain-for-christmas.html' title='A new brain for Christmas'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-8110691687734673081</id><published>2004-12-22T03:13:00.000-08:00</published><updated>2009-09-20T03:45:09.811-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>Taste-Driven Development</title><content type='html'>&lt;P&gt;&lt;br/&gt;Having used Test-Driven Development for several years now, I am as convinced as I have ever been of its benefits in producing high quality maintainable code. One thing that bothers me, though, is that TDD itself provides no forces to ensure that the small pieces you build are assembled together into the higher-order structures you intended. For example, you can write a clean, concise fully tested set of classes such that your domain model is directly accessing your custom tags for your web app. Of course nobody interested enough in software to read this would ever do such a thing, but the point remains: with the promiscuous coupling encouraged by IDE's that will helpfully import any class from anywhere without requiring you to think whether this violates good taste in the form of layering, abstraction or anything else, we seem to be constantly having to fight against randomly coupled internal workings in good-sized systems.&lt;br/&gt;&lt;P&gt;&lt;br/&gt;So I find I'm constantly looking for ways to do what we do at the class level with TDD and do it at the package/component level; that is, allow the good taste desired in the design to be formally expressed and tested with every build. Developers who aren't up to speed yet on the complexities of the system they're working on would be protected from violating its conventions, and the emergent design can be allowed to flourish in a controlled way. On our current project we use a few things to help, such as &lt;a href="http://www.redhillconsulting.com.au/products/simian"&gt;simian&lt;/a&gt;, &lt;a href="http://www.clarkware.com/software/JDepend.html"&gt;jdepend&lt;/a&gt;, &lt;a href="http://www.yworks.com/en/products_ydoc.htm"&gt;ydoc&lt;/a&gt;, lots of &lt;a href="http://checkstyle.sourceforge.net/"&gt;checkstyle &lt;/a&gt;checks aimed at code quality and the usual test coverage stuff. But a few of us think that what the world really needs is yet another open source java development tool. Oh, no, you say, not another one. Yes, I'm afraid, it's another one. But this one is different - this one uses a business rule engine (&lt;a href="http://drools.codehaus.org/"&gt;drools&lt;/a&gt;) to allow you to declare in a text file your idea of good taste and enforce it for your code base. This one even has a user guide. No, seriously. So if design is your bag, have a look at &lt;a href="http://sf.net/projects/joodi"&gt;joodi&lt;/a&gt; and let me know what you think. It only has a few rules in it at the moment, so it's not overly complicated.&lt;br/&gt;&lt;P&gt;&lt;br/&gt;Oh, by the way, if you think the java runtime itself would show good taste, check out what joodi has to say about rt.jar in the sample reports section of the user guide...you might be surprised!&lt;br/&gt;&lt;P&gt;&lt;br/&gt;Here's an example rule from the joodi rule file. This one expresses the simple good taste that cyclic package dependence is bad. It's kind of cryptic at first glance, but it basically says that if there exists a namespace (i.e. a java package) that depends on itself (dependence being part of the joodi fact model when your code is analysed), then create a notification including the cause of the problem so that the report provides full traceability for each notification produced. Using joodi is pretty much down to writing rules like this that express what good taste means to you and your project. Welcome to Taste-Driven Development!&lt;br/&gt;&lt;P&gt;&lt;br/&gt;&lt;PRE&gt;&lt;br/&gt;&amp;lt;rule name=&amp;quot;Cyclic Namespace Dependence Is Bad&amp;quot;&amp;gt;&lt;br/&gt;&amp;lt;parameter identifier=&amp;quot;namespace&amp;quot;&amp;gt;&lt;br/&gt;&amp;lt;java:class&amp;gt;Namespace&amp;lt;/java:class&amp;gt;&lt;br/&gt;&amp;lt;/parameter&amp;gt;&lt;br/&gt;&amp;lt;java:condition&amp;gt;&lt;br/&gt;namespace.dependsOnNamespace(namespace) != null&lt;br/&gt;&amp;lt;/java:condition&amp;gt;&lt;br/&gt;&amp;lt;java:consequence&amp;gt;&lt;br/&gt;drools.assertObject(new CyclicNamespaceUseNotification(namespace.dependsOnNamespace(namespace)));&lt;br/&gt;&amp;lt;/java:consequence&amp;gt;&lt;br/&gt;&amp;lt;/rule&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;/PRE&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/5943246977515325910-8110691687734673081?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/8110691687734673081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/12/taste-driven-development.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/8110691687734673081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/8110691687734673081'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/12/taste-driven-development.html' title='Taste-Driven Development'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-7453357333667990323</id><published>2004-12-10T04:35:00.000-08:00</published><updated>2009-09-20T03:45:09.811-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Agile Requirements</title><content type='html'>I've been doing the odd dog-and-pony show presenting on the topic of agile development recently, which is always a good way to clarify your thoughts and force a few ideas to gel. What's been on my mind is the requirements gathering side of an agile project. Having just delivered a good sized agile project successfully, I'm convinced that the quality of our requirements gathering and the rigour and discipline of our scope management was one of the absolute keys.&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/5943246977515325910-7453357333667990323?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/7453357333667990323/comments/default' title='Post Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/7453357333667990323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/7453357333667990323'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-9169953538878765066</id><published>2004-11-21T10:33:00.000-08:00</published><updated>2009-09-20T03:45:09.811-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General Geek Stuff'/><title type='text'>Re-routing CVS repositories</title><content type='html'>I'm putting this here to save myself the hassle of figuring out how to do it on the rare occasions I need to re-route a CVS sandbox to a different repository without releasing and checking out from the new repository. So if anyone else is wondering how to do it (you'll need &lt;a href="http://www.cygwin.com"&gt;cygwin&lt;/a&gt; on Windows), run this command from the top of your checkout tree: &lt;pre&gt;find -name Root -exec sed -i.bak -e 's:/old/path:/new/path:' {} \;&lt;/pre&gt;. You will also need to be careful if you use a Windows CVS server like CVSNT, since using the ':' as the sed separator will require you to escape the colon in your repository path if you have one. By the way, this will make a backup of each Root file called Root.bak, just in case you don't trust it (and why should you...:P)&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/5943246977515325910-9169953538878765066?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/9169953538878765066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/11/re-routing-cvs-repositories.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/9169953538878765066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/9169953538878765066'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/11/re-routing-cvs-repositories.html' title='Re-routing CVS repositories'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-4898585571663685422</id><published>2004-11-18T17:00:00.000-08:00</published><updated>2009-09-20T03:45:09.812-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>Star Wars on the (really) small screen</title><content type='html'>I found another reason to dig my Pocket PC. My usual top reasons are &lt;a href="http://www.audible.com"&gt;talking books from audible.com&lt;/a&gt; and reading electronic books (in really big fonts!) with the &lt;a href="http://www.adobe.com/products/acrobat/readerforppc.html"&gt;Acrobat Reader for Pocket PC&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;But having picked up a 1Gb SD card for next to nothing, I thought I'd investigate the supposedly forthcoming phenomenon of pocket movies. Microsoft has been making some noise about their &lt;a href="http://www.microsoft.com/windowsmobile/portablemediacenter/default.mspx"&gt;new portable devices that play movies&lt;/a&gt;, but you don't need one of those. You just need a copy of &lt;a href="http://tinyurl.com/3zrk2"&gt;this software&lt;/a&gt; and you're done. In about the time it takes to watch the film, it's converted to a 250Mb AVI at 320x240 resolution. That's 15 frames per second at a resolution that's higher than your TV, so it's pretty darn watchable. There is a slight weirdness to the screen when rotated to watch in landscape mode, probably because the RGB subpixels on the LCD or up/down aligned in this mode, but you get used to it.&lt;br/&gt;&lt;br/&gt;So having recently picked up the Star Wars box set to relive my childhood like all the other 30-something males on the planet, but not having time to scratch myself like all the other 30-something males on the planet, I can now squeeze this necessary pastime into my morning commute and leave all the iPod weenies wondering why exactly they think they're so cool. Rock on.&lt;br/&gt;&lt;br/&gt;&lt;img alt="star_wars.JPG" src="http://www.redhillconsulting.com.au/blogs/james/archives/images/star_wars.jpg/star_wars.JPG" width="640" height="480" /&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/5943246977515325910-4898585571663685422?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/4898585571663685422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/11/star-wars-on-really-small-screen.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/4898585571663685422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/4898585571663685422'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/11/star-wars-on-really-small-screen.html' title='Star Wars on the (really) small screen'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-8240121202913589813</id><published>2004-11-18T10:39:00.000-08:00</published><updated>2009-09-20T03:45:09.812-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>Why I Hate Domain-Driven Design</title><content type='html'>I was feeling pretty good about myself I have to admit. Having just delivered a system that took a year of a dozen developer's lives to complete with the full XP experience working like a treat, on time, on budget, happy customer, etc, etc, I thought I'd finally get my life back and start catching up on all the reading I don't do when it's head down, bum up on a project. High on my list was Domain-Driven Design by Eric Evans, as it had been highly recommended by people I respect a lot. So now I'm depressed. It is such a fine book, no, it's a truly mind-expanding, insightful, gee-now-I-feel-stupid kind of book that I now just want to go back and do the whole damn project again. And this time I'd do it properly. Dammit.&lt;br/&gt;&lt;br/&gt;If you'd like to share the joy, as usual my recommendation is to get it on the cheap at &lt;a href="http://tinyurl.com/6ze2u"&gt;Safari&lt;/a&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/5943246977515325910-8240121202913589813?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/8240121202913589813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/11/why-i-hate-domain-driven-design.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/8240121202913589813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/8240121202913589813'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/11/why-i-hate-domain-driven-design.html' title='Why I Hate Domain-Driven Design'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-8110220288908024850</id><published>2004-10-07T12:07:00.000-07:00</published><updated>2009-09-20T03:45:09.812-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>Power Pointers</title><content type='html'>&lt;p&gt;I often get asked how I go about doing a technical presentation, so I thought I'd put down a few pointers for those who would like to do some presenting but think it's all a bit intimidating.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Have something you want to say. This is generally not a problem for&amp;nbsp;most serious geeks, although it's surprisingly common&amp;nbsp;to find many&amp;nbsp;who have incredible experience and insight&amp;nbsp;but think nobody is interested in what they might say. That is almost never the case, either, since all of us are sponges for good stuff of all kinds.&lt;/li&gt; &lt;li&gt;Care about your audience. It's important to really want to connect with the audience and make them feel important. Even in a stand and deliver situation, I often survey the audience to get a feel for their likes, dislikes and interests. This can help you focus on what they need and want over what you thought they &lt;b&gt;might&lt;/b&gt; like.&lt;/li&gt; &lt;li&gt;Don't start in PowerPoint. I never, ever begin my presentations by opening PowerPoint and looking at a blank slide. I always open a Word document instead and switch to Outline View. Then I just start brainstorming, imagining I'm having a one-on-one conversation with someone, explaining the topic at hand. No structure is present yet. It's all about noting down all the things you might want to say first. Then it's a matter of learning to use the outline view's features of indenting, outdenting, dragging and dropping to apply some structure to the thoughts. This is very much like the test, code, refactor cycle in development of code. The test is that you can explain the idea. The code is recording the points you need to do that. The refactoring is cleaning up the structure. And just like coding, it works really well if you treat these as distinct tasks and switch between them cleanly.&lt;/li&gt; &lt;li&gt;Generate the slideshow from the outline. Once you're done in Word, just hit File-&amp;gt;Sent to-&amp;gt;PowerPoint and voila! All your top level headings become slides, and the subpoints become bullet points underneath them. You can then click Format-&amp;gt;Apply Design Template, go looking for a pre-canned&amp;nbsp; slideshow and bingo! your show is just about done without a single tedious minute in PowerPoint itself. If you have time, add some pictures and animation, but remember they're the icing, not the cake.&lt;/li&gt; &lt;li&gt;Less is More. I &lt;b&gt;much&lt;/b&gt; prefer slides with fewer words on them. I do not consider a slide to be of any value without me in front of it to turn it into the presentation experience. Resist the temptation to turn a slideshow into a whitepaper. It's just there to remind you what you wanted to say and help the audience to follow; it's not there to say it for you!&lt;/li&gt; &lt;li&gt;Remember that nobody finds it easy. Public speaking is daunting for everyone, and I do mean everyone. I sweat bullets for days before an important presentation, but once it starts it's almost like it's someone else doing it, not me, and in a way it's easy. If you're serious, look into &lt;a href="http://www.toastmasters.org"&gt;Toastmasters&lt;/a&gt; for some training (I did it 20 years ago and am still grateful) or try your hand at a low-risk venue like a user group or other friendly and supportive environment.&lt;/li&gt; &lt;li&gt;Have fun!&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&amp;nbsp;&lt;/p&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/5943246977515325910-8110220288908024850?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/8110220288908024850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/10/power-pointers.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/8110220288908024850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/8110220288908024850'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/10/power-pointers.html' title='Power Pointers'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-8280394056259978937</id><published>2004-09-15T11:54:00.000-07:00</published><updated>2009-09-20T03:45:09.812-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Smell the Tests!</title><content type='html'>&lt;p&gt;When you are faced with a team that's new to agile development, it's common to spend a lot of time driving home the need to test everything. Along with refactoring, test-driven (or at least test-conscious) development is the most basic skill the aspiring extreme programmer must acquire. We strive to testability in design and the cheapest, most effective quality we can get. So is there such a thing as bad testing? Can tests hinder more than help? Can tests just be a downright pain in the rear?&lt;/p&gt; &lt;p&gt;The answer is a resounding YES! YES! YES!&lt;/p&gt; &lt;p&gt;Just because you code in an object-oriented language does not guarantee that what you write will contain any object-oriented characteristics whatsoever. Similarly, just because you write JUnit test cases does not guarantee that what you produce will display any of the qualities of an effective and adaptable test suite. Naive application of testing frameworks has the same potential for developers to exercise their bad judgement and bad taste as any other technology. Now while I'd certainly rather have a project with lots of less than ideal tests than no tests at all, we need to learn to 'smell the tests' to really get the most out of our (and our customers') investment in testing.&lt;/p&gt; &lt;p&gt;So here are some of the smells that tests can emit. I'm sure you can think of more, so please drop me a line so I can share your pain...:P&lt;/p&gt; &lt;ul&gt; &lt;li&gt;No statement of intent. If I have a Widget with a getPrice() method, I often see a testGetPrice() test method, and my first thought is "test getPrice() does what?". Prefer names for tests that express the intention of the test, such as testGetPriceReturnsZeroWhenNotInitialisedExplicitly(). There are tools that can turn your test names into human readable documentation, so don't be afraid of full-length sentences as test method names.&lt;/li&gt; &lt;li&gt;Irrelevant assertions. It is common (particularly in functional tests) for a test that is concerned with proving a small incremental behaviour to make irrelevant assertions about all sorts of other fields, even on other screens. Prefer semantic generalisations over value-specific assertions. For example, if your test is not concerned with the actual price algorithm, don't assertEquals("46.12", widget.getPrice()) when you can say assertNonZeroMonetaryValue(widget.getPrice()) - even though it's a bit more work at first.&lt;/li&gt; &lt;li&gt;Setup leakage. It is extremely common for developers new to testing to not easily be able to distinguish the concerns of their test from the setup steps required to get them to the point where their test can begin. The newly test-infected developer can thus create maintenance burdens and simply waste time reinventing the testing wheel with every test case. Strive for a clear separation between setup and test, and look for reuse in the setup code via fixtures and scenarios.&lt;/li&gt; &lt;li&gt;Overtesting. Many developers find it difficult to focus only on what is relevant to the test at hand. It is not only more efficient to assume the rest of the system works when writing a new test, but it also improves maintainability as each test is more isolated and targeted. It is common for developers to turn themselves into knots to get controlled input and output moving between different components when a mock would be faster and more effective. Leave it to the other tests to do their job and assume away responsibilities that are not yours right now for the code under test.&lt;/li&gt; &lt;li&gt;Multi-layer tests. Unit tests should rearely (if ever) traverse multiple layers in your design. A sure sign that they do is when they run slowly. Unit tests should run in the thousands per minute kind of rate, while functional tests tend to be in the 30-50 per minute range, so prefer unit tests to achieve coverage and functional tests to prove wiring of configured components.&lt;/li&gt; &lt;li&gt;In-container unit tests. T'ain't no such thang. Don't make sense. If you think you have some, that's a smell. :)&lt;/li&gt; &lt;li&gt;Fractured functional tests. Adding functionality a small bit at a time leads to functional tests with a lot of overlap and there is no force to encourage the consolidation of these tests other than slow build speed. I'm not sure how to fix this one other than slow slog refactoring. We have a lot of this joy ahead on our current project!&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;None of this alters my belief that test-driven development is the best method I know for building quality software. But it does mean that (once again) we need to be careful about silver bullet syndrome when it comes to testing.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&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/5943246977515325910-8280394056259978937?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/8280394056259978937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/09/smell-tests.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/8280394056259978937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/8280394056259978937'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/09/smell-tests.html' title='Smell the Tests!'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-8962619738347210133</id><published>2004-08-08T10:47:00.000-07:00</published><updated>2009-09-20T03:45:44.791-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>Have Hair Dryer, Will Boot</title><content type='html'>Having moved house recently, I was dismayed when one of my PC's (the one that's built for music and video editing) refused to boot. The primary hard disk was not being recognised by the BIOS. Dammit. Now yes, I have all the important data backed up, but it's pretty tough to backup full quality video footage at the best of times, and this box has had years of tweaking put into it, so rebuilding it from scratch was a rather sphincter-puckering concept. Having a couple of weeks paternity leave to sort it out, I started ringing around the pro data rescue market, and the prices were all in the $2,000 range. Hell, I could just buy a whole new box for that.&lt;br/&gt;&lt;br/&gt;So being a software guy, I rang my buddy the hardware guy and told him my story, of how the box had been running happily for 18 months without being turned off, then it was shut down for a couple of weeks during the house move/new baby transition. "Ah-hah", says he, "just get out the hairdryer and heat that drive up for 20 minutes; it'll boot first go". And bugger me if he wasn't right on the money! A quick plug in of a new drive onto which I ghost-ed the dying one, switcheroo and off we go.&lt;br/&gt;&lt;br/&gt;Phew!&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/5943246977515325910-8962619738347210133?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/8962619738347210133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/08/have-hair-dryer-will-boot.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/8962619738347210133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/8962619738347210133'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/08/have-hair-dryer-will-boot.html' title='Have Hair Dryer, Will Boot'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-4720803417813882559</id><published>2004-07-26T00:45:00.000-07:00</published><updated>2009-09-20T03:45:44.791-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>Who gives a toss about software anyway?</title><content type='html'>I mean, really, I'm as guilty as the next geekblogger of making software and its myriad cultural spawn the centre of the universe, but when you hold your new baby girl in your arms it really does seem all a little silly. So here's to the arrival of Ella Rose....and yes, I did buy her a domain name before she was born!&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/5943246977515325910-4720803417813882559?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/4720803417813882559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/07/who-gives-toss-about-software-anyway.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/4720803417813882559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/4720803417813882559'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/07/who-gives-toss-about-software-anyway.html' title='Who gives a toss about software anyway?'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-3531018305113387096</id><published>2004-06-28T15:33:00.000-07:00</published><updated>2009-09-20T03:45:44.792-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Writing'/><title type='text'>IntelliJ as.....Writing Tool!</title><content type='html'>&lt;p&gt;&lt;font face="Arial"&gt;Trying to collaborate on some technical writing with&lt;/font&gt; &lt;a href="http://www.redhillconsulting.com.au/blogs/simon"&gt;&lt;font face="Arial"&gt;Simon Harris&lt;/font&gt;&lt;/a&gt; &lt;font face="Arial"&gt;led us to figure out a way to get the type of collaboration we are used to while coding when we're writing. this means having the content in a textual format so it can be merged, ruling out MS Word and other binary formats. We've been using a wiki a lot for this recently, but reading&lt;/font&gt; &lt;a href="http://www.martinfowler.com/articles/writingInXml.html"&gt;&lt;font face="Arial"&gt;Martin Fowler's post about writing using XML&lt;/font&gt;&lt;/a&gt; &lt;font face="Arial"&gt;made us want to give it a try. Now before you say&lt;/font&gt; &lt;a href="http://www.docbook.org/"&gt;&lt;font face="Arial"&gt;DocBook&lt;/font&gt;&lt;/a&gt;&lt;font face="Arial"&gt;, let me just say that that's just a little tooooo heavyweight for our needs. But the idea is right. So we knocked up a little DTD that incorporates a hierarchy of sections, with figures, code listing, cross references, external references, etc, and then used&lt;/font&gt; &lt;a href="http://www.jetbrains.com/"&gt;&lt;font face="Arial"&gt;IntelliJ IDEA&lt;/font&gt;&lt;/a&gt;&lt;font face="Arial"&gt;'s DTD-driven XML editing to start writing the content. With the code folding and a few live templates, we pretty quickly had a nice intuitive editing experience that allows the separation of the&amp;nbsp;creation of the content from the marking up thereof. With the addition of a little XSLT that automatically numbers the nested sections, voila! IntelliJ as author's workbench! Cool!&lt;/font&gt;&lt;/p&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/5943246977515325910-3531018305113387096?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/3531018305113387096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/06/intellij-aswriting-tool.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/3531018305113387096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/3531018305113387096'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/06/intellij-aswriting-tool.html' title='IntelliJ as.....Writing Tool!'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-7516386223523325039</id><published>2004-06-10T16:04:00.000-07:00</published><updated>2009-09-20T03:45:44.792-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>When Prevention's Not Better Than Cure</title><content type='html'>&lt;p&gt;When doing agile software development, our main challenge is having little enough process to go fast, but enough process to avoid crashing. The desire to go fast is all well and good, but we don't want to have our only feedback mechanism on whether we're going *too* fast to be blunt force trauma.&lt;/p&gt; &lt;p&gt;I have no doubt that application of agile methods such as XP without equal application of both the freedoms and the responsibilities they afford will end in tears. This is often the biggest challenge with developers new to XP. They love the freedom to refactor and design on the fly, but their enthusiasm sometimes wanes when confronted with the discipline of maintaining test coverage under schedule pressure.&lt;/p&gt; &lt;p&gt;So how do we know when we're going too fast? One problem with perceiving the team's speed (as opposed to velocity :P) is that different members of the team will have different comfort levels with the shared rate of progress. Several times recently I've found myself responding to feedback from team members that would like a little more process to avoid some issue or another, be it screen rework or the presence of defects during QA. I try to be careful to get enough feedback to find out if what we have is just turbulence or the swelling sound of a wing shearing off the fuselage. Most times it's the former, and in these cases I find there's a recurring theme to my response: prevention isn't always better than cure.&lt;/p&gt; &lt;p&gt;For example, in our current system we have 500+ story cards. If about 10% of these result in a defect (which looks about right at the moment) and each of these cost a day for a pair to fix (no metrics but I think that's more than the reality), that's 50x2 days of rework. If we were to put in place a process to prevent all these defects, it would probably cost the team at least two hours per story (that's only two people talking for an hour) to do the extra analysis and testing for EVERY story card. That's 1,000 hours extra work, or comfortably more than the 100 days of rework we have to do to cover off the defects. That's also on the unrealistic assumption that you do actually prevent all the defects! It's just a numbers game in which you win if the quality is sufficient that the amount of rework on the defects is less than the amount of effort to prevent all those defects plus the extra effort you put in to the majority of cards that would never have had defects in the first place.&lt;/p&gt; &lt;p&gt;So I find I'm spending a bit of time reassuring the passengers that a little turbulence is normal, and preventing it is not only unnecessary, it's counter-productive. At the same time I try to maintain a healthy paranoia about the process. Of course, the danger lies in not being able to tell turbulence from a tailspin, so if anyone has ideas on how to do this, bring it on!&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&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/5943246977515325910-7516386223523325039?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/7516386223523325039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/06/when-prevention-not-better-than-cure.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/7516386223523325039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/7516386223523325039'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/06/when-prevention-not-better-than-cure.html' title='When Prevention&amp;#39;s Not Better Than Cure'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-6486914086946239836</id><published>2004-05-13T15:47:00.000-07:00</published><updated>2009-09-20T03:45:44.792-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Conversation Is Not Understanding Either!</title><content type='html'>&lt;p&gt;&lt;font face="Arial" size="2"&gt;I have been as guilty as the next geek of rationalising my distaste at the tedium of documentation. Many of my agile friends and colleagues are fond of saying that 'Documentation is Not Understanding' when promoting the 'people over process' bit of the &lt;a class="external" href="http://www.agilemanifesto.org/"&gt;Agile Manifesto&lt;/a&gt;. Now while I do indeed hold this truth to be self-evident, a few recent experiences find me not so dismissive of the value of documentation as once I was.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial" size="2"&gt;Circumstances led me to leave my role in a nice fun agile project for a few months. When I returned, I struggled to get back up to speed for a couple of weeks - these agile folks will just go and change things while you're not looking :) When trying to reconstruct my mental model of the project, I found the pieces I had to put together out of conversations with analysts, customers and developers didn't always fit together snugly, and I found myself needing some sort of point of reference that was indeed shared understanding to work forward from. Anyway, I haven't really worked out what this means, but I have to conclude that while documentation is not understanding, neither is conversation. Another assumption bites the dust!&lt;/font&gt;&lt;/p&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/5943246977515325910-6486914086946239836?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/6486914086946239836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/05/conversation-is-not-understanding.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/6486914086946239836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/6486914086946239836'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/05/conversation-is-not-understanding.html' title='Conversation Is Not Understanding Either!'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-571485671426897278</id><published>2004-04-12T14:42:00.000-07:00</published><updated>2009-09-20T03:45:44.792-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>The Need for Speed</title><content type='html'>&lt;p&gt;&lt;font face="Arial"&gt;At the Melbourne eXtreme Programming Enthusiasts Group the other night we had a big rantorama about TDD. One of the points in my presentation was that Kent had said that unit tests had to be fast, and he cited one project in which there were 4,000 tests that ran in about 20 minutes. A few guys from my team were there and guffawed out loud. Our current project (4 months old) has 1,300 unit tests that run in about 10 seconds, so they weren't impressed with Kent's numbers at all. Even allowing for Moore's law over a few years, we'd run about 4,000 tests in 30 seconds, which two speed-doublings ago would take 2 minutes. That's still an order of magnitude faster...so what's the deal?&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial"&gt;This led to lots of enthusiastic debate about what the hell a unit test actually is. For what it's worth, here's my simplistic test categorization model:&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial"&gt;1. A unit test is a test that requires only the class under test and its immediate dependencies (or mocks thereof). This means no deployment, no packaging, nothing. That's why they're fast.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial"&gt;2. A functional test is a test you can't run until the app is packaged and deployed in some way. So you "in-container unit test" fans aren't doing unit tests by this model. I'm hard on this stuff because anything requiring deployment puts you in a different order of magnitude speed wise; this doesn't mean these tests aren't valuable, just that I don't count them as _unit_ tests, even if they only test a single unit of functionality.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial"&gt;3. An integration test is a test of your external dependencies, not necessarily requiring your app to be deployed at all, but requiring your external dependencies to be available. This is where databases come in, or other services provided by EJB's or anything else. These tests are also usually way too slow for me to want too many of them, and I want to isolate them from my app as much as possible. This means a separate test harness for the external stuff and leave my app just unit testing against the assumptions proven by the integration test suite.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial"&gt;The point is that I want to push unit tests as far as I can because they just provide so much more performance than the other types of tests. That's the only reason. I want as few of the others as possible because I spend enough of my life waiting for computers to get done with stuff as it is. Yes, you _can_ unit test custom tags to within an inch of 100% coverage!&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial"&gt;So what's everyone else getting speed-wise???&lt;/font&gt;&lt;/p&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/5943246977515325910-571485671426897278?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/571485671426897278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/04/need-for-speed.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/571485671426897278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/571485671426897278'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/04/need-for-speed.html' title='The Need for Speed'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-4799508941599840436</id><published>2004-03-20T10:44:00.000-08:00</published><updated>2009-09-20T03:45:44.792-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>Become what you despise</title><content type='html'>&lt;p&gt;&lt;font face="Arial"&gt;A lot of agile/TDD/XP folks like me enjoy flouting a very public disdain for "whiteboard architects" and their ilk. These are the ones who haven't written a line of code in ten years or more, serve out voluntary life sentences in financial institutions and impose design decisions from on high while ignoring development teams entirely. They&amp;nbsp;never ask for feedback on their architecture from anyone who sits beneath them on the org chart, as what feedback of value could a lowly code-cutter have? They are far too busy seeking feedback from those _above_ them on the org chart to make sure their career ambitions are on track, and that's a full time job.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial"&gt;So how happy was I when &lt;a href="http://www.eaves.org/blog-archive/000054.html"&gt;Jon broke his arm&lt;/a&gt; and I was pulled off my nice little agile dev lead role and into a six week whiteboard wonderland? Hmmm. In a&amp;nbsp;nutshell, this gig involves designing a technical solution to coordinate half a dozen systems on four different platforms written in four different languages, integrating .NET with J2EE,&amp;nbsp;a rules engine, messaging systems,&amp;nbsp;mainframe&amp;nbsp;yuk galore, blah, blah, snore.&amp;nbsp; The system will be used by thousands of people every day and carry billions of dollars of business every year&amp;nbsp;&amp;nbsp;Textbook whitebook architect turf. Oh, and you've got three weeks to get your head around it and come up with a solution and another couple of weeks to write it up and get it&amp;nbsp;approved by the Big Guys Upstairs. No coding for you!&amp;nbsp;&amp;nbsp;Well, it's been an interesting and enlightening experience - always a good thing. I hope I haven't become what I despise, but perhaps I despise them a little less by understanding them a little more.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial"&gt;Lesson: Same shit, different abstraction&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial"&gt;So why is it that we who prefer to spend our time at the implementation coalface smirk at the whiteboard architects? I have noticed during this brief out-of-body experience that&amp;nbsp;one reason is&amp;nbsp;the same as why we smirk at some of our less-than-breathtaking code-cutting colleagues. They can't design to save themselves. Just as many developers solve the wrong problem and can't distinguish between an implementation abstraction and a design abstraction (Dude, don't call it a SQLDataSource if it's role is a DomainStore!), it seems the same mistakes happen at the higher level of abstraction where enterprise architects play. Some of them seem compelled to define the implementations of the solution to the problem instead of just defining the problem, assigning responsibilities to well-nhamed abstractions (SOA, anyone?) and admitting that in the time available they don't have a hope in hell of telling a development team how they should actually build the thing. I can forgive them their transgressions against developers because it's not just them. We do it too. And so do business people. How often have you been given a so called 'requirement' that is not a statement of a problem at all but a statement of a dumbass solution? It has surprised me how well design concepts I'm used to using at the class/interface/component level map to the system/service level.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial"&gt;On this gig I've met one particularly outstanding guy who's an enterprise architect on a parallel project, and I just know he would be a kickass code cutter as well; he must just prefer to get paid properly. So take heart, you too might get lucky and find a whiteboard architect whose pictures deserve to make it off the drawing board!&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&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/5943246977515325910-4799508941599840436?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/4799508941599840436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/03/become-what-you-despise.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/4799508941599840436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/4799508941599840436'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/03/become-what-you-despise.html' title='Become what you despise'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-5255646932745845515</id><published>2004-03-07T12:54:00.000-08:00</published><updated>2009-09-20T03:45:44.793-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Getting into the Swing of TDD</title><content type='html'>&lt;p&gt;&lt;font face="Arial" size="2"&gt;Just came off a tough late night/early morning pairing session with &lt;a class="external" href="http://www.redhillconsulting.com.au/blogs/simon/"&gt;Simon Harris&lt;/a&gt;. We're working on a Swing app that will let you wander around the duplication in your code base by reading a &lt;a class="external" href="http://www.redhillconsulting.com.au/products/simian"&gt;Simian&lt;/a&gt; log file and referring to the original code tree. We're also trying an experiment where we use &lt;a class="external" href="http://tinyurl.com/2v973"&gt;TDD&lt;/a&gt; and blog the experience so that we can publish the gory details of the construction of the app, on the presumption that anyone cares, of course...:P&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial" size="2"&gt;Last night's session will make for interesting reading, mainly because we're both pretty clueless about Swing. In keeping with &lt;a class="external" href="http://www.eaves.org/blog-archive/000053.html"&gt;Jon Eaves ideas on spiking and TDD&lt;/a&gt;, we mucked around for a while trying to figure out how to use the java.awt.Robot to drive our panels, but we got there in the end. What we are trying to explore is how far we can push TDD, and I, for one, am so sick of web apps that this seemed like a cool idea.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial" size="2"&gt;I don't know enough about Swing to understand why a lot of folks seem to hate it these days, but it's always appealed to me as having the potential to facilitate real unit testing. By this I mean that a UI area composed of multiple JPanels should be able to have independently designed and tested each of those panels before assembling the UI and running functional tests over it.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial" size="2"&gt;The theory goes something like this:&lt;/font&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;font face="Arial" size="2"&gt;you don't have to write tests for one line delegation methods in my book. So if the UI was a veneer so thin over a fully tested set of non-Swing stuff, I'm happy to just glue the UI onto the layer below with trivial delegation. This is the interesting part - how thin can the UI layer be? So thin that no testing is required?&lt;/font&gt;&lt;/li&gt; &lt;li&gt;&lt;font face="Arial" size="2"&gt;you use a &lt;a class="external" href="http://www.mindspring.com/~mgrand/pattern_synopses.htm#Mediator"&gt;Mediator&lt;/a&gt; to coordinate the interaction between panels (which you of course make an interface so you can &lt;a class="external" href="http://sourceforge.net/projects/easymock"&gt;easymock it&lt;/a&gt; for testing), and each panel implements a Colleague interface (again facilitates testing). This means that although there is 2-way comms between the mediator and the colleagues, either end of this pipe can be mocked, allowing testing of each bit independently.&lt;/font&gt;&lt;/li&gt; &lt;li&gt;&lt;font face="Arial" size="2"&gt;you then assemble your UI like any other swing UI and the bits play nice.&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;We had previously gotten our mediator TDD-ed into existence and were happy with it. We then came to creating the JPanel that contains a list of files that share some duplicated code. This panel was also TDD-ed into existence but with all its behaviour in non-Swing methods. All good. Then it came time to (we thought) just add the JList and off we go. Turns out the amount of code required, with event listeners and a private inner ListModel class left us facing the dreaded NullPointerException at run time. If there is a more glaring signal that your code is crap, I don't know it.&lt;/p&gt; &lt;p&gt;So we came to the conclusion that we would have to actually unit test the UI with events somehow, you know, mouse and keyboard stuff. Yuk. We mucked around for a while trying to figure out how to do this while keeping the test 'headless', but failed dismally. In the end we came to grips with the pixel coordinate stuff required by Robot and plonked our little panel into a JFrame of its own in the unit test and just displayed it and started the Robot clicking on stuff.&lt;/p&gt; &lt;p&gt;So the upshot was that a single panel pops up on the screen and dances about a bit being unit tested against a mock Mediator that catches and verifies the panel's interactions with the rest of the dialog that isn't even there yet. Long story, I know, but I thought it was kinda fun and my blog's been a bit quiet lately.&lt;/p&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/5943246977515325910-5255646932745845515?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/5255646932745845515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/03/getting-into-swing-of-tdd.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/5255646932745845515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/5255646932745845515'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/03/getting-into-swing-of-tdd.html' title='Getting into the Swing of TDD'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5943246977515325910.post-7496766275213955337</id><published>2004-02-11T03:56:00.000-08:00</published><updated>2009-09-20T03:45:44.793-07:00</updated><title type='text'>Just what the world needs</title><content type='html'>&lt;p&gt;&lt;font face="Arial" size="2"&gt;Just what the world needs - another &lt;a href="http://www.thoughtworks.com"&gt;ThoughtWorker&lt;/a&gt;&amp;nbsp;bleating on about &lt;a href="http://tinyurl.com/2v973"&gt;test-driven development&lt;/a&gt;. Sheesh!&lt;/font&gt;&lt;/p&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/5943246977515325910-7496766275213955337?l=bloodsweatandtiers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bloodsweatandtiers.blogspot.com/feeds/7496766275213955337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/02/just-what-world-needs.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/7496766275213955337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5943246977515325910/posts/default/7496766275213955337'/><link rel='alternate' type='text/html' href='http://bloodsweatandtiers.blogspot.com/2004/02/just-what-world-needs.html' title='Just what the world needs'/><author><name>James Ross</name><uri>http://www.blogger.com/profile/16686972553621702543</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry></feed>
